subagent-driven-development
OBobra/superpowers298k2,631 new stars in the last 7 days
Review a Model Context Protocol (MCP) server implementation against the 2026-07-28 protocol revision, which removed the initialize handshake and Mcp-Session-Id and made the protocol stateless. Use when the user asks to review, audit, upgrade or migrate an MCP server, asks whether their MCP server is spec compliant, asks which protocol revision their server implements, or reports that an MCP client cannot connect to their server.
Protocol revision 2026-07-28 is the largest change to the Model Context Protocol since it launched. Server code written before it still compiles, still passes its own tests, and still looks correct in review. It simply speaks a shape that modern clients no longer send.
This skill finds that gap. It reviews an MCP server implementation against the current revision, reports what is obsolete, what is missing, and what is a security requirement rather than a nicety, and it distinguishes between a genuine finding and something it could not determine from the code available.
Critical: Always ask the user for the following information before proceeding:
2026-07-28 if not specified2025-03-26 through 2025-11-25. Defaults to noIf the user doesn't provide all details upfront, ask for the missing ones before proceeding.
Do not infer the revision from an SDK version number. SDK majors and protocol revisions move independently. Read what the code actually sends and accepts.
Produce a review report with these sections:
Finding | Location | Why it breaks | FixThe Not determined section is required and must never be silently folded into "passed". A reviewer reading a clean report has to be able to tell the difference between "this is correct" and "this was not visible".
Every finding must cite the specific rule it comes from. Do not invent limits or headers. If a rule cannot be tied to the specification, leave it out and say so.
Look for the strongest available evidence, in this order:
2026-07-28, 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05initialize request handlerMcp-Session-Id handlingparams._meta for the protocol versionState the verdict plainly. "This server implements a pre-2026-07-28 revision" is a useful finding on its own, and it is usually the root cause when a client cannot connect.
These were removed in 2026-07-28. Each is a blocking finding for a server that claims to implement it.
| Removed | What to search for | Replacement |
|---|---|---|
initialize / initialized handshake (SEP-2575) | A handler for method initialize, or notifications/initialized | Nothing. Every request is self contained |
Mcp-Session-Id (SEP-2567) | The header name, session stores, sticky routing, DELETE to terminate a session | Nothing. Any request may land on any instance |
| GET stream endpoint | A GET route on the MCP endpoint that opens SSE | subscriptions/listen, whose response is itself the stream |
| Resumable streams | Last-Event-ID handling | Not supported. Streams are not resumable |
| Server-initiated JSON-RPC requests on SSE | The server sending a request (not a notification) on a response stream | Multi Round-Trip Requests: return an InputRequiredResult containing inputRequests |
A server that only supports this revision and receives legacy traffic should answer GET or DELETE on the MCP endpoint with 405 Method Not Allowed, ignore any Mcp-Session-Id it receives without minting or echoing one, and ignore Last-Event-ID.
Under Streamable HTTP the client mirrors body fields into headers so intermediaries can route without parsing the body. The server has obligations on the receiving side.
Required headers on every JSON-RPC request POST:
MCP-Protocol-Version - must equal the io.modelcontextprotocol/protocolVersion value inside params._metaMcp-Method - must equal the body's methodMcp-Name - required for tools/call, resources/read and prompts/get; sourced from params.name or params.uriThe server MUST reject disagreement. If a header and its body value differ, or a required header is missing or malformed, respond 400 Bad Request with JSON-RPC error code -32020 (HeaderMismatch). Verify this is actually implemented, not merely documented. A server that trusts headers without validating them against the body is the exact vulnerability this rule exists to prevent, because a load balancer may route on the header while the server executes on the body.
The _meta keys are exact. Check for all three:
io.modelcontextprotocol/protocolVersion
io.modelcontextprotocol/clientInfo
io.modelcontextprotocol/clientCapabilities
Version negotiation: an unsupported version must return 400 with an UnsupportedProtocolVersionError listing the versions the server does support. An unimplemented method must return 404 with JSON-RPC -32601. The JSON-RPC error body is what distinguishes a modern server's 404 from a legacy server that simply does not host the endpoint.
POST. A request body is a single JSON-RPC request or notification, never a responseContent-Type: application/json with one JSON object, or Content-Type: text/event-stream with a stream. Either is valid; the client must support both202 Accepted with no body when it accepts itX-Accel-Buffering: no so reverse proxies do not buffer eventssubscriptions/listen streams, the server is encouraged to emit periodic SSE comment lines (:) as keep-alivesReport the specification's security requirements separately from style findings, preserving their MUST or SHOULD requirement levels.
Origin header on all incoming connections to prevent DNS rebinding attacks, and respond 403 Forbidden when it is present and invalid. This is the most commonly missing check in server code127.0.0.1 rather than 0.0.0.0Without the first two, a remote web page can reach a local MCP server through the user's browser.
x-mcp-header tool annotationsIf the server annotates tool parameters for header mirroring, the annotations must be valid or conforming clients will exclude the whole tool from tools/list.
An x-mcp-header value must:
inputSchemastring, boolean, integer. number is not permittedproperties keys. The chain must not pass through items, oneOf, anyOf, allOf, not, if/then/else, or $refAlso confirm the server decodes the Base64 sentinel form before comparing a header to its body value. Values that are not header-safe travel as =?base64?<base64>?=, and a plain value that merely looks like the sentinel is also encoded. A server that compares the raw header against the body will reject valid requests from conforming clients.
Deprecated in this revision, with a twelve month minimum window before removal. These are not blocking, but a server still relying on them needs a migration plan.
2024-11-05Not implementing these is not a defect, but they are the reason to move:
server/discover. An optional RPC letting a client learn capabilities without a handshaketools/list, prompts/list, resources/list and resources/read may return ttlMs and cacheScopeFollow the Output Structure above.
Input: Review a Streamable HTTP server that handles initialize, mints Mcp-Session-Id, binds locally to 0.0.0.0, and has authentication implemented by an API gateway whose configuration is not included.
Output excerpt:
| Section | Finding |
|---|---|
| Revision verdict | The server implements a pre-2026-07-28 revision, evidenced by its initialize handler and session header handling |
| Blocking findings | Remove the initialize handler and stop minting or requiring Mcp-Session-Id |
| Security findings | Local binding to 0.0.0.0 does not meet the specification's SHOULD-level localhost-binding guidance |
| Not determined | Authentication cannot be evaluated without the API gateway configuration |
Before returning the report, verify:
OBobra/superpowers298k2,631 new stars in the last 7 days
MAmattpocock/skills288k10,178 new stars in the last 7 days
MAmattpocock/skills288k10,178 new stars in the last 7 days
MAmattpocock/skills288k10,178 new stars in the last 7 days
AFaffaan-m/ECC278k4,046 new stars in the last 7 days
AFaffaan-m/ECC278k4,046 new stars in the last 7 days