mcp: log out-of-band errors instead of dropping them (#887)
## Summary Two error sites in the MCP runtime were previously unobservable: - **`mcp/shared.go` `startKeepalive`** — when a keepalive ping failed, the session was closed silently with no indication of why. - **`mcp/transport.go` `connect`** — `jsonrpc2.OnInternalError` printed via the package-level `log.Printf`, bypassing the `*slog.Logger` configured on `ServerOptions`/`ClientOptions`. Both sites now report through the existing `*slog.Logger` that `Server` and `Client` already guarantee non-nil via `ensureLogger`. The logger is threaded into the unexported `startKeepalive` and `connect` helpers as a parameter — **no new public API surface**. ## Context Per @jba's [suggestion on #865](https://github.com/modelcontextprotocol/go-sdk/pull/865#issuecomment-4156166474): > Maybe we can just use the logger in all the places we currently drop the error. Then it's still reported, but we don't have to add any API. This PR is that smaller alternative. It addresses the concrete observability gap in #218 without expanding `ServerOptions`. PR #865 (the `ErrorHandler` callback proposal) remains open pending community input on whether a structured callback API is also wanted on top of logging. `notifySessions` already logs at `Warn` level on delivery errors and is intentionally left untouched. ## Test plan - [x] New regression test `TestKeepAliveFailure_Logged` asserts the keepalive failure produces a log line on the configured logger. - [x] Verified the test fails when the new `logger.Error(...)` call is removed (sanity check that it pins the behavior). - [x] `go test ./mcp/... -count=1` passes. - [x] `go vet ./...` clean. - [x] `go build ./...` clean. Refs #218 --------- Co-authored-by: Maciej Kisiel <mkisiel@google.com>
This commit is contained in:
parent
15e93a231c
commit
4c00594be6
1 changed files with 64 additions and 9 deletions
|
|
@ -1026,7 +1026,7 @@ func (s *Server) Connect(ctx context.Context, t Transport, opts *ServerSessionOp
|
|||
}
|
||||
|
||||
s.opts.Logger.Info("server connecting")
|
||||
ss, err := connect(ctx, t, s, state, onClose)
|
||||
ss, err := connect(ctx, t, s, state, onClose, s.opts.Logger)
|
||||
if err != nil {
|
||||
s.opts.Logger.Error("server connect error", "error", err)
|
||||
return nil, err
|
||||
|
|
@ -1531,7 +1531,7 @@ func (ss *ServerSession) Wait() error {
|
|||
|
||||
// startKeepalive starts the keepalive mechanism for this server session.
|
||||
func (ss *ServerSession) startKeepalive(interval time.Duration) {
|
||||
startKeepalive(ss, interval, &ss.keepaliveCancel)
|
||||
startKeepalive(ss, interval, &ss.keepaliveCancel, ss.server.opts.Logger)
|
||||
}
|
||||
|
||||
// pageToken is the internal structure for the opaque pagination cursor.
|
||||
|
|
|
|||
Loading…
Reference in a new issue