@posthog/mcp 0.10.9 → 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.
- package/README.md +39 -0
- package/dist/extensions/capture.d.ts.map +1 -1
- package/dist/extensions/capture.js +2 -0
- package/dist/extensions/capture.mjs +2 -0
- package/dist/extensions/compatibility.d.ts.map +1 -1
- package/dist/extensions/compatibility.js +14 -18
- package/dist/extensions/compatibility.mjs +10 -14
- package/dist/extensions/constants.d.ts +2 -0
- package/dist/extensions/constants.d.ts.map +1 -1
- package/dist/extensions/constants.js +3 -1
- package/dist/extensions/constants.mjs +3 -1
- package/dist/extensions/context-parameters.d.ts.map +1 -1
- package/dist/extensions/conversation-id.d.ts +2 -13
- package/dist/extensions/conversation-id.d.ts.map +1 -1
- package/dist/extensions/detect.d.ts +45 -0
- package/dist/extensions/detect.d.ts.map +1 -0
- package/dist/extensions/detect.js +90 -0
- package/dist/extensions/detect.mjs +35 -0
- package/dist/extensions/headers.d.ts +33 -0
- package/dist/extensions/headers.d.ts.map +1 -0
- package/dist/extensions/headers.js +54 -0
- package/dist/extensions/headers.mjs +17 -0
- package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
- package/dist/extensions/instrument-lowlevel.d.ts.map +1 -1
- package/dist/extensions/instrumentation.d.ts +7 -0
- package/dist/extensions/instrumentation.d.ts.map +1 -1
- package/dist/extensions/instrumentation.js +7 -2
- package/dist/extensions/instrumentation.mjs +7 -2
- package/dist/extensions/internal.d.ts.map +1 -1
- package/dist/extensions/internal.js +2 -0
- package/dist/extensions/internal.mjs +2 -0
- package/dist/extensions/output-instructions.d.ts +6 -8
- package/dist/extensions/output-instructions.d.ts.map +1 -1
- package/dist/extensions/posthog-events.js +4 -0
- package/dist/extensions/posthog-events.mjs +4 -0
- package/dist/extensions/posthog-mcp.d.ts.map +1 -1
- package/dist/extensions/posthog-mcp.js +3 -0
- package/dist/extensions/posthog-mcp.mjs +3 -0
- package/dist/extensions/request-headers.d.ts +36 -0
- package/dist/extensions/request-headers.d.ts.map +1 -0
- package/dist/extensions/request-headers.js +62 -0
- package/dist/extensions/request-headers.mjs +28 -0
- package/dist/extensions/session-token.d.ts.map +1 -1
- package/dist/extensions/session-token.js +5 -14
- package/dist/extensions/session-token.mjs +2 -11
- package/dist/extensions/session.d.ts +4 -3
- package/dist/extensions/session.d.ts.map +1 -1
- package/dist/extensions/session.js +2 -1
- package/dist/extensions/session.mjs +2 -1
- package/dist/extensions/sink.d.ts +4 -6
- package/dist/extensions/sink.d.ts.map +1 -1
- package/dist/extensions/tools.d.ts.map +1 -1
- package/dist/extensions/transport-identity.d.ts +64 -0
- package/dist/extensions/transport-identity.d.ts.map +1 -0
- package/dist/extensions/transport-identity.js +64 -0
- package/dist/extensions/transport-identity.mjs +21 -0
- package/dist/extensions/truncation.d.ts.map +1 -1
- package/dist/extensions/truncation.js +2 -0
- package/dist/extensions/truncation.mjs +2 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -7
- package/dist/index.mjs +2 -1
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +2 -2
- package/src/extensions/capture.ts +6 -0
- package/src/extensions/compatibility.ts +25 -33
- package/src/extensions/constants.ts +2 -0
- package/src/extensions/context-parameters.ts +3 -11
- package/src/extensions/conversation-id.ts +5 -17
- package/src/extensions/detect.ts +78 -0
- package/src/extensions/headers.ts +52 -0
- package/src/extensions/instrument-highlevel.ts +0 -1
- package/src/extensions/instrument-lowlevel.ts +0 -1
- package/src/extensions/instrumentation.ts +32 -39
- package/src/extensions/internal.ts +6 -5
- package/src/extensions/output-instructions.ts +6 -8
- package/src/extensions/posthog-events.ts +14 -0
- package/src/extensions/posthog-mcp.ts +7 -5
- package/src/extensions/request-headers.ts +76 -0
- package/src/extensions/session-token.ts +3 -15
- package/src/extensions/session.ts +23 -36
- package/src/extensions/sink.ts +4 -6
- package/src/extensions/tools.ts +3 -6
- package/src/extensions/transport-identity.ts +100 -0
- package/src/extensions/truncation.ts +4 -0
- package/src/index.ts +4 -0
- package/src/types.ts +51 -0
- package/src/version.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,KAAK,EACV,2BAA2B,EAC3B,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,EACd,aAAa,EAId,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,7 @@ const external_analytics_parameters_js_namespaceObject = require("./analytics-pa
|
|
|
38
38
|
const external_context_parameters_js_namespaceObject = require("./context-parameters.js");
|
|
39
39
|
const external_conversation_id_js_namespaceObject = require("./conversation-id.js");
|
|
40
40
|
const external_client_identity_js_namespaceObject = require("./client-identity.js");
|
|
41
|
+
const external_transport_identity_js_namespaceObject = require("./transport-identity.js");
|
|
41
42
|
const external_output_instructions_js_namespaceObject = require("./output-instructions.js");
|
|
42
43
|
const external_capture_js_namespaceObject = require("./capture.js");
|
|
43
44
|
const external_event_types_js_namespaceObject = require("./event-types.js");
|
|
@@ -46,6 +47,7 @@ const external_intent_js_namespaceObject = require("./intent.js");
|
|
|
46
47
|
const external_internal_js_namespaceObject = require("./internal.js");
|
|
47
48
|
const external_mcp_payloads_js_namespaceObject = require("./mcp-payloads.js");
|
|
48
49
|
const external_mcp_sdk_compat_js_namespaceObject = require("./mcp-sdk-compat.js");
|
|
50
|
+
const external_request_headers_js_namespaceObject = require("./request-headers.js");
|
|
49
51
|
const external_session_js_namespaceObject = require("./session.js");
|
|
50
52
|
const external_session_token_js_namespaceObject = require("./session-token.js");
|
|
51
53
|
const external_tools_js_namespaceObject = require("./tools.js");
|
|
@@ -109,6 +111,7 @@ async function prepareToolCallEvent(server, data, request, downstreamRequest, ex
|
|
|
109
111
|
toolDescription: toolName ? data.toolDescriptions.get(toolName) : void 0
|
|
110
112
|
};
|
|
111
113
|
(0, external_client_identity_js_namespaceObject.stampMetaClientInfo)(event, request);
|
|
114
|
+
(0, external_transport_identity_js_namespaceObject.stampTransportIdentity)(event, extra);
|
|
112
115
|
await (0, external_tracing_helpers_js_namespaceObject.applyResolvedMetadata)(event, data, request, extra);
|
|
113
116
|
(0, external_intent_js_namespaceObject.setEventIntent)(event, await (0, external_intent_js_namespaceObject.resolveToolCallIntent)(data, request, ownership.context, extra));
|
|
114
117
|
return {
|
|
@@ -228,6 +231,7 @@ async function handleListToolsRequest(server, originalListToolsHandler, request,
|
|
|
228
231
|
timestamp: startTime
|
|
229
232
|
};
|
|
230
233
|
(0, external_client_identity_js_namespaceObject.stampMetaClientInfo)(event, request);
|
|
234
|
+
(0, external_transport_identity_js_namespaceObject.stampTransportIdentity)(event, extra);
|
|
231
235
|
if (data) await (0, external_tracing_helpers_js_namespaceObject.applyResolvedMetadata)(event, data, request, extra);
|
|
232
236
|
const tools = await getTracedToolsList(server, originalListToolsHandler, request, extra, event, logger, requestAttribution);
|
|
233
237
|
if (!data) {
|
|
@@ -323,8 +327,8 @@ function cacheToolCategories(cache, tools) {
|
|
|
323
327
|
}
|
|
324
328
|
function mintStatelessSessionOnInitialize(server, data, request, extra) {
|
|
325
329
|
try {
|
|
326
|
-
const headers = extra
|
|
327
|
-
if (!headers
|
|
330
|
+
const headers = (0, external_request_headers_js_namespaceObject.getRequestHeaders)(extra);
|
|
331
|
+
if (!headers) return;
|
|
328
332
|
if ((0, external_session_token_js_namespaceObject.readMcpSessionHeader)(headers)) return;
|
|
329
333
|
const transport = server.transport;
|
|
330
334
|
if (!transport || extra?.sessionId || transport.sessionId) return;
|
|
@@ -400,6 +404,7 @@ async function handleInitializeRequest(server, originalInitializeHandler, reques
|
|
|
400
404
|
timestamp: new Date()
|
|
401
405
|
};
|
|
402
406
|
(0, external_client_identity_js_namespaceObject.stampMetaClientInfo)(event, request);
|
|
407
|
+
(0, external_transport_identity_js_namespaceObject.stampTransportIdentity)(event, extra);
|
|
403
408
|
await (0, external_tracing_helpers_js_namespaceObject.applyResolvedMetadata)(event, data, request, extra);
|
|
404
409
|
const result = await originalInitializeHandler(request, extra);
|
|
405
410
|
event.response = result;
|
|
@@ -2,6 +2,7 @@ import { getAnalyticsParameterOwnership, stripOwnedAnalyticsArguments } from "./
|
|
|
2
2
|
import { addContextParameterToTools, getContextDescription, isContextEnabled } from "./context-parameters.mjs";
|
|
3
3
|
import { addConversationIdToTools, canInjectConversationIdPromptBack, injectConversationIdPromptBack, resolveConversationId } from "./conversation-id.mjs";
|
|
4
4
|
import { stampMetaClientInfo } from "./client-identity.mjs";
|
|
5
|
+
import { stampTransportIdentity } from "./transport-identity.mjs";
|
|
5
6
|
import { addInstructionsToOutputSchemas, mirrorInstructionsIntoStructuredContent } from "./output-instructions.mjs";
|
|
6
7
|
import { captureEvent } from "./capture.mjs";
|
|
7
8
|
import { MCPAnalyticsEventType } from "./event-types.mjs";
|
|
@@ -10,6 +11,7 @@ import { resolveToolCallIntent, setEventIntent, setExplicitContextIntent } from
|
|
|
10
11
|
import { getServerTrackingData, handleIdentify, setServerTrackingData, withIdentity } from "./internal.mjs";
|
|
11
12
|
import { buildCapturedMcpParameters } from "./mcp-payloads.mjs";
|
|
12
13
|
import { readRequestHandlerMethod } from "./mcp-sdk-compat.mjs";
|
|
14
|
+
import { getRequestHeaders } from "./request-headers.mjs";
|
|
13
15
|
import { getSessionId, getSessionInfo, newSessionId } from "./session.mjs";
|
|
14
16
|
import { encodeSessionId, readMcpSessionHeader, writeSessionIdToTransport } from "./session-token.mjs";
|
|
15
17
|
import { getReportMissingToolDescriptor, resolveMissingCapabilityToolName } from "./tools.mjs";
|
|
@@ -73,6 +75,7 @@ async function prepareToolCallEvent(server, data, request, downstreamRequest, ex
|
|
|
73
75
|
toolDescription: toolName ? data.toolDescriptions.get(toolName) : void 0
|
|
74
76
|
};
|
|
75
77
|
stampMetaClientInfo(event, request);
|
|
78
|
+
stampTransportIdentity(event, extra);
|
|
76
79
|
await applyResolvedMetadata(event, data, request, extra);
|
|
77
80
|
setEventIntent(event, await resolveToolCallIntent(data, request, ownership.context, extra));
|
|
78
81
|
return {
|
|
@@ -192,6 +195,7 @@ async function handleListToolsRequest(server, originalListToolsHandler, request,
|
|
|
192
195
|
timestamp: startTime
|
|
193
196
|
};
|
|
194
197
|
stampMetaClientInfo(event, request);
|
|
198
|
+
stampTransportIdentity(event, extra);
|
|
195
199
|
if (data) await applyResolvedMetadata(event, data, request, extra);
|
|
196
200
|
const tools = await getTracedToolsList(server, originalListToolsHandler, request, extra, event, logger, requestAttribution);
|
|
197
201
|
if (!data) {
|
|
@@ -287,8 +291,8 @@ function cacheToolCategories(cache, tools) {
|
|
|
287
291
|
}
|
|
288
292
|
function mintStatelessSessionOnInitialize(server, data, request, extra) {
|
|
289
293
|
try {
|
|
290
|
-
const headers = extra
|
|
291
|
-
if (!headers
|
|
294
|
+
const headers = getRequestHeaders(extra);
|
|
295
|
+
if (!headers) return;
|
|
292
296
|
if (readMcpSessionHeader(headers)) return;
|
|
293
297
|
const transport = server.transport;
|
|
294
298
|
if (!transport || extra?.sessionId || transport.sessionId) return;
|
|
@@ -364,6 +368,7 @@ async function handleInitializeRequest(server, originalInitializeHandler, reques
|
|
|
364
368
|
timestamp: new Date()
|
|
365
369
|
};
|
|
366
370
|
stampMetaClientInfo(event, request);
|
|
371
|
+
stampTransportIdentity(event, extra);
|
|
367
372
|
await applyResolvedMetadata(event, data, request, extra);
|
|
368
373
|
const result = await originalInitializeHandler(request, extra);
|
|
369
374
|
event.response = result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/extensions/internal.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,EACd,aAAa,EAEb,WAAW,EACX,YAAY,EACb,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/extensions/internal.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,EACd,aAAa,EAEb,WAAW,EACX,YAAY,EACb,MAAM,UAAU,CAAA;AAMjB;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;gBAErB,OAAO,SAAO;IAI1B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAWhD,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAapD,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/B,IAAI,IAAI,MAAM;CAGf;AAID,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,gBAAgB,GAAG,SAAS,CAEzF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAEzF;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CA4B5E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,YAAY,CAapG;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EACvB,kBAAkB,EAAE,WAAW,EAC/B,KAAK,CAAC,EAAE,6BAA6B;AACrC;;;;;GAKG;AACH,uBAAuB,UAAQ,GAC9B,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAuDnC;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,WAAW,CAOtG;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,cAAc,EACvB,KAAK,CAAC,EAAE,6BAA6B,GACpC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAUzC"}
|
|
@@ -36,6 +36,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
36
36
|
const external_event_types_js_namespaceObject = require("./event-types.js");
|
|
37
37
|
const external_capture_js_namespaceObject = require("./capture.js");
|
|
38
38
|
const external_client_identity_js_namespaceObject = require("./client-identity.js");
|
|
39
|
+
const external_transport_identity_js_namespaceObject = require("./transport-identity.js");
|
|
39
40
|
class IdentityCache {
|
|
40
41
|
constructor(maxSize = 1000){
|
|
41
42
|
this._cache = new Map();
|
|
@@ -110,6 +111,7 @@ async function handleIdentify(server, data, sessionId, request, requestAttributi
|
|
|
110
111
|
timestamp: new Date()
|
|
111
112
|
};
|
|
112
113
|
(0, external_client_identity_js_namespaceObject.stampMetaClientInfo)(identifyEvent, request);
|
|
114
|
+
(0, external_transport_identity_js_namespaceObject.stampTransportIdentity)(identifyEvent, extra);
|
|
113
115
|
try {
|
|
114
116
|
const identityResult = 'function' == typeof data.options.identify ? await data.options.identify(request, extra) : data.options.identify;
|
|
115
117
|
if (identityResult) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { MCPAnalyticsEventType } from "./event-types.mjs";
|
|
2
2
|
import { captureEvent } from "./capture.mjs";
|
|
3
3
|
import { stampMetaClientInfo } from "./client-identity.mjs";
|
|
4
|
+
import { stampTransportIdentity } from "./transport-identity.mjs";
|
|
4
5
|
class IdentityCache {
|
|
5
6
|
constructor(maxSize = 1000){
|
|
6
7
|
this._cache = new Map();
|
|
@@ -75,6 +76,7 @@ async function handleIdentify(server, data, sessionId, request, requestAttributi
|
|
|
75
76
|
timestamp: new Date()
|
|
76
77
|
};
|
|
77
78
|
stampMetaClientInfo(identifyEvent, request);
|
|
79
|
+
stampTransportIdentity(identifyEvent, extra);
|
|
78
80
|
try {
|
|
79
81
|
const identityResult = 'function' == typeof data.options.identify ? await data.options.identify(request, extra) : data.options.identify;
|
|
80
82
|
if (identityResult) {
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import type { LoggerFn } from './logger';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* `structuredContent` instead of `content` — which is what clients do whenever a
|
|
6
|
-
* tool declares an `outputSchema`. Measured against Claude Code, correlation for
|
|
7
|
-
* such tools drops to zero.
|
|
8
|
-
*
|
|
9
|
-
* The fix is to mirror the session handle into `structuredContent` as well, which this
|
|
10
|
-
* module does in two halves that must stay in that order:
|
|
3
|
+
* Mirrors the `conversation_id` session handle into `structuredContent`, in two
|
|
4
|
+
* halves that must stay in that order:
|
|
11
5
|
*
|
|
12
6
|
* 1. declare `_mcp_instructions` on the tool's advertised `outputSchema`
|
|
13
7
|
* 2. write it into the result's `structuredContent`
|
|
14
8
|
*
|
|
9
|
+
* Needed because clients that read `structuredContent` — which they do whenever
|
|
10
|
+
* a tool declares an `outputSchema` — never see the `content` text block that
|
|
11
|
+
* carries the handle (ADR-0004).
|
|
12
|
+
*
|
|
15
13
|
* The declaration is what makes the write safe. The MCP client ajv-validates
|
|
16
14
|
* `structuredContent` against the schema from `tools/list`, and
|
|
17
15
|
* `zod-to-json-schema` emits `additionalProperties: false` for a plain
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-instructions.d.ts","sourceRoot":"","sources":["../../src/extensions/output-instructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAIxC
|
|
1
|
+
{"version":3,"file":"output-instructions.d.ts","sourceRoot":"","sources":["../../src/extensions/output-instructions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAIxC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,oBAAoB,sBAAsB,CAAA;AAQvD,MAAM,WAAW,gCAAgC;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAgC3E;AAwCD;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,SAAS,gCAAgC,EAC1F,IAAI,EAAE,KAAK,EACX,MAAM,GAAE,QAAc,GACrB,KAAK,CA8CP;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,SAAS,gCAAgC,EAC3F,KAAK,EAAE,KAAK,EAAE,EACd,MAAM,GAAE,QAAc,GACrB,KAAK,EAAE,CAET;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;CACrB;AAID,uFAAuF;AACvF,wBAAgB,6BAA6B,CAAC,cAAc,EAAE,MAAM,GAAG,wBAAwB,CAE9F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uCAAuC,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAkBxG"}
|
|
@@ -98,6 +98,8 @@ function addCommonEventProperties(event, properties) {
|
|
|
98
98
|
if (event.serverVersion) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ServerVersion] = event.serverVersion;
|
|
99
99
|
if (event.clientName) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ClientName] = event.clientName;
|
|
100
100
|
if (event.clientVersion) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ClientVersion] = event.clientVersion;
|
|
101
|
+
if (event.clientUserAgent) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ClientUserAgent] = event.clientUserAgent;
|
|
102
|
+
if (event.vendorClient) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.VendorClient] = event.vendorClient;
|
|
101
103
|
if (event.protocolVersion) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ProtocolVersion] = event.protocolVersion;
|
|
102
104
|
if (event.userIntent) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.Intent] = event.userIntent;
|
|
103
105
|
if (event.userIntentSource) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.IntentSource] = event.userIntentSource;
|
|
@@ -136,6 +138,8 @@ function buildExceptionEvent(event) {
|
|
|
136
138
|
if (event.serverVersion) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ServerVersion] = event.serverVersion;
|
|
137
139
|
if (event.clientName) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ClientName] = event.clientName;
|
|
138
140
|
if (event.clientVersion) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ClientVersion] = event.clientVersion;
|
|
141
|
+
if (event.clientUserAgent) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ClientUserAgent] = event.clientUserAgent;
|
|
142
|
+
if (event.vendorClient) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.VendorClient] = event.vendorClient;
|
|
139
143
|
if (event.protocolVersion) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ProtocolVersion] = event.protocolVersion;
|
|
140
144
|
addCustomEventProperties(event, properties);
|
|
141
145
|
return {
|
|
@@ -70,6 +70,8 @@ function addCommonEventProperties(event, properties) {
|
|
|
70
70
|
if (event.serverVersion) properties[PostHogMCPAnalyticsProperty.ServerVersion] = event.serverVersion;
|
|
71
71
|
if (event.clientName) properties[PostHogMCPAnalyticsProperty.ClientName] = event.clientName;
|
|
72
72
|
if (event.clientVersion) properties[PostHogMCPAnalyticsProperty.ClientVersion] = event.clientVersion;
|
|
73
|
+
if (event.clientUserAgent) properties[PostHogMCPAnalyticsProperty.ClientUserAgent] = event.clientUserAgent;
|
|
74
|
+
if (event.vendorClient) properties[PostHogMCPAnalyticsProperty.VendorClient] = event.vendorClient;
|
|
73
75
|
if (event.protocolVersion) properties[PostHogMCPAnalyticsProperty.ProtocolVersion] = event.protocolVersion;
|
|
74
76
|
if (event.userIntent) properties[PostHogMCPAnalyticsProperty.Intent] = event.userIntent;
|
|
75
77
|
if (event.userIntentSource) properties[PostHogMCPAnalyticsProperty.IntentSource] = event.userIntentSource;
|
|
@@ -108,6 +110,8 @@ function buildExceptionEvent(event) {
|
|
|
108
110
|
if (event.serverVersion) properties[PostHogMCPAnalyticsProperty.ServerVersion] = event.serverVersion;
|
|
109
111
|
if (event.clientName) properties[PostHogMCPAnalyticsProperty.ClientName] = event.clientName;
|
|
110
112
|
if (event.clientVersion) properties[PostHogMCPAnalyticsProperty.ClientVersion] = event.clientVersion;
|
|
113
|
+
if (event.clientUserAgent) properties[PostHogMCPAnalyticsProperty.ClientUserAgent] = event.clientUserAgent;
|
|
114
|
+
if (event.vendorClient) properties[PostHogMCPAnalyticsProperty.VendorClient] = event.vendorClient;
|
|
111
115
|
if (event.protocolVersion) properties[PostHogMCPAnalyticsProperty.ProtocolVersion] = event.protocolVersion;
|
|
112
116
|
addCustomEventProperties(event, properties);
|
|
113
117
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog-mcp.d.ts","sourceRoot":"","sources":["../../src/extensions/posthog-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAE3D,OAAO,KAAK,EACV,qBAAqB,EAIrB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,UAAU,CAAA;AACjB,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"posthog-mcp.d.ts","sourceRoot":"","sources":["../../src/extensions/posthog-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAE3D,OAAO,KAAK,EACV,qBAAqB,EAIrB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,UAAU,CAAA;AACjB,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAA;AAS7B;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD;;;;;OAKG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAAa,UAAW,SAAQ,OAAO;;gBAOzB,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB;IAM3D,8FAA8F;IAC9F,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAiBhD,iEAAiE;IACjE,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAUpD;;;;;OAKG;IACH,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAclD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,eAAe,CAAC,KAAK,SAAS,qBAAqB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,GAAE,sBAA2B,GAAG,KAAK,EAAE;IAYnH;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB;IAW/E;;;;OAIG;IACH,wBAAwB,CAAC,IAAI,EAAE,4BAA4B,GAAG,IAAI;CAkBnE"}
|
|
@@ -30,6 +30,7 @@ const external_posthog_node_namespaceObject = require("posthog-node");
|
|
|
30
30
|
const external_context_parameters_js_namespaceObject = require("./context-parameters.js");
|
|
31
31
|
const external_event_types_js_namespaceObject = require("./event-types.js");
|
|
32
32
|
const external_exceptions_js_namespaceObject = require("./exceptions.js");
|
|
33
|
+
const external_headers_js_namespaceObject = require("./headers.js");
|
|
33
34
|
const external_lib_identity_js_namespaceObject = require("./lib-identity.js");
|
|
34
35
|
const external_logger_js_namespaceObject = require("./logger.js");
|
|
35
36
|
const external_sink_js_namespaceObject = require("./sink.js");
|
|
@@ -115,6 +116,8 @@ function baseEvent(eventType, common) {
|
|
|
115
116
|
eventType,
|
|
116
117
|
sessionId: common.sessionId,
|
|
117
118
|
protocolVersion: common.protocolVersion,
|
|
119
|
+
clientUserAgent: (0, external_headers_js_namespaceObject.normalizeHeaderString)(common.clientUserAgent),
|
|
120
|
+
vendorClient: (0, external_headers_js_namespaceObject.normalizeHeaderString)(common.vendorClient),
|
|
118
121
|
timestamp: common.timestamp ?? new Date(),
|
|
119
122
|
properties: common.properties,
|
|
120
123
|
groups: common.groups
|
|
@@ -2,6 +2,7 @@ import { PostHog } from "posthog-node";
|
|
|
2
2
|
import { addContextParameterToTools, getContextDescription, isContextEnabled } from "./context-parameters.mjs";
|
|
3
3
|
import { MCPAnalyticsEventType } from "./event-types.mjs";
|
|
4
4
|
import { captureException } from "./exceptions.mjs";
|
|
5
|
+
import { normalizeHeaderString } from "./headers.mjs";
|
|
5
6
|
import { applyMcpLibIdentity } from "./lib-identity.mjs";
|
|
6
7
|
import { log } from "./logger.mjs";
|
|
7
8
|
import { McpEventSink } from "./sink.mjs";
|
|
@@ -87,6 +88,8 @@ function baseEvent(eventType, common) {
|
|
|
87
88
|
eventType,
|
|
88
89
|
sessionId: common.sessionId,
|
|
89
90
|
protocolVersion: common.protocolVersion,
|
|
91
|
+
clientUserAgent: normalizeHeaderString(common.clientUserAgent),
|
|
92
|
+
vendorClient: normalizeHeaderString(common.vendorClient),
|
|
90
93
|
timestamp: common.timestamp ?? new Date(),
|
|
91
94
|
properties: common.properties,
|
|
92
95
|
groups: common.groups
|
|
@@ -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-token.d.ts","sourceRoot":"","sources":["../../src/extensions/session-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"session-token.d.ts","sourceRoot":"","sources":["../../src/extensions/session-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,eAAO,MAAM,kBAAkB,mBAAmB,CAAA;AAElD,oCAAoC;AACpC,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAA;IACjB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAWD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAepE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAiC1E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEzE;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAsBpF"}
|
|
@@ -24,12 +24,13 @@ var __webpack_require__ = {};
|
|
|
24
24
|
var __webpack_exports__ = {};
|
|
25
25
|
__webpack_require__.r(__webpack_exports__);
|
|
26
26
|
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
-
MCP_SESSION_HEADER: ()=>MCP_SESSION_HEADER,
|
|
28
27
|
decodeSessionId: ()=>decodeSessionId,
|
|
28
|
+
writeSessionIdToTransport: ()=>writeSessionIdToTransport,
|
|
29
|
+
MCP_SESSION_HEADER: ()=>MCP_SESSION_HEADER,
|
|
29
30
|
encodeSessionId: ()=>encodeSessionId,
|
|
30
|
-
readMcpSessionHeader: ()=>readMcpSessionHeader
|
|
31
|
-
writeSessionIdToTransport: ()=>writeSessionIdToTransport
|
|
31
|
+
readMcpSessionHeader: ()=>readMcpSessionHeader
|
|
32
32
|
});
|
|
33
|
+
const external_headers_js_namespaceObject = require("./headers.js");
|
|
33
34
|
const MCP_SESSION_HEADER = 'mcp-session-id';
|
|
34
35
|
const MAX_TOKEN_LENGTH = 4096;
|
|
35
36
|
const MAX_SESSION_ID_LENGTH = 128;
|
|
@@ -66,17 +67,7 @@ function decodeSessionId(value) {
|
|
|
66
67
|
return payload;
|
|
67
68
|
}
|
|
68
69
|
function readMcpSessionHeader(headers) {
|
|
69
|
-
|
|
70
|
-
const record = headers;
|
|
71
|
-
let value = record[MCP_SESSION_HEADER];
|
|
72
|
-
if (void 0 === value) {
|
|
73
|
-
const key = Object.keys(record).find((k)=>k.toLowerCase() === MCP_SESSION_HEADER);
|
|
74
|
-
value = void 0 === key ? void 0 : record[key];
|
|
75
|
-
}
|
|
76
|
-
const first = Array.isArray(value) ? value[0] : value;
|
|
77
|
-
if ('string' != typeof first) return;
|
|
78
|
-
const trimmed = first.trim();
|
|
79
|
-
return trimmed.length > 0 ? trimmed : void 0;
|
|
70
|
+
return (0, external_headers_js_namespaceObject.readHeaderValue)(headers, MCP_SESSION_HEADER);
|
|
80
71
|
}
|
|
81
72
|
function writeSessionIdToTransport(transport, token) {
|
|
82
73
|
if (!transport || 'object' != typeof transport) return false;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { readHeaderValue } from "./headers.mjs";
|
|
1
2
|
const MCP_SESSION_HEADER = 'mcp-session-id';
|
|
2
3
|
const MAX_TOKEN_LENGTH = 4096;
|
|
3
4
|
const MAX_SESSION_ID_LENGTH = 128;
|
|
@@ -34,17 +35,7 @@ function decodeSessionId(value) {
|
|
|
34
35
|
return payload;
|
|
35
36
|
}
|
|
36
37
|
function readMcpSessionHeader(headers) {
|
|
37
|
-
|
|
38
|
-
const record = headers;
|
|
39
|
-
let value = record[MCP_SESSION_HEADER];
|
|
40
|
-
if (void 0 === value) {
|
|
41
|
-
const key = Object.keys(record).find((k)=>k.toLowerCase() === MCP_SESSION_HEADER);
|
|
42
|
-
value = void 0 === key ? void 0 : record[key];
|
|
43
|
-
}
|
|
44
|
-
const first = Array.isArray(value) ? value[0] : value;
|
|
45
|
-
if ('string' != typeof first) return;
|
|
46
|
-
const trimmed = first.trim();
|
|
47
|
-
return trimmed.length > 0 ? trimmed : void 0;
|
|
38
|
+
return readHeaderValue(headers, MCP_SESSION_HEADER);
|
|
48
39
|
}
|
|
49
40
|
function writeSessionIdToTransport(transport, token) {
|
|
50
41
|
if (!transport || 'object' != typeof transport) return false;
|
|
@@ -6,9 +6,10 @@ export declare function newSessionId(): string;
|
|
|
6
6
|
*/
|
|
7
7
|
export declare function deriveSessionIdFromMCPSession(mcpSessionId: string): string;
|
|
8
8
|
/**
|
|
9
|
-
* Derives the SDK session id from the agent's conversation handle.
|
|
10
|
-
* and unsalted on purpose: two pods that never met must agree on
|
|
11
|
-
* the 2026-07-28 revision leaves them no shared state to agree
|
|
9
|
+
* Derives the SDK session id from the agent's conversation handle (ADR-0004).
|
|
10
|
+
* Deterministic and unsalted on purpose: two pods that never met must agree on
|
|
11
|
+
* the session, and the 2026-07-28 revision leaves them no shared state to agree
|
|
12
|
+
* through.
|
|
12
13
|
*
|
|
13
14
|
* Hashed rather than used verbatim so an MCP session can never collide with a
|
|
14
15
|
* Session Replay id — a bare uuidv7 would render a "View recording" button that
|
|
@@ -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;
|
|
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
|
|
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
|
|
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;
|
|
@@ -24,9 +24,8 @@ export declare function processMcpEvent(event: McpEvent, options: McpCaptureOpti
|
|
|
24
24
|
captures: PostHogCaptureEvent[];
|
|
25
25
|
} | null>;
|
|
26
26
|
/**
|
|
27
|
-
* Wraps a user-supplied `posthog-node` client
|
|
28
|
-
*
|
|
29
|
-
* events, applies `beforeSend`, and hands each to `posthog.capture()`.
|
|
27
|
+
* Wraps a user-supplied `posthog-node` client: runs every MCP event through
|
|
28
|
+
* {@link processMcpEvent} and hands each surviving payload to `posthog.capture()`.
|
|
30
29
|
*
|
|
31
30
|
* The SDK does not own the client lifecycle — the host application constructs
|
|
32
31
|
* the `PostHog` instance and is responsible for `shutdown()` (matching
|
|
@@ -37,9 +36,8 @@ export declare class McpEventSink {
|
|
|
37
36
|
private readonly logger;
|
|
38
37
|
constructor(posthog: PostHog, logger?: LoggerFn);
|
|
39
38
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* dropped, never re-thrown into tool code.
|
|
39
|
+
* Errors at any stage are logged and the event is dropped, never re-thrown
|
|
40
|
+
* into tool code.
|
|
43
41
|
*/
|
|
44
42
|
capture(event: McpEvent, options: McpCaptureOptions): Promise<void>;
|
|
45
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../../src/extensions/sink.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAG3C,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,KAAK,mBAAmB,EAA6B,MAAM,kBAAkB,CAAA;AAKtF,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,0BAA0B,EAAE,OAAO,CAAA;IACnC,kFAAkF;IAClF,UAAU,CAAC,EAAE,YAAY,CAAA;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,iBAAiB,EAC1B,MAAM,GAAE,QAAc,GACrB,OAAO,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,mBAAmB,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CA2BnE;AA6BD
|
|
1
|
+
{"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../../src/extensions/sink.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAG3C,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,EAAE,KAAK,mBAAmB,EAA6B,MAAM,kBAAkB,CAAA;AAKtF,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,0BAA0B,EAAE,OAAO,CAAA;IACnC,kFAAkF;IAClF,UAAU,CAAC,EAAE,YAAY,CAAA;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,iBAAiB,EAC1B,MAAM,GAAE,QAAc,GACrB,OAAO,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,mBAAmB,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CA2BnE;AA6BD;;;;;;;GAOG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,OAAO,EAChB,MAAM,GAAE,QAAc;IAGzC;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAmC1E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/extensions/tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,oCAAoC,CAAA;AAC9F,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE7C,eAAO,MAAM,mBAAmB,EAAG,gBAAyB,CAAA;AAE5D;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,CAAC,EAAE;IAAE,yBAAyB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEzG;AAED,KAAK,2BAA2B,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnE,wBAAgB,8BAA8B,CAAC,IAAI,GAAE,MAA4B,GAAG,2BAA2B,
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/extensions/tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,oCAAoC,CAAA;AAC9F,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE7C,eAAO,MAAM,mBAAmB,EAAG,gBAAyB,CAAA;AAE5D;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,CAAC,EAAE;IAAE,yBAAyB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEzG;AAED,KAAK,2BAA2B,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnE,wBAAgB,8BAA8B,CAAC,IAAI,GAAE,MAA4B,GAAG,2BAA2B,CA0B9G;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,cAAc,CASnD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,GAAE,QAAc,GAAG,cAAc,CAGrG"}
|