From 460adafb17e99c20cce072b63c1878f277cdf716 Mon Sep 17 00:00:00 2001 From: Ates Goral Date: Sun, 14 Jun 2026 17:46:38 +0200 Subject: [PATCH 1/2] chore: require rubocop-minitest 0.39 Require rubocop-minitest 0.39.0 or newer so Minitest/AssertEmptyLiteral uses its newer default disabled state. --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 8b76222d..c9f42cbd 100644 --- a/Gemfile +++ b/Gemfile @@ -6,7 +6,7 @@ source "https://rubygems.org" gemspec # Specify development dependencies below -gem "rubocop-minitest", require: false +gem "rubocop-minitest", ">= 0.39.0", require: false gem "rubocop-rake", require: false gem "rubocop-shopify", ">= 2.18", require: false if RUBY_VERSION >= "3.1" From c588582acc76e02adc538e33fa1f740e3cc6227f Mon Sep 17 00:00:00 2001 From: Yuki Minamiya Date: Sun, 14 Jun 2026 16:25:44 +0900 Subject: [PATCH 2/2] Add range validation for `MCP::Annotations#priority` per MCP specification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 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. --- lib/mcp/annotations.rb | 2 ++ test/mcp/annotations_test.rb | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/mcp/annotations.rb b/lib/mcp/annotations.rb index 9674c73e..540588a6 100644 --- a/lib/mcp/annotations.rb +++ b/lib/mcp/annotations.rb @@ -5,6 +5,8 @@ class Annotations attr_reader :audience, :priority, :last_modified def initialize(audience: nil, priority: nil, last_modified: nil) + raise ArgumentError, "The value of priority must be between 0 and 1." if priority && !priority.between?(0, 1) + @audience = audience @priority = priority @last_modified = last_modified diff --git a/test/mcp/annotations_test.rb b/test/mcp/annotations_test.rb index 60bfa722..a82b9552 100644 --- a/test/mcp/annotations_test.rb +++ b/test/mcp/annotations_test.rb @@ -55,5 +55,31 @@ def test_initialization_with_last_modified_only assert_equal({ lastModified: timestamp }, annotations.to_h) end + + def test_valid_priority_at_lower_bound + assert_nothing_raised do + Annotations.new(priority: 0) + end + end + + def test_valid_priority_at_upper_bound + assert_nothing_raised do + Annotations.new(priority: 1) + end + end + + def test_invalid_priority_above_upper_bound + exception = assert_raises(ArgumentError) do + Annotations.new(priority: 1.5) + end + assert_equal("The value of priority must be between 0 and 1.", exception.message) + end + + def test_invalid_priority_below_lower_bound + exception = assert_raises(ArgumentError) do + Annotations.new(priority: -0.1) + end + assert_equal("The value of priority must be between 0 and 1.", exception.message) + end end end