@xiaozhi-client/mcp-core 1.9.7-beta.8 → 1.9.7
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 +8 -25
- package/dist/index.d.ts +64 -24
- package/dist/index.js +83 -93
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
`@xiaozhi-client/mcp-core` 是一个完全独立的 MCP(Model Context Protocol)核心实现库,提供:
|
|
11
11
|
|
|
12
12
|
- **零业务耦合** - 纯粹的 MCP 协议实现,无任何业务逻辑依赖
|
|
13
|
-
- **多传输协议支持** - 支持 STDIO、SSE、
|
|
13
|
+
- **多传输协议支持** - 支持 STDIO、SSE、HTTP 三种传输方式
|
|
14
14
|
- **灵活的事件系统** - 基于回调的事件机制,易于集成
|
|
15
15
|
- **完整的类型定义** - TypeScript 严格模式,提供完整的类型支持
|
|
16
16
|
- **生产就绪** - 经过充分测试,可直接用于生产环境
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
|------|------|----------|
|
|
32
32
|
| **STDIO** | 标准输入输出通信 | 本地进程通信 |
|
|
33
33
|
| **SSE** | Server-Sent Events | 单向服务器推送 |
|
|
34
|
-
| **
|
|
34
|
+
| **HTTP** | HTTP 通信 | 现代 HTTP 场景 |
|
|
35
35
|
|
|
36
36
|
## 安装
|
|
37
37
|
|
|
@@ -179,7 +179,7 @@ import { MCPConnection, MCPTransportType } from '@xiaozhi-client/mcp-core';
|
|
|
179
179
|
// 1. 创建连接配置
|
|
180
180
|
const config = {
|
|
181
181
|
name: 'my-mcp-service',
|
|
182
|
-
type: MCPTransportType.
|
|
182
|
+
type: MCPTransportType.HTTP,
|
|
183
183
|
url: 'https://api.example.com/mcp',
|
|
184
184
|
apiKey: 'your-api-key'
|
|
185
185
|
};
|
|
@@ -330,12 +330,6 @@ interface MCPServiceConfig {
|
|
|
330
330
|
// 认证配置
|
|
331
331
|
apiKey?: string; // API 密钥
|
|
332
332
|
headers?: Record<string, string>; // 自定义请求头
|
|
333
|
-
|
|
334
|
-
// 超时配置
|
|
335
|
-
timeout?: number; // 连接超时(毫秒,默认 10000)
|
|
336
|
-
|
|
337
|
-
// 重试配置
|
|
338
|
-
retryAttempts?: number; // 重试次数
|
|
339
333
|
}
|
|
340
334
|
```
|
|
341
335
|
|
|
@@ -344,7 +338,7 @@ interface MCPServiceConfig {
|
|
|
344
338
|
如果不指定 `type`,库会自动根据配置推断:
|
|
345
339
|
|
|
346
340
|
- 有 `command` 字段 → `MCPTransportType.STDIO`
|
|
347
|
-
- 有 `url` 字段 → `MCPTransportType.
|
|
341
|
+
- 有 `url` 字段 → `MCPTransportType.HTTP` 或 `MCPTransportType.SSE`
|
|
348
342
|
|
|
349
343
|
## 工具调用
|
|
350
344
|
|
|
@@ -451,10 +445,9 @@ class MyMCPClient {
|
|
|
451
445
|
constructor(url: string, apiKey: string) {
|
|
452
446
|
const config = {
|
|
453
447
|
name: 'my-service',
|
|
454
|
-
type: MCPTransportType.
|
|
448
|
+
type: MCPTransportType.HTTP,
|
|
455
449
|
url,
|
|
456
|
-
apiKey
|
|
457
|
-
timeout: 30000
|
|
450
|
+
apiKey
|
|
458
451
|
};
|
|
459
452
|
|
|
460
453
|
const callbacks = {
|
|
@@ -687,7 +680,7 @@ await connection.callTool(name, params); // 可能抛出异常
|
|
|
687
680
|
const config = {
|
|
688
681
|
name: 'service',
|
|
689
682
|
url: 'https://api.example.com'
|
|
690
|
-
// type 会自动推断为
|
|
683
|
+
// type 会自动推断为 HTTP
|
|
691
684
|
};
|
|
692
685
|
|
|
693
686
|
// ❌ 避免:手动指定容易出错的类型
|
|
@@ -705,17 +698,7 @@ const config = {
|
|
|
705
698
|
**A:**
|
|
706
699
|
- **本地进程** → 使用 `STDIO`
|
|
707
700
|
- **单向推送** → 使用 `SSE`
|
|
708
|
-
- **现代 HTTP** → 使用 `
|
|
709
|
-
|
|
710
|
-
### Q: 连接超时如何处理?
|
|
711
|
-
|
|
712
|
-
**A:** 在配置中设置 `timeout` 字段(单位:毫秒):
|
|
713
|
-
|
|
714
|
-
```typescript
|
|
715
|
-
{
|
|
716
|
-
timeout: 30000 // 30 秒超时
|
|
717
|
-
}
|
|
718
|
-
```
|
|
701
|
+
- **现代 HTTP** → 使用 `HTTP`(推荐)
|
|
719
702
|
|
|
720
703
|
### Q: 如何处理连接失败?
|
|
721
704
|
|
package/dist/index.d.ts
CHANGED
|
@@ -21,8 +21,17 @@ type MCPServerTransport = StdioClientTransport | SSEClientTransport | Streamable
|
|
|
21
21
|
declare enum MCPTransportType {
|
|
22
22
|
STDIO = "stdio",
|
|
23
23
|
SSE = "sse",
|
|
24
|
-
|
|
24
|
+
HTTP = "http"
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* 传输类型字符串字面量
|
|
28
|
+
* 方便外部用户直接使用字符串而不需要导入枚举
|
|
29
|
+
*/
|
|
30
|
+
type MCPTransportTypeString = "stdio" | "sse" | "http";
|
|
31
|
+
/**
|
|
32
|
+
* 传输类型输入值(枚举或字符串字面量)
|
|
33
|
+
*/
|
|
34
|
+
type MCPTransportTypeInput = MCPTransportType | MCPTransportTypeString;
|
|
26
35
|
/**
|
|
27
36
|
* MCP 服务事件回调接口
|
|
28
37
|
* 用于替代 EventBus 依赖,提供灵活的事件处理机制
|
|
@@ -58,21 +67,32 @@ interface ModelScopeSSEOptions {
|
|
|
58
67
|
}
|
|
59
68
|
/**
|
|
60
69
|
* MCP 服务配置接口
|
|
61
|
-
* 包含所有 MCP
|
|
70
|
+
* 包含所有 MCP 服务的配置选项(不包含服务名称)
|
|
71
|
+
*
|
|
72
|
+
* @description
|
|
73
|
+
* 与 MCP 官方配置格式保持一致,支持三种传输类型:
|
|
74
|
+
* - stdio: 本地进程通信 { command, args, env }
|
|
75
|
+
* - sse: Server-Sent Events { url, headers }
|
|
76
|
+
* - http: Streamable HTTP { url, headers }
|
|
77
|
+
*
|
|
78
|
+
* 向后兼容:自动将 streamable-http/streamable_http/streamableHttp 转换为 http
|
|
62
79
|
*/
|
|
63
80
|
interface MCPServiceConfig {
|
|
64
|
-
|
|
65
|
-
type?: MCPTransportType;
|
|
81
|
+
type?: MCPTransportTypeInput;
|
|
66
82
|
command?: string;
|
|
67
83
|
args?: string[];
|
|
68
84
|
env?: Record<string, string>;
|
|
69
85
|
url?: string;
|
|
70
86
|
apiKey?: string;
|
|
71
87
|
headers?: Record<string, string>;
|
|
72
|
-
modelScopeAuth?: boolean;
|
|
73
88
|
customSSEOptions?: ModelScopeSSEOptions;
|
|
74
|
-
|
|
75
|
-
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 内部使用的 MCP 服务配置接口(包含 name 字段)
|
|
92
|
+
* 用于 TransportFactory 等内部函数
|
|
93
|
+
*/
|
|
94
|
+
interface InternalMCPServiceConfig extends MCPServiceConfig {
|
|
95
|
+
name: string;
|
|
76
96
|
}
|
|
77
97
|
/**
|
|
78
98
|
* 连接状态枚举
|
|
@@ -259,6 +279,7 @@ declare class ToolCallError extends Error {
|
|
|
259
279
|
* 负责管理单个 MCP 服务的连接、工具管理和调用
|
|
260
280
|
*/
|
|
261
281
|
declare class MCPConnection {
|
|
282
|
+
private name;
|
|
262
283
|
private config;
|
|
263
284
|
private client;
|
|
264
285
|
private transport;
|
|
@@ -267,7 +288,7 @@ declare class MCPConnection {
|
|
|
267
288
|
private connectionTimeout;
|
|
268
289
|
private initialized;
|
|
269
290
|
private callbacks?;
|
|
270
|
-
constructor(config: MCPServiceConfig, callbacks?: MCPServiceEventCallbacks);
|
|
291
|
+
constructor(name: string, config: MCPServiceConfig, callbacks?: MCPServiceEventCallbacks);
|
|
271
292
|
/**
|
|
272
293
|
* 验证配置
|
|
273
294
|
*/
|
|
@@ -311,7 +332,9 @@ declare class MCPConnection {
|
|
|
311
332
|
/**
|
|
312
333
|
* 获取服务配置
|
|
313
334
|
*/
|
|
314
|
-
getConfig(): MCPServiceConfig
|
|
335
|
+
getConfig(): MCPServiceConfig & {
|
|
336
|
+
name: string;
|
|
337
|
+
};
|
|
315
338
|
/**
|
|
316
339
|
* 获取服务状态
|
|
317
340
|
*/
|
|
@@ -327,11 +350,6 @@ declare class MCPConnection {
|
|
|
327
350
|
* 提供简洁的 API 来管理多个 MCP 服务
|
|
328
351
|
*/
|
|
329
352
|
|
|
330
|
-
/**
|
|
331
|
-
* 用户友好的传输类型
|
|
332
|
-
* 用于简化和标准化用户输入
|
|
333
|
-
*/
|
|
334
|
-
type UserFriendlyTransportType = "stdio" | "sse" | "http" | MCPTransportType;
|
|
335
353
|
/**
|
|
336
354
|
* MCP 服务管理器
|
|
337
355
|
* 提供简洁的 API 来管理多个 MCP 服务
|
|
@@ -387,9 +405,7 @@ declare class MCPManager extends EventEmitter {
|
|
|
387
405
|
* });
|
|
388
406
|
* ```
|
|
389
407
|
*/
|
|
390
|
-
addServer(name: string, config:
|
|
391
|
-
type?: UserFriendlyTransportType;
|
|
392
|
-
}): void;
|
|
408
|
+
addServer(name: string, config: MCPServiceConfig): void;
|
|
393
409
|
/**
|
|
394
410
|
* 移除服务器配置
|
|
395
411
|
* @param name 服务器名称
|
|
@@ -517,14 +533,16 @@ declare class MCPManager extends EventEmitter {
|
|
|
517
533
|
|
|
518
534
|
/**
|
|
519
535
|
* 创建 transport 实例
|
|
520
|
-
* @param config MCP
|
|
536
|
+
* @param config MCP 服务配置(包含 name)
|
|
521
537
|
* @returns transport 实例
|
|
522
538
|
*/
|
|
523
|
-
declare function createTransport(config:
|
|
539
|
+
declare function createTransport(config: InternalMCPServiceConfig): MCPServerTransport;
|
|
524
540
|
/**
|
|
525
541
|
* 验证配置
|
|
542
|
+
* 注意:name 验证已在 MCPConnection 构造函数中进行
|
|
543
|
+
* @param config MCP 服务配置(包含 name)
|
|
526
544
|
*/
|
|
527
|
-
declare function validateConfig(config:
|
|
545
|
+
declare function validateConfig(config: InternalMCPServiceConfig): void;
|
|
528
546
|
/**
|
|
529
547
|
* 获取支持的传输类型列表
|
|
530
548
|
*/
|
|
@@ -540,7 +558,15 @@ declare const TransportFactory: {
|
|
|
540
558
|
|
|
541
559
|
/**
|
|
542
560
|
* MCP 服务器配置 Type 字段标准化工具
|
|
543
|
-
* 支持将各种 type
|
|
561
|
+
* 支持将各种 type 字段格式转换为 MCP 官方标准格式
|
|
562
|
+
*
|
|
563
|
+
* @description
|
|
564
|
+
* 标准格式与 MCP 官方保持一致:
|
|
565
|
+
* - stdio: 本地进程通信
|
|
566
|
+
* - sse: Server-Sent Events
|
|
567
|
+
* - http: Streamable HTTP(推荐使用 http 而非 streamable-http)
|
|
568
|
+
*
|
|
569
|
+
* 向后兼容:自动转换各种变体格式
|
|
544
570
|
*/
|
|
545
571
|
/**
|
|
546
572
|
* MCP 服务器配置的基础接口
|
|
@@ -555,11 +581,24 @@ interface MCPBaseConfig {
|
|
|
555
581
|
*/
|
|
556
582
|
declare namespace TypeFieldNormalizer {
|
|
557
583
|
/**
|
|
558
|
-
* 标准化type字段格式
|
|
559
|
-
*
|
|
584
|
+
* 标准化 type 字段格式
|
|
585
|
+
*
|
|
586
|
+
* 支持的转换:
|
|
587
|
+
* - http 变体:http → http(标准值)
|
|
588
|
+
* - streamable-http → http
|
|
589
|
+
* - streamable_http → http
|
|
590
|
+
* - streamableHttp → http
|
|
591
|
+
* - sse 变体:sse → sse(标准值)
|
|
592
|
+
* - s_se → sse
|
|
593
|
+
* - s-se → sse
|
|
594
|
+
* - stdio 变体:stdio → stdio(标准值)
|
|
560
595
|
*/
|
|
561
596
|
function normalizeTypeField<T extends MCPBaseConfig>(config: T): T;
|
|
562
597
|
function normalizeTypeField(config: unknown): unknown;
|
|
598
|
+
/**
|
|
599
|
+
* 标准化单个 type 值
|
|
600
|
+
*/
|
|
601
|
+
function normalizeTypeValue(type: string): string;
|
|
563
602
|
}
|
|
564
603
|
/**
|
|
565
604
|
* 导出便捷函数
|
|
@@ -582,9 +621,10 @@ declare function inferTransportTypeFromUrl(url: string, options?: {
|
|
|
582
621
|
* 完整的配置类型推断(包括 command 字段)
|
|
583
622
|
*
|
|
584
623
|
* @param config - MCP 服务配置
|
|
624
|
+
* @param serviceName - 服务名称(用于日志输出)
|
|
585
625
|
* @returns 完整的配置对象,包含推断出的类型
|
|
586
626
|
*/
|
|
587
|
-
declare function inferTransportTypeFromConfig(config: MCPServiceConfig): MCPServiceConfig;
|
|
627
|
+
declare function inferTransportTypeFromConfig(config: MCPServiceConfig, serviceName?: string): MCPServiceConfig;
|
|
588
628
|
/**
|
|
589
629
|
* 验证工具调用参数
|
|
590
630
|
* 对传入的参数进行完整性和格式验证
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
5
5
|
var MCPTransportType = /* @__PURE__ */ ((MCPTransportType2) => {
|
|
6
6
|
MCPTransportType2["STDIO"] = "stdio";
|
|
7
7
|
MCPTransportType2["SSE"] = "sse";
|
|
8
|
-
MCPTransportType2["
|
|
8
|
+
MCPTransportType2["HTTP"] = "http";
|
|
9
9
|
return MCPTransportType2;
|
|
10
10
|
})(MCPTransportType || {});
|
|
11
11
|
var ConnectionState = /* @__PURE__ */ ((ConnectionState2) => {
|
|
@@ -66,16 +66,13 @@ if (typeof globalThisAny !== "undefined" && !globalThisAny.EventSource) {
|
|
|
66
66
|
globalThisAny.EventSource = EventSource;
|
|
67
67
|
}
|
|
68
68
|
function createTransport(config) {
|
|
69
|
-
console.debug(
|
|
70
|
-
`[TransportFactory] \u521B\u5EFA ${config.type} transport for ${config.name}`
|
|
71
|
-
);
|
|
72
69
|
switch (config.type) {
|
|
73
70
|
case "stdio" /* STDIO */:
|
|
74
71
|
return createStdioTransport(config);
|
|
75
72
|
case "sse" /* SSE */:
|
|
76
73
|
return createSSETransport(config);
|
|
77
|
-
case "
|
|
78
|
-
return
|
|
74
|
+
case "http" /* HTTP */:
|
|
75
|
+
return createHTTPTransport(config);
|
|
79
76
|
default:
|
|
80
77
|
throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${config.type}`);
|
|
81
78
|
}
|
|
@@ -102,15 +99,15 @@ function createSSETransport(config) {
|
|
|
102
99
|
return new SSEClientTransport(url, options);
|
|
103
100
|
}
|
|
104
101
|
__name(createSSETransport, "createSSETransport");
|
|
105
|
-
function
|
|
102
|
+
function createHTTPTransport(config) {
|
|
106
103
|
if (!config.url) {
|
|
107
|
-
throw new Error("
|
|
104
|
+
throw new Error("HTTP transport \u9700\u8981 URL \u914D\u7F6E");
|
|
108
105
|
}
|
|
109
106
|
const url = new URL(config.url);
|
|
110
107
|
const options = createStreamableHTTPOptions(config);
|
|
111
108
|
return new StreamableHTTPClientTransport(url, options);
|
|
112
109
|
}
|
|
113
|
-
__name(
|
|
110
|
+
__name(createHTTPTransport, "createHTTPTransport");
|
|
114
111
|
function createSSEOptions(config) {
|
|
115
112
|
const options = {};
|
|
116
113
|
if (config.apiKey) {
|
|
@@ -146,9 +143,6 @@ function createStreamableHTTPOptions(config) {
|
|
|
146
143
|
}
|
|
147
144
|
__name(createStreamableHTTPOptions, "createStreamableHTTPOptions");
|
|
148
145
|
function validateConfig(config) {
|
|
149
|
-
if (!config.name || typeof config.name !== "string") {
|
|
150
|
-
throw new Error("\u914D\u7F6E\u5FC5\u987B\u5305\u542B\u6709\u6548\u7684 name \u5B57\u6BB5");
|
|
151
|
-
}
|
|
152
146
|
if (config.type && !Object.values(MCPTransportType).includes(config.type)) {
|
|
153
147
|
throw new Error(`\u4E0D\u652F\u6301\u7684\u4F20\u8F93\u7C7B\u578B: ${config.type}`);
|
|
154
148
|
}
|
|
@@ -166,7 +160,7 @@ function validateConfig(config) {
|
|
|
166
160
|
throw new Error(`${config.type} \u7C7B\u578B\u9700\u8981 url \u5B57\u6BB5`);
|
|
167
161
|
}
|
|
168
162
|
break;
|
|
169
|
-
case "
|
|
163
|
+
case "http" /* HTTP */:
|
|
170
164
|
if (config.url === void 0 || config.url === null) {
|
|
171
165
|
throw new Error(`${config.type} \u7C7B\u578B\u9700\u8981 url \u5B57\u6BB5`);
|
|
172
166
|
}
|
|
@@ -180,7 +174,7 @@ function getSupportedTypes() {
|
|
|
180
174
|
return [
|
|
181
175
|
"stdio" /* STDIO */,
|
|
182
176
|
"sse" /* SSE */,
|
|
183
|
-
"
|
|
177
|
+
"http" /* HTTP */
|
|
184
178
|
];
|
|
185
179
|
}
|
|
186
180
|
__name(getSupportedTypes, "getSupportedTypes");
|
|
@@ -202,30 +196,45 @@ var TypeFieldNormalizer;
|
|
|
202
196
|
return normalizedConfig;
|
|
203
197
|
}
|
|
204
198
|
const originalType = normalizedConfig.type;
|
|
205
|
-
if (originalType === "sse" || originalType === "
|
|
199
|
+
if (originalType === "stdio" || originalType === "sse" || originalType === "http") {
|
|
206
200
|
return normalizedConfig;
|
|
207
201
|
}
|
|
208
|
-
|
|
209
|
-
if (
|
|
210
|
-
normalizedType = "streamable-http";
|
|
211
|
-
} else if (originalType === "s_se" || originalType === "s-se") {
|
|
212
|
-
normalizedType = "sse";
|
|
213
|
-
} else {
|
|
214
|
-
normalizedType = convertToKebabCase(originalType);
|
|
215
|
-
}
|
|
216
|
-
if (normalizedType === "sse" || normalizedType === "streamable-http") {
|
|
202
|
+
const normalizedType = normalizeTypeValue(originalType);
|
|
203
|
+
if (normalizedType === "stdio" || normalizedType === "sse" || normalizedType === "http") {
|
|
217
204
|
normalizedConfig.type = normalizedType;
|
|
218
|
-
if (originalType !== normalizedType) {
|
|
219
|
-
}
|
|
220
205
|
}
|
|
221
206
|
return normalizedConfig;
|
|
222
207
|
}
|
|
223
208
|
TypeFieldNormalizer2.normalizeTypeField = normalizeTypeField2;
|
|
224
209
|
__name(normalizeTypeField2, "normalizeTypeField");
|
|
225
|
-
function
|
|
226
|
-
|
|
210
|
+
function normalizeTypeValue(type) {
|
|
211
|
+
if (type === "http" || type === "streamable-http" || type === "streamable_http" || type === "streamableHttp") {
|
|
212
|
+
return "http";
|
|
213
|
+
}
|
|
214
|
+
if (type === "sse" || type === "s_se" || type === "s-se") {
|
|
215
|
+
return "sse";
|
|
216
|
+
}
|
|
217
|
+
if (type === "stdio") {
|
|
218
|
+
return "stdio";
|
|
219
|
+
}
|
|
220
|
+
return convertToStandardFormat(type);
|
|
221
|
+
}
|
|
222
|
+
TypeFieldNormalizer2.normalizeTypeValue = normalizeTypeValue;
|
|
223
|
+
__name(normalizeTypeValue, "normalizeTypeValue");
|
|
224
|
+
function convertToStandardFormat(str) {
|
|
225
|
+
const lowered = str.toLowerCase();
|
|
226
|
+
if (lowered.includes("http") || lowered.includes("streamable")) {
|
|
227
|
+
return "http";
|
|
228
|
+
}
|
|
229
|
+
if (lowered.includes("sse")) {
|
|
230
|
+
return "sse";
|
|
231
|
+
}
|
|
232
|
+
if (lowered.includes("stdio")) {
|
|
233
|
+
return "stdio";
|
|
234
|
+
}
|
|
235
|
+
return str;
|
|
227
236
|
}
|
|
228
|
-
__name(
|
|
237
|
+
__name(convertToStandardFormat, "convertToStandardFormat");
|
|
229
238
|
})(TypeFieldNormalizer || (TypeFieldNormalizer = {}));
|
|
230
239
|
function normalizeTypeField(config) {
|
|
231
240
|
return TypeFieldNormalizer.normalizeTypeField(config);
|
|
@@ -241,26 +250,19 @@ function inferTransportTypeFromUrl(url, options) {
|
|
|
241
250
|
return "sse" /* SSE */;
|
|
242
251
|
}
|
|
243
252
|
if (pathname.endsWith("/mcp")) {
|
|
244
|
-
return "
|
|
253
|
+
return "http" /* HTTP */;
|
|
245
254
|
}
|
|
246
255
|
if (options?.serviceName) {
|
|
247
|
-
console.info(
|
|
248
|
-
`[MCP-${options.serviceName}] URL \u8DEF\u5F84 ${pathname} \u4E0D\u5339\u914D\u7279\u5B9A\u89C4\u5219\uFF0C\u9ED8\u8BA4\u63A8\u65AD\u4E3A streamable-http \u7C7B\u578B`
|
|
249
|
-
);
|
|
250
256
|
}
|
|
251
|
-
return "
|
|
257
|
+
return "http" /* HTTP */;
|
|
252
258
|
} catch (error) {
|
|
253
259
|
if (options?.serviceName) {
|
|
254
|
-
console.warn(
|
|
255
|
-
`[MCP-${options.serviceName}] URL \u89E3\u6790\u5931\u8D25\uFF0C\u9ED8\u8BA4\u63A8\u65AD\u4E3A streamable-http \u7C7B\u578B`,
|
|
256
|
-
error
|
|
257
|
-
);
|
|
258
260
|
}
|
|
259
|
-
return "
|
|
261
|
+
return "http" /* HTTP */;
|
|
260
262
|
}
|
|
261
263
|
}
|
|
262
264
|
__name(inferTransportTypeFromUrl, "inferTransportTypeFromUrl");
|
|
263
|
-
function inferTransportTypeFromConfig(config) {
|
|
265
|
+
function inferTransportTypeFromConfig(config, serviceName) {
|
|
264
266
|
if (config.type) {
|
|
265
267
|
const normalizedConfig = TypeFieldNormalizer.normalizeTypeField(config);
|
|
266
268
|
return normalizedConfig;
|
|
@@ -273,7 +275,7 @@ function inferTransportTypeFromConfig(config) {
|
|
|
273
275
|
}
|
|
274
276
|
if (config.url !== void 0 && config.url !== null) {
|
|
275
277
|
const inferredType = inferTransportTypeFromUrl(config.url, {
|
|
276
|
-
serviceName
|
|
278
|
+
serviceName
|
|
277
279
|
});
|
|
278
280
|
return {
|
|
279
281
|
...config,
|
|
@@ -281,7 +283,7 @@ function inferTransportTypeFromConfig(config) {
|
|
|
281
283
|
};
|
|
282
284
|
}
|
|
283
285
|
throw new Error(
|
|
284
|
-
`\u65E0\u6CD5\u4E3A\u670D\u52A1 ${
|
|
286
|
+
`\u65E0\u6CD5\u4E3A\u670D\u52A1 ${serviceName || "\u672A\u77E5"} \u63A8\u65AD\u4F20\u8F93\u7C7B\u578B\u3002\u8BF7\u663E\u5F0F\u6307\u5B9A type \u5B57\u6BB5\uFF0C\u6216\u63D0\u4F9B command/url \u914D\u7F6E`
|
|
285
287
|
);
|
|
286
288
|
}
|
|
287
289
|
__name(inferTransportTypeFromConfig, "inferTransportTypeFromConfig");
|
|
@@ -342,6 +344,8 @@ var MCPConnection = class {
|
|
|
342
344
|
static {
|
|
343
345
|
__name(this, "MCPConnection");
|
|
344
346
|
}
|
|
347
|
+
name;
|
|
348
|
+
// 服务名称(独立字段)
|
|
345
349
|
config;
|
|
346
350
|
client = null;
|
|
347
351
|
transport = null;
|
|
@@ -350,8 +354,9 @@ var MCPConnection = class {
|
|
|
350
354
|
connectionTimeout = null;
|
|
351
355
|
initialized = false;
|
|
352
356
|
callbacks;
|
|
353
|
-
constructor(config, callbacks) {
|
|
354
|
-
this.
|
|
357
|
+
constructor(name, config, callbacks) {
|
|
358
|
+
this.name = name;
|
|
359
|
+
this.config = inferTransportTypeFromConfig(config, name);
|
|
355
360
|
this.callbacks = callbacks;
|
|
356
361
|
this.validateConfig();
|
|
357
362
|
}
|
|
@@ -359,7 +364,14 @@ var MCPConnection = class {
|
|
|
359
364
|
* 验证配置
|
|
360
365
|
*/
|
|
361
366
|
validateConfig() {
|
|
362
|
-
|
|
367
|
+
if (!this.name || typeof this.name !== "string") {
|
|
368
|
+
throw new Error("\u670D\u52A1\u540D\u79F0\u5FC5\u987B\u662F\u975E\u7A7A\u5B57\u7B26\u4E32");
|
|
369
|
+
}
|
|
370
|
+
const fullConfig = {
|
|
371
|
+
name: this.name,
|
|
372
|
+
...this.config
|
|
373
|
+
};
|
|
374
|
+
TransportFactory.validateConfig(fullConfig);
|
|
363
375
|
}
|
|
364
376
|
/**
|
|
365
377
|
* 连接到 MCP 服务
|
|
@@ -376,31 +388,33 @@ var MCPConnection = class {
|
|
|
376
388
|
*/
|
|
377
389
|
async attemptConnection() {
|
|
378
390
|
this.connectionState = "connecting" /* CONNECTING */;
|
|
379
|
-
console.debug(
|
|
380
|
-
`[MCP-${this.config.name}] \u6B63\u5728\u8FDE\u63A5 MCP \u670D\u52A1: ${this.config.name}`
|
|
381
|
-
);
|
|
382
391
|
return new Promise((resolve, reject) => {
|
|
392
|
+
const CONNECTION_TIMEOUT = 1e4;
|
|
383
393
|
this.connectionTimeout = setTimeout(() => {
|
|
384
|
-
const error = new Error(`\u8FDE\u63A5\u8D85\u65F6 (${
|
|
394
|
+
const error = new Error(`\u8FDE\u63A5\u8D85\u65F6 (${CONNECTION_TIMEOUT}ms)`);
|
|
385
395
|
this.handleConnectionError(error);
|
|
386
396
|
reject(error);
|
|
387
|
-
},
|
|
397
|
+
}, CONNECTION_TIMEOUT);
|
|
388
398
|
try {
|
|
389
399
|
this.client = new Client(
|
|
390
400
|
{
|
|
391
|
-
name: `xiaozhi-${this.
|
|
401
|
+
name: `xiaozhi-${this.name}-client`,
|
|
392
402
|
version: "1.0.0"
|
|
393
403
|
},
|
|
394
404
|
{
|
|
395
405
|
capabilities: {}
|
|
396
406
|
}
|
|
397
407
|
);
|
|
398
|
-
|
|
408
|
+
const fullConfig = {
|
|
409
|
+
name: this.name,
|
|
410
|
+
...this.config
|
|
411
|
+
};
|
|
412
|
+
this.transport = TransportFactory.create(fullConfig);
|
|
399
413
|
this.client.connect(this.transport).then(async () => {
|
|
400
414
|
this.handleConnectionSuccess();
|
|
401
415
|
await this.refreshTools();
|
|
402
416
|
this.callbacks?.onConnected?.({
|
|
403
|
-
serviceName: this.
|
|
417
|
+
serviceName: this.name,
|
|
404
418
|
tools: this.getTools(),
|
|
405
419
|
connectionTime: /* @__PURE__ */ new Date()
|
|
406
420
|
});
|
|
@@ -425,9 +439,6 @@ var MCPConnection = class {
|
|
|
425
439
|
}
|
|
426
440
|
this.connectionState = "connected" /* CONNECTED */;
|
|
427
441
|
this.initialized = true;
|
|
428
|
-
console.info(
|
|
429
|
-
`[MCP-${this.config.name}] MCP \u670D\u52A1 ${this.config.name} \u8FDE\u63A5\u5DF2\u5EFA\u7ACB`
|
|
430
|
-
);
|
|
431
442
|
}
|
|
432
443
|
/**
|
|
433
444
|
* 处理连接错误
|
|
@@ -435,14 +446,13 @@ var MCPConnection = class {
|
|
|
435
446
|
handleConnectionError(error) {
|
|
436
447
|
this.connectionState = "disconnected" /* DISCONNECTED */;
|
|
437
448
|
this.initialized = false;
|
|
438
|
-
console.debug(`MCP \u670D\u52A1 ${this.config.name} \u8FDE\u63A5\u9519\u8BEF:`, error.message);
|
|
439
449
|
if (this.connectionTimeout) {
|
|
440
450
|
clearTimeout(this.connectionTimeout);
|
|
441
451
|
this.connectionTimeout = null;
|
|
442
452
|
}
|
|
443
453
|
this.cleanupConnection();
|
|
444
454
|
this.callbacks?.onConnectionFailed?.({
|
|
445
|
-
serviceName: this.
|
|
455
|
+
serviceName: this.name,
|
|
446
456
|
error,
|
|
447
457
|
attempt: 0
|
|
448
458
|
});
|
|
@@ -480,14 +490,7 @@ var MCPConnection = class {
|
|
|
480
490
|
for (const tool of tools) {
|
|
481
491
|
this.tools.set(tool.name, tool);
|
|
482
492
|
}
|
|
483
|
-
console.debug(
|
|
484
|
-
`${this.config.name} \u670D\u52A1\u52A0\u8F7D\u4E86 ${tools.length} \u4E2A\u5DE5\u5177: ${tools.map((t) => t.name).join(", ")}`
|
|
485
|
-
);
|
|
486
493
|
} catch (error) {
|
|
487
|
-
console.error(
|
|
488
|
-
`${this.config.name} \u83B7\u53D6\u5DE5\u5177\u5217\u8868\u5931\u8D25:`,
|
|
489
|
-
error instanceof Error ? error.message : String(error)
|
|
490
|
-
);
|
|
491
494
|
throw error;
|
|
492
495
|
}
|
|
493
496
|
}
|
|
@@ -495,11 +498,10 @@ var MCPConnection = class {
|
|
|
495
498
|
* 断开连接
|
|
496
499
|
*/
|
|
497
500
|
async disconnect() {
|
|
498
|
-
console.info(`\u4E3B\u52A8\u65AD\u5F00 MCP \u670D\u52A1 ${this.config.name} \u8FDE\u63A5`);
|
|
499
501
|
this.cleanupConnection();
|
|
500
502
|
this.connectionState = "disconnected" /* DISCONNECTED */;
|
|
501
503
|
this.callbacks?.onDisconnected?.({
|
|
502
|
-
serviceName: this.
|
|
504
|
+
serviceName: this.name,
|
|
503
505
|
reason: "\u624B\u52A8\u65AD\u5F00",
|
|
504
506
|
disconnectionTime: /* @__PURE__ */ new Date()
|
|
505
507
|
});
|
|
@@ -515,30 +517,18 @@ var MCPConnection = class {
|
|
|
515
517
|
*/
|
|
516
518
|
async callTool(name, arguments_) {
|
|
517
519
|
if (!this.client) {
|
|
518
|
-
throw new Error(`\u670D\u52A1 ${this.
|
|
520
|
+
throw new Error(`\u670D\u52A1 ${this.name} \u672A\u8FDE\u63A5`);
|
|
519
521
|
}
|
|
520
522
|
if (!this.tools.has(name)) {
|
|
521
|
-
throw new Error(`\u5DE5\u5177 ${name} \u5728\u670D\u52A1 ${this.
|
|
523
|
+
throw new Error(`\u5DE5\u5177 ${name} \u5728\u670D\u52A1 ${this.name} \u4E2D\u4E0D\u5B58\u5728`);
|
|
522
524
|
}
|
|
523
|
-
console.debug(
|
|
524
|
-
`\u8C03\u7528 ${this.config.name} \u670D\u52A1\u7684\u5DE5\u5177 ${name}\uFF0C\u53C2\u6570:`,
|
|
525
|
-
JSON.stringify(arguments_)
|
|
526
|
-
);
|
|
527
525
|
try {
|
|
528
526
|
const result = await this.client.callTool({
|
|
529
527
|
name,
|
|
530
528
|
arguments: arguments_ || {}
|
|
531
529
|
});
|
|
532
|
-
console.debug(
|
|
533
|
-
`\u5DE5\u5177 ${name} \u8C03\u7528\u6210\u529F\uFF0C\u7ED3\u679C:`,
|
|
534
|
-
`${JSON.stringify(result).substring(0, 500)}...`
|
|
535
|
-
);
|
|
536
530
|
return result;
|
|
537
531
|
} catch (error) {
|
|
538
|
-
console.error(
|
|
539
|
-
`\u5DE5\u5177 ${name} \u8C03\u7528\u5931\u8D25:`,
|
|
540
|
-
error instanceof Error ? error.message : String(error)
|
|
541
|
-
);
|
|
542
532
|
throw error;
|
|
543
533
|
}
|
|
544
534
|
}
|
|
@@ -546,17 +536,20 @@ var MCPConnection = class {
|
|
|
546
536
|
* 获取服务配置
|
|
547
537
|
*/
|
|
548
538
|
getConfig() {
|
|
549
|
-
return
|
|
539
|
+
return {
|
|
540
|
+
name: this.name,
|
|
541
|
+
...this.config
|
|
542
|
+
};
|
|
550
543
|
}
|
|
551
544
|
/**
|
|
552
545
|
* 获取服务状态
|
|
553
546
|
*/
|
|
554
547
|
getStatus() {
|
|
555
548
|
return {
|
|
556
|
-
name: this.
|
|
549
|
+
name: this.name,
|
|
557
550
|
connected: this.connectionState === "connected" /* CONNECTED */,
|
|
558
551
|
initialized: this.initialized,
|
|
559
|
-
transportType: this.config.type || "
|
|
552
|
+
transportType: this.config.type || "http" /* HTTP */,
|
|
560
553
|
toolCount: this.tools.size,
|
|
561
554
|
connectionState: this.connectionState
|
|
562
555
|
};
|
|
@@ -608,21 +601,18 @@ var MCPManager = class extends EventEmitter {
|
|
|
608
601
|
if (this.configs.has(name)) {
|
|
609
602
|
throw new Error(`\u670D\u52A1 ${name} \u5DF2\u5B58\u5728`);
|
|
610
603
|
}
|
|
611
|
-
const
|
|
612
|
-
...config,
|
|
613
|
-
name
|
|
614
|
-
};
|
|
604
|
+
const normalizedConfig = { ...config };
|
|
615
605
|
if (config.type) {
|
|
616
606
|
const typeStr = String(config.type);
|
|
617
607
|
if (typeStr === "http") {
|
|
618
|
-
|
|
608
|
+
normalizedConfig.type = "http" /* HTTP */;
|
|
619
609
|
} else if (typeStr === "sse") {
|
|
620
|
-
|
|
610
|
+
normalizedConfig.type = "sse" /* SSE */;
|
|
621
611
|
} else {
|
|
622
|
-
|
|
612
|
+
normalizedConfig.type = config.type;
|
|
623
613
|
}
|
|
624
614
|
}
|
|
625
|
-
this.configs.set(name,
|
|
615
|
+
this.configs.set(name, normalizedConfig);
|
|
626
616
|
}
|
|
627
617
|
/**
|
|
628
618
|
* 移除服务器配置
|
|
@@ -645,7 +635,7 @@ var MCPManager = class extends EventEmitter {
|
|
|
645
635
|
const promises = Array.from(this.configs.entries()).map(
|
|
646
636
|
async ([name, config]) => {
|
|
647
637
|
try {
|
|
648
|
-
const connection = new MCPConnection(config, {
|
|
638
|
+
const connection = new MCPConnection(name, config, {
|
|
649
639
|
onConnected: /* @__PURE__ */ __name((data) => {
|
|
650
640
|
this.emit("connected", {
|
|
651
641
|
serverName: data.serviceName,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/connection.ts","../src/transport-factory.ts","../src/utils/type-normalizer.ts","../src/utils/validators.ts","../src/manager.ts"],"sourcesContent":["/**\n * MCP 核心库类型定义\n * 统一管理所有 MCP 相关的类型定义\n */\n\nimport type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport type { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport type { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\n\n// =========================\n// 1. 基础传输类型\n// =========================\n\n/**\n * MCP 传输层联合类型定义\n * 支持 STDIO、SSE、StreamableHTTP 三种传输协议\n */\nexport type MCPServerTransport =\n | StdioClientTransport\n | SSEClientTransport\n | StreamableHTTPClientTransport;\n\n/**\n * 通信方式枚举\n * 定义 MCP 支持的传输类型\n */\nexport enum MCPTransportType {\n STDIO = \"stdio\",\n SSE = \"sse\",\n STREAMABLE_HTTP = \"streamable-http\",\n}\n\n// =========================\n// 1.1 事件回调接口\n// =========================\n\n/**\n * MCP 服务事件回调接口\n * 用于替代 EventBus 依赖,提供灵活的事件处理机制\n */\nexport interface MCPServiceEventCallbacks {\n /** 连接成功回调 */\n onConnected?: (data: {\n serviceName: string;\n tools: Tool[];\n connectionTime: Date;\n }) => void;\n /** 断开连接回调 */\n onDisconnected?: (data: {\n serviceName: string;\n reason?: string;\n disconnectionTime: Date;\n }) => void;\n /** 连接失败回调 */\n onConnectionFailed?: (data: {\n serviceName: string;\n error: Error;\n attempt: number;\n }) => void;\n}\n\n// =========================\n// 2. 配置接口类型\n// =========================\n\n/**\n * ModelScope SSE 自定义选项接口\n */\nexport interface ModelScopeSSEOptions {\n eventSourceInit?: {\n fetch?: (\n url: string | URL | Request,\n init?: RequestInit\n ) => Promise<Response>;\n };\n requestInit?: RequestInit;\n}\n\n/**\n * MCP 服务配置接口\n * 包含所有 MCP 服务的配置选项\n */\nexport interface MCPServiceConfig {\n name: string;\n type?: MCPTransportType; // 现在是可选的,支持自动推断\n // stdio 配置\n command?: string;\n args?: string[];\n env?: Record<string, string>; // 环境变量配置\n // 网络配置\n url?: string;\n // 认证配置\n apiKey?: string;\n headers?: Record<string, string>;\n // ModelScope 特有配置\n modelScopeAuth?: boolean;\n customSSEOptions?: ModelScopeSSEOptions;\n // 超时配置\n timeout?: number;\n // 重试配置\n retryAttempts?: number;\n}\n\n// =========================\n// 3. 状态枚举类型\n// =========================\n\n/**\n * 连接状态枚举\n */\nexport enum ConnectionState {\n DISCONNECTED = \"disconnected\",\n CONNECTING = \"connecting\",\n CONNECTED = \"connected\",\n RECONNECTING = \"reconnecting\",\n FAILED = \"failed\",\n ERROR = \"error\",\n}\n\n/**\n * MCP 服务状态接口\n */\nexport interface MCPServiceStatus {\n name: string;\n connected: boolean;\n initialized: boolean;\n transportType: MCPTransportType;\n toolCount: number;\n lastError?: string;\n connectionState: ConnectionState;\n}\n\n// =========================\n// 4. 工具调用相关类型\n// =========================\n\n/**\n * 工具调用结果接口\n */\nexport interface ToolCallResult {\n content: Array<{\n type: string;\n text: string;\n }>;\n isError?: boolean;\n}\n\n/**\n * JSON Schema 类型定义\n */\nexport type JSONSchema =\n | (Record<string, unknown> & {\n type: \"object\";\n properties?: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n })\n | Record<string, unknown>;\n\n/**\n * 类型守卫:检查对象是否为有效的 MCP Tool JSON Schema\n */\nexport function isValidToolJSONSchema(obj: unknown): obj is {\n type: \"object\";\n properties?: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n} {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"type\" in obj &&\n (obj as { type?: unknown }).type === \"object\"\n );\n}\n\n/**\n * 确保对象符合 MCP Tool JSON Schema 格式\n */\nexport function ensureToolJSONSchema(schema: JSONSchema): {\n type: \"object\";\n properties?: Record<string, object>;\n required?: string[];\n additionalProperties?: boolean;\n} {\n if (isValidToolJSONSchema(schema)) {\n return schema as {\n type: \"object\";\n properties?: Record<string, object>;\n required?: string[];\n additionalProperties?: boolean;\n };\n }\n\n return {\n type: \"object\",\n properties: {} as Record<string, object>,\n required: [],\n additionalProperties: true,\n };\n}\n\n/**\n * CustomMCP 工具类型定义\n */\nexport interface CustomMCPTool {\n name: string;\n description?: string;\n inputSchema: JSONSchema;\n handler?: {\n type: string;\n config?: Record<string, unknown>;\n };\n}\n\n/**\n * 工具信息接口\n */\nexport interface ToolInfo {\n serviceName: string;\n originalName: string;\n tool: Tool;\n}\n\n// =========================\n// 5. 增强工具信息类型\n// =========================\n\n/**\n * 工具状态过滤选项\n */\nexport type ToolStatusFilter = \"enabled\" | \"disabled\" | \"all\";\n\n/**\n * 增强的工具信息接口\n */\nexport interface EnhancedToolInfo {\n /** 工具唯一标识符,格式为 \"{serviceName}__{originalName}\" */\n name: string;\n /** 工具描述信息 */\n description: string;\n /** 工具输入参数的 JSON Schema 定义 */\n inputSchema: JSONSchema;\n /** 工具所属的 MCP 服务名称 */\n serviceName: string;\n /** 工具在 MCP 服务中的原始名称 */\n originalName: string;\n /** 工具是否启用 */\n enabled: boolean;\n /** 工具使用次数统计 */\n usageCount: number;\n /** 工具最后使用时间 */\n lastUsedTime: string;\n}\n\n// =========================\n// 6. 服务器配置类型\n// =========================\n\n/**\n * 统一服务器配置接口\n */\nexport interface UnifiedServerConfig {\n name?: string;\n enableLogging?: boolean;\n logLevel?: string;\n configs?: Record<string, MCPServiceConfig>;\n}\n\n/**\n * 统一服务器状态接口\n */\nexport interface UnifiedServerStatus {\n isRunning: boolean;\n serviceStatus: ManagerStatus;\n transportCount: number;\n activeConnections: number;\n config: UnifiedServerConfig;\n services?: Record<string, MCPServiceConnectionStatus>;\n totalTools?: number;\n availableTools?: string[];\n}\n\n// =========================\n// 7. 管理器相关类型\n// =========================\n\n/**\n * MCP 服务连接状态接口\n */\nexport interface MCPServiceConnectionStatus {\n connected: boolean;\n clientName: string;\n}\n\n/**\n * 管理器状态接口\n */\nexport interface ManagerStatus {\n services: Record<string, MCPServiceConnectionStatus>;\n totalTools: number;\n availableTools: string[];\n}\n\n// =========================\n// 8. 参数校验相关类型\n// =========================\n\n/**\n * 工具调用参数接口\n */\nexport interface ToolCallParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\n/**\n * 验证后的工具调用参数\n */\nexport interface ValidatedToolCallParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\n/**\n * 工具调用验证选项\n */\nexport interface ToolCallValidationOptions {\n validateName?: boolean;\n validateArguments?: boolean;\n allowEmptyArguments?: boolean;\n customValidator?: (params: ToolCallParams) => string | null;\n}\n\n/**\n * 工具调用错误码枚举\n */\nexport enum ToolCallErrorCode {\n INVALID_PARAMS = -32602,\n TOOL_NOT_FOUND = -32601,\n SERVICE_UNAVAILABLE = -32001,\n TIMEOUT = -32002,\n TOOL_EXECUTION_ERROR = -32000,\n}\n\n/**\n * 工具调用错误类\n */\nexport class ToolCallError extends Error {\n constructor(\n public code: ToolCallErrorCode,\n message: string,\n public data?: unknown\n ) {\n super(message);\n this.name = \"ToolCallError\";\n }\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { MCPServerTransport, MCPServiceConfig, MCPServiceStatus, ToolCallResult } from \"./types.js\";\nimport { ConnectionState, MCPTransportType } from \"./types.js\";\nimport { TransportFactory } from \"./transport-factory.js\";\nimport { inferTransportTypeFromConfig } from \"./utils/index.js\";\n\n/**\n * MCP 连接类\n * 负责管理单个 MCP 服务的连接、工具管理和调用\n */\nexport class MCPConnection {\n private config: MCPServiceConfig;\n private client: Client | null = null;\n private transport: MCPServerTransport | null = null;\n private tools: Map<string, Tool> = new Map();\n private connectionState: ConnectionState = ConnectionState.DISCONNECTED;\n private connectionTimeout: NodeJS.Timeout | null = null;\n private initialized = false;\n private callbacks?: import(\"./types.js\").MCPServiceEventCallbacks;\n\n constructor(\n config: MCPServiceConfig,\n callbacks?: import(\"./types.js\").MCPServiceEventCallbacks\n ) {\n // 使用工具方法推断服务类型\n this.config = inferTransportTypeFromConfig(config);\n this.callbacks = callbacks;\n\n // 验证配置\n this.validateConfig();\n }\n\n /**\n * 验证配置\n */\n private validateConfig(): void {\n // 使用 TransportFactory 进行配置验证\n TransportFactory.validateConfig(this.config);\n }\n\n /**\n * 连接到 MCP 服务\n */\n async connect(): Promise<void> {\n // 如果正在连接中,等待当前连接完成\n if (this.connectionState === ConnectionState.CONNECTING) {\n throw new Error(\"连接正在进行中,请等待连接完成\");\n }\n\n // 清理之前的连接\n this.cleanupConnection();\n\n return this.attemptConnection();\n }\n\n /**\n * 尝试建立连接\n */\n private async attemptConnection(): Promise<void> {\n this.connectionState = ConnectionState.CONNECTING;\n console.debug(\n `[MCP-${this.config.name}] 正在连接 MCP 服务: ${this.config.name}`\n );\n\n return new Promise((resolve, reject) => {\n // 设置连接超时\n this.connectionTimeout = setTimeout(() => {\n const error = new Error(`连接超时 (${this.config.timeout || 10000}ms)`);\n this.handleConnectionError(error);\n reject(error);\n }, this.config.timeout || 10000);\n\n try {\n this.client = new Client(\n {\n name: `xiaozhi-${this.config.name}-client`,\n version: \"1.0.0\",\n },\n {\n capabilities: {},\n }\n );\n\n // 使用 TransportFactory 创建传输层\n this.transport = TransportFactory.create(this.config);\n\n // 连接到 MCP 服务\n this.client\n .connect(this.transport as MCPServerTransport)\n .then(async () => {\n this.handleConnectionSuccess();\n\n // 获取工具列表\n await this.refreshTools();\n\n // 发射连接成功事件\n this.callbacks?.onConnected?.({\n serviceName: this.config.name,\n tools: this.getTools(),\n connectionTime: new Date(),\n });\n\n resolve();\n })\n .catch((error) => {\n this.handleConnectionError(error);\n reject(error);\n });\n } catch (error) {\n this.handleConnectionError(error as Error);\n reject(error);\n }\n });\n }\n\n /**\n * 处理连接成功\n */\n private handleConnectionSuccess(): void {\n // 清理连接超时定时器\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = null;\n }\n\n this.connectionState = ConnectionState.CONNECTED;\n this.initialized = true;\n\n console.info(\n `[MCP-${this.config.name}] MCP 服务 ${this.config.name} 连接已建立`\n );\n }\n\n /**\n * 处理连接错误\n */\n private handleConnectionError(error: Error): void {\n this.connectionState = ConnectionState.DISCONNECTED;\n this.initialized = false;\n\n console.debug(`MCP 服务 ${this.config.name} 连接错误:`, error.message);\n\n // 清理连接超时定时器\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = null;\n }\n\n // 清理当前连接\n this.cleanupConnection();\n\n // 发射连接失败事件\n this.callbacks?.onConnectionFailed?.({\n serviceName: this.config.name,\n error,\n attempt: 0,\n });\n }\n\n /**\n * 清理连接资源\n */\n private cleanupConnection(): void {\n // 清理客户端\n if (this.client) {\n try {\n this.client.close().catch(() => {\n // 忽略关闭时的错误\n });\n } catch (error) {\n // 忽略关闭时的错误\n }\n this.client = null;\n }\n\n // 清理传输层\n this.transport = null;\n\n // 清理连接超时定时器\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = null;\n }\n\n // 重置状态\n this.initialized = false;\n }\n\n /**\n * 刷新工具列表\n */\n private async refreshTools(): Promise<void> {\n if (!this.client) {\n throw new Error(\"客户端未初始化\");\n }\n\n try {\n const toolsResult = await this.client.listTools();\n const tools: Tool[] = toolsResult.tools || [];\n\n // 清空现有工具\n this.tools.clear();\n\n // 注册工具到映射表\n for (const tool of tools) {\n this.tools.set(tool.name, tool);\n }\n\n console.debug(\n `${this.config.name} 服务加载了 ${tools.length} 个工具: ${tools\n .map((t) => t.name)\n .join(\", \")}`\n );\n } catch (error) {\n console.error(\n `${this.config.name} 获取工具列表失败:`,\n error instanceof Error ? error.message : String(error)\n );\n throw error;\n }\n }\n\n /**\n * 断开连接\n */\n async disconnect(): Promise<void> {\n console.info(`主动断开 MCP 服务 ${this.config.name} 连接`);\n\n // 清理连接资源\n this.cleanupConnection();\n\n // 设置状态为已断开\n this.connectionState = ConnectionState.DISCONNECTED;\n\n // 发射断开连接事件\n this.callbacks?.onDisconnected?.({\n serviceName: this.config.name,\n reason: \"手动断开\",\n disconnectionTime: new Date(),\n });\n }\n\n /**\n * 获取工具列表\n */\n getTools(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * 调用工具\n */\n async callTool(\n name: string,\n arguments_: Record<string, unknown>\n ): Promise<ToolCallResult> {\n if (!this.client) {\n throw new Error(`服务 ${this.config.name} 未连接`);\n }\n\n if (!this.tools.has(name)) {\n throw new Error(`工具 ${name} 在服务 ${this.config.name} 中不存在`);\n }\n\n console.debug(\n `调用 ${this.config.name} 服务的工具 ${name},参数:`,\n JSON.stringify(arguments_)\n );\n\n try {\n const result = await this.client.callTool({\n name,\n arguments: arguments_ || {},\n });\n\n console.debug(\n `工具 ${name} 调用成功,结果:`,\n `${JSON.stringify(result).substring(0, 500)}...`\n );\n\n return result as ToolCallResult;\n } catch (error) {\n console.error(\n `工具 ${name} 调用失败:`,\n error instanceof Error ? error.message : String(error)\n );\n throw error;\n }\n }\n\n /**\n * 获取服务配置\n */\n getConfig(): MCPServiceConfig {\n return this.config;\n }\n\n /**\n * 获取服务状态\n */\n getStatus(): MCPServiceStatus {\n return {\n name: this.config.name,\n connected: this.connectionState === ConnectionState.CONNECTED,\n initialized: this.initialized,\n transportType: this.config.type || MCPTransportType.STREAMABLE_HTTP,\n toolCount: this.tools.size,\n connectionState: this.connectionState,\n };\n }\n\n /**\n * 检查是否已连接\n */\n isConnected(): boolean {\n return (\n this.connectionState === ConnectionState.CONNECTED && this.initialized\n );\n }\n}\n","import type { MCPServerTransport, MCPServiceConfig } from \"./types.js\";\nimport { MCPTransportType } from \"./types.js\";\nimport type { SSEClientTransportOptions } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport type { StreamableHTTPClientTransportOptions } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { EventSource } from \"eventsource\";\n\n// 全局 polyfill EventSource(用于 SSE)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst globalThisAny: any = typeof globalThis !== \"undefined\" ? globalThis : global;\nif (\n typeof globalThisAny !== \"undefined\" &&\n !globalThisAny.EventSource\n) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n globalThisAny.EventSource = EventSource;\n}\n\n// Transport 基础接口\nexport interface Transport {\n connect?(): Promise<void>;\n close?(): Promise<void>;\n}\n\n/**\n * 创建 transport 实例\n * @param config MCP 服务配置\n * @returns transport 实例\n */\nexport function createTransport(config: MCPServiceConfig): MCPServerTransport {\n console.debug(\n `[TransportFactory] 创建 ${config.type} transport for ${config.name}`\n );\n\n switch (config.type) {\n case MCPTransportType.STDIO:\n return createStdioTransport(config);\n\n case MCPTransportType.SSE:\n return createSSETransport(config);\n\n case MCPTransportType.STREAMABLE_HTTP:\n return createStreamableHTTPTransport(config);\n\n default:\n throw new Error(`不支持的传输类型: ${config.type}`);\n }\n}\n\n/**\n * 创建 Stdio transport\n */\nfunction createStdioTransport(config: MCPServiceConfig): StdioClientTransport {\n if (!config.command) {\n throw new Error(\"stdio transport 需要 command 配置\");\n }\n\n return new StdioClientTransport({\n command: config.command,\n args: config.args || [],\n env: config.env, // 传递环境变量\n });\n}\n\n/**\n * 创建 SSE transport\n */\nfunction createSSETransport(config: MCPServiceConfig): SSEClientTransport {\n if (!config.url) {\n throw new Error(\"SSE transport 需要 URL 配置\");\n }\n\n const url = new URL(config.url);\n const options = createSSEOptions(config);\n\n return new SSEClientTransport(url, options);\n}\n\nfunction createStreamableHTTPTransport(\n config: MCPServiceConfig\n): StreamableHTTPClientTransport {\n if (!config.url) {\n throw new Error(\"StreamableHTTP transport 需要 URL 配置\");\n }\n\n const url = new URL(config.url);\n const options = createStreamableHTTPOptions(config);\n return new StreamableHTTPClientTransport(url, options);\n}\n\n/**\n * 创建 SSE 选项\n */\nfunction createSSEOptions(config: MCPServiceConfig): SSEClientTransportOptions {\n const options: SSEClientTransportOptions = {};\n\n // 添加认证头\n if (config.apiKey) {\n options.requestInit = {\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n ...config.headers,\n },\n };\n } else if (config.headers) {\n options.requestInit = {\n headers: config.headers,\n };\n }\n\n return options;\n}\n\nfunction createStreamableHTTPOptions(\n config: MCPServiceConfig\n): StreamableHTTPClientTransportOptions {\n const options: StreamableHTTPClientTransportOptions = {};\n\n // 添加认证头\n if (config.apiKey) {\n options.requestInit = {\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n ...config.headers,\n },\n };\n } else if (config.headers) {\n options.requestInit = {\n headers: config.headers,\n };\n }\n\n return options;\n}\n\n/**\n * 验证配置\n */\nexport function validateConfig(config: MCPServiceConfig): void {\n if (!config.name || typeof config.name !== \"string\") {\n throw new Error(\"配置必须包含有效的 name 字段\");\n }\n\n // type 字段现在是可选的,由 MCPService 自动推断\n // 这里我们只验证如果 type 存在,必须是有效的类型\n if (config.type && !Object.values(MCPTransportType).includes(config.type)) {\n throw new Error(`不支持的传输类型: ${config.type}`);\n }\n\n // 注意:这个验证方法在 MCPService.inferTransportType 之后调用\n // 此时 config.type 应该已经被推断或显式设置\n if (!config.type) {\n throw new Error(\"传输类型未设置,这应该在 inferTransportType 中处理\");\n }\n\n switch (config.type) {\n case MCPTransportType.STDIO:\n if (!config.command) {\n throw new Error(\"stdio 类型需要 command 字段\");\n }\n break;\n\n case MCPTransportType.SSE:\n if (config.url === undefined || config.url === null) {\n throw new Error(`${config.type} 类型需要 url 字段`);\n }\n break;\n case MCPTransportType.STREAMABLE_HTTP:\n // STREAMABLE_HTTP 允许空 URL,会在后续处理中设置默认值\n if (config.url === undefined || config.url === null) {\n throw new Error(`${config.type} 类型需要 url 字段`);\n }\n break;\n\n default:\n throw new Error(`不支持的传输类型: ${config.type}`);\n }\n}\n\n/**\n * 获取支持的传输类型列表\n */\nexport function getSupportedTypes(): MCPTransportType[] {\n return [\n MCPTransportType.STDIO,\n MCPTransportType.SSE,\n MCPTransportType.STREAMABLE_HTTP,\n ];\n}\n\n/**\n * Transport 工厂对象(保持 API 兼容性)\n */\nexport const TransportFactory = {\n create: createTransport,\n validateConfig,\n getSupportedTypes,\n};\n","/**\n * MCP 服务器配置 Type 字段标准化工具\n * 支持将各种 type 字段格式转换为标准的中划线格式\n */\n\n/**\n * MCP 服务器配置的基础接口\n * 定义包含可选 type 字段的配置对象结构\n */\nexport interface MCPBaseConfig {\n type?: string;\n [key: string]: unknown; // 允许其他配置属性\n}\n\n/**\n * MCP 服务器配置 Type 字段标准化工具类\n */\nexport namespace TypeFieldNormalizer {\n /**\n * 标准化type字段格式\n * 支持将各种格式转换为标准的中划线格式\n */\n // 函数重载:泛型版本,用于类型安全的调用\n export function normalizeTypeField<T extends MCPBaseConfig>(config: T): T;\n\n // 函数重载:向后兼容版本,用于 unknown 类型输入\n export function normalizeTypeField(config: unknown): unknown;\n\n // 统一实现\n export function normalizeTypeField<T extends MCPBaseConfig>(\n config: T | unknown\n ): T | unknown {\n if (!config || typeof config !== \"object\") {\n return config;\n }\n\n // 创建配置的深拷贝以避免修改原始对象\n const normalizedConfig = JSON.parse(JSON.stringify(config));\n\n // 如果配置中没有type字段,直接返回\n if (!(\"type\" in normalizedConfig)) {\n return normalizedConfig;\n }\n\n const originalType = normalizedConfig.type;\n\n // 如果已经是标准格式,直接返回\n if (originalType === \"sse\" || originalType === \"streamable-http\") {\n return normalizedConfig;\n }\n\n // 转换为标准格式\n let normalizedType: string;\n\n if (\n originalType === \"streamableHttp\" ||\n originalType === \"streamable_http\"\n ) {\n normalizedType = \"streamable-http\";\n } else if (originalType === \"s_se\" || originalType === \"s-se\") {\n normalizedType = \"sse\";\n } else {\n // 对于其他格式,尝试智能转换\n normalizedType = convertToKebabCase(originalType);\n }\n\n // 验证转换后的类型是否有效\n if (normalizedType === \"sse\" || normalizedType === \"streamable-http\") {\n normalizedConfig.type = normalizedType;\n // 记录转换日志(如果有的话)\n if (originalType !== normalizedType) {\n // 可以在需要时添加日志记录\n }\n }\n\n return normalizedConfig;\n }\n\n /**\n * 将字符串转换为kebab-case格式\n */\n function convertToKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\") // 驼峰转中划线\n .replace(/_/g, \"-\") // 下划线转中划线\n .toLowerCase(); // 转小写\n }\n}\n\n/**\n * 导出便捷函数\n */\nexport function normalizeTypeField<T extends MCPBaseConfig>(\n config: T\n): T;\nexport function normalizeTypeField(config: unknown): unknown;\nexport function normalizeTypeField<T extends MCPBaseConfig>(\n config: T | unknown\n): T | unknown {\n return TypeFieldNormalizer.normalizeTypeField(config);\n}\n","import { MCPTransportType, ToolCallError, ToolCallErrorCode } from \"../types.js\";\nimport { TypeFieldNormalizer } from \"./type-normalizer.js\";\nimport type {\n MCPServiceConfig,\n ToolCallParams,\n ToolCallValidationOptions,\n ValidatedToolCallParams,\n} from \"../types.js\";\n\n/**\n * 根据 URL 路径推断传输类型\n * 基于路径末尾推断,支持包含多个 / 的复杂路径\n *\n * @param url - 要推断的 URL\n * @param options - 可选配置项\n * @returns 推断出的传输类型\n */\nexport function inferTransportTypeFromUrl(\n url: string,\n options?: {\n serviceName?: string;\n }\n): MCPTransportType {\n try {\n const parsedUrl = new URL(url);\n const pathname = parsedUrl.pathname;\n\n // 检查路径末尾\n if (pathname.endsWith(\"/sse\")) {\n return MCPTransportType.SSE;\n }\n if (pathname.endsWith(\"/mcp\")) {\n return MCPTransportType.STREAMABLE_HTTP;\n }\n\n // 默认类型 - 使用 console 输出\n if (options?.serviceName) {\n console.info(\n `[MCP-${options.serviceName}] URL 路径 ${pathname} 不匹配特定规则,默认推断为 streamable-http 类型`\n );\n }\n return MCPTransportType.STREAMABLE_HTTP;\n } catch (error) {\n if (options?.serviceName) {\n console.warn(\n `[MCP-${options.serviceName}] URL 解析失败,默认推断为 streamable-http 类型`,\n error\n );\n }\n return MCPTransportType.STREAMABLE_HTTP;\n }\n}\n\n/**\n * 完整的配置类型推断(包括 command 字段)\n *\n * @param config - MCP 服务配置\n * @returns 完整的配置对象,包含推断出的类型\n */\nexport function inferTransportTypeFromConfig(\n config: MCPServiceConfig\n): MCPServiceConfig {\n // 如果已显式指定类型,先标准化然后返回\n if (config.type) {\n const normalizedConfig = TypeFieldNormalizer.normalizeTypeField(config);\n return normalizedConfig as MCPServiceConfig;\n }\n\n // 基于 command 字段推断\n if (config.command) {\n return {\n ...config,\n type: MCPTransportType.STDIO,\n };\n }\n\n // 基于 URL 字段推断(排除 null 和 undefined)\n if (config.url !== undefined && config.url !== null) {\n const inferredType = inferTransportTypeFromUrl(config.url, {\n serviceName: config.name,\n });\n return {\n ...config,\n type: inferredType,\n };\n }\n\n throw new Error(\n `无法为服务 ${config.name} 推断传输类型。请显式指定 type 字段,或提供 command/url 配置`\n );\n}\n\n// =========================\n// 参数校验工具函数\n// =========================\n\n/**\n * 验证工具调用参数\n * 对传入的参数进行完整性和格式验证\n *\n * @param params 待验证的参数\n * @param options 验证选项\n * @returns 验证后的参数\n * @throws ToolCallError 验证失败时抛出\n */\nexport function validateToolCallParams(\n params: unknown,\n options?: ToolCallValidationOptions\n): ValidatedToolCallParams {\n const opts = {\n validateName: true,\n validateArguments: true,\n allowEmptyArguments: true,\n ...options,\n };\n\n // 1. 验证参数必须是对象\n if (!params || typeof params !== \"object\") {\n throw new ToolCallError(\n ToolCallErrorCode.INVALID_PARAMS,\n \"请求参数必须是对象\"\n );\n }\n\n const paramsObj = params as Record<string, unknown>;\n\n // 2. 验证工具名称\n if (opts.validateName) {\n if (!paramsObj.name || typeof paramsObj.name !== \"string\") {\n throw new ToolCallError(\n ToolCallErrorCode.INVALID_PARAMS,\n \"工具名称必须是非空字符串\"\n );\n }\n }\n\n // 3. 验证工具参数格式\n if (\n opts.validateArguments &&\n paramsObj.arguments !== undefined &&\n paramsObj.arguments !== null\n ) {\n if (\n typeof paramsObj.arguments !== \"object\" ||\n Array.isArray(paramsObj.arguments)\n ) {\n throw new ToolCallError(\n ToolCallErrorCode.INVALID_PARAMS,\n \"工具参数必须是对象\"\n );\n }\n }\n\n // 4. 验证是否允许空参数\n if (\n !opts.allowEmptyArguments &&\n paramsObj.arguments !== undefined &&\n paramsObj.arguments !== null\n ) {\n const argsObj = paramsObj.arguments as Record<string, unknown>;\n if (Object.keys(argsObj).length === 0) {\n throw new ToolCallError(\n ToolCallErrorCode.INVALID_PARAMS,\n \"工具参数不能为空\"\n );\n }\n }\n\n // 5. 执行自定义验证\n if (opts.customValidator) {\n const error = opts.customValidator(paramsObj as unknown as ToolCallParams);\n if (error) {\n throw new ToolCallError(ToolCallErrorCode.INVALID_PARAMS, error);\n }\n }\n\n return {\n name: paramsObj.name as string,\n arguments: paramsObj.arguments as Record<string, unknown>,\n };\n}\n","/**\n * MCP 服务管理器\n * 提供简洁的 API 来管理多个 MCP 服务\n */\n\nimport { EventEmitter } from \"node:events\";\nimport { MCPConnection } from \"./connection.js\";\nimport type { MCPServiceConfig, ToolCallResult } from \"./types.js\";\nimport { MCPTransportType } from \"./types.js\";\n\n/**\n * 用户友好的传输类型\n * 用于简化和标准化用户输入\n */\ntype UserFriendlyTransportType =\n | \"stdio\"\n | \"sse\"\n | \"http\"\n | MCPTransportType;\n\n/**\n * MCP 服务管理器\n * 提供简洁的 API 来管理多个 MCP 服务\n *\n * @example\n * ```typescript\n * const manager = new MCPManager();\n *\n * // 添加服务\n * manager.addServer('datetime', {\n * type: 'stdio',\n * command: 'node',\n * args: ['datetime.js']\n * });\n *\n * // 连接所有服务\n * await manager.connect();\n *\n * // 调用工具\n * const result = await manager.callTool('datetime', 'get_current_time', {\n * format: 'YYYY-MM-DD HH:mm:ss'\n * });\n *\n * // 断开连接\n * await manager.disconnect();\n * ```\n */\nexport class MCPManager extends EventEmitter {\n private connections: Map<string, MCPConnection> = new Map();\n private configs: Map<string, MCPServiceConfig> = new Map();\n\n constructor() {\n super();\n }\n\n /**\n * 添加 MCP 服务器配置\n * @param name 服务器名称\n * @param config 服务器配置\n *\n * @example\n * ```typescript\n * // 添加 stdio 服务\n * manager.addServer('calculator', {\n * type: 'stdio',\n * command: 'node',\n * args: ['calculator.js']\n * });\n *\n * // 添加 HTTP 服务\n * manager.addServer('web-search', {\n * type: 'http',\n * url: 'https://api.example.com/mcp',\n * headers: {\n * Authorization: 'Bearer your-api-key'\n * }\n * });\n * ```\n */\n addServer(\n name: string,\n config: Omit<MCPServiceConfig, \"name\"> & {\n type?: UserFriendlyTransportType;\n }\n ): void {\n if (this.configs.has(name)) {\n throw new Error(`服务 ${name} 已存在`);\n }\n\n const fullConfig: MCPServiceConfig = {\n ...config,\n name,\n };\n\n // 标准化 type 字段 - 将用户友好的类型映射到实际的枚举值\n if (config.type) {\n // 首先检查用户友好的字符串类型\n const typeStr = String(config.type);\n if (typeStr === \"http\") {\n fullConfig.type = MCPTransportType.STREAMABLE_HTTP;\n } else if (typeStr === \"sse\") {\n fullConfig.type = MCPTransportType.SSE;\n } else {\n // 已经是枚举值或正确格式\n fullConfig.type = config.type as MCPTransportType;\n }\n }\n\n this.configs.set(name, fullConfig);\n }\n\n /**\n * 移除服务器配置\n * @param name 服务器名称\n */\n removeServer(name: string): boolean {\n return this.configs.delete(name);\n }\n\n /**\n * 连接所有已添加的 MCP 服务\n * 所有服务并行连接,单个服务失败不会影响其他服务\n *\n * @example\n * ```typescript\n * await manager.connect();\n * ```\n */\n async connect(): Promise<void> {\n this.emit(\"connect\");\n\n const promises = Array.from(this.configs.entries()).map(\n async ([name, config]) => {\n try {\n const connection = new MCPConnection(config, {\n onConnected: (data) => {\n this.emit(\"connected\", {\n serverName: data.serviceName,\n tools: data.tools,\n });\n },\n onDisconnected: (data) => {\n this.emit(\"disconnected\", {\n serverName: data.serviceName,\n reason: data.reason,\n });\n },\n onConnectionFailed: (data) => {\n this.emit(\"error\", {\n serverName: data.serviceName,\n error: data.error,\n });\n },\n });\n\n await connection.connect();\n this.connections.set(name, connection);\n } catch (error) {\n this.emit(\"error\", { serverName: name, error });\n throw error;\n }\n }\n );\n\n await Promise.allSettled(promises);\n }\n\n /**\n * 断开所有 MCP 服务连接\n *\n * @example\n * ```typescript\n * await manager.disconnect();\n * ```\n */\n async disconnect(): Promise<void> {\n const promises = Array.from(this.connections.values()).map((conn) =>\n conn.disconnect()\n );\n\n await Promise.allSettled(promises);\n this.connections.clear();\n\n this.emit(\"disconnect\");\n }\n\n /**\n * 调用指定服务的工具\n * @param serverName 服务名称\n * @param toolName 工具名称\n * @param args 工具参数\n *\n * @example\n * ```typescript\n * const result = await manager.callTool('datetime', 'get_current_time', {\n * format: 'YYYY-MM-DD HH:mm:ss'\n * });\n * ```\n */\n async callTool(\n serverName: string,\n toolName: string,\n args: Record<string, unknown>\n ): Promise<ToolCallResult> {\n const connection = this.connections.get(serverName);\n if (!connection) {\n throw new Error(`服务 ${serverName} 不存在`);\n }\n\n if (!connection.isConnected()) {\n throw new Error(`服务 ${serverName} 未连接`);\n }\n\n return connection.callTool(toolName, args);\n }\n\n /**\n * 列出所有可用的工具\n * @returns 工具列表,格式为 [{ name, serverName, description, inputSchema }]\n *\n * @example\n * ```typescript\n * const tools = manager.listTools();\n * console.log('可用工具:', tools.map(t => `${t.serverName}/${t.name}`));\n * ```\n */\n listTools(): Array<{\n name: string;\n serverName: string;\n description: string;\n inputSchema: unknown;\n }> {\n const allTools: Array<{\n name: string;\n serverName: string;\n description: string;\n inputSchema: unknown;\n }> = [];\n\n for (const [serverName, connection] of this.connections) {\n if (connection.isConnected()) {\n const tools = connection.getTools();\n for (const tool of tools) {\n allTools.push({\n name: tool.name,\n serverName,\n description: tool.description || \"\",\n inputSchema: tool.inputSchema,\n });\n }\n }\n }\n\n return allTools;\n }\n\n /**\n * 获取服务状态\n * @param serverName 服务名称\n * @returns 服务状态,如果服务不存在则返回 null\n *\n * @example\n * ```typescript\n * const status = manager.getServerStatus('datetime');\n * if (status) {\n * console.log(`已连接: ${status.connected}, 工具数: ${status.toolCount}`);\n * }\n * ```\n */\n getServerStatus(serverName: string): {\n connected: boolean;\n toolCount: number;\n } | null {\n const connection = this.connections.get(serverName);\n if (!connection) {\n return null;\n }\n\n const status = connection.getStatus();\n return {\n connected: status.connected,\n toolCount: status.toolCount,\n };\n }\n\n /**\n * 获取所有服务的状态\n * @returns 所有服务的状态映射\n *\n * @example\n * ```typescript\n * const statuses = manager.getAllServerStatus();\n * console.log(statuses);\n * // {\n * // datetime: { connected: true, toolCount: 3 },\n * // calculator: { connected: true, toolCount: 1 }\n * // }\n * ```\n */\n getAllServerStatus(): Record<\n string,\n { connected: boolean; toolCount: number }\n > {\n const statuses: Record<string, { connected: boolean; toolCount: number }> = {};\n\n for (const [serverName, connection] of this.connections) {\n const status = connection.getStatus();\n statuses[serverName] = {\n connected: status.connected,\n toolCount: status.toolCount,\n };\n }\n\n return statuses;\n }\n\n /**\n * 检查服务是否已连接\n * @param serverName 服务名称\n *\n * @example\n * ```typescript\n * if (manager.isConnected('datetime')) {\n * console.log('datetime 服务已连接');\n * }\n * ```\n */\n isConnected(serverName: string): boolean {\n const connection = this.connections.get(serverName);\n return connection ? connection.isConnected() : false;\n }\n\n /**\n * 获取已配置的服务列表\n * @returns 服务名称数组\n *\n * @example\n * ```typescript\n * const servers = manager.getServerNames();\n * console.log('已配置的服务:', servers);\n * ```\n */\n getServerNames(): string[] {\n return Array.from(this.configs.keys());\n }\n\n /**\n * 获取已连接的服务列表\n * @returns 已连接的服务名称数组\n *\n * @example\n * ```typescript\n * const connectedServers = manager.getConnectedServerNames();\n * console.log('已连接的服务:', connectedServers);\n * ```\n */\n getConnectedServerNames(): string[] {\n const connected: string[] = [];\n for (const [serverName, connection] of this.connections) {\n if (connection.isConnected()) {\n connected.push(serverName);\n }\n }\n return connected;\n }\n}\n\n// 为了向后兼容,保留旧的 MCPServiceManager 类名作为别名\nexport { MCPManager as MCPServiceManager };\n"],"mappings":"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","names":["MCPTransportType","ConnectionState","ToolCallErrorCode","TypeFieldNormalizer","normalizeTypeField"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/connection.ts","../src/transport-factory.ts","../src/utils/type-normalizer.ts","../src/utils/validators.ts","../src/manager.ts"],"sourcesContent":["/**\n * MCP 核心库类型定义\n * 统一管理所有 MCP 相关的类型定义\n */\n\nimport type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport type { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport type { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\n\n// =========================\n// 1. 基础传输类型\n// =========================\n\n/**\n * MCP 传输层联合类型定义\n * 支持 STDIO、SSE、StreamableHTTP 三种传输协议\n */\nexport type MCPServerTransport =\n | StdioClientTransport\n | SSEClientTransport\n | StreamableHTTPClientTransport;\n\n/**\n * 通信方式枚举\n * 定义 MCP 支持的传输类型\n */\nexport enum MCPTransportType {\n STDIO = \"stdio\",\n SSE = \"sse\",\n HTTP = \"http\",\n}\n\n/**\n * 传输类型字符串字面量\n * 方便外部用户直接使用字符串而不需要导入枚举\n */\nexport type MCPTransportTypeString = \"stdio\" | \"sse\" | \"http\";\n\n/**\n * 传输类型输入值(枚举或字符串字面量)\n */\nexport type MCPTransportTypeInput = MCPTransportType | MCPTransportTypeString;\n\n// =========================\n// 1.1 事件回调接口\n// =========================\n\n/**\n * MCP 服务事件回调接口\n * 用于替代 EventBus 依赖,提供灵活的事件处理机制\n */\nexport interface MCPServiceEventCallbacks {\n /** 连接成功回调 */\n onConnected?: (data: {\n serviceName: string;\n tools: Tool[];\n connectionTime: Date;\n }) => void;\n /** 断开连接回调 */\n onDisconnected?: (data: {\n serviceName: string;\n reason?: string;\n disconnectionTime: Date;\n }) => void;\n /** 连接失败回调 */\n onConnectionFailed?: (data: {\n serviceName: string;\n error: Error;\n attempt: number;\n }) => void;\n}\n\n// =========================\n// 2. 配置接口类型\n// =========================\n\n/**\n * ModelScope SSE 自定义选项接口\n */\nexport interface ModelScopeSSEOptions {\n eventSourceInit?: {\n fetch?: (\n url: string | URL | Request,\n init?: RequestInit\n ) => Promise<Response>;\n };\n requestInit?: RequestInit;\n}\n\n/**\n * MCP 服务配置接口\n * 包含所有 MCP 服务的配置选项(不包含服务名称)\n *\n * @description\n * 与 MCP 官方配置格式保持一致,支持三种传输类型:\n * - stdio: 本地进程通信 { command, args, env }\n * - sse: Server-Sent Events { url, headers }\n * - http: Streamable HTTP { url, headers }\n *\n * 向后兼容:自动将 streamable-http/streamable_http/streamableHttp 转换为 http\n */\nexport interface MCPServiceConfig {\n // name 字段已从配置中移除,应作为独立参数传递\n type?: MCPTransportTypeInput; // 支持枚举或字符串字面量,如 \"stdio\" | \"sse\" | \"http\"\n // stdio 配置\n command?: string;\n args?: string[];\n env?: Record<string, string>; // 环境变量配置\n // 网络配置\n url?: string;\n // 认证配置\n apiKey?: string;\n headers?: Record<string, string>;\n customSSEOptions?: ModelScopeSSEOptions;\n}\n\n/**\n * 旧版 MCP 服务配置接口(包含 name 字段)\n * 用于向后兼容\n */\nexport interface LegacyMCPServiceConfig extends MCPServiceConfig {\n name: string;\n}\n\n/**\n * 内部使用的 MCP 服务配置接口(包含 name 字段)\n * 用于 TransportFactory 等内部函数\n */\nexport interface InternalMCPServiceConfig extends MCPServiceConfig {\n name: string;\n}\n\n// =========================\n// 3. 状态枚举类型\n// =========================\n\n/**\n * 连接状态枚举\n */\nexport enum ConnectionState {\n DISCONNECTED = \"disconnected\",\n CONNECTING = \"connecting\",\n CONNECTED = \"connected\",\n RECONNECTING = \"reconnecting\",\n FAILED = \"failed\",\n ERROR = \"error\",\n}\n\n/**\n * MCP 服务状态接口\n */\nexport interface MCPServiceStatus {\n name: string;\n connected: boolean;\n initialized: boolean;\n transportType: MCPTransportType;\n toolCount: number;\n lastError?: string;\n connectionState: ConnectionState;\n}\n\n// =========================\n// 4. 工具调用相关类型\n// =========================\n\n/**\n * 工具调用结果接口\n */\nexport interface ToolCallResult {\n content: Array<{\n type: string;\n text: string;\n }>;\n isError?: boolean;\n}\n\n/**\n * JSON Schema 类型定义\n */\nexport type JSONSchema =\n | (Record<string, unknown> & {\n type: \"object\";\n properties?: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n })\n | Record<string, unknown>;\n\n/**\n * 类型守卫:检查对象是否为有效的 MCP Tool JSON Schema\n */\nexport function isValidToolJSONSchema(obj: unknown): obj is {\n type: \"object\";\n properties?: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n} {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"type\" in obj &&\n (obj as { type?: unknown }).type === \"object\"\n );\n}\n\n/**\n * 确保对象符合 MCP Tool JSON Schema 格式\n */\nexport function ensureToolJSONSchema(schema: JSONSchema): {\n type: \"object\";\n properties?: Record<string, object>;\n required?: string[];\n additionalProperties?: boolean;\n} {\n if (isValidToolJSONSchema(schema)) {\n return schema as {\n type: \"object\";\n properties?: Record<string, object>;\n required?: string[];\n additionalProperties?: boolean;\n };\n }\n\n return {\n type: \"object\",\n properties: {} as Record<string, object>,\n required: [],\n additionalProperties: true,\n };\n}\n\n/**\n * CustomMCP 工具类型定义\n */\nexport interface CustomMCPTool {\n name: string;\n description?: string;\n inputSchema: JSONSchema;\n handler?: {\n type: string;\n config?: Record<string, unknown>;\n };\n}\n\n/**\n * 工具信息接口\n */\nexport interface ToolInfo {\n serviceName: string;\n originalName: string;\n tool: Tool;\n}\n\n// =========================\n// 5. 增强工具信息类型\n// =========================\n\n/**\n * 工具状态过滤选项\n */\nexport type ToolStatusFilter = \"enabled\" | \"disabled\" | \"all\";\n\n/**\n * 增强的工具信息接口\n */\nexport interface EnhancedToolInfo {\n /** 工具唯一标识符,格式为 \"{serviceName}__{originalName}\" */\n name: string;\n /** 工具描述信息 */\n description: string;\n /** 工具输入参数的 JSON Schema 定义 */\n inputSchema: JSONSchema;\n /** 工具所属的 MCP 服务名称 */\n serviceName: string;\n /** 工具在 MCP 服务中的原始名称 */\n originalName: string;\n /** 工具是否启用 */\n enabled: boolean;\n /** 工具使用次数统计 */\n usageCount: number;\n /** 工具最后使用时间 */\n lastUsedTime: string;\n}\n\n// =========================\n// 6. 服务器配置类型\n// =========================\n\n/**\n * 统一服务器配置接口\n */\nexport interface UnifiedServerConfig {\n name?: string;\n enableLogging?: boolean;\n logLevel?: string;\n configs?: Record<string, MCPServiceConfig>;\n}\n\n/**\n * 统一服务器状态接口\n */\nexport interface UnifiedServerStatus {\n isRunning: boolean;\n serviceStatus: ManagerStatus;\n transportCount: number;\n activeConnections: number;\n config: UnifiedServerConfig;\n services?: Record<string, MCPServiceConnectionStatus>;\n totalTools?: number;\n availableTools?: string[];\n}\n\n// =========================\n// 7. 管理器相关类型\n// =========================\n\n/**\n * MCP 服务连接状态接口\n */\nexport interface MCPServiceConnectionStatus {\n connected: boolean;\n clientName: string;\n}\n\n/**\n * 管理器状态接口\n */\nexport interface ManagerStatus {\n services: Record<string, MCPServiceConnectionStatus>;\n totalTools: number;\n availableTools: string[];\n}\n\n// =========================\n// 8. 参数校验相关类型\n// =========================\n\n/**\n * 工具调用参数接口\n */\nexport interface ToolCallParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\n/**\n * 验证后的工具调用参数\n */\nexport interface ValidatedToolCallParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\n/**\n * 工具调用验证选项\n */\nexport interface ToolCallValidationOptions {\n validateName?: boolean;\n validateArguments?: boolean;\n allowEmptyArguments?: boolean;\n customValidator?: (params: ToolCallParams) => string | null;\n}\n\n/**\n * 工具调用错误码枚举\n */\nexport enum ToolCallErrorCode {\n INVALID_PARAMS = -32602,\n TOOL_NOT_FOUND = -32601,\n SERVICE_UNAVAILABLE = -32001,\n TIMEOUT = -32002,\n TOOL_EXECUTION_ERROR = -32000,\n}\n\n/**\n * 工具调用错误类\n */\nexport class ToolCallError extends Error {\n constructor(\n public code: ToolCallErrorCode,\n message: string,\n public data?: unknown\n ) {\n super(message);\n this.name = \"ToolCallError\";\n }\n}\n","import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { MCPServerTransport, MCPServiceConfig, MCPServiceStatus, ToolCallResult } from \"./types.js\";\nimport { ConnectionState, MCPTransportType } from \"./types.js\";\nimport { TransportFactory } from \"./transport-factory.js\";\nimport { inferTransportTypeFromConfig } from \"./utils/index.js\";\n\n/**\n * MCP 连接类\n * 负责管理单个 MCP 服务的连接、工具管理和调用\n */\nexport class MCPConnection {\n private name: string; // 服务名称(独立字段)\n private config: MCPServiceConfig;\n private client: Client | null = null;\n private transport: MCPServerTransport | null = null;\n private tools: Map<string, Tool> = new Map();\n private connectionState: ConnectionState = ConnectionState.DISCONNECTED;\n private connectionTimeout: NodeJS.Timeout | null = null;\n private initialized = false;\n private callbacks?: import(\"./types.js\").MCPServiceEventCallbacks;\n\n constructor(\n name: string,\n config: MCPServiceConfig,\n callbacks?: import(\"./types.js\").MCPServiceEventCallbacks\n ) {\n this.name = name;\n // 使用工具方法推断服务类型(传递服务名称用于日志)\n this.config = inferTransportTypeFromConfig(config, name);\n this.callbacks = callbacks;\n\n // 验证配置\n this.validateConfig();\n }\n\n /**\n * 验证配置\n */\n private validateConfig(): void {\n // 验证服务名称\n if (!this.name || typeof this.name !== \"string\") {\n throw new Error(\"服务名称必须是非空字符串\");\n }\n // 使用 TransportFactory 进行配置验证(传递包含 name 的完整配置)\n const fullConfig: import(\"./types.js\").InternalMCPServiceConfig = {\n name: this.name,\n ...this.config,\n };\n TransportFactory.validateConfig(fullConfig);\n }\n\n /**\n * 连接到 MCP 服务\n */\n async connect(): Promise<void> {\n // 如果正在连接中,等待当前连接完成\n if (this.connectionState === ConnectionState.CONNECTING) {\n throw new Error(\"连接正在进行中,请等待连接完成\");\n }\n\n // 清理之前的连接\n this.cleanupConnection();\n\n return this.attemptConnection();\n }\n\n /**\n * 尝试建立连接\n */\n private async attemptConnection(): Promise<void> {\n this.connectionState = ConnectionState.CONNECTING;\n console.debug(\n `[MCP-${this.name}] 正在连接 MCP 服务: ${this.name}`\n );\n\n return new Promise((resolve, reject) => {\n // 设置连接超时(使用固定默认值 10 秒)\n const CONNECTION_TIMEOUT = 10000;\n this.connectionTimeout = setTimeout(() => {\n const error = new Error(`连接超时 (${CONNECTION_TIMEOUT}ms)`);\n this.handleConnectionError(error);\n reject(error);\n }, CONNECTION_TIMEOUT);\n\n try {\n this.client = new Client(\n {\n name: `xiaozhi-${this.name}-client`,\n version: \"1.0.0\",\n },\n {\n capabilities: {},\n }\n );\n\n // 使用 TransportFactory 创建传输层(传递包含 name 的完整配置)\n const fullConfig: import(\"./types.js\").InternalMCPServiceConfig = {\n name: this.name,\n ...this.config,\n };\n this.transport = TransportFactory.create(fullConfig);\n\n // 连接到 MCP 服务\n this.client\n .connect(this.transport as MCPServerTransport)\n .then(async () => {\n this.handleConnectionSuccess();\n\n // 获取工具列表\n await this.refreshTools();\n\n // 发射连接成功事件\n this.callbacks?.onConnected?.({\n serviceName: this.name,\n tools: this.getTools(),\n connectionTime: new Date(),\n });\n\n resolve();\n })\n .catch((error) => {\n this.handleConnectionError(error);\n reject(error);\n });\n } catch (error) {\n this.handleConnectionError(error as Error);\n reject(error);\n }\n });\n }\n\n /**\n * 处理连接成功\n */\n private handleConnectionSuccess(): void {\n // 清理连接超时定时器\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = null;\n }\n\n this.connectionState = ConnectionState.CONNECTED;\n this.initialized = true;\n\n console.info(\n `[MCP-${this.name}] MCP 服务 ${this.name} 连接已建立`\n );\n }\n\n /**\n * 处理连接错误\n */\n private handleConnectionError(error: Error): void {\n this.connectionState = ConnectionState.DISCONNECTED;\n this.initialized = false;\n\n console.debug(`MCP 服务 ${this.name} 连接错误:`, error.message);\n\n // 清理连接超时定时器\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = null;\n }\n\n // 清理当前连接\n this.cleanupConnection();\n\n // 发射连接失败事件\n this.callbacks?.onConnectionFailed?.({\n serviceName: this.name,\n error,\n attempt: 0,\n });\n }\n\n /**\n * 清理连接资源\n */\n private cleanupConnection(): void {\n // 清理客户端\n if (this.client) {\n try {\n this.client.close().catch(() => {\n // 忽略关闭时的错误\n });\n } catch (error) {\n // 忽略关闭时的错误\n }\n this.client = null;\n }\n\n // 清理传输层\n this.transport = null;\n\n // 清理连接超时定时器\n if (this.connectionTimeout) {\n clearTimeout(this.connectionTimeout);\n this.connectionTimeout = null;\n }\n\n // 重置状态\n this.initialized = false;\n }\n\n /**\n * 刷新工具列表\n */\n private async refreshTools(): Promise<void> {\n if (!this.client) {\n throw new Error(\"客户端未初始化\");\n }\n\n try {\n const toolsResult = await this.client.listTools();\n const tools: Tool[] = toolsResult.tools || [];\n\n // 清空现有工具\n this.tools.clear();\n\n // 注册工具到映射表\n for (const tool of tools) {\n this.tools.set(tool.name, tool);\n }\n\n console.debug(\n `${this.name} 服务加载了 ${tools.length} 个工具: ${tools\n .map((t) => t.name)\n .join(\", \")}`\n );\n } catch (error) {\n console.error(\n `${this.name} 获取工具列表失败:`,\n error instanceof Error ? error.message : String(error)\n );\n throw error;\n }\n }\n\n /**\n * 断开连接\n */\n async disconnect(): Promise<void> {\n console.info(`主动断开 MCP 服务 ${this.name} 连接`);\n\n // 清理连接资源\n this.cleanupConnection();\n\n // 设置状态为已断开\n this.connectionState = ConnectionState.DISCONNECTED;\n\n // 发射断开连接事件\n this.callbacks?.onDisconnected?.({\n serviceName: this.name,\n reason: \"手动断开\",\n disconnectionTime: new Date(),\n });\n }\n\n /**\n * 获取工具列表\n */\n getTools(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * 调用工具\n */\n async callTool(\n name: string,\n arguments_: Record<string, unknown>\n ): Promise<ToolCallResult> {\n if (!this.client) {\n throw new Error(`服务 ${this.name} 未连接`);\n }\n\n if (!this.tools.has(name)) {\n throw new Error(`工具 ${name} 在服务 ${this.name} 中不存在`);\n }\n\n console.debug(\n `调用 ${this.name} 服务的工具 ${name},参数:`,\n JSON.stringify(arguments_)\n );\n\n try {\n const result = await this.client.callTool({\n name,\n arguments: arguments_ || {},\n });\n\n console.debug(\n `工具 ${name} 调用成功,结果:`,\n `${JSON.stringify(result).substring(0, 500)}...`\n );\n\n return result as ToolCallResult;\n } catch (error) {\n console.error(\n `工具 ${name} 调用失败:`,\n error instanceof Error ? error.message : String(error)\n );\n throw error;\n }\n }\n\n /**\n * 获取服务配置\n */\n getConfig(): MCPServiceConfig & { name: string } {\n return {\n name: this.name,\n ...this.config,\n };\n }\n\n /**\n * 获取服务状态\n */\n getStatus(): MCPServiceStatus {\n return {\n name: this.name,\n connected: this.connectionState === ConnectionState.CONNECTED,\n initialized: this.initialized,\n transportType:\n (this.config.type as MCPTransportType) || MCPTransportType.HTTP,\n toolCount: this.tools.size,\n connectionState: this.connectionState,\n };\n }\n\n /**\n * 检查是否已连接\n */\n isConnected(): boolean {\n return (\n this.connectionState === ConnectionState.CONNECTED && this.initialized\n );\n }\n}\n","import type { InternalMCPServiceConfig, MCPServerTransport } from \"./types.js\";\nimport { MCPTransportType } from \"./types.js\";\nimport type { SSEClientTransportOptions } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport type { StreamableHTTPClientTransportOptions } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { EventSource } from \"eventsource\";\n\n// 全局 polyfill EventSource(用于 SSE)\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst globalThisAny: any = typeof globalThis !== \"undefined\" ? globalThis : global;\nif (\n typeof globalThisAny !== \"undefined\" &&\n !globalThisAny.EventSource\n) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n globalThisAny.EventSource = EventSource;\n}\n\n// Transport 基础接口\nexport interface Transport {\n connect?(): Promise<void>;\n close?(): Promise<void>;\n}\n\n/**\n * 创建 transport 实例\n * @param config MCP 服务配置(包含 name)\n * @returns transport 实例\n */\nexport function createTransport(config: InternalMCPServiceConfig): MCPServerTransport {\n console.debug(\n `[TransportFactory] 创建 ${config.type} transport for ${config.name}`\n );\n\n switch (config.type) {\n case MCPTransportType.STDIO:\n return createStdioTransport(config);\n\n case MCPTransportType.SSE:\n return createSSETransport(config);\n\n case MCPTransportType.HTTP:\n return createHTTPTransport(config);\n\n default:\n throw new Error(`不支持的传输类型: ${config.type}`);\n }\n}\n\n/**\n * 创建 Stdio transport\n */\nfunction createStdioTransport(config: InternalMCPServiceConfig): StdioClientTransport {\n if (!config.command) {\n throw new Error(\"stdio transport 需要 command 配置\");\n }\n\n return new StdioClientTransport({\n command: config.command,\n args: config.args || [],\n env: config.env, // 传递环境变量\n });\n}\n\n/**\n * 创建 SSE transport\n */\nfunction createSSETransport(config: InternalMCPServiceConfig): SSEClientTransport {\n if (!config.url) {\n throw new Error(\"SSE transport 需要 URL 配置\");\n }\n\n const url = new URL(config.url);\n const options = createSSEOptions(config);\n\n return new SSEClientTransport(url, options);\n}\n\nfunction createHTTPTransport(\n config: InternalMCPServiceConfig\n): StreamableHTTPClientTransport {\n if (!config.url) {\n throw new Error(\"HTTP transport 需要 URL 配置\");\n }\n\n const url = new URL(config.url);\n const options = createStreamableHTTPOptions(config);\n return new StreamableHTTPClientTransport(url, options);\n}\n\n/**\n * 创建 SSE 选项\n */\nfunction createSSEOptions(config: InternalMCPServiceConfig): SSEClientTransportOptions {\n const options: SSEClientTransportOptions = {};\n\n // 添加认证头\n if (config.apiKey) {\n options.requestInit = {\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n ...config.headers,\n },\n };\n } else if (config.headers) {\n options.requestInit = {\n headers: config.headers,\n };\n }\n\n return options;\n}\n\nfunction createStreamableHTTPOptions(\n config: InternalMCPServiceConfig\n): StreamableHTTPClientTransportOptions {\n const options: StreamableHTTPClientTransportOptions = {};\n\n // 添加认证头\n if (config.apiKey) {\n options.requestInit = {\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n ...config.headers,\n },\n };\n } else if (config.headers) {\n options.requestInit = {\n headers: config.headers,\n };\n }\n\n return options;\n}\n\n/**\n * 验证配置\n * 注意:name 验证已在 MCPConnection 构造函数中进行\n * @param config MCP 服务配置(包含 name)\n */\nexport function validateConfig(config: InternalMCPServiceConfig): void {\n // name 验证已移至 MCPConnection 构造函数\n\n // type 字段现在是可选的,由 MCPService 自动推断\n // 这里我们只验证如果 type 存在,必须是有效的类型\n if (\n config.type &&\n !Object.values(MCPTransportType).includes(config.type as MCPTransportType)\n ) {\n throw new Error(`不支持的传输类型: ${config.type}`);\n }\n\n // 注意:这个验证方法在 MCPService.inferTransportType 之后调用\n // 此时 config.type 应该已经被推断或显式设置\n if (!config.type) {\n throw new Error(\"传输类型未设置,这应该在 inferTransportType 中处理\");\n }\n\n switch (config.type) {\n case MCPTransportType.STDIO:\n if (!config.command) {\n throw new Error(\"stdio 类型需要 command 字段\");\n }\n break;\n\n case MCPTransportType.SSE:\n if (config.url === undefined || config.url === null) {\n throw new Error(`${config.type} 类型需要 url 字段`);\n }\n break;\n case MCPTransportType.HTTP:\n // HTTP 允许空 URL,会在后续处理中设置默认值\n if (config.url === undefined || config.url === null) {\n throw new Error(`${config.type} 类型需要 url 字段`);\n }\n break;\n\n default:\n throw new Error(`不支持的传输类型: ${config.type}`);\n }\n}\n\n/**\n * 获取支持的传输类型列表\n */\nexport function getSupportedTypes(): MCPTransportType[] {\n return [\n MCPTransportType.STDIO,\n MCPTransportType.SSE,\n MCPTransportType.HTTP,\n ];\n}\n\n/**\n * Transport 工厂对象(保持 API 兼容性)\n */\nexport const TransportFactory = {\n create: createTransport,\n validateConfig,\n getSupportedTypes,\n};\n","/**\n * MCP 服务器配置 Type 字段标准化工具\n * 支持将各种 type 字段格式转换为 MCP 官方标准格式\n *\n * @description\n * 标准格式与 MCP 官方保持一致:\n * - stdio: 本地进程通信\n * - sse: Server-Sent Events\n * - http: Streamable HTTP(推荐使用 http 而非 streamable-http)\n *\n * 向后兼容:自动转换各种变体格式\n */\n\n/**\n * MCP 服务器配置的基础接口\n * 定义包含可选 type 字段的配置对象结构\n */\nexport interface MCPBaseConfig {\n type?: string;\n [key: string]: unknown; // 允许其他配置属性\n}\n\n/**\n * MCP 服务器配置 Type 字段标准化工具类\n */\nexport namespace TypeFieldNormalizer {\n /**\n * 标准化 type 字段格式\n *\n * 支持的转换:\n * - http 变体:http → http(标准值)\n * - streamable-http → http\n * - streamable_http → http\n * - streamableHttp → http\n * - sse 变体:sse → sse(标准值)\n * - s_se → sse\n * - s-se → sse\n * - stdio 变体:stdio → stdio(标准值)\n */\n // 函数重载:泛型版本,用于类型安全的调用\n export function normalizeTypeField<T extends MCPBaseConfig>(config: T): T;\n\n // 函数重载:向后兼容版本,用于 unknown 类型输入\n export function normalizeTypeField(config: unknown): unknown;\n\n // 统一实现\n export function normalizeTypeField<T extends MCPBaseConfig>(\n config: T | unknown\n ): T | unknown {\n if (!config || typeof config !== \"object\") {\n return config;\n }\n\n // 创建配置的深拷贝以避免修改原始对象\n const normalizedConfig = JSON.parse(JSON.stringify(config));\n\n // 如果配置中没有 type 字段,直接返回\n if (!(\"type\" in normalizedConfig)) {\n return normalizedConfig;\n }\n\n const originalType = normalizedConfig.type;\n\n // 如果已经是标准格式,直接返回\n if (originalType === \"stdio\" || originalType === \"sse\" || originalType === \"http\") {\n return normalizedConfig;\n }\n\n // 转换为标准格式\n const normalizedType = normalizeTypeValue(originalType);\n\n // 验证转换后的类型是否有效\n if (normalizedType === \"stdio\" || normalizedType === \"sse\" || normalizedType === \"http\") {\n normalizedConfig.type = normalizedType;\n }\n\n return normalizedConfig;\n }\n\n /**\n * 标准化单个 type 值\n */\n export function normalizeTypeValue(type: string): string {\n // http 相关的变体全部转为 http\n if (\n type === \"http\" ||\n type === \"streamable-http\" ||\n type === \"streamable_http\" ||\n type === \"streamableHttp\"\n ) {\n return \"http\";\n }\n\n // sse 相关的变体转为 sse\n if (type === \"sse\" || type === \"s_se\" || type === \"s-se\") {\n return \"sse\";\n }\n\n // stdio 相关的变体转为 stdio\n if (type === \"stdio\") {\n return \"stdio\";\n }\n\n // 对于其他格式,尝试智能转换(转小写、下划线转中划线等)\n return convertToStandardFormat(type);\n }\n\n /**\n * 将字符串转换为标准格式\n */\n function convertToStandardFormat(str: string): string {\n const lowered = str.toLowerCase();\n\n // 处理 http 相关的变体\n if (lowered.includes(\"http\") || lowered.includes(\"streamable\")) {\n return \"http\";\n }\n\n // 处理 sse 相关的变体\n if (lowered.includes(\"sse\")) {\n return \"sse\";\n }\n\n // 处理 stdio 相关的变体\n if (lowered.includes(\"stdio\")) {\n return \"stdio\";\n }\n\n // 无法识别的格式,返回原值\n return str;\n }\n}\n\n/**\n * 导出便捷函数\n */\nexport function normalizeTypeField<T extends MCPBaseConfig>(\n config: T\n): T;\nexport function normalizeTypeField(config: unknown): unknown;\nexport function normalizeTypeField<T extends MCPBaseConfig>(\n config: T | unknown\n): T | unknown {\n return TypeFieldNormalizer.normalizeTypeField(config);\n}\n","import { MCPTransportType, ToolCallError, ToolCallErrorCode } from \"../types.js\";\nimport { TypeFieldNormalizer } from \"./type-normalizer.js\";\nimport type {\n MCPServiceConfig,\n ToolCallParams,\n ToolCallValidationOptions,\n ValidatedToolCallParams,\n} from \"../types.js\";\n\n/**\n * 根据 URL 路径推断传输类型\n * 基于路径末尾推断,支持包含多个 / 的复杂路径\n *\n * @param url - 要推断的 URL\n * @param options - 可选配置项\n * @returns 推断出的传输类型\n */\nexport function inferTransportTypeFromUrl(\n url: string,\n options?: {\n serviceName?: string;\n }\n): MCPTransportType {\n try {\n const parsedUrl = new URL(url);\n const pathname = parsedUrl.pathname;\n\n // 检查路径末尾\n if (pathname.endsWith(\"/sse\")) {\n return MCPTransportType.SSE;\n }\n if (pathname.endsWith(\"/mcp\")) {\n return MCPTransportType.HTTP;\n }\n\n // 默认类型 - 使用 console 输出\n if (options?.serviceName) {\n console.info(\n `[MCP-${options.serviceName}] URL 路径 ${pathname} 不匹配特定规则,默认推断为 http 类型`\n );\n }\n return MCPTransportType.HTTP;\n } catch (error) {\n if (options?.serviceName) {\n console.warn(\n `[MCP-${options.serviceName}] URL 解析失败,默认推断为 http 类型`,\n error\n );\n }\n return MCPTransportType.HTTP;\n }\n}\n\n/**\n * 完整的配置类型推断(包括 command 字段)\n *\n * @param config - MCP 服务配置\n * @param serviceName - 服务名称(用于日志输出)\n * @returns 完整的配置对象,包含推断出的类型\n */\nexport function inferTransportTypeFromConfig(\n config: MCPServiceConfig,\n serviceName?: string\n): MCPServiceConfig {\n // 如果已显式指定类型,先标准化然后返回\n if (config.type) {\n const normalizedConfig = TypeFieldNormalizer.normalizeTypeField(config);\n return normalizedConfig as MCPServiceConfig;\n }\n\n // 基于 command 字段推断\n if (config.command) {\n return {\n ...config,\n type: MCPTransportType.STDIO,\n };\n }\n\n // 基于 URL 字段推断(排除 null 和 undefined)\n if (config.url !== undefined && config.url !== null) {\n const inferredType = inferTransportTypeFromUrl(config.url, {\n serviceName,\n });\n return {\n ...config,\n type: inferredType,\n };\n }\n\n throw new Error(\n `无法为服务 ${serviceName || \"未知\"} 推断传输类型。请显式指定 type 字段,或提供 command/url 配置`\n );\n}\n\n// =========================\n// 参数校验工具函数\n// =========================\n\n/**\n * 验证工具调用参数\n * 对传入的参数进行完整性和格式验证\n *\n * @param params 待验证的参数\n * @param options 验证选项\n * @returns 验证后的参数\n * @throws ToolCallError 验证失败时抛出\n */\nexport function validateToolCallParams(\n params: unknown,\n options?: ToolCallValidationOptions\n): ValidatedToolCallParams {\n const opts = {\n validateName: true,\n validateArguments: true,\n allowEmptyArguments: true,\n ...options,\n };\n\n // 1. 验证参数必须是对象\n if (!params || typeof params !== \"object\") {\n throw new ToolCallError(\n ToolCallErrorCode.INVALID_PARAMS,\n \"请求参数必须是对象\"\n );\n }\n\n const paramsObj = params as Record<string, unknown>;\n\n // 2. 验证工具名称\n if (opts.validateName) {\n if (!paramsObj.name || typeof paramsObj.name !== \"string\") {\n throw new ToolCallError(\n ToolCallErrorCode.INVALID_PARAMS,\n \"工具名称必须是非空字符串\"\n );\n }\n }\n\n // 3. 验证工具参数格式\n if (\n opts.validateArguments &&\n paramsObj.arguments !== undefined &&\n paramsObj.arguments !== null\n ) {\n if (\n typeof paramsObj.arguments !== \"object\" ||\n Array.isArray(paramsObj.arguments)\n ) {\n throw new ToolCallError(\n ToolCallErrorCode.INVALID_PARAMS,\n \"工具参数必须是对象\"\n );\n }\n }\n\n // 4. 验证是否允许空参数\n if (\n !opts.allowEmptyArguments &&\n paramsObj.arguments !== undefined &&\n paramsObj.arguments !== null\n ) {\n const argsObj = paramsObj.arguments as Record<string, unknown>;\n if (Object.keys(argsObj).length === 0) {\n throw new ToolCallError(\n ToolCallErrorCode.INVALID_PARAMS,\n \"工具参数不能为空\"\n );\n }\n }\n\n // 5. 执行自定义验证\n if (opts.customValidator) {\n const error = opts.customValidator(paramsObj as unknown as ToolCallParams);\n if (error) {\n throw new ToolCallError(ToolCallErrorCode.INVALID_PARAMS, error);\n }\n }\n\n return {\n name: paramsObj.name as string,\n arguments: paramsObj.arguments as Record<string, unknown>,\n };\n}\n","/**\n * MCP 服务管理器\n * 提供简洁的 API 来管理多个 MCP 服务\n */\n\nimport { EventEmitter } from \"node:events\";\nimport { MCPConnection } from \"./connection.js\";\nimport type { MCPServiceConfig, ToolCallResult } from \"./types.js\";\nimport { MCPTransportType } from \"./types.js\";\n\n/**\n * MCP 服务管理器\n * 提供简洁的 API 来管理多个 MCP 服务\n *\n * @example\n * ```typescript\n * const manager = new MCPManager();\n *\n * // 添加服务\n * manager.addServer('datetime', {\n * type: 'stdio',\n * command: 'node',\n * args: ['datetime.js']\n * });\n *\n * // 连接所有服务\n * await manager.connect();\n *\n * // 调用工具\n * const result = await manager.callTool('datetime', 'get_current_time', {\n * format: 'YYYY-MM-DD HH:mm:ss'\n * });\n *\n * // 断开连接\n * await manager.disconnect();\n * ```\n */\nexport class MCPManager extends EventEmitter {\n private connections: Map<string, MCPConnection> = new Map();\n private configs: Map<string, MCPServiceConfig> = new Map();\n\n constructor() {\n super();\n }\n\n /**\n * 添加 MCP 服务器配置\n * @param name 服务器名称\n * @param config 服务器配置\n *\n * @example\n * ```typescript\n * // 添加 stdio 服务\n * manager.addServer('calculator', {\n * type: 'stdio',\n * command: 'node',\n * args: ['calculator.js']\n * });\n *\n * // 添加 HTTP 服务\n * manager.addServer('web-search', {\n * type: 'http',\n * url: 'https://api.example.com/mcp',\n * headers: {\n * Authorization: 'Bearer your-api-key'\n * }\n * });\n * ```\n */\n addServer(\n name: string,\n config: MCPServiceConfig\n ): void {\n if (this.configs.has(name)) {\n throw new Error(`服务 ${name} 已存在`);\n }\n\n // 标准化 type 字段 - 将用户友好的类型映射到实际的枚举值\n const normalizedConfig: MCPServiceConfig = { ...config };\n\n if (config.type) {\n // 首先检查用户友好的字符串类型\n const typeStr = String(config.type);\n if (typeStr === \"http\") {\n normalizedConfig.type = MCPTransportType.HTTP;\n } else if (typeStr === \"sse\") {\n normalizedConfig.type = MCPTransportType.SSE;\n } else {\n // 已经是枚举值或正确格式\n normalizedConfig.type = config.type as MCPTransportType;\n }\n }\n\n // 存储 config(不包含 name,name 已作为 Map 的 key)\n this.configs.set(name, normalizedConfig);\n }\n\n /**\n * 移除服务器配置\n * @param name 服务器名称\n */\n removeServer(name: string): boolean {\n return this.configs.delete(name);\n }\n\n /**\n * 连接所有已添加的 MCP 服务\n * 所有服务并行连接,单个服务失败不会影响其他服务\n *\n * @example\n * ```typescript\n * await manager.connect();\n * ```\n */\n async connect(): Promise<void> {\n this.emit(\"connect\");\n\n const promises = Array.from(this.configs.entries()).map(\n async ([name, config]) => {\n try {\n const connection = new MCPConnection(name, config, {\n onConnected: (data) => {\n this.emit(\"connected\", {\n serverName: data.serviceName,\n tools: data.tools,\n });\n },\n onDisconnected: (data) => {\n this.emit(\"disconnected\", {\n serverName: data.serviceName,\n reason: data.reason,\n });\n },\n onConnectionFailed: (data) => {\n this.emit(\"error\", {\n serverName: data.serviceName,\n error: data.error,\n });\n },\n });\n\n await connection.connect();\n this.connections.set(name, connection);\n } catch (error) {\n this.emit(\"error\", { serverName: name, error });\n throw error;\n }\n }\n );\n\n await Promise.allSettled(promises);\n }\n\n /**\n * 断开所有 MCP 服务连接\n *\n * @example\n * ```typescript\n * await manager.disconnect();\n * ```\n */\n async disconnect(): Promise<void> {\n const promises = Array.from(this.connections.values()).map((conn) =>\n conn.disconnect()\n );\n\n await Promise.allSettled(promises);\n this.connections.clear();\n\n this.emit(\"disconnect\");\n }\n\n /**\n * 调用指定服务的工具\n * @param serverName 服务名称\n * @param toolName 工具名称\n * @param args 工具参数\n *\n * @example\n * ```typescript\n * const result = await manager.callTool('datetime', 'get_current_time', {\n * format: 'YYYY-MM-DD HH:mm:ss'\n * });\n * ```\n */\n async callTool(\n serverName: string,\n toolName: string,\n args: Record<string, unknown>\n ): Promise<ToolCallResult> {\n const connection = this.connections.get(serverName);\n if (!connection) {\n throw new Error(`服务 ${serverName} 不存在`);\n }\n\n if (!connection.isConnected()) {\n throw new Error(`服务 ${serverName} 未连接`);\n }\n\n return connection.callTool(toolName, args);\n }\n\n /**\n * 列出所有可用的工具\n * @returns 工具列表,格式为 [{ name, serverName, description, inputSchema }]\n *\n * @example\n * ```typescript\n * const tools = manager.listTools();\n * console.log('可用工具:', tools.map(t => `${t.serverName}/${t.name}`));\n * ```\n */\n listTools(): Array<{\n name: string;\n serverName: string;\n description: string;\n inputSchema: unknown;\n }> {\n const allTools: Array<{\n name: string;\n serverName: string;\n description: string;\n inputSchema: unknown;\n }> = [];\n\n for (const [serverName, connection] of this.connections) {\n if (connection.isConnected()) {\n const tools = connection.getTools();\n for (const tool of tools) {\n allTools.push({\n name: tool.name,\n serverName,\n description: tool.description || \"\",\n inputSchema: tool.inputSchema,\n });\n }\n }\n }\n\n return allTools;\n }\n\n /**\n * 获取服务状态\n * @param serverName 服务名称\n * @returns 服务状态,如果服务不存在则返回 null\n *\n * @example\n * ```typescript\n * const status = manager.getServerStatus('datetime');\n * if (status) {\n * console.log(`已连接: ${status.connected}, 工具数: ${status.toolCount}`);\n * }\n * ```\n */\n getServerStatus(serverName: string): {\n connected: boolean;\n toolCount: number;\n } | null {\n const connection = this.connections.get(serverName);\n if (!connection) {\n return null;\n }\n\n const status = connection.getStatus();\n return {\n connected: status.connected,\n toolCount: status.toolCount,\n };\n }\n\n /**\n * 获取所有服务的状态\n * @returns 所有服务的状态映射\n *\n * @example\n * ```typescript\n * const statuses = manager.getAllServerStatus();\n * console.log(statuses);\n * // {\n * // datetime: { connected: true, toolCount: 3 },\n * // calculator: { connected: true, toolCount: 1 }\n * // }\n * ```\n */\n getAllServerStatus(): Record<\n string,\n { connected: boolean; toolCount: number }\n > {\n const statuses: Record<string, { connected: boolean; toolCount: number }> =\n {};\n\n for (const [serverName, connection] of this.connections) {\n const status = connection.getStatus();\n statuses[serverName] = {\n connected: status.connected,\n toolCount: status.toolCount,\n };\n }\n\n return statuses;\n }\n\n /**\n * 检查服务是否已连接\n * @param serverName 服务名称\n *\n * @example\n * ```typescript\n * if (manager.isConnected('datetime')) {\n * console.log('datetime 服务已连接');\n * }\n * ```\n */\n isConnected(serverName: string): boolean {\n const connection = this.connections.get(serverName);\n return connection ? connection.isConnected() : false;\n }\n\n /**\n * 获取已配置的服务列表\n * @returns 服务名称数组\n *\n * @example\n * ```typescript\n * const servers = manager.getServerNames();\n * console.log('已配置的服务:', servers);\n * ```\n */\n getServerNames(): string[] {\n return Array.from(this.configs.keys());\n }\n\n /**\n * 获取已连接的服务列表\n * @returns 已连接的服务名称数组\n *\n * @example\n * ```typescript\n * const connectedServers = manager.getConnectedServerNames();\n * console.log('已连接的服务:', connectedServers);\n * ```\n */\n getConnectedServerNames(): string[] {\n const connected: string[] = [];\n for (const [serverName, connection] of this.connections) {\n if (connection.isConnected()) {\n connected.push(serverName);\n }\n }\n return connected;\n }\n}\n\n// 为了向后兼容,保留旧的 MCPServiceManager 类名作为别名\nexport { MCPManager as MCPServiceManager };\n"],"mappings":"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","names":["MCPTransportType","ConnectionState","ToolCallErrorCode","TypeFieldNormalizer","normalizeTypeField"]}
|