@posthog/mcp 0.10.7 → 0.10.9
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 +7 -2
- package/dist/extensions/analytics-parameters.d.ts.map +1 -1
- package/dist/extensions/analytics-parameters.js +4 -2
- package/dist/extensions/analytics-parameters.mjs +4 -2
- package/dist/extensions/conversation-id.d.ts +37 -8
- package/dist/extensions/conversation-id.d.ts.map +1 -1
- package/dist/extensions/conversation-id.js +8 -13
- package/dist/extensions/conversation-id.mjs +8 -13
- package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
- package/dist/extensions/instrument-highlevel.js +1 -1
- package/dist/extensions/instrument-highlevel.mjs +1 -1
- package/dist/extensions/instrument-lowlevel.d.ts.map +1 -1
- package/dist/extensions/instrument-lowlevel.js +6 -5
- package/dist/extensions/instrument-lowlevel.mjs +7 -6
- package/dist/extensions/instrumentation.d.ts +22 -0
- package/dist/extensions/instrumentation.d.ts.map +1 -1
- package/dist/extensions/instrumentation.js +48 -23
- package/dist/extensions/instrumentation.mjs +46 -24
- package/dist/extensions/internal.d.ts +8 -1
- package/dist/extensions/internal.d.ts.map +1 -1
- package/dist/extensions/internal.js +2 -2
- package/dist/extensions/internal.mjs +2 -2
- package/dist/extensions/mcp-sdk-compat.d.ts +10 -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/extensions/output-instructions.d.ts +70 -0
- package/dist/extensions/output-instructions.d.ts.map +1 -0
- package/dist/extensions/output-instructions.js +131 -0
- package/dist/extensions/output-instructions.mjs +82 -0
- package/dist/extensions/session.d.ts +26 -5
- package/dist/extensions/session.d.ts.map +1 -1
- package/dist/extensions/session.js +32 -14
- package/dist/extensions/session.mjs +30 -15
- package/dist/types.d.ts +23 -1
- 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 +15 -2
- package/src/extensions/conversation-id.ts +51 -29
- package/src/extensions/instrument-highlevel.ts +3 -1
- package/src/extensions/instrument-lowlevel.ts +14 -9
- package/src/extensions/instrumentation.ts +130 -38
- package/src/extensions/internal.ts +10 -2
- package/src/extensions/mcp-sdk-compat.ts +18 -0
- package/src/extensions/output-instructions.ts +231 -0
- package/src/extensions/session.ts +127 -28
- package/src/types.ts +23 -1
- package/src/version.ts +1 -1
|
@@ -12,6 +12,11 @@ export interface AnalyticsInjectableJsonSchema {
|
|
|
12
12
|
export declare function hasAnalyticsParameter(schema: AnalyticsInjectableJsonSchema | undefined, parameterName: string): boolean;
|
|
13
13
|
export declare function canInjectAnalyticsParameter(schema: AnalyticsInjectableJsonSchema | undefined, parameterName: string): boolean;
|
|
14
14
|
export declare function analyticsOwnsParameter(inputSchema: unknown, parameterName: string): boolean;
|
|
15
|
-
export declare function getAnalyticsParameterOwnership(inputSchema: unknown): AnalyticsParameterOwnership;
|
|
16
|
-
|
|
15
|
+
export declare function getAnalyticsParameterOwnership(inputSchema: unknown, outputSchema?: unknown): AnalyticsParameterOwnership;
|
|
16
|
+
/**
|
|
17
|
+
* Removes the arguments we injected, leaving the host's own. Input-side only, so
|
|
18
|
+
* it takes just those two flags rather than the whole ownership record — callers
|
|
19
|
+
* that have no output-schema context should not have to invent a value for it.
|
|
20
|
+
*/
|
|
21
|
+
export declare function stripOwnedAnalyticsArguments(args: unknown, ownership: Pick<AnalyticsParameterOwnership, 'context' | 'conversationId'>): unknown;
|
|
17
22
|
//# 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,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAA;
|
|
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;AAiB3D,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,CAC5C,WAAW,EAAE,OAAO,EACpB,YAAY,CAAC,EAAE,OAAO,GACrB,2BAA2B,CAM7B;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,IAAI,CAAC,2BAA2B,EAAE,SAAS,GAAG,gBAAgB,CAAC,GACzE,OAAO,CAWT"}
|
|
@@ -31,6 +31,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
31
31
|
stripOwnedAnalyticsArguments: ()=>stripOwnedAnalyticsArguments
|
|
32
32
|
});
|
|
33
33
|
const external_mcp_sdk_compat_js_namespaceObject = require("./mcp-sdk-compat.js");
|
|
34
|
+
const external_output_instructions_js_namespaceObject = require("./output-instructions.js");
|
|
34
35
|
const JSON_SCHEMA_KEYWORDS = [
|
|
35
36
|
'$defs',
|
|
36
37
|
'$ref',
|
|
@@ -63,10 +64,11 @@ function analyticsOwnsParameter(inputSchema, parameterName) {
|
|
|
63
64
|
if ('_def' in schema || '_zod' in schema || '~standard' in schema) return canInjectAnalyticsParameter(void 0, parameterName);
|
|
64
65
|
return canInjectAnalyticsParameter(schema, parameterName);
|
|
65
66
|
}
|
|
66
|
-
function getAnalyticsParameterOwnership(inputSchema) {
|
|
67
|
+
function getAnalyticsParameterOwnership(inputSchema, outputSchema) {
|
|
67
68
|
return {
|
|
68
69
|
context: analyticsOwnsParameter(inputSchema, 'context'),
|
|
69
|
-
conversationId: analyticsOwnsParameter(inputSchema, 'conversation_id')
|
|
70
|
+
conversationId: analyticsOwnsParameter(inputSchema, 'conversation_id'),
|
|
71
|
+
outputInstructions: (0, external_output_instructions_js_namespaceObject.canDeclareOutputInstructions)(outputSchema)
|
|
70
72
|
};
|
|
71
73
|
}
|
|
72
74
|
function stripOwnedAnalyticsArguments(args, ownership) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getObjectShape, isZodRawShapeCompat } from "./mcp-sdk-compat.mjs";
|
|
2
|
+
import { canDeclareOutputInstructions } from "./output-instructions.mjs";
|
|
2
3
|
const JSON_SCHEMA_KEYWORDS = [
|
|
3
4
|
'$defs',
|
|
4
5
|
'$ref',
|
|
@@ -31,10 +32,11 @@ function analyticsOwnsParameter(inputSchema, parameterName) {
|
|
|
31
32
|
if ('_def' in schema || '_zod' in schema || '~standard' in schema) return canInjectAnalyticsParameter(void 0, parameterName);
|
|
32
33
|
return canInjectAnalyticsParameter(schema, parameterName);
|
|
33
34
|
}
|
|
34
|
-
function getAnalyticsParameterOwnership(inputSchema) {
|
|
35
|
+
function getAnalyticsParameterOwnership(inputSchema, outputSchema) {
|
|
35
36
|
return {
|
|
36
37
|
context: analyticsOwnsParameter(inputSchema, 'context'),
|
|
37
|
-
conversationId: analyticsOwnsParameter(inputSchema, 'conversation_id')
|
|
38
|
+
conversationId: analyticsOwnsParameter(inputSchema, 'conversation_id'),
|
|
39
|
+
outputInstructions: canDeclareOutputInstructions(outputSchema)
|
|
38
40
|
};
|
|
39
41
|
}
|
|
40
42
|
function stripOwnedAnalyticsArguments(args, ownership) {
|
|
@@ -7,7 +7,13 @@ export interface ConversationIdInjectableTool {
|
|
|
7
7
|
[key: string]: unknown;
|
|
8
8
|
}
|
|
9
9
|
export declare function addConversationIdToTool<TTool extends ConversationIdInjectableTool>(tool: TTool, logger?: LoggerFn): TTool;
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Injects `conversation_id` across a tool listing, including the virtual
|
|
12
|
+
* `get_more_tools` tool. Its calls publish `$mcp_missing_capability`, and a
|
|
13
|
+
* capability gap is only meaningful next to the work that hit it — so it belongs
|
|
14
|
+
* in the same session as the surrounding tool calls.
|
|
15
|
+
*/
|
|
16
|
+
export declare function addConversationIdToTools<TTool extends ConversationIdInjectableTool>(tools: TTool[], logger?: LoggerFn): TTool[];
|
|
11
17
|
export type ConversationIdResolution = {
|
|
12
18
|
minted: false;
|
|
13
19
|
conversationId: string | undefined;
|
|
@@ -17,15 +23,38 @@ export type ConversationIdResolution = {
|
|
|
17
23
|
};
|
|
18
24
|
/**
|
|
19
25
|
* Decides which conversation_id to use for a tool call:
|
|
20
|
-
* - disabled
|
|
21
|
-
* - agent
|
|
22
|
-
* -
|
|
26
|
+
* - disabled → none
|
|
27
|
+
* - agent echoed a handle we could have minted → use it
|
|
28
|
+
* - anything else → mint a fresh one
|
|
29
|
+
*
|
|
30
|
+
* The shape check matters because this value becomes `$session_id`, and the
|
|
31
|
+
* derivation is deterministic so that two pods agree — which also means two
|
|
32
|
+
* *callers* sending the same string land in the same session. The strings agents
|
|
33
|
+
* invent are not random (`conv-1`, `1`, `session`), so trusting them verbatim
|
|
34
|
+
* would silently merge unrelated conversations, potentially across users.
|
|
35
|
+
*
|
|
36
|
+
* A compliant agent echoes the uuidv7 we minted and is unaffected. Anything else
|
|
37
|
+
* is treated exactly as if the handle were absent: mint, and prompt back. Shape
|
|
38
|
+
* rather than a registry of issued ids, because a per-request server has no
|
|
39
|
+
* memory of what it minted.
|
|
40
|
+
*
|
|
41
|
+
* This narrows the problem, it does not prove provenance: a caller supplying a
|
|
42
|
+
* well-formed uuidv7 is trusted, so two that pick the *same* one still merge. That
|
|
43
|
+
* residue is far smaller than the case it replaces — an agent ignoring the
|
|
44
|
+
* parameter description reaches for `conv-1` or `1`, not a conforming uuidv7 — and
|
|
45
|
+
* closing it needs a signed handle, i.e. a secret shared by every pod. Worth doing
|
|
46
|
+
* if this ever anchors something security-bearing; `$session_id` is an analytics
|
|
47
|
+
* grouping key, so it does not today.
|
|
23
48
|
*/
|
|
24
|
-
export declare function resolveConversationId(enabled: boolean, args: unknown
|
|
49
|
+
export declare function resolveConversationId(enabled: boolean, args: unknown): ConversationIdResolution;
|
|
25
50
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
51
|
+
* Whether the prompt-back can ride this result's `content`. The only requirement
|
|
52
|
+
* is an array to append to.
|
|
53
|
+
*
|
|
54
|
+
* Errored results included on purpose. A tool that fails on the first call of a
|
|
55
|
+
* conversation is exactly when the agent needs the session handle: without it the
|
|
56
|
+
* retry starts a fresh conversation, so the failure and its fix land in different
|
|
57
|
+
* sessions.
|
|
29
58
|
*/
|
|
30
59
|
export declare function canInjectConversationIdPromptBack(result: unknown): boolean;
|
|
31
60
|
export declare function extractConversationId(args: unknown): string | undefined;
|
|
@@ -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;AAE/B,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;
|
|
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;AAE/B,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE7C,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,EAChF,IAAI,EAAE,KAAK,EACX,MAAM,GAAE,QAAc,GACrB,KAAK,CA4CP;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,SAAS,4BAA4B,EACjF,KAAK,EAAE,KAAK,EAAE,EACd,MAAM,GAAE,QAAc,GACrB,KAAK,EAAE,CAET;AAQD,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;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,wBAAwB,CAa/F;AAED;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAK1E;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"}
|
|
@@ -38,7 +38,6 @@ const core_namespaceObject = require("@posthog/core");
|
|
|
38
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
|
-
const external_tools_js_namespaceObject = require("./tools.js");
|
|
42
41
|
const CONVERSATION_ID_PARAM_NAME = 'conversation_id';
|
|
43
42
|
function addConversationIdToTool(tool, logger = external_logger_js_namespaceObject.log) {
|
|
44
43
|
const modifiedTool = {
|
|
@@ -65,21 +64,19 @@ function addConversationIdToTool(tool, logger = external_logger_js_namespaceObje
|
|
|
65
64
|
};
|
|
66
65
|
return modifiedTool;
|
|
67
66
|
}
|
|
68
|
-
function addConversationIdToTools(tools,
|
|
69
|
-
return tools.map((tool)=>
|
|
70
|
-
if (skipMissingCapabilityTool && tool.name === missingCapabilityToolName) return tool;
|
|
71
|
-
return addConversationIdToTool(tool, logger);
|
|
72
|
-
});
|
|
67
|
+
function addConversationIdToTools(tools, logger = external_logger_js_namespaceObject.log) {
|
|
68
|
+
return tools.map((tool)=>addConversationIdToTool(tool, logger));
|
|
73
69
|
}
|
|
74
|
-
|
|
75
|
-
|
|
70
|
+
const MINTED_CONVERSATION_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
71
|
+
function resolveConversationId(enabled, args) {
|
|
72
|
+
if (!enabled) return {
|
|
76
73
|
minted: false,
|
|
77
74
|
conversationId: void 0
|
|
78
75
|
};
|
|
79
76
|
const supplied = extractConversationId(args);
|
|
80
|
-
if (supplied) return {
|
|
77
|
+
if (supplied && MINTED_CONVERSATION_ID.test(supplied)) return {
|
|
81
78
|
minted: false,
|
|
82
|
-
conversationId: supplied
|
|
79
|
+
conversationId: supplied.toLowerCase()
|
|
83
80
|
};
|
|
84
81
|
return {
|
|
85
82
|
minted: true,
|
|
@@ -88,9 +85,7 @@ function resolveConversationId(enabled, args, toolName, missingCapabilityToolNam
|
|
|
88
85
|
}
|
|
89
86
|
function canInjectConversationIdPromptBack(result) {
|
|
90
87
|
if (!(result && 'object' == typeof result)) return false;
|
|
91
|
-
|
|
92
|
-
if (true === resultObj.isError) return false;
|
|
93
|
-
return Array.isArray(resultObj.content);
|
|
88
|
+
return Array.isArray(result.content);
|
|
94
89
|
}
|
|
95
90
|
function extractConversationId(args) {
|
|
96
91
|
if (!(args && 'object' == typeof args)) return;
|
|
@@ -2,7 +2,6 @@ import { uuidv7 } from "@posthog/core";
|
|
|
2
2
|
import { canInjectAnalyticsParameter, hasAnalyticsParameter } from "./analytics-parameters.mjs";
|
|
3
3
|
import { DEFAULT_CONVERSATION_ID_DESCRIPTION } from "./constants.mjs";
|
|
4
4
|
import { log } from "./logger.mjs";
|
|
5
|
-
import { GET_MORE_TOOLS_NAME } from "./tools.mjs";
|
|
6
5
|
const CONVERSATION_ID_PARAM_NAME = 'conversation_id';
|
|
7
6
|
function addConversationIdToTool(tool, logger = log) {
|
|
8
7
|
const modifiedTool = {
|
|
@@ -29,21 +28,19 @@ function addConversationIdToTool(tool, logger = log) {
|
|
|
29
28
|
};
|
|
30
29
|
return modifiedTool;
|
|
31
30
|
}
|
|
32
|
-
function addConversationIdToTools(tools,
|
|
33
|
-
return tools.map((tool)=>
|
|
34
|
-
if (skipMissingCapabilityTool && tool.name === missingCapabilityToolName) return tool;
|
|
35
|
-
return addConversationIdToTool(tool, logger);
|
|
36
|
-
});
|
|
31
|
+
function addConversationIdToTools(tools, logger = log) {
|
|
32
|
+
return tools.map((tool)=>addConversationIdToTool(tool, logger));
|
|
37
33
|
}
|
|
38
|
-
|
|
39
|
-
|
|
34
|
+
const MINTED_CONVERSATION_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
35
|
+
function resolveConversationId(enabled, args) {
|
|
36
|
+
if (!enabled) return {
|
|
40
37
|
minted: false,
|
|
41
38
|
conversationId: void 0
|
|
42
39
|
};
|
|
43
40
|
const supplied = extractConversationId(args);
|
|
44
|
-
if (supplied) return {
|
|
41
|
+
if (supplied && MINTED_CONVERSATION_ID.test(supplied)) return {
|
|
45
42
|
minted: false,
|
|
46
|
-
conversationId: supplied
|
|
43
|
+
conversationId: supplied.toLowerCase()
|
|
47
44
|
};
|
|
48
45
|
return {
|
|
49
46
|
minted: true,
|
|
@@ -52,9 +49,7 @@ function resolveConversationId(enabled, args, toolName, missingCapabilityToolNam
|
|
|
52
49
|
}
|
|
53
50
|
function canInjectConversationIdPromptBack(result) {
|
|
54
51
|
if (!(result && 'object' == typeof result)) return false;
|
|
55
|
-
|
|
56
|
-
if (true === resultObj.isError) return false;
|
|
57
|
-
return Array.isArray(resultObj.content);
|
|
52
|
+
return Array.isArray(result.content);
|
|
58
53
|
}
|
|
59
54
|
function extractConversationId(args) {
|
|
60
55
|
if (!(args && 'object' == typeof args)) return;
|
|
@@ -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;AASjB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"instrument-highlevel.d.ts","sourceRoot":"","sources":["../../src/extensions/instrument-highlevel.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,sBAAsB,EAIvB,MAAM,UAAU,CAAA;AASjB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAgQxC,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CA2BhG"}
|
|
@@ -177,7 +177,7 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
|
|
|
177
177
|
request,
|
|
178
178
|
extra,
|
|
179
179
|
execute: (downstreamRequest)=>originalCallToolHandler(downstreamRequest, extra),
|
|
180
|
-
parameterOwnership: registeredTool ? (0, external_analytics_parameters_js_namespaceObject.getAnalyticsParameterOwnership)(registeredTool.inputSchema) : void 0,
|
|
180
|
+
parameterOwnership: registeredTool ? (0, external_analytics_parameters_js_namespaceObject.getAnalyticsParameterOwnership)(registeredTool.inputSchema, registeredTool.outputSchema) : void 0,
|
|
181
181
|
takeCapturedError: ()=>{
|
|
182
182
|
const captured = extra?.__mcp_analytics_error;
|
|
183
183
|
if (extra) extra.__mcp_analytics_error = void 0;
|
|
@@ -149,7 +149,7 @@ async function handleToolCallRequest(highLevelServer, server, originalCallToolHa
|
|
|
149
149
|
request,
|
|
150
150
|
extra,
|
|
151
151
|
execute: (downstreamRequest)=>originalCallToolHandler(downstreamRequest, extra),
|
|
152
|
-
parameterOwnership: registeredTool ? getAnalyticsParameterOwnership(registeredTool.inputSchema) : void 0,
|
|
152
|
+
parameterOwnership: registeredTool ? getAnalyticsParameterOwnership(registeredTool.inputSchema, registeredTool.outputSchema) : void 0,
|
|
153
153
|
takeCapturedError: ()=>{
|
|
154
154
|
const captured = extra?.__mcp_analytics_error;
|
|
155
155
|
if (extra) extra.__mcp_analytics_error = void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument-lowlevel.d.ts","sourceRoot":"","sources":["../../src/extensions/instrument-lowlevel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"instrument-lowlevel.d.ts","sourceRoot":"","sources":["../../src/extensions/instrument-lowlevel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAiD,aAAa,EAAE,MAAM,UAAU,CAAA;AAG5F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAmBxC;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CA0BtF"}
|
|
@@ -26,7 +26,6 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
26
26
|
__webpack_require__.d(__webpack_exports__, {
|
|
27
27
|
instrumentLowLevelServer: ()=>instrumentLowLevelServer
|
|
28
28
|
});
|
|
29
|
-
const types_js_namespaceObject = require("@modelcontextprotocol/sdk/types.js");
|
|
30
29
|
const external_event_types_js_namespaceObject = require("./event-types.js");
|
|
31
30
|
const external_internal_js_namespaceObject = require("./internal.js");
|
|
32
31
|
const external_tools_js_namespaceObject = require("./tools.js");
|
|
@@ -35,20 +34,22 @@ const external_tracing_helpers_js_namespaceObject = require("./tracing-helpers.j
|
|
|
35
34
|
function instrumentLowLevelServer(server, logger) {
|
|
36
35
|
try {
|
|
37
36
|
const hadCallToolHandler = server._requestHandlers.has('tools/call');
|
|
37
|
+
const traceToolCall = (server, originalHandler, request, extra)=>handleToolCallRequest(server, originalHandler, request, extra, logger);
|
|
38
38
|
const handlers = {
|
|
39
39
|
initialize: (server, originalHandler, request, extra)=>(0, external_instrumentation_js_namespaceObject.handleInitializeRequest)(server, originalHandler, request, extra, logger),
|
|
40
40
|
'tools/list': (server, originalHandler, request, extra)=>(0, external_instrumentation_js_namespaceObject.handleListToolsRequest)(server, originalHandler, request, extra, logger),
|
|
41
|
-
'tools/call':
|
|
41
|
+
'tools/call': traceToolCall
|
|
42
42
|
};
|
|
43
43
|
(0, external_instrumentation_js_namespaceObject.patchRequestHandlers)(server, handlers);
|
|
44
|
-
if (!hadCallToolHandler)
|
|
45
|
-
throw new Error(`Unknown tool: ${request.params?.name || 'unknown'}`);
|
|
46
|
-
});
|
|
44
|
+
if (!hadCallToolHandler) (0, external_instrumentation_js_namespaceObject.registerFallbackRequestHandler)(server, 'tools/call', unknownToolHandler, traceToolCall);
|
|
47
45
|
} catch (error) {
|
|
48
46
|
logger(`Warning: Failed to setup tool call instrumentation - ${error}`);
|
|
49
47
|
throw error;
|
|
50
48
|
}
|
|
51
49
|
}
|
|
50
|
+
async function unknownToolHandler(request) {
|
|
51
|
+
throw new Error(`Unknown tool: ${request.params?.name || 'unknown'}`);
|
|
52
|
+
}
|
|
52
53
|
async function handleToolCallRequest(server, originalCallToolHandler, request, extra, logger) {
|
|
53
54
|
const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
|
|
54
55
|
if (!data) {
|
|
@@ -1,26 +1,27 @@
|
|
|
1
|
-
import { CallToolRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
2
1
|
import { MCPAnalyticsEventType } from "./event-types.mjs";
|
|
3
2
|
import { getServerTrackingData } from "./internal.mjs";
|
|
4
3
|
import { handleReportMissing, resolveMissingCapabilityToolName } from "./tools.mjs";
|
|
5
|
-
import { captureToolCall, handleInitializeRequest, handleListToolsRequest, isToolAdvertised, patchRequestHandlers } from "./instrumentation.mjs";
|
|
4
|
+
import { captureToolCall, handleInitializeRequest, handleListToolsRequest, isToolAdvertised, patchRequestHandlers, registerFallbackRequestHandler } from "./instrumentation.mjs";
|
|
6
5
|
import { getContextArgument } from "./tracing-helpers.mjs";
|
|
7
6
|
function instrumentLowLevelServer(server, logger) {
|
|
8
7
|
try {
|
|
9
8
|
const hadCallToolHandler = server._requestHandlers.has('tools/call');
|
|
9
|
+
const traceToolCall = (server, originalHandler, request, extra)=>handleToolCallRequest(server, originalHandler, request, extra, logger);
|
|
10
10
|
const handlers = {
|
|
11
11
|
initialize: (server, originalHandler, request, extra)=>handleInitializeRequest(server, originalHandler, request, extra, logger),
|
|
12
12
|
'tools/list': (server, originalHandler, request, extra)=>handleListToolsRequest(server, originalHandler, request, extra, logger),
|
|
13
|
-
'tools/call':
|
|
13
|
+
'tools/call': traceToolCall
|
|
14
14
|
};
|
|
15
15
|
patchRequestHandlers(server, handlers);
|
|
16
|
-
if (!hadCallToolHandler) server
|
|
17
|
-
throw new Error(`Unknown tool: ${request.params?.name || 'unknown'}`);
|
|
18
|
-
});
|
|
16
|
+
if (!hadCallToolHandler) registerFallbackRequestHandler(server, 'tools/call', unknownToolHandler, traceToolCall);
|
|
19
17
|
} catch (error) {
|
|
20
18
|
logger(`Warning: Failed to setup tool call instrumentation - ${error}`);
|
|
21
19
|
throw error;
|
|
22
20
|
}
|
|
23
21
|
}
|
|
22
|
+
async function unknownToolHandler(request) {
|
|
23
|
+
throw new Error(`Unknown tool: ${request.params?.name || 'unknown'}`);
|
|
24
|
+
}
|
|
24
25
|
async function handleToolCallRequest(server, originalCallToolHandler, request, extra, logger) {
|
|
25
26
|
const data = getServerTrackingData(server);
|
|
26
27
|
if (!data) {
|
|
@@ -55,6 +55,28 @@ export declare function captureToolCall(params: TraceToolCallParams): Promise<un
|
|
|
55
55
|
* supplies `request` and `extra` per call.
|
|
56
56
|
*/
|
|
57
57
|
export type HandlerPatch = (server: MCPServerLike, originalHandler: MCPRequestHandler, request: MCPRequestLike, extra: CompatibleRequestHandlerExtra | undefined) => Promise<unknown>;
|
|
58
|
+
/**
|
|
59
|
+
* Registers a synthetic fallback handler for `handlerName`, already wrapped in
|
|
60
|
+
* `patch`, by writing straight into `_requestHandlers` instead of going through
|
|
61
|
+
* `setRequestHandler`.
|
|
62
|
+
*
|
|
63
|
+
* Bypassing the SDK setter is deliberate, on three counts:
|
|
64
|
+
*
|
|
65
|
+
* - **Capability assertion.** `setRequestHandler` refuses a method the server
|
|
66
|
+
* never declared a capability for, so instrumenting a low-level server built
|
|
67
|
+
* without `capabilities.tools` used to throw `Server does not support tools`
|
|
68
|
+
* and leave instrumentation half-applied. Our fallback is not a capability the
|
|
69
|
+
* server offers — it exists only so a call for a tool nobody claims is still
|
|
70
|
+
* captured — so the assertion has nothing to protect here.
|
|
71
|
+
* - **Schema validation.** The setter also wraps the handler in request/result
|
|
72
|
+
* parsing, which a handler that can only ever throw `Unknown tool` never needs.
|
|
73
|
+
* - **Portability.** The setter's first argument is a Zod schema on SDK v1 and a
|
|
74
|
+
* method string on v2; the map key is the same string on both, so this is the
|
|
75
|
+
* one registration form that does not need to know which major it is talking
|
|
76
|
+
* to — and it drops the last runtime `@modelcontextprotocol/sdk` import from
|
|
77
|
+
* the shipped bundle.
|
|
78
|
+
*/
|
|
79
|
+
export declare function registerFallbackRequestHandler(server: MCPServerLike, handlerName: string, fallbackHandler: MCPRequestHandler, patch: HandlerPatch): void;
|
|
58
80
|
export declare function patchRequestHandlers(server: MCPServerLike, patches: Record<string, HandlerPatch>): void;
|
|
59
81
|
/**
|
|
60
82
|
* Checks the server's raw listing for a real owner of a candidate virtual tool.
|
|
@@ -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,2BAA2B,EAC3B,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,EACd,aAAa,EAId,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/extensions/instrumentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,12 +31,14 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
31
31
|
readToolMetaCategory: ()=>readToolMetaCategory,
|
|
32
32
|
cacheToolCategories: ()=>cacheToolCategories,
|
|
33
33
|
handleListToolsRequest: ()=>handleListToolsRequest,
|
|
34
|
+
registerFallbackRequestHandler: ()=>registerFallbackRequestHandler,
|
|
34
35
|
patchRequestHandlers: ()=>patchRequestHandlers
|
|
35
36
|
});
|
|
36
37
|
const external_analytics_parameters_js_namespaceObject = require("./analytics-parameters.js");
|
|
37
38
|
const external_context_parameters_js_namespaceObject = require("./context-parameters.js");
|
|
38
39
|
const external_conversation_id_js_namespaceObject = require("./conversation-id.js");
|
|
39
40
|
const external_client_identity_js_namespaceObject = require("./client-identity.js");
|
|
41
|
+
const external_output_instructions_js_namespaceObject = require("./output-instructions.js");
|
|
40
42
|
const external_capture_js_namespaceObject = require("./capture.js");
|
|
41
43
|
const external_event_types_js_namespaceObject = require("./event-types.js");
|
|
42
44
|
const external_exceptions_js_namespaceObject = require("./exceptions.js");
|
|
@@ -52,7 +54,7 @@ async function captureToolCall(params) {
|
|
|
52
54
|
const { server, data, request, extra, execute, parameterOwnership, eventType, explicitContextIntent, takeCapturedError } = params;
|
|
53
55
|
const resolvedEventType = eventType ?? external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsCall;
|
|
54
56
|
const ownership = getActiveAnalyticsParameterOwnership(data, request.params?.name, parameterOwnership, resolvedEventType === external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpMissingCapability);
|
|
55
|
-
const conversation = (0, external_conversation_id_js_namespaceObject.resolveConversationId)(ownership.conversationId, request.params?.arguments
|
|
57
|
+
const conversation = (0, external_conversation_id_js_namespaceObject.resolveConversationId)(ownership.conversationId, request.params?.arguments);
|
|
56
58
|
const downstreamRequest = cloneRequestWithoutOwnedAnalyticsArguments(request, ownership);
|
|
57
59
|
const startTime = new Date();
|
|
58
60
|
const preparedEvent = await prepareToolCallEvent(server, data, request, downstreamRequest, extra, startTime, conversation, ownership, resolvedEventType);
|
|
@@ -64,15 +66,17 @@ async function captureToolCall(params) {
|
|
|
64
66
|
publishFailedToolEvent(server, preparedEvent, error, startTime, conversation, data.logger);
|
|
65
67
|
throw error;
|
|
66
68
|
}
|
|
67
|
-
const finalResult =
|
|
69
|
+
const finalResult = applyConversationInstructions(preparedEvent?.event ?? null, result, conversation, ownership);
|
|
68
70
|
publishSuccessfulToolEvent(server, preparedEvent, finalResult, startTime, data.logger, takeCapturedError);
|
|
69
71
|
return finalResult;
|
|
70
72
|
}
|
|
71
73
|
function getActiveAnalyticsParameterOwnership(data, toolName, override, isMissingCapabilityTool) {
|
|
72
|
-
const
|
|
74
|
+
const listed = toolName ? data.toolAnalyticsParameterOwnership.get(toolName) : void 0;
|
|
75
|
+
const ownership = override ?? listed;
|
|
73
76
|
return {
|
|
74
77
|
context: !isMissingCapabilityTool && (0, external_context_parameters_js_namespaceObject.isContextEnabled)(data.options.context) && ownership?.context === true,
|
|
75
|
-
conversationId:
|
|
78
|
+
conversationId: true === data.options.enableConversationId && ownership?.conversationId === true,
|
|
79
|
+
outputInstructions: true === data.options.enableConversationId && listed?.outputInstructions === true
|
|
76
80
|
};
|
|
77
81
|
}
|
|
78
82
|
function cloneRequestWithoutOwnedAnalyticsArguments(request, ownership) {
|
|
@@ -89,9 +93,9 @@ function cloneRequestWithoutOwnedAnalyticsArguments(request, ownership) {
|
|
|
89
93
|
}
|
|
90
94
|
async function prepareToolCallEvent(server, data, request, downstreamRequest, extra, startTime, conversation, ownership, eventType) {
|
|
91
95
|
try {
|
|
92
|
-
const sessionId = (0, external_session_js_namespaceObject.getSessionId)(server, extra);
|
|
96
|
+
const sessionId = (0, external_session_js_namespaceObject.getSessionId)(server, extra, conversation.conversationId);
|
|
93
97
|
const sessionInfo = (0, external_session_js_namespaceObject.getSessionInfo)(server, data, sessionId);
|
|
94
|
-
const identity = await (0, external_internal_js_namespaceObject.handleIdentify)(server, data, sessionId, request, sessionInfo, extra);
|
|
98
|
+
const identity = await (0, external_internal_js_namespaceObject.handleIdentify)(server, data, sessionId, request, sessionInfo, extra, !!conversation.conversationId);
|
|
95
99
|
const requestAttribution = (0, external_internal_js_namespaceObject.withIdentity)(sessionInfo, identity);
|
|
96
100
|
const toolName = request.params?.name;
|
|
97
101
|
const event = {
|
|
@@ -116,11 +120,22 @@ async function prepareToolCallEvent(server, data, request, downstreamRequest, ex
|
|
|
116
120
|
return null;
|
|
117
121
|
}
|
|
118
122
|
}
|
|
119
|
-
function
|
|
120
|
-
|
|
121
|
-
if (
|
|
122
|
-
|
|
123
|
-
|
|
123
|
+
function applyConversationInstructions(event, result, conversation, ownership) {
|
|
124
|
+
const conversationId = conversation.conversationId;
|
|
125
|
+
if (!conversationId) return result;
|
|
126
|
+
let updated = result;
|
|
127
|
+
let delivered = false;
|
|
128
|
+
if (ownership.outputInstructions) {
|
|
129
|
+
const mirrored = (0, external_output_instructions_js_namespaceObject.mirrorInstructionsIntoStructuredContent)(updated, conversationId);
|
|
130
|
+
delivered = mirrored !== updated;
|
|
131
|
+
updated = mirrored;
|
|
132
|
+
}
|
|
133
|
+
if (conversation.minted && (0, external_conversation_id_js_namespaceObject.canInjectConversationIdPromptBack)(updated)) {
|
|
134
|
+
updated = (0, external_conversation_id_js_namespaceObject.injectConversationIdPromptBack)(updated, conversationId);
|
|
135
|
+
delivered = true;
|
|
136
|
+
}
|
|
137
|
+
if (!delivered && conversation.minted && event) event.conversationId = void 0;
|
|
138
|
+
return updated;
|
|
124
139
|
}
|
|
125
140
|
function publishSuccessfulToolEvent(server, preparedEvent, result, startTime, logger, takeCapturedError) {
|
|
126
141
|
if (!preparedEvent) return;
|
|
@@ -160,6 +175,10 @@ function rememberOriginalRequestHandler(server, handlerName, originalHandler) {
|
|
|
160
175
|
}
|
|
161
176
|
handlers.set(handlerName, originalHandler);
|
|
162
177
|
}
|
|
178
|
+
function registerFallbackRequestHandler(server, handlerName, fallbackHandler, patch) {
|
|
179
|
+
rememberOriginalRequestHandler(server, handlerName, fallbackHandler);
|
|
180
|
+
server._requestHandlers.set(handlerName, (request, extra)=>patch(server, fallbackHandler, request, extra));
|
|
181
|
+
}
|
|
163
182
|
function patchRequestHandlers(server, patches) {
|
|
164
183
|
for (const [handlerName, patch] of Object.entries(patches)){
|
|
165
184
|
const originalHandler = server._requestHandlers.get(handlerName);
|
|
@@ -169,12 +188,11 @@ function patchRequestHandlers(server, patches) {
|
|
|
169
188
|
}
|
|
170
189
|
}
|
|
171
190
|
const originalSetRequestHandler = server.setRequestHandler.bind(server);
|
|
172
|
-
server.setRequestHandler = (
|
|
173
|
-
const
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
const result = originalSetRequestHandler(requestSchema, originalHandler);
|
|
191
|
+
server.setRequestHandler = (...args)=>{
|
|
192
|
+
const handlerName = (0, external_mcp_sdk_compat_js_namespaceObject.readRequestHandlerMethod)(args[0]);
|
|
193
|
+
const patch = void 0 !== handlerName && Object.prototype.hasOwnProperty.call(patches, handlerName) ? patches[handlerName] : void 0;
|
|
194
|
+
if (void 0 === handlerName || !patch) return originalSetRequestHandler(...args);
|
|
195
|
+
const result = originalSetRequestHandler(...args);
|
|
178
196
|
const registeredHandler = server._requestHandlers.get(handlerName);
|
|
179
197
|
if (registeredHandler) {
|
|
180
198
|
rememberOriginalRequestHandler(server, handlerName, registeredHandler);
|
|
@@ -240,7 +258,7 @@ async function handleListToolsRequest(server, originalListToolsHandler, request,
|
|
|
240
258
|
};
|
|
241
259
|
}
|
|
242
260
|
function cacheToolAnalyticsParameterOwnership(cache, tools) {
|
|
243
|
-
for (const tool of tools)if (tool?.name) cache.set(tool.name, (0, external_analytics_parameters_js_namespaceObject.getAnalyticsParameterOwnership)(tool.inputSchema));
|
|
261
|
+
for (const tool of tools)if (tool?.name) cache.set(tool.name, (0, external_analytics_parameters_js_namespaceObject.getAnalyticsParameterOwnership)(tool.inputSchema, tool.outputSchema));
|
|
244
262
|
}
|
|
245
263
|
function collectListedToolNames(tools) {
|
|
246
264
|
if (!tools || 0 === tools.length) return;
|
|
@@ -258,16 +276,21 @@ async function getTracedToolsList(server, originalListToolsHandler, request, ext
|
|
|
258
276
|
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), data.logger);
|
|
259
277
|
if (data) {
|
|
260
278
|
const missingToolName = (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options);
|
|
261
|
-
let injectedMissingCapabilityTool = false;
|
|
262
279
|
if (data.options.reportMissing) {
|
|
263
280
|
const alreadyPresent = tools.some((tool)=>tool?.name === missingToolName);
|
|
264
281
|
if (alreadyPresent) data.logger(`Warning: Cannot inject missing-capability tool "${missingToolName}" because a real tool already uses that name. The real tool will not be intercepted.`);
|
|
265
282
|
else {
|
|
266
|
-
|
|
267
|
-
|
|
283
|
+
const virtualTool = (0, external_tools_js_namespaceObject.getReportMissingToolDescriptor)(missingToolName);
|
|
284
|
+
tools.push(virtualTool);
|
|
285
|
+
cacheToolAnalyticsParameterOwnership(data.toolAnalyticsParameterOwnership, [
|
|
286
|
+
virtualTool
|
|
287
|
+
]);
|
|
268
288
|
}
|
|
269
289
|
}
|
|
270
|
-
if (data.options.enableConversationId)
|
|
290
|
+
if (data.options.enableConversationId) {
|
|
291
|
+
tools = (0, external_conversation_id_js_namespaceObject.addConversationIdToTools)(tools, data.logger);
|
|
292
|
+
tools = (0, external_output_instructions_js_namespaceObject.addInstructionsToOutputSchemas)(tools, data.logger);
|
|
293
|
+
}
|
|
271
294
|
}
|
|
272
295
|
if (data) {
|
|
273
296
|
cacheToolDescriptions(data.toolDescriptions, tools);
|
|
@@ -410,6 +433,7 @@ exports.handleListToolsRequest = __webpack_exports__.handleListToolsRequest;
|
|
|
410
433
|
exports.isToolAdvertised = __webpack_exports__.isToolAdvertised;
|
|
411
434
|
exports.patchRequestHandlers = __webpack_exports__.patchRequestHandlers;
|
|
412
435
|
exports.readToolMetaCategory = __webpack_exports__.readToolMetaCategory;
|
|
436
|
+
exports.registerFallbackRequestHandler = __webpack_exports__.registerFallbackRequestHandler;
|
|
413
437
|
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
414
438
|
"cacheToolCategories",
|
|
415
439
|
"cacheToolDescriptions",
|
|
@@ -418,7 +442,8 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
|
418
442
|
"handleListToolsRequest",
|
|
419
443
|
"isToolAdvertised",
|
|
420
444
|
"patchRequestHandlers",
|
|
421
|
-
"readToolMetaCategory"
|
|
445
|
+
"readToolMetaCategory",
|
|
446
|
+
"registerFallbackRequestHandler"
|
|
422
447
|
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
423
448
|
Object.defineProperty(exports, '__esModule', {
|
|
424
449
|
value: true
|