@posthog/mcp 0.11.0 → 0.11.1

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 (41) hide show
  1. package/README.md +39 -0
  2. package/dist/extensions/compatibility.d.ts.map +1 -1
  3. package/dist/extensions/compatibility.js +14 -18
  4. package/dist/extensions/compatibility.mjs +10 -14
  5. package/dist/extensions/detect.d.ts +45 -0
  6. package/dist/extensions/detect.d.ts.map +1 -0
  7. package/dist/extensions/detect.js +90 -0
  8. package/dist/extensions/detect.mjs +35 -0
  9. package/dist/extensions/instrumentation.d.ts.map +1 -1
  10. package/dist/extensions/instrumentation.js +3 -2
  11. package/dist/extensions/instrumentation.mjs +3 -2
  12. package/dist/extensions/request-headers.d.ts +36 -0
  13. package/dist/extensions/request-headers.d.ts.map +1 -0
  14. package/dist/extensions/request-headers.js +62 -0
  15. package/dist/extensions/request-headers.mjs +28 -0
  16. package/dist/extensions/session.d.ts.map +1 -1
  17. package/dist/extensions/session.js +2 -1
  18. package/dist/extensions/session.mjs +2 -1
  19. package/dist/extensions/transport-identity.d.ts +8 -3
  20. package/dist/extensions/transport-identity.d.ts.map +1 -1
  21. package/dist/extensions/transport-identity.js +2 -1
  22. package/dist/extensions/transport-identity.mjs +2 -1
  23. package/dist/index.d.ts +2 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +11 -7
  26. package/dist/index.mjs +2 -1
  27. package/dist/types.d.ts +19 -0
  28. package/dist/types.d.ts.map +1 -1
  29. package/dist/version.d.ts +1 -1
  30. package/dist/version.js +1 -1
  31. package/dist/version.mjs +1 -1
  32. package/package.json +2 -2
  33. package/src/extensions/compatibility.ts +25 -24
  34. package/src/extensions/detect.ts +78 -0
  35. package/src/extensions/instrumentation.ts +3 -2
  36. package/src/extensions/request-headers.ts +76 -0
  37. package/src/extensions/session.ts +2 -1
  38. package/src/extensions/transport-identity.ts +10 -4
  39. package/src/index.ts +4 -0
  40. package/src/types.ts +18 -0
  41. package/src/version.ts +1 -1
package/README.md CHANGED
@@ -67,6 +67,45 @@ if (body?.method === 'initialize' && !req.headers[MCP_SESSION_HEADER]) {
67
67
 
68
68
  Details: [docs/ARCHITECTURE.md §4](./docs/ARCHITECTURE.md).
69
69
 
70
+ ## MCP TypeScript SDK v2
71
+
72
+ `instrument()` works on both SDK majors — `@modelcontextprotocol/sdk` v1 and
73
+ `@modelcontextprotocol/{core,server,client}` v2 — and on both the high-level `McpServer` and the
74
+ low-level `Server`. Shapes are detected at runtime, so neither major is a dependency here.
75
+
76
+ ### Reading request headers in a callback
77
+
78
+ If your `identify`, `intentFallback`, `eventProperties` or `beforeSend` reads HTTP headers, it has
79
+ to change. The two majors put the request in different places and in different shapes: v1 attaches
80
+ a plain object at `extra.requestInfo.headers`, v2 attaches the WHATWG `Request` at `extra.http.req`,
81
+ whose `headers` only answers to `.get()`. A v1-shaped read returns `undefined` on v2 — an
82
+ `identify()` written that way returns `null` and every event goes anonymous.
83
+
84
+ The SDK hands your callback whatever the MCP SDK handed it, unchanged; it does **not** fake a v1
85
+ shape on v2, because a partially synthesised `requestInfo` is a more convincing lie than an absent
86
+ one. Read headers through the exported helper instead, which handles both majors, lowercases keys,
87
+ and duck-types `Headers` so it also works on edge runtimes:
88
+
89
+ ```ts
90
+ import { getRequestHeaders } from '@posthog/mcp'
91
+
92
+ identify: async (request, extra) => {
93
+ const auth = getRequestHeaders(extra)?.['authorization'] // v1 and v2
94
+ // ...
95
+ }
96
+ ```
97
+
98
+ ### If you switched to `instrument(server.server)`
99
+
100
+ Before v2 support landed, the compatibility gate rejected high-level v2 servers, and the usual
101
+ workaround was to instrument the underlying low-level server. `instrument(server)` now works, so
102
+ you can go back to the documented call.
103
+
104
+ Whether the workaround costs you anything depends on your stack: instrumenting the low-level server
105
+ skips the high-level tool registry, so tool descriptions and callback-level wrapping come only from
106
+ what is advertised over `tools/list`. If your framework never calls `registerTool()` — `@rekog/mcp-nest`
107
+ does not — the registry is empty and the two calls behave the same.
108
+
70
109
  ## Developing locally
71
110
 
72
111
  To test local changes in a consumer app (e.g. a dummy MCP server), symlink **both**
@@ -1 +1 @@
1
- {"version":3,"file":"compatibility.d.ts","sourceRoot":"","sources":["../../src/extensions/compatibility.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3C;;;;;;;;;;;GAWG;AAEH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAI9D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,YAAY,GAAG;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAIpG;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,YAAY,CAExE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAG,aAAa,GAAG,sBAAsB,CA6BhH;AAoDD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAanE"}
1
+ {"version":3,"file":"compatibility.d.ts","sourceRoot":"","sources":["../../src/extensions/compatibility.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAWrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE3C;;;;;;;;;;;GAWG;AAEH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAI9D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,YAAY,GAAG;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAEpG;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,YAAY,CAExE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAG,aAAa,GAAG,sBAAsB,CAiChH;AAyCD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAanE"}
@@ -24,20 +24,21 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- getMCPCompatibleErrorMessage: ()=>getMCPCompatibleErrorMessage,
28
- isCompatibleServerType: ()=>isCompatibleServerType,
29
- isHighLevelServer: ()=>isHighLevelServer,
30
27
  isLowLevelServer: ()=>isLowLevelServer,
31
- logCompatibilityWarning: ()=>logCompatibilityWarning
28
+ isHighLevelServer: ()=>isHighLevelServer,
29
+ logCompatibilityWarning: ()=>logCompatibilityWarning,
30
+ isCompatibleServerType: ()=>isCompatibleServerType,
31
+ getMCPCompatibleErrorMessage: ()=>getMCPCompatibleErrorMessage
32
32
  });
33
+ const external_detect_js_namespaceObject = require("./detect.js");
33
34
  function logCompatibilityWarning(logger) {
34
35
  logger('PostHog MCP analytics SDK Compatibility: This version only supports Model Context Protocol TypeScript SDK v1.11 and above. Please upgrade if using an older version.');
35
36
  }
36
37
  function isHighLevelServer(server) {
37
- return !!server && 'object' == typeof server && 'server' in server && !!server.server && 'object' == typeof server.server;
38
+ return (0, external_detect_js_namespaceObject.hasNestedLowLevelServer)(server);
38
39
  }
39
40
  function isLowLevelServer(server) {
40
- return !!server && 'object' == typeof server && !('server' in server);
41
+ return (0, external_detect_js_namespaceObject.isBareServerShape)(server);
41
42
  }
42
43
  function isCompatibleServerType(server, logger) {
43
44
  if (!server || 'object' != typeof server) {
@@ -45,13 +46,13 @@ function isCompatibleServerType(server, logger) {
45
46
  throw new Error("PostHog MCP analytics SDK compatibility error: Server must be an object. Ensure you're using MCP SDK v1.11 or higher.");
46
47
  }
47
48
  if (isHighLevelServer(server)) {
48
- if (!server._registeredTools || 'object' != typeof server._registeredTools) {
49
+ if (!(0, external_detect_js_namespaceObject.hasToolRegistry)(server)) {
49
50
  logCompatibilityWarning(logger);
50
51
  throw new Error('PostHog MCP analytics SDK compatibility error: High-level server must have _registeredTools object. This requires MCP SDK v1.11 or higher.');
51
52
  }
52
- if ('function' != typeof server.tool) {
53
+ if (!(0, external_detect_js_namespaceObject.canRegisterTools)(server)) {
53
54
  logCompatibilityWarning(logger);
54
- throw new Error('PostHog MCP analytics SDK compatibility error: High-level server must have tool() method. This requires MCP SDK v1.11 or higher.');
55
+ throw new Error('PostHog MCP analytics SDK compatibility error: High-level server must have a registerTool() or tool() method. This requires MCP SDK v1.11 or higher.');
55
56
  }
56
57
  const targetServer = server.server;
57
58
  validateLowLevelServer(targetServer, logger);
@@ -65,24 +66,19 @@ function validateLowLevelServer(server, logger) {
65
66
  logCompatibilityWarning(logger);
66
67
  throw new Error("PostHog MCP analytics SDK compatibility error: Server must be an object. Ensure you're using MCP SDK v1.11 or higher.");
67
68
  }
68
- const serverRecord = server;
69
- if ('function' != typeof serverRecord.setRequestHandler) {
69
+ if (!(0, external_detect_js_namespaceObject.canSetRequestHandler)(server)) {
70
70
  logCompatibilityWarning(logger);
71
71
  throw new Error('PostHog MCP analytics SDK compatibility error: Server must have a setRequestHandler method. This requires MCP SDK v1.11 or higher.');
72
72
  }
73
- if (!(serverRecord._requestHandlers && serverRecord._requestHandlers instanceof Map)) {
73
+ if (!(0, external_detect_js_namespaceObject.hasRequestHandlerMap)(server)) {
74
74
  logCompatibilityWarning(logger);
75
75
  throw new Error('PostHog MCP analytics SDK compatibility error: Server._requestHandlers is not accessible. This requires MCP SDK v1.11 or higher.');
76
76
  }
77
- if ('function' != typeof serverRecord._requestHandlers.get) {
78
- logCompatibilityWarning(logger);
79
- throw new Error('PostHog MCP analytics SDK compatibility error: Server._requestHandlers must be a Map with a get method. This requires MCP SDK v1.11 or higher.');
80
- }
81
- if ('function' != typeof serverRecord.getClientVersion) {
77
+ if (!(0, external_detect_js_namespaceObject.hasClientVersionAccessor)(server)) {
82
78
  logCompatibilityWarning(logger);
83
79
  throw new Error('PostHog MCP analytics SDK compatibility error: Server.getClientVersion must be a function. This requires MCP SDK v1.11 or higher.');
84
80
  }
85
- if (!serverRecord._serverInfo || 'object' != typeof serverRecord._serverInfo || !('name' in serverRecord._serverInfo)) {
81
+ if (!(0, external_detect_js_namespaceObject.hasServerInfo)(server)) {
86
82
  logCompatibilityWarning(logger);
87
83
  throw new Error('PostHog MCP analytics SDK compatibility error: Server._serverInfo is not accessible or missing name. This requires MCP SDK v1.11 or higher.');
88
84
  }
@@ -1,11 +1,12 @@
1
+ import { canRegisterTools, canSetRequestHandler, hasClientVersionAccessor, hasNestedLowLevelServer, hasRequestHandlerMap, hasServerInfo, hasToolRegistry, isBareServerShape } from "./detect.mjs";
1
2
  function logCompatibilityWarning(logger) {
2
3
  logger('PostHog MCP analytics SDK Compatibility: This version only supports Model Context Protocol TypeScript SDK v1.11 and above. Please upgrade if using an older version.');
3
4
  }
4
5
  function isHighLevelServer(server) {
5
- return !!server && 'object' == typeof server && 'server' in server && !!server.server && 'object' == typeof server.server;
6
+ return hasNestedLowLevelServer(server);
6
7
  }
7
8
  function isLowLevelServer(server) {
8
- return !!server && 'object' == typeof server && !('server' in server);
9
+ return isBareServerShape(server);
9
10
  }
10
11
  function isCompatibleServerType(server, logger) {
11
12
  if (!server || 'object' != typeof server) {
@@ -13,13 +14,13 @@ function isCompatibleServerType(server, logger) {
13
14
  throw new Error("PostHog MCP analytics SDK compatibility error: Server must be an object. Ensure you're using MCP SDK v1.11 or higher.");
14
15
  }
15
16
  if (isHighLevelServer(server)) {
16
- if (!server._registeredTools || 'object' != typeof server._registeredTools) {
17
+ if (!hasToolRegistry(server)) {
17
18
  logCompatibilityWarning(logger);
18
19
  throw new Error('PostHog MCP analytics SDK compatibility error: High-level server must have _registeredTools object. This requires MCP SDK v1.11 or higher.');
19
20
  }
20
- if ('function' != typeof server.tool) {
21
+ if (!canRegisterTools(server)) {
21
22
  logCompatibilityWarning(logger);
22
- throw new Error('PostHog MCP analytics SDK compatibility error: High-level server must have tool() method. This requires MCP SDK v1.11 or higher.');
23
+ throw new Error('PostHog MCP analytics SDK compatibility error: High-level server must have a registerTool() or tool() method. This requires MCP SDK v1.11 or higher.');
23
24
  }
24
25
  const targetServer = server.server;
25
26
  validateLowLevelServer(targetServer, logger);
@@ -33,24 +34,19 @@ function validateLowLevelServer(server, logger) {
33
34
  logCompatibilityWarning(logger);
34
35
  throw new Error("PostHog MCP analytics SDK compatibility error: Server must be an object. Ensure you're using MCP SDK v1.11 or higher.");
35
36
  }
36
- const serverRecord = server;
37
- if ('function' != typeof serverRecord.setRequestHandler) {
37
+ if (!canSetRequestHandler(server)) {
38
38
  logCompatibilityWarning(logger);
39
39
  throw new Error('PostHog MCP analytics SDK compatibility error: Server must have a setRequestHandler method. This requires MCP SDK v1.11 or higher.');
40
40
  }
41
- if (!(serverRecord._requestHandlers && serverRecord._requestHandlers instanceof Map)) {
41
+ if (!hasRequestHandlerMap(server)) {
42
42
  logCompatibilityWarning(logger);
43
43
  throw new Error('PostHog MCP analytics SDK compatibility error: Server._requestHandlers is not accessible. This requires MCP SDK v1.11 or higher.');
44
44
  }
45
- if ('function' != typeof serverRecord._requestHandlers.get) {
46
- logCompatibilityWarning(logger);
47
- throw new Error('PostHog MCP analytics SDK compatibility error: Server._requestHandlers must be a Map with a get method. This requires MCP SDK v1.11 or higher.');
48
- }
49
- if ('function' != typeof serverRecord.getClientVersion) {
45
+ if (!hasClientVersionAccessor(server)) {
50
46
  logCompatibilityWarning(logger);
51
47
  throw new Error('PostHog MCP analytics SDK compatibility error: Server.getClientVersion must be a function. This requires MCP SDK v1.11 or higher.');
52
48
  }
53
- if (!serverRecord._serverInfo || 'object' != typeof serverRecord._serverInfo || !('name' in serverRecord._serverInfo)) {
49
+ if (!hasServerInfo(server)) {
54
50
  logCompatibilityWarning(logger);
55
51
  throw new Error('PostHog MCP analytics SDK compatibility error: Server._serverInfo is not accessible or missing name. This requires MCP SDK v1.11 or higher.');
56
52
  }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Structural feature probes.
3
+ *
4
+ * Every question about the shape of a server object is answered here, by
5
+ * duck-typing the object in front of us — never by reading a package version or
6
+ * a protocol constant. Two reasons this is a rule and not a preference:
7
+ *
8
+ * - The two SDK majors expose the same capability under different names (v1's
9
+ * `.tool()` vs v2's `.registerTool()`), so "which SDK is installed" answers a
10
+ * different question than "can this object register a tool".
11
+ * - A single v2 server serves both protocol eras, request by request, so no
12
+ * module-level constant describes it. v2's exported `LATEST_PROTOCOL_VERSION`
13
+ * is `2025-11-25`.
14
+ *
15
+ * Nothing here imports `@modelcontextprotocol/*`; that boundary is pinned by
16
+ * `sdk-import-boundary.test.ts`.
17
+ */
18
+ type UnknownRecord = Record<string, unknown>;
19
+ /** A high-level `McpServer` wrapper: it holds the low-level server on `.server`. */
20
+ export declare function hasNestedLowLevelServer(server: unknown): server is UnknownRecord & {
21
+ server: UnknownRecord;
22
+ };
23
+ /** No `.server` property, so the object is itself the low-level `Server`. */
24
+ export declare function isBareServerShape(server: unknown): boolean;
25
+ /** The high-level registry we read tool metadata from and wrap callbacks in. */
26
+ export declare function hasToolRegistry(server: unknown): boolean;
27
+ /**
28
+ * The object can register a tool.
29
+ *
30
+ * v1 offers both `tool()` and `registerTool()`; v2 dropped the deprecated
31
+ * `tool()` and keeps only `registerTool()`. Requiring `tool()` specifically is
32
+ * what made `instrument()` reject every v2 high-level server — and, because
33
+ * `instrument()` swallows compatibility errors, reject it silently.
34
+ */
35
+ export declare function canRegisterTools(server: unknown): boolean;
36
+ /** Handler registration, which we patch to wrap late registrations. */
37
+ export declare function canSetRequestHandler(server: unknown): boolean;
38
+ /** The live handler map we read and write directly. A real `Map` on both majors. */
39
+ export declare function hasRequestHandlerMap(server: unknown): boolean;
40
+ /** `getClientVersion()` — still present on v2, and a link in B1's identity chain. */
41
+ export declare function hasClientVersionAccessor(server: unknown): boolean;
42
+ /** `_serverInfo`, which names the server on every event. */
43
+ export declare function hasServerInfo(server: unknown): boolean;
44
+ export {};
45
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/extensions/detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAU5C,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,aAAa,GAAG;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,CAG5G;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAG1D;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAExD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAEzD;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAE7D;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAG7D;AAED,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAEjE;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAGtD"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ canRegisterTools: ()=>canRegisterTools,
28
+ canSetRequestHandler: ()=>canSetRequestHandler,
29
+ hasClientVersionAccessor: ()=>hasClientVersionAccessor,
30
+ hasNestedLowLevelServer: ()=>hasNestedLowLevelServer,
31
+ hasRequestHandlerMap: ()=>hasRequestHandlerMap,
32
+ hasServerInfo: ()=>hasServerInfo,
33
+ hasToolRegistry: ()=>hasToolRegistry,
34
+ isBareServerShape: ()=>isBareServerShape
35
+ });
36
+ function asRecord(value) {
37
+ return value && 'object' == typeof value ? value : void 0;
38
+ }
39
+ function hasMethod(value, key) {
40
+ return 'function' == typeof asRecord(value)?.[key];
41
+ }
42
+ function hasNestedLowLevelServer(server) {
43
+ const record = asRecord(server);
44
+ return !!record && 'server' in record && !!asRecord(record.server);
45
+ }
46
+ function isBareServerShape(server) {
47
+ const record = asRecord(server);
48
+ return !!record && !('server' in record);
49
+ }
50
+ function hasToolRegistry(server) {
51
+ return !!asRecord(asRecord(server)?._registeredTools);
52
+ }
53
+ function canRegisterTools(server) {
54
+ return hasMethod(server, 'registerTool') || hasMethod(server, 'tool');
55
+ }
56
+ function canSetRequestHandler(server) {
57
+ return hasMethod(server, 'setRequestHandler');
58
+ }
59
+ function hasRequestHandlerMap(server) {
60
+ const handlers = asRecord(server)?._requestHandlers;
61
+ return handlers instanceof Map && 'function' == typeof handlers.get;
62
+ }
63
+ function hasClientVersionAccessor(server) {
64
+ return hasMethod(server, 'getClientVersion');
65
+ }
66
+ function hasServerInfo(server) {
67
+ const info = asRecord(asRecord(server)?._serverInfo);
68
+ return !!info && 'name' in info;
69
+ }
70
+ exports.canRegisterTools = __webpack_exports__.canRegisterTools;
71
+ exports.canSetRequestHandler = __webpack_exports__.canSetRequestHandler;
72
+ exports.hasClientVersionAccessor = __webpack_exports__.hasClientVersionAccessor;
73
+ exports.hasNestedLowLevelServer = __webpack_exports__.hasNestedLowLevelServer;
74
+ exports.hasRequestHandlerMap = __webpack_exports__.hasRequestHandlerMap;
75
+ exports.hasServerInfo = __webpack_exports__.hasServerInfo;
76
+ exports.hasToolRegistry = __webpack_exports__.hasToolRegistry;
77
+ exports.isBareServerShape = __webpack_exports__.isBareServerShape;
78
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
79
+ "canRegisterTools",
80
+ "canSetRequestHandler",
81
+ "hasClientVersionAccessor",
82
+ "hasNestedLowLevelServer",
83
+ "hasRequestHandlerMap",
84
+ "hasServerInfo",
85
+ "hasToolRegistry",
86
+ "isBareServerShape"
87
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
88
+ Object.defineProperty(exports, '__esModule', {
89
+ value: true
90
+ });
@@ -0,0 +1,35 @@
1
+ function asRecord(value) {
2
+ return value && 'object' == typeof value ? value : void 0;
3
+ }
4
+ function hasMethod(value, key) {
5
+ return 'function' == typeof asRecord(value)?.[key];
6
+ }
7
+ function hasNestedLowLevelServer(server) {
8
+ const record = asRecord(server);
9
+ return !!record && 'server' in record && !!asRecord(record.server);
10
+ }
11
+ function isBareServerShape(server) {
12
+ const record = asRecord(server);
13
+ return !!record && !('server' in record);
14
+ }
15
+ function hasToolRegistry(server) {
16
+ return !!asRecord(asRecord(server)?._registeredTools);
17
+ }
18
+ function canRegisterTools(server) {
19
+ return hasMethod(server, 'registerTool') || hasMethod(server, 'tool');
20
+ }
21
+ function canSetRequestHandler(server) {
22
+ return hasMethod(server, 'setRequestHandler');
23
+ }
24
+ function hasRequestHandlerMap(server) {
25
+ const handlers = asRecord(server)?._requestHandlers;
26
+ return handlers instanceof Map && 'function' == typeof handlers.get;
27
+ }
28
+ function hasClientVersionAccessor(server) {
29
+ return hasMethod(server, 'getClientVersion');
30
+ }
31
+ function hasServerInfo(server) {
32
+ const info = asRecord(asRecord(server)?._serverInfo);
33
+ return !!info && 'name' in info;
34
+ }
35
+ export { canRegisterTools, canSetRequestHandler, hasClientVersionAccessor, hasNestedLowLevelServer, hasRequestHandlerMap, hasServerInfo, hasToolRegistry, isBareServerShape };
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"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"}
@@ -47,6 +47,7 @@ const external_intent_js_namespaceObject = require("./intent.js");
47
47
  const external_internal_js_namespaceObject = require("./internal.js");
48
48
  const external_mcp_payloads_js_namespaceObject = require("./mcp-payloads.js");
49
49
  const external_mcp_sdk_compat_js_namespaceObject = require("./mcp-sdk-compat.js");
50
+ const external_request_headers_js_namespaceObject = require("./request-headers.js");
50
51
  const external_session_js_namespaceObject = require("./session.js");
51
52
  const external_session_token_js_namespaceObject = require("./session-token.js");
52
53
  const external_tools_js_namespaceObject = require("./tools.js");
@@ -326,8 +327,8 @@ function cacheToolCategories(cache, tools) {
326
327
  }
327
328
  function mintStatelessSessionOnInitialize(server, data, request, extra) {
328
329
  try {
329
- const headers = extra?.requestInfo?.headers;
330
- if (!headers || 'object' != typeof headers) return;
330
+ const headers = (0, external_request_headers_js_namespaceObject.getRequestHeaders)(extra);
331
+ if (!headers) return;
331
332
  if ((0, external_session_token_js_namespaceObject.readMcpSessionHeader)(headers)) return;
332
333
  const transport = server.transport;
333
334
  if (!transport || extra?.sessionId || transport.sessionId) return;
@@ -11,6 +11,7 @@ import { resolveToolCallIntent, setEventIntent, setExplicitContextIntent } from
11
11
  import { getServerTrackingData, handleIdentify, setServerTrackingData, withIdentity } from "./internal.mjs";
12
12
  import { buildCapturedMcpParameters } from "./mcp-payloads.mjs";
13
13
  import { readRequestHandlerMethod } from "./mcp-sdk-compat.mjs";
14
+ import { getRequestHeaders } from "./request-headers.mjs";
14
15
  import { getSessionId, getSessionInfo, newSessionId } from "./session.mjs";
15
16
  import { encodeSessionId, readMcpSessionHeader, writeSessionIdToTransport } from "./session-token.mjs";
16
17
  import { getReportMissingToolDescriptor, resolveMissingCapabilityToolName } from "./tools.mjs";
@@ -290,8 +291,8 @@ function cacheToolCategories(cache, tools) {
290
291
  }
291
292
  function mintStatelessSessionOnInitialize(server, data, request, extra) {
292
293
  try {
293
- const headers = extra?.requestInfo?.headers;
294
- if (!headers || 'object' != typeof headers) return;
294
+ const headers = getRequestHeaders(extra);
295
+ if (!headers) return;
295
296
  if (readMcpSessionHeader(headers)) return;
296
297
  const transport = server.transport;
297
298
  if (!transport || extra?.sessionId || transport.sessionId) return;
@@ -0,0 +1,36 @@
1
+ import type { RequestHeaderBag } from '../types';
2
+ /**
3
+ * Reads the HTTP request headers off the `extra` (v1) / `ctx` (v2) object the
4
+ * MCP SDK hands a request handler, and returns them as a plain object with
5
+ * lowercase keys. Returns `undefined` when the request did not come over HTTP —
6
+ * stdio and in-memory transports carry no headers at all.
7
+ *
8
+ * The two SDK majors put them in different places and in different shapes: v1
9
+ * attaches a plain object at `extra.requestInfo.headers`, while v2 attaches the
10
+ * WHATWG `Request` at `ctx.http.req`, whose `headers` is a `Headers` instance
11
+ * that only answers to `.get()`. A v1-shaped read returns `undefined` on v2,
12
+ * which is why this exists.
13
+ *
14
+ * Normalisation is **by shape, not by source**: a framework is free to hand us a
15
+ * plain object where the SDK hands `Headers`, so both fields are checked for
16
+ * both shapes. `Headers` is duck-typed on `.entries` rather than `instanceof` —
17
+ * workerd and other edge runtimes are a different realm and would fail the
18
+ * identity check on a perfectly good object.
19
+ *
20
+ * Exported from the package for host callbacks. `identify`, `intentFallback`,
21
+ * `eventProperties` and `beforeSend` receive the SDK's `extra` unchanged — we
22
+ * deliberately do not synthesise a v1 shape on v2, because a fabricated
23
+ * `requestInfo` is a convincing partial lie about a shape the SDK removed on
24
+ * purpose. So a host that reads headers reads them through this instead:
25
+ *
26
+ * ```ts
27
+ * import { getRequestHeaders } from '@posthog/mcp'
28
+ *
29
+ * identify: async (request, extra) => {
30
+ * const auth = getRequestHeaders(extra)?.['authorization']
31
+ * // ...
32
+ * }
33
+ * ```
34
+ */
35
+ export declare function getRequestHeaders(extra: unknown): RequestHeaderBag | undefined;
36
+ //# sourceMappingURL=request-headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-headers.d.ts","sourceRoot":"","sources":["../../src/extensions/request-headers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,GAAG,SAAS,CAY9E"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ getRequestHeaders: ()=>getRequestHeaders
28
+ });
29
+ function getRequestHeaders(extra) {
30
+ if (!extra || 'object' != typeof extra) return;
31
+ const record = extra;
32
+ const http = record.http;
33
+ const requestInfo = record.requestInfo;
34
+ const source = http?.req?.headers ?? requestInfo?.headers;
35
+ if (!source || 'object' != typeof source) return;
36
+ return toHeaderBag(source);
37
+ }
38
+ function toHeaderBag(source) {
39
+ try {
40
+ const entries = isHeadersLike(source) ? [
41
+ ...source.entries()
42
+ ] : Object.entries(source);
43
+ const bag = {};
44
+ for (const [key, value] of entries)if ('string' == typeof key && null != value) {
45
+ if ('string' == typeof value || Array.isArray(value)) bag[key.toLowerCase()] = value;
46
+ }
47
+ return bag;
48
+ } catch {
49
+ return;
50
+ }
51
+ }
52
+ function isHeadersLike(source) {
53
+ const candidate = source;
54
+ return 'function' == typeof candidate.entries && 'function' == typeof candidate.get;
55
+ }
56
+ exports.getRequestHeaders = __webpack_exports__.getRequestHeaders;
57
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
58
+ "getRequestHeaders"
59
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
60
+ Object.defineProperty(exports, '__esModule', {
61
+ value: true
62
+ });
@@ -0,0 +1,28 @@
1
+ function getRequestHeaders(extra) {
2
+ if (!extra || 'object' != typeof extra) return;
3
+ const record = extra;
4
+ const http = record.http;
5
+ const requestInfo = record.requestInfo;
6
+ const source = http?.req?.headers ?? requestInfo?.headers;
7
+ if (!source || 'object' != typeof source) return;
8
+ return toHeaderBag(source);
9
+ }
10
+ function toHeaderBag(source) {
11
+ try {
12
+ const entries = isHeadersLike(source) ? [
13
+ ...source.entries()
14
+ ] : Object.entries(source);
15
+ const bag = {};
16
+ for (const [key, value] of entries)if ('string' == typeof key && null != value) {
17
+ if ('string' == typeof value || Array.isArray(value)) bag[key.toLowerCase()] = value;
18
+ }
19
+ return bag;
20
+ } catch {
21
+ return;
22
+ }
23
+ }
24
+ function isHeadersLike(source) {
25
+ const candidate = source;
26
+ return 'function' == typeof candidate.entries && 'function' == typeof candidate.get;
27
+ }
28
+ export { getRequestHeaders };
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/extensions/session.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,6BAA6B,EAC7B,gBAAgB,EAChB,aAAa,EAEb,WAAW,EACZ,MAAM,UAAU,CAAA;AAOjB,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,+BAA+B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,EACrB,KAAK,CAAC,EAAE,6BAA6B,EACrC,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAgCR;AAuED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,gBAAgB,GAAG,SAAS,EAClC,SAAS,CAAC,EAAE,MAAM,GACjB,WAAW,CAmCb"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/extensions/session.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,6BAA6B,EAC7B,gBAAgB,EAChB,aAAa,EAEb,WAAW,EACZ,MAAM,UAAU,CAAA;AAQjB,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,+BAA+B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,aAAa,EACrB,KAAK,CAAC,EAAE,6BAA6B,EACrC,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAgCR;AAuED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,gBAAgB,GAAG,SAAS,EAClC,SAAS,CAAC,EAAE,MAAM,GACjB,WAAW,CAmCb"}
@@ -34,6 +34,7 @@ const external_version_js_namespaceObject = require("../version.js");
34
34
  const external_constants_js_namespaceObject = require("./constants.js");
35
35
  const external_ids_js_namespaceObject = require("./ids.js");
36
36
  const external_internal_js_namespaceObject = require("./internal.js");
37
+ const external_request_headers_js_namespaceObject = require("./request-headers.js");
37
38
  const external_session_token_js_namespaceObject = require("./session-token.js");
38
39
  function newSessionId() {
39
40
  return (0, external_ids_js_namespaceObject.newPrefixedId)('ses');
@@ -59,7 +60,7 @@ function getSessionId(server, extra, conversationId) {
59
60
  return sessionId;
60
61
  }
61
62
  function applyTokenClientIdentity(data, extra) {
62
- const token = (0, external_session_token_js_namespaceObject.decodeSessionId)((0, external_session_token_js_namespaceObject.readMcpSessionHeader)(extra?.requestInfo?.headers));
63
+ const token = (0, external_session_token_js_namespaceObject.decodeSessionId)((0, external_session_token_js_namespaceObject.readMcpSessionHeader)((0, external_request_headers_js_namespaceObject.getRequestHeaders)(extra)));
63
64
  if (!token) return;
64
65
  data.sessionInfo.clientName = token.clientName;
65
66
  data.sessionInfo.clientVersion = token.clientVersion;
@@ -2,6 +2,7 @@ import { version } from "../version.mjs";
2
2
  import { INACTIVITY_TIMEOUT_IN_MINUTES } from "./constants.mjs";
3
3
  import { deterministicPrefixedId, newPrefixedId } from "./ids.mjs";
4
4
  import { getServerTrackingData, setServerTrackingData } from "./internal.mjs";
5
+ import { getRequestHeaders } from "./request-headers.mjs";
5
6
  import { decodeSessionId, readMcpSessionHeader } from "./session-token.mjs";
6
7
  function newSessionId() {
7
8
  return newPrefixedId('ses');
@@ -27,7 +28,7 @@ function getSessionId(server, extra, conversationId) {
27
28
  return sessionId;
28
29
  }
29
30
  function applyTokenClientIdentity(data, extra) {
30
- const token = decodeSessionId(readMcpSessionHeader(extra?.requestInfo?.headers));
31
+ const token = decodeSessionId(readMcpSessionHeader(getRequestHeaders(extra)));
31
32
  if (!token) return;
32
33
  data.sessionInfo.clientName = token.clientName;
33
34
  data.sessionInfo.clientVersion = token.clientVersion;
@@ -37,9 +37,14 @@ export interface TransportIdentity {
37
37
  vendorClient?: string;
38
38
  }
39
39
  /**
40
- * Reads the transport identity headers off `extra.requestInfo.headers`. Returns
41
- * `undefined` when the request carries neither — including every stdio and
42
- * in-memory request, which has no `requestInfo` at all. Never throws.
40
+ * Reads the transport identity headers off the request. Returns `undefined`
41
+ * when the request carries neither — including every stdio and in-memory
42
+ * request, which has no HTTP headers at all. Never throws.
43
+ *
44
+ * Sourced through `getRequestHeaders` rather than `extra.requestInfo.headers`
45
+ * directly: MCP SDK v2 puts the request at `extra.http.req` as a WHATWG
46
+ * `Request`, so a v1-shaped read finds nothing and this whole feature would be
47
+ * silently inert on exactly the servers being adopted now.
43
48
  */
44
49
  export declare function readTransportIdentity(extra: CompatibleRequestHandlerExtra | undefined): TransportIdentity | undefined;
45
50
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"transport-identity.d.ts","sourceRoot":"","sources":["../../src/extensions/transport-identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAGvE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,eAAe,CAAA;AAEpD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,uBAAuB,CAAA;AAExD,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,6BAA6B,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAkBrH;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,6BAA6B,GAAG,SAAS,GAAG,IAAI,CAW9G"}
1
+ {"version":3,"file":"transport-identity.d.ts","sourceRoot":"","sources":["../../src/extensions/transport-identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAIvE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,eAAe,CAAA;AAEpD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,uBAAuB,CAAA;AAExD,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,6BAA6B,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAkBrH;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,6BAA6B,GAAG,SAAS,GAAG,IAAI,CAW9G"}
@@ -30,10 +30,11 @@ __webpack_require__.d(__webpack_exports__, {
30
30
  readTransportIdentity: ()=>readTransportIdentity
31
31
  });
32
32
  const external_headers_js_namespaceObject = require("./headers.js");
33
+ const external_request_headers_js_namespaceObject = require("./request-headers.js");
33
34
  const CLIENT_USER_AGENT_HEADER = 'user-agent';
34
35
  const VENDOR_CLIENT_HEADER = 'x-anthropic-client';
35
36
  function readTransportIdentity(extra) {
36
- const headers = extra?.requestInfo?.headers;
37
+ const headers = (0, external_request_headers_js_namespaceObject.getRequestHeaders)(extra);
37
38
  if (!headers) return;
38
39
  const result = {};
39
40
  const clientUserAgent = (0, external_headers_js_namespaceObject.readHeaderValue)(headers, CLIENT_USER_AGENT_HEADER);