@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.
- package/dist/extensions/analytics-parameters.d.ts +17 -0
- package/dist/extensions/analytics-parameters.d.ts.map +1 -0
- package/dist/extensions/analytics-parameters.js +98 -0
- package/dist/extensions/analytics-parameters.mjs +52 -0
- package/dist/extensions/context-parameters.d.ts +3 -12
- package/dist/extensions/context-parameters.d.ts.map +1 -1
- package/dist/extensions/context-parameters.js +4 -6
- package/dist/extensions/context-parameters.mjs +3 -6
- package/dist/extensions/conversation-id.d.ts +2 -17
- package/dist/extensions/conversation-id.d.ts.map +1 -1
- package/dist/extensions/conversation-id.js +6 -23
- package/dist/extensions/conversation-id.mjs +4 -19
- package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
- package/dist/extensions/instrument-highlevel.js +19 -16
- package/dist/extensions/instrument-highlevel.mjs +19 -16
- package/dist/extensions/instrumentation.d.ts +4 -6
- package/dist/extensions/instrumentation.d.ts.map +1 -1
- package/dist/extensions/instrumentation.js +32 -6
- package/dist/extensions/instrumentation.mjs +33 -7
- package/dist/extensions/intent.d.ts +1 -1
- package/dist/extensions/intent.d.ts.map +1 -1
- package/dist/extensions/intent.js +2 -2
- package/dist/extensions/intent.mjs +2 -2
- package/dist/extensions/mcp-sdk-compat.d.ts +1 -0
- package/dist/extensions/mcp-sdk-compat.d.ts.map +1 -1
- package/dist/extensions/mcp-sdk-compat.js +11 -2
- package/dist/extensions/mcp-sdk-compat.mjs +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.mjs +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +4 -4
- package/src/extensions/analytics-parameters.ts +89 -0
- package/src/extensions/context-parameters.ts +16 -24
- package/src/extensions/conversation-id.ts +18 -43
- package/src/extensions/instrument-highlevel.ts +42 -22
- package/src/extensions/instrumentation.ts +71 -11
- package/src/extensions/intent.ts +7 -1
- package/src/extensions/mcp-sdk-compat.ts +15 -0
- package/src/index.ts +1 -0
- package/src/types.ts +6 -0
- 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
|
-
|
|
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?:
|
|
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;
|
|
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
|
|
47
|
-
(0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" already has 'context' parameter. Skipping context injection.`);
|
|
48
|
-
|
|
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
|
|
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?:
|
|
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":"
|
|
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
|
-
|
|
30
|
+
injectConversationIdPromptBack: ()=>injectConversationIdPromptBack,
|
|
31
31
|
addConversationIdToTools: ()=>addConversationIdToTools,
|
|
32
32
|
extractConversationId: ()=>extractConversationId,
|
|
33
|
-
|
|
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
|
|
50
|
-
(0, external_logger_js_namespaceObject.log)(`WARN: Tool "${toolName}" already has '${CONVERSATION_ID_PARAM_NAME}' parameter. Skipping conversation_id injection.`);
|
|
51
|
-
|
|
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
|
|
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,
|
|
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;
|
|
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
|
|
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
|
|
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
|
|
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
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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(
|
|
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 {
|
|
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
|
|
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
|
|
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
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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(
|
|
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);
|