@posthog/mcp 0.10.4 → 0.10.5
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 -5
- package/dist/extensions/context-parameters.mjs +4 -4
- 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 +4 -5
- package/dist/extensions/conversation-id.mjs +4 -4
- 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 +24 -25
- package/dist/extensions/instrument-highlevel.mjs +24 -25
- 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 +8 -9
- package/dist/extensions/instrument-lowlevel.mjs +8 -9
- package/dist/extensions/instrumentation.d.ts +3 -2
- package/dist/extensions/instrumentation.d.ts.map +1 -1
- package/dist/extensions/instrumentation.js +25 -26
- package/dist/extensions/instrumentation.mjs +25 -26
- package/dist/extensions/intent.d.ts.map +1 -1
- package/dist/extensions/intent.js +1 -2
- package/dist/extensions/intent.mjs +1 -2
- 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 +1 -1
- package/src/extensions/capture.ts +3 -3
- package/src/extensions/compatibility.ts +16 -16
- package/src/extensions/context-parameters.ts +8 -6
- package/src/extensions/conversation-id.ts +12 -6
- package/src/extensions/instrument-highlevel.ts +37 -31
- package/src/extensions/instrument-lowlevel.ts +14 -10
- package/src/extensions/instrumentation.ts +30 -25
- package/src/extensions/intent.ts +1 -2
- 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,7 +2,6 @@ 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
7
|
import { captureToolCall, handleInitializeRequest, handleListToolsRequest, patchRequestHandlers, readToolMetaCategory } from "./instrumentation.mjs";
|
|
@@ -12,31 +11,31 @@ 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,21 @@ 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
82
|
const missingToolName = resolveMissingCapabilityToolName(options);
|
|
84
83
|
if (wrappedCallbacks.has(originalCallback)) {
|
|
85
|
-
|
|
84
|
+
logger(`Tool ${toolName} callback already wrapped, skipping re-wrap`);
|
|
86
85
|
return tool;
|
|
87
86
|
}
|
|
88
87
|
if (tool[MCP_ANALYTICS_PROCESSED]) {
|
|
89
|
-
|
|
88
|
+
logger(`Tool ${toolName} already processed, skipping re-wrap`);
|
|
90
89
|
return tool;
|
|
91
90
|
}
|
|
92
91
|
const wrappedCallback = async (...params)=>{
|
|
@@ -122,10 +121,10 @@ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInpu
|
|
|
122
121
|
wrappedTool[MCP_ANALYTICS_PROCESSED] = true;
|
|
123
122
|
return wrappedTool;
|
|
124
123
|
}
|
|
125
|
-
async function handleToolCallRequest(highLevelServer, server, originalCallToolHandler, request, extra) {
|
|
124
|
+
async function handleToolCallRequest(highLevelServer, server, originalCallToolHandler, request, extra, logger) {
|
|
126
125
|
const data = getServerTrackingData(server);
|
|
127
126
|
if (!data) {
|
|
128
|
-
|
|
127
|
+
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
128
|
return await originalCallToolHandler(request, extra);
|
|
130
129
|
}
|
|
131
130
|
if (request.params?.name === resolveMissingCapabilityToolName(data.options)) {
|
|
@@ -139,7 +138,7 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
|
|
|
139
138
|
explicitContextIntent: context,
|
|
140
139
|
execute: async ()=>handleReportMissing({
|
|
141
140
|
context
|
|
142
|
-
})
|
|
141
|
+
}, data.logger)
|
|
143
142
|
});
|
|
144
143
|
}
|
|
145
144
|
const toolName = request.params?.name;
|
|
@@ -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;AAiBxC;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CAoBtF"}
|
|
@@ -29,28 +29,27 @@ __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 {
|
|
38
37
|
const handlers = {
|
|
39
|
-
initialize: external_instrumentation_js_namespaceObject.handleInitializeRequest,
|
|
40
|
-
'tools/list': external_instrumentation_js_namespaceObject.handleListToolsRequest
|
|
38
|
+
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)
|
|
41
40
|
};
|
|
42
41
|
(0, external_instrumentation_js_namespaceObject.patchRequestHandlers)(server, handlers);
|
|
43
42
|
const originalCallToolHandler = server._requestHandlers.get('tools/call');
|
|
44
|
-
server.setRequestHandler(types_js_namespaceObject.CallToolRequestSchema, async (request, extra)=>await handleToolCallRequest(server, originalCallToolHandler, request, extra));
|
|
43
|
+
server.setRequestHandler(types_js_namespaceObject.CallToolRequestSchema, async (request, extra)=>await handleToolCallRequest(server, originalCallToolHandler, request, extra, logger));
|
|
45
44
|
} catch (error) {
|
|
46
|
-
(
|
|
45
|
+
logger(`Warning: Failed to setup tool call instrumentation - ${error}`);
|
|
47
46
|
throw error;
|
|
48
47
|
}
|
|
49
48
|
}
|
|
50
|
-
async function handleToolCallRequest(server, originalCallToolHandler, request, extra) {
|
|
49
|
+
async function handleToolCallRequest(server, originalCallToolHandler, request, extra, logger) {
|
|
51
50
|
const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
|
|
52
51
|
if (!data) {
|
|
53
|
-
(
|
|
52
|
+
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
53
|
return await originalCallToolHandler?.(request, extra);
|
|
55
54
|
}
|
|
56
55
|
if (request.params?.name === (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options)) {
|
|
@@ -64,7 +63,7 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
|
|
|
64
63
|
explicitContextIntent: context,
|
|
65
64
|
execute: async ()=>(0, external_tools_js_namespaceObject.handleReportMissing)({
|
|
66
65
|
context
|
|
67
|
-
})
|
|
66
|
+
}, data.logger)
|
|
68
67
|
});
|
|
69
68
|
}
|
|
70
69
|
return await (0, external_instrumentation_js_namespaceObject.captureToolCall)({
|
|
@@ -1,28 +1,27 @@
|
|
|
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
5
|
import { captureToolCall, handleInitializeRequest, handleListToolsRequest, patchRequestHandlers } from "./instrumentation.mjs";
|
|
7
6
|
import { getContextArgument } from "./tracing-helpers.mjs";
|
|
8
|
-
function instrumentLowLevelServer(server) {
|
|
7
|
+
function instrumentLowLevelServer(server, logger) {
|
|
9
8
|
try {
|
|
10
9
|
const handlers = {
|
|
11
|
-
initialize: handleInitializeRequest,
|
|
12
|
-
'tools/list': handleListToolsRequest
|
|
10
|
+
initialize: (server, originalHandler, request, extra)=>handleInitializeRequest(server, originalHandler, request, extra, logger),
|
|
11
|
+
'tools/list': (server, originalHandler, request, extra)=>handleListToolsRequest(server, originalHandler, request, extra, logger)
|
|
13
12
|
};
|
|
14
13
|
patchRequestHandlers(server, handlers);
|
|
15
14
|
const originalCallToolHandler = server._requestHandlers.get('tools/call');
|
|
16
|
-
server.setRequestHandler(CallToolRequestSchema, async (request, extra)=>await handleToolCallRequest(server, originalCallToolHandler, request, extra));
|
|
15
|
+
server.setRequestHandler(CallToolRequestSchema, async (request, extra)=>await handleToolCallRequest(server, originalCallToolHandler, request, extra, logger));
|
|
17
16
|
} catch (error) {
|
|
18
|
-
|
|
17
|
+
logger(`Warning: Failed to setup tool call instrumentation - ${error}`);
|
|
19
18
|
throw error;
|
|
20
19
|
}
|
|
21
20
|
}
|
|
22
|
-
async function handleToolCallRequest(server, originalCallToolHandler, request, extra) {
|
|
21
|
+
async function handleToolCallRequest(server, originalCallToolHandler, request, extra, logger) {
|
|
23
22
|
const data = getServerTrackingData(server);
|
|
24
23
|
if (!data) {
|
|
25
|
-
|
|
24
|
+
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
25
|
return await originalCallToolHandler?.(request, extra);
|
|
27
26
|
}
|
|
28
27
|
if (request.params?.name === resolveMissingCapabilityToolName(data.options)) {
|
|
@@ -36,7 +35,7 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
|
|
|
36
35
|
explicitContextIntent: context,
|
|
37
36
|
execute: async ()=>handleReportMissing({
|
|
38
37
|
context
|
|
39
|
-
})
|
|
38
|
+
}, data.logger)
|
|
40
39
|
});
|
|
41
40
|
}
|
|
42
41
|
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
|
|
@@ -66,7 +67,7 @@ export declare function patchRequestHandlers(server: MCPServerLike, patches: Rec
|
|
|
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":"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"}
|
|
@@ -41,7 +41,6 @@ const external_event_types_js_namespaceObject = require("./event-types.js");
|
|
|
41
41
|
const external_exceptions_js_namespaceObject = require("./exceptions.js");
|
|
42
42
|
const external_intent_js_namespaceObject = require("./intent.js");
|
|
43
43
|
const external_internal_js_namespaceObject = require("./internal.js");
|
|
44
|
-
const external_logger_js_namespaceObject = require("./logger.js");
|
|
45
44
|
const external_mcp_payloads_js_namespaceObject = require("./mcp-payloads.js");
|
|
46
45
|
const external_mcp_sdk_compat_js_namespaceObject = require("./mcp-sdk-compat.js");
|
|
47
46
|
const external_session_js_namespaceObject = require("./session.js");
|
|
@@ -60,11 +59,11 @@ async function captureToolCall(params) {
|
|
|
60
59
|
try {
|
|
61
60
|
result = await execute(downstreamRequest);
|
|
62
61
|
} catch (error) {
|
|
63
|
-
publishFailedToolEvent(server, event, error, startTime, conversation);
|
|
62
|
+
publishFailedToolEvent(server, event, error, startTime, conversation, data.logger);
|
|
64
63
|
throw error;
|
|
65
64
|
}
|
|
66
65
|
const finalResult = applyConversationPromptBack(event, result, conversation);
|
|
67
|
-
publishSuccessfulToolEvent(server, event, finalResult, startTime, takeCapturedError);
|
|
66
|
+
publishSuccessfulToolEvent(server, event, finalResult, startTime, data.logger, takeCapturedError);
|
|
68
67
|
return finalResult;
|
|
69
68
|
}
|
|
70
69
|
function getActiveAnalyticsParameterOwnership(data, toolName, override) {
|
|
@@ -107,7 +106,7 @@ async function prepareToolCallEvent(server, data, request, downstreamRequest, ex
|
|
|
107
106
|
(0, external_intent_js_namespaceObject.setEventIntent)(event, await (0, external_intent_js_namespaceObject.resolveToolCallIntent)(data, request, ownership.context, extra));
|
|
108
107
|
return event;
|
|
109
108
|
} catch (error) {
|
|
110
|
-
|
|
109
|
+
data.logger(`Warning: PostHog MCP analytics instrumentation failed for tool ${request.params?.name}, the tool will still run - ${error}`);
|
|
111
110
|
return null;
|
|
112
111
|
}
|
|
113
112
|
}
|
|
@@ -117,7 +116,7 @@ function applyConversationPromptBack(event, result, conversation) {
|
|
|
117
116
|
if (event) event.conversationId = void 0;
|
|
118
117
|
return result;
|
|
119
118
|
}
|
|
120
|
-
function publishSuccessfulToolEvent(server, event, result, startTime, takeCapturedError) {
|
|
119
|
+
function publishSuccessfulToolEvent(server, event, result, startTime, logger, takeCapturedError) {
|
|
121
120
|
if (!event) return;
|
|
122
121
|
try {
|
|
123
122
|
if ((0, external_tracing_helpers_js_namespaceObject.isToolResultError)(result)) {
|
|
@@ -127,21 +126,21 @@ function publishSuccessfulToolEvent(server, event, result, startTime, takeCaptur
|
|
|
127
126
|
} else event.isError = false;
|
|
128
127
|
event.response = result;
|
|
129
128
|
event.duration = Date.now() - startTime.getTime();
|
|
130
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, event);
|
|
129
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, event, logger);
|
|
131
130
|
} catch (error) {
|
|
132
|
-
(
|
|
131
|
+
logger(`Warning: PostHog MCP analytics failed to publish tool event - ${error}`);
|
|
133
132
|
}
|
|
134
133
|
}
|
|
135
|
-
function publishFailedToolEvent(server, event, error, startTime, conversation) {
|
|
134
|
+
function publishFailedToolEvent(server, event, error, startTime, conversation, logger) {
|
|
136
135
|
if (!event) return;
|
|
137
136
|
try {
|
|
138
137
|
if (conversation.minted) event.conversationId = void 0;
|
|
139
138
|
event.isError = true;
|
|
140
139
|
event.error = (0, external_exceptions_js_namespaceObject.captureException)(error);
|
|
141
140
|
event.duration = Date.now() - startTime.getTime();
|
|
142
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, event);
|
|
141
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, event, logger);
|
|
143
142
|
} catch (publishError) {
|
|
144
|
-
(
|
|
143
|
+
logger(`Warning: PostHog MCP analytics failed to publish failed tool event - ${publishError}`);
|
|
145
144
|
}
|
|
146
145
|
}
|
|
147
146
|
function patchRequestHandlers(server, patches) {
|
|
@@ -158,7 +157,7 @@ function patchRequestHandlers(server, patches) {
|
|
|
158
157
|
return originalSetRequestHandler(requestSchema, (request, extra)=>patch(server, originalHandler, request, extra));
|
|
159
158
|
};
|
|
160
159
|
}
|
|
161
|
-
async function handleListToolsRequest(server, originalListToolsHandler, request, extra) {
|
|
160
|
+
async function handleListToolsRequest(server, originalListToolsHandler, request, extra, logger) {
|
|
162
161
|
const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
|
|
163
162
|
const startTime = new Date();
|
|
164
163
|
const event = {
|
|
@@ -169,19 +168,19 @@ async function handleListToolsRequest(server, originalListToolsHandler, request,
|
|
|
169
168
|
};
|
|
170
169
|
(0, external_client_identity_js_namespaceObject.stampMetaClientInfo)(event, request);
|
|
171
170
|
if (data) await (0, external_tracing_helpers_js_namespaceObject.applyResolvedMetadata)(event, data, request, extra);
|
|
172
|
-
const tools = await getTracedToolsList(server, originalListToolsHandler, request, extra, event);
|
|
171
|
+
const tools = await getTracedToolsList(server, originalListToolsHandler, request, extra, event, logger);
|
|
173
172
|
if (!data) {
|
|
174
|
-
(
|
|
173
|
+
logger('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
|
|
175
174
|
return {
|
|
176
175
|
tools
|
|
177
176
|
};
|
|
178
177
|
}
|
|
179
178
|
if (0 === tools.length) {
|
|
180
|
-
|
|
179
|
+
data.logger('Warning: No tools found in the original list. This is likely due to the tools not being registered before PostHog MCP analytics.instrument().');
|
|
181
180
|
event.error = (0, external_exceptions_js_namespaceObject.captureException)('No tools were sent to MCP client.');
|
|
182
181
|
event.isError = true;
|
|
183
182
|
event.duration = Date.now() - startTime.getTime();
|
|
184
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, event);
|
|
183
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, event, data.logger);
|
|
185
184
|
return {
|
|
186
185
|
tools
|
|
187
186
|
};
|
|
@@ -192,7 +191,7 @@ async function handleListToolsRequest(server, originalListToolsHandler, request,
|
|
|
192
191
|
event.listedToolNames = collectListedToolNames(tools);
|
|
193
192
|
event.isError = false;
|
|
194
193
|
event.duration = Date.now() - startTime.getTime();
|
|
195
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, event);
|
|
194
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, event, data.logger);
|
|
196
195
|
return {
|
|
197
196
|
tools
|
|
198
197
|
};
|
|
@@ -205,14 +204,14 @@ function collectListedToolNames(tools) {
|
|
|
205
204
|
const names = tools.map((tool)=>tool?.name).filter((name)=>'string' == typeof name);
|
|
206
205
|
return names.length > 0 ? names : void 0;
|
|
207
206
|
}
|
|
208
|
-
async function getTracedToolsList(server, originalListToolsHandler, request, extra, event) {
|
|
207
|
+
async function getTracedToolsList(server, originalListToolsHandler, request, extra, event, logger) {
|
|
209
208
|
try {
|
|
210
209
|
const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
|
|
211
210
|
const originalResponse = await originalListToolsHandler(request, extra);
|
|
212
211
|
let tools = originalResponse.tools || [];
|
|
213
212
|
if (data) cacheToolAnalyticsParameterOwnership(data.toolAnalyticsParameterOwnership, tools);
|
|
214
|
-
if (data && (0, external_context_parameters_js_namespaceObject.isContextEnabled)(data.options.context)) tools = (0, external_context_parameters_js_namespaceObject.addContextParameterToTools)(tools, (0, external_context_parameters_js_namespaceObject.getContextDescription)(data.options.context));
|
|
215
|
-
if (data?.options.enableConversationId) tools = (0, external_conversation_id_js_namespaceObject.addConversationIdToTools)(tools, (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options));
|
|
213
|
+
if (data && (0, external_context_parameters_js_namespaceObject.isContextEnabled)(data.options.context)) tools = (0, external_context_parameters_js_namespaceObject.addContextParameterToTools)(tools, (0, external_context_parameters_js_namespaceObject.getContextDescription)(data.options.context), data.logger);
|
|
214
|
+
if (data?.options.enableConversationId) tools = (0, external_conversation_id_js_namespaceObject.addConversationIdToTools)(tools, (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options), data.logger);
|
|
216
215
|
if (data?.options.reportMissing) {
|
|
217
216
|
const missingToolName = (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options);
|
|
218
217
|
const alreadyPresent = tools.some((tool)=>tool?.name === missingToolName);
|
|
@@ -224,11 +223,11 @@ async function getTracedToolsList(server, originalListToolsHandler, request, ext
|
|
|
224
223
|
}
|
|
225
224
|
return tools;
|
|
226
225
|
} catch (error) {
|
|
227
|
-
(
|
|
226
|
+
logger(`Warning: Original list tools handler failed, this suggests an error PostHog MCP analytics did not cause - ${error}`);
|
|
228
227
|
event.error = (0, external_exceptions_js_namespaceObject.captureException)(error);
|
|
229
228
|
event.isError = true;
|
|
230
229
|
event.duration = event.timestamp ? Date.now() - event.timestamp.getTime() : 0;
|
|
231
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, event);
|
|
230
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, event, logger);
|
|
232
231
|
throw error;
|
|
233
232
|
}
|
|
234
233
|
}
|
|
@@ -273,7 +272,7 @@ function mintStatelessSessionOnInitialize(server, data, request, extra) {
|
|
|
273
272
|
(0, external_internal_js_namespaceObject.setServerTrackingData)(server, data);
|
|
274
273
|
return sessionId;
|
|
275
274
|
} catch (error) {
|
|
276
|
-
|
|
275
|
+
data.logger(`Warning: PostHog MCP analytics failed to mint a stateless session id - ${error}`);
|
|
277
276
|
return;
|
|
278
277
|
}
|
|
279
278
|
}
|
|
@@ -289,7 +288,7 @@ function upgradeMintedTokenToNegotiated(server, data, mintedSessionId, negotiate
|
|
|
289
288
|
});
|
|
290
289
|
(0, external_session_token_js_namespaceObject.writeSessionIdToTransport)(transport, token);
|
|
291
290
|
} catch (error) {
|
|
292
|
-
|
|
291
|
+
data.logger(`Warning: PostHog MCP analytics failed to upgrade the stateless session token - ${error}`);
|
|
293
292
|
}
|
|
294
293
|
}
|
|
295
294
|
function readInitializeClientInfo(request) {
|
|
@@ -301,10 +300,10 @@ function readInitializeClientInfo(request) {
|
|
|
301
300
|
version: 'string' == typeof version ? version : void 0
|
|
302
301
|
};
|
|
303
302
|
}
|
|
304
|
-
async function handleInitializeRequest(server, originalInitializeHandler, request, extra) {
|
|
303
|
+
async function handleInitializeRequest(server, originalInitializeHandler, request, extra, logger) {
|
|
305
304
|
const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
|
|
306
305
|
if (!data) {
|
|
307
|
-
(
|
|
306
|
+
logger('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
|
|
308
307
|
return await originalInitializeHandler(request, extra);
|
|
309
308
|
}
|
|
310
309
|
const mintedSessionId = mintStatelessSessionOnInitialize(server, data, request, extra);
|
|
@@ -326,7 +325,7 @@ async function handleInitializeRequest(server, originalInitializeHandler, reques
|
|
|
326
325
|
data.sessionInfo.protocolVersion = negotiatedProtocolVersion;
|
|
327
326
|
(0, external_internal_js_namespaceObject.setServerTrackingData)(server, data);
|
|
328
327
|
if (mintedSessionId) upgradeMintedTokenToNegotiated(server, data, mintedSessionId, negotiatedProtocolVersion);
|
|
329
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, event);
|
|
328
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, event, data.logger);
|
|
330
329
|
return result;
|
|
331
330
|
}
|
|
332
331
|
function readProtocolVersion(result, request) {
|