@@ -10,66 +10,69 @@ import (
1010 "fmt"
1111 "net/http"
1212
13+ internaljson "github.com/modelcontextprotocol/go-sdk/internal/json"
1314 "github.com/modelcontextprotocol/go-sdk/jsonrpc"
1415)
1516
1617const (
17- ProtocolVersionHeader = "Mcp-Protocol-Version"
18- SessionIDHeader = "Mcp-Session-Id"
19- LastEventIDHeader = "Last-Event-ID"
20- MethodHeader = "Mcp-Method"
21- NameHeader = "Mcp-Name"
22- MinVersionForStandardHeaders = "2026-06-XX"
18+ protocolVersionHeader = "Mcp-Protocol-Version"
19+ sessionIDHeader = "Mcp-Session-Id"
20+ lastEventIDHeader = "Last-Event-ID"
21+ methodHeader = "Mcp-Method"
22+ nameHeader = "Mcp-Name"
23+ minVersionForStandardHeaders = protocolVersion20260630
2324)
2425
2526func extractName (method string , params json.RawMessage ) (string , bool ) {
2627 switch method {
2728 case "tools/call" :
2829 var p CallToolParams
29- if err := json .Unmarshal (params , & p ); err == nil {
30+ if err := internaljson .Unmarshal (params , & p ); err == nil {
3031 return p .Name , true
3132 }
3233 case "prompts/get" :
3334 var p GetPromptParams
34- if err := json .Unmarshal (params , & p ); err == nil {
35+ if err := internaljson .Unmarshal (params , & p ); err == nil {
3536 return p .Name , true
3637 }
3738 case "resources/read" :
3839 var p ReadResourceParams
39- if err := json .Unmarshal (params , & p ); err == nil {
40+ if err := internaljson .Unmarshal (params , & p ); err == nil {
4041 return p .URI , true
4142 }
4243 }
4344
4445 return "" , false
4546}
4647
48+ // setStandardHeaders populates standard MCP headers.
49+ // It requires the protocol version header to be set.
4750func setStandardHeaders (header http.Header , msg jsonrpc.Message ) {
4851 if msg == nil {
4952 return
5053 }
51- if header .Get (ProtocolVersionHeader ) == "" || header .Get (ProtocolVersionHeader ) < MinVersionForStandardHeaders {
54+ if header .Get (protocolVersionHeader ) == "" || header .Get (protocolVersionHeader ) < minVersionForStandardHeaders {
5255 return
5356 }
5457
5558 switch msg := msg .(type ) {
5659 case * jsonrpc.Request :
57- header .Set (MethodHeader , msg .Method )
60+ header .Set (methodHeader , msg .Method )
5861 if name , ok := extractName (msg .Method , msg .Params ); ok {
59- header .Set (NameHeader , name )
62+ header .Set (nameHeader , name )
6063 }
6164 }
6265}
6366
6467func validateMcpHeaders (header http.Header , msg jsonrpc.Message ) error {
65- protocolVersion := header .Get (ProtocolVersionHeader )
66- if protocolVersion == "" || protocolVersion < MinVersionForStandardHeaders {
68+ protocolVersion := header .Get (protocolVersionHeader )
69+ if protocolVersion == "" || protocolVersion < minVersionForStandardHeaders {
6770 return nil
6871 }
6972
7073 switch msg := msg .(type ) {
7174 case * jsonrpc.Request :
72- methodInHeader := header .Get (MethodHeader )
75+ methodInHeader := header .Get (methodHeader )
7376 if methodInHeader == "" {
7477 return errors .New ("missing required Mcp-Method header" )
7578 }
@@ -78,14 +81,16 @@ func validateMcpHeaders(header http.Header, msg jsonrpc.Message) error {
7881 }
7982
8083 if msg .Method == "tools/call" || msg .Method == "resources/read" || msg .Method == "prompts/get" {
81- nameInHeader := header .Get (NameHeader )
84+ nameInHeader := header .Get (nameHeader )
8285 if nameInHeader == "" {
8386 return fmt .Errorf ("missing required Mcp-Name header for method %q" , msg .Method )
8487 }
85- if nameInBody , ok := extractName (msg .Method , msg .Params ); ok {
86- if nameInHeader != nameInBody {
87- return fmt .Errorf ("header mismatch: Mcp-Name header value '%s' does not match body value '%s'" , nameInHeader , nameInBody )
88- }
88+ nameInBody , ok := extractName (msg .Method , msg .Params )
89+ if ! ok {
90+ return fmt .Errorf ("failed to extract name from parameters for method %q" , msg .Method )
91+ }
92+ if nameInHeader != nameInBody {
93+ return fmt .Errorf ("header mismatch: Mcp-Name header value '%s' does not match body value '%s'" , nameInHeader , nameInBody )
8994 }
9095 }
9196 }
0 commit comments