getsentry / getsentry/sentry-javascript

MCP server wrapper misses messages delivered during transport start

未关闭
#23,977 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
Bug javascript Node.js
主要语言
TypeScript
星标
8.7k
派生
1.8k
平均合并
1 天 17 小时
30 天内合并 PR
515

描述

## Problem

`wrapMcpServerWithSentry` instruments an MCP transport only after the wrapped
server's `connect()` promise resolves. Both supported MCP TypeScript SDK
generations install their transport callbacks and then call
`transport.start()` before that promise resolves.

A transport is allowed to deliver already-buffered messages from `start()`.
The official `InMemoryTransport` does this in both SDK v1.30.0 and v2.0.0. If
an `initialize` request is queued before the server connects, that first
request reaches the server before Sentry wraps `onmessage`, so no MCP span is
created for it.

## Reproduction

1. Create an official linked `InMemoryTransport` pair.
2. Start `Client.connect()` first so its `initialize` request is queued on the
server transport.
3. Connect a server wrapped with `wrapMcpServerWithSentry`.
4. Inspect the emitted MCP spans.

## Actual behavior

The queued `initialize` request is handled during `transport.start()` and is
missing from Sentry. Later requests are instrumented after `connect()`
completes.

## Expected behavior

- Instrument the callbacks after the MCP SDK installs them but before
`transport.start()` can deliver its first message.
- Preserve the transport's `start()` receiver, promise, errors and property
shape.
- Restore the temporary interception after the connection attempt.
- Preserve the existing post-connect behavior for transports whose `start`
method cannot be intercepted or is not invoked.
- Capture the first request exactly once in MCP SDK v1 and v2, both in v11's
default Sentry-only mode and its optional Sentry-managed
OpenTelemetry-compatible mode (`enableOpenTelemetrySetup: true`).

贡献指南

打开贡献指南

调研方向

Start by tracing wrapMcpServerWithSentry through the wrapped server's connect() flow and the transport.start() call, comparing MCP SDK v1 and v2 callback setup. Reproduce the queued initialize request with linked InMemoryTransport pairs, then verify that the first request is captured exactly once in both Sentry-only and enableOpenTelemetrySetup modes while receiver, errors, promise, property shape, and post-connect behavior remain intact.

由索引模型根据 Issue 内容生成。

评估

技术栈
typescript
领域
observability
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
活跃
描述清晰度
基本清楚
新手友好度
55/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。