Files
klz-cables.com/.pnpm-store/v10/files/84/855ef092284d84a08ce423eed703c09eed90ad745f88a4d1f627c1ea955e00309aa244b5e3fe91aa846812b8e2e05ff39080ad3f4fbac69fc379fcc9d0a50e
Marc Mintel 5397309103
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
fix(products): fix breadcrumbs and product filtering (backport from main)
2026-02-24 16:04:21 +01:00

87 lines
2.8 KiB
Plaintext

import { getClient } from '../../currentScopes.js';
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';
*
* // Default: inputs/outputs captured based on sendDefaultPii option
* const server = Sentry.wrapMcpServerWithSentry(
* new McpServer({ name: "my-server", version: "1.0.0" })
* );
*
* // Explicitly control input/output capture
* const server = Sentry.wrapMcpServerWithSentry(
* new McpServer({ name: "my-server", version: "1.0.0" }),
* { recordInputs: true, recordOutputs: false }
* );
*
* const transport = new StreamableHTTPServerTransport();
* await server.connect(transport);
* ```
*
* @param mcpServerInstance - MCP server instance to instrument
* @param options - Optional configuration for recording inputs and outputs
* @returns Instrumented server instance (same reference)
*/
function wrapMcpServerWithSentry(mcpServerInstance, options) {
if (wrappedMcpServerInstances.has(mcpServerInstance)) {
return mcpServerInstance;
}
if (!validateMcpServerInstance(mcpServerInstance)) {
return mcpServerInstance;
}
const serverInstance = mcpServerInstance ;
const client = getClient();
const sendDefaultPii = Boolean(client?.getOptions().sendDefaultPii);
const resolvedOptions = {
recordInputs: options?.recordInputs ?? sendDefaultPii,
recordOutputs: options?.recordOutputs ?? sendDefaultPii,
};
fill(serverInstance, 'connect', originalConnect => {
return async function ( transport, ...restArgs) {
const result = await (originalConnect ).call(
this,
transport,
...restArgs,
);
wrapTransportOnMessage(transport, resolvedOptions);
wrapTransportSend(transport, resolvedOptions);
wrapTransportOnClose(transport);
wrapTransportError(transport);
return result;
};
});
wrapAllMCPHandlers(serverInstance);
wrappedMcpServerInstances.add(mcpServerInstance);
return mcpServerInstance;
}
export { wrapMcpServerWithSentry };
//# sourceMappingURL=index.js.map