diff --git a/lib/mcp/methods.rb b/lib/mcp/methods.rb index 226f011..f30eaf2 100644 --- a/lib/mcp/methods.rb +++ b/lib/mcp/methods.rb @@ -23,6 +23,7 @@ module MCP SAMPLING_CREATE_MESSAGE = "sampling/createMessage" # Notification methods + NOTIFICATIONS_INITIALIZED = "notifications/initialized" NOTIFICATIONS_TOOLS_LIST_CHANGED = "notifications/tools/list_changed" NOTIFICATIONS_PROMPTS_LIST_CHANGED = "notifications/prompts/list_changed" NOTIFICATIONS_RESOURCES_LIST_CHANGED = "notifications/resources/list_changed" @@ -48,21 +49,35 @@ module MCP case method when PROMPTS_GET, PROMPTS_LIST require_capability!(method, capabilities, :prompts) - when RESOURCES_LIST, RESOURCES_TEMPLATES_LIST, RESOURCES_READ, RESOURCES_SUBSCRIBE, RESOURCES_UNSUBSCRIBE + when NOTIFICATIONS_PROMPTS_LIST_CHANGED + require_capability!(method, capabilities, :prompts) + require_capability!(method, capabilities, :prompts, :listChanged) + when RESOURCES_LIST, RESOURCES_TEMPLATES_LIST, RESOURCES_READ require_capability!(method, capabilities, :resources) - if method == RESOURCES_SUBSCRIBE && !capabilities[:resources][:subscribe] - raise MissingRequiredCapabilityError.new(method, :resources_subscribe) - end + when NOTIFICATIONS_RESOURCES_LIST_CHANGED + require_capability!(method, capabilities, :resources) + require_capability!(method, capabilities, :resources, :listChanged) + when RESOURCES_SUBSCRIBE, RESOURCES_UNSUBSCRIBE, NOTIFICATIONS_RESOURCES_UPDATED + require_capability!(method, capabilities, :resources) + require_capability!(method, capabilities, :resources, :subscribe) when TOOLS_CALL, TOOLS_LIST require_capability!(method, capabilities, :tools) - when SAMPLING_CREATE_MESSAGE - require_capability!(method, capabilities, :sampling) + when NOTIFICATIONS_TOOLS_LIST_CHANGED + require_capability!(method, capabilities, :tools) + require_capability!(method, capabilities, :tools, :listChanged) + when LOGGING_SET_LEVEL, NOTIFICATIONS_MESSAGE + require_capability!(method, capabilities, :logging) when COMPLETION_COMPLETE require_capability!(method, capabilities, :completions) - when LOGGING_SET_LEVEL - require_capability!(method, capabilities, :logging) - when INITIALIZE, PING - # No specific capability required for initialize or ping + when ROOTS_LIST + require_capability!(method, capabilities, :roots) + when NOTIFICATIONS_ROOTS_LIST_CHANGED + require_capability!(method, capabilities, :roots) + require_capability!(method, capabilities, :roots, :listChanged) + when SAMPLING_CREATE_MESSAGE + require_capability!(method, capabilities, :sampling) + when INITIALIZE, PING, NOTIFICATIONS_INITIALIZED, NOTIFICATIONS_PROGRESS, NOTIFICATIONS_CANCELLED + # No specific capability required for initialize, ping, progress or cancelled end end diff --git a/test/mcp/methods_test.rb b/test/mcp/methods_test.rb index 17e99b8..d89981e 100644 --- a/test/mcp/methods_test.rb +++ b/test/mcp/methods_test.rb @@ -22,35 +22,62 @@ module MCP end end - # Tools capability tests - ensure_capability_raises_error_for Methods::TOOLS_LIST, required_capability_name: "tools" - ensure_capability_raises_error_for Methods::TOOLS_CALL, required_capability_name: "tools" + # Server methods and notifications + ensure_capability_does_not_raise_for Methods::INITIALIZE - # Sampling capability tests - ensure_capability_raises_error_for Methods::SAMPLING_CREATE_MESSAGE, required_capability_name: "sampling" - - # Completions capability tests - ensure_capability_raises_error_for Methods::COMPLETION_COMPLETE, required_capability_name: "completions" - - # Logging capability tests - ensure_capability_raises_error_for Methods::LOGGING_SET_LEVEL, required_capability_name: "logging" - - # Prompts capability tests - ensure_capability_raises_error_for Methods::PROMPTS_GET, required_capability_name: "prompts" ensure_capability_raises_error_for Methods::PROMPTS_LIST, required_capability_name: "prompts" + ensure_capability_raises_error_for Methods::PROMPTS_GET, required_capability_name: "prompts" + ensure_capability_raises_error_for Methods::NOTIFICATIONS_PROMPTS_LIST_CHANGED, required_capability_name: "prompts" + ensure_capability_raises_error_for Methods::NOTIFICATIONS_PROMPTS_LIST_CHANGED, + required_capability_name: "prompts.listChanged", + capabilities: { prompts: {} } - # Resources capability tests ensure_capability_raises_error_for Methods::RESOURCES_LIST, required_capability_name: "resources" - ensure_capability_raises_error_for Methods::RESOURCES_TEMPLATES_LIST, required_capability_name: "resources" ensure_capability_raises_error_for Methods::RESOURCES_READ, required_capability_name: "resources" - - # Resources subscribe capability tests + ensure_capability_raises_error_for Methods::RESOURCES_TEMPLATES_LIST, required_capability_name: "resources" + ensure_capability_raises_error_for Methods::NOTIFICATIONS_RESOURCES_LIST_CHANGED, required_capability_name: "resources" + ensure_capability_raises_error_for Methods::NOTIFICATIONS_RESOURCES_LIST_CHANGED, + required_capability_name: "resources.listChanged", + capabilities: { resources: {} } + ensure_capability_raises_error_for Methods::RESOURCES_SUBSCRIBE, required_capability_name: "resources" ensure_capability_raises_error_for Methods::RESOURCES_SUBSCRIBE, - required_capability_name: "resources_subscribe", + required_capability_name: "resources.subscribe", + capabilities: { resources: {} } + ensure_capability_raises_error_for Methods::RESOURCES_UNSUBSCRIBE, required_capability_name: "resources" + ensure_capability_raises_error_for Methods::RESOURCES_UNSUBSCRIBE, + required_capability_name: "resources.subscribe", + capabilities: { resources: {} } + ensure_capability_raises_error_for Methods::NOTIFICATIONS_RESOURCES_UPDATED, required_capability_name: "resources" + ensure_capability_raises_error_for Methods::NOTIFICATIONS_RESOURCES_UPDATED, + required_capability_name: "resources.subscribe", capabilities: { resources: {} } - # Methods that don't require capabilities + ensure_capability_raises_error_for Methods::TOOLS_LIST, required_capability_name: "tools" + ensure_capability_raises_error_for Methods::TOOLS_CALL, required_capability_name: "tools" + ensure_capability_raises_error_for Methods::NOTIFICATIONS_TOOLS_LIST_CHANGED, required_capability_name: "tools" + ensure_capability_raises_error_for Methods::NOTIFICATIONS_TOOLS_LIST_CHANGED, + required_capability_name: "tools.listChanged", + capabilities: { tools: {} } + + ensure_capability_raises_error_for Methods::LOGGING_SET_LEVEL, required_capability_name: "logging" + ensure_capability_raises_error_for Methods::NOTIFICATIONS_MESSAGE, required_capability_name: "logging" + + ensure_capability_raises_error_for Methods::COMPLETION_COMPLETE, required_capability_name: "completions" + + # Client methods and notifications + ensure_capability_does_not_raise_for Methods::NOTIFICATIONS_INITIALIZED + + ensure_capability_raises_error_for Methods::ROOTS_LIST, required_capability_name: "roots" + ensure_capability_raises_error_for Methods::NOTIFICATIONS_ROOTS_LIST_CHANGED, required_capability_name: "roots" + ensure_capability_raises_error_for Methods::NOTIFICATIONS_ROOTS_LIST_CHANGED, + required_capability_name: "roots.listChanged", + capabilities: { roots: {} } + + ensure_capability_raises_error_for Methods::SAMPLING_CREATE_MESSAGE, required_capability_name: "sampling" + + # Methods and notifications of both server and client ensure_capability_does_not_raise_for Methods::PING - ensure_capability_does_not_raise_for Methods::INITIALIZE + ensure_capability_does_not_raise_for Methods::NOTIFICATIONS_PROGRESS + ensure_capability_does_not_raise_for Methods::NOTIFICATIONS_CANCELLED end end diff --git a/test/mcp/server_test.rb b/test/mcp/server_test.rb index 6dc56ee..77cc6d3 100644 --- a/test/mcp/server_test.rb +++ b/test/mcp/server_test.rb @@ -635,7 +635,7 @@ module MCP test "#handle method with missing required nested capability returns an error" do @server.capabilities = { resources: {} } response = @server.handle({ jsonrpc: "2.0", method: "resources/subscribe", id: 1 }) - assert_equal "Server does not support resources_subscribe (required for resources/subscribe)", + assert_equal "Server does not support resources.subscribe (required for resources/subscribe)", response[:error][:data] end