fix: reject duplicate initialize requests (#962)

## Summary
- reject a second `initialize` request on an already initialized server
session
- keep the original `ServerSession.InitializeParams()` instead of
replacing it with later client parameters
- add a raw JSON-RPC regression test for the duplicate-initialize path

Fixes #961.

## To verify
- `go test ./mcp -run TestServerRejectsDuplicateInitialize -count=1`
- `go test ./mcp -count=1`
- `go test ./...`

---------

Co-authored-by: guglielmoc <guglielmoc@google.com>
This commit is contained in:
Yufeng He 2026-05-25 21:15:26 +08:00 • committed by GitHub
commit bed83e104b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1488,9 +1488,17 @@ func (ss *ServerSession) initialize(ctx context.Context, params *InitializeParam
if params == nil {
return nil, fmt.Errorf("%w: \"params\" must be be provided", jsonrpc2.ErrInvalidParams)
}
var wasInit bool
ss.updateState(func(state *ServerSessionState) {
state.InitializeParams = params
wasInit = state.InitializeParams != nil
if !wasInit {
state.InitializeParams = params
}
})
if wasInit {
ss.server.opts.Logger.Error("duplicate initialize request")
return nil, fmt.Errorf("duplicate %q received", methodInitialize)
}
s := ss.server
return &InitializeResult{