Part of #5756. Design: RFC THV-0083 (Phase 1); arch doc docs/arch/stateless-vmcp-design.md §"Revision classification" + §"Phase 1". Head-start-safe: additive, no routing change.
Wire MCP 2026-07-28 ("Modern") revision classification into the vMCP client edge. Legacy stays the only executing path — this slice classifies, validates, and rejects malformed Modern requests, nothing more.
Changes
- Call
mcp.ClassifyRevision (pkg/mcp/revision.go) at the vMCP decode seam, passing the MCP-Protocol-Version header; validate Mcp-Method/Mcp-Name against the decoded body (base64-sentinel decoded, not string-compared).
- Validate presence of the required Modern
_meta fields (protocolVersion, clientCapabilities; clientInfo optional); reject via pkg/mcp/classification_response.go with the classifier's per-case code (-32602/-32020/-32021/-32022) — do not hand-build the error envelope.
- Label
server/discover in the parser vocabulary; source clientInfo/protocolVersion for telemetry.
- Do NOT allow-list
server/discover in the authz map (stays default-denied until Phase 2). No routing/dispatch change.
Dependencies
None. Reuses the shipped classifier (added in #5834, modified in #5839). Reference implementation to mirror: the streamable/transparent proxies (pkg/transport/proxy/**).
Verification
ClassifyRevision truth table at the vMCP seam; base64-sentinel Mcp-Name decoded; header/body protocolVersion mismatch → -32020; missing required field → correct per-case code.
- Legacy traffic completely unchanged (the load-bearing assertion).
Part of #5756. Design: RFC THV-0083 (Phase 1); arch doc
docs/arch/stateless-vmcp-design.md§"Revision classification" + §"Phase 1". Head-start-safe: additive, no routing change.Wire MCP 2026-07-28 ("Modern") revision classification into the vMCP client edge. Legacy stays the only executing path — this slice classifies, validates, and rejects malformed Modern requests, nothing more.
Changes
mcp.ClassifyRevision(pkg/mcp/revision.go) at the vMCP decode seam, passing theMCP-Protocol-Versionheader; validateMcp-Method/Mcp-Nameagainst the decoded body (base64-sentinel decoded, not string-compared)._metafields (protocolVersion,clientCapabilities;clientInfooptional); reject viapkg/mcp/classification_response.gowith the classifier's per-case code (-32602/-32020/-32021/-32022) — do not hand-build the error envelope.server/discoverin the parser vocabulary; sourceclientInfo/protocolVersionfor telemetry.server/discoverin the authz map (stays default-denied until Phase 2). No routing/dispatch change.Dependencies
None. Reuses the shipped classifier (added in #5834, modified in #5839). Reference implementation to mirror: the streamable/transparent proxies (
pkg/transport/proxy/**).Verification
ClassifyRevisiontruth table at the vMCP seam; base64-sentinelMcp-Namedecoded; header/bodyprotocolVersionmismatch →-32020; missing required field → correct per-case code.