@bowenqt/qiniu-ai-sdk 0.10.0 → 0.13.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 +99 -0
- package/dist/ai/agent-graph.d.ts.map +1 -0
- package/dist/ai/agent-graph.js +321 -0
- package/dist/ai/agent-graph.js.map +1 -0
- package/dist/ai/agent-graph.mjs +317 -0
- package/dist/ai/generate-text.d.ts +51 -0
- package/dist/ai/generate-text.d.ts.map +1 -1
- package/dist/ai/generate-text.js +132 -0
- package/dist/ai/generate-text.js.map +1 -1
- package/dist/ai/generate-text.mjs +131 -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,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":";AAAA;;;;;GAKG;;;AAEH,wEAAmE;AACnE,0FAAmG;AAEnG,mCAA6C;AAE7C,2BAA2B;AAC3B,MAAa,qBAAsB,SAAQ,KAAK;IAC5C,YACI,OAAe,EACC,UAAkB,EAClB,UAAmB;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,eAAU,GAAV,UAAU,CAAQ;QAClB,eAAU,GAAV,UAAU,CAAS;QAGnC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACxC,CAAC;CACJ;AATD,sDASC;AAKD;;;GAGG;AACH,MAAa,gBAAgB;IAMzB,YAAY,MAA2B;QAL/B,WAAM,GAAkB,IAAI,CAAC;QAC7B,cAAS,GAAyC,IAAI,CAAC;QAEvD,cAAS,GAAG,KAAK,CAAC;QAGtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACT,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAE3B,gBAAgB;QAChB,MAAM,OAAO,GAA2B;YACpC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;SACzB,CAAC;QAEF,gCAAgC;QAChC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC7D,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAChD,IAAI,KAAK,EAAE,CAAC;gBACR,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;YACjD,CAAC;QACL,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,iDAA6B,CAC9C,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EACxB;YACI,WAAW,EAAE;gBACT,OAAO;aACV;SACJ,CACJ,CAAC;QAEF,gBAAgB;QAChB,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAM,CACpB;YACI,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,QAAQ;SACpB,EACD;YACI,YAAY,EAAE,EAAE;SACnB,CACJ,CAAC;QAEF,uBAAuB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,0BAAkB,CAAC,WAAW,CAAC;QACtE,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACpD,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,qBAAqB,CAC7C,4BAA4B,OAAO,IAAI,EACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CACnB,CAAC,EAAE,OAAO,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,IAAI,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;YACnC,cAAc;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,qBAAqB,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACvC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,WAAW,EAAE,IAAI,CAAC,WAA+C;SACpE,CAAC,CAAC,CAAC;IACR,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACb,QAAgB,EAChB,IAA6B;QAE7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,qBAAqB,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACtC,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzE,OAAO;YACH,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAuE,EAAE,EAAE;gBAClG,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACvB,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtD,CAAC;gBACD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACxB,OAAO;wBACH,IAAI,EAAE,OAAgB;wBACtB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;qBAC1B,CAAC;gBACN,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,UAAmB,EAAE,CAAC;YACzC,CAAC,CAAC;YACF,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI;SACnC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,WAAW;QACP,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,aAAa;QACT,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC5B,CAAC;CACJ;AAlJD,4CAkJC"}
|
|
@@ -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"}
|