Skip to content

Commit ff92a3d

Browse files
Add missing checks
1 parent 280e835 commit ff92a3d

File tree

3 files changed

+73
-31
lines changed

3 files changed

+73
-31
lines changed

lib/mcp/methods.rb

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ module Methods
2323
SAMPLING_CREATE_MESSAGE = "sampling/createMessage"
2424

2525
# Notification methods
26+
NOTIFICATIONS_INITIALIZED = "notifications/initialized"
2627
NOTIFICATIONS_TOOLS_LIST_CHANGED = "notifications/tools/list_changed"
2728
NOTIFICATIONS_PROMPTS_LIST_CHANGED = "notifications/prompts/list_changed"
2829
NOTIFICATIONS_RESOURCES_LIST_CHANGED = "notifications/resources/list_changed"
@@ -48,21 +49,35 @@ def ensure_capability!(method, capabilities)
4849
case method
4950
when PROMPTS_GET, PROMPTS_LIST
5051
require_capability!(method, capabilities, :prompts)
51-
when RESOURCES_LIST, RESOURCES_TEMPLATES_LIST, RESOURCES_READ, RESOURCES_SUBSCRIBE, RESOURCES_UNSUBSCRIBE
52+
when NOTIFICATIONS_PROMPTS_LIST_CHANGED
53+
require_capability!(method, capabilities, :prompts)
54+
require_capability!(method, capabilities, :prompts, :listChanged)
55+
when RESOURCES_LIST, RESOURCES_TEMPLATES_LIST, RESOURCES_READ
56+
require_capability!(method, capabilities, :resources)
57+
when NOTIFICATIONS_RESOURCES_LIST_CHANGED
58+
require_capability!(method, capabilities, :resources)
59+
require_capability!(method, capabilities, :resources, :listChanged)
60+
when RESOURCES_SUBSCRIBE, RESOURCES_UNSUBSCRIBE, NOTIFICATIONS_RESOURCES_UPDATED
5261
require_capability!(method, capabilities, :resources)
53-
if method == RESOURCES_SUBSCRIBE && !capabilities[:resources][:subscribe]
54-
raise MissingRequiredCapabilityError.new(method, :resources_subscribe)
55-
end
62+
require_capability!(method, capabilities, :resources, :subscribe)
5663
when TOOLS_CALL, TOOLS_LIST
5764
require_capability!(method, capabilities, :tools)
58-
when SAMPLING_CREATE_MESSAGE
59-
require_capability!(method, capabilities, :sampling)
65+
when NOTIFICATIONS_TOOLS_LIST_CHANGED
66+
require_capability!(method, capabilities, :tools)
67+
require_capability!(method, capabilities, :tools, :listChanged)
68+
when LOGGING_SET_LEVEL, NOTIFICATIONS_MESSAGE
69+
require_capability!(method, capabilities, :logging)
6070
when COMPLETION_COMPLETE
6171
require_capability!(method, capabilities, :completions)
62-
when LOGGING_SET_LEVEL
63-
require_capability!(method, capabilities, :logging)
64-
when INITIALIZE, PING
65-
# No specific capability required for initialize or ping
72+
when ROOTS_LIST
73+
require_capability!(method, capabilities, :roots)
74+
when NOTIFICATIONS_ROOTS_LIST_CHANGED
75+
require_capability!(method, capabilities, :roots)
76+
require_capability!(method, capabilities, :roots, :listChanged)
77+
when SAMPLING_CREATE_MESSAGE
78+
require_capability!(method, capabilities, :sampling)
79+
when INITIALIZE, PING, NOTIFICATIONS_INITIALIZED, NOTIFICATIONS_PROGRESS, NOTIFICATIONS_CANCELLED
80+
# No specific capability required for initialize, ping, progress or cancelled
6681
end
6782
end
6883

test/mcp/methods_test.rb

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,35 +22,62 @@ def ensure_capability_does_not_raise_for(method, capabilities: {})
2222
end
2323
end
2424

25-
# Tools capability tests
25+
# Server methods and notifications
26+
ensure_capability_does_not_raise_for Methods::INITIALIZE
27+
28+
ensure_capability_raises_error_for Methods::PROMPTS_LIST, required_capability_name: "prompts"
29+
ensure_capability_raises_error_for Methods::PROMPTS_GET, required_capability_name: "prompts"
30+
ensure_capability_raises_error_for Methods::NOTIFICATIONS_PROMPTS_LIST_CHANGED, required_capability_name: "prompts"
31+
ensure_capability_raises_error_for Methods::NOTIFICATIONS_PROMPTS_LIST_CHANGED,
32+
required_capability_name: "prompts.listChanged",
33+
capabilities: { prompts: {} }
34+
35+
ensure_capability_raises_error_for Methods::RESOURCES_LIST, required_capability_name: "resources"
36+
ensure_capability_raises_error_for Methods::RESOURCES_READ, required_capability_name: "resources"
37+
ensure_capability_raises_error_for Methods::RESOURCES_TEMPLATES_LIST, required_capability_name: "resources"
38+
ensure_capability_raises_error_for Methods::NOTIFICATIONS_RESOURCES_LIST_CHANGED, required_capability_name: "resources"
39+
ensure_capability_raises_error_for Methods::NOTIFICATIONS_RESOURCES_LIST_CHANGED,
40+
required_capability_name: "resources.listChanged",
41+
capabilities: { resources: {} }
42+
ensure_capability_raises_error_for Methods::RESOURCES_SUBSCRIBE, required_capability_name: "resources"
43+
ensure_capability_raises_error_for Methods::RESOURCES_SUBSCRIBE,
44+
required_capability_name: "resources.subscribe",
45+
capabilities: { resources: {} }
46+
ensure_capability_raises_error_for Methods::RESOURCES_UNSUBSCRIBE, required_capability_name: "resources"
47+
ensure_capability_raises_error_for Methods::RESOURCES_UNSUBSCRIBE,
48+
required_capability_name: "resources.subscribe",
49+
capabilities: { resources: {} }
50+
ensure_capability_raises_error_for Methods::NOTIFICATIONS_RESOURCES_UPDATED, required_capability_name: "resources"
51+
ensure_capability_raises_error_for Methods::NOTIFICATIONS_RESOURCES_UPDATED,
52+
required_capability_name: "resources.subscribe",
53+
capabilities: { resources: {} }
54+
2655
ensure_capability_raises_error_for Methods::TOOLS_LIST, required_capability_name: "tools"
2756
ensure_capability_raises_error_for Methods::TOOLS_CALL, required_capability_name: "tools"
57+
ensure_capability_raises_error_for Methods::NOTIFICATIONS_TOOLS_LIST_CHANGED, required_capability_name: "tools"
58+
ensure_capability_raises_error_for Methods::NOTIFICATIONS_TOOLS_LIST_CHANGED,
59+
required_capability_name: "tools.listChanged",
60+
capabilities: { tools: {} }
2861

29-
# Sampling capability tests
30-
ensure_capability_raises_error_for Methods::SAMPLING_CREATE_MESSAGE, required_capability_name: "sampling"
62+
ensure_capability_raises_error_for Methods::LOGGING_SET_LEVEL, required_capability_name: "logging"
63+
ensure_capability_raises_error_for Methods::NOTIFICATIONS_MESSAGE, required_capability_name: "logging"
3164

32-
# Completions capability tests
3365
ensure_capability_raises_error_for Methods::COMPLETION_COMPLETE, required_capability_name: "completions"
3466

35-
# Logging capability tests
36-
ensure_capability_raises_error_for Methods::LOGGING_SET_LEVEL, required_capability_name: "logging"
67+
# Client methods and notifications
68+
ensure_capability_does_not_raise_for Methods::NOTIFICATIONS_INITIALIZED
3769

38-
# Prompts capability tests
39-
ensure_capability_raises_error_for Methods::PROMPTS_GET, required_capability_name: "prompts"
40-
ensure_capability_raises_error_for Methods::PROMPTS_LIST, required_capability_name: "prompts"
70+
ensure_capability_raises_error_for Methods::ROOTS_LIST, required_capability_name: "roots"
71+
ensure_capability_raises_error_for Methods::NOTIFICATIONS_ROOTS_LIST_CHANGED, required_capability_name: "roots"
72+
ensure_capability_raises_error_for Methods::NOTIFICATIONS_ROOTS_LIST_CHANGED,
73+
required_capability_name: "roots.listChanged",
74+
capabilities: { roots: {} }
4175

42-
# Resources capability tests
43-
ensure_capability_raises_error_for Methods::RESOURCES_LIST, required_capability_name: "resources"
44-
ensure_capability_raises_error_for Methods::RESOURCES_TEMPLATES_LIST, required_capability_name: "resources"
45-
ensure_capability_raises_error_for Methods::RESOURCES_READ, required_capability_name: "resources"
46-
47-
# Resources subscribe capability tests
48-
ensure_capability_raises_error_for Methods::RESOURCES_SUBSCRIBE,
49-
required_capability_name: "resources_subscribe",
50-
capabilities: { resources: {} }
76+
ensure_capability_raises_error_for Methods::SAMPLING_CREATE_MESSAGE, required_capability_name: "sampling"
5177

52-
# Methods that don't require capabilities
78+
# Methods and notifications of both server and client
5379
ensure_capability_does_not_raise_for Methods::PING
54-
ensure_capability_does_not_raise_for Methods::INITIALIZE
80+
ensure_capability_does_not_raise_for Methods::NOTIFICATIONS_PROGRESS
81+
ensure_capability_does_not_raise_for Methods::NOTIFICATIONS_CANCELLED
5582
end
5683
end

test/mcp/server_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ def call(message:, server_context: nil)
635635
test "#handle method with missing required nested capability returns an error" do
636636
@server.capabilities = { resources: {} }
637637
response = @server.handle({ jsonrpc: "2.0", method: "resources/subscribe", id: 1 })
638-
assert_equal "Server does not support resources_subscribe (required for resources/subscribe)",
638+
assert_equal "Server does not support resources.subscribe (required for resources/subscribe)",
639639
response[:error][:data]
640640
end
641641

0 commit comments

Comments
 (0)