Merge pull request #63 from kfischer-okarin/check-notification-capabilities

Check all methods & capabilities
This commit is contained in:
Koichi ITO 2025-07-13 11:34:42 +09:00 • committed by GitHub
commit 13bee9f60e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -19,12 +19,19 @@ module MCP
TOOLS_CALL = "tools/call"
TOOLS_LIST = "tools/list"
ROOTS_LIST = "roots/list"
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"
NOTIFICATIONS_RESOURCES_UPDATED = "notifications/resources/updated"
NOTIFICATIONS_ROOTS_LIST_CHANGED = "notifications/roots/list_changed"
NOTIFICATIONS_MESSAGE = "notifications/message"
NOTIFICATIONS_PROGRESS = "notifications/progress"
NOTIFICATIONS_CANCELLED = "notifications/cancelled"
class MissingRequiredCapabilityError < StandardError
attr_reader :method
@ -37,41 +44,51 @@ module MCP
end
end
extend self
class << self
def ensure_capability!(method, capabilities)
case method
when PROMPTS_GET, PROMPTS_LIST
require_capability!(method, capabilities, :prompts)
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)
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 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 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
def ensure_capability!(method, capabilities)
case method
when PROMPTS_GET, PROMPTS_LIST
unless capabilities[:prompts]
raise MissingRequiredCapabilityError.new(method, :prompts)
end
when RESOURCES_LIST, RESOURCES_TEMPLATES_LIST, RESOURCES_READ, RESOURCES_SUBSCRIBE, RESOURCES_UNSUBSCRIBE
unless capabilities[:resources]
raise MissingRequiredCapabilityError.new(method, :resources)
end
private
if method == RESOURCES_SUBSCRIBE && !capabilities[:resources][:subscribe]
raise MissingRequiredCapabilityError.new(method, :resources_subscribe)
end
when TOOLS_CALL, TOOLS_LIST
unless capabilities[:tools]
raise MissingRequiredCapabilityError.new(method, :tools)
end
when SAMPLING_CREATE_MESSAGE
unless capabilities[:sampling]
raise MissingRequiredCapabilityError.new(method, :sampling)
end
when COMPLETION_COMPLETE
unless capabilities[:completions]
raise MissingRequiredCapabilityError.new(method, :completions)
end
when LOGGING_SET_LEVEL
# Logging is unsupported by the Server
unless capabilities[:logging]
raise MissingRequiredCapabilityError.new(method, :logging)
end
when INITIALIZE, PING
# No specific capability required for initialize or ping
def require_capability!(method, capabilities, *keys)
name = keys.join(".") # :resources, :subscribe -> "resources.subscribe"
has_capability = capabilities.dig(*keys)
return if has_capability
raise MissingRequiredCapabilityError.new(method, name)
end
end
end