@mcpilotx/intentorch 0.5.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.
- package/LICENSE +201 -0
- package/README.md +545 -0
- package/dist/ai/ai.d.ts +205 -0
- package/dist/ai/ai.js +1200 -0
- package/dist/ai/cloud-intent-engine.d.ts +270 -0
- package/dist/ai/cloud-intent-engine.js +956 -0
- package/dist/ai/command.d.ts +59 -0
- package/dist/ai/command.js +285 -0
- package/dist/ai/config.d.ts +66 -0
- package/dist/ai/config.js +211 -0
- package/dist/ai/enhanced-intent.d.ts +17 -0
- package/dist/ai/enhanced-intent.js +32 -0
- package/dist/ai/index.d.ts +29 -0
- package/dist/ai/index.js +44 -0
- package/dist/ai/intent.d.ts +16 -0
- package/dist/ai/intent.js +30 -0
- package/dist/core/ai-config.d.ts +25 -0
- package/dist/core/ai-config.js +326 -0
- package/dist/core/config-manager.d.ts +36 -0
- package/dist/core/config-manager.js +400 -0
- package/dist/core/config-validator.d.ts +9 -0
- package/dist/core/config-validator.js +184 -0
- package/dist/core/constants.d.ts +34 -0
- package/dist/core/constants.js +37 -0
- package/dist/core/error-ai.d.ts +23 -0
- package/dist/core/error-ai.js +217 -0
- package/dist/core/error-handler.d.ts +197 -0
- package/dist/core/error-handler.js +467 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.js +17 -0
- package/dist/core/logger.d.ts +27 -0
- package/dist/core/logger.js +108 -0
- package/dist/core/performance-monitor.d.ts +74 -0
- package/dist/core/performance-monitor.js +260 -0
- package/dist/core/providers.d.ts +36 -0
- package/dist/core/providers.js +304 -0
- package/dist/core/retry-manager.d.ts +41 -0
- package/dist/core/retry-manager.js +204 -0
- package/dist/core/types.d.ts +155 -0
- package/dist/core/types.js +2 -0
- package/dist/daemon/index.d.ts +10 -0
- package/dist/daemon/index.js +15 -0
- package/dist/daemon/intent-engine.d.ts +22 -0
- package/dist/daemon/intent-engine.js +50 -0
- package/dist/daemon/orchestrator.d.ts +24 -0
- package/dist/daemon/orchestrator.js +100 -0
- package/dist/daemon/pm.d.ts +33 -0
- package/dist/daemon/pm.js +127 -0
- package/dist/daemon/process.d.ts +11 -0
- package/dist/daemon/process.js +49 -0
- package/dist/daemon/server.d.ts +17 -0
- package/dist/daemon/server.js +435 -0
- package/dist/daemon/service.d.ts +36 -0
- package/dist/daemon/service.js +278 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +36 -0
- package/dist/mcp/client.d.ts +51 -0
- package/dist/mcp/client.js +276 -0
- package/dist/mcp/index.d.ts +162 -0
- package/dist/mcp/index.js +199 -0
- package/dist/mcp/tool-registry.d.ts +71 -0
- package/dist/mcp/tool-registry.js +308 -0
- package/dist/mcp/transport.d.ts +83 -0
- package/dist/mcp/transport.js +515 -0
- package/dist/mcp/types.d.ts +136 -0
- package/dist/mcp/types.js +31 -0
- package/dist/runtime/adapter-advanced.d.ts +184 -0
- package/dist/runtime/adapter-advanced.js +160 -0
- package/dist/runtime/adapter.d.ts +9 -0
- package/dist/runtime/adapter.js +2 -0
- package/dist/runtime/detector-advanced.d.ts +59 -0
- package/dist/runtime/detector-advanced.js +487 -0
- package/dist/runtime/detector.d.ts +5 -0
- package/dist/runtime/detector.js +56 -0
- package/dist/runtime/docker-adapter.d.ts +18 -0
- package/dist/runtime/docker-adapter.js +170 -0
- package/dist/runtime/docker.d.ts +17 -0
- package/dist/runtime/docker.js +71 -0
- package/dist/runtime/executable-analyzer.d.ts +56 -0
- package/dist/runtime/executable-analyzer.js +391 -0
- package/dist/runtime/go-adapter.d.ts +19 -0
- package/dist/runtime/go-adapter.js +190 -0
- package/dist/runtime/index.d.ts +9 -0
- package/dist/runtime/index.js +10 -0
- package/dist/runtime/node-adapter.d.ts +10 -0
- package/dist/runtime/node-adapter.js +23 -0
- package/dist/runtime/node.d.ts +20 -0
- package/dist/runtime/node.js +86 -0
- package/dist/runtime/python-adapter.d.ts +11 -0
- package/dist/runtime/python-adapter.js +102 -0
- package/dist/runtime/python.d.ts +17 -0
- package/dist/runtime/python.js +72 -0
- package/dist/runtime/rust-adapter.d.ts +21 -0
- package/dist/runtime/rust-adapter.js +267 -0
- package/dist/sdk.d.ts +500 -0
- package/dist/sdk.js +904 -0
- package/docs/README.ZH_CN.md +545 -0
- package/docs/api.md +888 -0
- package/docs/architecture.md +731 -0
- package/docs/development.md +744 -0
- package/package.json +112 -0
package/docs/api.md
ADDED
|
@@ -0,0 +1,888 @@
|
|
|
1
|
+
# API Reference
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
IntentOrch SDK Core provides a concise and elegant API for MCP (Model Context Protocol) service orchestration. This document details all public APIs of the SDK.
|
|
6
|
+
|
|
7
|
+
## Core Classes
|
|
8
|
+
|
|
9
|
+
### `IntentOrchSDK` (formerly `MCPilotSDK`)
|
|
10
|
+
|
|
11
|
+
The main SDK class that provides all functionality.
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { IntentOrchSDK } from '@mcpilotx/intentorch';
|
|
15
|
+
|
|
16
|
+
const sdk = new IntentOrchSDK(options);
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Note:** For backward compatibility, `MCPilotSDK` is still available as an alias.
|
|
20
|
+
|
|
21
|
+
#### Constructor Options
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
interface SDKOptions {
|
|
25
|
+
// Configuration file path, defaults to ~/.mcpilot/config.json
|
|
26
|
+
configPath?: string;
|
|
27
|
+
|
|
28
|
+
// Whether to auto-initialize the SDK, defaults to true
|
|
29
|
+
autoInit?: boolean;
|
|
30
|
+
|
|
31
|
+
// Custom logger
|
|
32
|
+
logger?: {
|
|
33
|
+
info: (message: string) => void;
|
|
34
|
+
error: (message: string) => void;
|
|
35
|
+
debug: (message: string) => void;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// MCP related configuration
|
|
39
|
+
mcp?: {
|
|
40
|
+
// Whether to auto-discover local MCP servers, defaults to false
|
|
41
|
+
autoDiscover?: boolean;
|
|
42
|
+
|
|
43
|
+
// Array of MCP server configurations
|
|
44
|
+
servers?: MCPClientConfig[];
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
#### Singleton Instance
|
|
50
|
+
|
|
51
|
+
The SDK also provides a pre-initialized singleton instance:
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import { mcpilot } from '@mcpilotx/intentorch';
|
|
55
|
+
|
|
56
|
+
// 直接使用,无需初始化
|
|
57
|
+
await mcpilot.initMCP();
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## MCP 功能
|
|
61
|
+
|
|
62
|
+
### `initMCP()`
|
|
63
|
+
|
|
64
|
+
初始化 MCP 功能。
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
async initMCP(): Promise<void>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**示例:**
|
|
71
|
+
```typescript
|
|
72
|
+
await sdk.initMCP();
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### `connectMCPServer()`
|
|
76
|
+
|
|
77
|
+
连接到 MCP 服务器。
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
async connectMCPServer(
|
|
81
|
+
config: MCPClientConfig,
|
|
82
|
+
name?: string
|
|
83
|
+
): Promise<MCPClient>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**参数:**
|
|
87
|
+
- `config`: MCP 客户端配置
|
|
88
|
+
- `name`: 可选的服务器名称标识符
|
|
89
|
+
|
|
90
|
+
**MCPClientConfig 类型:**
|
|
91
|
+
```typescript
|
|
92
|
+
interface MCPClientConfig {
|
|
93
|
+
// 传输配置
|
|
94
|
+
transport: {
|
|
95
|
+
type: 'stdio' | 'http' | 'sse';
|
|
96
|
+
|
|
97
|
+
// stdio 传输的命令和参数
|
|
98
|
+
command?: string;
|
|
99
|
+
args?: string[];
|
|
100
|
+
|
|
101
|
+
// HTTP/SSE 传输的 URL
|
|
102
|
+
url?: string;
|
|
103
|
+
|
|
104
|
+
// HTTP/SSE 传输的请求头
|
|
105
|
+
headers?: Record<string, string>;
|
|
106
|
+
|
|
107
|
+
// stdio 传输的日志过滤配置
|
|
108
|
+
logFilter?: {
|
|
109
|
+
ignorePatterns?: string[];
|
|
110
|
+
keepPatterns?: string[];
|
|
111
|
+
verbose?: boolean;
|
|
112
|
+
bufferSize?: number;
|
|
113
|
+
timeout?: number;
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// 是否自动连接(默认:false)
|
|
118
|
+
autoConnect?: boolean;
|
|
119
|
+
|
|
120
|
+
// 请求超时时间(毫秒,默认:30000)
|
|
121
|
+
timeout?: number;
|
|
122
|
+
|
|
123
|
+
// 最大重试次数(默认:3)
|
|
124
|
+
maxRetries?: number;
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**示例:**
|
|
129
|
+
```typescript
|
|
130
|
+
// 连接到 stdio 传输的 MCP 服务器
|
|
131
|
+
await sdk.connectMCPServer({
|
|
132
|
+
transport: {
|
|
133
|
+
type: 'stdio',
|
|
134
|
+
command: 'npx',
|
|
135
|
+
args: ['@modelcontextprotocol/server-filesystem']
|
|
136
|
+
}
|
|
137
|
+
}, 'filesystem');
|
|
138
|
+
|
|
139
|
+
// 连接到 HTTP 传输的 MCP 服务器
|
|
140
|
+
await sdk.connectMCPServer({
|
|
141
|
+
transport: {
|
|
142
|
+
type: 'http',
|
|
143
|
+
url: 'http://localhost:8080'
|
|
144
|
+
}
|
|
145
|
+
}, 'http-server');
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### `disconnectMCPServer()`
|
|
149
|
+
|
|
150
|
+
断开与 MCP 服务器的连接。
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
async disconnectMCPServer(name: string): Promise<void>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**参数:**
|
|
157
|
+
- `name`: 服务器名称标识符
|
|
158
|
+
|
|
159
|
+
**示例:**
|
|
160
|
+
```typescript
|
|
161
|
+
await sdk.disconnectMCPServer('filesystem');
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### `listMCPServers()`
|
|
165
|
+
|
|
166
|
+
列出所有已连接的 MCP 服务器名称。
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
listMCPServers(): string[]
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**返回值:**
|
|
173
|
+
- 已连接的 MCP 服务器名称数组
|
|
174
|
+
|
|
175
|
+
**示例:**
|
|
176
|
+
```typescript
|
|
177
|
+
const serverNames = sdk.listMCPServers();
|
|
178
|
+
console.log('Connected servers:', serverNames);
|
|
179
|
+
|
|
180
|
+
// 如果需要获取服务器状态,可以遍历名称并调用 getMCPServerStatus
|
|
181
|
+
serverNames.forEach(serverName => {
|
|
182
|
+
const status = sdk.getMCPServerStatus(serverName);
|
|
183
|
+
if (status) {
|
|
184
|
+
console.log(`Server ${serverName}: connected=${status.connected}, tools=${status.toolsCount}`);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### `getMCPServerStatus()`
|
|
190
|
+
|
|
191
|
+
获取特定 MCP 服务器的状态。
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
getMCPServerStatus(name: string): {
|
|
195
|
+
connected: boolean;
|
|
196
|
+
toolsCount: number;
|
|
197
|
+
} | undefined
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**参数:**
|
|
201
|
+
- `name`: 服务器名称标识符
|
|
202
|
+
|
|
203
|
+
**返回值:**
|
|
204
|
+
- 如果服务器存在:返回包含连接状态和工具数量的对象
|
|
205
|
+
- 如果服务器不存在:返回 `undefined`
|
|
206
|
+
|
|
207
|
+
**示例:**
|
|
208
|
+
```typescript
|
|
209
|
+
const status = sdk.getMCPServerStatus('filesystem');
|
|
210
|
+
if (status) {
|
|
211
|
+
console.log(`Server connected: ${status.connected}`);
|
|
212
|
+
console.log(`Available tools: ${status.toolsCount}`);
|
|
213
|
+
} else {
|
|
214
|
+
console.log('Server not found');
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## 工具管理
|
|
219
|
+
|
|
220
|
+
### `listTools()`
|
|
221
|
+
|
|
222
|
+
列出所有可用工具(来自所有服务器)。
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
listTools(): Array<{
|
|
226
|
+
name: string;
|
|
227
|
+
description: string;
|
|
228
|
+
serverName?: string;
|
|
229
|
+
serverId?: string;
|
|
230
|
+
}>
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**返回值:**
|
|
234
|
+
- 工具名称
|
|
235
|
+
- 工具描述
|
|
236
|
+
- 服务器名称(如果来自特定服务器)
|
|
237
|
+
- 服务器ID(如果来自特定服务器)
|
|
238
|
+
|
|
239
|
+
**示例:**
|
|
240
|
+
```typescript
|
|
241
|
+
const tools = sdk.listTools();
|
|
242
|
+
console.log('Available tools:', tools);
|
|
243
|
+
|
|
244
|
+
// 按服务器分组显示工具
|
|
245
|
+
const toolsByServer: Record<string, any[]> = {};
|
|
246
|
+
tools.forEach(tool => {
|
|
247
|
+
const server = tool.serverName || 'unknown';
|
|
248
|
+
if (!toolsByServer[server]) {
|
|
249
|
+
toolsByServer[server] = [];
|
|
250
|
+
}
|
|
251
|
+
toolsByServer[server].push(tool);
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
Object.entries(toolsByServer).forEach(([server, serverTools]) => {
|
|
255
|
+
console.log(`\nServer: ${server} (${serverTools.length} tools)`);
|
|
256
|
+
serverTools.forEach(tool => {
|
|
257
|
+
console.log(` - ${tool.name}: ${tool.description}`);
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### `searchTools()`
|
|
263
|
+
|
|
264
|
+
按名称或描述搜索工具。
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
searchTools(query: string): Array<{
|
|
268
|
+
name: string;
|
|
269
|
+
description: string;
|
|
270
|
+
serverName?: string;
|
|
271
|
+
serverId?: string;
|
|
272
|
+
}>
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**参数:**
|
|
276
|
+
- `query`: 搜索查询字符串(不区分大小写)
|
|
277
|
+
|
|
278
|
+
**返回值:**
|
|
279
|
+
- 匹配的工具列表,结构与 `listTools()` 相同
|
|
280
|
+
|
|
281
|
+
**示例:**
|
|
282
|
+
```typescript
|
|
283
|
+
// 搜索文件相关工具
|
|
284
|
+
const fileTools = sdk.searchTools('file');
|
|
285
|
+
console.log(`Found ${fileTools.length} file-related tools:`);
|
|
286
|
+
fileTools.forEach(tool => {
|
|
287
|
+
console.log(` - ${tool.name} (from ${tool.serverName || 'unknown'}): ${tool.description}`);
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
// 搜索特定工具
|
|
291
|
+
const readTools = sdk.searchTools('read');
|
|
292
|
+
console.log(`Found ${readTools.length} read-related tools:`);
|
|
293
|
+
readTools.forEach(tool => {
|
|
294
|
+
console.log(` - ${tool.name}: ${tool.description}`);
|
|
295
|
+
});
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### `executeTool()`
|
|
299
|
+
|
|
300
|
+
执行工具。
|
|
301
|
+
|
|
302
|
+
```typescript
|
|
303
|
+
async executeTool(
|
|
304
|
+
toolName: string,
|
|
305
|
+
args: Record<string, any>
|
|
306
|
+
): Promise<ToolResult>
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**参数:**
|
|
310
|
+
- `toolName`: 工具名称
|
|
311
|
+
- `args`: 工具参数
|
|
312
|
+
|
|
313
|
+
**ToolResult 类型:**
|
|
314
|
+
```typescript
|
|
315
|
+
interface ToolResult {
|
|
316
|
+
// 工具执行结果内容
|
|
317
|
+
content: Array<{
|
|
318
|
+
type: 'text' | 'image' | 'resource';
|
|
319
|
+
text?: string;
|
|
320
|
+
data?: any;
|
|
321
|
+
}>;
|
|
322
|
+
|
|
323
|
+
// 是否成功(可选)
|
|
324
|
+
isError?: boolean;
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**示例:**
|
|
329
|
+
```typescript
|
|
330
|
+
const result = await sdk.executeTool('read_file', {
|
|
331
|
+
path: '/tmp/example.txt'
|
|
332
|
+
});
|
|
333
|
+
console.log('Execution result:', result.content[0].text);
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### `getToolStatistics()`
|
|
337
|
+
|
|
338
|
+
获取已注册工具的统计信息。
|
|
339
|
+
|
|
340
|
+
```typescript
|
|
341
|
+
getToolStatistics(): {
|
|
342
|
+
totalTools: number;
|
|
343
|
+
byServer: Record<string, number>;
|
|
344
|
+
mostUsed: Array<{
|
|
345
|
+
name: string;
|
|
346
|
+
serverId?: string;
|
|
347
|
+
serverName?: string;
|
|
348
|
+
usageCount?: number;
|
|
349
|
+
lastUsed?: Date;
|
|
350
|
+
}>;
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**返回值:**
|
|
355
|
+
- `totalTools`: 总工具数量
|
|
356
|
+
- `byServer`: 按服务器分组的工具数量
|
|
357
|
+
- `mostUsed`: 最常使用的工具列表(最多10个)
|
|
358
|
+
|
|
359
|
+
**示例:**
|
|
360
|
+
```typescript
|
|
361
|
+
const stats = sdk.getToolStatistics();
|
|
362
|
+
console.log(`Total tools: ${stats.totalTools}`);
|
|
363
|
+
|
|
364
|
+
// 显示按服务器分组的工具数量
|
|
365
|
+
console.log('Tools by server:');
|
|
366
|
+
Object.entries(stats.byServer).forEach(([server, count]) => {
|
|
367
|
+
console.log(` ${server}: ${count} tools`);
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
// 显示最常使用的工具
|
|
371
|
+
if (stats.mostUsed.length > 0) {
|
|
372
|
+
console.log('\nMost used tools:');
|
|
373
|
+
stats.mostUsed.forEach((tool, index) => {
|
|
374
|
+
console.log(` ${index + 1}. ${tool.name} (${tool.serverName || 'unknown'}) - used ${tool.usageCount || 0} times`);
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## 服务管理
|
|
380
|
+
|
|
381
|
+
### `addService()`
|
|
382
|
+
|
|
383
|
+
添加新服务。
|
|
384
|
+
|
|
385
|
+
```typescript
|
|
386
|
+
async addService(config: ServiceConfig): Promise<void>
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
**ServiceConfig 类型:**
|
|
390
|
+
```typescript
|
|
391
|
+
interface ServiceConfig {
|
|
392
|
+
// 服务名称(必需)
|
|
393
|
+
name: string;
|
|
394
|
+
|
|
395
|
+
// 服务路径(必需)
|
|
396
|
+
path: string;
|
|
397
|
+
|
|
398
|
+
// 运行时类型:node、python、docker、go、rust
|
|
399
|
+
runtime?: RuntimeType;
|
|
400
|
+
|
|
401
|
+
// 自动检测运行时(如果未指定 runtime)
|
|
402
|
+
autoDetectRuntime?: boolean;
|
|
403
|
+
|
|
404
|
+
// 启动命令(可选,覆盖默认值)
|
|
405
|
+
command?: string;
|
|
406
|
+
|
|
407
|
+
// 启动参数
|
|
408
|
+
args?: string[];
|
|
409
|
+
|
|
410
|
+
// 环境变量
|
|
411
|
+
env?: Record<string, string>;
|
|
412
|
+
|
|
413
|
+
// 工作目录
|
|
414
|
+
cwd?: string;
|
|
415
|
+
|
|
416
|
+
// 端口映射(Docker 服务)
|
|
417
|
+
ports?: Array<{
|
|
418
|
+
host: number;
|
|
419
|
+
container: number;
|
|
420
|
+
}>;
|
|
421
|
+
|
|
422
|
+
// 其他配置
|
|
423
|
+
[key: string]: any;
|
|
424
|
+
}
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
**示例:**
|
|
428
|
+
```typescript
|
|
429
|
+
// 添加 Node.js 服务
|
|
430
|
+
await sdk.addService({
|
|
431
|
+
name: 'my-node-app',
|
|
432
|
+
path: './my-app',
|
|
433
|
+
runtime: 'node'
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
// 添加 Python 服务(自动检测运行时)
|
|
437
|
+
await sdk.addService({
|
|
438
|
+
name: 'my-python-app',
|
|
439
|
+
path: './my-app',
|
|
440
|
+
autoDetectRuntime: true
|
|
441
|
+
});
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### `startService()`
|
|
445
|
+
|
|
446
|
+
启动服务。
|
|
447
|
+
|
|
448
|
+
```typescript
|
|
449
|
+
async startService(name: string): Promise<void>
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
**参数:**
|
|
453
|
+
- `name`: 服务名称
|
|
454
|
+
|
|
455
|
+
**示例:**
|
|
456
|
+
```typescript
|
|
457
|
+
await sdk.startService('my-node-app');
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
### `stopService()`
|
|
461
|
+
|
|
462
|
+
停止服务。
|
|
463
|
+
|
|
464
|
+
```typescript
|
|
465
|
+
async stopService(name: string): Promise<void>
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
**参数:**
|
|
469
|
+
- `name`: 服务名称
|
|
470
|
+
|
|
471
|
+
**示例:**
|
|
472
|
+
```typescript
|
|
473
|
+
await sdk.stopService('my-node-app');
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
### `listServices()`
|
|
477
|
+
|
|
478
|
+
列出所有服务。
|
|
479
|
+
|
|
480
|
+
```typescript
|
|
481
|
+
listServices(): Array<{
|
|
482
|
+
name: string;
|
|
483
|
+
config: ServiceConfig;
|
|
484
|
+
status: 'running' | 'stopped' | 'error' | 'unknown';
|
|
485
|
+
}>
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
**示例:**
|
|
489
|
+
```typescript
|
|
490
|
+
const services = sdk.listServices();
|
|
491
|
+
console.log('Services:', services);
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
### `getServiceStatus()`
|
|
495
|
+
|
|
496
|
+
获取服务状态。
|
|
497
|
+
|
|
498
|
+
```typescript
|
|
499
|
+
async getServiceStatus(name: string): Promise<ServiceStatus>
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
**ServiceStatus 类型:**
|
|
503
|
+
```typescript
|
|
504
|
+
interface ServiceStatus {
|
|
505
|
+
name: string;
|
|
506
|
+
status: 'running' | 'stopped' | 'error' | 'unknown';
|
|
507
|
+
pid?: number;
|
|
508
|
+
uptime?: number;
|
|
509
|
+
memory?: number;
|
|
510
|
+
cpu?: number;
|
|
511
|
+
}
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
**示例:**
|
|
515
|
+
```typescript
|
|
516
|
+
const status = await sdk.getServiceStatus('my-node-app');
|
|
517
|
+
console.log('Service status:', status);
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
## 配置管理
|
|
521
|
+
|
|
522
|
+
### `getConfig()`
|
|
523
|
+
|
|
524
|
+
获取当前配置。
|
|
525
|
+
|
|
526
|
+
```typescript
|
|
527
|
+
getConfig(): Config
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
**Config 类型:**
|
|
531
|
+
```typescript
|
|
532
|
+
interface Config {
|
|
533
|
+
// 全局配置
|
|
534
|
+
global?: {
|
|
535
|
+
logLevel?: 'info' | 'error' | 'debug' | 'warn';
|
|
536
|
+
maxRetries?: number;
|
|
537
|
+
timeout?: number;
|
|
538
|
+
};
|
|
539
|
+
|
|
540
|
+
// AI 配置
|
|
541
|
+
ai?: {
|
|
542
|
+
provider?: 'openai' | 'anthropic' | 'local' | 'none';
|
|
543
|
+
apiKey?: string;
|
|
544
|
+
model?: string;
|
|
545
|
+
temperature?: number;
|
|
546
|
+
};
|
|
547
|
+
|
|
548
|
+
// MCP 配置
|
|
549
|
+
mcp?: {
|
|
550
|
+
autoDiscover?: boolean;
|
|
551
|
+
defaultTransport?: 'stdio' | 'http' | 'sse';
|
|
552
|
+
};
|
|
553
|
+
|
|
554
|
+
// 服务配置
|
|
555
|
+
services?: Record<string, ServiceConfig>;
|
|
556
|
+
}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
**示例:**
|
|
560
|
+
```typescript
|
|
561
|
+
const config = sdk.getConfig();
|
|
562
|
+
console.log('Current configuration:', config);
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
### `updateConfig()`
|
|
566
|
+
|
|
567
|
+
更新配置。
|
|
568
|
+
|
|
569
|
+
```typescript
|
|
570
|
+
async updateConfig(updates: Partial<Config>): Promise<void>
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
**参数:**
|
|
574
|
+
- `updates`: 要更新的配置部分
|
|
575
|
+
|
|
576
|
+
**示例:**
|
|
577
|
+
```typescript
|
|
578
|
+
await sdk.updateConfig({
|
|
579
|
+
global: {
|
|
580
|
+
logLevel: 'debug',
|
|
581
|
+
maxRetries: 3
|
|
582
|
+
}
|
|
583
|
+
});
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
## AI 功能
|
|
587
|
+
|
|
588
|
+
### `ask()`
|
|
589
|
+
|
|
590
|
+
使用 AI 提问。
|
|
591
|
+
|
|
592
|
+
```typescript
|
|
593
|
+
async ask(query: string, options?: AskOptions): Promise<AskResult>
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
**AskOptions 类型:**
|
|
597
|
+
```typescript
|
|
598
|
+
interface AskOptions {
|
|
599
|
+
provider?: string;
|
|
600
|
+
model?: string;
|
|
601
|
+
temperature?: number;
|
|
602
|
+
maxTokens?: number;
|
|
603
|
+
}
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
**AskResult 类型:**
|
|
607
|
+
```typescript
|
|
608
|
+
interface AskResult {
|
|
609
|
+
answer: string;
|
|
610
|
+
toolCalls?: Array<{
|
|
611
|
+
service: string;
|
|
612
|
+
tool: string;
|
|
613
|
+
params: Record<string, any>;
|
|
614
|
+
}>;
|
|
615
|
+
confidence: number;
|
|
616
|
+
}
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
**示例:**
|
|
620
|
+
```typescript
|
|
621
|
+
const result = await sdk.ask('What files are in the current directory?');
|
|
622
|
+
console.log('AI response:', result.answer);
|
|
623
|
+
|
|
624
|
+
if (result.toolCalls && result.toolCalls.length > 0) {
|
|
625
|
+
for (const toolCall of result.toolCalls) {
|
|
626
|
+
const toolResult = await sdk.executeTool(toolCall.tool, toolCall.params);
|
|
627
|
+
console.log(`Tool ${toolCall.tool} result:`, toolResult);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
### `configureAI()`
|
|
633
|
+
|
|
634
|
+
配置 AI 设置。
|
|
635
|
+
|
|
636
|
+
```typescript
|
|
637
|
+
async configureAI(config: Partial<Config['ai']>): Promise<void>
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
**参数:**
|
|
641
|
+
- `config`: AI 配置
|
|
642
|
+
|
|
643
|
+
**示例:**
|
|
644
|
+
```typescript
|
|
645
|
+
await sdk.configureAI({
|
|
646
|
+
provider: 'openai',
|
|
647
|
+
apiKey: 'your-api-key-here',
|
|
648
|
+
model: 'gpt-4'
|
|
649
|
+
});
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
## 错误处理
|
|
653
|
+
|
|
654
|
+
### 错误类型
|
|
655
|
+
|
|
656
|
+
SDK 定义了以下错误类型:
|
|
657
|
+
|
|
658
|
+
```typescript
|
|
659
|
+
class MCPilotError extends Error {
|
|
660
|
+
code: string;
|
|
661
|
+
shouldRetry: boolean;
|
|
662
|
+
|
|
663
|
+
constructor(message: string, code: string, shouldRetry: boolean = false) {
|
|
664
|
+
super(message);
|
|
665
|
+
this.code = code;
|
|
666
|
+
this.shouldRetry = shouldRetry;
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
// 特定错误类型
|
|
671
|
+
class ServiceNotFoundError extends MCPilotError {
|
|
672
|
+
constructor(serviceName: string) {
|
|
673
|
+
super(`Service '${serviceName}' not found`, 'SERVICE_NOT_FOUND');
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
class ToolNotFoundError extends MCPilotError {
|
|
678
|
+
constructor(toolName: string) {
|
|
679
|
+
super(`Tool '${toolName}' not found`, 'TOOL_NOT_FOUND');
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
class MCPConnectionError extends MCPilotError {
|
|
684
|
+
constructor(serverName: string, message: string) {
|
|
685
|
+
super(`Failed to connect to MCP server '${serverName}': ${message}`, 'MCP_CONNECTION_ERROR', true);
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
### 错误处理示例
|
|
691
|
+
|
|
692
|
+
```typescript
|
|
693
|
+
try {
|
|
694
|
+
await sdk.executeTool('read_file', { path: '/nonexistent.txt' });
|
|
695
|
+
} catch (error) {
|
|
696
|
+
if (error instanceof MCPilotError) {
|
|
697
|
+
console.error(`MCPilot error: ${error.code} - ${error.message}`);
|
|
698
|
+
if (error.shouldRetry) {
|
|
699
|
+
// 实现重试逻辑
|
|
700
|
+
console.log('Retrying...');
|
|
701
|
+
}
|
|
702
|
+
} else {
|
|
703
|
+
console.error('Unexpected error:', error);
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
## 日志记录
|
|
709
|
+
|
|
710
|
+
### 自定义日志记录器
|
|
711
|
+
|
|
712
|
+
```typescript
|
|
713
|
+
const sdk = new MCPilotSDK({
|
|
714
|
+
logger: {
|
|
715
|
+
info: (msg) => console.log(`[INFO] ${msg}`),
|
|
716
|
+
error: (msg) => console.error(`[ERROR] ${msg}`),
|
|
717
|
+
debug: (msg) => console.debug(`[DEBUG] ${msg}`),
|
|
718
|
+
}
|
|
719
|
+
});
|
|
720
|
+
```
|
|
721
|
+
|
|
722
|
+
### 日志级别
|
|
723
|
+
|
|
724
|
+
支持以下日志级别:
|
|
725
|
+
- `info`: 一般信息性消息
|
|
726
|
+
- `error`: 错误消息
|
|
727
|
+
- `debug`: 调试消息(仅在调试时启用)
|
|
728
|
+
|
|
729
|
+
## 类型导出
|
|
730
|
+
|
|
731
|
+
SDK 导出以下 TypeScript 类型:
|
|
732
|
+
|
|
733
|
+
```typescript
|
|
734
|
+
import {
|
|
735
|
+
// 核心类
|
|
736
|
+
MCPilotSDK,
|
|
737
|
+
mcpilot,
|
|
738
|
+
|
|
739
|
+
// 类型
|
|
740
|
+
type SDKOptions,
|
|
741
|
+
type ServiceConfig,
|
|
742
|
+
type ServiceStatus,
|
|
743
|
+
type Config,
|
|
744
|
+
type AskOptions,
|
|
745
|
+
type AskResult,
|
|
746
|
+
|
|
747
|
+
// MCP 相关
|
|
748
|
+
type MCPClientConfig,
|
|
749
|
+
type Tool,
|
|
750
|
+
type ToolResult,
|
|
751
|
+
type ToolCall,
|
|
752
|
+
|
|
753
|
+
// 错误类
|
|
754
|
+
MCPilotError,
|
|
755
|
+
ServiceNotFoundError,
|
|
756
|
+
ToolNotFoundError,
|
|
757
|
+
MCPConnectionError
|
|
758
|
+
} from '@mcpilotx/intentorch';
|
|
759
|
+
```
|
|
760
|
+
|
|
761
|
+
## 实用函数
|
|
762
|
+
|
|
763
|
+
### `createSDK()`
|
|
764
|
+
|
|
765
|
+
创建 SDK 实例的快捷函数。
|
|
766
|
+
|
|
767
|
+
```typescript
|
|
768
|
+
import { createSDK } from '@mcpilotx/intentorch';
|
|
769
|
+
|
|
770
|
+
const sdk = createSDK(options);
|
|
771
|
+
```
|
|
772
|
+
|
|
773
|
+
### `discoverLocalMCPServers()`
|
|
774
|
+
|
|
775
|
+
发现本地 MCP 服务器。
|
|
776
|
+
|
|
777
|
+
```typescript
|
|
778
|
+
import { discoverLocalMCPServers } from '@mcpilotx/intentorch';
|
|
779
|
+
|
|
780
|
+
const servers = await discoverLocalMCPServers();
|
|
781
|
+
console.log('Discovered servers:', servers);
|
|
782
|
+
```
|
|
783
|
+
|
|
784
|
+
## 版本信息
|
|
785
|
+
|
|
786
|
+
### 获取 SDK 版本
|
|
787
|
+
|
|
788
|
+
```typescript
|
|
789
|
+
import { version } from '@mcpilotx/intentorch';
|
|
790
|
+
|
|
791
|
+
console.log(`MCPilot SDK version: ${version}`);
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
## 最佳实践
|
|
795
|
+
|
|
796
|
+
### 1. 错误处理
|
|
797
|
+
|
|
798
|
+
始终使用 try-catch 块包装 SDK 调用:
|
|
799
|
+
|
|
800
|
+
```typescript
|
|
801
|
+
try {
|
|
802
|
+
await sdk.initMCP();
|
|
803
|
+
await sdk.connectMCPServer(config, 'my-server');
|
|
804
|
+
const result = await sdk.executeTool('some_tool', { param: 'value' });
|
|
805
|
+
} catch (error) {
|
|
806
|
+
console.error('Operation failed:', error);
|
|
807
|
+
// 适当的错误恢复逻辑
|
|
808
|
+
}
|
|
809
|
+
```
|
|
810
|
+
|
|
811
|
+
### 2. 资源清理
|
|
812
|
+
|
|
813
|
+
使用后清理资源:
|
|
814
|
+
|
|
815
|
+
```typescript
|
|
816
|
+
// 使用完成后断开连接
|
|
817
|
+
try {
|
|
818
|
+
await sdk.disconnectMCPServer('my-server');
|
|
819
|
+
await sdk.stopService('my-service');
|
|
820
|
+
} catch (error) {
|
|
821
|
+
console.error('Cleanup failed:', error);
|
|
822
|
+
}
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
### 3. 配置管理
|
|
826
|
+
|
|
827
|
+
将配置存储在适当的位置:
|
|
828
|
+
|
|
829
|
+
```typescript
|
|
830
|
+
// 从环境变量加载配置
|
|
831
|
+
const sdk = new MCPilotSDK({
|
|
832
|
+
configPath: process.env.MCPILOT_CONFIG_PATH || '~/.mcpilot/config.json',
|
|
833
|
+
mcp: {
|
|
834
|
+
autoDiscover: process.env.MCP_AUTO_DISCOVER === 'true',
|
|
835
|
+
servers: JSON.parse(process.env.MCP_SERVERS || '[]')
|
|
836
|
+
}
|
|
837
|
+
});
|
|
838
|
+
```
|
|
839
|
+
|
|
840
|
+
### 4. 性能监控
|
|
841
|
+
|
|
842
|
+
监控工具执行性能:
|
|
843
|
+
|
|
844
|
+
```typescript
|
|
845
|
+
const startTime = Date.now();
|
|
846
|
+
const result = await sdk.executeTool('expensive_tool', { /* params */ });
|
|
847
|
+
const executionTime = Date.now() - startTime;
|
|
848
|
+
|
|
849
|
+
console.log(`Tool executed in ${executionTime}ms`);
|
|
850
|
+
|
|
851
|
+
// 获取统计信息
|
|
852
|
+
const stats = sdk.getToolStatistics();
|
|
853
|
+
console.log('Average execution time:', stats.averageExecutionTime);
|
|
854
|
+
```
|
|
855
|
+
|
|
856
|
+
## 常见问题
|
|
857
|
+
|
|
858
|
+
### Q: 如何连接到多个 MCP 服务器?
|
|
859
|
+
|
|
860
|
+
A: 在初始化时配置多个服务器,或使用多个 `connectMCPServer` 调用:
|
|
861
|
+
|
|
862
|
+
```typescript
|
|
863
|
+
// 方法1:初始化时配置
|
|
864
|
+
const sdk = new MCPilotSDK({
|
|
865
|
+
mcp: {
|
|
866
|
+
servers: [
|
|
867
|
+
{
|
|
868
|
+
transport: { type: 'stdio', command: 'npx', args: ['@modelcontextprotocol/server-filesystem'] }
|
|
869
|
+
},
|
|
870
|
+
{
|
|
871
|
+
transport: { type: 'stdio', command: 'npx', args: ['@modelcontextprotocol/server-weather'] }
|
|
872
|
+
}
|
|
873
|
+
]
|
|
874
|
+
}
|
|
875
|
+
});
|
|
876
|
+
|
|
877
|
+
// 方法2:动态连接
|
|
878
|
+
await sdk.connectMCPServer(filesystemConfig, 'filesystem');
|
|
879
|
+
await sdk.connectMCPServer(weatherConfig, 'weather');
|
|
880
|
+
```
|
|
881
|
+
|
|
882
|
+
### Q: 如何处理工具执行失败?
|
|
883
|
+
|
|
884
|
+
A: 使用错误处理和重试机制:
|
|
885
|
+
|
|
886
|
+
```typescript
|
|
887
|
+
async function executeWithRetry(toolName: string, args: Record<string, any>, maxRetries = 3) {
|
|
888
|
+
for (let attempt = 1; attempt <= maxRetries; attempt
|