Next.js website for Rocky Mountain Vending company featuring: - Product catalog with Stripe integration - Service areas and parts pages - Admin dashboard with Clerk authentication - SEO optimized pages with JSON-LD structured data Co-authored-by: Cursor <cursoragent@cursor.com>
1 line
No EOL
9.1 KiB
Text
1 line
No EOL
9.1 KiB
Text
{"version":3,"file":"spans.js","sources":["../../../../src/integrations/mcp-server/spans.ts"],"sourcesContent":["/**\n * Span creation and management functions for MCP server instrumentation\n *\n * Provides unified span creation following OpenTelemetry MCP semantic conventions and our opinitionated take on MCP.\n * Handles both request and notification spans with attribute extraction.\n */\n\nimport { getClient } from '../../currentScopes';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../../semanticAttributes';\nimport { startSpan } from '../../tracing';\nimport { buildTransportAttributes, buildTypeSpecificAttributes } from './attributeExtraction';\nimport {\n MCP_FUNCTION_ORIGIN_VALUE,\n MCP_METHOD_NAME_ATTRIBUTE,\n MCP_NOTIFICATION_CLIENT_TO_SERVER_OP_VALUE,\n MCP_NOTIFICATION_ORIGIN_VALUE,\n MCP_NOTIFICATION_SERVER_TO_CLIENT_OP_VALUE,\n MCP_ROUTE_SOURCE_VALUE,\n MCP_SERVER_OP_VALUE,\n} from './attributes';\nimport { extractTargetInfo } from './methodConfig';\nimport { filterMcpPiiFromSpanData } from './piiFiltering';\nimport type { ExtraHandlerData, JsonRpcNotification, JsonRpcRequest, McpSpanConfig, MCPTransport } from './types';\n\n/**\n * Creates a span name based on the method and target\n * @internal\n * @param method - MCP method name\n * @param target - Optional target identifier\n * @returns Formatted span name\n */\nfunction createSpanName(method: string, target?: string): string {\n return target ? `${method} ${target}` : method;\n}\n\n/**\n * Build Sentry-specific attributes based on span type\n * @internal\n * @param type - Span type configuration\n * @returns Sentry-specific attributes\n */\nfunction buildSentryAttributes(type: McpSpanConfig['type']): Record<string, string> {\n let op: string;\n let origin: string;\n\n switch (type) {\n case 'request':\n op = MCP_SERVER_OP_VALUE;\n origin = MCP_FUNCTION_ORIGIN_VALUE;\n break;\n case 'notification-incoming':\n op = MCP_NOTIFICATION_CLIENT_TO_SERVER_OP_VALUE;\n origin = MCP_NOTIFICATION_ORIGIN_VALUE;\n break;\n case 'notification-outgoing':\n op = MCP_NOTIFICATION_SERVER_TO_CLIENT_OP_VALUE;\n origin = MCP_NOTIFICATION_ORIGIN_VALUE;\n break;\n }\n\n return {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: op,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: origin,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: MCP_ROUTE_SOURCE_VALUE,\n };\n}\n\n/**\n * Unified builder for creating MCP spans\n * @internal\n * @param config - Span configuration\n * @returns Created span\n */\nfunction createMcpSpan(config: McpSpanConfig): unknown {\n const { type, message, transport, extra, callback } = config;\n const { method } = message;\n const params = message.params as Record<string, unknown> | undefined;\n\n // Determine span name based on type and OTEL conventions\n let spanName: string;\n if (type === 'request') {\n const targetInfo = extractTargetInfo(method, params || {});\n spanName = createSpanName(method, targetInfo.target);\n } else {\n // For notifications, use method name directly per OpenTelemetry conventions\n spanName = method;\n }\n\n const rawAttributes: Record<string, string | number> = {\n ...buildTransportAttributes(transport, extra),\n [MCP_METHOD_NAME_ATTRIBUTE]: method,\n ...buildTypeSpecificAttributes(type, message, params),\n ...buildSentryAttributes(type),\n };\n\n const client = getClient();\n const sendDefaultPii = Boolean(client?.getOptions().sendDefaultPii);\n const attributes = filterMcpPiiFromSpanData(rawAttributes, sendDefaultPii) as Record<string, string | number>;\n\n return startSpan(\n {\n name: spanName,\n forceTransaction: true,\n attributes,\n },\n callback,\n );\n}\n\n/**\n * Creates a span for incoming MCP notifications\n * @param jsonRpcMessage - Notification message\n * @param transport - MCP transport instance\n * @param extra - Extra handler data\n * @param callback - Span execution callback\n * @returns Span execution result\n */\nexport function createMcpNotificationSpan(\n jsonRpcMessage: JsonRpcNotification,\n transport: MCPTransport,\n extra: ExtraHandlerData,\n callback: () => unknown,\n): unknown {\n return createMcpSpan({\n type: 'notification-incoming',\n message: jsonRpcMessage,\n transport,\n extra,\n callback,\n });\n}\n\n/**\n * Creates a span for outgoing MCP notifications\n * @param jsonRpcMessage - Notification message\n * @param transport - MCP transport instance\n * @param callback - Span execution callback\n * @returns Span execution result\n */\nexport function createMcpOutgoingNotificationSpan(\n jsonRpcMessage: JsonRpcNotification,\n transport: MCPTransport,\n callback: () => unknown,\n): unknown {\n return createMcpSpan({\n type: 'notification-outgoing',\n message: jsonRpcMessage,\n transport,\n callback,\n });\n}\n\n/**\n * Builds span configuration for MCP server requests\n * @param jsonRpcMessage - Request message\n * @param transport - MCP transport instance\n * @param extra - Optional extra handler data\n * @returns Span configuration object\n */\nexport function buildMcpServerSpanConfig(\n jsonRpcMessage: JsonRpcRequest,\n transport: MCPTransport,\n extra?: ExtraHandlerData,\n): {\n name: string;\n op: string;\n forceTransaction: boolean;\n attributes: Record<string, string | number>;\n} {\n const { method } = jsonRpcMessage;\n const params = jsonRpcMessage.params as Record<string, unknown> | undefined;\n\n const targetInfo = extractTargetInfo(method, params || {});\n const spanName = createSpanName(method, targetInfo.target);\n\n const rawAttributes: Record<string, string | number> = {\n ...buildTransportAttributes(transport, extra),\n [MCP_METHOD_NAME_ATTRIBUTE]: method,\n ...buildTypeSpecificAttributes('request', jsonRpcMessage, params),\n ...buildSentryAttributes('request'),\n };\n\n const client = getClient();\n const sendDefaultPii = Boolean(client?.getOptions().sendDefaultPii);\n const attributes = filterMcpPiiFromSpanData(rawAttributes, sendDefaultPii) as Record<string, string | number>;\n\n return {\n name: spanName,\n op: MCP_SERVER_OP_VALUE,\n forceTransaction: true,\n attributes,\n };\n}\n"],"names":[],"mappings":"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"} |