@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.
- package/dist/extensions/capture.d.ts +2 -1
- package/dist/extensions/capture.d.ts.map +1 -1
- package/dist/extensions/capture.js +2 -3
- package/dist/extensions/capture.mjs +2 -3
- package/dist/extensions/compatibility.d.ts +3 -2
- package/dist/extensions/compatibility.d.ts.map +1 -1
- package/dist/extensions/compatibility.js +19 -20
- package/dist/extensions/compatibility.mjs +15 -16
- package/dist/extensions/context-parameters.d.ts +3 -2
- package/dist/extensions/context-parameters.d.ts.map +1 -1
- package/dist/extensions/context-parameters.js +4 -8
- package/dist/extensions/context-parameters.mjs +4 -7
- package/dist/extensions/conversation-id.d.ts +3 -2
- package/dist/extensions/conversation-id.d.ts.map +1 -1
- package/dist/extensions/conversation-id.js +5 -6
- package/dist/extensions/conversation-id.mjs +5 -5
- package/dist/extensions/instrument-highlevel.d.ts +2 -1
- package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
- package/dist/extensions/instrument-highlevel.js +29 -30
- package/dist/extensions/instrument-highlevel.mjs +30 -31
- package/dist/extensions/instrument-lowlevel.d.ts +2 -1
- package/dist/extensions/instrument-lowlevel.d.ts.map +1 -1
- package/dist/extensions/instrument-lowlevel.js +15 -11
- package/dist/extensions/instrument-lowlevel.mjs +16 -12
- package/dist/extensions/instrumentation.d.ts +9 -8
- package/dist/extensions/instrumentation.d.ts.map +1 -1
- package/dist/extensions/instrumentation.js +84 -40
- package/dist/extensions/instrumentation.mjs +80 -39
- package/dist/extensions/intent.d.ts.map +1 -1
- package/dist/extensions/intent.js +2 -3
- package/dist/extensions/intent.mjs +2 -3
- package/dist/extensions/internal.d.ts.map +1 -1
- package/dist/extensions/internal.js +5 -6
- package/dist/extensions/internal.mjs +5 -6
- package/dist/extensions/logger.d.ts +12 -4
- package/dist/extensions/logger.d.ts.map +1 -1
- package/dist/extensions/logger.js +12 -3
- package/dist/extensions/logger.mjs +10 -4
- package/dist/extensions/sink.d.ts +4 -2
- package/dist/extensions/sink.d.ts.map +1 -1
- package/dist/extensions/sink.js +11 -10
- package/dist/extensions/sink.mjs +11 -10
- package/dist/extensions/tools.d.ts +2 -1
- package/dist/extensions/tools.d.ts.map +1 -1
- package/dist/extensions/tools.js +2 -2
- package/dist/extensions/tools.mjs +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -16
- package/dist/index.mjs +19 -17
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +3 -3
- package/src/extensions/capture.ts +3 -3
- package/src/extensions/compatibility.ts +16 -16
- package/src/extensions/context-parameters.ts +8 -12
- package/src/extensions/conversation-id.ts +14 -7
- package/src/extensions/instrument-highlevel.ts +45 -44
- package/src/extensions/instrument-lowlevel.ts +30 -15
- package/src/extensions/instrumentation.ts +119 -42
- package/src/extensions/intent.ts +2 -8
- package/src/extensions/internal.ts +7 -6
- package/src/extensions/logger.ts +22 -7
- package/src/extensions/sink.ts +17 -12
- package/src/extensions/tools.ts +3 -3
- package/src/index.ts +21 -19
- package/src/types.ts +2 -0
- 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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
74
|
+
logger('Successfully set up listener for new tool registrations');
|
|
76
75
|
} catch (error) {
|
|
77
|
-
|
|
76
|
+
logger(`Warning: Failed to setup listener for registered tools - ${error}`);
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
|
-
function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInputSchema
|
|
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
|
-
|
|
83
|
+
logger(`Tool ${toolName} callback already wrapped, skipping re-wrap`);
|
|
86
84
|
return tool;
|
|
87
85
|
}
|
|
88
86
|
if (tool[MCP_ANALYTICS_PROCESSED]) {
|
|
89
|
-
|
|
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:
|
|
105
|
-
conversationId:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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
|
-
|
|
44
|
-
|
|
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
|
-
(
|
|
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
|
-
(
|
|
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
|
-
|
|
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
|
-
|
|
16
|
-
|
|
16
|
+
if (!hadCallToolHandler) server.setRequestHandler(CallToolRequestSchema, async (request)=>{
|
|
17
|
+
throw new Error(`Unknown tool: ${request.params?.name || 'unknown'}`);
|
|
18
|
+
});
|
|
17
19
|
} catch (error) {
|
|
18
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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;
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"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"}
|