@bowenqt/qiniu-ai-sdk 0.10.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +225 -0
- package/dist/ai/agent-graph.d.ts +101 -0
- package/dist/ai/agent-graph.d.ts.map +1 -0
- package/dist/ai/agent-graph.js +322 -0
- package/dist/ai/agent-graph.js.map +1 -0
- package/dist/ai/agent-graph.mjs +318 -0
- package/dist/ai/generate-text.d.ts +58 -0
- package/dist/ai/generate-text.d.ts.map +1 -1
- package/dist/ai/generate-text.js +157 -0
- package/dist/ai/generate-text.js.map +1 -1
- package/dist/ai/generate-text.mjs +156 -0
- package/dist/ai/graph/checkpointer.d.ts +112 -0
- package/dist/ai/graph/checkpointer.d.ts.map +1 -0
- package/dist/ai/graph/checkpointer.js +131 -0
- package/dist/ai/graph/checkpointer.js.map +1 -0
- package/dist/ai/graph/checkpointer.mjs +126 -0
- package/dist/ai/graph/index.d.ts +13 -0
- package/dist/ai/graph/index.d.ts.map +1 -0
- package/dist/ai/graph/index.js +22 -0
- package/dist/ai/graph/index.js.map +1 -0
- package/dist/ai/graph/index.mjs +12 -0
- package/dist/ai/graph/postgres-checkpointer.d.ts +54 -0
- package/dist/ai/graph/postgres-checkpointer.d.ts.map +1 -0
- package/dist/ai/graph/postgres-checkpointer.js +134 -0
- package/dist/ai/graph/postgres-checkpointer.js.map +1 -0
- package/dist/ai/graph/postgres-checkpointer.mjs +130 -0
- package/dist/ai/graph/redis-checkpointer.d.ts +51 -0
- package/dist/ai/graph/redis-checkpointer.d.ts.map +1 -0
- package/dist/ai/graph/redis-checkpointer.js +124 -0
- package/dist/ai/graph/redis-checkpointer.js.map +1 -0
- package/dist/ai/graph/redis-checkpointer.mjs +120 -0
- package/dist/ai/graph/state-graph.d.ts +41 -0
- package/dist/ai/graph/state-graph.d.ts.map +1 -0
- package/dist/ai/graph/state-graph.js +149 -0
- package/dist/ai/graph/state-graph.js.map +1 -0
- package/dist/ai/graph/state-graph.mjs +144 -0
- package/dist/ai/graph/types.d.ts +41 -0
- package/dist/ai/graph/types.d.ts.map +1 -0
- package/dist/ai/graph/types.js +10 -0
- package/dist/ai/graph/types.js.map +1 -0
- package/dist/ai/graph/types.mjs +7 -0
- package/dist/ai/internal-types.d.ts +109 -0
- package/dist/ai/internal-types.d.ts.map +1 -0
- package/dist/ai/internal-types.js +28 -0
- package/dist/ai/internal-types.js.map +1 -0
- package/dist/ai/internal-types.mjs +23 -0
- package/dist/ai/nodes/execute-node.d.ts +27 -0
- package/dist/ai/nodes/execute-node.d.ts.map +1 -0
- package/dist/ai/nodes/execute-node.js +118 -0
- package/dist/ai/nodes/execute-node.js.map +1 -0
- package/dist/ai/nodes/execute-node.mjs +114 -0
- package/dist/ai/nodes/index.d.ts +8 -0
- package/dist/ai/nodes/index.d.ts.map +1 -0
- package/dist/ai/nodes/index.js +16 -0
- package/dist/ai/nodes/index.js.map +1 -0
- package/dist/ai/nodes/index.mjs +7 -0
- package/dist/ai/nodes/memory-node.d.ts +34 -0
- package/dist/ai/nodes/memory-node.d.ts.map +1 -0
- package/dist/ai/nodes/memory-node.js +164 -0
- package/dist/ai/nodes/memory-node.js.map +1 -0
- package/dist/ai/nodes/memory-node.mjs +158 -0
- package/dist/ai/nodes/predict-node.d.ts +42 -0
- package/dist/ai/nodes/predict-node.d.ts.map +1 -0
- package/dist/ai/nodes/predict-node.js +89 -0
- package/dist/ai/nodes/predict-node.js.map +1 -0
- package/dist/ai/nodes/predict-node.mjs +86 -0
- package/dist/ai/nodes/types.d.ts +44 -0
- package/dist/ai/nodes/types.d.ts.map +1 -0
- package/dist/ai/nodes/types.js +6 -0
- package/dist/ai/nodes/types.js.map +1 -0
- package/dist/ai/nodes/types.mjs +5 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +80 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +34 -0
- package/dist/lib/otel-tracer.d.ts +47 -0
- package/dist/lib/otel-tracer.d.ts.map +1 -0
- package/dist/lib/otel-tracer.js +79 -0
- package/dist/lib/otel-tracer.js.map +1 -0
- package/dist/lib/otel-tracer.mjs +75 -0
- package/dist/lib/token-estimator.d.ts +62 -0
- package/dist/lib/token-estimator.d.ts.map +1 -0
- package/dist/lib/token-estimator.js +106 -0
- package/dist/lib/token-estimator.js.map +1 -0
- package/dist/lib/token-estimator.mjs +100 -0
- package/dist/lib/tool-registry.d.ts +103 -0
- package/dist/lib/tool-registry.d.ts.map +1 -0
- package/dist/lib/tool-registry.js +159 -0
- package/dist/lib/tool-registry.js.map +1 -0
- package/dist/lib/tool-registry.mjs +154 -0
- package/dist/lib/tracer.d.ts +85 -0
- package/dist/lib/tracer.d.ts.map +1 -0
- package/dist/lib/tracer.js +170 -0
- package/dist/lib/tracer.js.map +1 -0
- package/dist/lib/tracer.mjs +161 -0
- package/dist/lib/types.d.ts +11 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/modules/mcp/adapter.d.ts +23 -0
- package/dist/modules/mcp/adapter.d.ts.map +1 -0
- package/dist/modules/mcp/adapter.js +63 -0
- package/dist/modules/mcp/adapter.js.map +1 -0
- package/dist/modules/mcp/adapter.mjs +58 -0
- package/dist/modules/mcp/client.d.ts +75 -0
- package/dist/modules/mcp/client.d.ts.map +1 -0
- package/dist/modules/mcp/client.js +300 -0
- package/dist/modules/mcp/client.js.map +1 -0
- package/dist/modules/mcp/client.mjs +295 -0
- package/dist/modules/mcp/http-transport.d.ts +51 -0
- package/dist/modules/mcp/http-transport.d.ts.map +1 -0
- package/dist/modules/mcp/http-transport.js +146 -0
- package/dist/modules/mcp/http-transport.js.map +1 -0
- package/dist/modules/mcp/http-transport.mjs +141 -0
- package/dist/modules/mcp/index.d.ts +11 -0
- package/dist/modules/mcp/index.d.ts.map +1 -0
- package/dist/modules/mcp/index.js +34 -0
- package/dist/modules/mcp/index.js.map +1 -0
- package/dist/modules/mcp/index.mjs +14 -0
- package/dist/modules/mcp/oauth.d.ts +101 -0
- package/dist/modules/mcp/oauth.d.ts.map +1 -0
- package/dist/modules/mcp/oauth.js +347 -0
- package/dist/modules/mcp/oauth.js.map +1 -0
- package/dist/modules/mcp/oauth.mjs +304 -0
- package/dist/modules/mcp/token-store.d.ts +69 -0
- package/dist/modules/mcp/token-store.d.ts.map +1 -0
- package/dist/modules/mcp/token-store.js +174 -0
- package/dist/modules/mcp/token-store.js.map +1 -0
- package/dist/modules/mcp/token-store.mjs +135 -0
- package/dist/modules/mcp/types.d.ts +91 -0
- package/dist/modules/mcp/types.d.ts.map +1 -0
- package/dist/modules/mcp/types.js +14 -0
- package/dist/modules/mcp/types.js.map +1 -0
- package/dist/modules/mcp/types.mjs +11 -0
- package/dist/modules/skills/index.d.ts +7 -0
- package/dist/modules/skills/index.d.ts.map +1 -0
- package/dist/modules/skills/index.js +14 -0
- package/dist/modules/skills/index.js.map +1 -0
- package/dist/modules/skills/index.mjs +6 -0
- package/dist/modules/skills/loader.d.ts +51 -0
- package/dist/modules/skills/loader.d.ts.map +1 -0
- package/dist/modules/skills/loader.js +237 -0
- package/dist/modules/skills/loader.js.map +1 -0
- package/dist/modules/skills/loader.mjs +198 -0
- package/dist/modules/skills/types.d.ts +60 -0
- package/dist/modules/skills/types.d.ts.map +1 -0
- package/dist/modules/skills/types.js +20 -0
- package/dist/modules/skills/types.js.map +1 -0
- package/dist/modules/skills/types.mjs +17 -0
- package/package.json +4 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Tool Adapter - converts MCP tools to SDK RegisteredTool format.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.adaptMCPToolsToRegistry = adaptMCPToolsToRegistry;
|
|
7
|
+
exports.getServerTools = getServerTools;
|
|
8
|
+
exports.getAllMCPToolsAsRegistered = getAllMCPToolsAsRegistered;
|
|
9
|
+
/**
|
|
10
|
+
* Convert MCP tools to SDK RegisteredTool format.
|
|
11
|
+
* Sorted by name for deterministic registration order.
|
|
12
|
+
*/
|
|
13
|
+
function adaptMCPToolsToRegistry(tools, serverName, client) {
|
|
14
|
+
const source = {
|
|
15
|
+
type: 'mcp',
|
|
16
|
+
namespace: serverName,
|
|
17
|
+
};
|
|
18
|
+
return tools
|
|
19
|
+
.map(tool => ({
|
|
20
|
+
name: tool.name,
|
|
21
|
+
description: tool.description,
|
|
22
|
+
parameters: tool.inputSchema,
|
|
23
|
+
source,
|
|
24
|
+
execute: async (args) => {
|
|
25
|
+
const result = await client.executeTool(serverName, tool.name, args);
|
|
26
|
+
// Extract text content
|
|
27
|
+
const textContents = result.content
|
|
28
|
+
.filter(c => c.type === 'text' && c.text)
|
|
29
|
+
.map(c => c.text)
|
|
30
|
+
.join('\n');
|
|
31
|
+
if (result.isError) {
|
|
32
|
+
throw new Error(textContents || 'Tool execution failed');
|
|
33
|
+
}
|
|
34
|
+
return textContents || result;
|
|
35
|
+
},
|
|
36
|
+
}))
|
|
37
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get all tools from a specific MCP server.
|
|
41
|
+
* Each server maintains its own tool list.
|
|
42
|
+
*/
|
|
43
|
+
function getServerTools(client, serverName) {
|
|
44
|
+
const tools = client.getServerTools(serverName);
|
|
45
|
+
return adaptMCPToolsToRegistry(tools, serverName, client);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get all tools from all connected MCP servers.
|
|
49
|
+
* Tools are collected per-server and concatenated; actual deduplication
|
|
50
|
+
* happens in ToolRegistry via priority/conflict resolution.
|
|
51
|
+
*/
|
|
52
|
+
function getAllMCPToolsAsRegistered(client) {
|
|
53
|
+
const allTools = [];
|
|
54
|
+
const serverNames = client.getConnectedServerNames();
|
|
55
|
+
// Sort server names for deterministic order
|
|
56
|
+
const sorted = [...serverNames].sort();
|
|
57
|
+
for (const serverName of sorted) {
|
|
58
|
+
const serverTools = getServerTools(client, serverName);
|
|
59
|
+
allTools.push(...serverTools);
|
|
60
|
+
}
|
|
61
|
+
return allTools;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/modules/mcp/adapter.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAUH,0DAiCC;AAMD,wCAMC;AAOD,gEAeC;AAvED;;;GAGG;AACH,SAAgB,uBAAuB,CACnC,KAA0B,EAC1B,UAAkB,EAClB,MAAiB;IAEjB,MAAM,MAAM,GAAe;QACvB,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,UAAU;KACxB,CAAC;IAEF,OAAO,KAAK;SACP,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACV,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,WAAW;QAC5B,MAAM;QACN,OAAO,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;YAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAErE,uBAAuB;YACvB,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO;iBAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC;iBACxC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAChB,IAAI,CAAC,IAAI,CAAC,CAAC;YAEhB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,uBAAuB,CAAC,CAAC;YAC7D,CAAC;YAED,OAAO,YAAY,IAAI,MAAM,CAAC;QAClC,CAAC;KACJ,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAC1B,MAAiB,EACjB,UAAkB;IAElB,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAChD,OAAO,uBAAuB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,SAAgB,0BAA0B,CACtC,MAAiB;IAEjB,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,CAAC,uBAAuB,EAAE,CAAC;IAErD,4CAA4C;IAC5C,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IAEvC,KAAK,MAAM,UAAU,IAAI,MAAM,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Adapter - converts MCP tools to SDK RegisteredTool format.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Convert MCP tools to SDK RegisteredTool format.
|
|
6
|
+
* Sorted by name for deterministic registration order.
|
|
7
|
+
*/
|
|
8
|
+
export function adaptMCPToolsToRegistry(tools, serverName, client) {
|
|
9
|
+
const source = {
|
|
10
|
+
type: 'mcp',
|
|
11
|
+
namespace: serverName,
|
|
12
|
+
};
|
|
13
|
+
return tools
|
|
14
|
+
.map(tool => ({
|
|
15
|
+
name: tool.name,
|
|
16
|
+
description: tool.description,
|
|
17
|
+
parameters: tool.inputSchema,
|
|
18
|
+
source,
|
|
19
|
+
execute: async (args) => {
|
|
20
|
+
const result = await client.executeTool(serverName, tool.name, args);
|
|
21
|
+
// Extract text content
|
|
22
|
+
const textContents = result.content
|
|
23
|
+
.filter(c => c.type === 'text' && c.text)
|
|
24
|
+
.map(c => c.text)
|
|
25
|
+
.join('\n');
|
|
26
|
+
if (result.isError) {
|
|
27
|
+
throw new Error(textContents || 'Tool execution failed');
|
|
28
|
+
}
|
|
29
|
+
return textContents || result;
|
|
30
|
+
},
|
|
31
|
+
}))
|
|
32
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get all tools from a specific MCP server.
|
|
36
|
+
* Each server maintains its own tool list.
|
|
37
|
+
*/
|
|
38
|
+
export function getServerTools(client, serverName) {
|
|
39
|
+
const tools = client.getServerTools(serverName);
|
|
40
|
+
return adaptMCPToolsToRegistry(tools, serverName, client);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get all tools from all connected MCP servers.
|
|
44
|
+
* Tools are collected per-server and concatenated; actual deduplication
|
|
45
|
+
* happens in ToolRegistry via priority/conflict resolution.
|
|
46
|
+
*/
|
|
47
|
+
export function getAllMCPToolsAsRegistered(client) {
|
|
48
|
+
const allTools = [];
|
|
49
|
+
const serverNames = client.getConnectedServerNames();
|
|
50
|
+
// Sort server names for deterministic order
|
|
51
|
+
const sorted = [...serverNames].sort();
|
|
52
|
+
for (const serverName of sorted) {
|
|
53
|
+
const serverTools = getServerTools(client, serverName);
|
|
54
|
+
allTools.push(...serverTools);
|
|
55
|
+
}
|
|
56
|
+
return allTools;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Client with stdio and HTTP transport support.
|
|
3
|
+
* Phase 1: Bearer token, Phase 3: OAuth 2.0
|
|
4
|
+
*/
|
|
5
|
+
import type { MCPClientConfig, MCPToolDefinition, MCPToolResult, MCPConnectionState } from './types';
|
|
6
|
+
import type { Logger } from '../../lib/logger';
|
|
7
|
+
/** MCP Client error */
|
|
8
|
+
export declare class MCPClientError extends Error {
|
|
9
|
+
readonly serverName?: string | undefined;
|
|
10
|
+
constructor(message: string, serverName?: string | undefined);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* MCP Client manages connections to MCP servers.
|
|
14
|
+
*/
|
|
15
|
+
export declare class MCPClient {
|
|
16
|
+
private readonly config;
|
|
17
|
+
private readonly logger;
|
|
18
|
+
private readonly connections;
|
|
19
|
+
constructor(config: MCPClientConfig, logger?: Logger);
|
|
20
|
+
/**
|
|
21
|
+
* Connect to all configured servers.
|
|
22
|
+
*/
|
|
23
|
+
connect(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Connect to a specific server.
|
|
26
|
+
*/
|
|
27
|
+
connectServer(serverName: string): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Disconnect from all servers.
|
|
30
|
+
*/
|
|
31
|
+
disconnect(): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Get all tools from all connected servers.
|
|
34
|
+
* Sorted by server name, then tool name for deterministic order.
|
|
35
|
+
* Only returns tools from servers with state 'connected'.
|
|
36
|
+
*/
|
|
37
|
+
getAllTools(): MCPToolDefinition[];
|
|
38
|
+
/**
|
|
39
|
+
* Execute a tool.
|
|
40
|
+
*/
|
|
41
|
+
executeTool(serverName: string, toolName: string, args: Record<string, unknown>): Promise<MCPToolResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Get connection state.
|
|
44
|
+
*/
|
|
45
|
+
getState(serverName: string): MCPConnectionState;
|
|
46
|
+
/**
|
|
47
|
+
* Get tools for a specific server.
|
|
48
|
+
*/
|
|
49
|
+
getServerTools(serverName: string): MCPToolDefinition[];
|
|
50
|
+
/**
|
|
51
|
+
* Get names of all connected servers.
|
|
52
|
+
*/
|
|
53
|
+
getConnectedServerNames(): string[];
|
|
54
|
+
/**
|
|
55
|
+
* Initialize connection (MCP handshake).
|
|
56
|
+
*/
|
|
57
|
+
private initialize;
|
|
58
|
+
/**
|
|
59
|
+
* List tools from server.
|
|
60
|
+
*/
|
|
61
|
+
private listToolsInternal;
|
|
62
|
+
/**
|
|
63
|
+
* Send JSON-RPC request.
|
|
64
|
+
*/
|
|
65
|
+
private sendRequest;
|
|
66
|
+
/**
|
|
67
|
+
* Send JSON-RPC notification.
|
|
68
|
+
*/
|
|
69
|
+
private sendNotification;
|
|
70
|
+
/**
|
|
71
|
+
* Handle incoming data.
|
|
72
|
+
*/
|
|
73
|
+
private handleData;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/modules/mcp/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACR,eAAe,EAGf,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EACrB,MAAM,SAAS,CAAC;AAEjB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI/C,uBAAuB;AACvB,qBAAa,cAAe,SAAQ,KAAK;aACQ,UAAU,CAAC,EAAE,MAAM;gBAApD,OAAO,EAAE,MAAM,EAAkB,UAAU,CAAC,EAAE,MAAM,YAAA;CAInE;AAmBD;;GAEG;AACH,qBAAa,SAAS;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuC;gBAEvD,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,MAAM;IAsBpD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmGtD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC;;;;OAIG;IACH,WAAW,IAAI,iBAAiB,EAAE;IAiBlC;;OAEG;IACG,WAAW,CACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,aAAa,CAAC;IAkBzB;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB;IAIhD;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,EAAE;IAQvD;;OAEG;IACH,uBAAuB,IAAI,MAAM,EAAE;IAUnC;;OAEG;YACW,UAAU;IAaxB;;OAEG;YACW,iBAAiB;IAO/B;;OAEG;IACH,OAAO,CAAC,WAAW;IAiBnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,OAAO,CAAC,UAAU;CA6BrB"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Client with stdio and HTTP transport support.
|
|
4
|
+
* Phase 1: Bearer token, Phase 3: OAuth 2.0
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.MCPClient = exports.MCPClientError = void 0;
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const types_1 = require("./types");
|
|
10
|
+
const logger_1 = require("../../lib/logger");
|
|
11
|
+
const http_transport_1 = require("./http-transport");
|
|
12
|
+
/** MCP Client error */
|
|
13
|
+
class MCPClientError extends Error {
|
|
14
|
+
constructor(message, serverName) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.serverName = serverName;
|
|
17
|
+
this.name = 'MCPClientError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.MCPClientError = MCPClientError;
|
|
21
|
+
/**
|
|
22
|
+
* MCP Client manages connections to MCP servers.
|
|
23
|
+
*/
|
|
24
|
+
class MCPClient {
|
|
25
|
+
constructor(config, logger) {
|
|
26
|
+
this.connections = new Map();
|
|
27
|
+
this.config = {
|
|
28
|
+
servers: config.servers,
|
|
29
|
+
connectionTimeout: config.connectionTimeout ?? types_1.DEFAULT_MCP_CONFIG.connectionTimeout,
|
|
30
|
+
};
|
|
31
|
+
this.logger = logger ?? logger_1.noopLogger;
|
|
32
|
+
// Initialize connections (not started)
|
|
33
|
+
for (const server of this.config.servers) {
|
|
34
|
+
this.connections.set(server.name, {
|
|
35
|
+
config: server,
|
|
36
|
+
process: null,
|
|
37
|
+
httpTransport: null,
|
|
38
|
+
state: 'disconnected',
|
|
39
|
+
tools: [],
|
|
40
|
+
requestId: 0,
|
|
41
|
+
pendingRequests: new Map(),
|
|
42
|
+
buffer: '',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Connect to all configured servers.
|
|
48
|
+
*/
|
|
49
|
+
async connect() {
|
|
50
|
+
const promises = Array.from(this.connections.keys()).map(name => this.connectServer(name));
|
|
51
|
+
await Promise.all(promises);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Connect to a specific server.
|
|
55
|
+
*/
|
|
56
|
+
async connectServer(serverName) {
|
|
57
|
+
const conn = this.connections.get(serverName);
|
|
58
|
+
if (!conn) {
|
|
59
|
+
throw new MCPClientError(`Server not found: ${serverName}`, serverName);
|
|
60
|
+
}
|
|
61
|
+
if (conn.state === 'connected') {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
conn.state = 'connecting';
|
|
65
|
+
try {
|
|
66
|
+
if (conn.config.transport === 'http') {
|
|
67
|
+
// HTTP transport (Phase 3)
|
|
68
|
+
const httpConfig = conn.config;
|
|
69
|
+
// Validate authentication configuration
|
|
70
|
+
if (httpConfig.oauth && !httpConfig.token && !httpConfig.tokenProvider) {
|
|
71
|
+
throw new MCPClientError(`OAuth configured for '${serverName}' but no token or tokenProvider provided. ` +
|
|
72
|
+
'Use PKCEFlow/DeviceCodeFlow to obtain tokens first, then provide via token or tokenProvider.', serverName);
|
|
73
|
+
}
|
|
74
|
+
conn.httpTransport = new http_transport_1.MCPHttpTransport(httpConfig);
|
|
75
|
+
// Connect with timeout
|
|
76
|
+
await Promise.race([
|
|
77
|
+
conn.httpTransport.connect(),
|
|
78
|
+
new Promise((_, reject) => setTimeout(() => reject(new MCPClientError('Connection timeout', serverName)), this.config.connectionTimeout)),
|
|
79
|
+
]);
|
|
80
|
+
// List tools via HTTP transport
|
|
81
|
+
conn.tools = await conn.httpTransport.listTools();
|
|
82
|
+
conn.state = 'connected';
|
|
83
|
+
this.logger.info('MCP HTTP server connected', {
|
|
84
|
+
server: serverName,
|
|
85
|
+
tools: conn.tools.length,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// Stdio transport (Phase 1)
|
|
90
|
+
const { command, args = [], env = {}, token } = conn.config;
|
|
91
|
+
// Inject bearer token via env if configured
|
|
92
|
+
const processEnv = { ...process.env, ...env };
|
|
93
|
+
if (token) {
|
|
94
|
+
processEnv.MCP_BEARER_TOKEN = token;
|
|
95
|
+
}
|
|
96
|
+
conn.process = (0, child_process_1.spawn)(command, args, {
|
|
97
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
98
|
+
env: processEnv,
|
|
99
|
+
});
|
|
100
|
+
// Handle stdout (JSON-RPC responses)
|
|
101
|
+
conn.process.stdout?.on('data', (data) => {
|
|
102
|
+
this.handleData(serverName, data.toString());
|
|
103
|
+
});
|
|
104
|
+
// Handle stderr (logs)
|
|
105
|
+
conn.process.stderr?.on('data', (data) => {
|
|
106
|
+
this.logger.debug('MCP server stderr', { server: serverName, data: data.toString() });
|
|
107
|
+
});
|
|
108
|
+
// Handle exit
|
|
109
|
+
conn.process.on('exit', (code) => {
|
|
110
|
+
this.logger.info('MCP server exited', { server: serverName, code });
|
|
111
|
+
conn.state = 'disconnected';
|
|
112
|
+
conn.process = null;
|
|
113
|
+
});
|
|
114
|
+
// Wait for connection with timeout
|
|
115
|
+
await Promise.race([
|
|
116
|
+
this.initialize(serverName),
|
|
117
|
+
new Promise((_, reject) => setTimeout(() => reject(new MCPClientError('Connection timeout', serverName)), this.config.connectionTimeout)),
|
|
118
|
+
]);
|
|
119
|
+
// List tools
|
|
120
|
+
conn.tools = await this.listToolsInternal(serverName);
|
|
121
|
+
conn.state = 'connected';
|
|
122
|
+
this.logger.info('MCP server connected', {
|
|
123
|
+
server: serverName,
|
|
124
|
+
tools: conn.tools.length,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
conn.state = 'error';
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Disconnect from all servers.
|
|
135
|
+
*/
|
|
136
|
+
async disconnect() {
|
|
137
|
+
for (const [name, conn] of this.connections) {
|
|
138
|
+
if (conn.httpTransport) {
|
|
139
|
+
await conn.httpTransport.disconnect();
|
|
140
|
+
conn.httpTransport = null;
|
|
141
|
+
conn.state = 'disconnected';
|
|
142
|
+
this.logger.info('MCP HTTP server disconnected', { server: name });
|
|
143
|
+
}
|
|
144
|
+
else if (conn.process) {
|
|
145
|
+
conn.process.kill();
|
|
146
|
+
conn.process = null;
|
|
147
|
+
conn.state = 'disconnected';
|
|
148
|
+
this.logger.info('MCP server disconnected', { server: name });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get all tools from all connected servers.
|
|
154
|
+
* Sorted by server name, then tool name for deterministic order.
|
|
155
|
+
* Only returns tools from servers with state 'connected'.
|
|
156
|
+
*/
|
|
157
|
+
getAllTools() {
|
|
158
|
+
const allTools = [];
|
|
159
|
+
const serverNames = Array.from(this.connections.keys()).sort();
|
|
160
|
+
for (const serverName of serverNames) {
|
|
161
|
+
const conn = this.connections.get(serverName);
|
|
162
|
+
// Only include tools from connected servers
|
|
163
|
+
if (conn.state !== 'connected')
|
|
164
|
+
continue;
|
|
165
|
+
for (const tool of conn.tools) {
|
|
166
|
+
allTools.push({ ...tool, server: serverName });
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Sort by tool name
|
|
170
|
+
return allTools.sort((a, b) => a.name.localeCompare(b.name));
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Execute a tool.
|
|
174
|
+
*/
|
|
175
|
+
async executeTool(serverName, toolName, args) {
|
|
176
|
+
const conn = this.connections.get(serverName);
|
|
177
|
+
if (!conn || conn.state !== 'connected') {
|
|
178
|
+
throw new MCPClientError(`Server not connected: ${serverName}`, serverName);
|
|
179
|
+
}
|
|
180
|
+
// HTTP transport uses MCPHttpTransport
|
|
181
|
+
if (conn.httpTransport) {
|
|
182
|
+
return conn.httpTransport.executeTool(toolName, args);
|
|
183
|
+
}
|
|
184
|
+
// Stdio transport uses JSON-RPC
|
|
185
|
+
return this.sendRequest(serverName, 'tools/call', {
|
|
186
|
+
name: toolName,
|
|
187
|
+
arguments: args,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get connection state.
|
|
192
|
+
*/
|
|
193
|
+
getState(serverName) {
|
|
194
|
+
return this.connections.get(serverName)?.state ?? 'disconnected';
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get tools for a specific server.
|
|
198
|
+
*/
|
|
199
|
+
getServerTools(serverName) {
|
|
200
|
+
const conn = this.connections.get(serverName);
|
|
201
|
+
if (!conn || conn.state !== 'connected') {
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
return conn.tools;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get names of all connected servers.
|
|
208
|
+
*/
|
|
209
|
+
getConnectedServerNames() {
|
|
210
|
+
const names = [];
|
|
211
|
+
for (const [name, conn] of this.connections) {
|
|
212
|
+
if (conn.state === 'connected') {
|
|
213
|
+
names.push(name);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return names.sort();
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Initialize connection (MCP handshake).
|
|
220
|
+
*/
|
|
221
|
+
async initialize(serverName) {
|
|
222
|
+
await this.sendRequest(serverName, 'initialize', {
|
|
223
|
+
protocolVersion: '2024-11-05',
|
|
224
|
+
capabilities: {},
|
|
225
|
+
clientInfo: {
|
|
226
|
+
name: 'qiniu-ai-sdk',
|
|
227
|
+
version: '0.11.0',
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
await this.sendNotification(serverName, 'notifications/initialized', {});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* List tools from server.
|
|
234
|
+
*/
|
|
235
|
+
async listToolsInternal(serverName) {
|
|
236
|
+
const result = await this.sendRequest(serverName, 'tools/list', {});
|
|
237
|
+
return result.tools ?? [];
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Send JSON-RPC request.
|
|
241
|
+
*/
|
|
242
|
+
sendRequest(serverName, method, params) {
|
|
243
|
+
const conn = this.connections.get(serverName);
|
|
244
|
+
const id = ++conn.requestId;
|
|
245
|
+
const message = JSON.stringify({
|
|
246
|
+
jsonrpc: '2.0',
|
|
247
|
+
id,
|
|
248
|
+
method,
|
|
249
|
+
params,
|
|
250
|
+
}) + '\n';
|
|
251
|
+
return new Promise((resolve, reject) => {
|
|
252
|
+
conn.pendingRequests.set(id, { resolve, reject });
|
|
253
|
+
conn.process?.stdin?.write(message);
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Send JSON-RPC notification.
|
|
258
|
+
*/
|
|
259
|
+
sendNotification(serverName, method, params) {
|
|
260
|
+
const conn = this.connections.get(serverName);
|
|
261
|
+
const message = JSON.stringify({
|
|
262
|
+
jsonrpc: '2.0',
|
|
263
|
+
method,
|
|
264
|
+
params,
|
|
265
|
+
}) + '\n';
|
|
266
|
+
conn.process?.stdin?.write(message);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Handle incoming data.
|
|
270
|
+
*/
|
|
271
|
+
handleData(serverName, data) {
|
|
272
|
+
const conn = this.connections.get(serverName);
|
|
273
|
+
conn.buffer += data;
|
|
274
|
+
// Process complete messages
|
|
275
|
+
const lines = conn.buffer.split('\n');
|
|
276
|
+
conn.buffer = lines.pop() ?? '';
|
|
277
|
+
for (const line of lines) {
|
|
278
|
+
if (!line.trim())
|
|
279
|
+
continue;
|
|
280
|
+
try {
|
|
281
|
+
const message = JSON.parse(line);
|
|
282
|
+
if (message.id !== undefined && conn.pendingRequests.has(message.id)) {
|
|
283
|
+
const { resolve, reject } = conn.pendingRequests.get(message.id);
|
|
284
|
+
conn.pendingRequests.delete(message.id);
|
|
285
|
+
if (message.error) {
|
|
286
|
+
reject(new MCPClientError(message.error.message, serverName));
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
resolve(message.result);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
this.logger.warn('Failed to parse MCP message', { server: serverName, line });
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
exports.MCPClient = MCPClient;
|
|
300
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/modules/mcp/client.ts"],"names":[],"mappings":"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"}
|