diff --git a/resources/scripts/napseer_mcp_server.py b/resources/scripts/napseer_mcp_server.py index ff40797..585cd72 100755 --- a/resources/scripts/napseer_mcp_server.py +++ b/resources/scripts/napseer_mcp_server.py @@ -9028,7 +9028,6 @@ def supersede_plan(args): reason_key="supersede_reason", link_relation="superseded-by", terminal_tags=["superseded", "archived"], - require_reason=True, ) @@ -9043,15 +9042,12 @@ def cancel_plan(args): reason_key="cancel_reason", link_relation=None, terminal_tags=["cancelled", "archived"], - require_reason=True, ) -def plan_lifecycle_update(args, *, action, terminal_status, required_target_key, metadata_target_key, timestamp_key, reason_key, link_relation, terminal_tags, require_reason=False): +def plan_lifecycle_update(args, *, action, terminal_status, required_target_key, metadata_target_key, timestamp_key, reason_key, link_relation, terminal_tags): target_path = resolve_lifecycle_target(args, required_target_key) reason = str(args.get("reason") or args.get("notes") or "").strip() - if require_reason and not reason: - raise RuntimeError("reason is required") dry_run = as_bool(args.get("dry_run"), False) node, already_archived = get_plan_for_lifecycle(args) path = node["full_path"] @@ -11521,7 +11517,6 @@ def raw_tools(): "description": "Mark a /plans node superseded by another node identity, add terminal tags and link, then archive it.", "inputSchema": { "type": "object", - "required": ["reason"], "properties": { "plan_node_id": {"type": "string", "description": "Canonical node id of the /plans node."}, "plan_uri": {"type": "string", "description": "Canonical nap:// URI of the /plans node."}, @@ -11540,7 +11535,6 @@ def raw_tools(): "description": "Mark a /plans node cancelled by plan node identity with a reason, add terminal tags, and archive it.", "inputSchema": { "type": "object", - "required": ["reason"], "properties": { "plan_node_id": {"type": "string", "description": "Canonical node id of the /plans node."}, "plan_uri": {"type": "string", "description": "Canonical nap:// URI of the /plans node."}, diff --git a/tests/test_mcp_memory_ergonomics_helpers.py b/tests/test_mcp_memory_ergonomics_helpers.py index 9521945..32507d3 100644 --- a/tests/test_mcp_memory_ergonomics_helpers.py +++ b/tests/test_mcp_memory_ergonomics_helpers.py @@ -332,14 +332,14 @@ def test_tools_include_node_by_path_descriptor(mod): assert "outcome_path" not in complete_schema["properties"] supersede_schema = next(item for item in mod.tools() if item["name"] == "nap_plan_supersede")["inputSchema"] - assert supersede_schema["required"] == ["reason"] + assert "required" not in supersede_schema assert "plan_node_id" in supersede_schema["properties"] assert "replacement_node_id" in supersede_schema["properties"] assert "path" not in supersede_schema["properties"] assert "replacement_path" not in supersede_schema["properties"] cancel_schema = next(item for item in mod.tools() if item["name"] == "nap_plan_cancel")["inputSchema"] - assert cancel_schema["required"] == ["reason"] + assert "required" not in cancel_schema assert "plan_node_id" in cancel_schema["properties"] assert "path" not in cancel_schema["properties"]