@posthog/mcp 0.9.1 → 0.10.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 (49) hide show
  1. package/dist/extensions/capture.d.ts.map +1 -1
  2. package/dist/extensions/capture.js +3 -2
  3. package/dist/extensions/capture.mjs +3 -2
  4. package/dist/extensions/client-identity.d.ts +39 -0
  5. package/dist/extensions/client-identity.d.ts.map +1 -0
  6. package/dist/extensions/client-identity.js +68 -0
  7. package/dist/extensions/client-identity.mjs +25 -0
  8. package/dist/extensions/constants.d.ts +1 -0
  9. package/dist/extensions/constants.d.ts.map +1 -1
  10. package/dist/extensions/constants.js +1 -0
  11. package/dist/extensions/constants.mjs +1 -0
  12. package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
  13. package/dist/extensions/instrumentation.d.ts.map +1 -1
  14. package/dist/extensions/instrumentation.js +37 -2
  15. package/dist/extensions/instrumentation.mjs +37 -2
  16. package/dist/extensions/internal.d.ts.map +1 -1
  17. package/dist/extensions/internal.js +2 -0
  18. package/dist/extensions/internal.mjs +2 -0
  19. package/dist/extensions/posthog-events.js +2 -0
  20. package/dist/extensions/posthog-events.mjs +2 -0
  21. package/dist/extensions/posthog-mcp.js +1 -0
  22. package/dist/extensions/posthog-mcp.mjs +1 -0
  23. package/dist/extensions/session-token.d.ts +7 -0
  24. package/dist/extensions/session-token.d.ts.map +1 -1
  25. package/dist/extensions/session-token.js +2 -0
  26. package/dist/extensions/session-token.mjs +2 -0
  27. package/dist/extensions/session.d.ts.map +1 -1
  28. package/dist/extensions/session.js +2 -0
  29. package/dist/extensions/session.mjs +2 -0
  30. package/dist/types.d.ts +17 -0
  31. package/dist/types.d.ts.map +1 -1
  32. package/dist/version.d.ts +1 -1
  33. package/dist/version.d.ts.map +1 -1
  34. package/dist/version.js +1 -1
  35. package/dist/version.mjs +1 -1
  36. package/package.json +4 -4
  37. package/src/extensions/capture.ts +9 -2
  38. package/src/extensions/client-identity.ts +81 -0
  39. package/src/extensions/constants.ts +1 -0
  40. package/src/extensions/instrument-highlevel.ts +9 -3
  41. package/src/extensions/instrumentation.ts +83 -7
  42. package/src/extensions/internal.ts +2 -0
  43. package/src/extensions/mcp-sdk-compat.ts +1 -1
  44. package/src/extensions/posthog-events.ts +8 -0
  45. package/src/extensions/posthog-mcp.ts +1 -0
  46. package/src/extensions/session-token.ts +15 -1
  47. package/src/extensions/session.ts +4 -0
  48. package/src/types.ts +17 -0
  49. package/src/version.ts +1 -1
package/dist/types.d.ts CHANGED
@@ -142,6 +142,12 @@ export interface Event {
142
142
  listedToolNames?: string[];
143
143
  parameters?: unknown;
144
144
  properties?: JsonRecord | null;
145
+ /**
146
+ * Negotiated MCP protocol (spec) version → `$mcp_protocol_version`. Learned at
147
+ * `initialize` and carried onto every event for the session (see SessionInfo) —
148
+ * used to track spec adoption and to slice event metrics by spec version.
149
+ */
150
+ protocolVersion?: string;
145
151
  resourceName?: string;
146
152
  response?: unknown;
147
153
  sdkLanguage?: string;
@@ -224,6 +230,11 @@ export interface SessionInfo {
224
230
  identifyActorGivenId?: string;
225
231
  identifyActorGroups?: Record<string, string>;
226
232
  ipAddress?: string;
233
+ /**
234
+ * Negotiated MCP protocol (spec) version, learned at `initialize` and carried
235
+ * forward for the session (across pods via the session token) → `$mcp_protocol_version`.
236
+ */
237
+ protocolVersion?: string;
227
238
  sdkLanguage?: string;
228
239
  sdkVersion?: string;
229
240
  serverName?: string;
@@ -264,6 +275,12 @@ export interface McpCaptureCommon {
264
275
  distinctId?: string;
265
276
  /** Session id → `$session_id`. Omitted from the event entirely when not provided. */
266
277
  sessionId?: string;
278
+ /**
279
+ * Negotiated MCP protocol (spec) version → `$mcp_protocol_version`. Pass it on
280
+ * every capture for the session (like `sessionId`) so later events carry it too,
281
+ * not just the initialize event — the `PostHogMCP` client holds no per-session state.
282
+ */
283
+ protocolVersion?: string;
267
284
  /** Person properties → `$set` (e.g. `{ name, email, plan }`). */
268
285
  setProperties?: JsonRecord;
269
286
  /** Group memberships → `$groups`. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const version = "0.9.1";
1
+ export declare const version = "0.10.1";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAA"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAA"}
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.9.1';
29
+ const version = '0.10.1';
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.9.1';
1
+ const version = '0.10.1';
2
2
  export { version };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/mcp",
3
- "version": "0.9.1",
3
+ "version": "0.10.1",
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.41.1"
31
+ "@posthog/core": "^1.45.1"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@babel/preset-env": "^7.27.1",
@@ -39,8 +39,8 @@
39
39
  "@types/node": "^20.0.0",
40
40
  "jest": "29.7.0",
41
41
  "zod": "^3.25.0",
42
- "posthog-node": "^5.42.0",
43
- "@posthog-tooling/tsconfig-base": "1.1.1"
42
+ "@posthog-tooling/tsconfig-base": "1.1.1",
43
+ "posthog-node": "^5.46.1"
44
44
  },
45
45
  "peerDependencies": {
46
46
  "@modelcontextprotocol/sdk": ">=1.26.0",
@@ -48,12 +48,19 @@ export function captureEvent(server: MCPServerLike, eventInput: McpEvent): Promi
48
48
  sdkVersion: sessionInfo.sdkVersion,
49
49
  serverName: sessionInfo.serverName,
50
50
  serverVersion: sessionInfo.serverVersion,
51
- clientName: sessionInfo.clientName,
52
- clientVersion: sessionInfo.clientVersion,
51
+ // Prefer identity the event captured for *this* request (from `_meta`, see
52
+ // stampMetaClientInfo) over the server-wide sessionInfo, so a concurrent
53
+ // request from another client can't misattribute this one.
54
+ clientName: eventInput.clientName ?? sessionInfo.clientName,
55
+ clientVersion: eventInput.clientVersion ?? sessionInfo.clientVersion,
53
56
  identifyActorGivenId: sessionInfo.identifyActorGivenId,
54
57
  identifyActorData: sessionInfo.identifyActorData,
55
58
  groups: sessionInfo.identifyActorGroups,
56
59
  resourceName: eventInput.resourceName,
60
+ // The `initialize` event sets the negotiated version directly; every other
61
+ // event inherits it from sessionInfo (persisted at initialize, recovered
62
+ // cross-pod from the session token).
63
+ protocolVersion: eventInput.protocolVersion ?? sessionInfo.protocolVersion,
57
64
  toolCategory: eventInput.toolCategory,
58
65
  toolDescription: eventInput.toolDescription,
59
66
  listedToolNames: eventInput.listedToolNames,
@@ -0,0 +1,81 @@
1
+ import type { McpEvent, MCPRequestLike } from '../types'
2
+
3
+ /**
4
+ * Client identity under the MCP 2026-07-28 (stateless) revision.
5
+ *
6
+ * That revision removes the `initialize` handshake and the `Mcp-Session-Id`
7
+ * header (SEP-2575 / SEP-2567). Client name/version and the protocol version no
8
+ * longer arrive once at `initialize` — they travel in every request's
9
+ * `params._meta` under these reverse-DNS keys. We mirror the literal key strings
10
+ * here rather than depend on the (still beta) v2 SDK, which is not a dependency
11
+ * of this package.
12
+ */
13
+ export const META_CLIENT_INFO_KEY = 'io.modelcontextprotocol/clientInfo'
14
+ export const META_PROTOCOL_VERSION_KEY = 'io.modelcontextprotocol/protocolVersion'
15
+
16
+ export interface MetaClientInfo {
17
+ clientName?: string
18
+ clientVersion?: string
19
+ protocolVersion?: string
20
+ }
21
+
22
+ /**
23
+ * Reads the client name/version and protocol version a modern client puts in
24
+ * `params._meta`. Returns `undefined` when the request carries none (e.g. a
25
+ * legacy client, which sends this on `initialize` instead). Never throws.
26
+ */
27
+ export function readMetaClientInfo(request: MCPRequestLike): MetaClientInfo | undefined {
28
+ const meta = request.params?._meta
29
+ if (!meta || typeof meta !== 'object') {
30
+ return undefined
31
+ }
32
+ const record = meta as Record<string, unknown>
33
+ const result: MetaClientInfo = {}
34
+
35
+ const clientInfo = record[META_CLIENT_INFO_KEY]
36
+ if (clientInfo && typeof clientInfo === 'object') {
37
+ const { name, version } = clientInfo as Record<string, unknown>
38
+ if (typeof name === 'string' && name.length > 0) {
39
+ result.clientName = name
40
+ }
41
+ if (typeof version === 'string' && version.length > 0) {
42
+ result.clientVersion = version
43
+ }
44
+ }
45
+
46
+ const protocolVersion = record[META_PROTOCOL_VERSION_KEY]
47
+ if (typeof protocolVersion === 'string' && protocolVersion.length > 0) {
48
+ result.protocolVersion = protocolVersion
49
+ }
50
+
51
+ return result.clientName || result.clientVersion || result.protocolVersion ? result : undefined
52
+ }
53
+
54
+ /**
55
+ * Stamps any client identity found in `params._meta` directly onto the event
56
+ * being built for *this* request, so it carries `$mcp_client_name`,
57
+ * `$mcp_client_version`, and `$mcp_protocol_version` even when there was no
58
+ * `initialize` to learn them from (the modern stateless case).
59
+ *
60
+ * Writing to the event — a per-request object — rather than the server-wide
61
+ * `sessionInfo` keeps identity correct when one instrumented server multiplexes
62
+ * concurrent requests from different clients (which the stateless spec allows):
63
+ * a sibling request can't clobber this event's attribution between now and when
64
+ * it's captured. Only fields the request actually carries are set, so a request
65
+ * without `_meta` leaves the event's existing values untouched.
66
+ */
67
+ export function stampMetaClientInfo(event: McpEvent, request: MCPRequestLike): void {
68
+ const info = readMetaClientInfo(request)
69
+ if (!info) {
70
+ return
71
+ }
72
+ if (info.clientName) {
73
+ event.clientName = info.clientName
74
+ }
75
+ if (info.clientVersion) {
76
+ event.clientVersion = info.clientVersion
77
+ }
78
+ if (info.protocolVersion) {
79
+ event.protocolVersion = info.protocolVersion
80
+ }
81
+ }
@@ -48,6 +48,7 @@ export const PostHogMCPAnalyticsProperty = {
48
48
  IntentSource: '$mcp_intent_source',
49
49
  ListedToolNames: '$mcp_listed_tool_names',
50
50
  Parameters: '$mcp_parameters',
51
+ ProtocolVersion: '$mcp_protocol_version',
51
52
  ResourceName: '$mcp_resource_name',
52
53
  Response: '$mcp_response',
53
54
  ServerName: '$mcp_server_name',
@@ -4,7 +4,13 @@
4
4
  // Licensed under the MIT License: https://github.com/agentcathq/agentcat-typescript-sdk/blob/main/LICENSE
5
5
 
6
6
  import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'
7
- import type { CompatibleRequestHandlerExtra, HighLevelMCPServerLike, MCPServerLike, RegisteredTool } from '../types'
7
+ import type {
8
+ CompatibleRequestHandlerExtra,
9
+ HighLevelMCPServerLike,
10
+ MCPServerLike,
11
+ RegisteredTool,
12
+ ToolCallback,
13
+ } from '../types'
8
14
  import { stripConversationId } from './conversation-id'
9
15
  import { MCPAnalyticsEventType } from './event-types'
10
16
  import { getServerTrackingData } from './internal'
@@ -34,7 +40,7 @@ type ProcessedRegisteredTool = RegisteredTool & {
34
40
  [MCP_ANALYTICS_PROCESSED]?: boolean
35
41
  }
36
42
 
37
- function isCallbackUpdate(value: unknown): value is { callback: unknown } {
43
+ function isCallbackUpdate(value: unknown): value is { callback: ToolCallback } {
38
44
  return !!value && typeof value === 'object' && 'callback' in value && typeof value.callback === 'function'
39
45
  }
40
46
 
@@ -81,7 +87,7 @@ function setupListenerToRegisteredTools(server: HighLevelMCPServerLike): void {
81
87
  const updateObj = updateArgs[0]
82
88
  if (isCallbackUpdate(updateObj)) {
83
89
  const wrappedTool = addTracingToToolCallbackInternal(
84
- { callback: updateObj.callback } as RegisteredTool,
90
+ { callback: updateObj.callback },
85
91
  property,
86
92
  server
87
93
  )
@@ -21,6 +21,7 @@ import {
21
21
  injectConversationIdPromptBack,
22
22
  resolveConversationId,
23
23
  } from './conversation-id'
24
+ import { stampMetaClientInfo } from './client-identity'
24
25
  import { captureEvent } from './capture'
25
26
  import { MCPAnalyticsEventType } from './event-types'
26
27
  import { captureException } from './exceptions'
@@ -152,6 +153,10 @@ async function prepareToolCallEvent(
152
153
  toolCategory: toolName ? data.toolCategories.get(toolName) : undefined,
153
154
  toolDescription: toolName ? data.toolDescriptions.get(toolName) : undefined,
154
155
  }
156
+ // Modern (stateless) clients carry client name/version + protocol version in
157
+ // `_meta` on every request rather than at `initialize`; stamp them onto this
158
+ // event now so concurrent requests can't cross-attribute it.
159
+ stampMetaClientInfo(event, request)
155
160
 
156
161
  await applyResolvedMetadata(event, data, request, extra)
157
162
  setEventIntent(event, await resolveToolCallIntent(data, request, extra))
@@ -297,6 +302,7 @@ export async function handleListToolsRequest(
297
302
  eventType: MCPAnalyticsEventType.mcpToolsList,
298
303
  timestamp: startTime,
299
304
  }
305
+ stampMetaClientInfo(event, request)
300
306
 
301
307
  if (data) {
302
308
  await applyResolvedMetadata(event, data, request, extra)
@@ -436,35 +442,76 @@ function mintStatelessSessionOnInitialize(
436
442
  data: MCPAnalyticsData,
437
443
  request: MCPRequestLike,
438
444
  extra: CompatibleRequestHandlerExtra | undefined
439
- ): void {
445
+ ): string | undefined {
440
446
  try {
441
447
  const headers = extra?.requestInfo?.headers
442
448
  if (!headers || typeof headers !== 'object') {
443
- return // not an HTTP transport (stdio/in-memory) — nothing to mint into
449
+ return undefined // not an HTTP transport (stdio/in-memory) — nothing to mint into
444
450
  }
445
451
  if (readMcpSessionHeader(headers)) {
446
- return // client already replays a session id (ours or the transport's)
452
+ return undefined // client already replays a session id (ours or the transport's)
447
453
  }
448
454
  const transport = server.transport
449
455
  if (!transport || extra?.sessionId || transport.sessionId) {
450
- return // stateful transports manage their own session id — leave it alone
456
+ return undefined // stateful transports manage their own session id — leave it alone
451
457
  }
452
458
 
453
459
  const sessionId = newSessionId()
454
460
  const clientInfo = readInitializeClientInfo(request)
455
- const token = encodeSessionId({ sessionId, clientName: clientInfo?.name, clientVersion: clientInfo?.version })
461
+ // Minted before the handler negotiates, so only the client's *requested*
462
+ // version is available here; `handleInitializeRequest` re-mints the token
463
+ // with the negotiated version once the handler has run.
464
+ const requestedProtocolVersion = readProtocolVersion(undefined, request)
465
+ const token = encodeSessionId({
466
+ sessionId,
467
+ clientName: clientInfo?.name,
468
+ clientVersion: clientInfo?.version,
469
+ protocolVersion: requestedProtocolVersion,
470
+ })
456
471
  if (!writeSessionIdToTransport(transport, token)) {
457
- return // transport can't carry a response session id — keep generated behavior
472
+ return undefined // transport can't carry a response session id — keep generated behavior
458
473
  }
459
474
 
460
475
  data.sessionId = sessionId
461
476
  data.sessionSource = 'token'
462
477
  data.sessionInfo.clientName = clientInfo?.name
463
478
  data.sessionInfo.clientVersion = clientInfo?.version
479
+ data.sessionInfo.protocolVersion = requestedProtocolVersion
464
480
  data.lastActivity = new Date()
465
481
  setServerTrackingData(server, data)
482
+ return sessionId
466
483
  } catch (error) {
467
484
  log(`Warning: PostHog MCP analytics failed to mint a stateless session id - ${error}`)
485
+ return undefined
486
+ }
487
+ }
488
+
489
+ /**
490
+ * Rewrite the minted token to carry the *negotiated* protocol version now that
491
+ * the handler has run. Without this, a server that downgrades the client's
492
+ * requested version would replay the requested one on later requests (and to
493
+ * other pods), reporting a version the session is not actually using.
494
+ */
495
+ function upgradeMintedTokenToNegotiated(
496
+ server: MCPServerLike,
497
+ data: MCPAnalyticsData,
498
+ mintedSessionId: string,
499
+ negotiatedProtocolVersion: string | undefined
500
+ ): void {
501
+ try {
502
+ const transport = server.transport
503
+ if (!transport) {
504
+ return
505
+ }
506
+ const token = encodeSessionId({
507
+ sessionId: mintedSessionId,
508
+ clientName: data.sessionInfo.clientName,
509
+ clientVersion: data.sessionInfo.clientVersion,
510
+ protocolVersion: negotiatedProtocolVersion,
511
+ })
512
+ writeSessionIdToTransport(transport, token)
513
+ } catch (error) {
514
+ log(`Warning: PostHog MCP analytics failed to upgrade the stateless session token - ${error}`)
468
515
  }
469
516
  }
470
517
 
@@ -503,7 +550,7 @@ export async function handleInitializeRequest(
503
550
  }
504
551
 
505
552
  // Mint first so the `$mcp_initialize` event below already carries the minted id.
506
- mintStatelessSessionOnInitialize(server, data, request, extra)
553
+ const mintedSessionId = mintStatelessSessionOnInitialize(server, data, request, extra)
507
554
  const sessionId = getSessionId(server, extra)
508
555
  await handleIdentify(server, data, sessionId, request, extra)
509
556
 
@@ -514,11 +561,40 @@ export async function handleInitializeRequest(
514
561
  parameters: buildCapturedMcpParameters(request),
515
562
  timestamp: new Date(),
516
563
  }
564
+ // Harmless for a legacy `initialize` (client info rides the body there, and the
565
+ // negotiated protocol version below overrides any `_meta` one); picks up client
566
+ // info if a client also sends it in `_meta`.
567
+ stampMetaClientInfo(event, request)
517
568
 
518
569
  await applyResolvedMetadata(event, data, request, extra)
519
570
 
520
571
  const result = await originalInitializeHandler(request, extra)
521
572
  event.response = result
573
+ // The negotiated version (off the response) supersedes the requested one the
574
+ // mint stored — persist it so every later event on this pod carries it, and
575
+ // re-mint the token so pods replaying it report the negotiated version too.
576
+ const negotiatedProtocolVersion = readProtocolVersion(result, request)
577
+ event.protocolVersion = negotiatedProtocolVersion
578
+ data.sessionInfo.protocolVersion = negotiatedProtocolVersion
579
+ setServerTrackingData(server, data)
580
+ if (mintedSessionId) {
581
+ upgradeMintedTokenToNegotiated(server, data, mintedSessionId, negotiatedProtocolVersion)
582
+ }
522
583
  captureEvent(server, event)
523
584
  return result
524
585
  }
586
+
587
+ /**
588
+ * The MCP spec (protocol) version this session speaks. Prefer the negotiated
589
+ * version off the initialize response — the version the server committed to and
590
+ * the session actually runs on — falling back to the client's requested version
591
+ * if the response omits it. Used to track spec-revision adoption.
592
+ */
593
+ function readProtocolVersion(result: unknown, request: MCPRequestLike): string | undefined {
594
+ const negotiated = (result as Record<string, unknown> | null | undefined)?.protocolVersion
595
+ if (typeof negotiated === 'string' && negotiated.length > 0) {
596
+ return negotiated
597
+ }
598
+ const requested = request.params?.protocolVersion
599
+ return typeof requested === 'string' && requested.length > 0 ? requested : undefined
600
+ }
@@ -14,6 +14,7 @@ import type {
14
14
  import { MCPAnalyticsEventType } from './event-types'
15
15
  import { log } from './logger'
16
16
  import { captureEvent } from './capture'
17
+ import { stampMetaClientInfo } from './client-identity'
17
18
 
18
19
  /**
19
20
  * Bounded LRU cache for session identities, capped at `maxSize` entries so a
@@ -141,6 +142,7 @@ export async function handleIdentify(
141
142
  parameters: { request, extra },
142
143
  timestamp: new Date(),
143
144
  }
145
+ stampMetaClientInfo(identifyEvent, request)
144
146
 
145
147
  try {
146
148
  const identityResult =
@@ -64,7 +64,7 @@ export function createWrappedTool(originalTool: RegisteredTool, wrappedFunction:
64
64
  return {
65
65
  ...originalTool,
66
66
  [key]: wrappedFunction,
67
- } as RegisteredTool
67
+ }
68
68
  }
69
69
 
70
70
  // --- Zod schema internal property helpers ---
@@ -151,6 +151,11 @@ function addCommonEventProperties(event: Event, properties: Record<string, unkno
151
151
  if (event.clientVersion) {
152
152
  properties[PostHogMCPAnalyticsProperty.ClientVersion] = event.clientVersion
153
153
  }
154
+ // Present on every event once negotiated at `initialize` (carried via
155
+ // sessionInfo / the session token). Absent only before the handshake.
156
+ if (event.protocolVersion) {
157
+ properties[PostHogMCPAnalyticsProperty.ProtocolVersion] = event.protocolVersion
158
+ }
154
159
  if (event.userIntent) {
155
160
  properties[PostHogMCPAnalyticsProperty.Intent] = event.userIntent
156
161
  }
@@ -237,6 +242,9 @@ function buildExceptionEvent(event: Event): PostHogCaptureEvent {
237
242
  if (event.clientVersion) {
238
243
  properties[PostHogMCPAnalyticsProperty.ClientVersion] = event.clientVersion
239
244
  }
245
+ if (event.protocolVersion) {
246
+ properties[PostHogMCPAnalyticsProperty.ProtocolVersion] = event.protocolVersion
247
+ }
240
248
 
241
249
  addCustomEventProperties(event, properties)
242
250
 
@@ -243,6 +243,7 @@ function baseEvent(eventType: MCPAnalyticsEventType, common: McpCaptureCommon):
243
243
  const event: McpEvent = {
244
244
  eventType,
245
245
  sessionId: common.sessionId,
246
+ protocolVersion: common.protocolVersion,
246
247
  timestamp: common.timestamp ?? new Date(),
247
248
  properties: common.properties,
248
249
  groups: common.groups,
@@ -20,10 +20,18 @@ export interface SessionTokenPayload {
20
20
  clientName?: string
21
21
  /** MCP client version → `$mcp_client_version`. */
22
22
  clientVersion?: string
23
+ /**
24
+ * MCP protocol (spec) version → `$mcp_protocol_version`. The client's
25
+ * *requested* version — the only one known when the token is minted (before
26
+ * the initialize handler negotiates). Lets pods that never saw `initialize`
27
+ * still stamp the spec version on their events.
28
+ */
29
+ protocolVersion?: string
23
30
  }
24
31
 
25
32
  // On the wire the token is base64url(JSON) with shortened keys to keep the
26
- // header small: sid = sessionId, cn = clientName, cv = clientVersion.
33
+ // header small: sid = sessionId, cn = clientName, cv = clientVersion,
34
+ // pv = protocolVersion.
27
35
  const MAX_TOKEN_LENGTH = 4096
28
36
  const MAX_SESSION_ID_LENGTH = 128
29
37
  const MAX_CLIENT_FIELD_LENGTH = 200
@@ -46,6 +54,9 @@ export function encodeSessionId(payload: SessionTokenPayload): string {
46
54
  if (typeof payload.clientVersion === 'string' && payload.clientVersion.length > 0) {
47
55
  wire.cv = payload.clientVersion.slice(0, MAX_CLIENT_FIELD_LENGTH)
48
56
  }
57
+ if (typeof payload.protocolVersion === 'string' && payload.protocolVersion.length > 0) {
58
+ wire.pv = payload.protocolVersion.slice(0, MAX_CLIENT_FIELD_LENGTH)
59
+ }
49
60
  return utf8ToBase64Url(JSON.stringify(wire))
50
61
  }
51
62
 
@@ -83,6 +94,9 @@ export function decodeSessionId(value: unknown): SessionTokenPayload | null {
83
94
  if (typeof wire.cv === 'string' && wire.cv.length > 0) {
84
95
  payload.clientVersion = wire.cv.slice(0, MAX_CLIENT_FIELD_LENGTH)
85
96
  }
97
+ if (typeof wire.pv === 'string' && wire.pv.length > 0) {
98
+ payload.protocolVersion = wire.pv.slice(0, MAX_CLIENT_FIELD_LENGTH)
99
+ }
86
100
  return payload
87
101
  }
88
102
 
@@ -51,6 +51,7 @@ export function getSessionId(server: MCPServerLike, extra?: CompatibleRequestHan
51
51
  data.sessionSource = 'token'
52
52
  data.sessionInfo.clientName = token.clientName
53
53
  data.sessionInfo.clientVersion = token.clientVersion
54
+ data.sessionInfo.protocolVersion = token.protocolVersion
54
55
  sessionId = token.sessionId
55
56
  } else if (extra?.sessionId) {
56
57
  // Session id issued by a stateful transport: hash it so the same MCP
@@ -110,6 +111,9 @@ export function getSessionInfo(
110
111
  serverVersion: server._serverInfo?.version,
111
112
  clientName: clientInfo?.name,
112
113
  clientVersion: clientInfo?.version,
114
+ // No SDK getter for this (unlike getClientVersion) — the MCP SDK never
115
+ // retains the negotiated version, so it lives only where we stored it.
116
+ protocolVersion: data?.sessionInfo.protocolVersion,
113
117
  identifyActorGivenId: actorInfo?.distinctId,
114
118
  identifyActorData: actorInfo?.properties || {},
115
119
  identifyActorGroups: actorInfo?.groups,
package/src/types.ts CHANGED
@@ -165,6 +165,12 @@ export interface Event {
165
165
  listedToolNames?: string[]
166
166
  parameters?: unknown
167
167
  properties?: JsonRecord | null
168
+ /**
169
+ * Negotiated MCP protocol (spec) version → `$mcp_protocol_version`. Learned at
170
+ * `initialize` and carried onto every event for the session (see SessionInfo) —
171
+ * used to track spec adoption and to slice event metrics by spec version.
172
+ */
173
+ protocolVersion?: string
168
174
  resourceName?: string
169
175
  response?: unknown
170
176
  sdkLanguage?: string
@@ -254,6 +260,11 @@ export interface SessionInfo {
254
260
  identifyActorGivenId?: string
255
261
  identifyActorGroups?: Record<string, string>
256
262
  ipAddress?: string
263
+ /**
264
+ * Negotiated MCP protocol (spec) version, learned at `initialize` and carried
265
+ * forward for the session (across pods via the session token) → `$mcp_protocol_version`.
266
+ */
267
+ protocolVersion?: string
257
268
  sdkLanguage?: string
258
269
  sdkVersion?: string
259
270
  serverName?: string
@@ -297,6 +308,12 @@ export interface McpCaptureCommon {
297
308
  distinctId?: string
298
309
  /** Session id → `$session_id`. Omitted from the event entirely when not provided. */
299
310
  sessionId?: string
311
+ /**
312
+ * Negotiated MCP protocol (spec) version → `$mcp_protocol_version`. Pass it on
313
+ * every capture for the session (like `sessionId`) so later events carry it too,
314
+ * not just the initialize event — the `PostHogMCP` client holds no per-session state.
315
+ */
316
+ protocolVersion?: string
300
317
  /** Person properties → `$set` (e.g. `{ name, email, plan }`). */
301
318
  setProperties?: JsonRecord
302
319
  /** Group memberships → `$groups`. */
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '0.9.1'
1
+ export const version = '0.10.1'