@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.
Files changed (149) hide show
  1. package/README.md +225 -0
  2. package/dist/ai/agent-graph.d.ts +101 -0
  3. package/dist/ai/agent-graph.d.ts.map +1 -0
  4. package/dist/ai/agent-graph.js +322 -0
  5. package/dist/ai/agent-graph.js.map +1 -0
  6. package/dist/ai/agent-graph.mjs +318 -0
  7. package/dist/ai/generate-text.d.ts +58 -0
  8. package/dist/ai/generate-text.d.ts.map +1 -1
  9. package/dist/ai/generate-text.js +157 -0
  10. package/dist/ai/generate-text.js.map +1 -1
  11. package/dist/ai/generate-text.mjs +156 -0
  12. package/dist/ai/graph/checkpointer.d.ts +112 -0
  13. package/dist/ai/graph/checkpointer.d.ts.map +1 -0
  14. package/dist/ai/graph/checkpointer.js +131 -0
  15. package/dist/ai/graph/checkpointer.js.map +1 -0
  16. package/dist/ai/graph/checkpointer.mjs +126 -0
  17. package/dist/ai/graph/index.d.ts +13 -0
  18. package/dist/ai/graph/index.d.ts.map +1 -0
  19. package/dist/ai/graph/index.js +22 -0
  20. package/dist/ai/graph/index.js.map +1 -0
  21. package/dist/ai/graph/index.mjs +12 -0
  22. package/dist/ai/graph/postgres-checkpointer.d.ts +54 -0
  23. package/dist/ai/graph/postgres-checkpointer.d.ts.map +1 -0
  24. package/dist/ai/graph/postgres-checkpointer.js +134 -0
  25. package/dist/ai/graph/postgres-checkpointer.js.map +1 -0
  26. package/dist/ai/graph/postgres-checkpointer.mjs +130 -0
  27. package/dist/ai/graph/redis-checkpointer.d.ts +51 -0
  28. package/dist/ai/graph/redis-checkpointer.d.ts.map +1 -0
  29. package/dist/ai/graph/redis-checkpointer.js +124 -0
  30. package/dist/ai/graph/redis-checkpointer.js.map +1 -0
  31. package/dist/ai/graph/redis-checkpointer.mjs +120 -0
  32. package/dist/ai/graph/state-graph.d.ts +41 -0
  33. package/dist/ai/graph/state-graph.d.ts.map +1 -0
  34. package/dist/ai/graph/state-graph.js +149 -0
  35. package/dist/ai/graph/state-graph.js.map +1 -0
  36. package/dist/ai/graph/state-graph.mjs +144 -0
  37. package/dist/ai/graph/types.d.ts +41 -0
  38. package/dist/ai/graph/types.d.ts.map +1 -0
  39. package/dist/ai/graph/types.js +10 -0
  40. package/dist/ai/graph/types.js.map +1 -0
  41. package/dist/ai/graph/types.mjs +7 -0
  42. package/dist/ai/internal-types.d.ts +109 -0
  43. package/dist/ai/internal-types.d.ts.map +1 -0
  44. package/dist/ai/internal-types.js +28 -0
  45. package/dist/ai/internal-types.js.map +1 -0
  46. package/dist/ai/internal-types.mjs +23 -0
  47. package/dist/ai/nodes/execute-node.d.ts +27 -0
  48. package/dist/ai/nodes/execute-node.d.ts.map +1 -0
  49. package/dist/ai/nodes/execute-node.js +118 -0
  50. package/dist/ai/nodes/execute-node.js.map +1 -0
  51. package/dist/ai/nodes/execute-node.mjs +114 -0
  52. package/dist/ai/nodes/index.d.ts +8 -0
  53. package/dist/ai/nodes/index.d.ts.map +1 -0
  54. package/dist/ai/nodes/index.js +16 -0
  55. package/dist/ai/nodes/index.js.map +1 -0
  56. package/dist/ai/nodes/index.mjs +7 -0
  57. package/dist/ai/nodes/memory-node.d.ts +34 -0
  58. package/dist/ai/nodes/memory-node.d.ts.map +1 -0
  59. package/dist/ai/nodes/memory-node.js +164 -0
  60. package/dist/ai/nodes/memory-node.js.map +1 -0
  61. package/dist/ai/nodes/memory-node.mjs +158 -0
  62. package/dist/ai/nodes/predict-node.d.ts +42 -0
  63. package/dist/ai/nodes/predict-node.d.ts.map +1 -0
  64. package/dist/ai/nodes/predict-node.js +89 -0
  65. package/dist/ai/nodes/predict-node.js.map +1 -0
  66. package/dist/ai/nodes/predict-node.mjs +86 -0
  67. package/dist/ai/nodes/types.d.ts +44 -0
  68. package/dist/ai/nodes/types.d.ts.map +1 -0
  69. package/dist/ai/nodes/types.js +6 -0
  70. package/dist/ai/nodes/types.js.map +1 -0
  71. package/dist/ai/nodes/types.mjs +5 -0
  72. package/dist/index.d.ts +23 -0
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +80 -1
  75. package/dist/index.js.map +1 -1
  76. package/dist/index.mjs +34 -0
  77. package/dist/lib/otel-tracer.d.ts +47 -0
  78. package/dist/lib/otel-tracer.d.ts.map +1 -0
  79. package/dist/lib/otel-tracer.js +79 -0
  80. package/dist/lib/otel-tracer.js.map +1 -0
  81. package/dist/lib/otel-tracer.mjs +75 -0
  82. package/dist/lib/token-estimator.d.ts +62 -0
  83. package/dist/lib/token-estimator.d.ts.map +1 -0
  84. package/dist/lib/token-estimator.js +106 -0
  85. package/dist/lib/token-estimator.js.map +1 -0
  86. package/dist/lib/token-estimator.mjs +100 -0
  87. package/dist/lib/tool-registry.d.ts +103 -0
  88. package/dist/lib/tool-registry.d.ts.map +1 -0
  89. package/dist/lib/tool-registry.js +159 -0
  90. package/dist/lib/tool-registry.js.map +1 -0
  91. package/dist/lib/tool-registry.mjs +154 -0
  92. package/dist/lib/tracer.d.ts +85 -0
  93. package/dist/lib/tracer.d.ts.map +1 -0
  94. package/dist/lib/tracer.js +170 -0
  95. package/dist/lib/tracer.js.map +1 -0
  96. package/dist/lib/tracer.mjs +161 -0
  97. package/dist/lib/types.d.ts +11 -0
  98. package/dist/lib/types.d.ts.map +1 -1
  99. package/dist/modules/mcp/adapter.d.ts +23 -0
  100. package/dist/modules/mcp/adapter.d.ts.map +1 -0
  101. package/dist/modules/mcp/adapter.js +63 -0
  102. package/dist/modules/mcp/adapter.js.map +1 -0
  103. package/dist/modules/mcp/adapter.mjs +58 -0
  104. package/dist/modules/mcp/client.d.ts +75 -0
  105. package/dist/modules/mcp/client.d.ts.map +1 -0
  106. package/dist/modules/mcp/client.js +300 -0
  107. package/dist/modules/mcp/client.js.map +1 -0
  108. package/dist/modules/mcp/client.mjs +295 -0
  109. package/dist/modules/mcp/http-transport.d.ts +51 -0
  110. package/dist/modules/mcp/http-transport.d.ts.map +1 -0
  111. package/dist/modules/mcp/http-transport.js +146 -0
  112. package/dist/modules/mcp/http-transport.js.map +1 -0
  113. package/dist/modules/mcp/http-transport.mjs +141 -0
  114. package/dist/modules/mcp/index.d.ts +11 -0
  115. package/dist/modules/mcp/index.d.ts.map +1 -0
  116. package/dist/modules/mcp/index.js +34 -0
  117. package/dist/modules/mcp/index.js.map +1 -0
  118. package/dist/modules/mcp/index.mjs +14 -0
  119. package/dist/modules/mcp/oauth.d.ts +101 -0
  120. package/dist/modules/mcp/oauth.d.ts.map +1 -0
  121. package/dist/modules/mcp/oauth.js +347 -0
  122. package/dist/modules/mcp/oauth.js.map +1 -0
  123. package/dist/modules/mcp/oauth.mjs +304 -0
  124. package/dist/modules/mcp/token-store.d.ts +69 -0
  125. package/dist/modules/mcp/token-store.d.ts.map +1 -0
  126. package/dist/modules/mcp/token-store.js +174 -0
  127. package/dist/modules/mcp/token-store.js.map +1 -0
  128. package/dist/modules/mcp/token-store.mjs +135 -0
  129. package/dist/modules/mcp/types.d.ts +91 -0
  130. package/dist/modules/mcp/types.d.ts.map +1 -0
  131. package/dist/modules/mcp/types.js +14 -0
  132. package/dist/modules/mcp/types.js.map +1 -0
  133. package/dist/modules/mcp/types.mjs +11 -0
  134. package/dist/modules/skills/index.d.ts +7 -0
  135. package/dist/modules/skills/index.d.ts.map +1 -0
  136. package/dist/modules/skills/index.js +14 -0
  137. package/dist/modules/skills/index.js.map +1 -0
  138. package/dist/modules/skills/index.mjs +6 -0
  139. package/dist/modules/skills/loader.d.ts +51 -0
  140. package/dist/modules/skills/loader.d.ts.map +1 -0
  141. package/dist/modules/skills/loader.js +237 -0
  142. package/dist/modules/skills/loader.js.map +1 -0
  143. package/dist/modules/skills/loader.mjs +198 -0
  144. package/dist/modules/skills/types.d.ts +60 -0
  145. package/dist/modules/skills/types.d.ts.map +1 -0
  146. package/dist/modules/skills/types.js +20 -0
  147. package/dist/modules/skills/types.js.map +1 -0
  148. package/dist/modules/skills/types.mjs +17 -0
  149. package/package.json +4 -1
@@ -0,0 +1,295 @@
1
+ /**
2
+ * MCP Client with stdio and HTTP transport support.
3
+ * Phase 1: Bearer token, Phase 3: OAuth 2.0
4
+ */
5
+ import { spawn } from 'child_process';
6
+ import { DEFAULT_MCP_CONFIG } from './types.mjs';
7
+ import { noopLogger } from '../../lib/logger.mjs';
8
+ import { MCPHttpTransport } from './http-transport.mjs';
9
+ /** MCP Client error */
10
+ export class MCPClientError extends Error {
11
+ constructor(message, serverName) {
12
+ super(message);
13
+ this.serverName = serverName;
14
+ this.name = 'MCPClientError';
15
+ }
16
+ }
17
+ /**
18
+ * MCP Client manages connections to MCP servers.
19
+ */
20
+ export class MCPClient {
21
+ constructor(config, logger) {
22
+ this.connections = new Map();
23
+ this.config = {
24
+ servers: config.servers,
25
+ connectionTimeout: config.connectionTimeout ?? DEFAULT_MCP_CONFIG.connectionTimeout,
26
+ };
27
+ this.logger = logger ?? noopLogger;
28
+ // Initialize connections (not started)
29
+ for (const server of this.config.servers) {
30
+ this.connections.set(server.name, {
31
+ config: server,
32
+ process: null,
33
+ httpTransport: null,
34
+ state: 'disconnected',
35
+ tools: [],
36
+ requestId: 0,
37
+ pendingRequests: new Map(),
38
+ buffer: '',
39
+ });
40
+ }
41
+ }
42
+ /**
43
+ * Connect to all configured servers.
44
+ */
45
+ async connect() {
46
+ const promises = Array.from(this.connections.keys()).map(name => this.connectServer(name));
47
+ await Promise.all(promises);
48
+ }
49
+ /**
50
+ * Connect to a specific server.
51
+ */
52
+ async connectServer(serverName) {
53
+ const conn = this.connections.get(serverName);
54
+ if (!conn) {
55
+ throw new MCPClientError(`Server not found: ${serverName}`, serverName);
56
+ }
57
+ if (conn.state === 'connected') {
58
+ return;
59
+ }
60
+ conn.state = 'connecting';
61
+ try {
62
+ if (conn.config.transport === 'http') {
63
+ // HTTP transport (Phase 3)
64
+ const httpConfig = conn.config;
65
+ // Validate authentication configuration
66
+ if (httpConfig.oauth && !httpConfig.token && !httpConfig.tokenProvider) {
67
+ throw new MCPClientError(`OAuth configured for '${serverName}' but no token or tokenProvider provided. ` +
68
+ 'Use PKCEFlow/DeviceCodeFlow to obtain tokens first, then provide via token or tokenProvider.', serverName);
69
+ }
70
+ conn.httpTransport = new MCPHttpTransport(httpConfig);
71
+ // Connect with timeout
72
+ await Promise.race([
73
+ conn.httpTransport.connect(),
74
+ new Promise((_, reject) => setTimeout(() => reject(new MCPClientError('Connection timeout', serverName)), this.config.connectionTimeout)),
75
+ ]);
76
+ // List tools via HTTP transport
77
+ conn.tools = await conn.httpTransport.listTools();
78
+ conn.state = 'connected';
79
+ this.logger.info('MCP HTTP server connected', {
80
+ server: serverName,
81
+ tools: conn.tools.length,
82
+ });
83
+ }
84
+ else {
85
+ // Stdio transport (Phase 1)
86
+ const { command, args = [], env = {}, token } = conn.config;
87
+ // Inject bearer token via env if configured
88
+ const processEnv = { ...process.env, ...env };
89
+ if (token) {
90
+ processEnv.MCP_BEARER_TOKEN = token;
91
+ }
92
+ conn.process = spawn(command, args, {
93
+ stdio: ['pipe', 'pipe', 'pipe'],
94
+ env: processEnv,
95
+ });
96
+ // Handle stdout (JSON-RPC responses)
97
+ conn.process.stdout?.on('data', (data) => {
98
+ this.handleData(serverName, data.toString());
99
+ });
100
+ // Handle stderr (logs)
101
+ conn.process.stderr?.on('data', (data) => {
102
+ this.logger.debug('MCP server stderr', { server: serverName, data: data.toString() });
103
+ });
104
+ // Handle exit
105
+ conn.process.on('exit', (code) => {
106
+ this.logger.info('MCP server exited', { server: serverName, code });
107
+ conn.state = 'disconnected';
108
+ conn.process = null;
109
+ });
110
+ // Wait for connection with timeout
111
+ await Promise.race([
112
+ this.initialize(serverName),
113
+ new Promise((_, reject) => setTimeout(() => reject(new MCPClientError('Connection timeout', serverName)), this.config.connectionTimeout)),
114
+ ]);
115
+ // List tools
116
+ conn.tools = await this.listToolsInternal(serverName);
117
+ conn.state = 'connected';
118
+ this.logger.info('MCP server connected', {
119
+ server: serverName,
120
+ tools: conn.tools.length,
121
+ });
122
+ }
123
+ }
124
+ catch (error) {
125
+ conn.state = 'error';
126
+ throw error;
127
+ }
128
+ }
129
+ /**
130
+ * Disconnect from all servers.
131
+ */
132
+ async disconnect() {
133
+ for (const [name, conn] of this.connections) {
134
+ if (conn.httpTransport) {
135
+ await conn.httpTransport.disconnect();
136
+ conn.httpTransport = null;
137
+ conn.state = 'disconnected';
138
+ this.logger.info('MCP HTTP server disconnected', { server: name });
139
+ }
140
+ else if (conn.process) {
141
+ conn.process.kill();
142
+ conn.process = null;
143
+ conn.state = 'disconnected';
144
+ this.logger.info('MCP server disconnected', { server: name });
145
+ }
146
+ }
147
+ }
148
+ /**
149
+ * Get all tools from all connected servers.
150
+ * Sorted by server name, then tool name for deterministic order.
151
+ * Only returns tools from servers with state 'connected'.
152
+ */
153
+ getAllTools() {
154
+ const allTools = [];
155
+ const serverNames = Array.from(this.connections.keys()).sort();
156
+ for (const serverName of serverNames) {
157
+ const conn = this.connections.get(serverName);
158
+ // Only include tools from connected servers
159
+ if (conn.state !== 'connected')
160
+ continue;
161
+ for (const tool of conn.tools) {
162
+ allTools.push({ ...tool, server: serverName });
163
+ }
164
+ }
165
+ // Sort by tool name
166
+ return allTools.sort((a, b) => a.name.localeCompare(b.name));
167
+ }
168
+ /**
169
+ * Execute a tool.
170
+ */
171
+ async executeTool(serverName, toolName, args) {
172
+ const conn = this.connections.get(serverName);
173
+ if (!conn || conn.state !== 'connected') {
174
+ throw new MCPClientError(`Server not connected: ${serverName}`, serverName);
175
+ }
176
+ // HTTP transport uses MCPHttpTransport
177
+ if (conn.httpTransport) {
178
+ return conn.httpTransport.executeTool(toolName, args);
179
+ }
180
+ // Stdio transport uses JSON-RPC
181
+ return this.sendRequest(serverName, 'tools/call', {
182
+ name: toolName,
183
+ arguments: args,
184
+ });
185
+ }
186
+ /**
187
+ * Get connection state.
188
+ */
189
+ getState(serverName) {
190
+ return this.connections.get(serverName)?.state ?? 'disconnected';
191
+ }
192
+ /**
193
+ * Get tools for a specific server.
194
+ */
195
+ getServerTools(serverName) {
196
+ const conn = this.connections.get(serverName);
197
+ if (!conn || conn.state !== 'connected') {
198
+ return [];
199
+ }
200
+ return conn.tools;
201
+ }
202
+ /**
203
+ * Get names of all connected servers.
204
+ */
205
+ getConnectedServerNames() {
206
+ const names = [];
207
+ for (const [name, conn] of this.connections) {
208
+ if (conn.state === 'connected') {
209
+ names.push(name);
210
+ }
211
+ }
212
+ return names.sort();
213
+ }
214
+ /**
215
+ * Initialize connection (MCP handshake).
216
+ */
217
+ async initialize(serverName) {
218
+ await this.sendRequest(serverName, 'initialize', {
219
+ protocolVersion: '2024-11-05',
220
+ capabilities: {},
221
+ clientInfo: {
222
+ name: 'qiniu-ai-sdk',
223
+ version: '0.11.0',
224
+ },
225
+ });
226
+ await this.sendNotification(serverName, 'notifications/initialized', {});
227
+ }
228
+ /**
229
+ * List tools from server.
230
+ */
231
+ async listToolsInternal(serverName) {
232
+ const result = await this.sendRequest(serverName, 'tools/list', {});
233
+ return result.tools ?? [];
234
+ }
235
+ /**
236
+ * Send JSON-RPC request.
237
+ */
238
+ sendRequest(serverName, method, params) {
239
+ const conn = this.connections.get(serverName);
240
+ const id = ++conn.requestId;
241
+ const message = JSON.stringify({
242
+ jsonrpc: '2.0',
243
+ id,
244
+ method,
245
+ params,
246
+ }) + '\n';
247
+ return new Promise((resolve, reject) => {
248
+ conn.pendingRequests.set(id, { resolve, reject });
249
+ conn.process?.stdin?.write(message);
250
+ });
251
+ }
252
+ /**
253
+ * Send JSON-RPC notification.
254
+ */
255
+ sendNotification(serverName, method, params) {
256
+ const conn = this.connections.get(serverName);
257
+ const message = JSON.stringify({
258
+ jsonrpc: '2.0',
259
+ method,
260
+ params,
261
+ }) + '\n';
262
+ conn.process?.stdin?.write(message);
263
+ }
264
+ /**
265
+ * Handle incoming data.
266
+ */
267
+ handleData(serverName, data) {
268
+ const conn = this.connections.get(serverName);
269
+ conn.buffer += data;
270
+ // Process complete messages
271
+ const lines = conn.buffer.split('\n');
272
+ conn.buffer = lines.pop() ?? '';
273
+ for (const line of lines) {
274
+ if (!line.trim())
275
+ continue;
276
+ try {
277
+ const message = JSON.parse(line);
278
+ if (message.id !== undefined && conn.pendingRequests.has(message.id)) {
279
+ const { resolve, reject } = conn.pendingRequests.get(message.id);
280
+ conn.pendingRequests.delete(message.id);
281
+ if (message.error) {
282
+ reject(new MCPClientError(message.error.message, serverName));
283
+ }
284
+ else {
285
+ resolve(message.result);
286
+ }
287
+ }
288
+ }
289
+ catch {
290
+ this.logger.warn('Failed to parse MCP message', { server: serverName, line });
291
+ }
292
+ }
293
+ }
294
+ }
295
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1,51 @@
1
+ /**
2
+ * MCP HTTP Transport using official SDK.
3
+ * Wraps StreamableHTTPClientTransport with retries and connection management.
4
+ *
5
+ * @see https://modelcontextprotocol.io/docs/concepts/transports#streamable-http
6
+ */
7
+ import type { MCPHttpServerConfig, MCPToolDefinition, MCPToolResult } from './types';
8
+ /** HTTP Transport error */
9
+ export declare class MCPHttpTransportError extends Error {
10
+ readonly serverName: string;
11
+ readonly statusCode?: number | undefined;
12
+ constructor(message: string, serverName: string, statusCode?: number | undefined);
13
+ }
14
+ /** OAuth token provider function */
15
+ export type TokenProvider = () => Promise<string | undefined>;
16
+ /**
17
+ * HTTP Transport wrapper for MCP servers.
18
+ * Uses official SDK's StreamableHTTPClientTransport.
19
+ */
20
+ export declare class MCPHttpTransport {
21
+ private client;
22
+ private transport;
23
+ private readonly config;
24
+ private connected;
25
+ constructor(config: MCPHttpServerConfig);
26
+ /**
27
+ * Connect to the MCP server.
28
+ */
29
+ connect(): Promise<void>;
30
+ /**
31
+ * Disconnect from the MCP server.
32
+ */
33
+ disconnect(): Promise<void>;
34
+ /**
35
+ * List available tools.
36
+ */
37
+ listTools(): Promise<MCPToolDefinition[]>;
38
+ /**
39
+ * Execute a tool.
40
+ */
41
+ executeTool(toolName: string, args: Record<string, unknown>): Promise<MCPToolResult>;
42
+ /**
43
+ * Check if connected.
44
+ */
45
+ isConnected(): boolean;
46
+ /**
47
+ * Get server name.
48
+ */
49
+ getServerName(): string;
50
+ }
51
+ //# sourceMappingURL=http-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../../../src/modules/mcp/http-transport.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGrF,2BAA2B;AAC3B,qBAAa,qBAAsB,SAAQ,KAAK;aAGxB,UAAU,EAAE,MAAM;aAClB,UAAU,CAAC,EAAE,MAAM;gBAFnC,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,YAAA;CAK1C;AAED,oCAAoC;AACpC,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAE9D;;;GAGG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,mBAAmB;IAIvC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwD9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAa/C;;OAEG;IACG,WAAW,CACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,aAAa,CAAC;IA8BzB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,aAAa,IAAI,MAAM;CAG1B"}
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ /**
3
+ * MCP HTTP Transport using official SDK.
4
+ * Wraps StreamableHTTPClientTransport with retries and connection management.
5
+ *
6
+ * @see https://modelcontextprotocol.io/docs/concepts/transports#streamable-http
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MCPHttpTransport = exports.MCPHttpTransportError = void 0;
10
+ const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
11
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
12
+ const types_1 = require("./types");
13
+ /** HTTP Transport error */
14
+ class MCPHttpTransportError extends Error {
15
+ constructor(message, serverName, statusCode) {
16
+ super(message);
17
+ this.serverName = serverName;
18
+ this.statusCode = statusCode;
19
+ this.name = 'MCPHttpTransportError';
20
+ }
21
+ }
22
+ exports.MCPHttpTransportError = MCPHttpTransportError;
23
+ /**
24
+ * HTTP Transport wrapper for MCP servers.
25
+ * Uses official SDK's StreamableHTTPClientTransport.
26
+ */
27
+ class MCPHttpTransport {
28
+ constructor(config) {
29
+ this.client = null;
30
+ this.transport = null;
31
+ this.connected = false;
32
+ this.config = config;
33
+ }
34
+ /**
35
+ * Connect to the MCP server.
36
+ */
37
+ async connect() {
38
+ if (this.connected)
39
+ return;
40
+ // Build headers
41
+ const headers = {
42
+ ...this.config.headers,
43
+ };
44
+ // Add bearer token if available
45
+ if (this.config.token) {
46
+ headers['Authorization'] = `Bearer ${this.config.token}`;
47
+ }
48
+ else if (this.config.tokenProvider) {
49
+ const token = await this.config.tokenProvider();
50
+ if (token) {
51
+ headers['Authorization'] = `Bearer ${token}`;
52
+ }
53
+ }
54
+ // Create transport
55
+ this.transport = new streamableHttp_js_1.StreamableHTTPClientTransport(new URL(this.config.url), {
56
+ requestInit: {
57
+ headers,
58
+ },
59
+ });
60
+ // Create client
61
+ this.client = new index_js_1.Client({
62
+ name: 'qiniu-sdk',
63
+ version: '0.13.0',
64
+ }, {
65
+ capabilities: {},
66
+ });
67
+ // Connect with timeout
68
+ const timeout = this.config.timeout ?? types_1.DEFAULT_MCP_CONFIG.httpTimeout;
69
+ const timeoutPromise = new Promise((_, reject) => {
70
+ setTimeout(() => reject(new MCPHttpTransportError(`Connection timeout after ${timeout}ms`, this.config.name)), timeout);
71
+ });
72
+ await Promise.race([
73
+ this.client.connect(this.transport),
74
+ timeoutPromise,
75
+ ]);
76
+ this.connected = true;
77
+ }
78
+ /**
79
+ * Disconnect from the MCP server.
80
+ */
81
+ async disconnect() {
82
+ if (!this.connected)
83
+ return;
84
+ await this.client?.close();
85
+ this.client = null;
86
+ this.transport = null;
87
+ this.connected = false;
88
+ }
89
+ /**
90
+ * List available tools.
91
+ */
92
+ async listTools() {
93
+ if (!this.client) {
94
+ throw new MCPHttpTransportError('Not connected', this.config.name);
95
+ }
96
+ const result = await this.client.listTools();
97
+ return (result.tools || []).map((tool) => ({
98
+ name: tool.name,
99
+ description: tool.description || '',
100
+ inputSchema: tool.inputSchema,
101
+ }));
102
+ }
103
+ /**
104
+ * Execute a tool.
105
+ */
106
+ async executeTool(toolName, args) {
107
+ if (!this.client) {
108
+ throw new MCPHttpTransportError('Not connected', this.config.name);
109
+ }
110
+ const result = await this.client.callTool({
111
+ name: toolName,
112
+ arguments: args,
113
+ });
114
+ const contentArray = Array.isArray(result.content) ? result.content : [];
115
+ return {
116
+ content: contentArray.map((item) => {
117
+ if (item.type === 'text') {
118
+ return { type: 'text', text: item.text };
119
+ }
120
+ if (item.type === 'image') {
121
+ return {
122
+ type: 'image',
123
+ data: item.data,
124
+ mimeType: item.mimeType,
125
+ };
126
+ }
127
+ return { type: 'resource' };
128
+ }),
129
+ isError: result.isError === true,
130
+ };
131
+ }
132
+ /**
133
+ * Check if connected.
134
+ */
135
+ isConnected() {
136
+ return this.connected;
137
+ }
138
+ /**
139
+ * Get server name.
140
+ */
141
+ getServerName() {
142
+ return this.config.name;
143
+ }
144
+ }
145
+ exports.MCPHttpTransport = MCPHttpTransport;
146
+ //# sourceMappingURL=http-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../../../src/modules/mcp/http-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * MCP HTTP Transport using official SDK.
3
+ * Wraps StreamableHTTPClientTransport with retries and connection management.
4
+ *
5
+ * @see https://modelcontextprotocol.io/docs/concepts/transports#streamable-http
6
+ */
7
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
8
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
9
+ import { DEFAULT_MCP_CONFIG } from './types.mjs';
10
+ /** HTTP Transport error */
11
+ export class MCPHttpTransportError extends Error {
12
+ constructor(message, serverName, statusCode) {
13
+ super(message);
14
+ this.serverName = serverName;
15
+ this.statusCode = statusCode;
16
+ this.name = 'MCPHttpTransportError';
17
+ }
18
+ }
19
+ /**
20
+ * HTTP Transport wrapper for MCP servers.
21
+ * Uses official SDK's StreamableHTTPClientTransport.
22
+ */
23
+ export class MCPHttpTransport {
24
+ constructor(config) {
25
+ this.client = null;
26
+ this.transport = null;
27
+ this.connected = false;
28
+ this.config = config;
29
+ }
30
+ /**
31
+ * Connect to the MCP server.
32
+ */
33
+ async connect() {
34
+ if (this.connected)
35
+ return;
36
+ // Build headers
37
+ const headers = {
38
+ ...this.config.headers,
39
+ };
40
+ // Add bearer token if available
41
+ if (this.config.token) {
42
+ headers['Authorization'] = `Bearer ${this.config.token}`;
43
+ }
44
+ else if (this.config.tokenProvider) {
45
+ const token = await this.config.tokenProvider();
46
+ if (token) {
47
+ headers['Authorization'] = `Bearer ${token}`;
48
+ }
49
+ }
50
+ // Create transport
51
+ this.transport = new StreamableHTTPClientTransport(new URL(this.config.url), {
52
+ requestInit: {
53
+ headers,
54
+ },
55
+ });
56
+ // Create client
57
+ this.client = new Client({
58
+ name: 'qiniu-sdk',
59
+ version: '0.13.0',
60
+ }, {
61
+ capabilities: {},
62
+ });
63
+ // Connect with timeout
64
+ const timeout = this.config.timeout ?? DEFAULT_MCP_CONFIG.httpTimeout;
65
+ const timeoutPromise = new Promise((_, reject) => {
66
+ setTimeout(() => reject(new MCPHttpTransportError(`Connection timeout after ${timeout}ms`, this.config.name)), timeout);
67
+ });
68
+ await Promise.race([
69
+ this.client.connect(this.transport),
70
+ timeoutPromise,
71
+ ]);
72
+ this.connected = true;
73
+ }
74
+ /**
75
+ * Disconnect from the MCP server.
76
+ */
77
+ async disconnect() {
78
+ if (!this.connected)
79
+ return;
80
+ await this.client?.close();
81
+ this.client = null;
82
+ this.transport = null;
83
+ this.connected = false;
84
+ }
85
+ /**
86
+ * List available tools.
87
+ */
88
+ async listTools() {
89
+ if (!this.client) {
90
+ throw new MCPHttpTransportError('Not connected', this.config.name);
91
+ }
92
+ const result = await this.client.listTools();
93
+ return (result.tools || []).map((tool) => ({
94
+ name: tool.name,
95
+ description: tool.description || '',
96
+ inputSchema: tool.inputSchema,
97
+ }));
98
+ }
99
+ /**
100
+ * Execute a tool.
101
+ */
102
+ async executeTool(toolName, args) {
103
+ if (!this.client) {
104
+ throw new MCPHttpTransportError('Not connected', this.config.name);
105
+ }
106
+ const result = await this.client.callTool({
107
+ name: toolName,
108
+ arguments: args,
109
+ });
110
+ const contentArray = Array.isArray(result.content) ? result.content : [];
111
+ return {
112
+ content: contentArray.map((item) => {
113
+ if (item.type === 'text') {
114
+ return { type: 'text', text: item.text };
115
+ }
116
+ if (item.type === 'image') {
117
+ return {
118
+ type: 'image',
119
+ data: item.data,
120
+ mimeType: item.mimeType,
121
+ };
122
+ }
123
+ return { type: 'resource' };
124
+ }),
125
+ isError: result.isError === true,
126
+ };
127
+ }
128
+ /**
129
+ * Check if connected.
130
+ */
131
+ isConnected() {
132
+ return this.connected;
133
+ }
134
+ /**
135
+ * Get server name.
136
+ */
137
+ getServerName() {
138
+ return this.config.name;
139
+ }
140
+ }
141
+ //# sourceMappingURL=http-transport.js.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * MCP module public exports.
3
+ */
4
+ export { MCPClient, MCPClientError } from './client';
5
+ export { adaptMCPToolsToRegistry, getAllMCPToolsAsRegistered } from './adapter';
6
+ export { MCPHttpTransport, MCPHttpTransportError, type TokenProvider } from './http-transport';
7
+ export { PKCEFlow, DeviceCodeFlow, OAuthError, generateCodeVerifier, generateCodeChallenge, generateState, refreshAccessToken, type OAuthTokens, } from './oauth';
8
+ export { MemoryTokenStore, FileTokenStore, TokenManager, type TokenStore, type FileTokenStoreConfig, } from './token-store';
9
+ export type { MCPClientConfig, MCPServerConfig, MCPStdioServerConfig, MCPHttpServerConfig, MCPOAuthConfig, MCPToolDefinition, MCPToolResult, MCPConnectionState, MCPTransport, } from './types';
10
+ export { DEFAULT_MCP_CONFIG } from './types';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/mcp/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAGhF,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG/F,OAAO,EACH,QAAQ,EACR,cAAc,EACd,UAAU,EACV,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,kBAAkB,EAClB,KAAK,WAAW,GACnB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACH,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,oBAAoB,GAC5B,MAAM,eAAe,CAAC;AAGvB,YAAY,EACR,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,YAAY,GACf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}