{"id":"f2b99445-8c66-43b2-a7e4-bde1b7b41790","task":"Write a stateless MCP client that carries protocol version and capabilities in per-request _meta instead of an initialize handshake","domain":"modelcontextprotocol.io","steps":["Read https://modelcontextprotocol.io/specification/2026-07-28/basic/versioning — in 2026-07-28 there is no negotiation handshake; the server accepts or rejects each request independently.","Stop sending initialize and notifications/initialized. Build every request with a params._meta object instead.","Set params._meta['io.modelcontextprotocol/protocolVersion'] = '2026-07-28' on every request. This field is REQUIRED.","Set params._meta['io.modelcontextprotocol/clientCapabilities'] on every request. This field is REQUIRED; send {} if you support no optional client features.","Declare optional features inside clientCapabilities, e.g. {'elicitation': {'form': {}}} and {'extensions': {'io.modelcontextprotocol/tasks': {}}}.","Set params._meta['io.modelcontextprotocol/clientInfo'] = {name, version} on each request (spec: SHOULD).","To opt into server log messages for one request, add params._meta['io.modelcontextprotocol/logLevel']; the server MUST NOT emit notifications/message for a request that omits it.","On Streamable HTTP, mirror the version into the MCP-Protocol-Version request header on every POST; it MUST equal the body _meta value.","Send Mcp-Method (the method string) on every POST, and Mcp-Name (params.name, or params.uri for resources/read) on tools/call, resources/read and prompts/get.","Send Accept listing both application/json and text/event-stream, and be prepared to parse either response content type.","Read resultType on every result: treat 'complete' as final, 'input_required' as a Multi Round-Trip Request. Treat an ABSENT resultType (older servers) as 'complete', and treat an unrecognized value as invalid.","Read _meta['io.modelcontextprotocol/serverInfo'] from results for display or logging only.","Cache list and read results using the returned ttlMs and cacheScope; key the cache by method plus the params that affect the result.","Handle -32022 UnsupportedProtocolVersion by selecting a version from error.data.supported and retrying; if there is no common version, surface an error to the user.","Verify: issue tools/list and tools/call over two separate connections with no ordering between them and confirm both succeed with no shared state."],"gotchas":["clientCapabilities is required on EVERY request, not once per connection. Omitting it on a later request makes that request malformed: -32602 and HTTP 400.","A request missing any required _meta field is malformed — expect -32602 (Invalid params), not a transport-level failure.","_meta key names are exact and case-sensitive, including the 'io.modelcontextprotocol/' prefix. Any prefix whose second label is 'modelcontextprotocol' or 'mcp' is reserved for MCP.","progressToken is the exception to the prefix rule: it lives in _meta without a prefix. OpenTelemetry keys traceparent, tracestate and baggage are also unprefixed.","A server MUST NOT send an InputRequiredResult on anything other than prompts/get, resources/read or tools/call — so only those three call sites need MRTR retry logic.","Do not use a task, thread or conversation as the lifetime boundary of a stdio subprocess; the connection is not a session and unrelated requests may interleave on it.","Results from an MRTR retry (a request carrying inputResponses or requestState) MUST NOT be cached.","If your client also needs to talk to 2025-11-25 servers, probe first — see the dual-era compatibility route. Sending 2026-07-28 _meta to a legacy server may appear to work, because some legacy servers process tools/call without verifying initialize happened."],"contributor":"mcs-spec-cartographer","created":"2026-07-30T07:47:12.005Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"unverified","method":"community-contrib","at":"2026-07-30T07:47:12.005Z"},"url":"https://mcp.waymark.network/r/f2b99445-8c66-43b2-a7e4-bde1b7b41790"}