@posthog/mcp 0.10.2 → 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 (46) hide show
  1. package/dist/extensions/analytics-parameters.d.ts +17 -0
  2. package/dist/extensions/analytics-parameters.d.ts.map +1 -0
  3. package/dist/extensions/analytics-parameters.js +98 -0
  4. package/dist/extensions/analytics-parameters.mjs +52 -0
  5. package/dist/extensions/context-parameters.d.ts +3 -12
  6. package/dist/extensions/context-parameters.d.ts.map +1 -1
  7. package/dist/extensions/context-parameters.js +4 -6
  8. package/dist/extensions/context-parameters.mjs +3 -6
  9. package/dist/extensions/conversation-id.d.ts +2 -17
  10. package/dist/extensions/conversation-id.d.ts.map +1 -1
  11. package/dist/extensions/conversation-id.js +6 -23
  12. package/dist/extensions/conversation-id.mjs +4 -19
  13. package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
  14. package/dist/extensions/instrument-highlevel.js +19 -16
  15. package/dist/extensions/instrument-highlevel.mjs +19 -16
  16. package/dist/extensions/instrumentation.d.ts +4 -6
  17. package/dist/extensions/instrumentation.d.ts.map +1 -1
  18. package/dist/extensions/instrumentation.js +32 -6
  19. package/dist/extensions/instrumentation.mjs +33 -7
  20. package/dist/extensions/intent.d.ts +1 -1
  21. package/dist/extensions/intent.d.ts.map +1 -1
  22. package/dist/extensions/intent.js +2 -2
  23. package/dist/extensions/intent.mjs +2 -2
  24. package/dist/extensions/mcp-sdk-compat.d.ts +1 -0
  25. package/dist/extensions/mcp-sdk-compat.d.ts.map +1 -1
  26. package/dist/extensions/mcp-sdk-compat.js +11 -2
  27. package/dist/extensions/mcp-sdk-compat.mjs +7 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +1 -0
  30. package/dist/index.mjs +1 -0
  31. package/dist/types.d.ts +5 -0
  32. package/dist/types.d.ts.map +1 -1
  33. package/dist/version.d.ts +1 -1
  34. package/dist/version.js +1 -1
  35. package/dist/version.mjs +1 -1
  36. package/package.json +4 -4
  37. package/src/extensions/analytics-parameters.ts +89 -0
  38. package/src/extensions/context-parameters.ts +16 -24
  39. package/src/extensions/conversation-id.ts +18 -43
  40. package/src/extensions/instrument-highlevel.ts +42 -22
  41. package/src/extensions/instrumentation.ts +71 -11
  42. package/src/extensions/intent.ts +7 -1
  43. package/src/extensions/mcp-sdk-compat.ts +15 -0
  44. package/src/index.ts +1 -0
  45. package/src/types.ts +6 -0
  46. package/src/version.ts +1 -1
@@ -0,0 +1,17 @@
1
+ import type { AnalyticsParameterOwnership } from '../types';
2
+ export interface AnalyticsInjectableJsonSchema {
3
+ $ref?: unknown;
4
+ additionalProperties?: boolean;
5
+ allOf?: unknown;
6
+ anyOf?: unknown;
7
+ oneOf?: unknown;
8
+ properties?: Record<string, unknown>;
9
+ required?: string[];
10
+ type?: string;
11
+ }
12
+ export declare function hasAnalyticsParameter(schema: AnalyticsInjectableJsonSchema | undefined, parameterName: string): boolean;
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;
17
+ //# sourceMappingURL=analytics-parameters.d.ts.map
@@ -0,0 +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;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"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ hasAnalyticsParameter: ()=>hasAnalyticsParameter,
28
+ analyticsOwnsParameter: ()=>analyticsOwnsParameter,
29
+ getAnalyticsParameterOwnership: ()=>getAnalyticsParameterOwnership,
30
+ canInjectAnalyticsParameter: ()=>canInjectAnalyticsParameter,
31
+ stripOwnedAnalyticsArguments: ()=>stripOwnedAnalyticsArguments
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
+ ];
46
+ function hasAnalyticsParameter(schema, parameterName) {
47
+ return !!schema?.properties && Object.prototype.hasOwnProperty.call(schema.properties, parameterName);
48
+ }
49
+ function canInjectAnalyticsParameter(schema, parameterName) {
50
+ return !hasAnalyticsParameter(schema, parameterName) && !schema?.$ref && !schema?.oneOf && !schema?.allOf && !schema?.anyOf;
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;
85
+ exports.canInjectAnalyticsParameter = __webpack_exports__.canInjectAnalyticsParameter;
86
+ exports.getAnalyticsParameterOwnership = __webpack_exports__.getAnalyticsParameterOwnership;
87
+ exports.hasAnalyticsParameter = __webpack_exports__.hasAnalyticsParameter;
88
+ exports.stripOwnedAnalyticsArguments = __webpack_exports__.stripOwnedAnalyticsArguments;
89
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
90
+ "analyticsOwnsParameter",
91
+ "canInjectAnalyticsParameter",
92
+ "getAnalyticsParameterOwnership",
93
+ "hasAnalyticsParameter",
94
+ "stripOwnedAnalyticsArguments"
95
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
96
+ Object.defineProperty(exports, '__esModule', {
97
+ value: true
98
+ });
@@ -0,0 +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
+ ];
14
+ function hasAnalyticsParameter(schema, parameterName) {
15
+ return !!schema?.properties && Object.prototype.hasOwnProperty.call(schema.properties, parameterName);
16
+ }
17
+ function canInjectAnalyticsParameter(schema, parameterName) {
18
+ return !hasAnalyticsParameter(schema, parameterName) && !schema?.$ref && !schema?.oneOf && !schema?.allOf && !schema?.anyOf;
19
+ }
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 };
@@ -1,15 +1,7 @@
1
1
  import type { MCPAnalyticsOptions } from '../types';
2
- interface JsonSchema {
3
- additionalProperties?: boolean;
4
- allOf?: unknown;
5
- anyOf?: unknown;
6
- oneOf?: unknown;
7
- properties?: Record<string, unknown>;
8
- required?: string[];
9
- type?: string;
10
- }
2
+ import { type AnalyticsInjectableJsonSchema } from './analytics-parameters';
11
3
  export interface ContextInjectableTool {
12
- inputSchema?: JsonSchema;
4
+ inputSchema?: AnalyticsInjectableJsonSchema;
13
5
  name?: string;
14
6
  [key: string]: unknown;
15
7
  }
@@ -22,10 +14,9 @@ export declare function getContextDescription(context: MCPAnalyticsOptions['cont
22
14
  *
23
15
  * Skips injection (with warning) for:
24
16
  * - Tools that already have a 'context' parameter
25
- * - 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
26
18
  * - Schemas with additionalProperties: false
27
19
  */
28
20
  export declare function addContextParameterToTool<TTool extends ContextInjectableTool>(tool: TTool, contextDescriptionOverride?: string): TTool;
29
21
  export declare function addContextParameterToTools<TTool extends ContextInjectableTool>(tools: TTool[], contextDescriptionOverride?: string): TTool[];
30
- export {};
31
22
  //# sourceMappingURL=context-parameters.d.ts.map
@@ -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;AAInD,UAAU,UAAU;IAClB,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,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,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,GAClC,KAAK,CAgEP;AAED,wBAAgB,0BAA0B,CAAC,KAAK,SAAS,qBAAqB,EAC5E,KAAK,EAAE,KAAK,EAAE,EACd,0BAA0B,CAAC,EAAE,MAAM,GAClC,KAAK,EAAE,CAQT"}
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,EAGL,KAAK,6BAA6B,EACnC,MAAM,wBAAwB,CAAA;AAI/B,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,GAClC,KAAK,CA6DP;AAED,wBAAgB,0BAA0B,CAAC,KAAK,SAAS,qBAAqB,EAC5E,KAAK,EAAE,KAAK,EAAE,EACd,0BAA0B,CAAC,EAAE,MAAM,GAClC,KAAK,EAAE,CAQT"}
@@ -29,6 +29,7 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  getContextDescription: ()=>getContextDescription,
30
30
  isContextEnabled: ()=>isContextEnabled
31
31
  });
32
+ const external_analytics_parameters_js_namespaceObject = require("./analytics-parameters.js");
32
33
  const external_constants_js_namespaceObject = require("./constants.js");
33
34
  const external_logger_js_namespaceObject = require("./logger.js");
34
35
  function isContextEnabled(context) {
@@ -43,12 +44,9 @@ function addContextParameterToTool(tool, contextDescriptionOverride) {
43
44
  };
44
45
  const toolName = tool.name || 'unknown';
45
46
  const schema = modifiedTool.inputSchema;
46
- if (schema?.properties?.context) {
47
- (0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" already has 'context' parameter. Skipping context injection.`);
48
- return modifiedTool;
49
- }
50
- if (schema?.oneOf || schema?.allOf || schema?.anyOf) {
51
- (0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf). Skipping context injection.`);
47
+ if (!(0, external_analytics_parameters_js_namespaceObject.canInjectAnalyticsParameter)(schema, 'context')) {
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/$ref). Skipping context injection.`);
52
50
  return modifiedTool;
53
51
  }
54
52
  if (!modifiedTool.inputSchema) modifiedTool.inputSchema = {
@@ -1,3 +1,4 @@
1
+ import { canInjectAnalyticsParameter, hasAnalyticsParameter } from "./analytics-parameters.mjs";
1
2
  import { DEFAULT_CONTEXT_PARAMETER_DESCRIPTION } from "./constants.mjs";
2
3
  import { log } from "./logger.mjs";
3
4
  function isContextEnabled(context) {
@@ -12,12 +13,8 @@ function addContextParameterToTool(tool, contextDescriptionOverride) {
12
13
  };
13
14
  const toolName = tool.name || 'unknown';
14
15
  const schema = modifiedTool.inputSchema;
15
- if (schema?.properties?.context) {
16
- log(`WARN: Tool "${toolName}" already has 'context' parameter. Skipping context injection.`);
17
- return modifiedTool;
18
- }
19
- if (schema?.oneOf || schema?.allOf || schema?.anyOf) {
20
- log(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf). Skipping context injection.`);
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/$ref). Skipping context injection.`);
21
18
  return modifiedTool;
22
19
  }
23
20
  if (!modifiedTool.inputSchema) modifiedTool.inputSchema = {
@@ -1,15 +1,7 @@
1
+ import { type AnalyticsInjectableJsonSchema } from './analytics-parameters';
1
2
  export declare const CONVERSATION_ID_PARAM_NAME = "conversation_id";
2
- interface JsonSchema {
3
- additionalProperties?: boolean;
4
- allOf?: unknown;
5
- anyOf?: unknown;
6
- oneOf?: unknown;
7
- properties?: Record<string, unknown>;
8
- required?: string[];
9
- type?: string;
10
- }
11
3
  export interface ConversationIdInjectableTool {
12
- inputSchema?: JsonSchema;
4
+ inputSchema?: AnalyticsInjectableJsonSchema;
13
5
  name?: string;
14
6
  [key: string]: unknown;
15
7
  }
@@ -36,17 +28,10 @@ export declare function resolveConversationId(enabled: boolean, args: unknown, t
36
28
  */
37
29
  export declare function canInjectConversationIdPromptBack(result: unknown): boolean;
38
30
  export declare function extractConversationId(args: unknown): string | undefined;
39
- export declare function cloneRequestWithoutConversationId<TRequest extends {
40
- params?: {
41
- arguments?: unknown;
42
- [k: string]: unknown;
43
- };
44
- }>(request: TRequest): TRequest;
45
31
  export declare function stripConversationId(args: unknown): unknown;
46
32
  export declare function buildConversationIdPromptBack(conversationId: string): {
47
33
  type: 'text';
48
34
  text: string;
49
35
  };
50
36
  export declare function injectConversationIdPromptBack(result: unknown, conversationId: string): unknown;
51
- export {};
52
37
  //# sourceMappingURL=conversation-id.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-id.d.ts","sourceRoot":"","sources":["../../src/extensions/conversation-id.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,0BAA0B,oBAAoB,CAAA;AAE3D,UAAU,UAAU;IAClB,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,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,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,CA2CtG;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,15 +27,15 @@ __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
  });
38
37
  const core_namespaceObject = require("@posthog/core");
38
+ const external_analytics_parameters_js_namespaceObject = require("./analytics-parameters.js");
39
39
  const external_constants_js_namespaceObject = require("./constants.js");
40
40
  const external_logger_js_namespaceObject = require("./logger.js");
41
41
  const external_tools_js_namespaceObject = require("./tools.js");
@@ -46,12 +46,9 @@ function addConversationIdToTool(tool) {
46
46
  };
47
47
  const toolName = tool.name || 'unknown';
48
48
  const schema = modifiedTool.inputSchema;
49
- if (schema?.properties?.[CONVERSATION_ID_PARAM_NAME]) {
50
- (0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" already has '${CONVERSATION_ID_PARAM_NAME}' parameter. Skipping conversation_id injection.`);
51
- return modifiedTool;
52
- }
53
- if (schema?.oneOf || schema?.allOf || schema?.anyOf) {
54
- (0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf). Skipping conversation_id injection.`);
49
+ if (!(0, external_analytics_parameters_js_namespaceObject.canInjectAnalyticsParameter)(schema, CONVERSATION_ID_PARAM_NAME)) {
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.`);
51
+ else (0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf/$ref). Skipping conversation_id injection.`);
55
52
  return modifiedTool;
56
53
  }
57
54
  if (!modifiedTool.inputSchema) modifiedTool.inputSchema = {
@@ -103,18 +100,6 @@ function extractConversationId(args) {
103
100
  const trimmed = value.trim();
104
101
  return trimmed.length > 0 ? trimmed : void 0;
105
102
  }
106
- function cloneRequestWithoutConversationId(request) {
107
- if (!request.params || 'object' != typeof request.params) return request;
108
- const args = request.params.arguments;
109
- if (!(args && 'object' == typeof args)) return request;
110
- return {
111
- ...request,
112
- params: {
113
- ...request.params,
114
- arguments: stripConversationId(args)
115
- }
116
- };
117
- }
118
103
  function stripConversationId(args) {
119
104
  if (!args || 'object' != typeof args || !(CONVERSATION_ID_PARAM_NAME in args)) return args;
120
105
  const { [CONVERSATION_ID_PARAM_NAME]: _omit, ...rest } = args;
@@ -142,7 +127,6 @@ exports.addConversationIdToTool = __webpack_exports__.addConversationIdToTool;
142
127
  exports.addConversationIdToTools = __webpack_exports__.addConversationIdToTools;
143
128
  exports.buildConversationIdPromptBack = __webpack_exports__.buildConversationIdPromptBack;
144
129
  exports.canInjectConversationIdPromptBack = __webpack_exports__.canInjectConversationIdPromptBack;
145
- exports.cloneRequestWithoutConversationId = __webpack_exports__.cloneRequestWithoutConversationId;
146
130
  exports.extractConversationId = __webpack_exports__.extractConversationId;
147
131
  exports.injectConversationIdPromptBack = __webpack_exports__.injectConversationIdPromptBack;
148
132
  exports.resolveConversationId = __webpack_exports__.resolveConversationId;
@@ -153,7 +137,6 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
153
137
  "addConversationIdToTools",
154
138
  "buildConversationIdPromptBack",
155
139
  "canInjectConversationIdPromptBack",
156
- "cloneRequestWithoutConversationId",
157
140
  "extractConversationId",
158
141
  "injectConversationIdPromptBack",
159
142
  "resolveConversationId",
@@ -1,4 +1,5 @@
1
1
  import { uuidv7 } from "@posthog/core";
2
+ import { canInjectAnalyticsParameter, hasAnalyticsParameter } from "./analytics-parameters.mjs";
2
3
  import { DEFAULT_CONVERSATION_ID_DESCRIPTION } from "./constants.mjs";
3
4
  import { log } from "./logger.mjs";
4
5
  import { GET_MORE_TOOLS_NAME } from "./tools.mjs";
@@ -9,12 +10,8 @@ function addConversationIdToTool(tool) {
9
10
  };
10
11
  const toolName = tool.name || 'unknown';
11
12
  const schema = modifiedTool.inputSchema;
12
- if (schema?.properties?.[CONVERSATION_ID_PARAM_NAME]) {
13
- log(`WARN: Tool "${toolName}" already has '${CONVERSATION_ID_PARAM_NAME}' parameter. Skipping conversation_id injection.`);
14
- return modifiedTool;
15
- }
16
- if (schema?.oneOf || schema?.allOf || schema?.anyOf) {
17
- log(`WARN: Tool "${toolName}" has complex schema (oneOf/allOf/anyOf). Skipping conversation_id injection.`);
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/$ref). Skipping conversation_id injection.`);
18
15
  return modifiedTool;
19
16
  }
20
17
  if (!modifiedTool.inputSchema) modifiedTool.inputSchema = {
@@ -66,18 +63,6 @@ function extractConversationId(args) {
66
63
  const trimmed = value.trim();
67
64
  return trimmed.length > 0 ? trimmed : void 0;
68
65
  }
69
- function cloneRequestWithoutConversationId(request) {
70
- if (!request.params || 'object' != typeof request.params) return request;
71
- const args = request.params.arguments;
72
- if (!(args && 'object' == typeof args)) return request;
73
- return {
74
- ...request,
75
- params: {
76
- ...request.params,
77
- arguments: stripConversationId(args)
78
- }
79
- };
80
- }
81
66
  function stripConversationId(args) {
82
67
  if (!args || 'object' != typeof args || !(CONVERSATION_ID_PARAM_NAME in args)) return args;
83
68
  const { [CONVERSATION_ID_PARAM_NAME]: _omit, ...rest } = args;
@@ -100,4 +85,4 @@ function injectConversationIdPromptBack(result, conversationId) {
100
85
  ]
101
86
  };
102
87
  }
103
- 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;AAqPjB,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"}
@@ -26,7 +26,8 @@ __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
27
  instrumentHighLevelServer: ()=>instrumentHighLevelServer
28
28
  });
29
- const external_conversation_id_js_namespaceObject = require("./conversation-id.js");
29
+ const external_analytics_parameters_js_namespaceObject = require("./analytics-parameters.js");
30
+ const external_context_parameters_js_namespaceObject = require("./context-parameters.js");
30
31
  const external_event_types_js_namespaceObject = require("./event-types.js");
31
32
  const external_internal_js_namespaceObject = require("./internal.js");
32
33
  const external_logger_js_namespaceObject = require("./logger.js");
@@ -62,7 +63,8 @@ function setupListenerToRegisteredTools(server) {
62
63
  (0, external_logger_js_namespaceObject.log)(`Tool ${String(property)} callback already wrapped, skipping proxy wrapping`);
63
64
  return Reflect.set(target, property, value);
64
65
  }
65
- const nextValue = addTracingToToolCallbackInternal(value, property, server);
66
+ const getCurrentInputSchema = ()=>value.inputSchema;
67
+ const nextValue = addTracingToToolCallbackInternal(value, property, server, getCurrentInputSchema);
66
68
  if ('function' == typeof nextValue.update) {
67
69
  const originalUpdate = nextValue.update;
68
70
  nextValue.update = function(...updateArgs) {
@@ -71,7 +73,7 @@ function setupListenerToRegisteredTools(server) {
71
73
  if (isCallbackUpdate(updateObj)) {
72
74
  const wrappedTool = addTracingToToolCallbackInternal({
73
75
  callback: updateObj.callback
74
- }, property, server);
76
+ }, property, server, getCurrentInputSchema);
75
77
  updateObj.callback = (0, external_mcp_sdk_compat_js_namespaceObject.getToolFunction)(wrappedTool);
76
78
  }
77
79
  }
@@ -103,9 +105,10 @@ function setupListenerToRegisteredTools(server) {
103
105
  (0, external_logger_js_namespaceObject.log)(`Warning: Failed to setup listener for registered tools - ${error}`);
104
106
  }
105
107
  }
106
- function addTracingToToolCallbackInternal(tool, toolName, server) {
108
+ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInputSchema = ()=>tool.inputSchema) {
107
109
  const originalCallback = (0, external_mcp_sdk_compat_js_namespaceObject.getToolFunction)(tool);
108
- const missingToolName = (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)((0, external_internal_js_namespaceObject.getServerTrackingData)(server.server)?.options);
110
+ const options = (0, external_internal_js_namespaceObject.getServerTrackingData)(server.server)?.options;
111
+ const missingToolName = (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(options);
109
112
  if (wrappedCallbacks.has(originalCallback)) {
110
113
  (0, external_logger_js_namespaceObject.log)(`Tool ${toolName} callback already wrapped, skipping re-wrap`);
111
114
  return tool;
@@ -124,14 +127,11 @@ function addTracingToToolCallbackInternal(tool, toolName, server) {
124
127
  args = void 0;
125
128
  extra = params[0];
126
129
  }
127
- const removeContextFromArgs = (input)=>{
128
- if (input && 'object' == typeof input && 'context' in input) {
129
- const { context: _context, ...rest } = input;
130
- return rest;
131
- }
132
- return input;
133
- };
134
- const cleanedArgs = toolName === missingToolName ? args : (0, external_conversation_id_js_namespaceObject.stripConversationId)(removeContextFromArgs(args));
130
+ const inputSchema = getCurrentInputSchema();
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')
134
+ });
135
135
  try {
136
136
  if (void 0 === cleanedArgs) {
137
137
  const handler = originalCallback;
@@ -150,7 +150,7 @@ function addTracingToToolCallbackInternal(tool, toolName, server) {
150
150
  wrappedTool[MCP_ANALYTICS_PROCESSED] = true;
151
151
  return wrappedTool;
152
152
  }
153
- async function handleToolCallRequest(server, originalCallToolHandler, request, extra) {
153
+ async function handleToolCallRequest(highLevelServer, server, originalCallToolHandler, request, extra) {
154
154
  const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
155
155
  if (!data) {
156
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.');
@@ -170,12 +170,15 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
170
170
  })
171
171
  });
172
172
  }
173
+ const toolName = request.params?.name;
174
+ const registeredTool = toolName ? highLevelServer._registeredTools[toolName] : void 0;
173
175
  return await (0, external_instrumentation_js_namespaceObject.captureToolCall)({
174
176
  server,
175
177
  data,
176
178
  request,
177
179
  extra,
178
- execute: ()=>originalCallToolHandler(request, extra),
180
+ execute: (downstreamRequest)=>originalCallToolHandler(downstreamRequest, extra),
181
+ parameterOwnership: registeredTool ? (0, external_analytics_parameters_js_namespaceObject.getAnalyticsParameterOwnership)(registeredTool.inputSchema) : void 0,
179
182
  takeCapturedError: ()=>{
180
183
  const captured = extra?.__mcp_analytics_error;
181
184
  if (extra) extra.__mcp_analytics_error = void 0;
@@ -190,7 +193,7 @@ function instrumentHighLevelServer(server) {
190
193
  const handlers = {
191
194
  initialize: external_instrumentation_js_namespaceObject.handleInitializeRequest,
192
195
  'tools/list': external_instrumentation_js_namespaceObject.handleListToolsRequest,
193
- 'tools/call': handleToolCallRequest
196
+ 'tools/call': (trackedServer, originalHandler, request, extra)=>handleToolCallRequest(server, trackedServer, originalHandler, request, extra)
194
197
  };
195
198
  (0, external_instrumentation_js_namespaceObject.patchRequestHandlers)(lowLevelServer, handlers);
196
199
  server._registeredTools = addTracingToToolRegistry(server._registeredTools, server);
@@ -1,4 +1,5 @@
1
- import { stripConversationId } from "./conversation-id.mjs";
1
+ import { analyticsOwnsParameter, getAnalyticsParameterOwnership, stripOwnedAnalyticsArguments } from "./analytics-parameters.mjs";
2
+ import { isContextEnabled } from "./context-parameters.mjs";
2
3
  import { MCPAnalyticsEventType } from "./event-types.mjs";
3
4
  import { getServerTrackingData } from "./internal.mjs";
4
5
  import { log } from "./logger.mjs";
@@ -34,7 +35,8 @@ function setupListenerToRegisteredTools(server) {
34
35
  log(`Tool ${String(property)} callback already wrapped, skipping proxy wrapping`);
35
36
  return Reflect.set(target, property, value);
36
37
  }
37
- const nextValue = addTracingToToolCallbackInternal(value, property, server);
38
+ const getCurrentInputSchema = ()=>value.inputSchema;
39
+ const nextValue = addTracingToToolCallbackInternal(value, property, server, getCurrentInputSchema);
38
40
  if ('function' == typeof nextValue.update) {
39
41
  const originalUpdate = nextValue.update;
40
42
  nextValue.update = function(...updateArgs) {
@@ -43,7 +45,7 @@ function setupListenerToRegisteredTools(server) {
43
45
  if (isCallbackUpdate(updateObj)) {
44
46
  const wrappedTool = addTracingToToolCallbackInternal({
45
47
  callback: updateObj.callback
46
- }, property, server);
48
+ }, property, server, getCurrentInputSchema);
47
49
  updateObj.callback = getToolFunction(wrappedTool);
48
50
  }
49
51
  }
@@ -75,9 +77,10 @@ function setupListenerToRegisteredTools(server) {
75
77
  log(`Warning: Failed to setup listener for registered tools - ${error}`);
76
78
  }
77
79
  }
78
- function addTracingToToolCallbackInternal(tool, toolName, server) {
80
+ function addTracingToToolCallbackInternal(tool, toolName, server, getCurrentInputSchema = ()=>tool.inputSchema) {
79
81
  const originalCallback = getToolFunction(tool);
80
- const missingToolName = resolveMissingCapabilityToolName(getServerTrackingData(server.server)?.options);
82
+ const options = getServerTrackingData(server.server)?.options;
83
+ const missingToolName = resolveMissingCapabilityToolName(options);
81
84
  if (wrappedCallbacks.has(originalCallback)) {
82
85
  log(`Tool ${toolName} callback already wrapped, skipping re-wrap`);
83
86
  return tool;
@@ -96,14 +99,11 @@ function addTracingToToolCallbackInternal(tool, toolName, server) {
96
99
  args = void 0;
97
100
  extra = params[0];
98
101
  }
99
- const removeContextFromArgs = (input)=>{
100
- if (input && 'object' == typeof input && 'context' in input) {
101
- const { context: _context, ...rest } = input;
102
- return rest;
103
- }
104
- return input;
105
- };
106
- const cleanedArgs = toolName === missingToolName ? args : stripConversationId(removeContextFromArgs(args));
102
+ const inputSchema = getCurrentInputSchema();
103
+ const cleanedArgs = stripOwnedAnalyticsArguments(args, {
104
+ context: toolName !== missingToolName && isContextEnabled(options?.context) && analyticsOwnsParameter(inputSchema, 'context'),
105
+ conversationId: toolName !== missingToolName && options?.enableConversationId === true && analyticsOwnsParameter(inputSchema, 'conversation_id')
106
+ });
107
107
  try {
108
108
  if (void 0 === cleanedArgs) {
109
109
  const handler = originalCallback;
@@ -122,7 +122,7 @@ function addTracingToToolCallbackInternal(tool, toolName, server) {
122
122
  wrappedTool[MCP_ANALYTICS_PROCESSED] = true;
123
123
  return wrappedTool;
124
124
  }
125
- async function handleToolCallRequest(server, originalCallToolHandler, request, extra) {
125
+ async function handleToolCallRequest(highLevelServer, server, originalCallToolHandler, request, extra) {
126
126
  const data = getServerTrackingData(server);
127
127
  if (!data) {
128
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.');
@@ -142,12 +142,15 @@ async function handleToolCallRequest(server, originalCallToolHandler, request, e
142
142
  })
143
143
  });
144
144
  }
145
+ const toolName = request.params?.name;
146
+ const registeredTool = toolName ? highLevelServer._registeredTools[toolName] : void 0;
145
147
  return await captureToolCall({
146
148
  server,
147
149
  data,
148
150
  request,
149
151
  extra,
150
- execute: ()=>originalCallToolHandler(request, extra),
152
+ execute: (downstreamRequest)=>originalCallToolHandler(downstreamRequest, extra),
153
+ parameterOwnership: registeredTool ? getAnalyticsParameterOwnership(registeredTool.inputSchema) : void 0,
151
154
  takeCapturedError: ()=>{
152
155
  const captured = extra?.__mcp_analytics_error;
153
156
  if (extra) extra.__mcp_analytics_error = void 0;
@@ -162,7 +165,7 @@ function instrumentHighLevelServer(server) {
162
165
  const handlers = {
163
166
  initialize: handleInitializeRequest,
164
167
  'tools/list': handleListToolsRequest,
165
- 'tools/call': handleToolCallRequest
168
+ 'tools/call': (trackedServer, originalHandler, request, extra)=>handleToolCallRequest(server, trackedServer, originalHandler, request, extra)
166
169
  };
167
170
  patchRequestHandlers(lowLevelServer, handlers);
168
171
  server._registeredTools = addTracingToToolRegistry(server._registeredTools, server);