@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.
- package/dist/extensions/analytics-parameters.d.ts +5 -0
- package/dist/extensions/analytics-parameters.d.ts.map +1 -1
- package/dist/extensions/analytics-parameters.js +57 -3
- package/dist/extensions/analytics-parameters.mjs +47 -2
- package/dist/extensions/context-parameters.d.ts +1 -1
- package/dist/extensions/context-parameters.js +1 -1
- package/dist/extensions/context-parameters.mjs +1 -1
- package/dist/extensions/conversation-id.d.ts +0 -6
- package/dist/extensions/conversation-id.d.ts.map +1 -1
- package/dist/extensions/conversation-id.js +3 -18
- package/dist/extensions/conversation-id.mjs +2 -14
- package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
- package/dist/extensions/instrument-highlevel.js +9 -28
- package/dist/extensions/instrument-highlevel.mjs +8 -27
- 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/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 +67 -1
- package/src/extensions/context-parameters.ts +2 -2
- package/src/extensions/conversation-id.ts +1 -20
- package/src/extensions/instrument-highlevel.ts +21 -50
- package/src/extensions/instrumentation.ts +71 -11
- package/src/extensions/intent.ts +7 -1
- package/src/index.ts +1 -0
- package/src/types.ts +6 -0
- 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,
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
});
|
|
@@ -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,
|
|
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"}
|
|
@@ -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(
|
|
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 {
|
|
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,
|
|
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(
|
|
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
|
|
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
|
|
53
|
-
const
|
|
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
|
-
|
|
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) {
|