diff --git a/lib/mcp/server.rb b/lib/mcp/server.rb index 5255207..7646b29 100644 --- a/lib/mcp/server.rb +++ b/lib/mcp/server.rb @@ -531,14 +531,14 @@ def call_prompt_template_with_args(prompt, args, server_context) def server_context_with_meta(request) meta = request[:_meta] - if meta && @server_context.is_a?(Hash) - context = @server_context.dup + if meta && server_context.is_a?(Hash) + context = server_context.dup context[:_meta] = meta context - elsif meta && @server_context.nil? + elsif meta && server_context.nil? { _meta: meta } else - @server_context + server_context end end end diff --git a/test/mcp/server_test.rb b/test/mcp/server_test.rb index fac919b..c7d7ec7 100644 --- a/test/mcp/server_test.rb +++ b/test/mcp/server_test.rb @@ -1731,5 +1731,31 @@ def call(numbers:, strings:, objects:, server_context: nil) end end end + + test "server_context_with_meta uses accessor method, not ivar directly" do + subclass = Class.new(Server) do + def server_context + { custom: "from_accessor" } + end + end + + server = subclass.new(name: "test", tools: []) + + received_context = nil + server.define_tool(name: "ctx_tool") do |server_context:| + received_context = server_context + Tool::Response.new([{ type: "text", text: "ok" }]) + end + + request = { + jsonrpc: "2.0", + method: "tools/call", + id: 1, + params: { name: "ctx_tool", arguments: {} }, + } + + server.handle(request) + assert_equal "from_accessor", received_context[:custom] + end end end