Add missing checks
This commit is contained in:
parent
280e835184
commit
ff92a3d016
3 changed files with 73 additions and 31 deletions
|
|
@ -23,6 +23,7 @@ module MCP
|
||||||
SAMPLING_CREATE_MESSAGE = "sampling/createMessage"
|
SAMPLING_CREATE_MESSAGE = "sampling/createMessage"
|
||||||
|
|
||||||
# Notification methods
|
# Notification methods
|
||||||
|
NOTIFICATIONS_INITIALIZED = "notifications/initialized"
|
||||||
NOTIFICATIONS_TOOLS_LIST_CHANGED = "notifications/tools/list_changed"
|
NOTIFICATIONS_TOOLS_LIST_CHANGED = "notifications/tools/list_changed"
|
||||||
NOTIFICATIONS_PROMPTS_LIST_CHANGED = "notifications/prompts/list_changed"
|
NOTIFICATIONS_PROMPTS_LIST_CHANGED = "notifications/prompts/list_changed"
|
||||||
NOTIFICATIONS_RESOURCES_LIST_CHANGED = "notifications/resources/list_changed"
|
NOTIFICATIONS_RESOURCES_LIST_CHANGED = "notifications/resources/list_changed"
|
||||||
|
|
@ -48,21 +49,35 @@ module MCP
|
||||||
case method
|
case method
|
||||||
when PROMPTS_GET, PROMPTS_LIST
|
when PROMPTS_GET, PROMPTS_LIST
|
||||||
require_capability!(method, capabilities, :prompts)
|
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)
|
require_capability!(method, capabilities, :resources)
|
||||||
if method == RESOURCES_SUBSCRIBE && !capabilities[:resources][:subscribe]
|
when NOTIFICATIONS_RESOURCES_LIST_CHANGED
|
||||||
raise MissingRequiredCapabilityError.new(method, :resources_subscribe)
|
require_capability!(method, capabilities, :resources)
|
||||||
end
|
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
|
when TOOLS_CALL, TOOLS_LIST
|
||||||
require_capability!(method, capabilities, :tools)
|
require_capability!(method, capabilities, :tools)
|
||||||
when SAMPLING_CREATE_MESSAGE
|
when NOTIFICATIONS_TOOLS_LIST_CHANGED
|
||||||
require_capability!(method, capabilities, :sampling)
|
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
|
when COMPLETION_COMPLETE
|
||||||
require_capability!(method, capabilities, :completions)
|
require_capability!(method, capabilities, :completions)
|
||||||
when LOGGING_SET_LEVEL
|
when ROOTS_LIST
|
||||||
require_capability!(method, capabilities, :logging)
|
require_capability!(method, capabilities, :roots)
|
||||||
when INITIALIZE, PING
|
when NOTIFICATIONS_ROOTS_LIST_CHANGED
|
||||||
# No specific capability required for initialize or ping
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,35 +22,62 @@ module MCP
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Tools capability tests
|
# Server methods and notifications
|
||||||
ensure_capability_raises_error_for Methods::TOOLS_LIST, required_capability_name: "tools"
|
ensure_capability_does_not_raise_for Methods::INITIALIZE
|
||||||
ensure_capability_raises_error_for Methods::TOOLS_CALL, required_capability_name: "tools"
|
|
||||||
|
|
||||||
# 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_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_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"
|
ensure_capability_raises_error_for Methods::RESOURCES_READ, required_capability_name: "resources"
|
||||||
|
ensure_capability_raises_error_for Methods::RESOURCES_TEMPLATES_LIST, required_capability_name: "resources"
|
||||||
# Resources subscribe capability tests
|
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,
|
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: {} }
|
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::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
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -635,7 +635,7 @@ module MCP
|
||||||
test "#handle method with missing required nested capability returns an error" do
|
test "#handle method with missing required nested capability returns an error" do
|
||||||
@server.capabilities = { resources: {} }
|
@server.capabilities = { resources: {} }
|
||||||
response = @server.handle({ jsonrpc: "2.0", method: "resources/subscribe", id: 1 })
|
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]
|
response[:error][:data]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue