@agentdevjs/mcp 0.1.0
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.
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// src/feature/templates/mcp-tool.render.ts
|
|
2
|
+
function escapeHtml(text) {
|
|
3
|
+
const str = String(text);
|
|
4
|
+
const map = {
|
|
5
|
+
"&": "&",
|
|
6
|
+
"<": "<",
|
|
7
|
+
">": ">",
|
|
8
|
+
'"': """,
|
|
9
|
+
"'": "'"
|
|
10
|
+
};
|
|
11
|
+
return str.replace(/[&<>"']/g, (m) => map[m]);
|
|
12
|
+
}
|
|
13
|
+
function formatError(data) {
|
|
14
|
+
const text = typeof data === "object" ? JSON.stringify(data, null, 2) : String(data);
|
|
15
|
+
return `<div class="tool-error">
|
|
16
|
+
<svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z"/></svg>
|
|
17
|
+
<span>${escapeHtml(text)}</span>
|
|
18
|
+
</div>`;
|
|
19
|
+
}
|
|
20
|
+
function renderJsonHighlight(data) {
|
|
21
|
+
const displayData = typeof data === "object" ? JSON.stringify(data, null, 2) : String(data);
|
|
22
|
+
const lines = displayData.split("\n");
|
|
23
|
+
return '<div class="code-read-container">' + lines.map((line, i) => {
|
|
24
|
+
let highlighted;
|
|
25
|
+
try {
|
|
26
|
+
highlighted = hljs.highlight(line, { language: "json" }).value;
|
|
27
|
+
} catch (e) {
|
|
28
|
+
highlighted = escapeHtml(line);
|
|
29
|
+
}
|
|
30
|
+
return '<div class="code-read-line"><span class="code-read-line-num">' + (i + 1) + '</span><span class="code-read-content">' + highlighted + "</span></div>";
|
|
31
|
+
}).join("") + "</div>";
|
|
32
|
+
}
|
|
33
|
+
var mcp_tool_render_default = {
|
|
34
|
+
call: (args) => {
|
|
35
|
+
return `<div class="bash-command">MCP Tool Call</div>`;
|
|
36
|
+
},
|
|
37
|
+
result: (data, success) => {
|
|
38
|
+
if (!success) return formatError(data);
|
|
39
|
+
if (typeof data === "object") {
|
|
40
|
+
return renderJsonHighlight(data);
|
|
41
|
+
}
|
|
42
|
+
return `<pre class="bash-output">${escapeHtml(String(data))}</pre>`;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
export {
|
|
46
|
+
mcp_tool_render_default as default
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=mcp-tool.render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/feature/templates/mcp-tool.render.ts"],"sourcesContent":["/**\n * MCP 工具渲染模板\n */\n\nimport type { InlineRenderTemplate } from '@agentdevjs/core';\n\n/**\n * HTML 转义辅助函数\n */\nfunction escapeHtml(text: any): string {\n const str = String(text);\n const map: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n };\n return str.replace(/[&<>\"']/g, m => map[m]);\n}\n\n/**\n * 格式化错误\n */\nfunction formatError(data: any): string {\n const text = typeof data === 'object' ? JSON.stringify(data, null, 2) : String(data);\n return `<div class=\"tool-error\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>\n <span>${escapeHtml(text)}</span>\n </div>`;\n}\n\n/**\n * 使用 hljs 将 JSON 渲染为带行号的语法高亮\n */\nfunction renderJsonHighlight(data: any): string {\n const displayData = typeof data === 'object' ? JSON.stringify(data, null, 2) : String(data);\n const lines = displayData.split('\\n');\n return '<div class=\"code-read-container\">' + lines.map((line: string, i: number) => {\n let highlighted: string;\n try { highlighted = (hljs as any).highlight(line, { language: 'json' }).value; }\n catch (e) { highlighted = escapeHtml(line); }\n return '<div class=\"code-read-line\"><span class=\"code-read-line-num\">' + (i + 1) + '</span><span class=\"code-read-content\">' + highlighted + '</span></div>';\n }).join('') + '</div>';\n}\n\ndeclare const hljs: any;\n\n/**\n * MCP 工具调用渲染模板\n */\nexport default {\n call: (args: any) => {\n return `<div class=\"bash-command\">MCP Tool Call</div>`;\n },\n result: (data: any, success?: boolean) => {\n if (!success) return formatError(data);\n if (typeof data === 'object') {\n return renderJsonHighlight(data);\n }\n return `<pre class=\"bash-output\">${escapeHtml(String(data))}</pre>`;\n }\n} as const satisfies InlineRenderTemplate;\n"],"mappings":";AASA,SAAS,WAAW,MAAmB;AACrC,QAAM,MAAM,OAAO,IAAI;AACvB,QAAM,MAA8B;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACA,SAAO,IAAI,QAAQ,YAAY,OAAK,IAAI,CAAC,CAAC;AAC5C;AAKA,SAAS,YAAY,MAAmB;AACtC,QAAM,OAAO,OAAO,SAAS,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,OAAO,IAAI;AACnF,SAAO;AAAA;AAAA,YAEG,WAAW,IAAI,CAAC;AAAA;AAE5B;AAKA,SAAS,oBAAoB,MAAmB;AAC9C,QAAM,cAAc,OAAO,SAAS,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,OAAO,IAAI;AAC1F,QAAM,QAAQ,YAAY,MAAM,IAAI;AACpC,SAAO,sCAAsC,MAAM,IAAI,CAAC,MAAc,MAAc;AAClF,QAAI;AACJ,QAAI;AAAE,oBAAe,KAAa,UAAU,MAAM,EAAE,UAAU,OAAO,CAAC,EAAE;AAAA,IAAO,SACxE,GAAG;AAAE,oBAAc,WAAW,IAAI;AAAA,IAAG;AAC5C,WAAO,mEAAmE,IAAI,KAAK,4CAA4C,cAAc;AAAA,EAC/I,CAAC,EAAE,KAAK,EAAE,IAAI;AAChB;AAOA,IAAO,0BAAQ;AAAA,EACb,MAAM,CAAC,SAAc;AACnB,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,CAAC,MAAW,YAAsB;AACxC,QAAI,CAAC,QAAS,QAAO,YAAY,IAAI;AACrC,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,oBAAoB,IAAI;AAAA,IACjC;AACA,WAAO,4BAA4B,WAAW,OAAO,IAAI,CAAC,CAAC;AAAA,EAC7D;AACF;","names":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/client';
|
|
2
|
+
import { MCPServerConfig, Tool, ToolExecutionContext, ToolResultValue, MCPConfig, AgentFeature, PackageInfo, FeatureManifestDefinition, FeatureInitContext, ContextInjector } from '@agentdevjs/core';
|
|
3
|
+
export { MCPConfig, MCPHTTPConfig, MCPSSEConfig, MCPServerConfig, MCPSstdioConfig } from '@agentdevjs/core';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* MCP 集成类型定义
|
|
7
|
+
*
|
|
8
|
+
* 契约类型(服务器配置形状)的权威定义在 @agentdevjs/core(core/mcp-contract),
|
|
9
|
+
* 此处 re-export 保持旧导入路径兼容;连接管理与调用的运行时类型定义在本包。
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* MCP 连接状态
|
|
14
|
+
*/
|
|
15
|
+
declare const enum MCPConnectionState {
|
|
16
|
+
/** 未连接 */
|
|
17
|
+
Disconnected = "disconnected",
|
|
18
|
+
/** 连接中 */
|
|
19
|
+
Connecting = "connecting",
|
|
20
|
+
/** 已连接 */
|
|
21
|
+
Connected = "connected",
|
|
22
|
+
/** 连接错误 */
|
|
23
|
+
Error = "error"
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* MCP 连接信息
|
|
27
|
+
*/
|
|
28
|
+
interface MCPConnectionInfo {
|
|
29
|
+
/** 服务器名称 */
|
|
30
|
+
name: string;
|
|
31
|
+
/** 连接状态 */
|
|
32
|
+
state: MCPConnectionState;
|
|
33
|
+
/** 连接时间 */
|
|
34
|
+
connectedAt?: number;
|
|
35
|
+
/** 最后错误 */
|
|
36
|
+
lastError?: string;
|
|
37
|
+
/** 工具数量 */
|
|
38
|
+
toolCount: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* MCP 工具调用结果
|
|
42
|
+
*/
|
|
43
|
+
interface MCPToolResult {
|
|
44
|
+
/** 是否成功 */
|
|
45
|
+
success: boolean;
|
|
46
|
+
/** 结果内容 */
|
|
47
|
+
content?: string;
|
|
48
|
+
/** 结构化数据 (如果可用) */
|
|
49
|
+
structuredContent?: any;
|
|
50
|
+
/** 错误信息 */
|
|
51
|
+
error?: string;
|
|
52
|
+
/** MCP 服务器名称 */
|
|
53
|
+
server: string;
|
|
54
|
+
/** 调用耗时 (毫秒) */
|
|
55
|
+
duration: number;
|
|
56
|
+
/** 图像数据 (如果有) */
|
|
57
|
+
images?: Array<{
|
|
58
|
+
data: string;
|
|
59
|
+
mimeType: string;
|
|
60
|
+
}>;
|
|
61
|
+
/** 资源数据 (如果有) */
|
|
62
|
+
resources?: Array<{
|
|
63
|
+
uri: string;
|
|
64
|
+
mimeType: string;
|
|
65
|
+
text?: string;
|
|
66
|
+
}>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* MCP 统计信息
|
|
70
|
+
*/
|
|
71
|
+
interface MCPStatistics {
|
|
72
|
+
/** 总调用次数 */
|
|
73
|
+
totalCalls: number;
|
|
74
|
+
/** 成功调用次数 */
|
|
75
|
+
successfulCalls: number;
|
|
76
|
+
/** 失败调用次数 */
|
|
77
|
+
failedCalls: number;
|
|
78
|
+
/** 平均耗时 (毫秒) */
|
|
79
|
+
averageDuration: number;
|
|
80
|
+
/** 按服务器统计 */
|
|
81
|
+
byServer: Record<string, {
|
|
82
|
+
totalCalls: number;
|
|
83
|
+
successfulCalls: number;
|
|
84
|
+
failedCalls: number;
|
|
85
|
+
averageDuration: number;
|
|
86
|
+
}>;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* MCP 客户端配置
|
|
90
|
+
*/
|
|
91
|
+
interface MCPClientConfig {
|
|
92
|
+
/** 配置文件路径 */
|
|
93
|
+
configPath?: string;
|
|
94
|
+
/** 是否自动重连 */
|
|
95
|
+
autoReconnect?: boolean;
|
|
96
|
+
/** 重连间隔 (毫秒) */
|
|
97
|
+
reconnectInterval?: number;
|
|
98
|
+
/** 最大重连次数 */
|
|
99
|
+
maxReconnectAttempts?: number;
|
|
100
|
+
/** 日志级别 */
|
|
101
|
+
logLevel?: 'silent' | 'error' | 'warn' | 'info' | 'debug';
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
declare class MCPConnectionManager {
|
|
105
|
+
private connections;
|
|
106
|
+
private reconnectTimers;
|
|
107
|
+
private readonly logger;
|
|
108
|
+
/**
|
|
109
|
+
* 连接到 MCP 服务器
|
|
110
|
+
*/
|
|
111
|
+
connectServer(name: string, config: MCPServerConfig): Promise<Client | any>;
|
|
112
|
+
/**
|
|
113
|
+
* 连接到 stdio MCP 服务器
|
|
114
|
+
*/
|
|
115
|
+
private connectStdio;
|
|
116
|
+
/**
|
|
117
|
+
* 连接到 HTTP MCP 服务器
|
|
118
|
+
*/
|
|
119
|
+
private connectSSE;
|
|
120
|
+
/**
|
|
121
|
+
* 连接到 HTTP MCP 服务器
|
|
122
|
+
*/
|
|
123
|
+
private connectHTTP;
|
|
124
|
+
/**
|
|
125
|
+
* 断开服务器连接
|
|
126
|
+
*/
|
|
127
|
+
disconnectServer(name: string): Promise<void>;
|
|
128
|
+
/**
|
|
129
|
+
* 断开所有连接
|
|
130
|
+
*/
|
|
131
|
+
disconnectAll(): Promise<void>;
|
|
132
|
+
/**
|
|
133
|
+
* 列出服务器的所有工具
|
|
134
|
+
*/
|
|
135
|
+
listTools(name: string): Promise<Array<{
|
|
136
|
+
name: string;
|
|
137
|
+
description?: string;
|
|
138
|
+
inputSchema?: any;
|
|
139
|
+
}>>;
|
|
140
|
+
callTool(name: string, serverName: string, args: Record<string, unknown>): Promise<{
|
|
141
|
+
content: any[];
|
|
142
|
+
isError?: boolean;
|
|
143
|
+
}>;
|
|
144
|
+
getConnectionInfo(name: string): MCPConnectionInfo | undefined;
|
|
145
|
+
/**
|
|
146
|
+
* 获取所有连接信息
|
|
147
|
+
*/
|
|
148
|
+
getAllConnections(): MCPConnectionInfo[];
|
|
149
|
+
/**
|
|
150
|
+
* 检查连接状态
|
|
151
|
+
*/
|
|
152
|
+
isConnected(name: string): boolean;
|
|
153
|
+
/**
|
|
154
|
+
* 获取服务器实例
|
|
155
|
+
*/
|
|
156
|
+
getServer(name: string): Client | any | undefined;
|
|
157
|
+
/**
|
|
158
|
+
* 安排重连
|
|
159
|
+
*/
|
|
160
|
+
private scheduleReconnect;
|
|
161
|
+
/**
|
|
162
|
+
* 日志输出
|
|
163
|
+
*/
|
|
164
|
+
private log;
|
|
165
|
+
private handleProcessOutput;
|
|
166
|
+
private handleDirectResponse;
|
|
167
|
+
private sendDirectRequest;
|
|
168
|
+
private normalizeToolCallResponse;
|
|
169
|
+
private rejectAllPendingRequests;
|
|
170
|
+
private stopProcess;
|
|
171
|
+
dispose(): Promise<void>;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Gateway discovery client — discovers Claw-hosted MCP servers
|
|
176
|
+
* and converts them into standard MCPConfig entries for transparent mounting.
|
|
177
|
+
*
|
|
178
|
+
* When an agent runs under Claw, PROTOCLAW_SERVER_ORIGIN is set in the env.
|
|
179
|
+
* This module fetches the gateway discovery endpoint, filters to connected
|
|
180
|
+
* servers, and returns MCPConfig entries pointing to the gateway proxy URLs.
|
|
181
|
+
*/
|
|
182
|
+
|
|
183
|
+
interface GatewayServerInfo {
|
|
184
|
+
id: string;
|
|
185
|
+
transport: string;
|
|
186
|
+
status: string;
|
|
187
|
+
toolCount: number;
|
|
188
|
+
url: string;
|
|
189
|
+
}
|
|
190
|
+
interface GatewayDiscoveryResult {
|
|
191
|
+
origin: string;
|
|
192
|
+
servers: GatewayServerInfo[];
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Discover available gateway servers from Claw's MCP Gateway.
|
|
196
|
+
* Returns empty servers array if gateway is unavailable.
|
|
197
|
+
* Never throws — failures are silently swallowed.
|
|
198
|
+
*/
|
|
199
|
+
declare function discoverGatewayServers(origin?: string, timeoutMs?: number): Promise<GatewayDiscoveryResult>;
|
|
200
|
+
/**
|
|
201
|
+
* Convert discovered gateway servers into MCPConfig server entries.
|
|
202
|
+
* Each gateway server becomes an HTTP transport pointing to the gateway proxy URL.
|
|
203
|
+
*/
|
|
204
|
+
declare function gatewayServersToConfig(discovery: GatewayDiscoveryResult, excludeServers?: string[]): Record<string, MCPServerConfig>;
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* MCP Tool Adapter - 适配器模式实现
|
|
208
|
+
*
|
|
209
|
+
* 将 MCP 工具适配为现有 Tool 接口,保持架构一致性
|
|
210
|
+
*/
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* 注册工具的简化接口
|
|
214
|
+
* 用于适配器包装
|
|
215
|
+
*/
|
|
216
|
+
interface RegisteredToolLike {
|
|
217
|
+
name: string;
|
|
218
|
+
description?: string;
|
|
219
|
+
inputSchema?: any;
|
|
220
|
+
outputSchema?: any;
|
|
221
|
+
annotations?: any;
|
|
222
|
+
handler?: (args: any, context?: any) => Promise<any> | any;
|
|
223
|
+
enabled?: boolean;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* MCP 工具适配器配置
|
|
227
|
+
*/
|
|
228
|
+
interface MCPToolAdapterConfig {
|
|
229
|
+
/** MCP 服务器名称 */
|
|
230
|
+
serverName: string;
|
|
231
|
+
/** 是否为只读工具 */
|
|
232
|
+
readOnly?: boolean;
|
|
233
|
+
/** 渲染模板覆盖 */
|
|
234
|
+
render?: {
|
|
235
|
+
call?: string;
|
|
236
|
+
result?: string;
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* MCP 工具适配器
|
|
241
|
+
*
|
|
242
|
+
* 将 MCP RegisteredTool 适配为 Agent 的 Tool 接口
|
|
243
|
+
* 负责格式转换和生命周期管理
|
|
244
|
+
*/
|
|
245
|
+
declare class MCPToolAdapter implements Tool {
|
|
246
|
+
private registeredTool;
|
|
247
|
+
private config;
|
|
248
|
+
readonly name: string;
|
|
249
|
+
readonly description: string;
|
|
250
|
+
readonly parameters?: Record<string, unknown>;
|
|
251
|
+
readonly render?: {
|
|
252
|
+
call?: string;
|
|
253
|
+
result?: string;
|
|
254
|
+
};
|
|
255
|
+
constructor(registeredTool: RegisteredToolLike, config: MCPToolAdapterConfig);
|
|
256
|
+
/**
|
|
257
|
+
* 执行 MCP 工具
|
|
258
|
+
*/
|
|
259
|
+
execute(args: Record<string, unknown>, context?: ToolExecutionContext): Promise<ToolResultValue>;
|
|
260
|
+
/**
|
|
261
|
+
* 格式化 MCP 工具结果
|
|
262
|
+
*/
|
|
263
|
+
private formatResult;
|
|
264
|
+
/**
|
|
265
|
+
* 格式化错误
|
|
266
|
+
*/
|
|
267
|
+
private formatError;
|
|
268
|
+
/**
|
|
269
|
+
* 从 RegisteredToolLike 提取参数定义
|
|
270
|
+
*
|
|
271
|
+
* MCP 工具的 inputSchema 已经是 JSON Schema 格式
|
|
272
|
+
* 直接返回,不需要转换
|
|
273
|
+
*/
|
|
274
|
+
private extractParameters;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* 批量创建 MCP 工具适配器
|
|
278
|
+
*/
|
|
279
|
+
declare function createMCPToolAdapters(registeredTools: RegisteredToolLike[], serverName: string, config?: Omit<MCPToolAdapterConfig, 'serverName'>): Tool[];
|
|
280
|
+
|
|
281
|
+
interface MCPDiscoveredTool {
|
|
282
|
+
name: string;
|
|
283
|
+
description?: string;
|
|
284
|
+
inputSchema?: any;
|
|
285
|
+
}
|
|
286
|
+
interface MCPToolCreationOptions {
|
|
287
|
+
name?: string;
|
|
288
|
+
description?: string;
|
|
289
|
+
render?: MCPToolAdapterConfig['render'];
|
|
290
|
+
transformArgs?: (args: Record<string, unknown>, context?: any) => Record<string, unknown>;
|
|
291
|
+
}
|
|
292
|
+
interface MCPToolDiscoveryOptions {
|
|
293
|
+
filter?: (tool: MCPDiscoveredTool) => boolean;
|
|
294
|
+
mapName?: (tool: MCPDiscoveredTool) => string;
|
|
295
|
+
render?: MCPToolAdapterConfig['render'];
|
|
296
|
+
transformArgs?: MCPToolCreationOptions['transformArgs'];
|
|
297
|
+
}
|
|
298
|
+
interface MCPDiscoveredToolSet {
|
|
299
|
+
client: MCPClient;
|
|
300
|
+
tools: Tool[];
|
|
301
|
+
}
|
|
302
|
+
declare function createDefaultMCPToolName(serverId: string, toolName: string): string;
|
|
303
|
+
declare class MCPClient {
|
|
304
|
+
readonly serverId: string;
|
|
305
|
+
private readonly config;
|
|
306
|
+
private readonly manager;
|
|
307
|
+
private connected;
|
|
308
|
+
constructor(serverId: string, config: MCPServerConfig, manager?: MCPConnectionManager);
|
|
309
|
+
connect(): Promise<void>;
|
|
310
|
+
listTools(): Promise<MCPDiscoveredTool[]>;
|
|
311
|
+
callTool(name: string, args: Record<string, unknown>): Promise<any>;
|
|
312
|
+
getConnectionManager(): MCPConnectionManager;
|
|
313
|
+
dispose(): Promise<void>;
|
|
314
|
+
}
|
|
315
|
+
declare function createMCPTool(client: MCPClient, tool: MCPDiscoveredTool, options?: MCPToolCreationOptions): Tool;
|
|
316
|
+
declare function createMCPToolsFromClient(client: MCPClient, options?: MCPToolDiscoveryOptions): Promise<Tool[]>;
|
|
317
|
+
declare function discoverMCPTools(serverId: string, config: MCPServerConfig, options?: MCPToolDiscoveryOptions, manager?: MCPConnectionManager): Promise<MCPDiscoveredToolSet>;
|
|
318
|
+
|
|
319
|
+
interface LoadAllMCPConfigsOptions {
|
|
320
|
+
loadDefaultDir?: boolean;
|
|
321
|
+
extraConfigFiles?: string[];
|
|
322
|
+
excludeServers?: string[];
|
|
323
|
+
}
|
|
324
|
+
declare function getDefaultMCPConfigDir(rootDir?: string): string;
|
|
325
|
+
declare function loadMCPConfigFromInput(input: string, rootDir?: string): MCPConfig | undefined;
|
|
326
|
+
declare function loadAllMCPConfigs(rootDir?: string, options?: LoadAllMCPConfigsOptions): MCPConfig | undefined;
|
|
327
|
+
|
|
328
|
+
interface MCPToolPatch {
|
|
329
|
+
enabled?: boolean;
|
|
330
|
+
name?: string;
|
|
331
|
+
description?: string;
|
|
332
|
+
render?: MCPToolAdapterConfig['render'];
|
|
333
|
+
transformArgs?: MCPToolCreationOptions['transformArgs'];
|
|
334
|
+
}
|
|
335
|
+
interface MCPToolManagementOptions {
|
|
336
|
+
include?: string[];
|
|
337
|
+
exclude?: string[];
|
|
338
|
+
disable?: string[];
|
|
339
|
+
rename?: Record<string, string>;
|
|
340
|
+
describe?: Record<string, string>;
|
|
341
|
+
render?: MCPToolAdapterConfig['render'];
|
|
342
|
+
toolRender?: Record<string, MCPToolAdapterConfig['render']>;
|
|
343
|
+
mapName?: (tool: MCPDiscoveredTool, client: MCPClient) => string;
|
|
344
|
+
transformArgs?: MCPToolCreationOptions['transformArgs'];
|
|
345
|
+
transform?: (tool: MCPDiscoveredTool, client: MCPClient) => MCPToolPatch | false | null | undefined;
|
|
346
|
+
}
|
|
347
|
+
interface MCPConfigMountOptions {
|
|
348
|
+
manager?: MCPConnectionManager;
|
|
349
|
+
clients?: Map<string, MCPClient>;
|
|
350
|
+
getServerOptions?: (serverId: string, serverConfig: MCPServerConfig) => MCPToolManagementOptions | undefined;
|
|
351
|
+
onError?: (serverId: string, error: unknown) => void;
|
|
352
|
+
}
|
|
353
|
+
interface MCPMountedToolSet {
|
|
354
|
+
client: MCPClient;
|
|
355
|
+
tools: Tool[];
|
|
356
|
+
}
|
|
357
|
+
interface MCPMountedConfigResult {
|
|
358
|
+
tools: Tool[];
|
|
359
|
+
clients: Map<string, MCPClient>;
|
|
360
|
+
}
|
|
361
|
+
declare function createManagedMCPToolsFromClient(client: MCPClient, options?: MCPToolManagementOptions): Promise<Tool[]>;
|
|
362
|
+
declare function discoverManagedMCPTools(serverId: string, config: MCPServerConfig, options?: MCPToolManagementOptions, manager?: MCPConnectionManager): Promise<MCPMountedToolSet>;
|
|
363
|
+
declare function mountMCPToolsFromConfig(config: MCPConfig, options?: MCPConfigMountOptions): Promise<MCPMountedConfigResult>;
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* MCP 工具渲染模板
|
|
367
|
+
*
|
|
368
|
+
* 定义 MCP 工具在 DebugHub 中的显示样式
|
|
369
|
+
*/
|
|
370
|
+
/**
|
|
371
|
+
* MCP 工具渲染模板
|
|
372
|
+
*/
|
|
373
|
+
declare const MCP_RENDER_TEMPLATES: {
|
|
374
|
+
/**
|
|
375
|
+
* MCP 工具调用显示
|
|
376
|
+
*/
|
|
377
|
+
readonly 'mcp-tool': {
|
|
378
|
+
readonly call: (args: any) => string;
|
|
379
|
+
readonly result: (data: any, success?: boolean) => string;
|
|
380
|
+
};
|
|
381
|
+
/**
|
|
382
|
+
* MCP 结果 (简化版)
|
|
383
|
+
*/
|
|
384
|
+
readonly 'mcp-result': {
|
|
385
|
+
readonly call: () => string;
|
|
386
|
+
readonly result: (data: any, success?: boolean) => string;
|
|
387
|
+
};
|
|
388
|
+
};
|
|
389
|
+
/**
|
|
390
|
+
* 获取 MCP 渲染模板
|
|
391
|
+
*/
|
|
392
|
+
declare function getMCPRenderTemplate(toolName: string): string;
|
|
393
|
+
/**
|
|
394
|
+
* 渲染 MCP 工具调用
|
|
395
|
+
*/
|
|
396
|
+
declare function renderMCPToolCall(serverName: string, toolName: string, args: Record<string, any>): string;
|
|
397
|
+
/**
|
|
398
|
+
* 渲染 MCP 工具结果
|
|
399
|
+
*/
|
|
400
|
+
declare function renderMCPToolResult(result: any, success?: boolean): string;
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* MCP Feature - MCP 服务器连接和工具注册
|
|
404
|
+
*
|
|
405
|
+
* 将 MCP 集成从 Agent 核心中解耦,实现可外挂功能
|
|
406
|
+
*
|
|
407
|
+
* @example
|
|
408
|
+
* ```typescript
|
|
409
|
+
* // 自动扫描 .agentdev/mcps/*.json
|
|
410
|
+
* agent.use(new MCPFeature());
|
|
411
|
+
*
|
|
412
|
+
* // 从配置文件加载(默认路径 .agentdev/mcps)
|
|
413
|
+
* agent.use(new MCPFeature('github'));
|
|
414
|
+
*
|
|
415
|
+
* // 从指定路径加载配置
|
|
416
|
+
* agent.use(new MCPFeature('./path/to/mcps/github'));
|
|
417
|
+
*
|
|
418
|
+
* // 直接传入配置对象
|
|
419
|
+
* agent.use(new MCPFeature({ servers: { ... } }));
|
|
420
|
+
* ```
|
|
421
|
+
*/
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* MCP Feature 配置类型
|
|
425
|
+
*/
|
|
426
|
+
type MCPFeatureInput = MCPConfig | string;
|
|
427
|
+
interface MCPFeatureOptions {
|
|
428
|
+
excludeServers?: string[];
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* MCP Feature 实现
|
|
432
|
+
*/
|
|
433
|
+
declare class MCPFeature implements AgentFeature {
|
|
434
|
+
readonly name = "mcp";
|
|
435
|
+
readonly source: string;
|
|
436
|
+
readonly description = "\u8FDE\u63A5 MCP \u670D\u52A1\u5668\u5E76\u628A\u53D1\u73B0\u5230\u7684\u8FDC\u7A0B\u80FD\u529B\u6302\u8F7D\u6210\u6807\u51C6\u5DE5\u5177\u3002";
|
|
437
|
+
private readonly manager;
|
|
438
|
+
private clients;
|
|
439
|
+
private readonly input?;
|
|
440
|
+
private readonly options;
|
|
441
|
+
private config?;
|
|
442
|
+
private mcpContext?;
|
|
443
|
+
/**
|
|
444
|
+
* 缓存包信息
|
|
445
|
+
*/
|
|
446
|
+
private _packageInfo;
|
|
447
|
+
/**
|
|
448
|
+
* 获取包信息(统一打包方案)
|
|
449
|
+
*/
|
|
450
|
+
getPackageInfo(): PackageInfo | null;
|
|
451
|
+
/**
|
|
452
|
+
* 获取模板名称列表(统一打包方案)
|
|
453
|
+
*/
|
|
454
|
+
getTemplateNames(): string[];
|
|
455
|
+
constructor(input?: MCPFeatureInput, options?: MCPFeatureOptions);
|
|
456
|
+
getFeatureManifest(): FeatureManifestDefinition;
|
|
457
|
+
private resolveFeatureConfig;
|
|
458
|
+
private resolveRuntimeConfig;
|
|
459
|
+
/**
|
|
460
|
+
* 获取同步工具(无)
|
|
461
|
+
*/
|
|
462
|
+
getTools(): Tool[];
|
|
463
|
+
/**
|
|
464
|
+
* 获取异步工具(需要连接 MCP 服务器)
|
|
465
|
+
*/
|
|
466
|
+
getAsyncTools(ctx: FeatureInitContext): Promise<Tool[]>;
|
|
467
|
+
/**
|
|
468
|
+
* 声明上下文注入器
|
|
469
|
+
* 为所有 MCP 工具注入 _mcpContext
|
|
470
|
+
*/
|
|
471
|
+
getContextInjectors(): Map<string | RegExp, ContextInjector>;
|
|
472
|
+
/**
|
|
473
|
+
* 清理钩子
|
|
474
|
+
*/
|
|
475
|
+
onDestroy(): Promise<void>;
|
|
476
|
+
/**
|
|
477
|
+
* 设置 MCP 上下文(运行时注入)
|
|
478
|
+
*/
|
|
479
|
+
setMCPContext(context: Record<string, unknown>): void;
|
|
480
|
+
/**
|
|
481
|
+
* 获取连接管理器(供外部使用)
|
|
482
|
+
*/
|
|
483
|
+
getConnectionManager(): MCPConnectionManager | undefined;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
export { type GatewayDiscoveryResult, type GatewayServerInfo, type LoadAllMCPConfigsOptions, MCPClient, type MCPClientConfig, type MCPConfigMountOptions, type MCPConnectionInfo, MCPConnectionManager, MCPConnectionState, type MCPDiscoveredTool, type MCPDiscoveredToolSet, MCPFeature, type MCPFeatureOptions, type MCPMountedConfigResult, type MCPMountedToolSet, type MCPStatistics, MCPToolAdapter, type MCPToolAdapterConfig, type MCPToolCreationOptions, type MCPToolDiscoveryOptions, type MCPToolManagementOptions, type MCPToolPatch, type MCPToolResult, MCP_RENDER_TEMPLATES, createDefaultMCPToolName, createMCPTool, createMCPToolAdapters, createMCPToolsFromClient, createManagedMCPToolsFromClient, discoverGatewayServers, discoverMCPTools, discoverManagedMCPTools, gatewayServersToConfig, getDefaultMCPConfigDir, getMCPRenderTemplate, loadAllMCPConfigs, loadMCPConfigFromInput, mountMCPToolsFromConfig, renderMCPToolCall, renderMCPToolResult };
|