Skip to content

Commit c588582

Browse files
committed
Add range validation for MCP::Annotations#priority per MCP specification
## Motivation and Context The MCP specification constrains `Annotations.priority` to the 0–1 range (`@minimum 0`, `@maximum 1`), but the Ruby SDK accepts any value. The other official SDKs already enforce this (TypeScript, Python, and PHP). This follows the existing pattern in `MCP::Icon`, which validates its constrained `theme` value in the constructor and raises `ArgumentError`. ## How Has This Been Tested? Added tests in `test/mcp/annotations_test.rb`: - valid `priority` at the lower (0) and upper (1) bounds is accepted - out-of-range `priority` (above 1, below 0) raises `ArgumentError` The full unit suite and RuboCop pass locally. ## Breaking Changes Strictly speaking yes: a caller that currently passes an out-of-range `priority` (e.g. `priority: 99`) will now get an `ArgumentError`. Such values already violate the MCP specification, and `nil` / in-range values are unaffected.
1 parent 2f24cdf commit c588582

2 files changed

Lines changed: 28 additions & 0 deletions

File tree

lib/mcp/annotations.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ class Annotations
55
attr_reader :audience, :priority, :last_modified
66

77
def initialize(audience: nil, priority: nil, last_modified: nil)
8+
raise ArgumentError, "The value of priority must be between 0 and 1." if priority && !priority.between?(0, 1)
9+
810
@audience = audience
911
@priority = priority
1012
@last_modified = last_modified

test/mcp/annotations_test.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,31 @@ def test_initialization_with_last_modified_only
5555

5656
assert_equal({ lastModified: timestamp }, annotations.to_h)
5757
end
58+
59+
def test_valid_priority_at_lower_bound
60+
assert_nothing_raised do
61+
Annotations.new(priority: 0)
62+
end
63+
end
64+
65+
def test_valid_priority_at_upper_bound
66+
assert_nothing_raised do
67+
Annotations.new(priority: 1)
68+
end
69+
end
70+
71+
def test_invalid_priority_above_upper_bound
72+
exception = assert_raises(ArgumentError) do
73+
Annotations.new(priority: 1.5)
74+
end
75+
assert_equal("The value of priority must be between 0 and 1.", exception.message)
76+
end
77+
78+
def test_invalid_priority_below_lower_bound
79+
exception = assert_raises(ArgumentError) do
80+
Annotations.new(priority: -0.1)
81+
end
82+
assert_equal("The value of priority must be between 0 and 1.", exception.message)
83+
end
5884
end
5985
end

0 commit comments

Comments
 (0)