Skip to content

Commit 39aaac0

Browse files
msukkariclaude
andcommitted
fix(web): handle unhandled promise rejections in tool_used captureEvent calls
Add .catch(() => {}) to all fire-and-forget captureEvent('tool_used') calls in adapters.ts and server.ts, matching the existing pattern in apiHandler.ts. Prevents unhandled promise rejections if telemetry fails. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 094cfe1 commit 39aaac0

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

packages/web/src/features/mcp/server.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { captureEvent } from '@/lib/posthog';
66
import { isServiceError } from '@/lib/utils';
77
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
88
import { ChatVisibility } from '@sourcebot/db';
9-
import { SOURCEBOT_VERSION } from '@sourcebot/shared';
9+
import { createLogger, SOURCEBOT_VERSION } from '@sourcebot/shared';
1010
import _dedent from 'dedent';
1111
import { z } from 'zod';
1212
import { getConfiguredLanguageModelsInfo } from "../chat/utils.server";
@@ -24,6 +24,7 @@ import {
2424
} from '../tools';
2525

2626
const dedent = _dedent.withOptions({ alignValues: true });
27+
const logger = createLogger('mcp-server');
2728

2829
export async function createMcpServer(): Promise<McpServer> {
2930
const server = new McpServer({
@@ -62,6 +63,8 @@ export async function createMcpServer(): Promise<McpServer> {
6263
toolName: 'list_language_models',
6364
source: 'sourcebot-mcp-server',
6465
success: true,
66+
}).catch((error) => {
67+
logger.warn('Failed to capture tool_used event:', error);
6568
});
6669
return { content: [{ type: "text", text: JSON.stringify(models) }] };
6770
}
@@ -111,6 +114,8 @@ export async function createMcpServer(): Promise<McpServer> {
111114
toolName: 'ask_codebase',
112115
source: 'sourcebot-mcp-server',
113116
success: false,
117+
}).catch((error) => {
118+
logger.warn('Failed to capture tool_used event:', error);
114119
});
115120
return {
116121
content: [{ type: "text", text: `Failed to ask codebase: ${result.message}` }],
@@ -121,6 +126,8 @@ export async function createMcpServer(): Promise<McpServer> {
121126
toolName: 'ask_codebase',
122127
source: 'sourcebot-mcp-server',
123128
success: true,
129+
}).catch((error) => {
130+
logger.warn('Failed to capture tool_used event:', error);
124131
});
125132

126133
const formattedResponse = dedent`

packages/web/src/features/tools/adapters.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
33
import { z } from "zod";
44
import { captureEvent } from "@/lib/posthog";
55
import { ToolContext, ToolDefinition } from "./types";
6+
import { logger } from "./logger";
67

78
export function toVercelAITool<TName extends string, TShape extends z.ZodRawShape, TMetadata>(
89
def: ToolDefinition<TName, TShape, TMetadata>,
@@ -24,6 +25,8 @@ export function toVercelAITool<TName extends string, TShape extends z.ZodRawShap
2425
toolName: def.name,
2526
source: context.source ?? 'unknown',
2627
success,
28+
}).catch((error) => {
29+
logger.warn(`Failed to capture tool_used event for ${def.name}:`, error);
2730
});
2831
}
2932
},
@@ -60,13 +63,17 @@ export function registerMcpTool<TName extends string, TShape extends z.ZodRawSha
6063
toolName: def.name,
6164
source: context.source ?? 'unknown',
6265
success: true,
66+
}).catch((error) => {
67+
logger.warn(`Failed to capture tool_used event for ${def.name}:`, error);
6368
});
6469
return { content: [{ type: "text" as const, text: result.output }] };
6570
} catch (error) {
6671
captureEvent('tool_used', {
6772
toolName: def.name,
6873
source: context.source ?? 'unknown',
6974
success: false,
75+
}).catch((error) => {
76+
logger.warn(`Failed to capture tool_used event for ${def.name}:`, error);
7077
});
7178
const message = error instanceof Error ? error.message : String(error);
7279
return { content: [{ type: "text" as const, text: `Tool "${def.name}" failed: ${message}` }], isError: true };

0 commit comments

Comments
 (0)