@posthog/mcp 0.10.5 → 0.10.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/extensions/capture.d.ts +2 -2
  2. package/dist/extensions/capture.d.ts.map +1 -1
  3. package/dist/extensions/capture.js +2 -2
  4. package/dist/extensions/capture.mjs +2 -2
  5. package/dist/extensions/context-parameters.d.ts.map +1 -1
  6. package/dist/extensions/context-parameters.js +1 -4
  7. package/dist/extensions/context-parameters.mjs +1 -4
  8. package/dist/extensions/conversation-id.d.ts +1 -1
  9. package/dist/extensions/conversation-id.d.ts.map +1 -1
  10. package/dist/extensions/conversation-id.js +2 -2
  11. package/dist/extensions/conversation-id.mjs +2 -2
  12. package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
  13. package/dist/extensions/instrument-highlevel.js +5 -5
  14. package/dist/extensions/instrument-highlevel.mjs +6 -6
  15. package/dist/extensions/instrument-lowlevel.d.ts.map +1 -1
  16. package/dist/extensions/instrument-lowlevel.js +9 -4
  17. package/dist/extensions/instrument-lowlevel.mjs +10 -5
  18. package/dist/extensions/instrumentation.d.ts +6 -6
  19. package/dist/extensions/instrumentation.d.ts.map +1 -1
  20. package/dist/extensions/instrumentation.js +112 -42
  21. package/dist/extensions/instrumentation.mjs +110 -43
  22. package/dist/extensions/intent.d.ts.map +1 -1
  23. package/dist/extensions/intent.js +1 -1
  24. package/dist/extensions/intent.mjs +1 -1
  25. package/dist/extensions/internal.d.ts +3 -2
  26. package/dist/extensions/internal.d.ts.map +1 -1
  27. package/dist/extensions/internal.js +25 -9
  28. package/dist/extensions/internal.mjs +19 -6
  29. package/dist/extensions/session.js +3 -1
  30. package/dist/extensions/session.mjs +3 -1
  31. package/dist/version.d.ts +1 -1
  32. package/dist/version.js +1 -1
  33. package/dist/version.mjs +1 -1
  34. package/package.json +2 -2
  35. package/src/extensions/capture.ts +13 -6
  36. package/src/extensions/context-parameters.ts +1 -7
  37. package/src/extensions/conversation-id.ts +2 -1
  38. package/src/extensions/instrument-highlevel.ts +8 -13
  39. package/src/extensions/instrument-lowlevel.ts +17 -6
  40. package/src/extensions/instrumentation.ts +166 -51
  41. package/src/extensions/intent.ts +1 -6
  42. package/src/extensions/internal.ts +21 -6
  43. package/src/extensions/session.ts +1 -1
  44. package/src/version.ts +1 -1
@@ -1,4 +1,4 @@
1
- import type { MCPServerLike, McpEvent } from '../types';
1
+ import type { MCPServerLike, McpEvent, SessionInfo } from '../types';
2
2
  import type { LoggerFn } from './logger';
3
3
  /**
4
4
  * Materializes an `McpEvent` against the server's tracking data + session info,
@@ -10,5 +10,5 @@ import type { LoggerFn } from './logger';
10
10
  * Auto-capture callers (tool calls, listings, identify) intentionally ignore the
11
11
  * return value, keeping the tool path isolated from analytics latency/errors.
12
12
  */
13
- export declare function captureEvent(server: MCPServerLike, eventInput: McpEvent, logger: LoggerFn): Promise<void> | undefined;
13
+ export declare function captureEvent(server: MCPServerLike, eventInput: McpEvent, logger: LoggerFn, requestAttribution?: SessionInfo): Promise<void> | undefined;
14
14
  //# sourceMappingURL=capture.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/extensions/capture.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAGvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAGxC;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAkErH"}
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/extensions/capture.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAGpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAGxC;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,QAAQ,EACpB,MAAM,EAAE,QAAQ,EAChB,kBAAkB,CAAC,EAAE,WAAW,GAC/B,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAoE3B"}
@@ -29,12 +29,12 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  const external_event_types_js_namespaceObject = require("./event-types.js");
30
30
  const external_internal_js_namespaceObject = require("./internal.js");
31
31
  const external_session_js_namespaceObject = require("./session.js");
32
- function captureEvent(server, eventInput, logger) {
32
+ function captureEvent(server, eventInput, logger, requestAttribution) {
33
33
  const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
34
34
  if (!data) return void logger('Warning: Server tracking data not found. Event will not be published.');
35
35
  const sink = data.sink;
36
36
  if (!sink) return;
37
- const sessionInfo = (0, external_session_js_namespaceObject.getSessionInfo)(server, data, eventInput.sessionId);
37
+ const sessionInfo = requestAttribution ?? (0, external_session_js_namespaceObject.getSessionInfo)(server, data, eventInput.sessionId);
38
38
  const duration = eventInput.duration || (eventInput.timestamp ? Date.now() - eventInput.timestamp.getTime() : void 0);
39
39
  const fullEvent = {
40
40
  id: eventInput.id || '',
@@ -1,12 +1,12 @@
1
1
  import { MCPAnalyticsEventType } from "./event-types.mjs";
2
2
  import { getServerTrackingData } from "./internal.mjs";
3
3
  import { getSessionInfo } from "./session.mjs";
4
- function captureEvent(server, eventInput, logger) {
4
+ function captureEvent(server, eventInput, logger, requestAttribution) {
5
5
  const data = getServerTrackingData(server);
6
6
  if (!data) return void logger('Warning: Server tracking data not found. Event will not be published.');
7
7
  const sink = data.sink;
8
8
  if (!sink) return;
9
- const sessionInfo = getSessionInfo(server, data, eventInput.sessionId);
9
+ const sessionInfo = requestAttribution ?? getSessionInfo(server, data, eventInput.sessionId);
10
10
  const duration = eventInput.duration || (eventInput.timestamp ? Date.now() - eventInput.timestamp.getTime() : void 0);
11
11
  const fullEvent = {
12
12
  id: eventInput.id || '',
@@ -1 +1 @@
1
- {"version":3,"file":"context-parameters.d.ts","sourceRoot":"","sources":["../../src/extensions/context-parameters.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE7C,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,6BAA6B,CAAA;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,GAAG,OAAO,CAEjF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAEjG;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,SAAS,qBAAqB,EAC3E,IAAI,EAAE,KAAK,EACX,0BAA0B,CAAC,EAAE,MAAM,EACnC,MAAM,GAAE,QAAc,GACrB,KAAK,CA6DP;AAED,wBAAgB,0BAA0B,CAAC,KAAK,SAAS,qBAAqB,EAC5E,KAAK,EAAE,KAAK,EAAE,EACd,0BAA0B,CAAC,EAAE,MAAM,EACnC,MAAM,GAAE,QAAc,GACrB,KAAK,EAAE,CAQT"}
1
+ {"version":3,"file":"context-parameters.d.ts","sourceRoot":"","sources":["../../src/extensions/context-parameters.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE7C,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,6BAA6B,CAAA;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,GAAG,OAAO,CAEjF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAEjG;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,SAAS,qBAAqB,EAC3E,IAAI,EAAE,KAAK,EACX,0BAA0B,CAAC,EAAE,MAAM,EACnC,MAAM,GAAE,QAAc,GACrB,KAAK,CA6DP;AAED,wBAAgB,0BAA0B,CAAC,KAAK,SAAS,qBAAqB,EAC5E,KAAK,EAAE,KAAK,EAAE,EACd,0BAA0B,CAAC,EAAE,MAAM,EACnC,MAAM,GAAE,QAAc,GACrB,KAAK,EAAE,CAET"}
@@ -70,10 +70,7 @@ function addContextParameterToTool(tool, contextDescriptionOverride, logger = ex
70
70
  return modifiedTool;
71
71
  }
72
72
  function addContextParameterToTools(tools, contextDescriptionOverride, logger = external_logger_js_namespaceObject.log) {
73
- return tools.map((tool)=>{
74
- if ('get_more_tools' === tool.name) return tool;
75
- return addContextParameterToTool(tool, contextDescriptionOverride, logger);
76
- });
73
+ return tools.map((tool)=>addContextParameterToTool(tool, contextDescriptionOverride, logger));
77
74
  }
78
75
  exports.addContextParameterToTool = __webpack_exports__.addContextParameterToTool;
79
76
  exports.addContextParameterToTools = __webpack_exports__.addContextParameterToTools;
@@ -39,9 +39,6 @@ function addContextParameterToTool(tool, contextDescriptionOverride, logger = lo
39
39
  return modifiedTool;
40
40
  }
41
41
  function addContextParameterToTools(tools, contextDescriptionOverride, logger = log) {
42
- return tools.map((tool)=>{
43
- if ('get_more_tools' === tool.name) return tool;
44
- return addContextParameterToTool(tool, contextDescriptionOverride, logger);
45
- });
42
+ return tools.map((tool)=>addContextParameterToTool(tool, contextDescriptionOverride, logger));
46
43
  }
47
44
  export { addContextParameterToTool, addContextParameterToTools, getContextDescription, isContextEnabled };
@@ -7,7 +7,7 @@ export interface ConversationIdInjectableTool {
7
7
  [key: string]: unknown;
8
8
  }
9
9
  export declare function addConversationIdToTool<TTool extends ConversationIdInjectableTool>(tool: TTool, logger?: LoggerFn): TTool;
10
- export declare function addConversationIdToTools<TTool extends ConversationIdInjectableTool>(tools: TTool[], missingCapabilityToolName?: string, logger?: LoggerFn): TTool[];
10
+ export declare function addConversationIdToTools<TTool extends ConversationIdInjectableTool>(tools: TTool[], missingCapabilityToolName?: string, skipMissingCapabilityTool?: boolean, logger?: LoggerFn): TTool[];
11
11
  export type ConversationIdResolution = {
12
12
  minted: false;
13
13
  conversationId: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-id.d.ts","sourceRoot":"","sources":["../../src/extensions/conversation-id.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAG7C,eAAO,MAAM,0BAA0B,oBAAoB,CAAA;AAE3D,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,6BAA6B,CAAA;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,SAAS,4BAA4B,EAChF,IAAI,EAAE,KAAK,EACX,MAAM,GAAE,QAAc,GACrB,KAAK,CA4CP;AAED,wBAAgB,wBAAwB,CAAC,KAAK,SAAS,4BAA4B,EACjF,KAAK,EAAE,KAAK,EAAE,EACd,yBAAyB,GAAE,MAA4B,EACvD,MAAM,GAAE,QAAc,GACrB,KAAK,EAAE,CAOT;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACrD;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,yBAAyB,GAAE,MAA4B,GACtD,wBAAwB,CAS1B;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAS1E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAUvE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAM1D;AAED,wBAAgB,6BAA6B,CAAC,cAAc,EAAE,MAAM,GAAG;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAKA;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAS/F"}
1
+ {"version":3,"file":"conversation-id.d.ts","sourceRoot":"","sources":["../../src/extensions/conversation-id.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAG7C,eAAO,MAAM,0BAA0B,oBAAoB,CAAA;AAE3D,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,6BAA6B,CAAA;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,SAAS,4BAA4B,EAChF,IAAI,EAAE,KAAK,EACX,MAAM,GAAE,QAAc,GACrB,KAAK,CA4CP;AAED,wBAAgB,wBAAwB,CAAC,KAAK,SAAS,4BAA4B,EACjF,KAAK,EAAE,KAAK,EAAE,EACd,yBAAyB,GAAE,MAA4B,EACvD,yBAAyB,UAAO,EAChC,MAAM,GAAE,QAAc,GACrB,KAAK,EAAE,CAOT;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACrD;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,yBAAyB,GAAE,MAA4B,GACtD,wBAAwB,CAS1B;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAS1E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAUvE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAM1D;AAED,wBAAgB,6BAA6B,CAAC,cAAc,EAAE,MAAM,GAAG;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAKA;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAS/F"}
@@ -65,9 +65,9 @@ function addConversationIdToTool(tool, logger = external_logger_js_namespaceObje
65
65
  };
66
66
  return modifiedTool;
67
67
  }
68
- function addConversationIdToTools(tools, missingCapabilityToolName = external_tools_js_namespaceObject.GET_MORE_TOOLS_NAME, logger = external_logger_js_namespaceObject.log) {
68
+ function addConversationIdToTools(tools, missingCapabilityToolName = external_tools_js_namespaceObject.GET_MORE_TOOLS_NAME, skipMissingCapabilityTool = true, logger = external_logger_js_namespaceObject.log) {
69
69
  return tools.map((tool)=>{
70
- if (tool.name === missingCapabilityToolName) return tool;
70
+ if (skipMissingCapabilityTool && tool.name === missingCapabilityToolName) return tool;
71
71
  return addConversationIdToTool(tool, logger);
72
72
  });
73
73
  }
@@ -29,9 +29,9 @@ function addConversationIdToTool(tool, logger = log) {
29
29
  };
30
30
  return modifiedTool;
31
31
  }
32
- function addConversationIdToTools(tools, missingCapabilityToolName = GET_MORE_TOOLS_NAME, logger = log) {
32
+ function addConversationIdToTools(tools, missingCapabilityToolName = GET_MORE_TOOLS_NAME, skipMissingCapabilityTool = true, logger = log) {
33
33
  return tools.map((tool)=>{
34
- if (tool.name === missingCapabilityToolName) return tool;
34
+ if (skipMissingCapabilityTool && tool.name === missingCapabilityToolName) return tool;
35
35
  return addConversationIdToTool(tool, logger);
36
36
  });
37
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"instrument-highlevel.d.ts","sourceRoot":"","sources":["../../src/extensions/instrument-highlevel.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,sBAAsB,EAIvB,MAAM,UAAU,CAAA;AASjB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAmQxC,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CA2BhG"}
1
+ {"version":3,"file":"instrument-highlevel.d.ts","sourceRoot":"","sources":["../../src/extensions/instrument-highlevel.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,sBAAsB,EAIvB,MAAM,UAAU,CAAA;AASjB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AA8PxC,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CA2BhG"}
@@ -107,7 +107,6 @@ function setupListenerToRegisteredTools(server, logger) {
107
107
  function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInputSchema, logger) {
108
108
  const originalCallback = (0, external_mcp_sdk_compat_js_namespaceObject.getToolFunction)(tool);
109
109
  const options = (0, external_internal_js_namespaceObject.getServerTrackingData)(server.server)?.options;
110
- const missingToolName = (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(options);
111
110
  if (wrappedCallbacks.has(originalCallback)) {
112
111
  logger(`Tool ${toolName} callback already wrapped, skipping re-wrap`);
113
112
  return tool;
@@ -128,8 +127,8 @@ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInpu
128
127
  }
129
128
  const inputSchema = getCurrentInputSchema();
130
129
  const cleanedArgs = (0, external_analytics_parameters_js_namespaceObject.stripOwnedAnalyticsArguments)(args, {
131
- context: toolName !== missingToolName && (0, external_context_parameters_js_namespaceObject.isContextEnabled)(options?.context) && (0, external_analytics_parameters_js_namespaceObject.analyticsOwnsParameter)(inputSchema, 'context'),
132
- conversationId: toolName !== missingToolName && options?.enableConversationId === true && (0, external_analytics_parameters_js_namespaceObject.analyticsOwnsParameter)(inputSchema, 'conversation_id')
130
+ context: (0, external_context_parameters_js_namespaceObject.isContextEnabled)(options?.context) && (0, external_analytics_parameters_js_namespaceObject.analyticsOwnsParameter)(inputSchema, 'context'),
131
+ conversationId: options?.enableConversationId === true && (0, external_analytics_parameters_js_namespaceObject.analyticsOwnsParameter)(inputSchema, 'conversation_id')
133
132
  });
134
133
  try {
135
134
  if (void 0 === cleanedArgs) {
@@ -155,7 +154,9 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
155
154
  logger('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
156
155
  return await originalCallToolHandler(request, extra);
157
156
  }
158
- if (request.params?.name === (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options)) {
157
+ const toolName = request.params?.name;
158
+ const isMissingCapabilityCandidate = data.options.reportMissing && toolName === (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options);
159
+ if (isMissingCapabilityCandidate && await (0, external_instrumentation_js_namespaceObject.isToolAdvertised)(server, toolName, extra, data.logger) === false) {
159
160
  const context = (0, external_tracing_helpers_js_namespaceObject.getContextArgument)(request) || '';
160
161
  return await (0, external_instrumentation_js_namespaceObject.captureToolCall)({
161
162
  server,
@@ -169,7 +170,6 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
169
170
  }, data.logger)
170
171
  });
171
172
  }
172
- const toolName = request.params?.name;
173
173
  const registeredTool = toolName ? highLevelServer._registeredTools[toolName] : void 0;
174
174
  return await (0, external_instrumentation_js_namespaceObject.captureToolCall)({
175
175
  server,
@@ -4,7 +4,7 @@ import { MCPAnalyticsEventType } from "./event-types.mjs";
4
4
  import { getServerTrackingData } from "./internal.mjs";
5
5
  import { createWrappedTool, getToolFunction, hasToolFunction } from "./mcp-sdk-compat.mjs";
6
6
  import { handleReportMissing, resolveMissingCapabilityToolName } from "./tools.mjs";
7
- import { captureToolCall, handleInitializeRequest, handleListToolsRequest, patchRequestHandlers, readToolMetaCategory } from "./instrumentation.mjs";
7
+ import { captureToolCall, handleInitializeRequest, handleListToolsRequest, isToolAdvertised, patchRequestHandlers, readToolMetaCategory } from "./instrumentation.mjs";
8
8
  import { getContextArgument } from "./tracing-helpers.mjs";
9
9
  const wrappedCallbacks = new WeakMap();
10
10
  const MCP_ANALYTICS_PROCESSED = Symbol('__posthog_mcp_analytics_processed__');
@@ -79,7 +79,6 @@ function setupListenerToRegisteredTools(server, logger) {
79
79
  function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInputSchema, logger) {
80
80
  const originalCallback = getToolFunction(tool);
81
81
  const options = getServerTrackingData(server.server)?.options;
82
- const missingToolName = resolveMissingCapabilityToolName(options);
83
82
  if (wrappedCallbacks.has(originalCallback)) {
84
83
  logger(`Tool ${toolName} callback already wrapped, skipping re-wrap`);
85
84
  return tool;
@@ -100,8 +99,8 @@ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInpu
100
99
  }
101
100
  const inputSchema = getCurrentInputSchema();
102
101
  const cleanedArgs = stripOwnedAnalyticsArguments(args, {
103
- context: toolName !== missingToolName && isContextEnabled(options?.context) && analyticsOwnsParameter(inputSchema, 'context'),
104
- conversationId: toolName !== missingToolName && options?.enableConversationId === true && analyticsOwnsParameter(inputSchema, 'conversation_id')
102
+ context: isContextEnabled(options?.context) && analyticsOwnsParameter(inputSchema, 'context'),
103
+ conversationId: options?.enableConversationId === true && analyticsOwnsParameter(inputSchema, 'conversation_id')
105
104
  });
106
105
  try {
107
106
  if (void 0 === cleanedArgs) {
@@ -127,7 +126,9 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
127
126
  logger('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
128
127
  return await originalCallToolHandler(request, extra);
129
128
  }
130
- if (request.params?.name === resolveMissingCapabilityToolName(data.options)) {
129
+ const toolName = request.params?.name;
130
+ const isMissingCapabilityCandidate = data.options.reportMissing && toolName === resolveMissingCapabilityToolName(data.options);
131
+ if (isMissingCapabilityCandidate && await isToolAdvertised(server, toolName, extra, data.logger) === false) {
131
132
  const context = getContextArgument(request) || '';
132
133
  return await captureToolCall({
133
134
  server,
@@ -141,7 +142,6 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
141
142
  }, data.logger)
142
143
  });
143
144
  }
144
- const toolName = request.params?.name;
145
145
  const registeredTool = toolName ? highLevelServer._registeredTools[toolName] : void 0;
146
146
  return await captureToolCall({
147
147
  server,
@@ -1 +1 @@
1
- {"version":3,"file":"instrument-lowlevel.d.ts","sourceRoot":"","sources":["../../src/extensions/instrument-lowlevel.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAiD,aAAa,EAAE,MAAM,UAAU,CAAA;AAG5F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAiBxC;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CAoBtF"}
1
+ {"version":3,"file":"instrument-lowlevel.d.ts","sourceRoot":"","sources":["../../src/extensions/instrument-lowlevel.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAiD,aAAa,EAAE,MAAM,UAAU,CAAA;AAG5F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAkBxC;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CA0BtF"}
@@ -34,13 +34,16 @@ const external_instrumentation_js_namespaceObject = require("./instrumentation.j
34
34
  const external_tracing_helpers_js_namespaceObject = require("./tracing-helpers.js");
35
35
  function instrumentLowLevelServer(server, logger) {
36
36
  try {
37
+ const hadCallToolHandler = server._requestHandlers.has('tools/call');
37
38
  const handlers = {
38
39
  initialize: (server, originalHandler, request, extra)=>(0, external_instrumentation_js_namespaceObject.handleInitializeRequest)(server, originalHandler, request, extra, logger),
39
- 'tools/list': (server, originalHandler, request, extra)=>(0, external_instrumentation_js_namespaceObject.handleListToolsRequest)(server, originalHandler, request, extra, logger)
40
+ 'tools/list': (server, originalHandler, request, extra)=>(0, external_instrumentation_js_namespaceObject.handleListToolsRequest)(server, originalHandler, request, extra, logger),
41
+ 'tools/call': (server, originalHandler, request, extra)=>handleToolCallRequest(server, originalHandler, request, extra, logger)
40
42
  };
41
43
  (0, external_instrumentation_js_namespaceObject.patchRequestHandlers)(server, handlers);
42
- const originalCallToolHandler = server._requestHandlers.get('tools/call');
43
- server.setRequestHandler(types_js_namespaceObject.CallToolRequestSchema, async (request, extra)=>await handleToolCallRequest(server, originalCallToolHandler, request, extra, logger));
44
+ if (!hadCallToolHandler) server.setRequestHandler(types_js_namespaceObject.CallToolRequestSchema, async (request)=>{
45
+ throw new Error(`Unknown tool: ${request.params?.name || 'unknown'}`);
46
+ });
44
47
  } catch (error) {
45
48
  logger(`Warning: Failed to setup tool call instrumentation - ${error}`);
46
49
  throw error;
@@ -52,7 +55,9 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
52
55
  logger('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
53
56
  return await originalCallToolHandler?.(request, extra);
54
57
  }
55
- if (request.params?.name === (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options)) {
58
+ const toolName = request.params?.name;
59
+ const isMissingCapabilityCandidate = data.options.reportMissing && toolName === (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options);
60
+ if (isMissingCapabilityCandidate && await (0, external_instrumentation_js_namespaceObject.isToolAdvertised)(server, toolName, extra, data.logger) === false) {
56
61
  const context = (0, external_tracing_helpers_js_namespaceObject.getContextArgument)(request) || '';
57
62
  return await (0, external_instrumentation_js_namespaceObject.captureToolCall)({
58
63
  server,
@@ -2,17 +2,20 @@ import { CallToolRequestSchema } from "@modelcontextprotocol/sdk/types.js";
2
2
  import { MCPAnalyticsEventType } from "./event-types.mjs";
3
3
  import { getServerTrackingData } from "./internal.mjs";
4
4
  import { handleReportMissing, resolveMissingCapabilityToolName } from "./tools.mjs";
5
- import { captureToolCall, handleInitializeRequest, handleListToolsRequest, patchRequestHandlers } from "./instrumentation.mjs";
5
+ import { captureToolCall, handleInitializeRequest, handleListToolsRequest, isToolAdvertised, patchRequestHandlers } from "./instrumentation.mjs";
6
6
  import { getContextArgument } from "./tracing-helpers.mjs";
7
7
  function instrumentLowLevelServer(server, logger) {
8
8
  try {
9
+ const hadCallToolHandler = server._requestHandlers.has('tools/call');
9
10
  const handlers = {
10
11
  initialize: (server, originalHandler, request, extra)=>handleInitializeRequest(server, originalHandler, request, extra, logger),
11
- 'tools/list': (server, originalHandler, request, extra)=>handleListToolsRequest(server, originalHandler, request, extra, logger)
12
+ 'tools/list': (server, originalHandler, request, extra)=>handleListToolsRequest(server, originalHandler, request, extra, logger),
13
+ 'tools/call': (server, originalHandler, request, extra)=>handleToolCallRequest(server, originalHandler, request, extra, logger)
12
14
  };
13
15
  patchRequestHandlers(server, handlers);
14
- const originalCallToolHandler = server._requestHandlers.get('tools/call');
15
- server.setRequestHandler(CallToolRequestSchema, async (request, extra)=>await handleToolCallRequest(server, originalCallToolHandler, request, extra, logger));
16
+ if (!hadCallToolHandler) server.setRequestHandler(CallToolRequestSchema, async (request)=>{
17
+ throw new Error(`Unknown tool: ${request.params?.name || 'unknown'}`);
18
+ });
16
19
  } catch (error) {
17
20
  logger(`Warning: Failed to setup tool call instrumentation - ${error}`);
18
21
  throw error;
@@ -24,7 +27,9 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
24
27
  logger('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
25
28
  return await originalCallToolHandler?.(request, extra);
26
29
  }
27
- if (request.params?.name === resolveMissingCapabilityToolName(data.options)) {
30
+ const toolName = request.params?.name;
31
+ const isMissingCapabilityCandidate = data.options.reportMissing && toolName === resolveMissingCapabilityToolName(data.options);
32
+ if (isMissingCapabilityCandidate && await isToolAdvertised(server, toolName, extra, data.logger) === false) {
28
33
  const context = getContextArgument(request) || '';
29
34
  return await captureToolCall({
30
35
  server,
@@ -55,14 +55,14 @@ export declare function captureToolCall(params: TraceToolCallParams): Promise<un
55
55
  * supplies `request` and `extra` per call.
56
56
  */
57
57
  export type HandlerPatch = (server: MCPServerLike, originalHandler: MCPRequestHandler, request: MCPRequestLike, extra: CompatibleRequestHandlerExtra | undefined) => Promise<unknown>;
58
+ export declare function patchRequestHandlers(server: MCPServerLike, patches: Record<string, HandlerPatch>): void;
58
59
  /**
59
- * Applies the `patches` (keyed by method, e.g. `initialize`, `tools/list`) to the
60
- * handlers already registered, and patches `setRequestHandler` so matching
61
- * handlers registered later are patched too. The latter is what makes adapters
62
- * that register handlers post-construction work — e.g. `@rekog/mcp-nest` hands a
63
- * bare server to instrument() and only then registers its handlers.
60
+ * Checks the server's raw listing for a real owner of a candidate virtual tool.
61
+ * This does not depend on a previous client request and does not call the
62
+ * instrumented list wrapper, so it neither injects PostHog tools nor captures a
63
+ * synthetic tools/list event. `undefined` fails open to the real dispatcher.
64
64
  */
65
- export declare function patchRequestHandlers(server: MCPServerLike, patches: Record<string, HandlerPatch>): void;
65
+ export declare function isToolAdvertised(server: MCPServerLike, toolName: string, extra: CompatibleRequestHandlerExtra | undefined, logger: LoggerFn): Promise<boolean | undefined>;
66
66
  /**
67
67
  * Captures each `tools/list` and injects the SDK-managed tools (context
68
68
  * parameter, conversation id, `get_more_tools`) into the returned list.
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,KAAK,EACV,2BAA2B,EAC3B,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,EACd,aAAa,EAGd,MAAM,UAAU,CAAA;AAYjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAIrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAQxC;;;;;;GAMG;AAEH,KAAK,iBAAiB,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,6BAA6B,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAE7G,2EAA2E;AAC3E,KAAK,YAAY,GAAG,CAAC,iBAAiB,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAE3E,UAAU,mBAAmB;IAC3B,MAAM,EAAE,aAAa,CAAA;IACrB,IAAI,EAAE,gBAAgB,CAAA;IACtB,OAAO,EAAE,cAAc,CAAA;IACvB,KAAK,CAAC,EAAE,6BAA6B,CAAA;IACrC,OAAO,EAAE,YAAY,CAAA;IACrB,2FAA2F;IAC3F,kBAAkB,CAAC,EAAE,2BAA2B,CAAA;IAChD;;;;OAIG;IACH,SAAS,CAAC,EAAE,qBAAqB,CAAA;IACjC;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAA;CAClC;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAmDnF;AAuJD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,MAAM,EAAE,aAAa,EACrB,eAAe,EAAE,iBAAiB,EAClC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,6BAA6B,GAAG,SAAS,KAC7C,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAqBvG;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,aAAa,EACrB,wBAAwB,EAAE,iBAAiB,EAC3C,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,6BAA6B,GAAG,SAAS,EAChD,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAyC9C;AAyED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CASnH;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGtE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAUjH;AA8GD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,aAAa,EACrB,yBAAyB,EAAE,iBAAiB,EAC5C,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,6BAA6B,GAAG,SAAS,EAChD,MAAM,EAAE,QAAQ,GACf,OAAO,CAAC,OAAO,CAAC,CA0ClB"}
1
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"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"}