@posthog/mcp 0.10.4 → 0.10.6

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 (70) hide show
  1. package/dist/extensions/capture.d.ts +2 -1
  2. package/dist/extensions/capture.d.ts.map +1 -1
  3. package/dist/extensions/capture.js +2 -3
  4. package/dist/extensions/capture.mjs +2 -3
  5. package/dist/extensions/compatibility.d.ts +3 -2
  6. package/dist/extensions/compatibility.d.ts.map +1 -1
  7. package/dist/extensions/compatibility.js +19 -20
  8. package/dist/extensions/compatibility.mjs +15 -16
  9. package/dist/extensions/context-parameters.d.ts +3 -2
  10. package/dist/extensions/context-parameters.d.ts.map +1 -1
  11. package/dist/extensions/context-parameters.js +4 -8
  12. package/dist/extensions/context-parameters.mjs +4 -7
  13. package/dist/extensions/conversation-id.d.ts +3 -2
  14. package/dist/extensions/conversation-id.d.ts.map +1 -1
  15. package/dist/extensions/conversation-id.js +5 -6
  16. package/dist/extensions/conversation-id.mjs +5 -5
  17. package/dist/extensions/instrument-highlevel.d.ts +2 -1
  18. package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
  19. package/dist/extensions/instrument-highlevel.js +29 -30
  20. package/dist/extensions/instrument-highlevel.mjs +30 -31
  21. package/dist/extensions/instrument-lowlevel.d.ts +2 -1
  22. package/dist/extensions/instrument-lowlevel.d.ts.map +1 -1
  23. package/dist/extensions/instrument-lowlevel.js +15 -11
  24. package/dist/extensions/instrument-lowlevel.mjs +16 -12
  25. package/dist/extensions/instrumentation.d.ts +9 -8
  26. package/dist/extensions/instrumentation.d.ts.map +1 -1
  27. package/dist/extensions/instrumentation.js +84 -40
  28. package/dist/extensions/instrumentation.mjs +80 -39
  29. package/dist/extensions/intent.d.ts.map +1 -1
  30. package/dist/extensions/intent.js +2 -3
  31. package/dist/extensions/intent.mjs +2 -3
  32. package/dist/extensions/internal.d.ts.map +1 -1
  33. package/dist/extensions/internal.js +5 -6
  34. package/dist/extensions/internal.mjs +5 -6
  35. package/dist/extensions/logger.d.ts +12 -4
  36. package/dist/extensions/logger.d.ts.map +1 -1
  37. package/dist/extensions/logger.js +12 -3
  38. package/dist/extensions/logger.mjs +10 -4
  39. package/dist/extensions/sink.d.ts +4 -2
  40. package/dist/extensions/sink.d.ts.map +1 -1
  41. package/dist/extensions/sink.js +11 -10
  42. package/dist/extensions/sink.mjs +11 -10
  43. package/dist/extensions/tools.d.ts +2 -1
  44. package/dist/extensions/tools.d.ts.map +1 -1
  45. package/dist/extensions/tools.js +2 -2
  46. package/dist/extensions/tools.mjs +2 -2
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +18 -16
  49. package/dist/index.mjs +19 -17
  50. package/dist/types.d.ts +2 -0
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/version.d.ts +1 -1
  53. package/dist/version.js +1 -1
  54. package/dist/version.mjs +1 -1
  55. package/package.json +3 -3
  56. package/src/extensions/capture.ts +3 -3
  57. package/src/extensions/compatibility.ts +16 -16
  58. package/src/extensions/context-parameters.ts +8 -12
  59. package/src/extensions/conversation-id.ts +14 -7
  60. package/src/extensions/instrument-highlevel.ts +45 -44
  61. package/src/extensions/instrument-lowlevel.ts +30 -15
  62. package/src/extensions/instrumentation.ts +119 -42
  63. package/src/extensions/intent.ts +2 -8
  64. package/src/extensions/internal.ts +7 -6
  65. package/src/extensions/logger.ts +22 -7
  66. package/src/extensions/sink.ts +17 -12
  67. package/src/extensions/tools.ts +3 -3
  68. package/src/index.ts +21 -19
  69. package/src/types.ts +2 -0
  70. package/src/version.ts +1 -1
@@ -2,41 +2,40 @@ import { analyticsOwnsParameter, getAnalyticsParameterOwnership, stripOwnedAnaly
2
2
  import { isContextEnabled } from "./context-parameters.mjs";
3
3
  import { MCPAnalyticsEventType } from "./event-types.mjs";
4
4
  import { getServerTrackingData } from "./internal.mjs";
5
- import { log } from "./logger.mjs";
6
5
  import { createWrappedTool, getToolFunction, hasToolFunction } from "./mcp-sdk-compat.mjs";
7
6
  import { handleReportMissing, resolveMissingCapabilityToolName } from "./tools.mjs";
8
- import { captureToolCall, handleInitializeRequest, handleListToolsRequest, patchRequestHandlers, readToolMetaCategory } from "./instrumentation.mjs";
7
+ import { captureToolCall, handleInitializeRequest, handleListToolsRequest, isToolAdvertised, patchRequestHandlers, readToolMetaCategory } from "./instrumentation.mjs";
9
8
  import { getContextArgument } from "./tracing-helpers.mjs";
10
9
  const wrappedCallbacks = new WeakMap();
11
10
  const MCP_ANALYTICS_PROCESSED = Symbol('__posthog_mcp_analytics_processed__');
12
11
  function isCallbackUpdate(value) {
13
12
  return !!value && 'object' == typeof value && 'callback' in value && 'function' == typeof value.callback;
14
13
  }
15
- function addTracingToToolRegistry(tools, server) {
14
+ function addTracingToToolRegistry(tools, server, logger) {
16
15
  return Object.fromEntries(Object.entries(tools).map(([name, tool])=>[
17
16
  name,
18
- addTracingToToolCallbackInternal(tool, name, server)
17
+ addTracingToToolCallbackInternal(tool, name, server, ()=>tool.inputSchema, logger)
19
18
  ]));
20
19
  }
21
- function setupListenerToRegisteredTools(server) {
20
+ function setupListenerToRegisteredTools(server, logger) {
22
21
  try {
23
22
  const data = getServerTrackingData(server.server);
24
- if (!data) return void log('Warning: Cannot setup listener - no tracking data found');
23
+ if (!data) return void logger('Warning: Cannot setup listener - no tracking data found');
25
24
  const handler = {
26
25
  set (target, property, value) {
27
26
  try {
28
27
  if ('string' == typeof property && value && 'object' == typeof value && hasToolFunction(value)) {
29
28
  if ('string' == typeof value.description) data.toolDescriptions.set(property, value.description);
30
29
  if (value[MCP_ANALYTICS_PROCESSED]) {
31
- log(`Tool ${String(property)} already processed, skipping proxy wrapping`);
30
+ logger(`Tool ${String(property)} already processed, skipping proxy wrapping`);
32
31
  return Reflect.set(target, property, value);
33
32
  }
34
33
  if (wrappedCallbacks.has(getToolFunction(value))) {
35
- log(`Tool ${String(property)} callback already wrapped, skipping proxy wrapping`);
34
+ logger(`Tool ${String(property)} callback already wrapped, skipping proxy wrapping`);
36
35
  return Reflect.set(target, property, value);
37
36
  }
38
37
  const getCurrentInputSchema = ()=>value.inputSchema;
39
- const nextValue = addTracingToToolCallbackInternal(value, property, server, getCurrentInputSchema);
38
+ const nextValue = addTracingToToolCallbackInternal(value, property, server, getCurrentInputSchema, logger);
40
39
  if ('function' == typeof nextValue.update) {
41
40
  const originalUpdate = nextValue.update;
42
41
  nextValue.update = function(...updateArgs) {
@@ -45,7 +44,7 @@ function setupListenerToRegisteredTools(server) {
45
44
  if (isCallbackUpdate(updateObj)) {
46
45
  const wrappedTool = addTracingToToolCallbackInternal({
47
46
  callback: updateObj.callback
48
- }, property, server, getCurrentInputSchema);
47
+ }, property, server, getCurrentInputSchema, logger);
49
48
  updateObj.callback = getToolFunction(wrappedTool);
50
49
  }
51
50
  }
@@ -56,7 +55,7 @@ function setupListenerToRegisteredTools(server) {
56
55
  }
57
56
  return Reflect.set(target, property, value);
58
57
  } catch (error) {
59
- log(`Warning: Error in proxy set handler for tool ${String(property)} - ${error}`);
58
+ logger(`Warning: Error in proxy set handler for tool ${String(property)} - ${error}`);
60
59
  return Reflect.set(target, property, value);
61
60
  }
62
61
  },
@@ -72,21 +71,20 @@ function setupListenerToRegisteredTools(server) {
72
71
  };
73
72
  const originalTools = server._registeredTools || {};
74
73
  server._registeredTools = new Proxy(originalTools, handler);
75
- log('Successfully set up listener for new tool registrations');
74
+ logger('Successfully set up listener for new tool registrations');
76
75
  } catch (error) {
77
- log(`Warning: Failed to setup listener for registered tools - ${error}`);
76
+ logger(`Warning: Failed to setup listener for registered tools - ${error}`);
78
77
  }
79
78
  }
80
- function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInputSchema = ()=>tool.inputSchema) {
79
+ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInputSchema, logger) {
81
80
  const originalCallback = getToolFunction(tool);
82
81
  const options = getServerTrackingData(server.server)?.options;
83
- const missingToolName = resolveMissingCapabilityToolName(options);
84
82
  if (wrappedCallbacks.has(originalCallback)) {
85
- log(`Tool ${toolName} callback already wrapped, skipping re-wrap`);
83
+ logger(`Tool ${toolName} callback already wrapped, skipping re-wrap`);
86
84
  return tool;
87
85
  }
88
86
  if (tool[MCP_ANALYTICS_PROCESSED]) {
89
- log(`Tool ${toolName} already processed, skipping re-wrap`);
87
+ logger(`Tool ${toolName} already processed, skipping re-wrap`);
90
88
  return tool;
91
89
  }
92
90
  const wrappedCallback = async (...params)=>{
@@ -101,8 +99,8 @@ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInpu
101
99
  }
102
100
  const inputSchema = getCurrentInputSchema();
103
101
  const cleanedArgs = stripOwnedAnalyticsArguments(args, {
104
- context: toolName !== missingToolName && isContextEnabled(options?.context) && analyticsOwnsParameter(inputSchema, 'context'),
105
- 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')
106
104
  });
107
105
  try {
108
106
  if (void 0 === cleanedArgs) {
@@ -122,13 +120,15 @@ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInpu
122
120
  wrappedTool[MCP_ANALYTICS_PROCESSED] = true;
123
121
  return wrappedTool;
124
122
  }
125
- async function handleToolCallRequest(highLevelServer, server, originalCallToolHandler, request, extra) {
123
+ async function handleToolCallRequest(highLevelServer, server, originalCallToolHandler, request, extra, logger) {
126
124
  const data = getServerTrackingData(server);
127
125
  if (!data) {
128
- log('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
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.');
129
127
  return await originalCallToolHandler(request, extra);
130
128
  }
131
- 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) {
132
132
  const context = getContextArgument(request) || '';
133
133
  return await captureToolCall({
134
134
  server,
@@ -139,10 +139,9 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
139
139
  explicitContextIntent: context,
140
140
  execute: async ()=>handleReportMissing({
141
141
  context
142
- })
142
+ }, data.logger)
143
143
  });
144
144
  }
145
- const toolName = request.params?.name;
146
145
  const registeredTool = toolName ? highLevelServer._registeredTools[toolName] : void 0;
147
146
  return await captureToolCall({
148
147
  server,
@@ -158,24 +157,24 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
158
157
  }
159
158
  });
160
159
  }
161
- function instrumentHighLevelServer(server) {
160
+ function instrumentHighLevelServer(server, logger) {
162
161
  try {
163
162
  const lowLevelServer = server.server;
164
163
  const mcpAnalyticsData = getServerTrackingData(lowLevelServer);
165
164
  const handlers = {
166
- initialize: handleInitializeRequest,
167
- 'tools/list': handleListToolsRequest,
168
- 'tools/call': (trackedServer, originalHandler, request, extra)=>handleToolCallRequest(server, trackedServer, originalHandler, request, extra)
165
+ initialize: (trackedServer, originalHandler, request, extra)=>handleInitializeRequest(trackedServer, originalHandler, request, extra, logger),
166
+ 'tools/list': (trackedServer, originalHandler, request, extra)=>handleListToolsRequest(trackedServer, originalHandler, request, extra, logger),
167
+ 'tools/call': (trackedServer, originalHandler, request, extra)=>handleToolCallRequest(server, trackedServer, originalHandler, request, extra, logger)
169
168
  };
170
169
  patchRequestHandlers(lowLevelServer, handlers);
171
- server._registeredTools = addTracingToToolRegistry(server._registeredTools, server);
170
+ server._registeredTools = addTracingToToolRegistry(server._registeredTools, server, logger);
172
171
  if (mcpAnalyticsData) {
173
172
  seedToolDescriptionsFromRegistry(mcpAnalyticsData.toolDescriptions, server._registeredTools);
174
173
  seedToolCategoriesFromRegistry(mcpAnalyticsData.toolCategories, server._registeredTools);
175
174
  }
176
- setupListenerToRegisteredTools(server);
175
+ setupListenerToRegisteredTools(server, logger);
177
176
  } catch (error) {
178
- log(`Warning: Failed to setup tool call instrumentation - ${error}`);
177
+ logger(`Warning: Failed to setup tool call instrumentation - ${error}`);
179
178
  }
180
179
  }
181
180
  function seedToolDescriptionsFromRegistry(cache, tools) {
@@ -1,8 +1,9 @@
1
1
  import type { MCPServerLike } from '../types';
2
+ import type { LoggerFn } from './logger';
2
3
  /**
3
4
  * Instruments a low-level `Server`: wraps `initialize`, `tools/list`, and
4
5
  * `tools/call`. The tool-call lifecycle is delegated to {@link captureToolCall},
5
6
  * shared with the high-level wrapper.
6
7
  */
7
- export declare function instrumentLowLevelServer(server: MCPServerLike): void;
8
+ export declare function instrumentLowLevelServer(server: MCPServerLike, logger: LoggerFn): void;
8
9
  //# sourceMappingURL=instrument-lowlevel.d.ts.map
@@ -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;AAmB5F;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAkBpE"}
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"}
@@ -29,31 +29,35 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  const types_js_namespaceObject = require("@modelcontextprotocol/sdk/types.js");
30
30
  const external_event_types_js_namespaceObject = require("./event-types.js");
31
31
  const external_internal_js_namespaceObject = require("./internal.js");
32
- const external_logger_js_namespaceObject = require("./logger.js");
33
32
  const external_tools_js_namespaceObject = require("./tools.js");
34
33
  const external_instrumentation_js_namespaceObject = require("./instrumentation.js");
35
34
  const external_tracing_helpers_js_namespaceObject = require("./tracing-helpers.js");
36
- function instrumentLowLevelServer(server) {
35
+ function instrumentLowLevelServer(server, logger) {
37
36
  try {
37
+ const hadCallToolHandler = server._requestHandlers.has('tools/call');
38
38
  const handlers = {
39
- initialize: external_instrumentation_js_namespaceObject.handleInitializeRequest,
40
- 'tools/list': external_instrumentation_js_namespaceObject.handleListToolsRequest
39
+ initialize: (server, originalHandler, request, extra)=>(0, external_instrumentation_js_namespaceObject.handleInitializeRequest)(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)
41
42
  };
42
43
  (0, external_instrumentation_js_namespaceObject.patchRequestHandlers)(server, handlers);
43
- const originalCallToolHandler = server._requestHandlers.get('tools/call');
44
- server.setRequestHandler(types_js_namespaceObject.CallToolRequestSchema, async (request, extra)=>await handleToolCallRequest(server, originalCallToolHandler, request, extra));
44
+ if (!hadCallToolHandler) server.setRequestHandler(types_js_namespaceObject.CallToolRequestSchema, async (request)=>{
45
+ throw new Error(`Unknown tool: ${request.params?.name || 'unknown'}`);
46
+ });
45
47
  } catch (error) {
46
- (0, external_logger_js_namespaceObject.log)(`Warning: Failed to setup tool call instrumentation - ${error}`);
48
+ logger(`Warning: Failed to setup tool call instrumentation - ${error}`);
47
49
  throw error;
48
50
  }
49
51
  }
50
- async function handleToolCallRequest(server, originalCallToolHandler, request, extra) {
52
+ async function handleToolCallRequest(server, originalCallToolHandler, request, extra, logger) {
51
53
  const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
52
54
  if (!data) {
53
- (0, external_logger_js_namespaceObject.log)('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
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.');
54
56
  return await originalCallToolHandler?.(request, extra);
55
57
  }
56
- 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) {
57
61
  const context = (0, external_tracing_helpers_js_namespaceObject.getContextArgument)(request) || '';
58
62
  return await (0, external_instrumentation_js_namespaceObject.captureToolCall)({
59
63
  server,
@@ -64,7 +68,7 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
64
68
  explicitContextIntent: context,
65
69
  execute: async ()=>(0, external_tools_js_namespaceObject.handleReportMissing)({
66
70
  context
67
- })
71
+ }, data.logger)
68
72
  });
69
73
  }
70
74
  return await (0, external_instrumentation_js_namespaceObject.captureToolCall)({
@@ -1,31 +1,35 @@
1
1
  import { CallToolRequestSchema } from "@modelcontextprotocol/sdk/types.js";
2
2
  import { MCPAnalyticsEventType } from "./event-types.mjs";
3
3
  import { getServerTrackingData } from "./internal.mjs";
4
- import { log } from "./logger.mjs";
5
4
  import { handleReportMissing, resolveMissingCapabilityToolName } from "./tools.mjs";
6
- import { captureToolCall, handleInitializeRequest, handleListToolsRequest, patchRequestHandlers } from "./instrumentation.mjs";
5
+ import { captureToolCall, handleInitializeRequest, handleListToolsRequest, isToolAdvertised, patchRequestHandlers } from "./instrumentation.mjs";
7
6
  import { getContextArgument } from "./tracing-helpers.mjs";
8
- function instrumentLowLevelServer(server) {
7
+ function instrumentLowLevelServer(server, logger) {
9
8
  try {
9
+ const hadCallToolHandler = server._requestHandlers.has('tools/call');
10
10
  const handlers = {
11
- initialize: handleInitializeRequest,
12
- 'tools/list': handleListToolsRequest
11
+ initialize: (server, originalHandler, request, extra)=>handleInitializeRequest(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)
13
14
  };
14
15
  patchRequestHandlers(server, handlers);
15
- const originalCallToolHandler = server._requestHandlers.get('tools/call');
16
- server.setRequestHandler(CallToolRequestSchema, async (request, extra)=>await handleToolCallRequest(server, originalCallToolHandler, request, extra));
16
+ if (!hadCallToolHandler) server.setRequestHandler(CallToolRequestSchema, async (request)=>{
17
+ throw new Error(`Unknown tool: ${request.params?.name || 'unknown'}`);
18
+ });
17
19
  } catch (error) {
18
- log(`Warning: Failed to setup tool call instrumentation - ${error}`);
20
+ logger(`Warning: Failed to setup tool call instrumentation - ${error}`);
19
21
  throw error;
20
22
  }
21
23
  }
22
- async function handleToolCallRequest(server, originalCallToolHandler, request, extra) {
24
+ async function handleToolCallRequest(server, originalCallToolHandler, request, extra, logger) {
23
25
  const data = getServerTrackingData(server);
24
26
  if (!data) {
25
- log('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
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.');
26
28
  return await originalCallToolHandler?.(request, extra);
27
29
  }
28
- 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) {
29
33
  const context = getContextArgument(request) || '';
30
34
  return await captureToolCall({
31
35
  server,
@@ -36,7 +40,7 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
36
40
  explicitContextIntent: context,
37
41
  execute: async ()=>handleReportMissing({
38
42
  context
39
- })
43
+ }, data.logger)
40
44
  });
41
45
  }
42
46
  return await captureToolCall({
@@ -1,6 +1,7 @@
1
1
  import type { ListToolsResult } from '@modelcontextprotocol/sdk/types.js';
2
2
  import type { AnalyticsParameterOwnership, CompatibleRequestHandlerExtra, MCPAnalyticsData, MCPRequestLike, MCPServerLike } from '../types';
3
3
  import { MCPAnalyticsEventType } from './event-types';
4
+ import type { LoggerFn } from './logger';
4
5
  /**
5
6
  * Single instrumentation core shared by the low-level (`Server`) and high-level
6
7
  * (`McpServer`) wrappers. The two entrypoints differ only in how they reach the
@@ -54,19 +55,19 @@ export declare function captureToolCall(params: TraceToolCallParams): Promise<un
54
55
  * supplies `request` and `extra` per call.
55
56
  */
56
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;
57
59
  /**
58
- * Applies the `patches` (keyed by method, e.g. `initialize`, `tools/list`) to the
59
- * handlers already registered, and patches `setRequestHandler` so matching
60
- * handlers registered later are patched too. The latter is what makes adapters
61
- * that register handlers post-construction work — e.g. `@rekog/mcp-nest` hands a
62
- * 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.
63
64
  */
64
- 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>;
65
66
  /**
66
67
  * Captures each `tools/list` and injects the SDK-managed tools (context
67
68
  * parameter, conversation id, `get_more_tools`) into the returned list.
68
69
  */
69
- export declare function handleListToolsRequest(server: MCPServerLike, originalListToolsHandler: MCPRequestHandler, request: MCPRequestLike, extra?: CompatibleRequestHandlerExtra): Promise<{
70
+ export declare function handleListToolsRequest(server: MCPServerLike, originalListToolsHandler: MCPRequestHandler, request: MCPRequestLike, extra: CompatibleRequestHandlerExtra | undefined, logger: LoggerFn): Promise<{
70
71
  tools: ListToolsResult['tools'];
71
72
  }>;
72
73
  export declare function cacheToolDescriptions(cache: Map<string, string>, tools: ListToolsResult['tools'] | undefined): void;
@@ -81,6 +82,6 @@ export declare function cacheToolCategories(cache: Map<string, string>, tools: L
81
82
  * Captures the connection handshake (and resolves identity) on `initialize`
82
83
  * before the original handler runs.
83
84
  */
84
- export declare function handleInitializeRequest(server: MCPServerLike, originalInitializeHandler: MCPRequestHandler, request: MCPRequestLike, extra?: CompatibleRequestHandlerExtra): Promise<unknown>;
85
+ export declare function handleInitializeRequest(server: MCPServerLike, originalInitializeHandler: MCPRequestHandler, request: MCPRequestLike, extra: CompatibleRequestHandlerExtra | undefined, logger: LoggerFn): Promise<unknown>;
85
86
  export {};
86
87
  //# sourceMappingURL=instrumentation.d.ts.map
@@ -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;AAYrD;;;;;;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;AAqJD;;;;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,CAAC,EAAE,6BAA6B,GACpC,OAAO,CAAC;IAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAyC9C;AAwED,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,CAAC,EAAE,6BAA6B,GACpC,OAAO,CAAC,OAAO,CAAC,CA0ClB"}
1
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"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"}