@mondaydotcomorg/atp-mcp-adapter 0.24.1 → 0.24.3
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/dist/index.cjs +408 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +400 -4
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var index_js = require('@modelcontextprotocol/sdk/client/index.js');
|
|
4
|
+
var stdio_js = require('@modelcontextprotocol/sdk/client/stdio.js');
|
|
5
|
+
var sse_js = require('@modelcontextprotocol/sdk/client/sse.js');
|
|
6
|
+
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
9
|
+
|
|
10
|
+
// src/schema-utils.ts
|
|
11
|
+
function convertMCPInputSchema(inputSchema) {
|
|
12
|
+
const schema = inputSchema;
|
|
13
|
+
if (!schema) {
|
|
14
|
+
return {
|
|
15
|
+
type: "object",
|
|
16
|
+
properties: {}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const result = {};
|
|
20
|
+
result.type = schema.type || "object";
|
|
21
|
+
if (result.type === "object") {
|
|
22
|
+
result.properties = schema.properties || {};
|
|
23
|
+
} else if (schema.properties) {
|
|
24
|
+
result.properties = schema.properties;
|
|
25
|
+
}
|
|
26
|
+
if (schema.required && schema.required.length > 0) {
|
|
27
|
+
result.required = schema.required;
|
|
28
|
+
}
|
|
29
|
+
if (schema.description) {
|
|
30
|
+
result.description = schema.description;
|
|
31
|
+
}
|
|
32
|
+
const knownFields = /* @__PURE__ */ new Set([
|
|
33
|
+
"type",
|
|
34
|
+
"properties",
|
|
35
|
+
"required",
|
|
36
|
+
"description"
|
|
37
|
+
]);
|
|
38
|
+
for (const [key, value] of Object.entries(schema)) {
|
|
39
|
+
if (!knownFields.has(key) && value !== void 0) {
|
|
40
|
+
result[key] = value;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
__name(convertMCPInputSchema, "convertMCPInputSchema");
|
|
46
|
+
function convertMCPToolToFunction(tool, handler) {
|
|
47
|
+
return {
|
|
48
|
+
name: tool.name,
|
|
49
|
+
description: tool.description || `MCP tool: ${tool.name}`,
|
|
50
|
+
inputSchema: convertMCPInputSchema(tool.inputSchema),
|
|
51
|
+
handler
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
__name(convertMCPToolToFunction, "convertMCPToolToFunction");
|
|
55
|
+
|
|
56
|
+
// src/mcp-connector.ts
|
|
57
|
+
var MCPConnector = class {
|
|
58
|
+
static {
|
|
59
|
+
__name(this, "MCPConnector");
|
|
60
|
+
}
|
|
61
|
+
clients = /* @__PURE__ */ new Map();
|
|
62
|
+
currentClient = null;
|
|
63
|
+
currentServerName = null;
|
|
64
|
+
/**
|
|
65
|
+
* Fetches all tools from an MCP server, handling pagination if present.
|
|
66
|
+
*/
|
|
67
|
+
async fetchAllTools(client) {
|
|
68
|
+
const allTools = [];
|
|
69
|
+
let cursor;
|
|
70
|
+
do {
|
|
71
|
+
const toolsResult = await client.listTools(cursor ? {
|
|
72
|
+
cursor
|
|
73
|
+
} : void 0);
|
|
74
|
+
const tools = toolsResult.tools || [];
|
|
75
|
+
allTools.push(...tools);
|
|
76
|
+
cursor = toolsResult.nextCursor;
|
|
77
|
+
} while (cursor);
|
|
78
|
+
return allTools;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Connects to an MCP server using stdio transport.
|
|
82
|
+
* @param config - MCP stdio server configuration
|
|
83
|
+
* @returns APIGroupConfig with converted tools
|
|
84
|
+
*/
|
|
85
|
+
async connectToStdioServer(config) {
|
|
86
|
+
const transport = new stdio_js.StdioClientTransport({
|
|
87
|
+
command: config.command,
|
|
88
|
+
args: config.args,
|
|
89
|
+
env: config.env
|
|
90
|
+
});
|
|
91
|
+
const client = new index_js.Client({
|
|
92
|
+
name: "agent-tool-protocol-connector",
|
|
93
|
+
version: "1.0.0"
|
|
94
|
+
}, {
|
|
95
|
+
capabilities: {}
|
|
96
|
+
});
|
|
97
|
+
await client.connect(transport);
|
|
98
|
+
this.clients.set(config.name, client);
|
|
99
|
+
this.currentClient = client;
|
|
100
|
+
this.currentServerName = config.name;
|
|
101
|
+
const tools = await this.fetchAllTools(client);
|
|
102
|
+
const functions = tools.map((tool) => {
|
|
103
|
+
const inputSchema = convertMCPInputSchema(tool.inputSchema);
|
|
104
|
+
return {
|
|
105
|
+
name: tool.name,
|
|
106
|
+
description: tool.description || `MCP tool: ${tool.name}`,
|
|
107
|
+
inputSchema,
|
|
108
|
+
handler: /* @__PURE__ */ __name(async (input) => {
|
|
109
|
+
const result = await client.callTool({
|
|
110
|
+
name: tool.name,
|
|
111
|
+
arguments: input
|
|
112
|
+
});
|
|
113
|
+
return result.content;
|
|
114
|
+
}, "handler")
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
return {
|
|
118
|
+
name: config.name,
|
|
119
|
+
type: "mcp",
|
|
120
|
+
functions
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Connects to an MCP server using SSE transport.
|
|
125
|
+
* @param config - MCP SSE server configuration
|
|
126
|
+
* @returns APIGroupConfig with converted tools
|
|
127
|
+
*/
|
|
128
|
+
async connectToSSEServer(config) {
|
|
129
|
+
const transport = new sse_js.SSEClientTransport(new URL(config.serverUrl), {
|
|
130
|
+
requestInit: {
|
|
131
|
+
headers: config.headers || {}
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
const client = new index_js.Client({
|
|
135
|
+
name: "agent-tool-protocol-connector",
|
|
136
|
+
version: "1.0.0"
|
|
137
|
+
}, {
|
|
138
|
+
capabilities: {}
|
|
139
|
+
});
|
|
140
|
+
await client.connect(transport);
|
|
141
|
+
this.clients.set(config.name, client);
|
|
142
|
+
this.currentClient = client;
|
|
143
|
+
this.currentServerName = config.name;
|
|
144
|
+
const tools = await this.fetchAllTools(client);
|
|
145
|
+
const functions = tools.map((tool) => {
|
|
146
|
+
const inputSchema = convertMCPInputSchema(tool.inputSchema);
|
|
147
|
+
return {
|
|
148
|
+
name: tool.name,
|
|
149
|
+
description: tool.description || `MCP tool: ${tool.name}`,
|
|
150
|
+
inputSchema,
|
|
151
|
+
handler: /* @__PURE__ */ __name(async (input) => {
|
|
152
|
+
const result = await client.callTool({
|
|
153
|
+
name: tool.name,
|
|
154
|
+
arguments: input
|
|
155
|
+
});
|
|
156
|
+
return result.content;
|
|
157
|
+
}, "handler")
|
|
158
|
+
};
|
|
159
|
+
});
|
|
160
|
+
return {
|
|
161
|
+
name: config.name,
|
|
162
|
+
type: "mcp",
|
|
163
|
+
functions
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Connects to an MCP server and retrieves its tools.
|
|
168
|
+
* @param config - MCP server configuration (supports both stdio and SSE)
|
|
169
|
+
* @returns APIGroupConfig with converted tools
|
|
170
|
+
*/
|
|
171
|
+
async connectToMCPServer(config) {
|
|
172
|
+
if ("transport" in config) {
|
|
173
|
+
if (config.transport === "sse") {
|
|
174
|
+
return this.connectToSSEServer(config);
|
|
175
|
+
}
|
|
176
|
+
return this.connectToStdioServer(config);
|
|
177
|
+
}
|
|
178
|
+
return this.connectToStdioServer({
|
|
179
|
+
name: config.name,
|
|
180
|
+
transport: "stdio",
|
|
181
|
+
command: config.command,
|
|
182
|
+
args: config.args,
|
|
183
|
+
env: config.env
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Connects to multiple MCP servers.
|
|
188
|
+
* @param configs - Array of MCP server configurations
|
|
189
|
+
* @returns Array of APIGroupConfig objects
|
|
190
|
+
*/
|
|
191
|
+
async connectToMultipleServers(configs) {
|
|
192
|
+
return Promise.all(configs.map((config) => this.connectToMCPServer(config)));
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Disconnects from all MCP servers.
|
|
196
|
+
*/
|
|
197
|
+
async disconnectAll() {
|
|
198
|
+
const disconnectPromises = Array.from(this.clients.values()).map(async (client) => {
|
|
199
|
+
try {
|
|
200
|
+
await client.close();
|
|
201
|
+
} catch (error) {
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
await Promise.all(disconnectPromises);
|
|
205
|
+
this.clients.clear();
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Gets a connected MCP client by name.
|
|
209
|
+
* @param name - Server name
|
|
210
|
+
* @returns MCP Client or undefined
|
|
211
|
+
*/
|
|
212
|
+
getClient(name) {
|
|
213
|
+
return this.clients.get(name);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Lists all tools from the currently connected MCP server.
|
|
217
|
+
* @returns Array of tools
|
|
218
|
+
*/
|
|
219
|
+
async listTools() {
|
|
220
|
+
if (!this.currentClient) {
|
|
221
|
+
throw new Error("Not connected to any MCP server");
|
|
222
|
+
}
|
|
223
|
+
const toolsResult = await this.currentClient.listTools();
|
|
224
|
+
return toolsResult.tools || [];
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Lists all prompts from the currently connected MCP server.
|
|
228
|
+
* @returns Array of prompts
|
|
229
|
+
*/
|
|
230
|
+
async listPrompts() {
|
|
231
|
+
if (!this.currentClient) {
|
|
232
|
+
throw new Error("Not connected to any MCP server");
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
const promptsResult = await this.currentClient.listPrompts();
|
|
236
|
+
return promptsResult.prompts || [];
|
|
237
|
+
} catch (error) {
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Calls a tool on the currently connected MCP server.
|
|
243
|
+
* @param name - Tool name
|
|
244
|
+
* @param input - Tool input parameters
|
|
245
|
+
* @returns Tool execution result
|
|
246
|
+
*/
|
|
247
|
+
async callTool(name, input) {
|
|
248
|
+
if (!this.currentClient) {
|
|
249
|
+
throw new Error("Not connected to any MCP server");
|
|
250
|
+
}
|
|
251
|
+
const result = await this.currentClient.callTool({
|
|
252
|
+
name,
|
|
253
|
+
arguments: input
|
|
254
|
+
});
|
|
255
|
+
return result.content;
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
// src/http-connector.ts
|
|
260
|
+
var MCPHttpConnector = class {
|
|
261
|
+
static {
|
|
262
|
+
__name(this, "MCPHttpConnector");
|
|
263
|
+
}
|
|
264
|
+
baseUrl;
|
|
265
|
+
headers;
|
|
266
|
+
constructor(baseUrl, headers = {}) {
|
|
267
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
268
|
+
this.headers = {
|
|
269
|
+
"Content-Type": "application/json",
|
|
270
|
+
...headers
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
async makeRequest(method, params) {
|
|
274
|
+
const body = {
|
|
275
|
+
jsonrpc: "2.0",
|
|
276
|
+
id: Date.now(),
|
|
277
|
+
method
|
|
278
|
+
};
|
|
279
|
+
if (params) {
|
|
280
|
+
body.params = params;
|
|
281
|
+
}
|
|
282
|
+
const response = await fetch(this.baseUrl, {
|
|
283
|
+
method: "POST",
|
|
284
|
+
headers: this.headers,
|
|
285
|
+
body: JSON.stringify(body)
|
|
286
|
+
});
|
|
287
|
+
if (!response.ok) {
|
|
288
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
289
|
+
}
|
|
290
|
+
const data = await response.json();
|
|
291
|
+
if (data.error) {
|
|
292
|
+
throw new Error(`MCP Error: ${data.error.message || JSON.stringify(data.error)}`);
|
|
293
|
+
}
|
|
294
|
+
return data.result;
|
|
295
|
+
}
|
|
296
|
+
async listTools() {
|
|
297
|
+
const result = await this.makeRequest("tools/list");
|
|
298
|
+
return result.tools || [];
|
|
299
|
+
}
|
|
300
|
+
async listPrompts() {
|
|
301
|
+
try {
|
|
302
|
+
const result = await this.makeRequest("prompts/list");
|
|
303
|
+
return result.prompts || [];
|
|
304
|
+
} catch (error) {
|
|
305
|
+
return [];
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
async getPrompt(name, args) {
|
|
309
|
+
const result = await this.makeRequest("prompts/get", {
|
|
310
|
+
name,
|
|
311
|
+
arguments: args
|
|
312
|
+
});
|
|
313
|
+
return {
|
|
314
|
+
messages: result.messages.map((msg) => ({
|
|
315
|
+
role: msg.role,
|
|
316
|
+
content: typeof msg.content === "string" ? msg.content : msg.content.text
|
|
317
|
+
}))
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
async callTool(name, input) {
|
|
321
|
+
const result = await this.makeRequest("tools/call", {
|
|
322
|
+
name,
|
|
323
|
+
arguments: input
|
|
324
|
+
});
|
|
325
|
+
if (!result.content || result.content.length === 0) {
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
const firstBlock = result.content[0];
|
|
329
|
+
if (result.content.length === 1 && firstBlock && firstBlock.type === "text") {
|
|
330
|
+
const text = firstBlock.text || "";
|
|
331
|
+
try {
|
|
332
|
+
return JSON.parse(text);
|
|
333
|
+
} catch {
|
|
334
|
+
return text;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return result.content.map((block) => {
|
|
338
|
+
if (block.type === "text") {
|
|
339
|
+
return block.text;
|
|
340
|
+
}
|
|
341
|
+
return block;
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
async disconnect() {
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
// src/atp-to-mcp.ts
|
|
349
|
+
function registerATPTools(client, mcpServer) {
|
|
350
|
+
const tools = client.getATPTools();
|
|
351
|
+
registerToolsWithMCP(tools, mcpServer);
|
|
352
|
+
}
|
|
353
|
+
__name(registerATPTools, "registerATPTools");
|
|
354
|
+
function registerToolsWithMCP(tools, mcpServer) {
|
|
355
|
+
for (const tool of tools) {
|
|
356
|
+
const handler = /* @__PURE__ */ __name(async (args) => {
|
|
357
|
+
try {
|
|
358
|
+
const result = await tool.func(args);
|
|
359
|
+
const resultText = typeof result === "string" ? result : JSON.stringify(result, null, 2);
|
|
360
|
+
return {
|
|
361
|
+
content: [
|
|
362
|
+
{
|
|
363
|
+
type: "text",
|
|
364
|
+
text: resultText
|
|
365
|
+
}
|
|
366
|
+
]
|
|
367
|
+
};
|
|
368
|
+
} catch (error) {
|
|
369
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
370
|
+
return {
|
|
371
|
+
content: [
|
|
372
|
+
{
|
|
373
|
+
type: "text",
|
|
374
|
+
text: `Error: ${errorMessage}`
|
|
375
|
+
}
|
|
376
|
+
],
|
|
377
|
+
isError: true
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
}, "handler");
|
|
381
|
+
if (typeof mcpServer.registerTool === "function") {
|
|
382
|
+
const inputSchema = tool.zodSchema?.shape ?? {};
|
|
383
|
+
mcpServer.registerTool(tool.name, {
|
|
384
|
+
description: tool.description || "",
|
|
385
|
+
inputSchema
|
|
386
|
+
}, handler);
|
|
387
|
+
} else if (typeof mcpServer.tool === "function") {
|
|
388
|
+
const jsonSchema = {
|
|
389
|
+
type: tool.inputSchema.type,
|
|
390
|
+
properties: tool.inputSchema.properties || {},
|
|
391
|
+
required: tool.inputSchema.required || []
|
|
392
|
+
};
|
|
393
|
+
mcpServer.tool(tool.name, tool.description || "", jsonSchema, handler);
|
|
394
|
+
} else {
|
|
395
|
+
throw new Error("MCP server does not have a compatible tool registration method. Expected registerTool() or tool() method.");
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
__name(registerToolsWithMCP, "registerToolsWithMCP");
|
|
400
|
+
|
|
401
|
+
exports.MCPConnector = MCPConnector;
|
|
402
|
+
exports.MCPHttpConnector = MCPHttpConnector;
|
|
403
|
+
exports.convertMCPInputSchema = convertMCPInputSchema;
|
|
404
|
+
exports.convertMCPToolToFunction = convertMCPToolToFunction;
|
|
405
|
+
exports.registerATPTools = registerATPTools;
|
|
406
|
+
exports.registerToolsWithMCP = registerToolsWithMCP;
|
|
407
|
+
//# sourceMappingURL=index.cjs.map
|
|
408
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schema-utils.ts","../src/mcp-connector.ts","../src/http-connector.ts","../src/atp-to-mcp.ts"],"names":["convertMCPInputSchema","inputSchema","schema","type","properties","result","required","length","description","knownFields","Set","key","value","Object","entries","has","undefined","convertMCPToolToFunction","tool","handler","name","MCPConnector","clients","Map","currentClient","currentServerName","fetchAllTools","client","allTools","cursor","toolsResult","listTools","tools","push","nextCursor","connectToStdioServer","config","transport","StdioClientTransport","command","args","env","Client","version","capabilities","connect","set","functions","map","input","callTool","arguments","content","connectToSSEServer","SSEClientTransport","URL","serverUrl","requestInit","headers","connectToMCPServer","connectToMultipleServers","configs","Promise","all","disconnectAll","disconnectPromises","Array","from","values","close","error","clear","getClient","get","Error","listPrompts","promptsResult","prompts","MCPHttpConnector","baseUrl","constructor","replace","makeRequest","method","params","body","jsonrpc","id","Date","now","response","fetch","JSON","stringify","ok","status","statusText","data","json","message","getPrompt","messages","msg","role","text","firstBlock","parse","block","disconnect","registerATPTools","mcpServer","getATPTools","registerToolsWithMCP","func","resultText","errorMessage","String","isError","registerTool","zodSchema","shape","jsonSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CustomFunctionDef } from '@mondaydotcomorg/atp-protocol';\n\nexport interface MCPToolSchema {\n\ttype?: string;\n\tproperties?: Record<string, unknown>;\n\trequired?: string[];\n\tdescription?: string;\n\t[key: string]: unknown;\n}\n\nexport interface MCPToolDefinition {\n\tname: string;\n\tdescription?: string;\n\tinputSchema?: MCPToolSchema;\n}\n\nexport function convertMCPInputSchema(inputSchema: unknown): {\n\ttype: string;\n\tproperties?: Record<string, unknown>;\n\trequired?: string[];\n\t[key: string]: unknown;\n} {\n\tconst schema = inputSchema as MCPToolSchema | undefined;\n\n\tif (!schema) {\n\t\treturn { type: 'object', properties: {} };\n\t}\n\n\tconst result: Record<string, unknown> = {};\n\tresult.type = schema.type || 'object';\n\n\tif (result.type === 'object') {\n\t\tresult.properties = schema.properties || {};\n\t} else if (schema.properties) {\n\t\tresult.properties = schema.properties;\n\t}\n\n\tif (schema.required && schema.required.length > 0) {\n\t\tresult.required = schema.required;\n\t}\n\n\tif (schema.description) {\n\t\tresult.description = schema.description;\n\t}\n\n\tconst knownFields = new Set(['type', 'properties', 'required', 'description']);\n\tfor (const [key, value] of Object.entries(schema)) {\n\t\tif (!knownFields.has(key) && value !== undefined) {\n\t\t\tresult[key] = value;\n\t\t}\n\t}\n\n\treturn result as {\n\t\ttype: string;\n\t\tproperties?: Record<string, unknown>;\n\t\trequired?: string[];\n\t\t[key: string]: unknown;\n\t};\n}\n\nexport function convertMCPToolToFunction(\n\ttool: MCPToolDefinition,\n\thandler: (input: unknown) => Promise<unknown>\n): CustomFunctionDef {\n\treturn {\n\t\tname: tool.name,\n\t\tdescription: tool.description || `MCP tool: ${tool.name}`,\n\t\tinputSchema: convertMCPInputSchema(tool.inputSchema),\n\t\thandler,\n\t};\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport type { APIGroupConfig, CustomFunctionDef } from '@mondaydotcomorg/atp-protocol';\nimport { convertMCPInputSchema } from './schema-utils.js';\nimport type { MCPStdioServerConfig, MCPSSEServerConfig, MCPServerConfig } from './types.js';\n\ninterface MCPServerConfigLegacy {\n\tname: string;\n\tcommand: string;\n\targs: string[];\n\tenv?: Record<string, string>;\n}\n\n/**\n * MCPConnector connects to MCP servers and converts their tools to Agent Tool Protocol format.\n */\nexport class MCPConnector {\n\tprivate clients: Map<string, Client> = new Map();\n\tprivate currentClient: Client | null = null;\n\tprivate currentServerName: string | null = null;\n\n\t/**\n\t * Fetches all tools from an MCP server, handling pagination if present.\n\t */\n\tprivate async fetchAllTools(client: Client): Promise<Array<{ name: string; description?: string; inputSchema: unknown }>> {\n\t\tconst allTools: Array<{ name: string; description?: string; inputSchema: unknown }> = [];\n\t\tlet cursor: string | undefined;\n\n\t\tdo {\n\t\t\tconst toolsResult = await client.listTools(cursor ? { cursor } : undefined);\n\t\t\tconst tools = toolsResult.tools || [];\n\t\t\tallTools.push(...tools);\n\t\t\tcursor = toolsResult.nextCursor;\n\t\t} while (cursor);\n\n\t\treturn allTools;\n\t}\n\n\t/**\n\t * Connects to an MCP server using stdio transport.\n\t * @param config - MCP stdio server configuration\n\t * @returns APIGroupConfig with converted tools\n\t */\n\tasync connectToStdioServer(config: MCPStdioServerConfig): Promise<APIGroupConfig> {\n\t\tconst transport = new StdioClientTransport({\n\t\t\tcommand: config.command,\n\t\t\targs: config.args,\n\t\t\tenv: config.env,\n\t\t});\n\n\t\tconst client = new Client(\n\t\t\t{ name: 'agent-tool-protocol-connector', version: '1.0.0' },\n\t\t\t{ capabilities: {} }\n\t\t);\n\n\t\tawait client.connect(transport);\n\t\tthis.clients.set(config.name, client);\n\t\tthis.currentClient = client;\n\t\tthis.currentServerName = config.name;\n\n\t\tconst tools = await this.fetchAllTools(client);\n\n\t\tconst functions: CustomFunctionDef[] = tools.map((tool) => {\n\t\t\tconst inputSchema = convertMCPInputSchema(tool.inputSchema);\n\n\t\t\treturn {\n\t\t\t\tname: tool.name,\n\t\t\t\tdescription: tool.description || `MCP tool: ${tool.name}`,\n\t\t\t\tinputSchema,\n\t\t\t\thandler: async (input: unknown) => {\n\t\t\t\t\tconst result = await client.callTool({\n\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\targuments: input as Record<string, unknown>,\n\t\t\t\t\t});\n\t\t\t\t\treturn result.content;\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\treturn {\n\t\t\tname: config.name,\n\t\t\ttype: 'mcp',\n\t\t\tfunctions,\n\t\t};\n\t}\n\n\t/**\n\t * Connects to an MCP server using SSE transport.\n\t * @param config - MCP SSE server configuration\n\t * @returns APIGroupConfig with converted tools\n\t */\n\tasync connectToSSEServer(config: MCPSSEServerConfig): Promise<APIGroupConfig> {\n\t\tconst transport = new SSEClientTransport(new URL(config.serverUrl), {\n\t\t\trequestInit: { headers: config.headers || {} },\n\t\t});\n\n\t\tconst client = new Client(\n\t\t\t{ name: 'agent-tool-protocol-connector', version: '1.0.0' },\n\t\t\t{ capabilities: {} }\n\t\t);\n\n\t\tawait client.connect(transport);\n\t\tthis.clients.set(config.name, client);\n\t\tthis.currentClient = client;\n\t\tthis.currentServerName = config.name;\n\n\t\tconst tools = await this.fetchAllTools(client);\n\n\t\tconst functions: CustomFunctionDef[] = tools.map((tool) => {\n\t\t\tconst inputSchema = convertMCPInputSchema(tool.inputSchema);\n\n\t\t\treturn {\n\t\t\t\tname: tool.name,\n\t\t\t\tdescription: tool.description || `MCP tool: ${tool.name}`,\n\t\t\t\tinputSchema,\n\t\t\t\thandler: async (input: unknown) => {\n\t\t\t\t\tconst result = await client.callTool({\n\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\targuments: input as Record<string, unknown>,\n\t\t\t\t\t});\n\t\t\t\t\treturn result.content;\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\treturn {\n\t\t\tname: config.name,\n\t\t\ttype: 'mcp',\n\t\t\tfunctions,\n\t\t};\n\t}\n\n\t/**\n\t * Connects to an MCP server and retrieves its tools.\n\t * @param config - MCP server configuration (supports both stdio and SSE)\n\t * @returns APIGroupConfig with converted tools\n\t */\n\tasync connectToMCPServer(config: MCPServerConfig | MCPServerConfigLegacy): Promise<APIGroupConfig> {\n\t\tif ('transport' in config) {\n\t\t\tif (config.transport === 'sse') {\n\t\t\t\treturn this.connectToSSEServer(config);\n\t\t\t}\n\t\t\treturn this.connectToStdioServer(config);\n\t\t}\n\n\t\t// Legacy support: treat as stdio config\n\t\treturn this.connectToStdioServer({\n\t\t\tname: config.name,\n\t\t\ttransport: 'stdio',\n\t\t\tcommand: config.command,\n\t\t\targs: config.args,\n\t\t\tenv: config.env,\n\t\t});\n\t}\n\n\t/**\n\t * Connects to multiple MCP servers.\n\t * @param configs - Array of MCP server configurations\n\t * @returns Array of APIGroupConfig objects\n\t */\n\tasync connectToMultipleServers(configs: MCPServerConfig[]): Promise<APIGroupConfig[]> {\n\t\treturn Promise.all(configs.map((config) => this.connectToMCPServer(config)));\n\t}\n\n\t/**\n\t * Disconnects from all MCP servers.\n\t */\n\tasync disconnectAll(): Promise<void> {\n\t\tconst disconnectPromises = Array.from(this.clients.values()).map(async (client) => {\n\t\t\ttry {\n\t\t\t\tawait client.close();\n\t\t\t} catch (error) {}\n\t\t});\n\t\tawait Promise.all(disconnectPromises);\n\t\tthis.clients.clear();\n\t}\n\n\t/**\n\t * Gets a connected MCP client by name.\n\t * @param name - Server name\n\t * @returns MCP Client or undefined\n\t */\n\tgetClient(name: string): Client | undefined {\n\t\treturn this.clients.get(name);\n\t}\n\n\t/**\n\t * Lists all tools from the currently connected MCP server.\n\t * @returns Array of tools\n\t */\n\tasync listTools(): Promise<unknown[]> {\n\t\tif (!this.currentClient) {\n\t\t\tthrow new Error('Not connected to any MCP server');\n\t\t}\n\t\tconst toolsResult = await this.currentClient.listTools();\n\t\treturn toolsResult.tools || [];\n\t}\n\n\t/**\n\t * Lists all prompts from the currently connected MCP server.\n\t * @returns Array of prompts\n\t */\n\tasync listPrompts(): Promise<unknown[]> {\n\t\tif (!this.currentClient) {\n\t\t\tthrow new Error('Not connected to any MCP server');\n\t\t}\n\t\ttry {\n\t\t\tconst promptsResult = await this.currentClient.listPrompts();\n\t\t\treturn promptsResult.prompts || [];\n\t\t} catch (error) {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Calls a tool on the currently connected MCP server.\n\t * @param name - Tool name\n\t * @param input - Tool input parameters\n\t * @returns Tool execution result\n\t */\n\tasync callTool(name: string, input: Record<string, unknown>): Promise<unknown> {\n\t\tif (!this.currentClient) {\n\t\t\tthrow new Error('Not connected to any MCP server');\n\t\t}\n\t\tconst result = await this.currentClient.callTool({\n\t\t\tname,\n\t\t\targuments: input,\n\t\t});\n\t\treturn result.content;\n\t}\n}\n","import type { MCPTool, MCPPrompt } from './types.js';\n\ninterface JsonRpcResponse {\n\tjsonrpc: string;\n\tid: number;\n\tresult?: unknown;\n\terror?: {\n\t\tcode?: number;\n\t\tmessage?: string;\n\t\tdata?: unknown;\n\t};\n}\n\nexport class MCPHttpConnector {\n\tprivate baseUrl: string;\n\tprivate headers: Record<string, string>;\n\n\tconstructor(baseUrl: string, headers: Record<string, string> = {}) {\n\t\tthis.baseUrl = baseUrl.replace(/\\/$/, '');\n\t\tthis.headers = {\n\t\t\t'Content-Type': 'application/json',\n\t\t\t...headers,\n\t\t};\n\t}\n\n\tprivate async makeRequest(method: string, params?: unknown): Promise<unknown> {\n\t\tconst body: {\n\t\t\tjsonrpc: string;\n\t\t\tid: number;\n\t\t\tmethod: string;\n\t\t\tparams?: unknown;\n\t\t} = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: Date.now(),\n\t\t\tmethod,\n\t\t};\n\n\t\tif (params) {\n\t\t\tbody.params = params;\n\t\t}\n\n\t\tconst response = await fetch(this.baseUrl, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: this.headers,\n\t\t\tbody: JSON.stringify(body),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP ${response.status}: ${response.statusText}`);\n\t\t}\n\n\t\tconst data = (await response.json()) as JsonRpcResponse;\n\n\t\tif (data.error) {\n\t\t\tthrow new Error(`MCP Error: ${data.error.message || JSON.stringify(data.error)}`);\n\t\t}\n\n\t\treturn data.result;\n\t}\n\n\tasync listTools(): Promise<MCPTool[]> {\n\t\tconst result = (await this.makeRequest('tools/list')) as { tools: MCPTool[] };\n\t\treturn result.tools || [];\n\t}\n\n\tasync listPrompts(): Promise<MCPPrompt[]> {\n\t\ttry {\n\t\t\tconst result = (await this.makeRequest('prompts/list')) as { prompts: MCPPrompt[] };\n\t\t\treturn result.prompts || [];\n\t\t} catch (error) {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync getPrompt(\n\t\tname: string,\n\t\targs?: Record<string, string>\n\t): Promise<{ messages: Array<{ role: string; content: string }> }> {\n\t\tconst result = (await this.makeRequest('prompts/get', {\n\t\t\tname,\n\t\t\targuments: args,\n\t\t})) as { messages: Array<{ role: string; content: { type: string; text: string } | string }> };\n\n\t\treturn {\n\t\t\tmessages: result.messages.map((msg) => ({\n\t\t\t\trole: msg.role,\n\t\t\t\tcontent: typeof msg.content === 'string' ? msg.content : msg.content.text,\n\t\t\t})),\n\t\t};\n\t}\n\n\tasync callTool(name: string, input: Record<string, unknown>): Promise<unknown> {\n\t\tconst result = (await this.makeRequest('tools/call', {\n\t\t\tname,\n\t\t\targuments: input,\n\t\t})) as { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> };\n\n\t\tif (!result.content || result.content.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst firstBlock = result.content[0];\n\t\tif (result.content.length === 1 && firstBlock && firstBlock.type === 'text') {\n\t\t\tconst text = firstBlock.text || '';\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(text);\n\t\t\t} catch {\n\t\t\t\treturn text;\n\t\t\t}\n\t\t}\n\n\t\treturn result.content.map((block) => {\n\t\t\tif (block.type === 'text') {\n\t\t\t\treturn block.text;\n\t\t\t}\n\t\t\treturn block;\n\t\t});\n\t}\n\n\tasync disconnect(): Promise<void> {}\n}\n","import type { AgentToolProtocolClient, Tool } from '@mondaydotcomorg/atp-client';\n\n/**\n * MCP tool handler result\n */\nexport interface MCPToolResult {\n\tcontent: Array<{ type: 'text'; text: string }>;\n\tisError?: boolean;\n}\n\n/**\n * MCP Server interface - supports both legacy (v0.x) and modern (v1.x) SDK.\n *\n * Uses minimal duck-typing to avoid TypeScript variance issues with the\n * MCP SDK's complex generic callback signatures.\n */\nexport interface MCPServerLike {\n\tregisterTool?: Function;\n\ttool?: Function;\n}\n\n/**\n * Registers ATP tools with an MCP server.\n *\n * @example\n * ```typescript\n * import { Server } from '@modelcontextprotocol/sdk/server/index.js';\n * import { AgentToolProtocolClient } from '@mondaydotcomorg/atp-client';\n * import { registerATPTools } from '@mondaydotcomorg/atp-mcp-adapter';\n *\n * const client = new AgentToolProtocolClient({ baseUrl: 'http://localhost:3000' });\n * await client.init();\n * await client.connect();\n *\n * const mcpServer = new Server({ name: 'my-server', version: '1.0.0' }, { capabilities: { tools: {} } });\n * registerATPTools(client, mcpServer);\n * ```\n */\nexport function registerATPTools(client: AgentToolProtocolClient, mcpServer: MCPServerLike): void {\n\tconst tools = client.getATPTools();\n\tregisterToolsWithMCP(tools, mcpServer);\n}\n\n/**\n * Registers an array of ATP tools with an MCP server.\n * Use this if you want more control over which tools to register.\n * Supports both MCP SDK v0.x and v1.x APIs.\n *\n * @example\n * ```typescript\n * const tools = client.getATPTools().filter(t => t.name !== 'search_api');\n * registerToolsWithMCP(tools, mcpServer);\n * ```\n */\nexport function registerToolsWithMCP(tools: Tool[], mcpServer: MCPServerLike): void {\n\tfor (const tool of tools) {\n\t\tconst handler = async (args: Record<string, unknown>): Promise<MCPToolResult> => {\n\t\t\ttry {\n\t\t\t\tconst result = await tool.func(args);\n\t\t\t\tconst resultText = typeof result === 'string' ? result : JSON.stringify(result, null, 2);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: 'text' as const, text: resultText }],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: 'text' as const, text: `Error: ${errorMessage}` }],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\n\t\tif (typeof mcpServer.registerTool === 'function') {\n\t\t\tconst inputSchema = tool.zodSchema?.shape ?? {};\n\t\t\tmcpServer.registerTool(\n\t\t\t\ttool.name,\n\t\t\t\t{\n\t\t\t\t\tdescription: tool.description || '',\n\t\t\t\t\tinputSchema,\n\t\t\t\t},\n\t\t\t\thandler\n\t\t\t);\n\t\t} else if (typeof mcpServer.tool === 'function') {\n\t\t\tconst jsonSchema = {\n\t\t\t\ttype: tool.inputSchema.type,\n\t\t\t\tproperties: tool.inputSchema.properties || {},\n\t\t\t\trequired: tool.inputSchema.required || [],\n\t\t\t};\n\t\t\tmcpServer.tool(tool.name, tool.description || '', jsonSchema, handler);\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t'MCP server does not have a compatible tool registration method. Expected registerTool() or tool() method.'\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,401 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
3
|
+
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
|
|
8
|
+
// src/schema-utils.ts
|
|
9
|
+
function convertMCPInputSchema(inputSchema) {
|
|
10
|
+
const schema = inputSchema;
|
|
11
|
+
if (!schema) {
|
|
12
|
+
return {
|
|
13
|
+
type: "object",
|
|
14
|
+
properties: {}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const result = {};
|
|
18
|
+
result.type = schema.type || "object";
|
|
19
|
+
if (result.type === "object") {
|
|
20
|
+
result.properties = schema.properties || {};
|
|
21
|
+
} else if (schema.properties) {
|
|
22
|
+
result.properties = schema.properties;
|
|
23
|
+
}
|
|
24
|
+
if (schema.required && schema.required.length > 0) {
|
|
25
|
+
result.required = schema.required;
|
|
26
|
+
}
|
|
27
|
+
if (schema.description) {
|
|
28
|
+
result.description = schema.description;
|
|
29
|
+
}
|
|
30
|
+
const knownFields = /* @__PURE__ */ new Set([
|
|
31
|
+
"type",
|
|
32
|
+
"properties",
|
|
33
|
+
"required",
|
|
34
|
+
"description"
|
|
35
|
+
]);
|
|
36
|
+
for (const [key, value] of Object.entries(schema)) {
|
|
37
|
+
if (!knownFields.has(key) && value !== void 0) {
|
|
38
|
+
result[key] = value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
__name(convertMCPInputSchema, "convertMCPInputSchema");
|
|
44
|
+
function convertMCPToolToFunction(tool, handler) {
|
|
45
|
+
return {
|
|
46
|
+
name: tool.name,
|
|
47
|
+
description: tool.description || `MCP tool: ${tool.name}`,
|
|
48
|
+
inputSchema: convertMCPInputSchema(tool.inputSchema),
|
|
49
|
+
handler
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
__name(convertMCPToolToFunction, "convertMCPToolToFunction");
|
|
53
|
+
|
|
54
|
+
// src/mcp-connector.ts
|
|
55
|
+
var MCPConnector = class {
|
|
56
|
+
static {
|
|
57
|
+
__name(this, "MCPConnector");
|
|
58
|
+
}
|
|
59
|
+
clients = /* @__PURE__ */ new Map();
|
|
60
|
+
currentClient = null;
|
|
61
|
+
currentServerName = null;
|
|
62
|
+
/**
|
|
63
|
+
* Fetches all tools from an MCP server, handling pagination if present.
|
|
64
|
+
*/
|
|
65
|
+
async fetchAllTools(client) {
|
|
66
|
+
const allTools = [];
|
|
67
|
+
let cursor;
|
|
68
|
+
do {
|
|
69
|
+
const toolsResult = await client.listTools(cursor ? {
|
|
70
|
+
cursor
|
|
71
|
+
} : void 0);
|
|
72
|
+
const tools = toolsResult.tools || [];
|
|
73
|
+
allTools.push(...tools);
|
|
74
|
+
cursor = toolsResult.nextCursor;
|
|
75
|
+
} while (cursor);
|
|
76
|
+
return allTools;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Connects to an MCP server using stdio transport.
|
|
80
|
+
* @param config - MCP stdio server configuration
|
|
81
|
+
* @returns APIGroupConfig with converted tools
|
|
82
|
+
*/
|
|
83
|
+
async connectToStdioServer(config) {
|
|
84
|
+
const transport = new StdioClientTransport({
|
|
85
|
+
command: config.command,
|
|
86
|
+
args: config.args,
|
|
87
|
+
env: config.env
|
|
88
|
+
});
|
|
89
|
+
const client = new Client({
|
|
90
|
+
name: "agent-tool-protocol-connector",
|
|
91
|
+
version: "1.0.0"
|
|
92
|
+
}, {
|
|
93
|
+
capabilities: {}
|
|
94
|
+
});
|
|
95
|
+
await client.connect(transport);
|
|
96
|
+
this.clients.set(config.name, client);
|
|
97
|
+
this.currentClient = client;
|
|
98
|
+
this.currentServerName = config.name;
|
|
99
|
+
const tools = await this.fetchAllTools(client);
|
|
100
|
+
const functions = tools.map((tool) => {
|
|
101
|
+
const inputSchema = convertMCPInputSchema(tool.inputSchema);
|
|
102
|
+
return {
|
|
103
|
+
name: tool.name,
|
|
104
|
+
description: tool.description || `MCP tool: ${tool.name}`,
|
|
105
|
+
inputSchema,
|
|
106
|
+
handler: /* @__PURE__ */ __name(async (input) => {
|
|
107
|
+
const result = await client.callTool({
|
|
108
|
+
name: tool.name,
|
|
109
|
+
arguments: input
|
|
110
|
+
});
|
|
111
|
+
return result.content;
|
|
112
|
+
}, "handler")
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
name: config.name,
|
|
117
|
+
type: "mcp",
|
|
118
|
+
functions
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Connects to an MCP server using SSE transport.
|
|
123
|
+
* @param config - MCP SSE server configuration
|
|
124
|
+
* @returns APIGroupConfig with converted tools
|
|
125
|
+
*/
|
|
126
|
+
async connectToSSEServer(config) {
|
|
127
|
+
const transport = new SSEClientTransport(new URL(config.serverUrl), {
|
|
128
|
+
requestInit: {
|
|
129
|
+
headers: config.headers || {}
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
const client = new Client({
|
|
133
|
+
name: "agent-tool-protocol-connector",
|
|
134
|
+
version: "1.0.0"
|
|
135
|
+
}, {
|
|
136
|
+
capabilities: {}
|
|
137
|
+
});
|
|
138
|
+
await client.connect(transport);
|
|
139
|
+
this.clients.set(config.name, client);
|
|
140
|
+
this.currentClient = client;
|
|
141
|
+
this.currentServerName = config.name;
|
|
142
|
+
const tools = await this.fetchAllTools(client);
|
|
143
|
+
const functions = tools.map((tool) => {
|
|
144
|
+
const inputSchema = convertMCPInputSchema(tool.inputSchema);
|
|
145
|
+
return {
|
|
146
|
+
name: tool.name,
|
|
147
|
+
description: tool.description || `MCP tool: ${tool.name}`,
|
|
148
|
+
inputSchema,
|
|
149
|
+
handler: /* @__PURE__ */ __name(async (input) => {
|
|
150
|
+
const result = await client.callTool({
|
|
151
|
+
name: tool.name,
|
|
152
|
+
arguments: input
|
|
153
|
+
});
|
|
154
|
+
return result.content;
|
|
155
|
+
}, "handler")
|
|
156
|
+
};
|
|
157
|
+
});
|
|
158
|
+
return {
|
|
159
|
+
name: config.name,
|
|
160
|
+
type: "mcp",
|
|
161
|
+
functions
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Connects to an MCP server and retrieves its tools.
|
|
166
|
+
* @param config - MCP server configuration (supports both stdio and SSE)
|
|
167
|
+
* @returns APIGroupConfig with converted tools
|
|
168
|
+
*/
|
|
169
|
+
async connectToMCPServer(config) {
|
|
170
|
+
if ("transport" in config) {
|
|
171
|
+
if (config.transport === "sse") {
|
|
172
|
+
return this.connectToSSEServer(config);
|
|
173
|
+
}
|
|
174
|
+
return this.connectToStdioServer(config);
|
|
175
|
+
}
|
|
176
|
+
return this.connectToStdioServer({
|
|
177
|
+
name: config.name,
|
|
178
|
+
transport: "stdio",
|
|
179
|
+
command: config.command,
|
|
180
|
+
args: config.args,
|
|
181
|
+
env: config.env
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Connects to multiple MCP servers.
|
|
186
|
+
* @param configs - Array of MCP server configurations
|
|
187
|
+
* @returns Array of APIGroupConfig objects
|
|
188
|
+
*/
|
|
189
|
+
async connectToMultipleServers(configs) {
|
|
190
|
+
return Promise.all(configs.map((config) => this.connectToMCPServer(config)));
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Disconnects from all MCP servers.
|
|
194
|
+
*/
|
|
195
|
+
async disconnectAll() {
|
|
196
|
+
const disconnectPromises = Array.from(this.clients.values()).map(async (client) => {
|
|
197
|
+
try {
|
|
198
|
+
await client.close();
|
|
199
|
+
} catch (error) {
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
await Promise.all(disconnectPromises);
|
|
203
|
+
this.clients.clear();
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Gets a connected MCP client by name.
|
|
207
|
+
* @param name - Server name
|
|
208
|
+
* @returns MCP Client or undefined
|
|
209
|
+
*/
|
|
210
|
+
getClient(name) {
|
|
211
|
+
return this.clients.get(name);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Lists all tools from the currently connected MCP server.
|
|
215
|
+
* @returns Array of tools
|
|
216
|
+
*/
|
|
217
|
+
async listTools() {
|
|
218
|
+
if (!this.currentClient) {
|
|
219
|
+
throw new Error("Not connected to any MCP server");
|
|
220
|
+
}
|
|
221
|
+
const toolsResult = await this.currentClient.listTools();
|
|
222
|
+
return toolsResult.tools || [];
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Lists all prompts from the currently connected MCP server.
|
|
226
|
+
* @returns Array of prompts
|
|
227
|
+
*/
|
|
228
|
+
async listPrompts() {
|
|
229
|
+
if (!this.currentClient) {
|
|
230
|
+
throw new Error("Not connected to any MCP server");
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
const promptsResult = await this.currentClient.listPrompts();
|
|
234
|
+
return promptsResult.prompts || [];
|
|
235
|
+
} catch (error) {
|
|
236
|
+
return [];
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Calls a tool on the currently connected MCP server.
|
|
241
|
+
* @param name - Tool name
|
|
242
|
+
* @param input - Tool input parameters
|
|
243
|
+
* @returns Tool execution result
|
|
244
|
+
*/
|
|
245
|
+
async callTool(name, input) {
|
|
246
|
+
if (!this.currentClient) {
|
|
247
|
+
throw new Error("Not connected to any MCP server");
|
|
248
|
+
}
|
|
249
|
+
const result = await this.currentClient.callTool({
|
|
250
|
+
name,
|
|
251
|
+
arguments: input
|
|
252
|
+
});
|
|
253
|
+
return result.content;
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
// src/http-connector.ts
|
|
258
|
+
var MCPHttpConnector = class {
|
|
259
|
+
static {
|
|
260
|
+
__name(this, "MCPHttpConnector");
|
|
261
|
+
}
|
|
262
|
+
baseUrl;
|
|
263
|
+
headers;
|
|
264
|
+
constructor(baseUrl, headers = {}) {
|
|
265
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
266
|
+
this.headers = {
|
|
267
|
+
"Content-Type": "application/json",
|
|
268
|
+
...headers
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
async makeRequest(method, params) {
|
|
272
|
+
const body = {
|
|
273
|
+
jsonrpc: "2.0",
|
|
274
|
+
id: Date.now(),
|
|
275
|
+
method
|
|
276
|
+
};
|
|
277
|
+
if (params) {
|
|
278
|
+
body.params = params;
|
|
279
|
+
}
|
|
280
|
+
const response = await fetch(this.baseUrl, {
|
|
281
|
+
method: "POST",
|
|
282
|
+
headers: this.headers,
|
|
283
|
+
body: JSON.stringify(body)
|
|
284
|
+
});
|
|
285
|
+
if (!response.ok) {
|
|
286
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
287
|
+
}
|
|
288
|
+
const data = await response.json();
|
|
289
|
+
if (data.error) {
|
|
290
|
+
throw new Error(`MCP Error: ${data.error.message || JSON.stringify(data.error)}`);
|
|
291
|
+
}
|
|
292
|
+
return data.result;
|
|
293
|
+
}
|
|
294
|
+
async listTools() {
|
|
295
|
+
const result = await this.makeRequest("tools/list");
|
|
296
|
+
return result.tools || [];
|
|
297
|
+
}
|
|
298
|
+
async listPrompts() {
|
|
299
|
+
try {
|
|
300
|
+
const result = await this.makeRequest("prompts/list");
|
|
301
|
+
return result.prompts || [];
|
|
302
|
+
} catch (error) {
|
|
303
|
+
return [];
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async getPrompt(name, args) {
|
|
307
|
+
const result = await this.makeRequest("prompts/get", {
|
|
308
|
+
name,
|
|
309
|
+
arguments: args
|
|
310
|
+
});
|
|
311
|
+
return {
|
|
312
|
+
messages: result.messages.map((msg) => ({
|
|
313
|
+
role: msg.role,
|
|
314
|
+
content: typeof msg.content === "string" ? msg.content : msg.content.text
|
|
315
|
+
}))
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
async callTool(name, input) {
|
|
319
|
+
const result = await this.makeRequest("tools/call", {
|
|
320
|
+
name,
|
|
321
|
+
arguments: input
|
|
322
|
+
});
|
|
323
|
+
if (!result.content || result.content.length === 0) {
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
const firstBlock = result.content[0];
|
|
327
|
+
if (result.content.length === 1 && firstBlock && firstBlock.type === "text") {
|
|
328
|
+
const text = firstBlock.text || "";
|
|
329
|
+
try {
|
|
330
|
+
return JSON.parse(text);
|
|
331
|
+
} catch {
|
|
332
|
+
return text;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return result.content.map((block) => {
|
|
336
|
+
if (block.type === "text") {
|
|
337
|
+
return block.text;
|
|
338
|
+
}
|
|
339
|
+
return block;
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
async disconnect() {
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
// src/atp-to-mcp.ts
|
|
347
|
+
function registerATPTools(client, mcpServer) {
|
|
348
|
+
const tools = client.getATPTools();
|
|
349
|
+
registerToolsWithMCP(tools, mcpServer);
|
|
350
|
+
}
|
|
351
|
+
__name(registerATPTools, "registerATPTools");
|
|
352
|
+
function registerToolsWithMCP(tools, mcpServer) {
|
|
353
|
+
for (const tool of tools) {
|
|
354
|
+
const handler = /* @__PURE__ */ __name(async (args) => {
|
|
355
|
+
try {
|
|
356
|
+
const result = await tool.func(args);
|
|
357
|
+
const resultText = typeof result === "string" ? result : JSON.stringify(result, null, 2);
|
|
358
|
+
return {
|
|
359
|
+
content: [
|
|
360
|
+
{
|
|
361
|
+
type: "text",
|
|
362
|
+
text: resultText
|
|
363
|
+
}
|
|
364
|
+
]
|
|
365
|
+
};
|
|
366
|
+
} catch (error) {
|
|
367
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
368
|
+
return {
|
|
369
|
+
content: [
|
|
370
|
+
{
|
|
371
|
+
type: "text",
|
|
372
|
+
text: `Error: ${errorMessage}`
|
|
373
|
+
}
|
|
374
|
+
],
|
|
375
|
+
isError: true
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
}, "handler");
|
|
379
|
+
if (typeof mcpServer.registerTool === "function") {
|
|
380
|
+
const inputSchema = tool.zodSchema?.shape ?? {};
|
|
381
|
+
mcpServer.registerTool(tool.name, {
|
|
382
|
+
description: tool.description || "",
|
|
383
|
+
inputSchema
|
|
384
|
+
}, handler);
|
|
385
|
+
} else if (typeof mcpServer.tool === "function") {
|
|
386
|
+
const jsonSchema = {
|
|
387
|
+
type: tool.inputSchema.type,
|
|
388
|
+
properties: tool.inputSchema.properties || {},
|
|
389
|
+
required: tool.inputSchema.required || []
|
|
390
|
+
};
|
|
391
|
+
mcpServer.tool(tool.name, tool.description || "", jsonSchema, handler);
|
|
392
|
+
} else {
|
|
393
|
+
throw new Error("MCP server does not have a compatible tool registration method. Expected registerTool() or tool() method.");
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
__name(registerToolsWithMCP, "registerToolsWithMCP");
|
|
398
|
+
|
|
399
|
+
export { MCPConnector, MCPHttpConnector, convertMCPInputSchema, convertMCPToolToFunction, registerATPTools, registerToolsWithMCP };
|
|
400
|
+
//# sourceMappingURL=index.js.map
|
|
5
401
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"sources":["../src/schema-utils.ts","../src/mcp-connector.ts","../src/http-connector.ts","../src/atp-to-mcp.ts"],"names":["convertMCPInputSchema","inputSchema","schema","type","properties","result","required","length","description","knownFields","Set","key","value","Object","entries","has","undefined","convertMCPToolToFunction","tool","handler","name","MCPConnector","clients","Map","currentClient","currentServerName","fetchAllTools","client","allTools","cursor","toolsResult","listTools","tools","push","nextCursor","connectToStdioServer","config","transport","StdioClientTransport","command","args","env","Client","version","capabilities","connect","set","functions","map","input","callTool","arguments","content","connectToSSEServer","SSEClientTransport","URL","serverUrl","requestInit","headers","connectToMCPServer","connectToMultipleServers","configs","Promise","all","disconnectAll","disconnectPromises","Array","from","values","close","error","clear","getClient","get","Error","listPrompts","promptsResult","prompts","MCPHttpConnector","baseUrl","constructor","replace","makeRequest","method","params","body","jsonrpc","id","Date","now","response","fetch","JSON","stringify","ok","status","statusText","data","json","message","getPrompt","messages","msg","role","text","firstBlock","parse","block","disconnect","registerATPTools","mcpServer","getATPTools","registerToolsWithMCP","func","resultText","errorMessage","String","isError","registerTool","zodSchema","shape","jsonSchema"],"mappings":"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","file":"index.js","sourcesContent":["import type { CustomFunctionDef } from '@mondaydotcomorg/atp-protocol';\n\nexport interface MCPToolSchema {\n\ttype?: string;\n\tproperties?: Record<string, unknown>;\n\trequired?: string[];\n\tdescription?: string;\n\t[key: string]: unknown;\n}\n\nexport interface MCPToolDefinition {\n\tname: string;\n\tdescription?: string;\n\tinputSchema?: MCPToolSchema;\n}\n\nexport function convertMCPInputSchema(inputSchema: unknown): {\n\ttype: string;\n\tproperties?: Record<string, unknown>;\n\trequired?: string[];\n\t[key: string]: unknown;\n} {\n\tconst schema = inputSchema as MCPToolSchema | undefined;\n\n\tif (!schema) {\n\t\treturn { type: 'object', properties: {} };\n\t}\n\n\tconst result: Record<string, unknown> = {};\n\tresult.type = schema.type || 'object';\n\n\tif (result.type === 'object') {\n\t\tresult.properties = schema.properties || {};\n\t} else if (schema.properties) {\n\t\tresult.properties = schema.properties;\n\t}\n\n\tif (schema.required && schema.required.length > 0) {\n\t\tresult.required = schema.required;\n\t}\n\n\tif (schema.description) {\n\t\tresult.description = schema.description;\n\t}\n\n\tconst knownFields = new Set(['type', 'properties', 'required', 'description']);\n\tfor (const [key, value] of Object.entries(schema)) {\n\t\tif (!knownFields.has(key) && value !== undefined) {\n\t\t\tresult[key] = value;\n\t\t}\n\t}\n\n\treturn result as {\n\t\ttype: string;\n\t\tproperties?: Record<string, unknown>;\n\t\trequired?: string[];\n\t\t[key: string]: unknown;\n\t};\n}\n\nexport function convertMCPToolToFunction(\n\ttool: MCPToolDefinition,\n\thandler: (input: unknown) => Promise<unknown>\n): CustomFunctionDef {\n\treturn {\n\t\tname: tool.name,\n\t\tdescription: tool.description || `MCP tool: ${tool.name}`,\n\t\tinputSchema: convertMCPInputSchema(tool.inputSchema),\n\t\thandler,\n\t};\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport type { APIGroupConfig, CustomFunctionDef } from '@mondaydotcomorg/atp-protocol';\nimport { convertMCPInputSchema } from './schema-utils.js';\nimport type { MCPStdioServerConfig, MCPSSEServerConfig, MCPServerConfig } from './types.js';\n\ninterface MCPServerConfigLegacy {\n\tname: string;\n\tcommand: string;\n\targs: string[];\n\tenv?: Record<string, string>;\n}\n\n/**\n * MCPConnector connects to MCP servers and converts their tools to Agent Tool Protocol format.\n */\nexport class MCPConnector {\n\tprivate clients: Map<string, Client> = new Map();\n\tprivate currentClient: Client | null = null;\n\tprivate currentServerName: string | null = null;\n\n\t/**\n\t * Fetches all tools from an MCP server, handling pagination if present.\n\t */\n\tprivate async fetchAllTools(client: Client): Promise<Array<{ name: string; description?: string; inputSchema: unknown }>> {\n\t\tconst allTools: Array<{ name: string; description?: string; inputSchema: unknown }> = [];\n\t\tlet cursor: string | undefined;\n\n\t\tdo {\n\t\t\tconst toolsResult = await client.listTools(cursor ? { cursor } : undefined);\n\t\t\tconst tools = toolsResult.tools || [];\n\t\t\tallTools.push(...tools);\n\t\t\tcursor = toolsResult.nextCursor;\n\t\t} while (cursor);\n\n\t\treturn allTools;\n\t}\n\n\t/**\n\t * Connects to an MCP server using stdio transport.\n\t * @param config - MCP stdio server configuration\n\t * @returns APIGroupConfig with converted tools\n\t */\n\tasync connectToStdioServer(config: MCPStdioServerConfig): Promise<APIGroupConfig> {\n\t\tconst transport = new StdioClientTransport({\n\t\t\tcommand: config.command,\n\t\t\targs: config.args,\n\t\t\tenv: config.env,\n\t\t});\n\n\t\tconst client = new Client(\n\t\t\t{ name: 'agent-tool-protocol-connector', version: '1.0.0' },\n\t\t\t{ capabilities: {} }\n\t\t);\n\n\t\tawait client.connect(transport);\n\t\tthis.clients.set(config.name, client);\n\t\tthis.currentClient = client;\n\t\tthis.currentServerName = config.name;\n\n\t\tconst tools = await this.fetchAllTools(client);\n\n\t\tconst functions: CustomFunctionDef[] = tools.map((tool) => {\n\t\t\tconst inputSchema = convertMCPInputSchema(tool.inputSchema);\n\n\t\t\treturn {\n\t\t\t\tname: tool.name,\n\t\t\t\tdescription: tool.description || `MCP tool: ${tool.name}`,\n\t\t\t\tinputSchema,\n\t\t\t\thandler: async (input: unknown) => {\n\t\t\t\t\tconst result = await client.callTool({\n\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\targuments: input as Record<string, unknown>,\n\t\t\t\t\t});\n\t\t\t\t\treturn result.content;\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\treturn {\n\t\t\tname: config.name,\n\t\t\ttype: 'mcp',\n\t\t\tfunctions,\n\t\t};\n\t}\n\n\t/**\n\t * Connects to an MCP server using SSE transport.\n\t * @param config - MCP SSE server configuration\n\t * @returns APIGroupConfig with converted tools\n\t */\n\tasync connectToSSEServer(config: MCPSSEServerConfig): Promise<APIGroupConfig> {\n\t\tconst transport = new SSEClientTransport(new URL(config.serverUrl), {\n\t\t\trequestInit: { headers: config.headers || {} },\n\t\t});\n\n\t\tconst client = new Client(\n\t\t\t{ name: 'agent-tool-protocol-connector', version: '1.0.0' },\n\t\t\t{ capabilities: {} }\n\t\t);\n\n\t\tawait client.connect(transport);\n\t\tthis.clients.set(config.name, client);\n\t\tthis.currentClient = client;\n\t\tthis.currentServerName = config.name;\n\n\t\tconst tools = await this.fetchAllTools(client);\n\n\t\tconst functions: CustomFunctionDef[] = tools.map((tool) => {\n\t\t\tconst inputSchema = convertMCPInputSchema(tool.inputSchema);\n\n\t\t\treturn {\n\t\t\t\tname: tool.name,\n\t\t\t\tdescription: tool.description || `MCP tool: ${tool.name}`,\n\t\t\t\tinputSchema,\n\t\t\t\thandler: async (input: unknown) => {\n\t\t\t\t\tconst result = await client.callTool({\n\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\targuments: input as Record<string, unknown>,\n\t\t\t\t\t});\n\t\t\t\t\treturn result.content;\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\treturn {\n\t\t\tname: config.name,\n\t\t\ttype: 'mcp',\n\t\t\tfunctions,\n\t\t};\n\t}\n\n\t/**\n\t * Connects to an MCP server and retrieves its tools.\n\t * @param config - MCP server configuration (supports both stdio and SSE)\n\t * @returns APIGroupConfig with converted tools\n\t */\n\tasync connectToMCPServer(config: MCPServerConfig | MCPServerConfigLegacy): Promise<APIGroupConfig> {\n\t\tif ('transport' in config) {\n\t\t\tif (config.transport === 'sse') {\n\t\t\t\treturn this.connectToSSEServer(config);\n\t\t\t}\n\t\t\treturn this.connectToStdioServer(config);\n\t\t}\n\n\t\t// Legacy support: treat as stdio config\n\t\treturn this.connectToStdioServer({\n\t\t\tname: config.name,\n\t\t\ttransport: 'stdio',\n\t\t\tcommand: config.command,\n\t\t\targs: config.args,\n\t\t\tenv: config.env,\n\t\t});\n\t}\n\n\t/**\n\t * Connects to multiple MCP servers.\n\t * @param configs - Array of MCP server configurations\n\t * @returns Array of APIGroupConfig objects\n\t */\n\tasync connectToMultipleServers(configs: MCPServerConfig[]): Promise<APIGroupConfig[]> {\n\t\treturn Promise.all(configs.map((config) => this.connectToMCPServer(config)));\n\t}\n\n\t/**\n\t * Disconnects from all MCP servers.\n\t */\n\tasync disconnectAll(): Promise<void> {\n\t\tconst disconnectPromises = Array.from(this.clients.values()).map(async (client) => {\n\t\t\ttry {\n\t\t\t\tawait client.close();\n\t\t\t} catch (error) {}\n\t\t});\n\t\tawait Promise.all(disconnectPromises);\n\t\tthis.clients.clear();\n\t}\n\n\t/**\n\t * Gets a connected MCP client by name.\n\t * @param name - Server name\n\t * @returns MCP Client or undefined\n\t */\n\tgetClient(name: string): Client | undefined {\n\t\treturn this.clients.get(name);\n\t}\n\n\t/**\n\t * Lists all tools from the currently connected MCP server.\n\t * @returns Array of tools\n\t */\n\tasync listTools(): Promise<unknown[]> {\n\t\tif (!this.currentClient) {\n\t\t\tthrow new Error('Not connected to any MCP server');\n\t\t}\n\t\tconst toolsResult = await this.currentClient.listTools();\n\t\treturn toolsResult.tools || [];\n\t}\n\n\t/**\n\t * Lists all prompts from the currently connected MCP server.\n\t * @returns Array of prompts\n\t */\n\tasync listPrompts(): Promise<unknown[]> {\n\t\tif (!this.currentClient) {\n\t\t\tthrow new Error('Not connected to any MCP server');\n\t\t}\n\t\ttry {\n\t\t\tconst promptsResult = await this.currentClient.listPrompts();\n\t\t\treturn promptsResult.prompts || [];\n\t\t} catch (error) {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Calls a tool on the currently connected MCP server.\n\t * @param name - Tool name\n\t * @param input - Tool input parameters\n\t * @returns Tool execution result\n\t */\n\tasync callTool(name: string, input: Record<string, unknown>): Promise<unknown> {\n\t\tif (!this.currentClient) {\n\t\t\tthrow new Error('Not connected to any MCP server');\n\t\t}\n\t\tconst result = await this.currentClient.callTool({\n\t\t\tname,\n\t\t\targuments: input,\n\t\t});\n\t\treturn result.content;\n\t}\n}\n","import type { MCPTool, MCPPrompt } from './types.js';\n\ninterface JsonRpcResponse {\n\tjsonrpc: string;\n\tid: number;\n\tresult?: unknown;\n\terror?: {\n\t\tcode?: number;\n\t\tmessage?: string;\n\t\tdata?: unknown;\n\t};\n}\n\nexport class MCPHttpConnector {\n\tprivate baseUrl: string;\n\tprivate headers: Record<string, string>;\n\n\tconstructor(baseUrl: string, headers: Record<string, string> = {}) {\n\t\tthis.baseUrl = baseUrl.replace(/\\/$/, '');\n\t\tthis.headers = {\n\t\t\t'Content-Type': 'application/json',\n\t\t\t...headers,\n\t\t};\n\t}\n\n\tprivate async makeRequest(method: string, params?: unknown): Promise<unknown> {\n\t\tconst body: {\n\t\t\tjsonrpc: string;\n\t\t\tid: number;\n\t\t\tmethod: string;\n\t\t\tparams?: unknown;\n\t\t} = {\n\t\t\tjsonrpc: '2.0',\n\t\t\tid: Date.now(),\n\t\t\tmethod,\n\t\t};\n\n\t\tif (params) {\n\t\t\tbody.params = params;\n\t\t}\n\n\t\tconst response = await fetch(this.baseUrl, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: this.headers,\n\t\t\tbody: JSON.stringify(body),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`HTTP ${response.status}: ${response.statusText}`);\n\t\t}\n\n\t\tconst data = (await response.json()) as JsonRpcResponse;\n\n\t\tif (data.error) {\n\t\t\tthrow new Error(`MCP Error: ${data.error.message || JSON.stringify(data.error)}`);\n\t\t}\n\n\t\treturn data.result;\n\t}\n\n\tasync listTools(): Promise<MCPTool[]> {\n\t\tconst result = (await this.makeRequest('tools/list')) as { tools: MCPTool[] };\n\t\treturn result.tools || [];\n\t}\n\n\tasync listPrompts(): Promise<MCPPrompt[]> {\n\t\ttry {\n\t\t\tconst result = (await this.makeRequest('prompts/list')) as { prompts: MCPPrompt[] };\n\t\t\treturn result.prompts || [];\n\t\t} catch (error) {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync getPrompt(\n\t\tname: string,\n\t\targs?: Record<string, string>\n\t): Promise<{ messages: Array<{ role: string; content: string }> }> {\n\t\tconst result = (await this.makeRequest('prompts/get', {\n\t\t\tname,\n\t\t\targuments: args,\n\t\t})) as { messages: Array<{ role: string; content: { type: string; text: string } | string }> };\n\n\t\treturn {\n\t\t\tmessages: result.messages.map((msg) => ({\n\t\t\t\trole: msg.role,\n\t\t\t\tcontent: typeof msg.content === 'string' ? msg.content : msg.content.text,\n\t\t\t})),\n\t\t};\n\t}\n\n\tasync callTool(name: string, input: Record<string, unknown>): Promise<unknown> {\n\t\tconst result = (await this.makeRequest('tools/call', {\n\t\t\tname,\n\t\t\targuments: input,\n\t\t})) as { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> };\n\n\t\tif (!result.content || result.content.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst firstBlock = result.content[0];\n\t\tif (result.content.length === 1 && firstBlock && firstBlock.type === 'text') {\n\t\t\tconst text = firstBlock.text || '';\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(text);\n\t\t\t} catch {\n\t\t\t\treturn text;\n\t\t\t}\n\t\t}\n\n\t\treturn result.content.map((block) => {\n\t\t\tif (block.type === 'text') {\n\t\t\t\treturn block.text;\n\t\t\t}\n\t\t\treturn block;\n\t\t});\n\t}\n\n\tasync disconnect(): Promise<void> {}\n}\n","import type { AgentToolProtocolClient, Tool } from '@mondaydotcomorg/atp-client';\n\n/**\n * MCP tool handler result\n */\nexport interface MCPToolResult {\n\tcontent: Array<{ type: 'text'; text: string }>;\n\tisError?: boolean;\n}\n\n/**\n * MCP Server interface - supports both legacy (v0.x) and modern (v1.x) SDK.\n *\n * Uses minimal duck-typing to avoid TypeScript variance issues with the\n * MCP SDK's complex generic callback signatures.\n */\nexport interface MCPServerLike {\n\tregisterTool?: Function;\n\ttool?: Function;\n}\n\n/**\n * Registers ATP tools with an MCP server.\n *\n * @example\n * ```typescript\n * import { Server } from '@modelcontextprotocol/sdk/server/index.js';\n * import { AgentToolProtocolClient } from '@mondaydotcomorg/atp-client';\n * import { registerATPTools } from '@mondaydotcomorg/atp-mcp-adapter';\n *\n * const client = new AgentToolProtocolClient({ baseUrl: 'http://localhost:3000' });\n * await client.init();\n * await client.connect();\n *\n * const mcpServer = new Server({ name: 'my-server', version: '1.0.0' }, { capabilities: { tools: {} } });\n * registerATPTools(client, mcpServer);\n * ```\n */\nexport function registerATPTools(client: AgentToolProtocolClient, mcpServer: MCPServerLike): void {\n\tconst tools = client.getATPTools();\n\tregisterToolsWithMCP(tools, mcpServer);\n}\n\n/**\n * Registers an array of ATP tools with an MCP server.\n * Use this if you want more control over which tools to register.\n * Supports both MCP SDK v0.x and v1.x APIs.\n *\n * @example\n * ```typescript\n * const tools = client.getATPTools().filter(t => t.name !== 'search_api');\n * registerToolsWithMCP(tools, mcpServer);\n * ```\n */\nexport function registerToolsWithMCP(tools: Tool[], mcpServer: MCPServerLike): void {\n\tfor (const tool of tools) {\n\t\tconst handler = async (args: Record<string, unknown>): Promise<MCPToolResult> => {\n\t\t\ttry {\n\t\t\t\tconst result = await tool.func(args);\n\t\t\t\tconst resultText = typeof result === 'string' ? result : JSON.stringify(result, null, 2);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: 'text' as const, text: resultText }],\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: 'text' as const, text: `Error: ${errorMessage}` }],\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t};\n\n\t\tif (typeof mcpServer.registerTool === 'function') {\n\t\t\tconst inputSchema = tool.zodSchema?.shape ?? {};\n\t\t\tmcpServer.registerTool(\n\t\t\t\ttool.name,\n\t\t\t\t{\n\t\t\t\t\tdescription: tool.description || '',\n\t\t\t\t\tinputSchema,\n\t\t\t\t},\n\t\t\t\thandler\n\t\t\t);\n\t\t} else if (typeof mcpServer.tool === 'function') {\n\t\t\tconst jsonSchema = {\n\t\t\t\ttype: tool.inputSchema.type,\n\t\t\t\tproperties: tool.inputSchema.properties || {},\n\t\t\t\trequired: tool.inputSchema.required || [],\n\t\t\t};\n\t\t\tmcpServer.tool(tool.name, tool.description || '', jsonSchema, handler);\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t'MCP server does not have a compatible tool registration method. Expected registerTool() or tool() method.'\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mondaydotcomorg/atp-mcp-adapter",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.3",
|
|
4
4
|
"description": "MCP compatibility adapter for Agent Tool Protocol",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
],
|
|
45
45
|
"license": "MIT",
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@mondaydotcomorg/atp-protocol": "0.22.
|
|
48
|
-
"@mondaydotcomorg/atp-server": "0.24.
|
|
47
|
+
"@mondaydotcomorg/atp-protocol": "0.22.1",
|
|
48
|
+
"@mondaydotcomorg/atp-server": "0.24.2"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"@modelcontextprotocol/sdk": ">=0.5.0",
|