Support running MCP client conformance tests against the Ruby SDK
## Motivation and Context PR #248 introduced server conformance testing using `@modelcontextprotocol/conformance`. This extends coverage to the client side so that `MCP::Client` behavior can also be validated against the MCP specification. ### Scope Client conformance is driven by the conformance runner, which spawns test servers for each scenario and invokes `conformance/client.rb` against them. The client script delegates the MCP initialize handshake to `MCP::Client#connect` and executes scenario-specific operations (for example listing tools or calling a tool). ### Usage Run all conformance tests (server + client): ```console bundle exec rake conformance ``` Run a single client scenario: ```console bundle exec rake conformance SCENARIO=initialize ``` List available scenarios: ```console bundle exec rake conformance_list ``` ## How Has This Been Tested? Ran `bundle exec rake conformance` locally. - Server conformance: 40 passed, 0 failed. - Client conformance: 3 passed, 54 failed (all 54 listed in `expected_failures.yml`). ## Breaking Change No. This change only adds test infrastructure under `conformance/` and does not modify SDK behavior.
This commit is contained in:
parent
d18698890a
commit
9603b2fe93
1 changed files with 131 additions and 17 deletions
34
conformance/client.rb
Normal file
34
conformance/client.rb
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# Conformance test client for the MCP Ruby SDK.
|
||||
# Invoked by the conformance runner:
|
||||
# MCP_CONFORMANCE_SCENARIO=<scenario> bundle exec ruby conformance/client.rb <server-url>
|
||||
#
|
||||
# The server URL is passed as the last positional argument.
|
||||
# The scenario name is read from the MCP_CONFORMANCE_SCENARIO environment variable,
|
||||
# which is set automatically by the conformance test runner.
|
||||
|
||||
require_relative "../lib/mcp"
|
||||
|
||||
scenario = ENV["MCP_CONFORMANCE_SCENARIO"]
|
||||
server_url = ARGV.last
|
||||
|
||||
unless scenario && server_url
|
||||
abort("Usage: MCP_CONFORMANCE_SCENARIO=<scenario> ruby conformance/client.rb <server-url>")
|
||||
end
|
||||
|
||||
transport = MCP::Client::HTTP.new(url: server_url)
|
||||
client = MCP::Client.new(transport: transport)
|
||||
client.connect(client_info: { name: "ruby-sdk-conformance-client", version: MCP::VERSION })
|
||||
|
||||
case scenario
|
||||
when "initialize"
|
||||
client.tools
|
||||
when "tools_call"
|
||||
tools = client.tools
|
||||
add_numbers = tools.find { |t| t.name == "add_numbers" }
|
||||
abort("Tool add_numbers not found") unless add_numbers
|
||||
client.call_tool(tool: add_numbers, arguments: { a: 1, b: 2 })
|
||||
else
|
||||
abort("Unknown or unsupported scenario: #{scenario}")
|
||||
end
|
||||
Loading…
Reference in a new issue