From cb5e87581b7b7388fcbab658f2d0035565bf8ccd Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Tue, 23 Sep 2025 22:05:44 +0900 Subject: [PATCH] Add validation to `MCP::Configuration` setters I noticed through the existing tests that `MCP::Configuration#protocol_version=` allows setting an arbitrary protocol version. Since the official MCP Ruby SDK is an implementation of the MCP specification, it should not support arbitrary protocol versions. This change adds validation to the setter, consistent with `Configuration#initialize`. The same validation has also been added to `MCP::Configuration#validate_tool_call_arguments=`. --- lib/mcp/configuration.rb | 36 +++++++++++++++++++++++++++------- test/mcp/configuration_test.rb | 18 +++++++++++++---- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/lib/mcp/configuration.rb b/lib/mcp/configuration.rb index 30dcc5a6..29a1b16c 100644 --- a/lib/mcp/configuration.rb +++ b/lib/mcp/configuration.rb @@ -5,20 +5,29 @@ class Configuration DEFAULT_PROTOCOL_VERSION = "2025-06-18" SUPPORTED_PROTOCOL_VERSIONS = [DEFAULT_PROTOCOL_VERSION, "2025-03-26", "2024-11-05"] - attr_writer :exception_reporter, :instrumentation_callback, :protocol_version, :validate_tool_call_arguments + attr_writer :exception_reporter, :instrumentation_callback def initialize(exception_reporter: nil, instrumentation_callback: nil, protocol_version: nil, validate_tool_call_arguments: true) @exception_reporter = exception_reporter @instrumentation_callback = instrumentation_callback @protocol_version = protocol_version - if protocol_version && !SUPPORTED_PROTOCOL_VERSIONS.include?(protocol_version) - message = "protocol_version must be #{SUPPORTED_PROTOCOL_VERSIONS[0...-1].join(", ")}, or #{SUPPORTED_PROTOCOL_VERSIONS[-1]}" - raise ArgumentError, message - end - unless validate_tool_call_arguments.is_a?(TrueClass) || validate_tool_call_arguments.is_a?(FalseClass) - raise ArgumentError, "validate_tool_call_arguments must be a boolean" + if protocol_version + validate_protocol_version!(protocol_version) end + validate_value_of_validate_tool_call_arguments!(validate_tool_call_arguments) + + @validate_tool_call_arguments = validate_tool_call_arguments + end + + def protocol_version=(protocol_version) + validate_protocol_version!(protocol_version) + + @protocol_version = protocol_version + end + + def validate_tool_call_arguments=(validate_tool_call_arguments) + validate_value_of_validate_tool_call_arguments!(validate_tool_call_arguments) @validate_tool_call_arguments = validate_tool_call_arguments end @@ -83,6 +92,19 @@ def merge(other) private + def validate_protocol_version!(protocol_version) + unless SUPPORTED_PROTOCOL_VERSIONS.include?(protocol_version) + message = "protocol_version must be #{SUPPORTED_PROTOCOL_VERSIONS[0...-1].join(", ")}, or #{SUPPORTED_PROTOCOL_VERSIONS[-1]}" + raise ArgumentError, message + end + end + + def validate_value_of_validate_tool_call_arguments!(validate_tool_call_arguments) + unless validate_tool_call_arguments.is_a?(TrueClass) || validate_tool_call_arguments.is_a?(FalseClass) + raise ArgumentError, "validate_tool_call_arguments must be a boolean" + end + end + def default_exception_reporter @default_exception_reporter ||= ->(exception, server_context) {} end diff --git a/test/mcp/configuration_test.rb b/test/mcp/configuration_test.rb index 9aca6687..cd2777d4 100644 --- a/test/mcp/configuration_test.rb +++ b/test/mcp/configuration_test.rb @@ -40,11 +40,21 @@ class ConfigurationTest < ActiveSupport::TestCase assert_equal Configuration::DEFAULT_PROTOCOL_VERSION, config.protocol_version end - test "allows setting a custom protocol version" do + test "raises ArgumentError when protocol_version is not a supported protocol version" do config = Configuration.new - custom_version = "2025-03-27" - config.protocol_version = custom_version - assert_equal custom_version, config.protocol_version + exception = assert_raises(ArgumentError) do + custom_version = "2025-03-27" + config.protocol_version = custom_version + end + assert_equal("protocol_version must be 2025-06-18, 2025-03-26, or 2024-11-05", exception.message) + end + + test "raises ArgumentError when protocol_version is not a boolean value" do + config = Configuration.new + exception = assert_raises(ArgumentError) do + config.validate_tool_call_arguments = "true" + end + assert_equal("validate_tool_call_arguments must be a boolean", exception.message) end test "merges protocol version from other configuration" do