@posthog/mcp 0.10.3 → 0.10.4

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 (40) hide show
  1. package/dist/extensions/analytics-parameters.d.ts +5 -0
  2. package/dist/extensions/analytics-parameters.d.ts.map +1 -1
  3. package/dist/extensions/analytics-parameters.js +57 -3
  4. package/dist/extensions/analytics-parameters.mjs +47 -2
  5. package/dist/extensions/context-parameters.d.ts +1 -1
  6. package/dist/extensions/context-parameters.js +1 -1
  7. package/dist/extensions/context-parameters.mjs +1 -1
  8. package/dist/extensions/conversation-id.d.ts +0 -6
  9. package/dist/extensions/conversation-id.d.ts.map +1 -1
  10. package/dist/extensions/conversation-id.js +3 -18
  11. package/dist/extensions/conversation-id.mjs +2 -14
  12. package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
  13. package/dist/extensions/instrument-highlevel.js +9 -28
  14. package/dist/extensions/instrument-highlevel.mjs +8 -27
  15. package/dist/extensions/instrumentation.d.ts +4 -6
  16. package/dist/extensions/instrumentation.d.ts.map +1 -1
  17. package/dist/extensions/instrumentation.js +32 -6
  18. package/dist/extensions/instrumentation.mjs +33 -7
  19. package/dist/extensions/intent.d.ts +1 -1
  20. package/dist/extensions/intent.d.ts.map +1 -1
  21. package/dist/extensions/intent.js +2 -2
  22. package/dist/extensions/intent.mjs +2 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -0
  25. package/dist/index.mjs +1 -0
  26. package/dist/types.d.ts +5 -0
  27. package/dist/types.d.ts.map +1 -1
  28. package/dist/version.d.ts +1 -1
  29. package/dist/version.js +1 -1
  30. package/dist/version.mjs +1 -1
  31. package/package.json +4 -4
  32. package/src/extensions/analytics-parameters.ts +67 -1
  33. package/src/extensions/context-parameters.ts +2 -2
  34. package/src/extensions/conversation-id.ts +1 -20
  35. package/src/extensions/instrument-highlevel.ts +21 -50
  36. package/src/extensions/instrumentation.ts +71 -11
  37. package/src/extensions/intent.ts +7 -1
  38. package/src/index.ts +1 -0
  39. package/src/types.ts +6 -0
  40. package/src/version.ts +1 -1
@@ -1,4 +1,6 @@
1
+ import type { AnalyticsParameterOwnership } from '../types';
1
2
  export interface AnalyticsInjectableJsonSchema {
3
+ $ref?: unknown;
2
4
  additionalProperties?: boolean;
3
5
  allOf?: unknown;
4
6
  anyOf?: unknown;
@@ -9,4 +11,7 @@ export interface AnalyticsInjectableJsonSchema {
9
11
  }
10
12
  export declare function hasAnalyticsParameter(schema: AnalyticsInjectableJsonSchema | undefined, parameterName: string): boolean;
11
13
  export declare function canInjectAnalyticsParameter(schema: AnalyticsInjectableJsonSchema | undefined, parameterName: string): boolean;
14
+ export declare function analyticsOwnsParameter(inputSchema: unknown, parameterName: string): boolean;
15
+ export declare function getAnalyticsParameterOwnership(inputSchema: unknown): AnalyticsParameterOwnership;
16
+ export declare function stripOwnedAnalyticsArguments(args: unknown, ownership: AnalyticsParameterOwnership): unknown;
12
17
  //# sourceMappingURL=analytics-parameters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analytics-parameters.d.ts","sourceRoot":"","sources":["../../src/extensions/analytics-parameters.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,6BAA6B;IAC5C,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,CAET"}
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;AAgB3D,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,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAyB3F;AAED,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,OAAO,GAAG,2BAA2B,CAKhG;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,2BAA2B,GAAG,OAAO,CAW3G"}
@@ -24,20 +24,74 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
+ hasAnalyticsParameter: ()=>hasAnalyticsParameter,
28
+ analyticsOwnsParameter: ()=>analyticsOwnsParameter,
29
+ getAnalyticsParameterOwnership: ()=>getAnalyticsParameterOwnership,
27
30
  canInjectAnalyticsParameter: ()=>canInjectAnalyticsParameter,
28
- hasAnalyticsParameter: ()=>hasAnalyticsParameter
31
+ stripOwnedAnalyticsArguments: ()=>stripOwnedAnalyticsArguments
29
32
  });
33
+ const external_mcp_sdk_compat_js_namespaceObject = require("./mcp-sdk-compat.js");
34
+ const JSON_SCHEMA_KEYWORDS = [
35
+ '$defs',
36
+ '$ref',
37
+ 'additionalProperties',
38
+ 'allOf',
39
+ 'anyOf',
40
+ 'definitions',
41
+ 'oneOf',
42
+ 'properties',
43
+ 'required',
44
+ 'type'
45
+ ];
30
46
  function hasAnalyticsParameter(schema, parameterName) {
31
47
  return !!schema?.properties && Object.prototype.hasOwnProperty.call(schema.properties, parameterName);
32
48
  }
33
49
  function canInjectAnalyticsParameter(schema, parameterName) {
34
- return !hasAnalyticsParameter(schema, parameterName) && !schema?.oneOf && !schema?.allOf && !schema?.anyOf;
50
+ return !hasAnalyticsParameter(schema, parameterName) && !schema?.$ref && !schema?.oneOf && !schema?.allOf && !schema?.anyOf;
35
51
  }
52
+ function analyticsOwnsParameter(inputSchema, parameterName) {
53
+ if (!inputSchema || 'object' != typeof inputSchema) return canInjectAnalyticsParameter(void 0, parameterName);
54
+ if ((0, external_mcp_sdk_compat_js_namespaceObject.isZodRawShapeCompat)(inputSchema)) return canInjectAnalyticsParameter({
55
+ properties: inputSchema
56
+ }, parameterName);
57
+ const shape = (0, external_mcp_sdk_compat_js_namespaceObject.getObjectShape)(inputSchema);
58
+ if (shape) return canInjectAnalyticsParameter({
59
+ properties: shape
60
+ }, parameterName);
61
+ const schema = inputSchema;
62
+ if (JSON_SCHEMA_KEYWORDS.some((keyword)=>Object.prototype.hasOwnProperty.call(schema, keyword))) return canInjectAnalyticsParameter(schema, parameterName);
63
+ if ('_def' in schema || '_zod' in schema || '~standard' in schema) return canInjectAnalyticsParameter(void 0, parameterName);
64
+ return canInjectAnalyticsParameter(schema, parameterName);
65
+ }
66
+ function getAnalyticsParameterOwnership(inputSchema) {
67
+ return {
68
+ context: analyticsOwnsParameter(inputSchema, 'context'),
69
+ conversationId: analyticsOwnsParameter(inputSchema, 'conversation_id')
70
+ };
71
+ }
72
+ function stripOwnedAnalyticsArguments(args, ownership) {
73
+ let cleanedArgs = args;
74
+ if (ownership.context && cleanedArgs && 'object' == typeof cleanedArgs && 'context' in cleanedArgs) {
75
+ const { context: _context, ...rest } = cleanedArgs;
76
+ cleanedArgs = rest;
77
+ }
78
+ if (ownership.conversationId && cleanedArgs && 'object' == typeof cleanedArgs && 'conversation_id' in cleanedArgs) {
79
+ const { conversation_id: _conversationId, ...rest } = cleanedArgs;
80
+ cleanedArgs = rest;
81
+ }
82
+ return cleanedArgs;
83
+ }
84
+ exports.analyticsOwnsParameter = __webpack_exports__.analyticsOwnsParameter;
36
85
  exports.canInjectAnalyticsParameter = __webpack_exports__.canInjectAnalyticsParameter;
86
+ exports.getAnalyticsParameterOwnership = __webpack_exports__.getAnalyticsParameterOwnership;
37
87
  exports.hasAnalyticsParameter = __webpack_exports__.hasAnalyticsParameter;
88
+ exports.stripOwnedAnalyticsArguments = __webpack_exports__.stripOwnedAnalyticsArguments;
38
89
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
90
+ "analyticsOwnsParameter",
39
91
  "canInjectAnalyticsParameter",
40
- "hasAnalyticsParameter"
92
+ "getAnalyticsParameterOwnership",
93
+ "hasAnalyticsParameter",
94
+ "stripOwnedAnalyticsArguments"
41
95
  ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
42
96
  Object.defineProperty(exports, '__esModule', {
43
97
  value: true
@@ -1,7 +1,52 @@
1
+ import { getObjectShape, isZodRawShapeCompat } from "./mcp-sdk-compat.mjs";
2
+ const JSON_SCHEMA_KEYWORDS = [
3
+ '$defs',
4
+ '$ref',
5
+ 'additionalProperties',
6
+ 'allOf',
7
+ 'anyOf',
8
+ 'definitions',
9
+ 'oneOf',
10
+ 'properties',
11
+ 'required',
12
+ 'type'
13
+ ];
1
14
  function hasAnalyticsParameter(schema, parameterName) {
2
15
  return !!schema?.properties && Object.prototype.hasOwnProperty.call(schema.properties, parameterName);
3
16
  }
4
17
  function canInjectAnalyticsParameter(schema, parameterName) {
5
- return !hasAnalyticsParameter(schema, parameterName) && !schema?.oneOf && !schema?.allOf && !schema?.anyOf;
18
+ return !hasAnalyticsParameter(schema, parameterName) && !schema?.$ref && !schema?.oneOf && !schema?.allOf && !schema?.anyOf;
6
19
  }
7
- export { canInjectAnalyticsParameter, hasAnalyticsParameter };
20
+ function analyticsOwnsParameter(inputSchema, parameterName) {
21
+ if (!inputSchema || 'object' != typeof inputSchema) return canInjectAnalyticsParameter(void 0, parameterName);
22
+ if (isZodRawShapeCompat(inputSchema)) return canInjectAnalyticsParameter({
23
+ properties: inputSchema
24
+ }, parameterName);
25
+ const shape = getObjectShape(inputSchema);
26
+ if (shape) return canInjectAnalyticsParameter({
27
+ properties: shape
28
+ }, parameterName);
29
+ const schema = inputSchema;
30
+ if (JSON_SCHEMA_KEYWORDS.some((keyword)=>Object.prototype.hasOwnProperty.call(schema, keyword))) return canInjectAnalyticsParameter(schema, parameterName);
31
+ if ('_def' in schema || '_zod' in schema || '~standard' in schema) return canInjectAnalyticsParameter(void 0, parameterName);
32
+ return canInjectAnalyticsParameter(schema, parameterName);
33
+ }
34
+ function getAnalyticsParameterOwnership(inputSchema) {
35
+ return {
36
+ context: analyticsOwnsParameter(inputSchema, 'context'),
37
+ conversationId: analyticsOwnsParameter(inputSchema, 'conversation_id')
38
+ };
39
+ }
40
+ function stripOwnedAnalyticsArguments(args, ownership) {
41
+ let cleanedArgs = args;
42
+ if (ownership.context && cleanedArgs && 'object' == typeof cleanedArgs && 'context' in cleanedArgs) {
43
+ const { context: _context, ...rest } = cleanedArgs;
44
+ cleanedArgs = rest;
45
+ }
46
+ if (ownership.conversationId && cleanedArgs && 'object' == typeof cleanedArgs && 'conversation_id' in cleanedArgs) {
47
+ const { conversation_id: _conversationId, ...rest } = cleanedArgs;
48
+ cleanedArgs = rest;
49
+ }
50
+ return cleanedArgs;
51
+ }
52
+ export { analyticsOwnsParameter, canInjectAnalyticsParameter, getAnalyticsParameterOwnership, hasAnalyticsParameter, stripOwnedAnalyticsArguments };
@@ -14,7 +14,7 @@ export declare function getContextDescription(context: MCPAnalyticsOptions['cont
14
14
  *
15
15
  * Skips injection (with warning) for:
16
16
  * - Tools that already have a 'context' parameter
17
- * - Complex schemas (oneOf/allOf/anyOf) that can't safely have properties added
17
+ * - Complex schemas (oneOf/allOf/anyOf/$ref) that can't safely have properties added
18
18
  * - Schemas with additionalProperties: false
19
19
  */
20
20
  export declare function addContextParameterToTool<TTool extends ContextInjectableTool>(tool: TTool, contextDescriptionOverride?: string): TTool;
@@ -46,7 +46,7 @@ function addContextParameterToTool(tool, contextDescriptionOverride) {
46
46
  const schema = modifiedTool.inputSchema;
47
47
  if (!(0, external_analytics_parameters_js_namespaceObject.canInjectAnalyticsParameter)(schema, 'context')) {
48
48
  if ((0, external_analytics_parameters_js_namespaceObject.hasAnalyticsParameter)(schema, 'context')) (0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" already has 'context' parameter. Skipping context injection.`);
49
- else (0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf). Skipping context injection.`);
49
+ else (0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf/$ref). Skipping context injection.`);
50
50
  return modifiedTool;
51
51
  }
52
52
  if (!modifiedTool.inputSchema) modifiedTool.inputSchema = {
@@ -14,7 +14,7 @@ function addContextParameterToTool(tool, contextDescriptionOverride) {
14
14
  const toolName = tool.name || 'unknown';
15
15
  const schema = modifiedTool.inputSchema;
16
16
  if (!canInjectAnalyticsParameter(schema, 'context')) {
17
- hasAnalyticsParameter(schema, 'context') ? log(`WARN: Tool "${toolName}" already has 'context' parameter. Skipping context injection.`) : log(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf). Skipping context injection.`);
17
+ hasAnalyticsParameter(schema, 'context') ? log(`WARN: Tool "${toolName}" already has 'context' parameter. Skipping context injection.`) : log(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf/$ref). Skipping context injection.`);
18
18
  return modifiedTool;
19
19
  }
20
20
  if (!modifiedTool.inputSchema) modifiedTool.inputSchema = {
@@ -28,12 +28,6 @@ export declare function resolveConversationId(enabled: boolean, args: unknown, t
28
28
  */
29
29
  export declare function canInjectConversationIdPromptBack(result: unknown): boolean;
30
30
  export declare function extractConversationId(args: unknown): string | undefined;
31
- export declare function cloneRequestWithoutConversationId<TRequest extends {
32
- params?: {
33
- arguments?: unknown;
34
- [k: string]: unknown;
35
- };
36
- }>(request: TRequest): TRequest;
37
31
  export declare function stripConversationId(args: unknown): unknown;
38
32
  export declare function buildConversationIdPromptBack(conversationId: string): {
39
33
  type: 'text';
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-id.d.ts","sourceRoot":"","sources":["../../src/extensions/conversation-id.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,wBAAwB,CAAA;AAK/B,eAAO,MAAM,0BAA0B,oBAAoB,CAAA;AAE3D,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,6BAA6B,CAAA;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,SAAS,4BAA4B,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,CA0CtG;AAED,wBAAgB,wBAAwB,CAAC,KAAK,SAAS,4BAA4B,EACjF,KAAK,EAAE,KAAK,EAAE,EACd,yBAAyB,GAAE,MAA4B,GACtD,KAAK,EAAE,CAOT;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACrD;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,yBAAyB,GAAE,MAA4B,GACtD,wBAAwB,CAS1B;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAS1E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAUvE;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,SAAS;IAAE,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAA;CAAE,EAC3E,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAe7B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAM1D;AAED,wBAAgB,6BAA6B,CAAC,cAAc,EAAE,MAAM,GAAG;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAKA;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAS/F"}
1
+ {"version":3,"file":"conversation-id.d.ts","sourceRoot":"","sources":["../../src/extensions/conversation-id.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,wBAAwB,CAAA;AAK/B,eAAO,MAAM,0BAA0B,oBAAoB,CAAA;AAE3D,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,6BAA6B,CAAA;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,SAAS,4BAA4B,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,CA0CtG;AAED,wBAAgB,wBAAwB,CAAC,KAAK,SAAS,4BAA4B,EACjF,KAAK,EAAE,KAAK,EAAE,EACd,yBAAyB,GAAE,MAA4B,GACtD,KAAK,EAAE,CAOT;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACrD;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,yBAAyB,GAAE,MAA4B,GACtD,wBAAwB,CAS1B;AAED;;;;GAIG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAS1E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAUvE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAM1D;AAED,wBAAgB,6BAA6B,CAAC,cAAc,EAAE,MAAM,GAAG;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAKA;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAS/F"}
@@ -27,11 +27,10 @@ __webpack_require__.d(__webpack_exports__, {
27
27
  CONVERSATION_ID_PARAM_NAME: ()=>CONVERSATION_ID_PARAM_NAME,
28
28
  resolveConversationId: ()=>resolveConversationId,
29
29
  buildConversationIdPromptBack: ()=>buildConversationIdPromptBack,
30
- addConversationIdToTool: ()=>addConversationIdToTool,
30
+ injectConversationIdPromptBack: ()=>injectConversationIdPromptBack,
31
31
  addConversationIdToTools: ()=>addConversationIdToTools,
32
32
  extractConversationId: ()=>extractConversationId,
33
- injectConversationIdPromptBack: ()=>injectConversationIdPromptBack,
34
- cloneRequestWithoutConversationId: ()=>cloneRequestWithoutConversationId,
33
+ addConversationIdToTool: ()=>addConversationIdToTool,
35
34
  stripConversationId: ()=>stripConversationId,
36
35
  canInjectConversationIdPromptBack: ()=>canInjectConversationIdPromptBack
37
36
  });
@@ -49,7 +48,7 @@ function addConversationIdToTool(tool) {
49
48
  const schema = modifiedTool.inputSchema;
50
49
  if (!(0, external_analytics_parameters_js_namespaceObject.canInjectAnalyticsParameter)(schema, CONVERSATION_ID_PARAM_NAME)) {
51
50
  if ((0, external_analytics_parameters_js_namespaceObject.hasAnalyticsParameter)(schema, CONVERSATION_ID_PARAM_NAME)) (0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" already has '${CONVERSATION_ID_PARAM_NAME}' parameter. Skipping conversation_id injection.`);
52
- else (0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf). Skipping conversation_id injection.`);
51
+ else (0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf/$ref). Skipping conversation_id injection.`);
53
52
  return modifiedTool;
54
53
  }
55
54
  if (!modifiedTool.inputSchema) modifiedTool.inputSchema = {
@@ -101,18 +100,6 @@ function extractConversationId(args) {
101
100
  const trimmed = value.trim();
102
101
  return trimmed.length > 0 ? trimmed : void 0;
103
102
  }
104
- function cloneRequestWithoutConversationId(request) {
105
- if (!request.params || 'object' != typeof request.params) return request;
106
- const args = request.params.arguments;
107
- if (!(args && 'object' == typeof args)) return request;
108
- return {
109
- ...request,
110
- params: {
111
- ...request.params,
112
- arguments: stripConversationId(args)
113
- }
114
- };
115
- }
116
103
  function stripConversationId(args) {
117
104
  if (!args || 'object' != typeof args || !(CONVERSATION_ID_PARAM_NAME in args)) return args;
118
105
  const { [CONVERSATION_ID_PARAM_NAME]: _omit, ...rest } = args;
@@ -140,7 +127,6 @@ exports.addConversationIdToTool = __webpack_exports__.addConversationIdToTool;
140
127
  exports.addConversationIdToTools = __webpack_exports__.addConversationIdToTools;
141
128
  exports.buildConversationIdPromptBack = __webpack_exports__.buildConversationIdPromptBack;
142
129
  exports.canInjectConversationIdPromptBack = __webpack_exports__.canInjectConversationIdPromptBack;
143
- exports.cloneRequestWithoutConversationId = __webpack_exports__.cloneRequestWithoutConversationId;
144
130
  exports.extractConversationId = __webpack_exports__.extractConversationId;
145
131
  exports.injectConversationIdPromptBack = __webpack_exports__.injectConversationIdPromptBack;
146
132
  exports.resolveConversationId = __webpack_exports__.resolveConversationId;
@@ -151,7 +137,6 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
151
137
  "addConversationIdToTools",
152
138
  "buildConversationIdPromptBack",
153
139
  "canInjectConversationIdPromptBack",
154
- "cloneRequestWithoutConversationId",
155
140
  "extractConversationId",
156
141
  "injectConversationIdPromptBack",
157
142
  "resolveConversationId",
@@ -11,7 +11,7 @@ function addConversationIdToTool(tool) {
11
11
  const toolName = tool.name || 'unknown';
12
12
  const schema = modifiedTool.inputSchema;
13
13
  if (!canInjectAnalyticsParameter(schema, CONVERSATION_ID_PARAM_NAME)) {
14
- hasAnalyticsParameter(schema, CONVERSATION_ID_PARAM_NAME) ? log(`WARN: Tool "${toolName}" already has '${CONVERSATION_ID_PARAM_NAME}' parameter. Skipping conversation_id injection.`) : log(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf). Skipping conversation_id injection.`);
14
+ hasAnalyticsParameter(schema, CONVERSATION_ID_PARAM_NAME) ? log(`WARN: Tool "${toolName}" already has '${CONVERSATION_ID_PARAM_NAME}' parameter. Skipping conversation_id injection.`) : log(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf/$ref). Skipping conversation_id injection.`);
15
15
  return modifiedTool;
16
16
  }
17
17
  if (!modifiedTool.inputSchema) modifiedTool.inputSchema = {
@@ -63,18 +63,6 @@ function extractConversationId(args) {
63
63
  const trimmed = value.trim();
64
64
  return trimmed.length > 0 ? trimmed : void 0;
65
65
  }
66
- function cloneRequestWithoutConversationId(request) {
67
- if (!request.params || 'object' != typeof request.params) return request;
68
- const args = request.params.arguments;
69
- if (!(args && 'object' == typeof args)) return request;
70
- return {
71
- ...request,
72
- params: {
73
- ...request.params,
74
- arguments: stripConversationId(args)
75
- }
76
- };
77
- }
78
66
  function stripConversationId(args) {
79
67
  if (!args || 'object' != typeof args || !(CONVERSATION_ID_PARAM_NAME in args)) return args;
80
68
  const { [CONVERSATION_ID_PARAM_NAME]: _omit, ...rest } = args;
@@ -97,4 +85,4 @@ function injectConversationIdPromptBack(result, conversationId) {
97
85
  ]
98
86
  };
99
87
  }
100
- export { CONVERSATION_ID_PARAM_NAME, addConversationIdToTool, addConversationIdToTools, buildConversationIdPromptBack, canInjectConversationIdPromptBack, cloneRequestWithoutConversationId, extractConversationId, injectConversationIdPromptBack, resolveConversationId, stripConversationId };
88
+ export { CONVERSATION_ID_PARAM_NAME, addConversationIdToTool, addConversationIdToTools, buildConversationIdPromptBack, canInjectConversationIdPromptBack, extractConversationId, injectConversationIdPromptBack, resolveConversationId, stripConversationId };
@@ -1 +1 @@
1
- {"version":3,"file":"instrument-highlevel.d.ts","sourceRoot":"","sources":["../../src/extensions/instrument-highlevel.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,sBAAsB,EAIvB,MAAM,UAAU,CAAA;AAsSjB,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAwB9E"}
1
+ {"version":3,"file":"instrument-highlevel.d.ts","sourceRoot":"","sources":["../../src/extensions/instrument-highlevel.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,sBAAsB,EAIvB,MAAM,UAAU,CAAA;AAoQjB,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CA6B9E"}
@@ -27,7 +27,6 @@ __webpack_require__.d(__webpack_exports__, {
27
27
  instrumentHighLevelServer: ()=>instrumentHighLevelServer
28
28
  });
29
29
  const external_analytics_parameters_js_namespaceObject = require("./analytics-parameters.js");
30
- const external_conversation_id_js_namespaceObject = require("./conversation-id.js");
31
30
  const external_context_parameters_js_namespaceObject = require("./context-parameters.js");
32
31
  const external_event_types_js_namespaceObject = require("./event-types.js");
33
32
  const external_internal_js_namespaceObject = require("./internal.js");
@@ -41,27 +40,6 @@ const MCP_ANALYTICS_PROCESSED = Symbol('__posthog_mcp_analytics_processed__');
41
40
  function isCallbackUpdate(value) {
42
41
  return !!value && 'object' == typeof value && 'callback' in value && 'function' == typeof value.callback;
43
42
  }
44
- function analyticsOwnsParameter(inputSchema, parameterName) {
45
- if (!inputSchema || 'object' != typeof inputSchema) return (0, external_analytics_parameters_js_namespaceObject.canInjectAnalyticsParameter)(void 0, parameterName);
46
- if ((0, external_mcp_sdk_compat_js_namespaceObject.isZodRawShapeCompat)(inputSchema)) return (0, external_analytics_parameters_js_namespaceObject.canInjectAnalyticsParameter)({
47
- properties: inputSchema
48
- }, parameterName);
49
- const shape = (0, external_mcp_sdk_compat_js_namespaceObject.getObjectShape)(inputSchema);
50
- if (shape) return (0, external_analytics_parameters_js_namespaceObject.canInjectAnalyticsParameter)({
51
- properties: shape
52
- }, parameterName);
53
- const schema = inputSchema;
54
- if ('_def' in schema || '_zod' in schema || '~standard' in schema) return (0, external_analytics_parameters_js_namespaceObject.canInjectAnalyticsParameter)(void 0, parameterName);
55
- return (0, external_analytics_parameters_js_namespaceObject.canInjectAnalyticsParameter)(schema, parameterName);
56
- }
57
- function stripOwnedAnalyticsArguments(args, ownership) {
58
- let cleanedArgs = args;
59
- if (ownership.context && cleanedArgs && 'object' == typeof cleanedArgs && 'context' in cleanedArgs) {
60
- const { context: _context, ...rest } = cleanedArgs;
61
- cleanedArgs = rest;
62
- }
63
- return ownership.conversationId ? (0, external_conversation_id_js_namespaceObject.stripConversationId)(cleanedArgs) : cleanedArgs;
64
- }
65
43
  function addTracingToToolRegistry(tools, server) {
66
44
  return Object.fromEntries(Object.entries(tools).map(([name, tool])=>[
67
45
  name,
@@ -150,9 +128,9 @@ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInpu
150
128
  extra = params[0];
151
129
  }
152
130
  const inputSchema = getCurrentInputSchema();
153
- const cleanedArgs = stripOwnedAnalyticsArguments(args, {
154
- context: toolName !== missingToolName && (0, external_context_parameters_js_namespaceObject.isContextEnabled)(options?.context) && analyticsOwnsParameter(inputSchema, 'context'),
155
- conversationId: toolName !== missingToolName && options?.enableConversationId === true && analyticsOwnsParameter(inputSchema, 'conversation_id')
131
+ const cleanedArgs = (0, external_analytics_parameters_js_namespaceObject.stripOwnedAnalyticsArguments)(args, {
132
+ context: toolName !== missingToolName && (0, external_context_parameters_js_namespaceObject.isContextEnabled)(options?.context) && (0, external_analytics_parameters_js_namespaceObject.analyticsOwnsParameter)(inputSchema, 'context'),
133
+ conversationId: toolName !== missingToolName && options?.enableConversationId === true && (0, external_analytics_parameters_js_namespaceObject.analyticsOwnsParameter)(inputSchema, 'conversation_id')
156
134
  });
157
135
  try {
158
136
  if (void 0 === cleanedArgs) {
@@ -172,7 +150,7 @@ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInpu
172
150
  wrappedTool[MCP_ANALYTICS_PROCESSED] = true;
173
151
  return wrappedTool;
174
152
  }
175
- async function handleToolCallRequest(server, originalCallToolHandler, request, extra) {
153
+ async function handleToolCallRequest(highLevelServer, server, originalCallToolHandler, request, extra) {
176
154
  const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
177
155
  if (!data) {
178
156
  (0, external_logger_js_namespaceObject.log)('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
@@ -192,12 +170,15 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
192
170
  })
193
171
  });
194
172
  }
173
+ const toolName = request.params?.name;
174
+ const registeredTool = toolName ? highLevelServer._registeredTools[toolName] : void 0;
195
175
  return await (0, external_instrumentation_js_namespaceObject.captureToolCall)({
196
176
  server,
197
177
  data,
198
178
  request,
199
179
  extra,
200
- execute: ()=>originalCallToolHandler(request, extra),
180
+ execute: (downstreamRequest)=>originalCallToolHandler(downstreamRequest, extra),
181
+ parameterOwnership: registeredTool ? (0, external_analytics_parameters_js_namespaceObject.getAnalyticsParameterOwnership)(registeredTool.inputSchema) : void 0,
201
182
  takeCapturedError: ()=>{
202
183
  const captured = extra?.__mcp_analytics_error;
203
184
  if (extra) extra.__mcp_analytics_error = void 0;
@@ -212,7 +193,7 @@ function instrumentHighLevelServer(server) {
212
193
  const handlers = {
213
194
  initialize: external_instrumentation_js_namespaceObject.handleInitializeRequest,
214
195
  'tools/list': external_instrumentation_js_namespaceObject.handleListToolsRequest,
215
- 'tools/call': handleToolCallRequest
196
+ 'tools/call': (trackedServer, originalHandler, request, extra)=>handleToolCallRequest(server, trackedServer, originalHandler, request, extra)
216
197
  };
217
198
  (0, external_instrumentation_js_namespaceObject.patchRequestHandlers)(lowLevelServer, handlers);
218
199
  server._registeredTools = addTracingToToolRegistry(server._registeredTools, server);
@@ -1,10 +1,9 @@
1
- import { canInjectAnalyticsParameter } from "./analytics-parameters.mjs";
2
- import { stripConversationId } from "./conversation-id.mjs";
1
+ import { analyticsOwnsParameter, getAnalyticsParameterOwnership, stripOwnedAnalyticsArguments } from "./analytics-parameters.mjs";
3
2
  import { isContextEnabled } from "./context-parameters.mjs";
4
3
  import { MCPAnalyticsEventType } from "./event-types.mjs";
5
4
  import { getServerTrackingData } from "./internal.mjs";
6
5
  import { log } from "./logger.mjs";
7
- import { createWrappedTool, getObjectShape, getToolFunction, hasToolFunction, isZodRawShapeCompat } from "./mcp-sdk-compat.mjs";
6
+ import { createWrappedTool, getToolFunction, hasToolFunction } from "./mcp-sdk-compat.mjs";
8
7
  import { handleReportMissing, resolveMissingCapabilityToolName } from "./tools.mjs";
9
8
  import { captureToolCall, handleInitializeRequest, handleListToolsRequest, patchRequestHandlers, readToolMetaCategory } from "./instrumentation.mjs";
10
9
  import { getContextArgument } from "./tracing-helpers.mjs";
@@ -13,27 +12,6 @@ const MCP_ANALYTICS_PROCESSED = Symbol('__posthog_mcp_analytics_processed__');
13
12
  function isCallbackUpdate(value) {
14
13
  return !!value && 'object' == typeof value && 'callback' in value && 'function' == typeof value.callback;
15
14
  }
16
- function analyticsOwnsParameter(inputSchema, parameterName) {
17
- if (!inputSchema || 'object' != typeof inputSchema) return canInjectAnalyticsParameter(void 0, parameterName);
18
- if (isZodRawShapeCompat(inputSchema)) return canInjectAnalyticsParameter({
19
- properties: inputSchema
20
- }, parameterName);
21
- const shape = getObjectShape(inputSchema);
22
- if (shape) return canInjectAnalyticsParameter({
23
- properties: shape
24
- }, parameterName);
25
- const schema = inputSchema;
26
- if ('_def' in schema || '_zod' in schema || '~standard' in schema) return canInjectAnalyticsParameter(void 0, parameterName);
27
- return canInjectAnalyticsParameter(schema, parameterName);
28
- }
29
- function stripOwnedAnalyticsArguments(args, ownership) {
30
- let cleanedArgs = args;
31
- if (ownership.context && cleanedArgs && 'object' == typeof cleanedArgs && 'context' in cleanedArgs) {
32
- const { context: _context, ...rest } = cleanedArgs;
33
- cleanedArgs = rest;
34
- }
35
- return ownership.conversationId ? stripConversationId(cleanedArgs) : cleanedArgs;
36
- }
37
15
  function addTracingToToolRegistry(tools, server) {
38
16
  return Object.fromEntries(Object.entries(tools).map(([name, tool])=>[
39
17
  name,
@@ -144,7 +122,7 @@ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInpu
144
122
  wrappedTool[MCP_ANALYTICS_PROCESSED] = true;
145
123
  return wrappedTool;
146
124
  }
147
- async function handleToolCallRequest(server, originalCallToolHandler, request, extra) {
125
+ async function handleToolCallRequest(highLevelServer, server, originalCallToolHandler, request, extra) {
148
126
  const data = getServerTrackingData(server);
149
127
  if (!data) {
150
128
  log('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
@@ -164,12 +142,15 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
164
142
  })
165
143
  });
166
144
  }
145
+ const toolName = request.params?.name;
146
+ const registeredTool = toolName ? highLevelServer._registeredTools[toolName] : void 0;
167
147
  return await captureToolCall({
168
148
  server,
169
149
  data,
170
150
  request,
171
151
  extra,
172
- execute: ()=>originalCallToolHandler(request, extra),
152
+ execute: (downstreamRequest)=>originalCallToolHandler(downstreamRequest, extra),
153
+ parameterOwnership: registeredTool ? getAnalyticsParameterOwnership(registeredTool.inputSchema) : void 0,
173
154
  takeCapturedError: ()=>{
174
155
  const captured = extra?.__mcp_analytics_error;
175
156
  if (extra) extra.__mcp_analytics_error = void 0;
@@ -184,7 +165,7 @@ function instrumentHighLevelServer(server) {
184
165
  const handlers = {
185
166
  initialize: handleInitializeRequest,
186
167
  'tools/list': handleListToolsRequest,
187
- 'tools/call': handleToolCallRequest
168
+ 'tools/call': (trackedServer, originalHandler, request, extra)=>handleToolCallRequest(server, trackedServer, originalHandler, request, extra)
188
169
  };
189
170
  patchRequestHandlers(lowLevelServer, handlers);
190
171
  server._registeredTools = addTracingToToolRegistry(server._registeredTools, server);
@@ -1,5 +1,5 @@
1
1
  import type { ListToolsResult } from '@modelcontextprotocol/sdk/types.js';
2
- import type { CompatibleRequestHandlerExtra, MCPAnalyticsData, MCPRequestLike, MCPServerLike } from '../types';
2
+ import type { AnalyticsParameterOwnership, CompatibleRequestHandlerExtra, MCPAnalyticsData, MCPRequestLike, MCPServerLike } from '../types';
3
3
  import { MCPAnalyticsEventType } from './event-types';
4
4
  /**
5
5
  * Single instrumentation core shared by the low-level (`Server`) and high-level
@@ -9,11 +9,7 @@ import { MCPAnalyticsEventType } from './event-types';
9
9
  * attribution, and event capture are defined exactly once.
10
10
  */
11
11
  type MCPRequestHandler = (request: MCPRequestLike, extra?: CompatibleRequestHandlerExtra) => Promise<unknown>;
12
- /**
13
- * Runs the underlying tool. Receives the request with the SDK-injected
14
- * `conversation_id` stripped; an adapter is free to ignore it (the high-level
15
- * path strips arguments inside the wrapped callback instead).
16
- */
12
+ /** Runs the underlying tool with SDK-owned analytics arguments removed. */
17
13
  type ToolExecutor = (downstreamRequest: MCPRequestLike) => Promise<unknown>;
18
14
  interface TraceToolCallParams {
19
15
  server: MCPServerLike;
@@ -21,6 +17,8 @@ interface TraceToolCallParams {
21
17
  request: MCPRequestLike;
22
18
  extra?: CompatibleRequestHandlerExtra;
23
19
  execute: ToolExecutor;
20
+ /** Optional schema-derived ownership override for adapters with direct registry access. */
21
+ parameterOwnership?: AnalyticsParameterOwnership;
24
22
  /**
25
23
  * Event type to capture. Defaults to a tool call; the `get_more_tools` virtual
26
24
  * tool passes `mcpMissingCapability` so it records a capability gap rather than
@@ -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,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,EACd,aAAa,EAGd,MAAM,UAAU,CAAA;AAYjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAYrD;;;;;;GAMG;AAEH,KAAK,iBAAiB,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,6BAA6B,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAE7G;;;;GAIG;AACH,KAAK,YAAY,GAAG,CAAC,iBAAiB,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;AAE3E,UAAU,mBAAmB;IAC3B,MAAM,EAAE,aAAa,CAAA;IACrB,IAAI,EAAE,gBAAgB,CAAA;IACtB,OAAO,EAAE,cAAc,CAAA;IACvB,KAAK,CAAC,EAAE,6BAA6B,CAAA;IACrC,OAAO,EAAE,YAAY,CAAA;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,qBAAqB,CAAA;IACjC;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAA;CAClC;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAuCnF;AAoHD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,MAAM,EAAE,aAAa,EACrB,eAAe,EAAE,iBAAiB,EAClC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,6BAA6B,GAAG,SAAS,KAC7C,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAqBvG;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,aAAa,EACrB,wBAAwB,EAAE,iBAAiB,EAC3C,OAAO,EAAE,cAAc,EACvB,KAAK,CAAC,EAAE,6BAA6B,GACpC,OAAO,CAAC;IAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAyC9C;AAwDD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CASnH;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGtE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAUjH;AA8GD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,aAAa,EACrB,yBAAyB,EAAE,iBAAiB,EAC5C,OAAO,EAAE,cAAc,EACvB,KAAK,CAAC,EAAE,6BAA6B,GACpC,OAAO,CAAC,OAAO,CAAC,CA0ClB"}
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,EAGd,MAAM,UAAU,CAAA;AAYjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAYrD;;;;;;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;AAE3E,UAAU,mBAAmB;IAC3B,MAAM,EAAE,aAAa,CAAA;IACrB,IAAI,EAAE,gBAAgB,CAAA;IACtB,OAAO,EAAE,cAAc,CAAA;IACvB,KAAK,CAAC,EAAE,6BAA6B,CAAA;IACrC,OAAO,EAAE,YAAY,CAAA;IACrB,2FAA2F;IAC3F,kBAAkB,CAAC,EAAE,2BAA2B,CAAA;IAChD;;;;OAIG;IACH,SAAS,CAAC,EAAE,qBAAqB,CAAA;IACjC;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAA;CAClC;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAmDnF;AAqJD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,MAAM,EAAE,aAAa,EACrB,eAAe,EAAE,iBAAiB,EAClC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,6BAA6B,GAAG,SAAS,KAC7C,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAqBvG;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,aAAa,EACrB,wBAAwB,EAAE,iBAAiB,EAC3C,OAAO,EAAE,cAAc,EACvB,KAAK,CAAC,EAAE,6BAA6B,GACpC,OAAO,CAAC;IAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC,CAyC9C;AAwED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CASnH;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAGtE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAUjH;AA8GD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,aAAa,EACrB,yBAAyB,EAAE,iBAAiB,EAC5C,OAAO,EAAE,cAAc,EACvB,KAAK,CAAC,EAAE,6BAA6B,GACpC,OAAO,CAAC,OAAO,CAAC,CA0ClB"}
@@ -32,6 +32,7 @@ __webpack_require__.d(__webpack_exports__, {
32
32
  handleListToolsRequest: ()=>handleListToolsRequest,
33
33
  patchRequestHandlers: ()=>patchRequestHandlers
34
34
  });
35
+ const external_analytics_parameters_js_namespaceObject = require("./analytics-parameters.js");
35
36
  const external_context_parameters_js_namespaceObject = require("./context-parameters.js");
36
37
  const external_conversation_id_js_namespaceObject = require("./conversation-id.js");
37
38
  const external_client_identity_js_namespaceObject = require("./client-identity.js");
@@ -48,11 +49,12 @@ const external_session_token_js_namespaceObject = require("./session-token.js");
48
49
  const external_tools_js_namespaceObject = require("./tools.js");
49
50
  const external_tracing_helpers_js_namespaceObject = require("./tracing-helpers.js");
50
51
  async function captureToolCall(params) {
51
- const { server, data, request, extra, execute, eventType, explicitContextIntent, takeCapturedError } = params;
52
- const conversation = (0, external_conversation_id_js_namespaceObject.resolveConversationId)(data.options.enableConversationId ?? false, request.params?.arguments, request.params?.name, (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options));
53
- const downstreamRequest = conversation.conversationId ? (0, external_conversation_id_js_namespaceObject.cloneRequestWithoutConversationId)(request) : request;
52
+ const { server, data, request, extra, execute, parameterOwnership, eventType, explicitContextIntent, takeCapturedError } = params;
53
+ const ownership = getActiveAnalyticsParameterOwnership(data, request.params?.name, parameterOwnership);
54
+ const conversation = (0, external_conversation_id_js_namespaceObject.resolveConversationId)(ownership.conversationId, request.params?.arguments, request.params?.name, (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options));
55
+ const downstreamRequest = cloneRequestWithoutOwnedAnalyticsArguments(request, ownership);
54
56
  const startTime = new Date();
55
- const event = await prepareToolCallEvent(server, data, request, downstreamRequest, extra, startTime, conversation, eventType ?? external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsCall);
57
+ const event = await prepareToolCallEvent(server, data, request, downstreamRequest, extra, startTime, conversation, ownership, eventType ?? external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsCall);
56
58
  if (event && explicitContextIntent) (0, external_intent_js_namespaceObject.setExplicitContextIntent)(event, explicitContextIntent);
57
59
  let result;
58
60
  try {
@@ -65,7 +67,27 @@ async function captureToolCall(params) {
65
67
  publishSuccessfulToolEvent(server, event, finalResult, startTime, takeCapturedError);
66
68
  return finalResult;
67
69
  }
68
- async function prepareToolCallEvent(server, data, request, downstreamRequest, extra, startTime, conversation, eventType) {
70
+ function getActiveAnalyticsParameterOwnership(data, toolName, override) {
71
+ const ownership = override ?? (toolName ? data.toolAnalyticsParameterOwnership.get(toolName) : void 0);
72
+ const isMissingCapabilityTool = toolName === (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options);
73
+ return {
74
+ context: !isMissingCapabilityTool && (0, external_context_parameters_js_namespaceObject.isContextEnabled)(data.options.context) && ownership?.context === true,
75
+ conversationId: !isMissingCapabilityTool && true === data.options.enableConversationId && ownership?.conversationId === true
76
+ };
77
+ }
78
+ function cloneRequestWithoutOwnedAnalyticsArguments(request, ownership) {
79
+ const args = request.params?.arguments;
80
+ const cleanedArgs = (0, external_analytics_parameters_js_namespaceObject.stripOwnedAnalyticsArguments)(args, ownership);
81
+ if (cleanedArgs === args || !request.params) return request;
82
+ return {
83
+ ...request,
84
+ params: {
85
+ ...request.params,
86
+ arguments: cleanedArgs
87
+ }
88
+ };
89
+ }
90
+ async function prepareToolCallEvent(server, data, request, downstreamRequest, extra, startTime, conversation, ownership, eventType) {
69
91
  try {
70
92
  const sessionId = (0, external_session_js_namespaceObject.getSessionId)(server, extra);
71
93
  await (0, external_internal_js_namespaceObject.handleIdentify)(server, data, sessionId, request, extra);
@@ -82,7 +104,7 @@ async function prepareToolCallEvent(server, data, request, downstreamRequest, ex
82
104
  };
83
105
  (0, external_client_identity_js_namespaceObject.stampMetaClientInfo)(event, request);
84
106
  await (0, external_tracing_helpers_js_namespaceObject.applyResolvedMetadata)(event, data, request, extra);
85
- (0, external_intent_js_namespaceObject.setEventIntent)(event, await (0, external_intent_js_namespaceObject.resolveToolCallIntent)(data, request, extra));
107
+ (0, external_intent_js_namespaceObject.setEventIntent)(event, await (0, external_intent_js_namespaceObject.resolveToolCallIntent)(data, request, ownership.context, extra));
86
108
  return event;
87
109
  } catch (error) {
88
110
  (0, external_logger_js_namespaceObject.log)(`Warning: PostHog MCP analytics instrumentation failed for tool ${request.params?.name}, the tool will still run - ${error}`);
@@ -175,6 +197,9 @@ async function handleListToolsRequest(server, originalListToolsHandler, request,
175
197
  tools
176
198
  };
177
199
  }
200
+ function cacheToolAnalyticsParameterOwnership(cache, tools) {
201
+ for (const tool of tools)if (tool?.name) cache.set(tool.name, (0, external_analytics_parameters_js_namespaceObject.getAnalyticsParameterOwnership)(tool.inputSchema));
202
+ }
178
203
  function collectListedToolNames(tools) {
179
204
  if (!tools || 0 === tools.length) return;
180
205
  const names = tools.map((tool)=>tool?.name).filter((name)=>'string' == typeof name);
@@ -185,6 +210,7 @@ async function getTracedToolsList(server, originalListToolsHandler, request, ext
185
210
  const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
186
211
  const originalResponse = await originalListToolsHandler(request, extra);
187
212
  let tools = originalResponse.tools || [];
213
+ if (data) cacheToolAnalyticsParameterOwnership(data.toolAnalyticsParameterOwnership, tools);
188
214
  if (data && (0, external_context_parameters_js_namespaceObject.isContextEnabled)(data.options.context)) tools = (0, external_context_parameters_js_namespaceObject.addContextParameterToTools)(tools, (0, external_context_parameters_js_namespaceObject.getContextDescription)(data.options.context));
189
215
  if (data?.options.enableConversationId) tools = (0, external_conversation_id_js_namespaceObject.addConversationIdToTools)(tools, (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options));
190
216
  if (data?.options.reportMissing) {