@posthog/mcp 0.25.2 → 1.0.0
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 +7 -4
- package/dist/extensions/analytics-parameters.d.ts +2 -2
- package/dist/extensions/analytics-parameters.d.ts.map +1 -1
- package/dist/extensions/analytics-parameters.js +9 -8
- package/dist/extensions/analytics-parameters.mjs +9 -8
- package/dist/extensions/capture.js +1 -1
- package/dist/extensions/capture.mjs +1 -1
- package/dist/extensions/constants.d.ts +2 -1
- package/dist/extensions/constants.d.ts.map +1 -1
- package/dist/extensions/constants.js +3 -2
- package/dist/extensions/constants.mjs +3 -2
- package/dist/extensions/context-parameters.d.ts.map +1 -1
- package/dist/extensions/context-parameters.js +1 -1
- package/dist/extensions/context-parameters.mjs +1 -1
- package/dist/extensions/event-types.d.ts +1 -0
- package/dist/extensions/event-types.d.ts.map +1 -1
- package/dist/extensions/event-types.js +2 -1
- package/dist/extensions/event-types.mjs +2 -1
- package/dist/extensions/feedback.d.ts.map +1 -1
- package/dist/extensions/feedback.js +2 -5
- package/dist/extensions/feedback.mjs +2 -5
- package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
- package/dist/extensions/instrument-highlevel.js +15 -3
- package/dist/extensions/instrument-highlevel.mjs +16 -4
- package/dist/extensions/instrument-lowlevel.js +19 -6
- package/dist/extensions/instrument-lowlevel.mjs +19 -6
- package/dist/extensions/instrumentation.d.ts +5 -0
- package/dist/extensions/instrumentation.d.ts.map +1 -1
- package/dist/extensions/instrumentation.js +29 -5
- package/dist/extensions/instrumentation.mjs +29 -5
- package/dist/extensions/model-parameters.d.ts +1 -1
- package/dist/extensions/model-parameters.d.ts.map +1 -1
- package/dist/extensions/model-parameters.js +1 -1
- package/dist/extensions/model-parameters.mjs +1 -1
- package/dist/extensions/posthog-events.d.ts.map +1 -1
- package/dist/extensions/posthog-events.js +3 -2
- package/dist/extensions/posthog-events.mjs +3 -2
- package/dist/extensions/posthog-mcp.d.ts +8 -1
- package/dist/extensions/posthog-mcp.d.ts.map +1 -1
- package/dist/extensions/posthog-mcp.js +7 -1
- package/dist/extensions/posthog-mcp.mjs +8 -2
- package/dist/extensions/sanitization.d.ts.map +1 -1
- package/dist/extensions/sanitization.js +2 -1
- package/dist/extensions/sanitization.mjs +2 -1
- package/dist/extensions/tools.d.ts +11 -0
- package/dist/extensions/tools.d.ts.map +1 -1
- package/dist/extensions/tools.js +10 -5
- package/dist/extensions/tools.mjs +8 -6
- package/dist/extensions/truncation.js +1 -1
- package/dist/extensions/truncation.mjs +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/types.d.ts +10 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +3 -3
- package/src/extensions/analytics-parameters.ts +7 -11
- package/src/extensions/capture.ts +1 -1
- package/src/extensions/constants.ts +2 -1
- package/src/extensions/context-parameters.ts +1 -0
- package/src/extensions/event-types.ts +1 -0
- package/src/extensions/feedback.ts +2 -10
- package/src/extensions/instrument-highlevel.ts +29 -4
- package/src/extensions/instrument-lowlevel.ts +14 -8
- package/src/extensions/instrumentation.ts +60 -8
- package/src/extensions/model-parameters.ts +2 -1
- package/src/extensions/posthog-events.ts +5 -1
- package/src/extensions/posthog-mcp.ts +18 -2
- package/src/extensions/sanitization.ts +7 -2
- package/src/extensions/tools.ts +13 -10
- package/src/extensions/truncation.ts +1 -1
- package/src/index.ts +1 -0
- package/src/types.ts +11 -2
- package/src/version.ts +1 -1
package/README.md
CHANGED
|
@@ -8,6 +8,10 @@ SDK usage examples and code snippets live in the official documentation so they
|
|
|
8
8
|
|
|
9
9
|
- [MCP analytics docs](https://posthog.com/docs/mcp-analytics)
|
|
10
10
|
|
|
11
|
+
## Versioning
|
|
12
|
+
|
|
13
|
+
From 1.0.0, `@posthog/mcp` follows semver for its API and for the events it sends. A minor or patch release doesn't rename or remove a `$mcp_*` event or property, change its type, or change which requests send an event, so saved insights keep working across upgrades. It may add events and properties, and redact more of a captured value. The rules come from the [MCP analytics spec](https://github.com/PostHog/sdk-specs/blob/main/openspec/specs/mcp-analytics/spec.md), section "Event schema stability".
|
|
14
|
+
|
|
11
15
|
## Stateless & multi-pod servers
|
|
12
16
|
|
|
13
17
|
On stateless deployments the SDK mints the `Mcp-Session-Id` response header at `initialize`
|
|
@@ -184,9 +188,8 @@ enabled by default. Missing-capability reporting and feedback collection remain
|
|
|
184
188
|
instrument(server, posthog, { captureModel: false, enableConversationId: false })
|
|
185
189
|
```
|
|
186
190
|
|
|
187
|
-
Model capture adds
|
|
188
|
-
|
|
189
|
-
`captureModel: false` to leave schemas untouched. Conversation correlation adds an optional
|
|
191
|
+
Model capture adds an optional `llm_model` argument to compatible tool schemas. Strict-schema
|
|
192
|
+
clients see the new field. Set `captureModel: false` to leave schemas untouched. Conversation correlation adds an optional
|
|
190
193
|
`conversation_id` argument and returns a handle in eligible tool results. Clients must echo that
|
|
191
194
|
handle to group later calls; calls without it mint new handles. Set `enableConversationId: false`
|
|
192
195
|
to retain transport-based session grouping and unchanged response content. Custom `PostHogMCP`
|
|
@@ -227,7 +230,7 @@ Omit `serverBuild` when the deployment does not provide a reliable value.
|
|
|
227
230
|
|
|
228
231
|
`captureModel` is **on** by default. The SDK records the best model id visible to the
|
|
229
232
|
server as `$mcp_llm_model`. Recognized client metadata wins with source `client_metadata`. Otherwise,
|
|
230
|
-
the SDK injects
|
|
233
|
+
the SDK injects an optional `llm_model` parameter and records the answer with source `self_reported`.
|
|
231
234
|
|
|
232
235
|
MCP does not standardize or attest model identity. Client metadata and self-report are both
|
|
233
236
|
unverified. Use the value to spot degradation across models, never for billing or access control.
|
|
@@ -18,7 +18,7 @@ export interface AnalyticsInjectableTool {
|
|
|
18
18
|
[key: string]: unknown;
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
|
-
* Adds a
|
|
21
|
+
* Adds a string parameter to a tool's JSON Schema. Called AFTER the MCP
|
|
22
22
|
* SDK has converted Zod schemas to JSON Schema, so only JSON Schema needs
|
|
23
23
|
* handling.
|
|
24
24
|
*
|
|
@@ -30,7 +30,7 @@ export interface AnalyticsInjectableTool {
|
|
|
30
30
|
* - Tools that already declare the parameter — it is theirs, not ours
|
|
31
31
|
* - Complex schemas (oneOf/allOf/anyOf/$ref) that can't safely gain properties
|
|
32
32
|
*/
|
|
33
|
-
export declare function addAnalyticsParameterToTool<TTool extends AnalyticsInjectableTool>(tool: TTool, parameterName: string, description: string, injectionLabel: string, logger?: LoggerFn): TTool;
|
|
33
|
+
export declare function addAnalyticsParameterToTool<TTool extends AnalyticsInjectableTool>(tool: TTool, parameterName: string, description: string, injectionLabel: string, required: boolean, logger?: LoggerFn): TTool;
|
|
34
34
|
export declare function analyticsOwnsParameter(inputSchema: unknown, parameterName: string): boolean;
|
|
35
35
|
export declare function getAnalyticsParameterOwnership(inputSchema: unknown, outputSchema?: unknown): AnalyticsParameterOwnership;
|
|
36
36
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics-parameters.d.ts","sourceRoot":"","sources":["../../src/extensions/analytics-parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAiB7C,MAAM,WAAW,6BAA6B;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,6BAA6B,GAAG,SAAS,EACjD,aAAa,EAAE,MAAM,GACpB,OAAO,CAET;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,6BAA6B,GAAG,SAAS,EACjD,aAAa,EAAE,MAAM,GACpB,OAAO,CAIT;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,EAAE,6BAA6B,CAAA;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,SAAS,uBAAuB,EAC/E,IAAI,EAAE,KAAK,EACX,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,MAAM,GAAE,QAAc,GACrB,KAAK,
|
|
1
|
+
{"version":3,"file":"analytics-parameters.d.ts","sourceRoot":"","sources":["../../src/extensions/analytics-parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAiB7C,MAAM,WAAW,6BAA6B;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,6BAA6B,GAAG,SAAS,EACjD,aAAa,EAAE,MAAM,GACpB,OAAO,CAET;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,6BAA6B,GAAG,SAAS,EACjD,aAAa,EAAE,MAAM,GACpB,OAAO,CAIT;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,EAAE,6BAA6B,CAAA;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,SAAS,uBAAuB,EAC/E,IAAI,EAAE,KAAK,EACX,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,OAAO,EACjB,MAAM,GAAE,QAAc,GACrB,KAAK,CAgDP;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAyB3F;AAED,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,OAAO,EACpB,YAAY,CAAC,EAAE,OAAO,GACrB,2BAA2B,CAO7B;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,IAAI,CAAC,2BAA2B,EAAE,SAAS,GAAG,gBAAgB,GAAG,UAAU,CAAC,GACtF,OAAO,CAeT"}
|
|
@@ -56,7 +56,7 @@ function hasAnalyticsParameter(schema, parameterName) {
|
|
|
56
56
|
function canInjectAnalyticsParameter(schema, parameterName) {
|
|
57
57
|
return !hasAnalyticsParameter(schema, parameterName) && !schema?.$ref && !schema?.oneOf && !schema?.allOf && !schema?.anyOf;
|
|
58
58
|
}
|
|
59
|
-
function addAnalyticsParameterToTool(tool, parameterName, description, injectionLabel, logger = external_logger_js_namespaceObject.log) {
|
|
59
|
+
function addAnalyticsParameterToTool(tool, parameterName, description, injectionLabel, required, logger = external_logger_js_namespaceObject.log) {
|
|
60
60
|
const modifiedTool = {
|
|
61
61
|
...tool
|
|
62
62
|
};
|
|
@@ -68,8 +68,7 @@ function addAnalyticsParameterToTool(tool, parameterName, description, injection
|
|
|
68
68
|
}
|
|
69
69
|
if (!modifiedTool.inputSchema) modifiedTool.inputSchema = {
|
|
70
70
|
type: 'object',
|
|
71
|
-
properties: {}
|
|
72
|
-
required: []
|
|
71
|
+
properties: {}
|
|
73
72
|
};
|
|
74
73
|
modifiedTool.inputSchema = JSON.parse(JSON.stringify(modifiedTool.inputSchema));
|
|
75
74
|
const inputSchema = modifiedTool.inputSchema;
|
|
@@ -79,11 +78,13 @@ function addAnalyticsParameterToTool(tool, parameterName, description, injection
|
|
|
79
78
|
type: 'string',
|
|
80
79
|
description
|
|
81
80
|
};
|
|
82
|
-
if (
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
81
|
+
if (required) {
|
|
82
|
+
const existing = Array.isArray(inputSchema.required) ? inputSchema.required : [];
|
|
83
|
+
if (!existing.includes(parameterName)) inputSchema.required = [
|
|
84
|
+
...existing,
|
|
85
|
+
parameterName
|
|
86
|
+
];
|
|
87
|
+
}
|
|
87
88
|
return modifiedTool;
|
|
88
89
|
}
|
|
89
90
|
function analyticsOwnsParameter(inputSchema, parameterName) {
|
|
@@ -19,7 +19,7 @@ function hasAnalyticsParameter(schema, parameterName) {
|
|
|
19
19
|
function canInjectAnalyticsParameter(schema, parameterName) {
|
|
20
20
|
return !hasAnalyticsParameter(schema, parameterName) && !schema?.$ref && !schema?.oneOf && !schema?.allOf && !schema?.anyOf;
|
|
21
21
|
}
|
|
22
|
-
function addAnalyticsParameterToTool(tool, parameterName, description, injectionLabel, logger = log) {
|
|
22
|
+
function addAnalyticsParameterToTool(tool, parameterName, description, injectionLabel, required, logger = log) {
|
|
23
23
|
const modifiedTool = {
|
|
24
24
|
...tool
|
|
25
25
|
};
|
|
@@ -31,8 +31,7 @@ function addAnalyticsParameterToTool(tool, parameterName, description, injection
|
|
|
31
31
|
}
|
|
32
32
|
if (!modifiedTool.inputSchema) modifiedTool.inputSchema = {
|
|
33
33
|
type: 'object',
|
|
34
|
-
properties: {}
|
|
35
|
-
required: []
|
|
34
|
+
properties: {}
|
|
36
35
|
};
|
|
37
36
|
modifiedTool.inputSchema = JSON.parse(JSON.stringify(modifiedTool.inputSchema));
|
|
38
37
|
const inputSchema = modifiedTool.inputSchema;
|
|
@@ -42,11 +41,13 @@ function addAnalyticsParameterToTool(tool, parameterName, description, injection
|
|
|
42
41
|
type: 'string',
|
|
43
42
|
description
|
|
44
43
|
};
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
if (required) {
|
|
45
|
+
const existing = Array.isArray(inputSchema.required) ? inputSchema.required : [];
|
|
46
|
+
if (!existing.includes(parameterName)) inputSchema.required = [
|
|
47
|
+
...existing,
|
|
48
|
+
parameterName
|
|
49
|
+
];
|
|
50
|
+
}
|
|
50
51
|
return modifiedTool;
|
|
51
52
|
}
|
|
52
53
|
function analyticsOwnsParameter(inputSchema, parameterName) {
|
|
@@ -39,7 +39,7 @@ function captureEvent(server, eventInput, logger, requestAttribution) {
|
|
|
39
39
|
const sink = data.sink;
|
|
40
40
|
if (!sink) return;
|
|
41
41
|
const sessionInfo = requestAttribution ?? (0, external_session_js_namespaceObject.getSessionInfo)(server, data, eventInput.sessionId);
|
|
42
|
-
const duration = eventInput.duration
|
|
42
|
+
const duration = eventInput.duration ?? (eventInput.timestamp ? Date.now() - eventInput.timestamp.getTime() : void 0);
|
|
43
43
|
const fullEvent = {
|
|
44
44
|
id: eventInput.id || '',
|
|
45
45
|
sessionId: eventInput.sessionId || data.sessionId,
|
|
@@ -7,7 +7,7 @@ function captureEvent(server, eventInput, logger, requestAttribution) {
|
|
|
7
7
|
const sink = data.sink;
|
|
8
8
|
if (!sink) return;
|
|
9
9
|
const sessionInfo = requestAttribution ?? getSessionInfo(server, data, eventInput.sessionId);
|
|
10
|
-
const duration = eventInput.duration
|
|
10
|
+
const duration = eventInput.duration ?? (eventInput.timestamp ? Date.now() - eventInput.timestamp.getTime() : void 0);
|
|
11
11
|
const fullEvent = {
|
|
12
12
|
id: eventInput.id || '',
|
|
13
13
|
sessionId: eventInput.sessionId || data.sessionId,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const INACTIVITY_TIMEOUT_IN_MINUTES = 30;
|
|
2
|
-
export declare const DEFAULT_CONTEXT_PARAMETER_DESCRIPTION = "
|
|
2
|
+
export declare const DEFAULT_CONTEXT_PARAMETER_DESCRIPTION = "A few words on why you are calling this tool, for the server developer's analytics. Describe people and things by role, such as \"a customer\". Do not quote the user or include names, emails, or other personal details.";
|
|
3
3
|
export declare const DEFAULT_MODEL_PARAMETER_DESCRIPTION = "The model identifier you are running as, for example \"claude-opus-4-8\" or \"gpt-5.2\". Pass \"unknown\" if you are not certain. Recorded for the server developer's analytics.";
|
|
4
4
|
export declare const DEFAULT_CONVERSATION_ID_DESCRIPTION = "The conversation_id this server returned earlier in this conversation, unchanged, including after later user messages. Omit it if you have none. Recorded for the server developer's analytics.";
|
|
5
5
|
export declare const POSTHOG_MCP_ANALYTICS_SOURCE = "posthog_mcp_analytics";
|
|
@@ -18,6 +18,7 @@ export declare const PostHogMCPAnalyticsEvent: {
|
|
|
18
18
|
readonly ResourcesList: '$mcp_resources_list';
|
|
19
19
|
readonly ToolCall: '$mcp_tool_call';
|
|
20
20
|
readonly ToolsList: '$mcp_tools_list';
|
|
21
|
+
readonly UnknownTool: '$mcp_unknown_tool';
|
|
21
22
|
};
|
|
22
23
|
export type PostHogMCPAnalyticsEvent = (typeof PostHogMCPAnalyticsEvent)[keyof typeof PostHogMCPAnalyticsEvent];
|
|
23
24
|
export declare const PostHogMCPAnalyticsProperty: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/extensions/constants.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,6BAA6B,KAAK,CAAA;AAE/C,eAAO,MAAM,qCAAqC,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/extensions/constants.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,6BAA6B,KAAK,CAAA;AAE/C,eAAO,MAAM,qCAAqC,+NAA6N,CAAA;AAE/Q,eAAO,MAAM,mCAAmC,qLAA+K,CAAA;AAE/N,eAAO,MAAM,mCAAmC,oMACmJ,CAAA;AAEnM,eAAO,MAAM,4BAA4B,0BAA0B,CAAA;AAMnE,eAAO,MAAM,oBAAoB,qBAAqB,CAAA;AAItD,eAAO,MAAM,wBAAwB;aACnC,MAAM,EAAE,aAAa;aACrB,SAAS,EAAE,YAAY;aACvB,QAAQ,EAAE,eAAe;IACzB,2DAA2D;aAC3D,QAAQ,EAAE,WAAW;aACrB,UAAU,EAAE,iBAAiB;aAC7B,iBAAiB,EAAE,yBAAyB;aAC5C,SAAS,EAAE,iBAAiB;aAC5B,WAAW,EAAE,mBAAmB;aAChC,YAAY,EAAE,oBAAoB;aAClC,aAAa,EAAE,qBAAqB;aACpC,QAAQ,EAAE,gBAAgB;aAC1B,SAAS,EAAE,iBAAiB;aAC5B,WAAW,EAAE,mBAAmB;CACxB,CAAA;AAEV,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,OAAO,wBAAwB,CAAC,CAAA;AAE/G,eAAO,MAAM,2BAA2B;aACtC,UAAU,EAAE,kBAAkB;aAC9B,eAAe,EAAE,wBAAwB;aACzC,aAAa,EAAE,qBAAqB;aACpC,cAAc,EAAE,sBAAsB;aACtC,UAAU,EAAE,kBAAkB;aAC9B,YAAY,EAAE,oBAAoB;aAClC,SAAS,EAAE,iBAAiB;aAC5B,eAAe,EAAE,uBAAuB;aACxC,sBAAsB,EAAE,+BAA+B;aACvD,iBAAiB,EAAE,yBAAyB;aAC5C,4BAA4B,EAAE,qCAAqC;aACnE,eAAe,EAAE,uBAAuB;aACxC,qBAAqB,EAAE,8BAA8B;aACrD,YAAY,EAAE,oBAAoB;aAClC,YAAY,EAAE,oBAAoB;aAClC,SAAS,EAAE,gBAAgB;aAC3B,OAAO,EAAE,eAAe;aACxB,gBAAgB,EAAE,yBAAyB;aAC3C,SAAS,EAAE,iBAAiB;aAC5B,MAAM,EAAE,aAAa;aACrB,YAAY,EAAE,oBAAoB;aAClC,eAAe,EAAE,wBAAwB;aACzC,QAAQ,EAAE,gBAAgB;aAC1B,cAAc,EAAE,uBAAuB;aACvC,UAAU,EAAE,iBAAiB;aAC7B,eAAe,EAAE,uBAAuB;aACxC,YAAY,EAAE,oBAAoB;aAClC,QAAQ,EAAE,eAAe;aACzB,WAAW,EAAE,mBAAmB;aAChC,UAAU,EAAE,kBAAkB;aAC9B,aAAa,EAAE,qBAAqB;aACpC,SAAS,EAAE,aAAa;aACxB,MAAM,EAAE,aAAa;aACrB,YAAY,EAAE,oBAAoB;aAClC,eAAe,EAAE,uBAAuB;aACxC,QAAQ,EAAE,gBAAgB;aAC1B,YAAY,EAAE,oBAAoB;CAC1B,CAAA;AAEV,MAAM,MAAM,2BAA2B,GAAG,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,OAAO,2BAA2B,CAAC,CAAA"}
|
|
@@ -28,7 +28,7 @@ var __webpack_require__ = {};
|
|
|
28
28
|
var __webpack_exports__ = {};
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
30
|
const INACTIVITY_TIMEOUT_IN_MINUTES = 30;
|
|
31
|
-
const DEFAULT_CONTEXT_PARAMETER_DESCRIPTION = '
|
|
31
|
+
const DEFAULT_CONTEXT_PARAMETER_DESCRIPTION = 'A few words on why you are calling this tool, for the server developer\'s analytics. Describe people and things by role, such as "a customer". Do not quote the user or include names, emails, or other personal details.';
|
|
32
32
|
const DEFAULT_MODEL_PARAMETER_DESCRIPTION = 'The model identifier you are running as, for example "claude-opus-4-8" or "gpt-5.2". Pass "unknown" if you are not certain. Recorded for the server developer\'s analytics.';
|
|
33
33
|
const DEFAULT_CONVERSATION_ID_DESCRIPTION = "The conversation_id this server returned earlier in this conversation, unchanged, including after later user messages. Omit it if you have none. Recorded for the server developer's analytics.";
|
|
34
34
|
const POSTHOG_MCP_ANALYTICS_SOURCE = 'posthog_mcp_analytics';
|
|
@@ -45,7 +45,8 @@ const PostHogMCPAnalyticsEvent = {
|
|
|
45
45
|
ResourceRead: '$mcp_resource_read',
|
|
46
46
|
ResourcesList: '$mcp_resources_list',
|
|
47
47
|
ToolCall: '$mcp_tool_call',
|
|
48
|
-
ToolsList: '$mcp_tools_list'
|
|
48
|
+
ToolsList: '$mcp_tools_list',
|
|
49
|
+
UnknownTool: '$mcp_unknown_tool'
|
|
49
50
|
};
|
|
50
51
|
const PostHogMCPAnalyticsProperty = {
|
|
51
52
|
ClientName: '$mcp_client_name',
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const INACTIVITY_TIMEOUT_IN_MINUTES = 30;
|
|
2
|
-
const DEFAULT_CONTEXT_PARAMETER_DESCRIPTION = '
|
|
2
|
+
const DEFAULT_CONTEXT_PARAMETER_DESCRIPTION = 'A few words on why you are calling this tool, for the server developer\'s analytics. Describe people and things by role, such as "a customer". Do not quote the user or include names, emails, or other personal details.';
|
|
3
3
|
const DEFAULT_MODEL_PARAMETER_DESCRIPTION = 'The model identifier you are running as, for example "claude-opus-4-8" or "gpt-5.2". Pass "unknown" if you are not certain. Recorded for the server developer\'s analytics.';
|
|
4
4
|
const DEFAULT_CONVERSATION_ID_DESCRIPTION = "The conversation_id this server returned earlier in this conversation, unchanged, including after later user messages. Omit it if you have none. Recorded for the server developer's analytics.";
|
|
5
5
|
const POSTHOG_MCP_ANALYTICS_SOURCE = 'posthog_mcp_analytics';
|
|
@@ -16,7 +16,8 @@ const PostHogMCPAnalyticsEvent = {
|
|
|
16
16
|
ResourceRead: '$mcp_resource_read',
|
|
17
17
|
ResourcesList: '$mcp_resources_list',
|
|
18
18
|
ToolCall: '$mcp_tool_call',
|
|
19
|
-
ToolsList: '$mcp_tools_list'
|
|
19
|
+
ToolsList: '$mcp_tools_list',
|
|
20
|
+
UnknownTool: '$mcp_unknown_tool'
|
|
20
21
|
};
|
|
21
22
|
const PostHogMCPAnalyticsProperty = {
|
|
22
23
|
ClientName: '$mcp_client_name',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-parameters.d.ts","sourceRoot":"","sources":["../../src/extensions/context-parameters.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAA+B,KAAK,6BAA6B,EAAE,MAAM,wBAAwB,CAAA;AAExG,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE7C,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,6BAA6B,CAAA;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,GAAG,OAAO,CAEjF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAEjG;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,SAAS,qBAAqB,EAC3E,IAAI,EAAE,KAAK,EACX,0BAA0B,CAAC,EAAE,MAAM,EACnC,MAAM,GAAE,QAAc,GACrB,KAAK,
|
|
1
|
+
{"version":3,"file":"context-parameters.d.ts","sourceRoot":"","sources":["../../src/extensions/context-parameters.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAA+B,KAAK,6BAA6B,EAAE,MAAM,wBAAwB,CAAA;AAExG,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE7C,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,6BAA6B,CAAA;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,GAAG,OAAO,CAEjF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAEjG;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,SAAS,qBAAqB,EAC3E,IAAI,EAAE,KAAK,EACX,0BAA0B,CAAC,EAAE,MAAM,EACnC,MAAM,GAAE,QAAc,GACrB,KAAK,CASP;AAED,wBAAgB,0BAA0B,CAAC,KAAK,SAAS,qBAAqB,EAC5E,KAAK,EAAE,KAAK,EAAE,EACd,0BAA0B,CAAC,EAAE,MAAM,EACnC,MAAM,GAAE,QAAc,GACrB,KAAK,EAAE,CAET"}
|
|
@@ -43,7 +43,7 @@ function getContextDescription(context) {
|
|
|
43
43
|
return 'object' == typeof context ? context.description : void 0;
|
|
44
44
|
}
|
|
45
45
|
function addContextParameterToTool(tool, contextDescriptionOverride, logger = external_logger_js_namespaceObject.log) {
|
|
46
|
-
return (0, external_analytics_parameters_js_namespaceObject.addAnalyticsParameterToTool)(tool, 'context', contextDescriptionOverride || external_constants_js_namespaceObject.DEFAULT_CONTEXT_PARAMETER_DESCRIPTION, 'context', logger);
|
|
46
|
+
return (0, external_analytics_parameters_js_namespaceObject.addAnalyticsParameterToTool)(tool, 'context', contextDescriptionOverride || external_constants_js_namespaceObject.DEFAULT_CONTEXT_PARAMETER_DESCRIPTION, 'context', true, logger);
|
|
47
47
|
}
|
|
48
48
|
function addContextParameterToTools(tools, contextDescriptionOverride, logger = external_logger_js_namespaceObject.log) {
|
|
49
49
|
return tools.map((tool)=>addContextParameterToTool(tool, contextDescriptionOverride, logger));
|
|
@@ -8,7 +8,7 @@ function getContextDescription(context) {
|
|
|
8
8
|
return 'object' == typeof context ? context.description : void 0;
|
|
9
9
|
}
|
|
10
10
|
function addContextParameterToTool(tool, contextDescriptionOverride, logger = log) {
|
|
11
|
-
return addAnalyticsParameterToTool(tool, 'context', contextDescriptionOverride || DEFAULT_CONTEXT_PARAMETER_DESCRIPTION, 'context', logger);
|
|
11
|
+
return addAnalyticsParameterToTool(tool, 'context', contextDescriptionOverride || DEFAULT_CONTEXT_PARAMETER_DESCRIPTION, 'context', true, logger);
|
|
12
12
|
}
|
|
13
13
|
function addContextParameterToTools(tools, contextDescriptionOverride, logger = log) {
|
|
14
14
|
return tools.map((tool)=>addContextParameterToTool(tool, contextDescriptionOverride, logger));
|
|
@@ -16,6 +16,7 @@ export declare const MCPAnalyticsEventType: {
|
|
|
16
16
|
readonly mcpResourcesRead: 'mcp:resources/read';
|
|
17
17
|
readonly mcpToolsCall: 'mcp:tools/call';
|
|
18
18
|
readonly mcpToolsList: 'mcp:tools/list';
|
|
19
|
+
readonly mcpUnknownTool: 'mcp:unknown_tool';
|
|
19
20
|
};
|
|
20
21
|
export type MCPAnalyticsEventType = (typeof MCPAnalyticsEventType)[keyof typeof MCPAnalyticsEventType];
|
|
21
22
|
//# sourceMappingURL=event-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-types.d.ts","sourceRoot":"","sources":["../../src/extensions/event-types.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB;aAChC,MAAM,EAAE,gBAAgB;aACxB,WAAW,EAAE,cAAc;aAC3B,oBAAoB,EAAE,wBAAwB;aAC9C,aAAa,EAAE,gBAAgB;aAC/B,aAAa,EAAE,iBAAiB;aAChC,cAAc,EAAE,kBAAkB;aAClC,gBAAgB,EAAE,oBAAoB;aACtC,gBAAgB,EAAE,oBAAoB;aACtC,YAAY,EAAE,gBAAgB;aAC9B,YAAY,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"event-types.d.ts","sourceRoot":"","sources":["../../src/extensions/event-types.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB;aAChC,MAAM,EAAE,gBAAgB;aACxB,WAAW,EAAE,cAAc;aAC3B,oBAAoB,EAAE,wBAAwB;aAC9C,aAAa,EAAE,gBAAgB;aAC/B,aAAa,EAAE,iBAAiB;aAChC,cAAc,EAAE,kBAAkB;aAClC,gBAAgB,EAAE,oBAAoB;aACtC,gBAAgB,EAAE,oBAAoB;aACtC,YAAY,EAAE,gBAAgB;aAC9B,YAAY,EAAE,gBAAgB;aAC9B,cAAc,EAAE,kBAAkB;CAC1B,CAAA;AAEV,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,OAAO,qBAAqB,CAAC,CAAA"}
|
|
@@ -37,7 +37,8 @@ const MCPAnalyticsEventType = {
|
|
|
37
37
|
mcpResourcesList: 'mcp:resources/list',
|
|
38
38
|
mcpResourcesRead: 'mcp:resources/read',
|
|
39
39
|
mcpToolsCall: 'mcp:tools/call',
|
|
40
|
-
mcpToolsList: 'mcp:tools/list'
|
|
40
|
+
mcpToolsList: 'mcp:tools/list',
|
|
41
|
+
mcpUnknownTool: 'mcp:unknown_tool'
|
|
41
42
|
};
|
|
42
43
|
__webpack_require__.d(__webpack_exports__, {}, {
|
|
43
44
|
MCPAnalyticsEventType: MCPAnalyticsEventType
|
|
@@ -8,6 +8,7 @@ const MCPAnalyticsEventType = {
|
|
|
8
8
|
mcpResourcesList: 'mcp:resources/list',
|
|
9
9
|
mcpResourcesRead: 'mcp:resources/read',
|
|
10
10
|
mcpToolsCall: 'mcp:tools/call',
|
|
11
|
-
mcpToolsList: 'mcp:tools/list'
|
|
11
|
+
mcpToolsList: 'mcp:tools/list',
|
|
12
|
+
mcpUnknownTool: 'mcp:unknown_tool'
|
|
12
13
|
};
|
|
13
14
|
export { MCPAnalyticsEventType };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/extensions/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EAEtB,cAAc,EAGd,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACvB,UAAU,EACX,MAAM,UAAU,CAAA;AAEjB,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/extensions/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EAEtB,cAAc,EAGd,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACvB,UAAU,EACX,MAAM,UAAU,CAAA;AAEjB,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAK7C,eAAO,MAAM,uBAAuB,EAAG,eAAwB,CAAA;AAoF/D,KAAK,sBAAsB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;AAEtE,4FAA4F;AAC5F,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,qBAAqB,GAAG,SAAS,GACxC,sBAAsB,GAAG,SAAS,CAKpC;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,sBAA2B,GAAG,sBAAsB,CAoCtG;AAkCD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,OAAO,GAAE,sBAA2B,GACnC,cAAc,CAoBhB;AAED,iEAAiE;AACjE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAElE;AAuCD,uFAAuF;AACvF,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,cAAc,GAAG,UAAU,CAqC/E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,wBAAwB,CAS7D;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,sBAA2B,EACpC,MAAM,GAAE,QAAc,GACrB,OAAO,CAAC,wBAAwB,CAAC,CAiBnC"}
|
|
@@ -40,6 +40,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
40
40
|
const external_constants_js_namespaceObject = require("./constants.js");
|
|
41
41
|
const external_logger_js_namespaceObject = require("./logger.js");
|
|
42
42
|
const external_mcp_payloads_js_namespaceObject = require("./mcp-payloads.js");
|
|
43
|
+
const external_tools_js_namespaceObject = require("./tools.js");
|
|
43
44
|
const external_truncation_js_namespaceObject = require("./truncation.js");
|
|
44
45
|
const SEND_FEEDBACK_TOOL_NAME = 'send_feedback';
|
|
45
46
|
const FEEDBACK_TYPES = [
|
|
@@ -131,11 +132,7 @@ function getFeedbackToolDescriptor(options = {}) {
|
|
|
131
132
|
]
|
|
132
133
|
},
|
|
133
134
|
annotations: {
|
|
134
|
-
|
|
135
|
-
readOnlyHint: true,
|
|
136
|
-
openWorldHint: true,
|
|
137
|
-
idempotentHint: true,
|
|
138
|
-
destructiveHint: false
|
|
135
|
+
...external_tools_js_namespaceObject.VIRTUAL_TOOL_ANNOTATIONS
|
|
139
136
|
}
|
|
140
137
|
};
|
|
141
138
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { PostHogMCPAnalyticsProperty } from "./constants.mjs";
|
|
2
2
|
import { log } from "./logger.mjs";
|
|
3
3
|
import { sanitizeFreeText, sanitizeFreeTextValue } from "./mcp-payloads.mjs";
|
|
4
|
+
import { VIRTUAL_TOOL_ANNOTATIONS } from "./tools.mjs";
|
|
4
5
|
import { TRUNCATION_SUFFIX } from "./truncation.mjs";
|
|
5
6
|
const SEND_FEEDBACK_TOOL_NAME = 'send_feedback';
|
|
6
7
|
const FEEDBACK_TYPES = [
|
|
@@ -92,11 +93,7 @@ function getFeedbackToolDescriptor(options = {}) {
|
|
|
92
93
|
]
|
|
93
94
|
},
|
|
94
95
|
annotations: {
|
|
95
|
-
|
|
96
|
-
readOnlyHint: true,
|
|
97
|
-
openWorldHint: true,
|
|
98
|
-
idempotentHint: true,
|
|
99
|
-
destructiveHint: false
|
|
96
|
+
...VIRTUAL_TOOL_ANNOTATIONS
|
|
100
97
|
}
|
|
101
98
|
};
|
|
102
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument-highlevel.d.ts","sourceRoot":"","sources":["../../src/extensions/instrument-highlevel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAGV,sBAAsB,EAIvB,MAAM,UAAU,CAAA;AAmBjB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"instrument-highlevel.d.ts","sourceRoot":"","sources":["../../src/extensions/instrument-highlevel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAGV,sBAAsB,EAIvB,MAAM,UAAU,CAAA;AAmBjB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AA6RxC,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CAgChG"}
|
|
@@ -155,7 +155,7 @@ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInpu
|
|
|
155
155
|
wrappedTool[MCP_ANALYTICS_PROCESSED] = true;
|
|
156
156
|
return wrappedTool;
|
|
157
157
|
}
|
|
158
|
-
async function handleToolCallRequest(highLevelServer, server, originalCallToolHandler, request, extra, logger) {
|
|
158
|
+
async function handleToolCallRequest(highLevelServer, server, originalCallToolHandler, request, extra, logger, registryDispatches) {
|
|
159
159
|
const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
|
|
160
160
|
if (!data) {
|
|
161
161
|
logger('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
|
|
@@ -195,7 +195,7 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
|
|
|
195
195
|
execute: async ()=>(0, external_feedback_js_namespaceObject.handleFeedback)(report, feedbackOptions, data.logger)
|
|
196
196
|
});
|
|
197
197
|
}
|
|
198
|
-
const registeredTool = toolName ? highLevelServer._registeredTools[toolName] : void 0;
|
|
198
|
+
const registeredTool = toolName && Object.prototype.hasOwnProperty.call(highLevelServer._registeredTools, toolName) ? highLevelServer._registeredTools[toolName] : void 0;
|
|
199
199
|
return await (0, external_instrumentation_js_namespaceObject.captureToolCall)({
|
|
200
200
|
server,
|
|
201
201
|
data,
|
|
@@ -204,6 +204,7 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
|
|
|
204
204
|
execute: (downstreamRequest)=>originalCallToolHandler(downstreamRequest, extra),
|
|
205
205
|
parameterOwnership: registeredTool ? (0, external_analytics_parameters_js_namespaceObject.getAnalyticsParameterOwnership)(registeredTool.inputSchema, registeredTool.outputSchema) : void 0,
|
|
206
206
|
inputSchema: registeredTool?.inputSchema,
|
|
207
|
+
isUnknownTool: !!toolName && !registeredTool && registryDispatches(),
|
|
207
208
|
takeCapturedError: ()=>{
|
|
208
209
|
const captured = extra?.__mcp_analytics_error;
|
|
209
210
|
if (extra) extra.__mcp_analytics_error = void 0;
|
|
@@ -215,10 +216,11 @@ function instrumentHighLevelServer(server, logger) {
|
|
|
215
216
|
try {
|
|
216
217
|
const lowLevelServer = server.server;
|
|
217
218
|
const mcpAnalyticsData = (0, external_internal_js_namespaceObject.getServerTrackingData)(lowLevelServer);
|
|
219
|
+
const registryDispatches = trackRegistryDispatch(server);
|
|
218
220
|
const handlers = {
|
|
219
221
|
initialize: (trackedServer, originalHandler, request, extra)=>(0, external_instrumentation_js_namespaceObject.handleInitializeRequest)(trackedServer, originalHandler, request, extra, logger),
|
|
220
222
|
'tools/list': (trackedServer, originalHandler, request, extra)=>(0, external_instrumentation_js_namespaceObject.handleListToolsRequest)(trackedServer, originalHandler, request, extra, logger),
|
|
221
|
-
'tools/call': (trackedServer, originalHandler, request, extra)=>handleToolCallRequest(server, trackedServer, originalHandler, request, extra, logger),
|
|
223
|
+
'tools/call': (trackedServer, originalHandler, request, extra)=>handleToolCallRequest(server, trackedServer, originalHandler, request, extra, logger, registryDispatches),
|
|
222
224
|
'resources/list': (0, external_instrumentation_js_namespaceObject.traceResourceRequest)(external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpResourcesList, logger),
|
|
223
225
|
'resources/templates/list': (0, external_instrumentation_js_namespaceObject.traceResourceRequest)(external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpResourcesList, logger),
|
|
224
226
|
'resources/read': (0, external_instrumentation_js_namespaceObject.traceResourceRequest)(external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpResourcesRead, logger)
|
|
@@ -234,6 +236,16 @@ function instrumentHighLevelServer(server, logger) {
|
|
|
234
236
|
logger(`Warning: Failed to setup tool call instrumentation - ${error}`);
|
|
235
237
|
}
|
|
236
238
|
}
|
|
239
|
+
function trackRegistryDispatch(server) {
|
|
240
|
+
const lowLevelServer = server.server;
|
|
241
|
+
let replaced = false;
|
|
242
|
+
const setRequestHandler = lowLevelServer.setRequestHandler.bind(lowLevelServer);
|
|
243
|
+
lowLevelServer.setRequestHandler = (...args)=>{
|
|
244
|
+
if (server._toolHandlersInitialized && 'tools/call' === (0, external_mcp_sdk_compat_js_namespaceObject.readRequestHandlerMethod)(args[0])) replaced = true;
|
|
245
|
+
return setRequestHandler(...args);
|
|
246
|
+
};
|
|
247
|
+
return ()=>true === server._toolHandlersInitialized && !replaced;
|
|
248
|
+
}
|
|
237
249
|
function seedToolDescriptionsFromRegistry(cache, tools) {
|
|
238
250
|
for (const [name, tool] of Object.entries(tools))if ('string' == typeof tool?.description) cache.set(name, tool.description);
|
|
239
251
|
}
|
|
@@ -4,7 +4,7 @@ import { isContextEnabled } from "./context-parameters.mjs";
|
|
|
4
4
|
import { isCaptureModelEnabled } from "./model-parameters.mjs";
|
|
5
5
|
import { MCPAnalyticsEventType } from "./event-types.mjs";
|
|
6
6
|
import { getServerTrackingData } from "./internal.mjs";
|
|
7
|
-
import { createWrappedTool, getToolFunction, hasToolFunction } from "./mcp-sdk-compat.mjs";
|
|
7
|
+
import { createWrappedTool, getToolFunction, hasToolFunction, readRequestHandlerMethod } from "./mcp-sdk-compat.mjs";
|
|
8
8
|
import { getReportMissingToolDescriptor, handleReportMissing, resolveMissingCapabilityToolName } from "./tools.mjs";
|
|
9
9
|
import { captureToolCall, handleInitializeRequest, handleListToolsRequest, isToolAdvertised, patchRequestHandlers, readToolMetaCategory, traceResourceRequest } from "./instrumentation.mjs";
|
|
10
10
|
import { getContextArgument } from "./tracing-helpers.mjs";
|
|
@@ -123,7 +123,7 @@ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInpu
|
|
|
123
123
|
wrappedTool[MCP_ANALYTICS_PROCESSED] = true;
|
|
124
124
|
return wrappedTool;
|
|
125
125
|
}
|
|
126
|
-
async function handleToolCallRequest(highLevelServer, server, originalCallToolHandler, request, extra, logger) {
|
|
126
|
+
async function handleToolCallRequest(highLevelServer, server, originalCallToolHandler, request, extra, logger, registryDispatches) {
|
|
127
127
|
const data = getServerTrackingData(server);
|
|
128
128
|
if (!data) {
|
|
129
129
|
logger('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
|
|
@@ -163,7 +163,7 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
|
|
|
163
163
|
execute: async ()=>handleFeedback(report, feedbackOptions, data.logger)
|
|
164
164
|
});
|
|
165
165
|
}
|
|
166
|
-
const registeredTool = toolName ? highLevelServer._registeredTools[toolName] : void 0;
|
|
166
|
+
const registeredTool = toolName && Object.prototype.hasOwnProperty.call(highLevelServer._registeredTools, toolName) ? highLevelServer._registeredTools[toolName] : void 0;
|
|
167
167
|
return await captureToolCall({
|
|
168
168
|
server,
|
|
169
169
|
data,
|
|
@@ -172,6 +172,7 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
|
|
|
172
172
|
execute: (downstreamRequest)=>originalCallToolHandler(downstreamRequest, extra),
|
|
173
173
|
parameterOwnership: registeredTool ? getAnalyticsParameterOwnership(registeredTool.inputSchema, registeredTool.outputSchema) : void 0,
|
|
174
174
|
inputSchema: registeredTool?.inputSchema,
|
|
175
|
+
isUnknownTool: !!toolName && !registeredTool && registryDispatches(),
|
|
175
176
|
takeCapturedError: ()=>{
|
|
176
177
|
const captured = extra?.__mcp_analytics_error;
|
|
177
178
|
if (extra) extra.__mcp_analytics_error = void 0;
|
|
@@ -183,10 +184,11 @@ function instrumentHighLevelServer(server, logger) {
|
|
|
183
184
|
try {
|
|
184
185
|
const lowLevelServer = server.server;
|
|
185
186
|
const mcpAnalyticsData = getServerTrackingData(lowLevelServer);
|
|
187
|
+
const registryDispatches = trackRegistryDispatch(server);
|
|
186
188
|
const handlers = {
|
|
187
189
|
initialize: (trackedServer, originalHandler, request, extra)=>handleInitializeRequest(trackedServer, originalHandler, request, extra, logger),
|
|
188
190
|
'tools/list': (trackedServer, originalHandler, request, extra)=>handleListToolsRequest(trackedServer, originalHandler, request, extra, logger),
|
|
189
|
-
'tools/call': (trackedServer, originalHandler, request, extra)=>handleToolCallRequest(server, trackedServer, originalHandler, request, extra, logger),
|
|
191
|
+
'tools/call': (trackedServer, originalHandler, request, extra)=>handleToolCallRequest(server, trackedServer, originalHandler, request, extra, logger, registryDispatches),
|
|
190
192
|
'resources/list': traceResourceRequest(MCPAnalyticsEventType.mcpResourcesList, logger),
|
|
191
193
|
'resources/templates/list': traceResourceRequest(MCPAnalyticsEventType.mcpResourcesList, logger),
|
|
192
194
|
'resources/read': traceResourceRequest(MCPAnalyticsEventType.mcpResourcesRead, logger)
|
|
@@ -202,6 +204,16 @@ function instrumentHighLevelServer(server, logger) {
|
|
|
202
204
|
logger(`Warning: Failed to setup tool call instrumentation - ${error}`);
|
|
203
205
|
}
|
|
204
206
|
}
|
|
207
|
+
function trackRegistryDispatch(server) {
|
|
208
|
+
const lowLevelServer = server.server;
|
|
209
|
+
let replaced = false;
|
|
210
|
+
const setRequestHandler = lowLevelServer.setRequestHandler.bind(lowLevelServer);
|
|
211
|
+
lowLevelServer.setRequestHandler = (...args)=>{
|
|
212
|
+
if (server._toolHandlersInitialized && 'tools/call' === readRequestHandlerMethod(args[0])) replaced = true;
|
|
213
|
+
return setRequestHandler(...args);
|
|
214
|
+
};
|
|
215
|
+
return ()=>true === server._toolHandlersInitialized && !replaced;
|
|
216
|
+
}
|
|
205
217
|
function seedToolDescriptionsFromRegistry(cache, tools) {
|
|
206
218
|
for (const [name, tool] of Object.entries(tools))if ('string' == typeof tool?.description) cache.set(name, tool.description);
|
|
207
219
|
}
|
|
@@ -99,7 +99,9 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
|
|
|
99
99
|
execute: async ()=>(0, external_feedback_js_namespaceObject.handleFeedback)(report, feedbackOptions, data.logger)
|
|
100
100
|
});
|
|
101
101
|
}
|
|
102
|
-
const
|
|
102
|
+
const lookup = lookUpOriginalTool(data, toolName);
|
|
103
|
+
const originalTool = lookup.registered ? lookup.tool : void 0;
|
|
104
|
+
const hasDispatcher = void 0 !== originalCallToolHandler && originalCallToolHandler !== unknownToolHandler;
|
|
103
105
|
return await (0, external_instrumentation_js_namespaceObject.captureToolCall)({
|
|
104
106
|
server,
|
|
105
107
|
data,
|
|
@@ -107,16 +109,27 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
|
|
|
107
109
|
extra,
|
|
108
110
|
execute: (downstreamRequest)=>runOriginalToolHandler(originalCallToolHandler, downstreamRequest, extra),
|
|
109
111
|
parameterOwnership: originalTool && !(toolName && data.toolAnalyticsParameterOwnership.has(toolName)) ? (0, external_analytics_parameters_js_namespaceObject.getAnalyticsParameterOwnership)(originalTool.inputSchema) : void 0,
|
|
110
|
-
inputSchema: originalTool?.inputSchema
|
|
112
|
+
inputSchema: originalTool?.inputSchema,
|
|
113
|
+
isUnknownTool: !!toolName && (!hasDispatcher || false === lookup.registered)
|
|
111
114
|
});
|
|
112
115
|
}
|
|
113
|
-
function
|
|
114
|
-
if (!toolName || !data.options.resolveOriginalTool) return
|
|
116
|
+
function lookUpOriginalTool(data, toolName) {
|
|
117
|
+
if (!toolName || !data.options.resolveOriginalTool) return {
|
|
118
|
+
registered: void 0
|
|
119
|
+
};
|
|
115
120
|
try {
|
|
116
|
-
|
|
121
|
+
const tool = data.options.resolveOriginalTool(toolName);
|
|
122
|
+
return tool ? {
|
|
123
|
+
registered: true,
|
|
124
|
+
tool
|
|
125
|
+
} : {
|
|
126
|
+
registered: false
|
|
127
|
+
};
|
|
117
128
|
} catch (error) {
|
|
118
129
|
data.logger(`Warning: resolveOriginalTool failed for tool ${toolName} - ${error}`);
|
|
119
|
-
return
|
|
130
|
+
return {
|
|
131
|
+
registered: void 0
|
|
132
|
+
};
|
|
120
133
|
}
|
|
121
134
|
}
|
|
122
135
|
function runOriginalToolHandler(handler, request, extra) {
|
|
@@ -67,7 +67,9 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
|
|
|
67
67
|
execute: async ()=>handleFeedback(report, feedbackOptions, data.logger)
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
|
-
const
|
|
70
|
+
const lookup = lookUpOriginalTool(data, toolName);
|
|
71
|
+
const originalTool = lookup.registered ? lookup.tool : void 0;
|
|
72
|
+
const hasDispatcher = void 0 !== originalCallToolHandler && originalCallToolHandler !== unknownToolHandler;
|
|
71
73
|
return await captureToolCall({
|
|
72
74
|
server,
|
|
73
75
|
data,
|
|
@@ -75,16 +77,27 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
|
|
|
75
77
|
extra,
|
|
76
78
|
execute: (downstreamRequest)=>runOriginalToolHandler(originalCallToolHandler, downstreamRequest, extra),
|
|
77
79
|
parameterOwnership: originalTool && !(toolName && data.toolAnalyticsParameterOwnership.has(toolName)) ? getAnalyticsParameterOwnership(originalTool.inputSchema) : void 0,
|
|
78
|
-
inputSchema: originalTool?.inputSchema
|
|
80
|
+
inputSchema: originalTool?.inputSchema,
|
|
81
|
+
isUnknownTool: !!toolName && (!hasDispatcher || false === lookup.registered)
|
|
79
82
|
});
|
|
80
83
|
}
|
|
81
|
-
function
|
|
82
|
-
if (!toolName || !data.options.resolveOriginalTool) return
|
|
84
|
+
function lookUpOriginalTool(data, toolName) {
|
|
85
|
+
if (!toolName || !data.options.resolveOriginalTool) return {
|
|
86
|
+
registered: void 0
|
|
87
|
+
};
|
|
83
88
|
try {
|
|
84
|
-
|
|
89
|
+
const tool = data.options.resolveOriginalTool(toolName);
|
|
90
|
+
return tool ? {
|
|
91
|
+
registered: true,
|
|
92
|
+
tool
|
|
93
|
+
} : {
|
|
94
|
+
registered: false
|
|
95
|
+
};
|
|
85
96
|
} catch (error) {
|
|
86
97
|
data.logger(`Warning: resolveOriginalTool failed for tool ${toolName} - ${error}`);
|
|
87
|
-
return
|
|
98
|
+
return {
|
|
99
|
+
registered: void 0
|
|
100
|
+
};
|
|
88
101
|
}
|
|
89
102
|
}
|
|
90
103
|
function runOriginalToolHandler(handler, request, extra) {
|
|
@@ -52,6 +52,11 @@ interface TraceToolCallParams {
|
|
|
52
52
|
* read it here to capture the real stack rather than the result envelope.
|
|
53
53
|
*/
|
|
54
54
|
takeCapturedError?: () => unknown;
|
|
55
|
+
/**
|
|
56
|
+
* The SDK knows the server has no tool by this name, so a rejected call is
|
|
57
|
+
* recorded as `$mcp_unknown_tool`, not as a tool call.
|
|
58
|
+
*/
|
|
59
|
+
isUnknownTool?: boolean;
|
|
55
60
|
}
|
|
56
61
|
/**
|
|
57
62
|
* The shared tool-call lifecycle: resolve conversation id, build + enrich the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,2BAA2B,EAC3B,6BAA6B,EAC7B,uBAAuB,EAEvB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EAId,MAAM,UAAU,CAAA;AAqBjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAIrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAiBxC;;;;;;GAMG;AAEH,KAAK,iBAAiB,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,6BAA6B,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAE7G,2EAA2E;AAC3E,KAAK,YAAY,GAAG,CAAC,iBAAiB,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAmB3E,UAAU,mBAAmB;IAC3B,MAAM,EAAE,aAAa,CAAA;IACrB,IAAI,EAAE,gBAAgB,CAAA;IACtB,OAAO,EAAE,cAAc,CAAA;IACvB,KAAK,CAAC,EAAE,6BAA6B,CAAA;IACrC,OAAO,EAAE,YAAY,CAAA;IACrB,2FAA2F;IAC3F,kBAAkB,CAAC,EAAE,2BAA2B,CAAA;IAChD,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,qBAAqB,CAAA;IACjC;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,UAAU,CAAA;IACjC;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"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"}
|