@posthog/mcp 0.4.1 → 0.4.2
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/instrumentation.d.ts +7 -0
- package/dist/extensions/instrumentation.d.ts.map +1 -1
- package/dist/extensions/instrumentation.js +11 -4
- package/dist/extensions/instrumentation.mjs +12 -5
- 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/instrumentation.ts +30 -15
- package/src/version.ts +1 -1
|
@@ -47,6 +47,13 @@ export declare function captureToolCall(params: TraceToolCallParams): Promise<un
|
|
|
47
47
|
* SDK-managed tools (context parameter, conversation id, `get_more_tools`) are
|
|
48
48
|
* injected. Idempotent per server. Works for both low-level and high-level
|
|
49
49
|
* servers — the high-level wrapper passes its underlying `server`.
|
|
50
|
+
*
|
|
51
|
+
* The handler can reach us two ways, and we cover both:
|
|
52
|
+
* 1. It already exists when instrument() runs (tools registered first) — wrap
|
|
53
|
+
* the entry in `_requestHandlers` directly.
|
|
54
|
+
* 2. It's registered after instrument() (e.g. `@rekog/mcp-nest` registers it at
|
|
55
|
+
* the low level once it gets the server) — intercept `setRequestHandler` and
|
|
56
|
+
* wrap the handler as it lands, mirroring how `tools/call` already works.
|
|
50
57
|
*/
|
|
51
58
|
export declare function instrumentToolsListHandler(server: MCPServerLike): void;
|
|
52
59
|
export declare function cacheToolDescriptions(cache: Map<string, string>, tools: ListToolsResult['tools'] | undefined): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,oCAAoC,CAAA;AAClG,OAAO,KAAK,EAAE,6BAA6B,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAY,MAAM,UAAU,CAAA;AAWxH,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAqBrD;;;;GAIG;AACH,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;;;;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,CAuCnF;AAwHD;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAiCtE;AAuGD,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;AAID;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAiCvE"}
|
|
@@ -41,6 +41,7 @@ const external_intent_js_namespaceObject = require("./intent.js");
|
|
|
41
41
|
const external_internal_js_namespaceObject = require("./internal.js");
|
|
42
42
|
const external_logger_js_namespaceObject = require("./logger.js");
|
|
43
43
|
const external_mcp_payloads_js_namespaceObject = require("./mcp-payloads.js");
|
|
44
|
+
const external_mcp_sdk_compat_js_namespaceObject = require("./mcp-sdk-compat.js");
|
|
44
45
|
const external_session_js_namespaceObject = require("./session.js");
|
|
45
46
|
const external_tools_js_namespaceObject = require("./tools.js");
|
|
46
47
|
const external_tracing_helpers_js_namespaceObject = require("./tracing-helpers.js");
|
|
@@ -122,11 +123,17 @@ const listToolsTracingSetup = new WeakMap();
|
|
|
122
123
|
function instrumentToolsListHandler(server) {
|
|
123
124
|
if (!server._capabilities?.tools) return;
|
|
124
125
|
if (listToolsTracingSetup.get(server)) return;
|
|
125
|
-
|
|
126
|
-
if (!originalListToolsHandler) return;
|
|
126
|
+
listToolsTracingSetup.set(server, true);
|
|
127
127
|
try {
|
|
128
|
-
server.
|
|
129
|
-
|
|
128
|
+
const existingHandler = server._requestHandlers.get('tools/list');
|
|
129
|
+
if (existingHandler) server._requestHandlers.set('tools/list', (request, extra)=>handleListToolsRequest(server, existingHandler, request, extra));
|
|
130
|
+
const originalSetRequestHandler = server.setRequestHandler.bind(server);
|
|
131
|
+
server.setRequestHandler = (requestSchema, handler)=>{
|
|
132
|
+
const shape = (0, external_mcp_sdk_compat_js_namespaceObject.getObjectShape)(requestSchema);
|
|
133
|
+
const method = shape?.method ? (0, external_mcp_sdk_compat_js_namespaceObject.getLiteralValue)(shape.method) : void 0;
|
|
134
|
+
if ('tools/list' === method) return originalSetRequestHandler(requestSchema, (request, extra)=>handleListToolsRequest(server, handler, request, extra));
|
|
135
|
+
return originalSetRequestHandler(requestSchema, handler);
|
|
136
|
+
};
|
|
130
137
|
} catch (error) {
|
|
131
138
|
(0, external_logger_js_namespaceObject.log)(`Warning: Failed to override list tools handler - ${error}`);
|
|
132
139
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { InitializeRequestSchema
|
|
1
|
+
import { InitializeRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
2
2
|
import { addContextParameterToTools, getContextDescription, isContextEnabled } from "./context-parameters.mjs";
|
|
3
3
|
import { addConversationIdToTools, canInjectConversationIdPromptBack, cloneRequestWithoutConversationId, injectConversationIdPromptBack, resolveConversationId } from "./conversation-id.mjs";
|
|
4
4
|
import { captureEvent } from "./capture.mjs";
|
|
@@ -8,6 +8,7 @@ import { resolveToolCallIntent, setEventIntent, setExplicitContextIntent } from
|
|
|
8
8
|
import { getServerTrackingData, handleIdentify } from "./internal.mjs";
|
|
9
9
|
import { log } from "./logger.mjs";
|
|
10
10
|
import { buildCapturedMcpParameters } from "./mcp-payloads.mjs";
|
|
11
|
+
import { getLiteralValue, getObjectShape } from "./mcp-sdk-compat.mjs";
|
|
11
12
|
import { getServerSessionId } from "./session.mjs";
|
|
12
13
|
import { getReportMissingToolDescriptor, resolveMissingCapabilityToolName } from "./tools.mjs";
|
|
13
14
|
import { applyResolvedMetadata, isToolResultError } from "./tracing-helpers.mjs";
|
|
@@ -89,11 +90,17 @@ const listToolsTracingSetup = new WeakMap();
|
|
|
89
90
|
function instrumentToolsListHandler(server) {
|
|
90
91
|
if (!server._capabilities?.tools) return;
|
|
91
92
|
if (listToolsTracingSetup.get(server)) return;
|
|
92
|
-
|
|
93
|
-
if (!originalListToolsHandler) return;
|
|
93
|
+
listToolsTracingSetup.set(server, true);
|
|
94
94
|
try {
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
const existingHandler = server._requestHandlers.get('tools/list');
|
|
96
|
+
if (existingHandler) server._requestHandlers.set('tools/list', (request, extra)=>handleListToolsRequest(server, existingHandler, request, extra));
|
|
97
|
+
const originalSetRequestHandler = server.setRequestHandler.bind(server);
|
|
98
|
+
server.setRequestHandler = (requestSchema, handler)=>{
|
|
99
|
+
const shape = getObjectShape(requestSchema);
|
|
100
|
+
const method = shape?.method ? getLiteralValue(shape.method) : void 0;
|
|
101
|
+
if ('tools/list' === method) return originalSetRequestHandler(requestSchema, (request, extra)=>handleListToolsRequest(server, handler, request, extra));
|
|
102
|
+
return originalSetRequestHandler(requestSchema, handler);
|
|
103
|
+
};
|
|
97
104
|
} catch (error) {
|
|
98
105
|
log(`Warning: Failed to override list tools handler - ${error}`);
|
|
99
106
|
}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "0.4.
|
|
1
|
+
export declare const version = "0.4.2";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
|
@@ -26,7 +26,7 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
26
26
|
__webpack_require__.d(__webpack_exports__, {
|
|
27
27
|
version: ()=>version
|
|
28
28
|
});
|
|
29
|
-
const version = '0.4.
|
|
29
|
+
const version = '0.4.2';
|
|
30
30
|
exports.version = __webpack_exports__.version;
|
|
31
31
|
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
32
32
|
"version"
|
package/dist/version.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const version = '0.4.
|
|
1
|
+
const version = '0.4.2';
|
|
2
2
|
export { version };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@posthog/mcp",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"bugs": {
|
|
5
5
|
"url": "https://github.com/PostHog/posthog-js/issues"
|
|
6
6
|
},
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"module": "dist/index.mjs",
|
|
29
29
|
"types": "dist/index.d.ts",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@posthog/core": "^1.
|
|
31
|
+
"@posthog/core": "^1.37.3"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@babel/preset-env": "^7.27.1",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"jest": "29.7.0",
|
|
41
41
|
"zod": "^3.25.0",
|
|
42
42
|
"@posthog-tooling/tsconfig-base": "1.1.1",
|
|
43
|
-
"posthog-node": "^5.38.
|
|
43
|
+
"posthog-node": "^5.38.5"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
46
|
"@modelcontextprotocol/sdk": ">=1.26.0",
|
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
// Copyright (c) 2025 MCPcat
|
|
3
3
|
// Licensed under the MIT License: https://github.com/MCPCat/mcpcat-typescript-sdk/blob/main/LICENSE
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
InitializeRequestSchema,
|
|
7
|
-
ListToolsRequestSchema,
|
|
8
|
-
type ListToolsResult,
|
|
9
|
-
} from '@modelcontextprotocol/sdk/types.js'
|
|
5
|
+
import { InitializeRequestSchema, type ListToolsResult } from '@modelcontextprotocol/sdk/types.js'
|
|
10
6
|
import type { CompatibleRequestHandlerExtra, MCPAnalyticsData, MCPRequestLike, MCPServerLike, McpEvent } from '../types'
|
|
11
7
|
import { addContextParameterToTools, getContextDescription, isContextEnabled } from './context-parameters'
|
|
12
8
|
import {
|
|
@@ -24,6 +20,7 @@ import { resolveToolCallIntent, setEventIntent, setExplicitContextIntent } from
|
|
|
24
20
|
import { getServerTrackingData, handleIdentify } from './internal'
|
|
25
21
|
import { log } from './logger'
|
|
26
22
|
import { buildCapturedMcpParameters } from './mcp-payloads'
|
|
23
|
+
import { getLiteralValue, getObjectShape } from './mcp-sdk-compat'
|
|
27
24
|
import { getServerSessionId } from './session'
|
|
28
25
|
import { getReportMissingToolDescriptor, resolveMissingCapabilityToolName } from './tools'
|
|
29
26
|
import { applyResolvedMetadata, isToolResultError } from './tracing-helpers'
|
|
@@ -244,6 +241,13 @@ const listToolsTracingSetup = new WeakMap<MCPServerLike, boolean>()
|
|
|
244
241
|
* SDK-managed tools (context parameter, conversation id, `get_more_tools`) are
|
|
245
242
|
* injected. Idempotent per server. Works for both low-level and high-level
|
|
246
243
|
* servers — the high-level wrapper passes its underlying `server`.
|
|
244
|
+
*
|
|
245
|
+
* The handler can reach us two ways, and we cover both:
|
|
246
|
+
* 1. It already exists when instrument() runs (tools registered first) — wrap
|
|
247
|
+
* the entry in `_requestHandlers` directly.
|
|
248
|
+
* 2. It's registered after instrument() (e.g. `@rekog/mcp-nest` registers it at
|
|
249
|
+
* the low level once it gets the server) — intercept `setRequestHandler` and
|
|
250
|
+
* wrap the handler as it lands, mirroring how `tools/call` already works.
|
|
247
251
|
*/
|
|
248
252
|
export function instrumentToolsListHandler(server: MCPServerLike): void {
|
|
249
253
|
if (!(server as MCPServerWithCapabilities)._capabilities?.tools) {
|
|
@@ -252,18 +256,29 @@ export function instrumentToolsListHandler(server: MCPServerLike): void {
|
|
|
252
256
|
if (listToolsTracingSetup.get(server)) {
|
|
253
257
|
return
|
|
254
258
|
}
|
|
255
|
-
|
|
256
|
-
const originalListToolsHandler = server._requestHandlers.get('tools/list')
|
|
257
|
-
if (!originalListToolsHandler) {
|
|
258
|
-
return
|
|
259
|
-
}
|
|
259
|
+
listToolsTracingSetup.set(server, true)
|
|
260
260
|
|
|
261
261
|
try {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
262
|
+
// A handler already registered before instrument() — wrap it in place.
|
|
263
|
+
const existingHandler = server._requestHandlers.get('tools/list')
|
|
264
|
+
if (existingHandler) {
|
|
265
|
+
server._requestHandlers.set('tools/list', (request, extra) =>
|
|
266
|
+
handleListToolsRequest(server, existingHandler, request, extra)
|
|
267
|
+
)
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// A handler registered after instrument() — intercept the registration.
|
|
271
|
+
const originalSetRequestHandler = server.setRequestHandler.bind(server)
|
|
272
|
+
server.setRequestHandler = ((requestSchema: unknown, handler: MCPRequestHandler) => {
|
|
273
|
+
const shape = getObjectShape(requestSchema)
|
|
274
|
+
const method = shape?.method ? getLiteralValue(shape.method) : undefined
|
|
275
|
+
if (method === 'tools/list') {
|
|
276
|
+
return originalSetRequestHandler(requestSchema, (request, extra) =>
|
|
277
|
+
handleListToolsRequest(server, handler, request, extra)
|
|
278
|
+
)
|
|
279
|
+
}
|
|
280
|
+
return originalSetRequestHandler(requestSchema, handler)
|
|
281
|
+
}) as MCPServerLike['setRequestHandler']
|
|
267
282
|
} catch (error) {
|
|
268
283
|
log(`Warning: Failed to override list tools handler - ${error}`)
|
|
269
284
|
}
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '0.4.
|
|
1
|
+
export const version = '0.4.2'
|