UNPKG

@sentry/core

Version:
71 lines (60 loc) 2.2 kB
import { fill } from '../../utils/object.js'; import { wrapAllMCPHandlers } from './handlers.js'; import { wrapTransportOnMessage, wrapTransportSend, wrapTransportOnClose, wrapTransportError } from './transport.js'; import { validateMcpServerInstance } from './validation.js'; /** * Tracks wrapped MCP server instances to prevent double-wrapping * @internal */ const wrappedMcpServerInstances = new WeakSet(); /** * Wraps a MCP Server instance from the `@modelcontextprotocol/sdk` package with Sentry instrumentation. * * Compatible with versions `^1.9.0` of the `@modelcontextprotocol/sdk` package. * Automatically instruments transport methods and handler functions for comprehensive monitoring. * * @example * ```typescript * import * as Sentry from '@sentry/core'; * import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; * import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; * * const server = Sentry.wrapMcpServerWithSentry( * new McpServer({ name: "my-server", version: "1.0.0" }) * ); * * const transport = new StreamableHTTPServerTransport(); * await server.connect(transport); * ``` * * @param mcpServerInstance - MCP server instance to instrument * @returns Instrumented server instance (same reference) */ function wrapMcpServerWithSentry(mcpServerInstance) { if (wrappedMcpServerInstances.has(mcpServerInstance)) { return mcpServerInstance; } if (!validateMcpServerInstance(mcpServerInstance)) { return mcpServerInstance; } const serverInstance = mcpServerInstance ; fill(serverInstance, 'connect', originalConnect => { return async function ( transport, ...restArgs) { const result = await (originalConnect ).call( this, transport, ...restArgs, ); wrapTransportOnMessage(transport); wrapTransportSend(transport); wrapTransportOnClose(transport); wrapTransportError(transport); return result; }; }); wrapAllMCPHandlers(serverInstance); wrappedMcpServerInstances.add(mcpServerInstance); return mcpServerInstance ; } export { wrapMcpServerWithSentry }; //# sourceMappingURL=index.js.map