From 7d64addcf6331b64a1511364419a8006737cb638 Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Sat, 17 Oct 2026 03:57:38 +0900 Subject: [PATCH] Keep Ruby 2.7 from warning about keywords in `StdioTransport` Since 1.8.0, `ServerSession#handle` accepts bare keyword arguments as the request (`handle(request = nil, auth_info: nil, **request_keywords)`), so `StdioTransport` passing the parsed request Hash as its only argument makes Ruby 2.7 treat the Hash as keyword arguments. The request is still handled, but every frame prints "Using the last argument as keyword parameters is deprecated" to stderr when deprecation warnings are enabled, which breaks callers that expect a silent stderr, such as RuboCop's MCP server specs on Ruby 2.7. Passing `auth_info: nil` explicitly keeps the Hash positional without changing the request that reaches the server. --- lib/mcp/server/transports/stdio_transport.rb | 4 +++- .../server/transports/stdio_transport_test.rb | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/mcp/server/transports/stdio_transport.rb b/lib/mcp/server/transports/stdio_transport.rb index 8c758124..37d33fb3 100644 --- a/lib/mcp/server/transports/stdio_transport.rb +++ b/lib/mcp/server/transports/stdio_transport.rb @@ -168,7 +168,9 @@ def parse_line(line) # (an `initialize` after a modern lock, a modern envelope after a legacy lock, or a missing envelope after a modern lock) # are rejected in-band by `Server#lift_request_envelope`. def dispatch_with_era(parsed) - response = @session.handle(parsed) + # Passing `auth_info:` keeps Ruby 2.7 from taking the request Hash as keyword arguments, + # which works but warns that the conversion is deprecated. + response = @session.handle(parsed, auth_info: nil) lock_modern_era_on_success(parsed, response) response end diff --git a/test/mcp/server/transports/stdio_transport_test.rb b/test/mcp/server/transports/stdio_transport_test.rb index 683e2ae4..73ed1894 100644 --- a/test/mcp/server/transports/stdio_transport_test.rb +++ b/test/mcp/server/transports/stdio_transport_test.rb @@ -135,6 +135,25 @@ class StdioTransportTest < ActiveSupport::TestCase end end + test "open passes a request to the session without a keyword argument warning" do + request = { jsonrpc: "2.0", method: "ping", id: "1" } + input = StringIO.new(JSON.generate(request) + "\n") + original_stdin = $stdin + original_deprecated = Warning[:deprecated] + + begin + $stdin = input + Warning[:deprecated] = true + + _out, err = capture_io { @transport.open } + + assert_empty(err) + ensure + $stdin = original_stdin + Warning[:deprecated] = original_deprecated + end + end + test "open handles a malformed JSON-RPC batch element and emits an error response" do input = StringIO.new("[[]]\n") output = StringIO.new