@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.
@@ -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,EAGL,KAAK,eAAe,EACrB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,KAAK,EAAE,6BAA6B,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAY,MAAM,UAAU,CAAA;AAWxH,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAoBrD;;;;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;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAsBtE;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"}
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
- const originalListToolsHandler = server._requestHandlers.get('tools/list');
126
- if (!originalListToolsHandler) return;
126
+ listToolsTracingSetup.set(server, true);
127
127
  try {
128
- server.setRequestHandler(types_js_namespaceObject.ListToolsRequestSchema, async (request, extra)=>await handleListToolsRequest(server, originalListToolsHandler, request, extra));
129
- listToolsTracingSetup.set(server, true);
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, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
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
- const originalListToolsHandler = server._requestHandlers.get('tools/list');
93
- if (!originalListToolsHandler) return;
93
+ listToolsTracingSetup.set(server, true);
94
94
  try {
95
- server.setRequestHandler(ListToolsRequestSchema, async (request, extra)=>await handleListToolsRequest(server, originalListToolsHandler, request, extra));
96
- listToolsTracingSetup.set(server, true);
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";
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.1';
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';
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.1",
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.36.0"
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.2"
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
- server.setRequestHandler(
263
- ListToolsRequestSchema,
264
- async (request, extra) => await handleListToolsRequest(server, originalListToolsHandler, request, extra)
265
- )
266
- listToolsTracingSetup.set(server, true)
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'
1
+ export const version = '0.4.2'