From 3a68937bb7f5fdb115c09dcf6427ef0fcdfc8b79 Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Tue, 31 Mar 2026 03:46:25 +0900 Subject: [PATCH] Use `symbolize_names: true` in `JSON.parse` calls Replace custom `deep_transform_keys` in `Tool::Schema` and string key access in `StreamableHTTPTransport` with the `symbolize_names: true` option of `JSON.parse`. This aligns `StreamableHTTPTransport` with `StdioTransport`, which already uses `symbolize_names: true`. --- .../transports/streamable_http_transport.rb | 8 ++++---- lib/mcp/tool/schema.rb | 15 +-------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/lib/mcp/server/transports/streamable_http_transport.rb b/lib/mcp/server/transports/streamable_http_transport.rb index eb3ebb9b..4e014586 100644 --- a/lib/mcp/server/transports/streamable_http_transport.rb +++ b/lib/mcp/server/transports/streamable_http_transport.rb @@ -176,7 +176,7 @@ def handle_post(request) body = parse_request_body(body_string) return body unless body.is_a?(Hash) # Error response - if body["method"] == "initialize" + if body[:method] == "initialize" handle_initialization(body_string, body) else return missing_session_id_response if !@stateless && !session_id @@ -277,17 +277,17 @@ def not_acceptable_response(required_types) end def parse_request_body(body_string) - JSON.parse(body_string) + JSON.parse(body_string, symbolize_names: true) rescue JSON::ParserError, TypeError [400, { "Content-Type" => "application/json" }, [{ error: "Invalid JSON" }.to_json]] end def notification?(body) - !body["id"] && !!body["method"] + !body[:id] && !!body[:method] end def response?(body) - !!body["id"] && !body["method"] + !!body[:id] && !body[:method] end def handle_initialization(body_string, body) diff --git a/lib/mcp/tool/schema.rb b/lib/mcp/tool/schema.rb index 0b908f37..de6d4d7d 100644 --- a/lib/mcp/tool/schema.rb +++ b/lib/mcp/tool/schema.rb @@ -8,7 +8,7 @@ class Schema attr_reader :schema def initialize(schema = {}) - @schema = deep_transform_keys(JSON.parse(JSON.dump(schema)), &:to_sym) + @schema = JSON.parse(JSON.dump(schema), symbolize_names: true) @schema[:type] ||= "object" validate_schema! end @@ -27,19 +27,6 @@ def fully_validate(data) JSON::Validator.fully_validate(to_h, data) end - def deep_transform_keys(schema, &block) - case schema - when Hash - schema.each_with_object({}) do |(key, value), result| - result[yield(key)] = deep_transform_keys(value, &block) - end - when Array - schema.map { |e| deep_transform_keys(e, &block) } - else - schema - end - end - def validate_schema! schema = to_h gem_path = File.realpath(Gem.loaded_specs["json-schema"].full_gem_path)