From c8116fbcf03a7bfbbbb53c02371a3c5f048b9adf Mon Sep 17 00:00:00 2001 From: Koichi ITO Date: Fri, 14 Aug 2026 04:12:54 +0900 Subject: [PATCH] Drive the `http-standard-headers` scenario in the conformance client ## Motivation and Context The 2026-07-28 requirement set scores `http-standard-headers` (SEP-2243) on the client leg, but `conformance/client.rb` had no case for it: the scenario hit the unknown-scenario abort, the client exited 1, and every `Mcp-Method` / `Mcp-Name` check reported SKIPPED ("Client did not send a ... request"), failing the scenario in tier-check. The 2026-08-14 tier audit flagged this as the only scored conformance failure (client leg 49/50). The transport already sends the standard headers on the modern path; what was missing is a driver that exercises each request kind the harness observes. The new case issues `tools/list`, `tools/call` (the `test_headers` fixture tool), `resources/list`, `resources/read` (the first listed resource URI), `prompts/list`, and `prompts/get` (the first listed prompt), letting the harness see the `Mcp-Method` header on every POST and the `Mcp-Name` header on the three name-carrying requests. The `initialize` / `notifications/initialized` rows stay SKIPPED by design: the 2026-07-28 wire is stateless, so those requests are never sent. ## How Has This Been Tested? `conformance client --scenario http-standard-headers --spec-version 2026-07-28` passes 9/9 checks, and the full `--requirements 2026-07-28` client leg exits 0 with every scored scenario passing (435 checks; the only failures are the baselined not-scored DPoP/WIF extensions). RuboCop is clean. ## Breaking Changes None. The change only adds a scenario driver to the conformance client fixture; library code is untouched. --- conformance/client.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/conformance/client.rb b/conformance/client.rb index c04d272e..b568e2ec 100644 --- a/conformance/client.rb +++ b/conformance/client.rb @@ -238,6 +238,21 @@ def build_provider_for(scenario, context) # calling only the valid one shows the invalid definitions did not block it. client.tools client.call_tool(name: "valid_tool", arguments: { "message" => "hello" }) + when "http-standard-headers" + # SEP-2243: the harness inspects the `Mcp-Method` header on every POST and the `Mcp-Name` header on + # the name-carrying requests, so drive one of each standard request kind. + tools = client.tools + tool = tools.find { |t| t.name == "test_headers" } || tools.first + abort("No tool exposed by conformance server for #{scenario}") unless tool + client.call_tool(tool: tool, arguments: {}) + + resource = client.resources.first + abort("No resource exposed by conformance server for #{scenario}") unless resource + client.read_resource(uri: resource["uri"]) + + prompt = client.prompts.first + abort("No prompt exposed by conformance server for #{scenario}") unless prompt + client.get_prompt(name: prompt["name"]) when "json-schema-ref-no-deref" # SEP-2106: listing tools whose schemas carry `$ref` must not trigger network dereferencing. client.tools