Merge pull request #422 from yuki3738/add_audience_validation_to_annotations

Add `audience` role validation for `MCP::Annotations` per MCP specification
This commit is contained in:
Koichi ITO 2026-06-22 02:37:17 +09:00 • committed by GitHub
commit 6bf0a069b5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 59 additions and 9 deletions

View file

@ -2,9 +2,14 @@
module MCP
class Annotations
SUPPORTED_AUDIENCES = ["user", "assistant"].freeze
attr_reader :audience, :priority, :last_modified
def initialize(audience: nil, priority: nil, last_modified: nil)
if audience && !(audience.is_a?(Array) && audience.all? { |role| SUPPORTED_AUDIENCES.include?(role) })
raise ArgumentError, 'The value of audience must be an array of "user" or "assistant".'
end
raise ArgumentError, "The value of priority must be between 0 and 1." if priority && !priority.between?(0, 1)
@audience = audience

View file

@ -5,24 +5,24 @@ require "test_helper"
module MCP
class AnnotationsTest < ActiveSupport::TestCase
def test_initialization
annotations = Annotations.new(audience: ["developers"], priority: 0.8)
annotations = Annotations.new(audience: ["user"], priority: 0.8)
assert_equal(["developers"], annotations.audience)
assert_equal(["user"], annotations.audience)
assert_equal(0.8, annotations.priority)
assert_nil(annotations.last_modified)
assert_equal({ audience: ["developers"], priority: 0.8 }, annotations.to_h)
assert_equal({ audience: ["user"], priority: 0.8 }, annotations.to_h)
end
def test_initialization_with_all_attributes
timestamp = Time.utc(2025, 1, 12, 15, 0, 58).iso8601
annotations = Annotations.new(audience: ["developers"], priority: 0.8, last_modified: timestamp)
annotations = Annotations.new(audience: ["user"], priority: 0.8, last_modified: timestamp)
assert_equal(["developers"], annotations.audience)
assert_equal(["user"], annotations.audience)
assert_equal(0.8, annotations.priority)
assert_equal(timestamp, annotations.last_modified)
assert_equal({ audience: ["developers"], priority: 0.8, lastModified: timestamp }, annotations.to_h)
assert_equal({ audience: ["user"], priority: 0.8, lastModified: timestamp }, annotations.to_h)
end
def test_initialization_by_default
@ -36,13 +36,13 @@ module MCP
end
def test_initialization_with_partial_attributes
annotations = Annotations.new(audience: ["developers"])
annotations = Annotations.new(audience: ["user"])
assert_equal(["developers"], annotations.audience)
assert_equal(["user"], annotations.audience)
assert_nil(annotations.priority)
assert_nil(annotations.last_modified)
assert_equal({ audience: ["developers"] }, annotations.to_h)
assert_equal({ audience: ["user"] }, annotations.to_h)
end
def test_initialization_with_last_modified_only
@ -81,5 +81,50 @@ module MCP
end
assert_equal("The value of priority must be between 0 and 1.", exception.message)
end
def test_valid_audience_with_user
assert_nothing_raised do
Annotations.new(audience: ["user"])
end
end
def test_valid_audience_with_assistant
assert_nothing_raised do
Annotations.new(audience: ["assistant"])
end
end
def test_valid_audience_with_multiple_roles
assert_nothing_raised do
Annotations.new(audience: ["user", "assistant"])
end
end
def test_valid_audience_with_empty_array
assert_nothing_raised do
Annotations.new(audience: [])
end
end
def test_invalid_audience_with_unknown_role
exception = assert_raises(ArgumentError) do
Annotations.new(audience: ["developers"])
end
assert_equal('The value of audience must be an array of "user" or "assistant".', exception.message)
end
def test_invalid_audience_with_mixed_roles
exception = assert_raises(ArgumentError) do
Annotations.new(audience: ["user", "developers"])
end
assert_equal('The value of audience must be an array of "user" or "assistant".', exception.message)
end
def test_invalid_audience_when_not_array
exception = assert_raises(ArgumentError) do
Annotations.new(audience: "user")
end
assert_equal('The value of audience must be an array of "user" or "assistant".', exception.message)
end
end
end