@mcp-ts/sdk 1.5.1 → 1.5.3
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/README.md +89 -27
- package/dist/adapters/agui-adapter.d.mts +1 -1
- package/dist/adapters/agui-adapter.d.ts +1 -1
- package/dist/adapters/agui-adapter.js +50 -10
- package/dist/adapters/agui-adapter.js.map +1 -1
- package/dist/adapters/agui-adapter.mjs +50 -10
- package/dist/adapters/agui-adapter.mjs.map +1 -1
- package/dist/adapters/agui-middleware.d.mts +5 -1
- package/dist/adapters/agui-middleware.d.ts +5 -1
- package/dist/adapters/agui-middleware.js +116 -49
- package/dist/adapters/agui-middleware.js.map +1 -1
- package/dist/adapters/agui-middleware.mjs +117 -50
- package/dist/adapters/agui-middleware.mjs.map +1 -1
- package/dist/adapters/ai-adapter.d.mts +1 -1
- package/dist/adapters/ai-adapter.d.ts +1 -1
- package/dist/adapters/ai-adapter.js +49 -9
- package/dist/adapters/ai-adapter.js.map +1 -1
- package/dist/adapters/ai-adapter.mjs +49 -9
- package/dist/adapters/ai-adapter.mjs.map +1 -1
- package/dist/adapters/langchain-adapter.d.mts +1 -1
- package/dist/adapters/langchain-adapter.d.ts +1 -1
- package/dist/adapters/langchain-adapter.js +49 -9
- package/dist/adapters/langchain-adapter.js.map +1 -1
- package/dist/adapters/langchain-adapter.mjs +49 -9
- package/dist/adapters/langchain-adapter.mjs.map +1 -1
- package/dist/client/react.d.mts +10 -0
- package/dist/client/react.d.ts +10 -0
- package/dist/client/react.js +23 -0
- package/dist/client/react.js.map +1 -1
- package/dist/client/react.mjs +23 -0
- package/dist/client/react.mjs.map +1 -1
- package/dist/client/vue.d.mts +10 -0
- package/dist/client/vue.d.ts +10 -0
- package/dist/client/vue.js +17 -0
- package/dist/client/vue.js.map +1 -1
- package/dist/client/vue.mjs +17 -0
- package/dist/client/vue.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +123 -28
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +123 -28
- package/dist/index.mjs.map +1 -1
- package/dist/shared/index.d.mts +2 -2
- package/dist/shared/index.d.ts +2 -2
- package/dist/shared/index.js +123 -28
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs +123 -28
- package/dist/shared/index.mjs.map +1 -1
- package/dist/{tool-router-XnWVxPzv.d.mts → tool-router-DK0RJblO.d.mts} +3 -0
- package/dist/{tool-router-Bo8qZbsD.d.ts → tool-router-DsKhRmJm.d.ts} +3 -0
- package/package.json +3 -3
- package/src/adapters/agui-adapter.ts +7 -7
- package/src/adapters/agui-middleware.ts +163 -59
- package/src/adapters/ai-adapter.ts +5 -5
- package/src/adapters/langchain-adapter.ts +5 -5
- package/src/client/react/use-mcp.ts +48 -0
- package/src/client/vue/use-mcp.ts +42 -0
- package/src/shared/meta-tools.ts +73 -15
- package/src/shared/tool-index.ts +85 -12
- package/src/shared/tool-router.ts +8 -7
package/dist/shared/index.d.mts
CHANGED
|
@@ -2,8 +2,8 @@ export { D as Disposable, a as DisposableStore, E as Emitter, b as Event, M as M
|
|
|
2
2
|
export { A as AuthenticationError, C as ConfigurationError, a as ConnectionError, I as InvalidStateError, M as McpError, N as NotConnectedError, R as RpcErrorCode, b as RpcErrorCodes, S as SessionNotFoundError, c as SessionValidationError, T as ToolExecutionError, U as UnauthorizedError, s as sanitizeServerLabel } from '../utils-0qmYrqoa.mjs';
|
|
3
3
|
import { v as ToolInfo } from '../types-CfCoIsWI.mjs';
|
|
4
4
|
export { C as CallToolParams, a as CallToolRequest, b as CallToolResponse, c as ConnectAuthRequiredResponse, d as ConnectErrorResponse, e as ConnectParams, f as ConnectRequest, g as ConnectResponse, h as ConnectResult, i as ConnectSuccessResponse, D as DisconnectParams, j as DisconnectResult, F as FinishAuthParams, k as FinishAuthResult, G as GetPromptParams, L as ListPromptsResult, l as ListResourcesResult, m as ListToolsResponse, n as ListToolsRpcResult, M as McpRpcMethod, o as McpRpcParams, p as McpRpcRequest, q as McpRpcResponse, R as ReadResourceParams, r as RestoreSessionResult, S as SessionInfo, s as SessionListResult, t as SessionParams, T as ToolClient, u as ToolClientProvider, w as TransportType, x as isCallToolSuccess, y as isConnectAuthRequired, z as isConnectError, A as isConnectSuccess, B as isListToolsSuccess } from '../types-CfCoIsWI.mjs';
|
|
5
|
-
import { d as ToolRouter } from '../tool-router-
|
|
6
|
-
export { C as CompactTool, a as CompressionStats, E as EmbedFn, I as IndexedTool, S as SchemaCompressor, T as ToolGroupInfo, b as ToolIndex, c as ToolIndexOptions, e as ToolRouterClientInput, f as ToolRouterOptions, g as ToolRouterStrategy, h as ToolSummary } from '../tool-router-
|
|
5
|
+
import { d as ToolRouter } from '../tool-router-DK0RJblO.mjs';
|
|
6
|
+
export { C as CompactTool, a as CompressionStats, E as EmbedFn, I as IndexedTool, S as SchemaCompressor, T as ToolGroupInfo, b as ToolIndex, c as ToolIndexOptions, e as ToolRouterClientInput, f as ToolRouterOptions, g as ToolRouterStrategy, h as ToolSummary } from '../tool-router-DK0RJblO.mjs';
|
|
7
7
|
import { Tool, CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
8
8
|
|
|
9
9
|
/**
|
package/dist/shared/index.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ export { D as Disposable, a as DisposableStore, E as Emitter, b as Event, M as M
|
|
|
2
2
|
export { A as AuthenticationError, C as ConfigurationError, a as ConnectionError, I as InvalidStateError, M as McpError, N as NotConnectedError, R as RpcErrorCode, b as RpcErrorCodes, S as SessionNotFoundError, c as SessionValidationError, T as ToolExecutionError, U as UnauthorizedError, s as sanitizeServerLabel } from '../utils-0qmYrqoa.js';
|
|
3
3
|
import { v as ToolInfo } from '../types-CfCoIsWI.js';
|
|
4
4
|
export { C as CallToolParams, a as CallToolRequest, b as CallToolResponse, c as ConnectAuthRequiredResponse, d as ConnectErrorResponse, e as ConnectParams, f as ConnectRequest, g as ConnectResponse, h as ConnectResult, i as ConnectSuccessResponse, D as DisconnectParams, j as DisconnectResult, F as FinishAuthParams, k as FinishAuthResult, G as GetPromptParams, L as ListPromptsResult, l as ListResourcesResult, m as ListToolsResponse, n as ListToolsRpcResult, M as McpRpcMethod, o as McpRpcParams, p as McpRpcRequest, q as McpRpcResponse, R as ReadResourceParams, r as RestoreSessionResult, S as SessionInfo, s as SessionListResult, t as SessionParams, T as ToolClient, u as ToolClientProvider, w as TransportType, x as isCallToolSuccess, y as isConnectAuthRequired, z as isConnectError, A as isConnectSuccess, B as isListToolsSuccess } from '../types-CfCoIsWI.js';
|
|
5
|
-
import { d as ToolRouter } from '../tool-router-
|
|
6
|
-
export { C as CompactTool, a as CompressionStats, E as EmbedFn, I as IndexedTool, S as SchemaCompressor, T as ToolGroupInfo, b as ToolIndex, c as ToolIndexOptions, e as ToolRouterClientInput, f as ToolRouterOptions, g as ToolRouterStrategy, h as ToolSummary } from '../tool-router-
|
|
5
|
+
import { d as ToolRouter } from '../tool-router-DsKhRmJm.js';
|
|
6
|
+
export { C as CompactTool, a as CompressionStats, E as EmbedFn, I as IndexedTool, S as SchemaCompressor, T as ToolGroupInfo, b as ToolIndex, c as ToolIndexOptions, e as ToolRouterClientInput, f as ToolRouterOptions, g as ToolRouterStrategy, h as ToolSummary } from '../tool-router-DsKhRmJm.js';
|
|
7
7
|
import { Tool, CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
8
8
|
|
|
9
9
|
/**
|
package/dist/shared/index.js
CHANGED
|
@@ -279,6 +279,7 @@ var ToolIndex = class _ToolIndex {
|
|
|
279
279
|
name: tool.name,
|
|
280
280
|
description: tool.description ?? "",
|
|
281
281
|
serverName: tool.serverName,
|
|
282
|
+
serverId: tool.serverId,
|
|
282
283
|
sessionId: tool.sessionId,
|
|
283
284
|
estimatedTokens
|
|
284
285
|
});
|
|
@@ -341,12 +342,50 @@ var ToolIndex = class _ToolIndex {
|
|
|
341
342
|
*/
|
|
342
343
|
async search(query, topK = 5) {
|
|
343
344
|
if (this.tools.size === 0) return [];
|
|
344
|
-
const queryLower = query.toLowerCase();
|
|
345
|
-
const
|
|
345
|
+
const queryLower = query.toLowerCase().trim();
|
|
346
|
+
const exactMatches = [...this.toolSummaries.values()].filter(
|
|
347
|
+
(summary) => summary.name.toLowerCase() === queryLower
|
|
348
|
+
);
|
|
349
|
+
if (exactMatches.length > 0) {
|
|
350
|
+
return exactMatches.slice(0, topK);
|
|
351
|
+
}
|
|
352
|
+
if (queryLower.startsWith("mcp__") && queryLower.length > 5) {
|
|
353
|
+
const prefixMatches = [...this.toolSummaries.values()].filter((t) => t.name.toLowerCase().startsWith(queryLower)).slice(0, topK);
|
|
354
|
+
if (prefixMatches.length > 0) return prefixMatches;
|
|
355
|
+
}
|
|
356
|
+
const queryTermsRaw = queryLower.split(/\s+/).filter((t) => t.length > 0);
|
|
357
|
+
const requiredTerms = [];
|
|
358
|
+
const optionalTerms = [];
|
|
359
|
+
for (const term of queryTermsRaw) {
|
|
360
|
+
if (term.startsWith("+") && term.length > 1) {
|
|
361
|
+
requiredTerms.push(term.slice(1));
|
|
362
|
+
} else {
|
|
363
|
+
optionalTerms.push(term);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
const allScoringTerms = requiredTerms.length > 0 ? [...requiredTerms, ...optionalTerms] : queryTermsRaw;
|
|
367
|
+
const normalizedQueryText = allScoringTerms.join(" ").trim();
|
|
368
|
+
const queryTokens = this.tokenize(allScoringTerms.join(" "));
|
|
369
|
+
const candidateKeys = /* @__PURE__ */ new Set();
|
|
370
|
+
for (const docKey of this.toolSummaries.keys()) {
|
|
371
|
+
if (requiredTerms.length > 0) {
|
|
372
|
+
const text = this.searchTexts.get(docKey) || "";
|
|
373
|
+
const summary = this.toolSummaries.get(docKey);
|
|
374
|
+
const nameLower = summary.name.toLowerCase();
|
|
375
|
+
const matchesAll = requiredTerms.every(
|
|
376
|
+
(term) => text.includes(term) || nameLower.includes(term)
|
|
377
|
+
);
|
|
378
|
+
if (!matchesAll) continue;
|
|
379
|
+
}
|
|
380
|
+
candidateKeys.add(docKey);
|
|
381
|
+
}
|
|
346
382
|
const keywordScores = /* @__PURE__ */ new Map();
|
|
347
383
|
const k1 = 1.2;
|
|
348
384
|
const b = 0.75;
|
|
349
|
-
for (const
|
|
385
|
+
for (const docKey of candidateKeys) {
|
|
386
|
+
const docTf = this.tfVectors.get(docKey);
|
|
387
|
+
if (!docTf) continue;
|
|
388
|
+
const summary = this.toolSummaries.get(docKey);
|
|
350
389
|
let score = 0;
|
|
351
390
|
const docLen = this.docLengths.get(docKey) ?? 0;
|
|
352
391
|
for (const tok of queryTokens) {
|
|
@@ -357,16 +396,31 @@ var ToolIndex = class _ToolIndex {
|
|
|
357
396
|
const denominator = tfVal + k1 * (1 - b + b * (docLen / this.avgDocLength));
|
|
358
397
|
score += idf * (numerator / denominator);
|
|
359
398
|
}
|
|
360
|
-
|
|
399
|
+
const serverLower = (summary.serverName || summary.serverId || "").toLowerCase();
|
|
400
|
+
const toolLower = summary.name.toLowerCase();
|
|
401
|
+
for (const term of allScoringTerms) {
|
|
402
|
+
if (serverLower.includes(term)) {
|
|
403
|
+
score += 10;
|
|
404
|
+
}
|
|
405
|
+
if (toolLower.includes(term)) {
|
|
406
|
+
score += 5;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (score > 0) {
|
|
410
|
+
keywordScores.set(docKey, score);
|
|
411
|
+
}
|
|
361
412
|
}
|
|
362
413
|
let embeddingScores = null;
|
|
363
414
|
if (this.options.embedFn && this.embeddings.size > 0) {
|
|
364
415
|
try {
|
|
365
|
-
const [queryEmbedding] = await this.options.embedFn([
|
|
416
|
+
const [queryEmbedding] = await this.options.embedFn([normalizedQueryText]);
|
|
366
417
|
if (queryEmbedding) {
|
|
367
418
|
embeddingScores = /* @__PURE__ */ new Map();
|
|
368
|
-
for (const
|
|
369
|
-
|
|
419
|
+
for (const docKey of candidateKeys) {
|
|
420
|
+
const vec = this.embeddings.get(docKey);
|
|
421
|
+
if (vec) {
|
|
422
|
+
embeddingScores.set(docKey, this.cosineSimilarity(queryEmbedding, vec));
|
|
423
|
+
}
|
|
370
424
|
}
|
|
371
425
|
}
|
|
372
426
|
} catch {
|
|
@@ -374,7 +428,7 @@ var ToolIndex = class _ToolIndex {
|
|
|
374
428
|
}
|
|
375
429
|
const kw = this.options.keywordWeight;
|
|
376
430
|
const finalScores = [];
|
|
377
|
-
for (const docKey of
|
|
431
|
+
for (const docKey of candidateKeys) {
|
|
378
432
|
const kwScore = keywordScores.get(docKey) ?? 0;
|
|
379
433
|
const embScore = embeddingScores?.get(docKey) ?? 0;
|
|
380
434
|
const score = embeddingScores ? kw * kwScore + (1 - kw) * embScore : kwScore;
|
|
@@ -432,7 +486,7 @@ var ToolIndex = class _ToolIndex {
|
|
|
432
486
|
getTool(name, namespace) {
|
|
433
487
|
const list = this.tools.get(name) ?? [];
|
|
434
488
|
if (!namespace) return list;
|
|
435
|
-
return list.filter((t) => t.sessionId === namespace || t.
|
|
489
|
+
return list.filter((t) => t.sessionId === namespace || t.serverId === namespace);
|
|
436
490
|
}
|
|
437
491
|
/** All indexed tool names. */
|
|
438
492
|
getToolNames() {
|
|
@@ -492,7 +546,7 @@ var ToolIndex = class _ToolIndex {
|
|
|
492
546
|
return parts.join(" ");
|
|
493
547
|
}
|
|
494
548
|
getDocumentKey(tool) {
|
|
495
|
-
return `${tool.sessionId}::${tool.
|
|
549
|
+
return `${tool.sessionId}::${tool.serverId}::${tool.name}`;
|
|
496
550
|
}
|
|
497
551
|
/** Simple whitespace + camelCase + snake_case tokenizer. */
|
|
498
552
|
tokenize(text) {
|
|
@@ -578,13 +632,13 @@ var SchemaCompressor = class _SchemaCompressor {
|
|
|
578
632
|
function createSearchToolDefinition() {
|
|
579
633
|
return {
|
|
580
634
|
name: "mcp_search_tool_bm25",
|
|
581
|
-
description: 'Search the catalog of available tools
|
|
635
|
+
description: 'Search the catalog of available tools. Returns tool names, descriptions, and server info. Use this FIRST to find relevant tools before calling them.\n\nQuery forms:\n- "select:Read,Edit,Grep" \u2014 fetch these exact tools by name\n- "notebook jupyter" \u2014 keyword search, up to limit best matches\n- "+slack send" \u2014 require "slack" in the name, rank by remaining terms',
|
|
582
636
|
inputSchema: {
|
|
583
637
|
type: "object",
|
|
584
638
|
properties: {
|
|
585
639
|
query: {
|
|
586
640
|
type: "string",
|
|
587
|
-
description: "
|
|
641
|
+
description: 'Query to find tools. Use "select:<tool_name>" for direct selection, or keywords to search. Prefix keywords with + to require them.'
|
|
588
642
|
},
|
|
589
643
|
limit: {
|
|
590
644
|
type: "number",
|
|
@@ -618,7 +672,7 @@ function createRegexSearchToolDefinition() {
|
|
|
618
672
|
function createGetSchemaToolDefinition() {
|
|
619
673
|
return {
|
|
620
674
|
name: "mcp_get_tool_schema",
|
|
621
|
-
description: "Get the full input schema (parameters) for a specific tool. Call this after mcp_search_tool_bm25 to get the parameter details needed to call a tool correctly.",
|
|
675
|
+
description: "Get the full input schema (parameters) for a specific tool. Call this after mcp_search_tool_bm25 to get the parameter details needed to call a tool correctly. Do NOT call the discovered tool directly; after reading the schema, call mcp_execute_tool.",
|
|
622
676
|
inputSchema: {
|
|
623
677
|
type: "object",
|
|
624
678
|
properties: {
|
|
@@ -626,9 +680,9 @@ function createGetSchemaToolDefinition() {
|
|
|
626
680
|
type: "string",
|
|
627
681
|
description: "The exact tool name returned by mcp_search_tool_bm25."
|
|
628
682
|
},
|
|
629
|
-
|
|
683
|
+
serverId: {
|
|
630
684
|
type: "string",
|
|
631
|
-
description: "Optional: The server
|
|
685
|
+
description: "Optional: The server ID provided in mcp_search_tool_bm25. Required if multiple tools have the same name."
|
|
632
686
|
}
|
|
633
687
|
},
|
|
634
688
|
required: ["toolName"]
|
|
@@ -646,9 +700,9 @@ function createExecuteToolDefinition() {
|
|
|
646
700
|
type: "string",
|
|
647
701
|
description: "The exact tool name from mcp_search_tool_bm25 results."
|
|
648
702
|
},
|
|
649
|
-
|
|
703
|
+
serverId: {
|
|
650
704
|
type: "string",
|
|
651
|
-
description: "Optional: The server
|
|
705
|
+
description: "Optional: The server ID provided in mcp_search_tool_bm25. Required if multiple tools have the same name."
|
|
652
706
|
},
|
|
653
707
|
args: {
|
|
654
708
|
type: "object",
|
|
@@ -678,9 +732,43 @@ async function executeMetaTool(toolName, args, router, callToolFn) {
|
|
|
678
732
|
case "mcp_search_tool_bm25": {
|
|
679
733
|
const query = String(args.query ?? "");
|
|
680
734
|
const limit = Math.min(Number(args.limit) || 5, 20);
|
|
735
|
+
const selectMatch = query.match(/^select:(.+)$/i);
|
|
736
|
+
if (selectMatch) {
|
|
737
|
+
const requested = selectMatch[1].split(",").map((s) => s.trim()).filter(Boolean);
|
|
738
|
+
const found = [];
|
|
739
|
+
const errors = [];
|
|
740
|
+
for (const requestedToolName of requested) {
|
|
741
|
+
const { tool, error } = resolveToolSchema(requestedToolName);
|
|
742
|
+
if (error) {
|
|
743
|
+
const errorMsg = error.content[0]?.type === "text" ? error.content[0].text : "Unknown error";
|
|
744
|
+
errors.push(`- **${requestedToolName}**: ${errorMsg}`);
|
|
745
|
+
} else if (tool) {
|
|
746
|
+
found.push(tool);
|
|
747
|
+
} else {
|
|
748
|
+
errors.push(`- **${requestedToolName}**: Tool not found. Try searching with mcp_search_tool_bm25.`);
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
const lines = [];
|
|
752
|
+
if (found.length > 0) {
|
|
753
|
+
lines.push(...found.map(
|
|
754
|
+
(t, i) => `${i + 1}. **${t.name}** (server: ${t.serverName}, serverId: ${t.serverId})
|
|
755
|
+
${t.description}`
|
|
756
|
+
));
|
|
757
|
+
}
|
|
758
|
+
if (errors.length > 0) {
|
|
759
|
+
if (lines.length > 0) lines.push("");
|
|
760
|
+
lines.push("Errors resolving some tools:");
|
|
761
|
+
lines.push(...errors);
|
|
762
|
+
}
|
|
763
|
+
const text2 = lines.length > 0 ? lines.join("\n") : `No tools found matching select query: ${requested.join(", ")}`;
|
|
764
|
+
return {
|
|
765
|
+
content: [{ type: "text", text: text2 }],
|
|
766
|
+
isError: found.length === 0
|
|
767
|
+
};
|
|
768
|
+
}
|
|
681
769
|
const results = await router.searchTools(query, limit);
|
|
682
770
|
const text = results.length === 0 ? "No tools found matching your query. Try different keywords." : results.map(
|
|
683
|
-
(t, i) => `${i + 1}. **${t.name}** (server: ${t.serverName})
|
|
771
|
+
(t, i) => `${i + 1}. **${t.name}** (server: ${t.serverName}, serverId: ${t.serverId})
|
|
684
772
|
${t.description}
|
|
685
773
|
Estimated tokens: ${t.estimatedTokens}`
|
|
686
774
|
).join("\n");
|
|
@@ -694,7 +782,7 @@ async function executeMetaTool(toolName, args, router, callToolFn) {
|
|
|
694
782
|
const limit = Math.min(Number(args.limit) || 5, 20);
|
|
695
783
|
const results = await router.searchToolsRegex(pattern, limit);
|
|
696
784
|
const text = results.length === 0 ? "No tools matched your regex pattern. Try a broader pattern." : results.map(
|
|
697
|
-
(t, i) => `${i + 1}. **${t.name}** (server: ${t.serverName})
|
|
785
|
+
(t, i) => `${i + 1}. **${t.name}** (server: ${t.serverName}, serverId: ${t.serverId})
|
|
698
786
|
${t.description}
|
|
699
787
|
Estimated tokens: ${t.estimatedTokens}`
|
|
700
788
|
).join("\n");
|
|
@@ -705,7 +793,7 @@ async function executeMetaTool(toolName, args, router, callToolFn) {
|
|
|
705
793
|
}
|
|
706
794
|
case "mcp_get_tool_schema": {
|
|
707
795
|
const name = String(args.toolName ?? "");
|
|
708
|
-
const namespace = String(args.
|
|
796
|
+
const namespace = String(args.serverId ?? "") || void 0;
|
|
709
797
|
const { tool, error } = resolveToolSchema(name, namespace);
|
|
710
798
|
if (error) {
|
|
711
799
|
return error;
|
|
@@ -724,7 +812,13 @@ async function executeMetaTool(toolName, args, router, callToolFn) {
|
|
|
724
812
|
const schema = {
|
|
725
813
|
name: tool.name,
|
|
726
814
|
description: tool.description,
|
|
727
|
-
inputSchema: tool.inputSchema
|
|
815
|
+
inputSchema: tool.inputSchema,
|
|
816
|
+
executionInstructions: {
|
|
817
|
+
nextTool: "mcp_execute_tool",
|
|
818
|
+
toolName: tool.name,
|
|
819
|
+
serverId: tool.serverId,
|
|
820
|
+
note: "Do not call this discovered tool directly unless it was explicitly registered as a runtime tool. Execute it via mcp_execute_tool and pass these parameters inside args."
|
|
821
|
+
}
|
|
728
822
|
};
|
|
729
823
|
return {
|
|
730
824
|
content: [{ type: "text", text: JSON.stringify(schema, null, 2) }],
|
|
@@ -733,7 +827,7 @@ async function executeMetaTool(toolName, args, router, callToolFn) {
|
|
|
733
827
|
}
|
|
734
828
|
case "mcp_execute_tool": {
|
|
735
829
|
const targetToolName = String(args.toolName ?? "");
|
|
736
|
-
const namespace = String(args.
|
|
830
|
+
const namespace = String(args.serverId ?? "") || void 0;
|
|
737
831
|
const toolArgs = args.args ?? {};
|
|
738
832
|
if (!targetToolName) {
|
|
739
833
|
return {
|
|
@@ -882,9 +976,9 @@ var ToolRouter = class {
|
|
|
882
976
|
const matches = this.index.getTool(toolName, namespace);
|
|
883
977
|
if (matches.length === 0) return void 0;
|
|
884
978
|
if (matches.length > 1) {
|
|
885
|
-
const servers = matches.map((m) => m.
|
|
979
|
+
const servers = matches.map((m) => m.serverId).join(", ");
|
|
886
980
|
throw new Error(
|
|
887
|
-
`Tool "${toolName}" is provided by multiple servers: [${servers}]. Please specify the desired "
|
|
981
|
+
`Tool "${toolName}" is provided by multiple servers: [${servers}]. Please specify the desired "serverId" as a namespace.`
|
|
888
982
|
);
|
|
889
983
|
}
|
|
890
984
|
return matches[0];
|
|
@@ -995,6 +1089,7 @@ var ToolRouter = class {
|
|
|
995
1089
|
for (const tool of tools) {
|
|
996
1090
|
result.push({
|
|
997
1091
|
...tool,
|
|
1092
|
+
serverId,
|
|
998
1093
|
serverName,
|
|
999
1094
|
sessionId
|
|
1000
1095
|
});
|
|
@@ -1028,16 +1123,16 @@ var ToolRouter = class {
|
|
|
1028
1123
|
} else {
|
|
1029
1124
|
const serverTools = /* @__PURE__ */ new Map();
|
|
1030
1125
|
for (const tool of this.allTools) {
|
|
1031
|
-
const group = tool.
|
|
1126
|
+
const group = tool.serverId;
|
|
1032
1127
|
if (!serverTools.has(group)) {
|
|
1033
1128
|
serverTools.set(group, []);
|
|
1034
1129
|
}
|
|
1035
1130
|
serverTools.get(group).push(tool.name);
|
|
1036
1131
|
}
|
|
1037
|
-
for (const [
|
|
1038
|
-
this.groupsMap.set(
|
|
1132
|
+
for (const [serverId, tools] of serverTools) {
|
|
1133
|
+
this.groupsMap.set(serverId, {
|
|
1039
1134
|
tools,
|
|
1040
|
-
active: this.activeGroups.size === 0 || this.activeGroups.has(
|
|
1135
|
+
active: this.activeGroups.size === 0 || this.activeGroups.has(serverId)
|
|
1041
1136
|
});
|
|
1042
1137
|
}
|
|
1043
1138
|
}
|