Skip to content

Commit 83e0339

Browse files
authored
feat: add structured error tracking with stack trace parsing (#11)
1 parent 5e36d5f commit 83e0339

File tree

9 files changed

+1978
-20
lines changed

9 files changed

+1978
-20
lines changed

src/modules/exceptions.ts

Lines changed: 709 additions & 0 deletions
Large diffs are not rendered by default.

src/modules/exporters/sentry.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -411,8 +411,6 @@ export class SentryExporter implements Exporter {
411411
} else if (typeof event.error === "object" && event.error !== null) {
412412
if ("message" in event.error) {
413413
errorMessage = String(event.error.message);
414-
} else if ("error" in event.error) {
415-
errorMessage = String(event.error.error);
416414
} else {
417415
errorMessage = JSON.stringify(event.error);
418416
}

src/modules/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export * from "./compatibility.js";
22
export * from "./context-parameters.js";
3+
export * from "./exceptions.js";
34
export * from "./internal.js";
45
export * from "./logging.js";
56
export * from "./session.js";

src/modules/internal.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import {
77
} from "../types.js";
88
import { PublishEventRequestEventTypeEnum } from "mcpcat-api";
99
import { publishEvent } from "./eventQueue.js";
10-
import { getMCPCompatibleErrorMessage } from "./compatibility.js";
1110
import { writeToLog } from "./logging.js";
1211
import { INACTIVITY_TIMEOUT_IN_MINUTES } from "./constants.js";
12+
import { captureException } from "./exceptions.js";
1313

1414
/**
1515
* Simple LRU cache for session identities.
@@ -325,9 +325,7 @@ export async function handleIdentify(
325325
new Date().getTime() - identifyEvent.timestamp.getTime()) ||
326326
undefined;
327327
identifyEvent.isError = true;
328-
identifyEvent.error = {
329-
message: getMCPCompatibleErrorMessage(error),
330-
};
328+
identifyEvent.error = captureException(error);
331329
publishEvent(server, identifyEvent);
332330
}
333331
}

src/modules/tracing.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { getServerSessionId } from "./session.js";
1616
import { PublishEventRequestEventTypeEnum } from "mcpcat-api";
1717
import { publishEvent } from "./eventQueue.js";
1818
import { getMCPCompatibleErrorMessage } from "./compatibility.js";
19+
import { captureException } from "./exceptions.js";
1920

2021
function isToolResultError(result: any): boolean {
2122
return result && typeof result === "object" && result.isError === true;
@@ -269,19 +270,15 @@ export function setupToolCallTracing(server: MCPServerLike): void {
269270
// Check if the result indicates an error
270271
if (isToolResultError(result)) {
271272
event.isError = true;
272-
event.error = {
273-
message: getMCPCompatibleErrorMessage(result),
274-
};
273+
event.error = captureException(result);
275274
}
276275

277276
event.response = result;
278277
publishEvent(server, event);
279278
return result;
280279
} catch (error) {
281280
event.isError = true;
282-
event.error = {
283-
message: getMCPCompatibleErrorMessage(error),
284-
};
281+
event.error = captureException(error);
285282
publishEvent(server, event);
286283
throw error;
287284
}

src/modules/tracingV2.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ import { getServerTrackingData, handleIdentify } from "./internal.js";
1212
import { getServerSessionId } from "./session.js";
1313
import { PublishEventRequestEventTypeEnum } from "mcpcat-api";
1414
import { publishEvent } from "./eventQueue.js";
15-
import { getMCPCompatibleErrorMessage } from "./compatibility.js";
1615
import { addContextParameterToTool } from "./context-parameters.js";
1716
import { handleReportMissing } from "./tools.js";
1817
import { setupInitializeTracing, setupListToolsTracing } from "./tracing.js";
18+
import { captureException } from "./exceptions.js";
1919

2020
// WeakMap to track which callbacks have already been wrapped
2121
const wrappedCallbacks = new WeakMap<Function, boolean>();
@@ -359,9 +359,7 @@ function addTracingToToolCallback(
359359
// Check if the result indicates an error
360360
if (isToolResultError(result)) {
361361
event.isError = true;
362-
event.error = {
363-
message: getMCPCompatibleErrorMessage(result),
364-
};
362+
event.error = captureException(result);
365363
}
366364

367365
event.response = result;
@@ -373,9 +371,7 @@ function addTracingToToolCallback(
373371
return result;
374372
} catch (error) {
375373
event.isError = true;
376-
event.error = {
377-
message: getMCPCompatibleErrorMessage(error),
378-
};
374+
event.error = captureException(error);
379375
event.duration =
380376
(event.timestamp &&
381377
new Date().getTime() - event.timestamp.getTime()) ||

0 commit comments

Comments
 (0)