Build1 publisherNot yet confirmed elsewhere3 min readPublished
Claude Code 2.1.285 can skip the handshake that carries a stdio MCP server's instructions
Claude Code 2.1.285 sent server/discover to a stdio MCP server in all 20 runs of a published test, a probe its docs reserve for an opt-in setting. When the server answered it, initialize never came, so the instructions kept in that reply never reached the model.
The Engineer · Build desk
Drafted by a language model from the sources cited here and checked against its claim ledger before publication. How we use AISend a correction
What happened
- Where the instructions did arrive, Claude Code delivered them as a system-reminder in the first user turn and never placed them in the system prompt.
- The capped instructions block added 721 tokens to the first request when written in English and 1,727 when written in Japanese.
- The runs were made on 2026-09-30 with claude -p, Opus resolving to claude-opus-5-5, and Node v22.22.2 on macOS.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- contradiction Claude Code's docs say stdio servers get the probe only when MCP_PROTOCOL_NEGOTIATION is auto, yet it fired every time, so the docs cannot predict which handshake a stdio server gets on 2.1.285.
- decision Authors who implement server/discover have to choose where their instructions live, because answering the probe means the initialize reply is never read.
- constraint With tool search on, the first 2,048 characters of the instructions are most of what the model learns about a server at session start, so its purpose has to be stated in the opening lines.
- cost A server that writes its instructions in Japanese spends roughly 2.4 times the English token count on the first request for the same character allowance.
Which reply a server's instructions come from depends on which handshake runs first. In the 2025-11-25 revision of the MCP spec, instructions are an optional field of the initialize reply, and the lifecycle page says "The initialization phase MUST be the first interaction between client and server." [11] The 2026-07-28 revision has no initialize handshake and puts instructions in the result of server/discover [13]. A stdio client that speaks both versions "SHOULD probe with server/discover before sending any other request". It treats the server as legacy only if the server "returns any other error, or does not respond within a reasonable timeout" [14].
By that text, a client that skips initialize after an answered probe is behaving correctly [3][14]. What departs from the docs is the probe. Claude Code's MCP page says that to have the v2 runtime ask stdio servers about the newer revision, you "set MCP_PROTOCOL_NEGOTIATION to auto" [2]. The variable's reference entry repeats the default: "Without the variable, Claude Code probes HTTP servers, and also probes claude.ai connector servers in sessions where it fetches feature flags." [15] According to the dev.to write-up, the probe opened all 20 stdio runs [1].
The server at risk answers server/discover but keeps its instructions in the initialize reply. On 2.1.285 that reply is never requested [3]. The published excerpt does not show what Claude Code did with instructions placed in the discover result. In my view a server that answers the probe should return the same text in both replies, since each spec revision defines the field on its own handshake [11][13].
The test design is good work. The server's instructions carried codewords at both ends and position markers in between. Each run was checked three ways: the model's answer, the session transcript under ~/.claude/projects/, and a server log of every JSON-RPC message received [9]. A model that never repeats the codeword looks the same whether it ignored the text or never got it. Only the server log can show that initialize never arrived.
The stakes go up with tool search. Claude Code's docs say that with it on, "Only tool names and server instructions load at session start" [16]. They also advise, about the default cut: "Keep them concise, and put critical details near the start." [7] The spec permits the user-turn placement the test observed. Its 2025-11-25 schema says the text "MAY be added to the system prompt" [12]. At the same cap, Japanese instructions cost about 2.4 times as many tokens as English ones, 1,727 against 721 [6][17]. The cap moves with CLAUDE_CODE_MAX_MCP_DESCRIPTION_LENGTH, whose entry says it "Accepts a positive whole number in plain digits. Anything else is ignored and the default applies." [8] So 4096 raises the cap and 4k leaves it at 2,048.
The finding covers one build. For it to apply to a later release, that release would have to keep probing stdio servers with MCP_PROTOCOL_NEGOTIATION unset [1][2].
What to watch
- Whether a later Claude Code release stops probing stdio servers by default, or the docs change to say it does.
- Whether the full write-up shows Claude Code reading instructions from a server/discover result when the server answers the probe.
- Whether interactive Claude Code sessions, not only claude -p, open stdio servers with server/discover.