@vleap/warps-mcp 1.0.0-beta.10 → 1.0.0-beta.11
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.js +1 -312
- package/dist/index.mjs +1 -284
- package/package.json +1 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,312 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/index.ts
|
|
21
|
-
var index_exports = {};
|
|
22
|
-
__export(index_exports, {
|
|
23
|
-
WarpMcp: () => WarpMcp,
|
|
24
|
-
convertMcpArgsToWarpInputs: () => convertMcpArgsToWarpInputs,
|
|
25
|
-
convertMcpToolToWarp: () => convertMcpToolToWarp,
|
|
26
|
-
convertWarpToMcpCapabilities: () => convertWarpToMcpCapabilities,
|
|
27
|
-
createMcpServerFromWarps: () => createMcpServerFromWarps
|
|
28
|
-
});
|
|
29
|
-
module.exports = __toCommonJS(index_exports);
|
|
30
|
-
|
|
31
|
-
// src/helpers/execution.ts
|
|
32
|
-
var import_warps = require("@vleap/warps");
|
|
33
|
-
var convertMcpArgsToWarpInputs = (warp, args) => {
|
|
34
|
-
const { action } = (0, import_warps.getWarpPrimaryAction)(warp);
|
|
35
|
-
if (!action.inputs) return [];
|
|
36
|
-
const serializer = new import_warps.WarpSerializer();
|
|
37
|
-
return action.inputs.map((input) => {
|
|
38
|
-
const key = input.as || input.name;
|
|
39
|
-
const value = args[key] ?? input.default ?? null;
|
|
40
|
-
if (value === null && input.type === "bool") {
|
|
41
|
-
return serializer.nativeToString(input.type, false);
|
|
42
|
-
}
|
|
43
|
-
return serializer.nativeToString(input.type, value);
|
|
44
|
-
});
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
// src/helpers/warps.ts
|
|
48
|
-
var import_warps2 = require("@vleap/warps");
|
|
49
|
-
var import_zod = require("zod");
|
|
50
|
-
var convertMcpToolToWarp = async (config, tool, url, headers) => {
|
|
51
|
-
const inputs = [];
|
|
52
|
-
if (tool.inputSchema?.properties) {
|
|
53
|
-
const properties = tool.inputSchema.properties;
|
|
54
|
-
const required = tool.inputSchema.required || [];
|
|
55
|
-
Object.entries(properties).forEach(([key, value]) => {
|
|
56
|
-
const isRequired = required.includes(key);
|
|
57
|
-
const inputType = convertJsonSchemaTypeToWarpType(value.type, value.format);
|
|
58
|
-
const inputDef = {
|
|
59
|
-
name: key,
|
|
60
|
-
label: value.title || { en: key },
|
|
61
|
-
description: value.description ? { en: value.description.trim() } : null,
|
|
62
|
-
type: inputType,
|
|
63
|
-
position: `payload:${key}`,
|
|
64
|
-
source: "field",
|
|
65
|
-
required: isRequired,
|
|
66
|
-
default: value.default
|
|
67
|
-
};
|
|
68
|
-
inputs.push(inputDef);
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
const output = {};
|
|
72
|
-
if (tool.outputSchema?.properties) {
|
|
73
|
-
Object.keys(tool.outputSchema.properties).forEach((key) => {
|
|
74
|
-
output[key] = `out.${key}`;
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
const mcpAction = {
|
|
78
|
-
type: "mcp",
|
|
79
|
-
label: { en: tool.name },
|
|
80
|
-
description: tool.description ? { en: tool.description.trim() } : null,
|
|
81
|
-
destination: { url, tool: tool.name, headers },
|
|
82
|
-
inputs
|
|
83
|
-
};
|
|
84
|
-
return await new import_warps2.WarpBuilder(config).setName(tool.name).setTitle({ en: tool.name }).setDescription(tool.description ? { en: tool.description.trim() } : null).addAction(mcpAction).setOutput(Object.keys(output).length > 0 ? output : null).build(false);
|
|
85
|
-
};
|
|
86
|
-
var convertWarpToMcpCapabilities = (warp) => {
|
|
87
|
-
const tools = [];
|
|
88
|
-
const warpDescription = extractText(warp.description);
|
|
89
|
-
let primaryActionInputs;
|
|
90
|
-
try {
|
|
91
|
-
const { action: primaryAction } = (0, import_warps2.getWarpPrimaryAction)(warp);
|
|
92
|
-
primaryActionInputs = primaryAction.inputs;
|
|
93
|
-
console.log(`[MCP] Warp ${warp.name} - primaryActionInputs:`, primaryActionInputs?.length || 0, primaryActionInputs?.map((i) => ({ name: i.name, source: i.source, position: i.position })));
|
|
94
|
-
} catch (error) {
|
|
95
|
-
console.log(`[MCP] Warp ${warp.name} - failed to get primary action:`, error);
|
|
96
|
-
primaryActionInputs = void 0;
|
|
97
|
-
}
|
|
98
|
-
warp.actions.forEach((action, index) => {
|
|
99
|
-
const actionDescription = extractText(action.description);
|
|
100
|
-
const description = warpDescription || actionDescription;
|
|
101
|
-
if (action.type === "mcp") {
|
|
102
|
-
const mcpAction = action;
|
|
103
|
-
if (mcpAction.destination) {
|
|
104
|
-
const tool = convertMcpActionToTool(mcpAction, description, primaryActionInputs);
|
|
105
|
-
tools.push(tool);
|
|
106
|
-
}
|
|
107
|
-
} else {
|
|
108
|
-
const tool = convertActionToTool(warp, action, description, index, primaryActionInputs);
|
|
109
|
-
tools.push(tool);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
console.log(`[MCP] convertWarpToMcpCapabilities - warp: ${warp.name}, tools: ${tools.length}, tools with schema:`, tools.filter((t) => t.inputSchema).length);
|
|
113
|
-
return { tools, resources: [] };
|
|
114
|
-
};
|
|
115
|
-
var extractText = (text) => {
|
|
116
|
-
if (!text) return void 0;
|
|
117
|
-
if (typeof text === "string") return text;
|
|
118
|
-
if (typeof text === "object" && "en" in text) return text.en;
|
|
119
|
-
return void 0;
|
|
120
|
-
};
|
|
121
|
-
var buildZodSchemaFromInput = (input) => {
|
|
122
|
-
let schema;
|
|
123
|
-
const inputType = input.type.toLowerCase();
|
|
124
|
-
if (inputType === "string" || inputType === "address" || inputType === "hex") {
|
|
125
|
-
schema = import_zod.z.string();
|
|
126
|
-
} else if (inputType === "number" || inputType === "uint8" || inputType === "uint16" || inputType === "uint32" || inputType === "uint64" || inputType === "uint128" || inputType === "uint256") {
|
|
127
|
-
schema = import_zod.z.number();
|
|
128
|
-
} else if (inputType === "bool" || inputType === "boolean") {
|
|
129
|
-
schema = import_zod.z.boolean();
|
|
130
|
-
} else if (inputType === "biguint") {
|
|
131
|
-
schema = import_zod.z.string();
|
|
132
|
-
} else {
|
|
133
|
-
schema = import_zod.z.string();
|
|
134
|
-
}
|
|
135
|
-
if (typeof input.min === "number") {
|
|
136
|
-
if (schema instanceof import_zod.z.ZodNumber) {
|
|
137
|
-
schema = schema.min(input.min);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
if (typeof input.max === "number") {
|
|
141
|
-
if (schema instanceof import_zod.z.ZodNumber) {
|
|
142
|
-
schema = schema.max(input.max);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
if (input.pattern) {
|
|
146
|
-
if (schema instanceof import_zod.z.ZodString) {
|
|
147
|
-
schema = schema.regex(new RegExp(input.pattern));
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
const enumValues = extractEnumValues(input.options);
|
|
151
|
-
if (enumValues && enumValues.length > 0) {
|
|
152
|
-
if (schema instanceof import_zod.z.ZodString) {
|
|
153
|
-
schema = import_zod.z.enum(enumValues);
|
|
154
|
-
} else if (schema instanceof import_zod.z.ZodNumber) {
|
|
155
|
-
const numberValues = enumValues.map((v) => Number(v)).filter((v) => !isNaN(v));
|
|
156
|
-
if (numberValues.length > 0) {
|
|
157
|
-
schema = schema.refine((val) => numberValues.includes(val), {
|
|
158
|
-
message: `Value must be one of: ${numberValues.join(", ")}`
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
const descriptionParts = [];
|
|
164
|
-
const inputDescription = extractText(input.description);
|
|
165
|
-
if (inputDescription) {
|
|
166
|
-
descriptionParts.push(inputDescription);
|
|
167
|
-
}
|
|
168
|
-
if (input.bot) {
|
|
169
|
-
descriptionParts.push(input.bot);
|
|
170
|
-
}
|
|
171
|
-
descriptionParts.push(`Type: ${input.type}`);
|
|
172
|
-
descriptionParts.push(input.required ? "Required" : "Optional");
|
|
173
|
-
if (enumValues && enumValues.length > 0) {
|
|
174
|
-
descriptionParts.push(`Options: ${enumValues.join(", ")}`);
|
|
175
|
-
}
|
|
176
|
-
const patternDesc = extractText(input.patternDescription);
|
|
177
|
-
if (patternDesc) {
|
|
178
|
-
descriptionParts.push(patternDesc);
|
|
179
|
-
}
|
|
180
|
-
const fullDescription = descriptionParts.join(". ");
|
|
181
|
-
if (fullDescription) {
|
|
182
|
-
schema = schema.describe(fullDescription);
|
|
183
|
-
}
|
|
184
|
-
if (input.required !== true) {
|
|
185
|
-
schema = schema.optional();
|
|
186
|
-
}
|
|
187
|
-
return schema;
|
|
188
|
-
};
|
|
189
|
-
var buildZodInputSchema = (inputs) => {
|
|
190
|
-
const shape = {};
|
|
191
|
-
for (const input of inputs) {
|
|
192
|
-
if (input.source === "hidden") continue;
|
|
193
|
-
if (input.source !== "field") continue;
|
|
194
|
-
const key = input.as || input.name;
|
|
195
|
-
shape[key] = buildZodSchemaFromInput(input);
|
|
196
|
-
}
|
|
197
|
-
console.log("[MCP] buildZodInputSchema - inputs:", inputs.length, "shape keys:", Object.keys(shape));
|
|
198
|
-
return Object.keys(shape).length > 0 ? shape : void 0;
|
|
199
|
-
};
|
|
200
|
-
var convertActionToTool = (warp, action, description, index, primaryActionInputs) => {
|
|
201
|
-
const inputsToUse = primaryActionInputs || action.inputs || [];
|
|
202
|
-
const inputSchema = buildZodInputSchema(inputsToUse);
|
|
203
|
-
const name = sanitizeMcpName(`${warp.name}_${index}`);
|
|
204
|
-
console.log(`[MCP] convertActionToTool - tool: ${name}, inputsToUse: ${inputsToUse.length}, inputSchema keys:`, inputSchema ? Object.keys(inputSchema) : "undefined");
|
|
205
|
-
return {
|
|
206
|
-
name,
|
|
207
|
-
description,
|
|
208
|
-
inputSchema
|
|
209
|
-
};
|
|
210
|
-
};
|
|
211
|
-
var convertMcpActionToTool = (action, description, primaryActionInputs) => {
|
|
212
|
-
const inputsToUse = primaryActionInputs || action.inputs || [];
|
|
213
|
-
const inputSchema = buildZodInputSchema(inputsToUse);
|
|
214
|
-
const toolName = action.destination.tool;
|
|
215
|
-
return {
|
|
216
|
-
name: sanitizeMcpName(toolName),
|
|
217
|
-
description,
|
|
218
|
-
inputSchema
|
|
219
|
-
};
|
|
220
|
-
};
|
|
221
|
-
var extractEnumValues = (options) => {
|
|
222
|
-
if (!options) return void 0;
|
|
223
|
-
if (Array.isArray(options)) return options;
|
|
224
|
-
if (typeof options === "object") return Object.keys(options);
|
|
225
|
-
return void 0;
|
|
226
|
-
};
|
|
227
|
-
var sanitizeMcpName = (name) => {
|
|
228
|
-
return name.replace(/\s+/g, "_").replace(/:/g, "_").replace(/[^A-Za-z0-9_.-]/g, "_").replace(/^[^A-Za-z0-9]+|[^A-Za-z0-9]+$/g, "").replace(/_+/g, "_");
|
|
229
|
-
};
|
|
230
|
-
var convertJsonSchemaTypeToWarpType = (type, format) => {
|
|
231
|
-
if (format === "date-time" || format === "date") return "string";
|
|
232
|
-
if (type === "string") return "string";
|
|
233
|
-
if (type === "number") return "uint256";
|
|
234
|
-
if (type === "integer") return "uint256";
|
|
235
|
-
if (type === "boolean") return "bool";
|
|
236
|
-
if (type === "array") return "string";
|
|
237
|
-
if (type === "object") return "string";
|
|
238
|
-
return "string";
|
|
239
|
-
};
|
|
240
|
-
|
|
241
|
-
// src/server.ts
|
|
242
|
-
var import_mcp = require("@modelcontextprotocol/sdk/server/mcp");
|
|
243
|
-
var import_zod_compat = require("@modelcontextprotocol/sdk/server/zod-compat");
|
|
244
|
-
var processInputSchema = (inputSchema) => {
|
|
245
|
-
if (!inputSchema) return void 0;
|
|
246
|
-
if (inputSchema._zod) return inputSchema._zod;
|
|
247
|
-
return (0, import_zod_compat.normalizeObjectSchema)(inputSchema) || inputSchema;
|
|
248
|
-
};
|
|
249
|
-
var createMcpServerFromWarps = (config, warps, capabilities, executor) => {
|
|
250
|
-
const server = new import_mcp.McpServer({ name: config.name, version: config.version || "1.0.0" });
|
|
251
|
-
const defaultExecutor = config.executor || executor;
|
|
252
|
-
for (let i = 0; i < capabilities.length; i++) {
|
|
253
|
-
const { tools, resources } = capabilities[i];
|
|
254
|
-
const warp = warps[i];
|
|
255
|
-
tools?.forEach((tool) => {
|
|
256
|
-
const inputSchema = processInputSchema(tool.inputSchema);
|
|
257
|
-
server.registerTool(tool.name, { description: tool.description || "", inputSchema }, async (args) => {
|
|
258
|
-
if (defaultExecutor) {
|
|
259
|
-
const inputs = convertMcpArgsToWarpInputs(warp, args || {});
|
|
260
|
-
const result = await defaultExecutor(warp, inputs);
|
|
261
|
-
return result;
|
|
262
|
-
}
|
|
263
|
-
return { content: [{ type: "text", text: `Tool ${tool.name} executed successfully` }] };
|
|
264
|
-
});
|
|
265
|
-
});
|
|
266
|
-
resources?.forEach((resource) => {
|
|
267
|
-
server.registerResource(
|
|
268
|
-
resource.name || resource.uri,
|
|
269
|
-
resource.uri,
|
|
270
|
-
{ description: resource.description, mimeType: resource.mimeType },
|
|
271
|
-
async () => ({
|
|
272
|
-
contents: [{ uri: resource.uri, mimeType: resource.mimeType || "text/plain", text: "Resource content" }]
|
|
273
|
-
})
|
|
274
|
-
);
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
return server;
|
|
278
|
-
};
|
|
279
|
-
|
|
280
|
-
// src/WarpMcp.ts
|
|
281
|
-
var import_client = require("@modelcontextprotocol/sdk/client/index");
|
|
282
|
-
var import_streamableHttp = require("@modelcontextprotocol/sdk/client/streamableHttp");
|
|
283
|
-
var WarpMcp = class {
|
|
284
|
-
constructor(config) {
|
|
285
|
-
this.config = config;
|
|
286
|
-
}
|
|
287
|
-
async getWarpsFromTools(url, headers) {
|
|
288
|
-
const transport = new import_streamableHttp.StreamableHTTPClientTransport(new URL(url), {
|
|
289
|
-
requestInit: { headers: headers || {} }
|
|
290
|
-
});
|
|
291
|
-
const client = new import_client.Client({ name: "warps-mcp-client", version: "1.0.0" }, { capabilities: {} });
|
|
292
|
-
try {
|
|
293
|
-
await client.connect(transport);
|
|
294
|
-
const tools = await client.listTools();
|
|
295
|
-
await client.close();
|
|
296
|
-
return await Promise.all(tools.tools.map((tool) => convertMcpToolToWarp(this.config, tool, url, headers)));
|
|
297
|
-
} catch (error) {
|
|
298
|
-
await client.close().catch(() => {
|
|
299
|
-
});
|
|
300
|
-
throw error;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
};
|
|
304
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
305
|
-
0 && (module.exports = {
|
|
306
|
-
WarpMcp,
|
|
307
|
-
convertMcpArgsToWarpInputs,
|
|
308
|
-
convertMcpToolToWarp,
|
|
309
|
-
convertWarpToMcpCapabilities,
|
|
310
|
-
createMcpServerFromWarps
|
|
311
|
-
});
|
|
312
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
"use strict";var h=Object.defineProperty;var w=Object.getOwnPropertyDescriptor;var Z=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var j=(e,n)=>{for(var r in n)h(e,r,{get:n[r],enumerable:!0})},z=(e,n,r,i)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of Z(n))!$.call(e,t)&&t!==r&&h(e,t,{get:()=>n[t],enumerable:!(i=w(n,t))||i.enumerable});return e};var P=e=>z(h({},"__esModule",{value:!0}),e);var U={};j(U,{WarpMcp:()=>b,convertMcpArgsToWarpInputs:()=>T,convertMcpToolToWarp:()=>A,convertWarpToMcpCapabilities:()=>R,createMcpServerFromWarps:()=>k});module.exports=P(U);var l=require("@vleap/warps"),T=(e,n)=>{let{action:r}=(0,l.getWarpPrimaryAction)(e);if(!r.inputs)return[];let i=new l.WarpSerializer;return r.inputs.map(t=>{let o=t.as||t.name,s=n[o]??t.default??null;return s===null&&t.type==="bool"?i.nativeToString(t.type,!1):i.nativeToString(t.type,s)})};var d=require("@vleap/warps"),m=require("zod"),A=async(e,n,r,i)=>{let t=[];if(n.inputSchema?.properties){let a=n.inputSchema.properties,u=n.inputSchema.required||[];Object.entries(a).forEach(([p,c])=>{let g=u.includes(p),y=q(c.type,c.format),W={name:p,label:c.title||{en:p},description:c.description?{en:c.description.trim()}:null,type:y,position:`payload:${p}`,source:"field",required:g,default:c.default};t.push(W)})}let o={};n.outputSchema?.properties&&Object.keys(n.outputSchema.properties).forEach(a=>{o[a]=`out.${a}`});let s={type:"mcp",label:{en:n.name},description:n.description?{en:n.description.trim()}:null,destination:{url:r,tool:n.name,headers:i},inputs:t};return await new d.WarpBuilder(e).setName(n.name).setTitle({en:n.name}).setDescription(n.description?{en:n.description.trim()}:null).addAction(s).setOutput(Object.keys(o).length>0?o:null).build(!1)},R=e=>{let n=[],r=f(e.description),i;try{let{action:t}=(0,d.getWarpPrimaryAction)(e);i=t.inputs,console.log(`[MCP] Warp ${e.name} - primaryActionInputs:`,i?.length||0,i?.map(o=>({name:o.name,source:o.source,position:o.position})))}catch(t){console.log(`[MCP] Warp ${e.name} - failed to get primary action:`,t),i=void 0}return e.actions.forEach((t,o)=>{let s=f(t.description),a=r||s;if(t.type==="mcp"){let u=t;if(u.destination){let p=N(u,a,i);n.push(p)}}else{let u=E(e,t,a,o,i);n.push(u)}}),console.log(`[MCP] convertWarpToMcpCapabilities - warp: ${e.name}, tools: ${n.length}, tools with schema:`,n.filter(t=>t.inputSchema).length),{tools:n,resources:[]}},f=e=>{if(e){if(typeof e=="string")return e;if(typeof e=="object"&&"en"in e)return e.en}},O=e=>{let n,r=e.type.toLowerCase();r==="string"||r==="address"||r==="hex"?n=m.z.string():r==="number"||r==="uint8"||r==="uint16"||r==="uint32"||r==="uint64"||r==="uint128"||r==="uint256"?n=m.z.number():r==="bool"||r==="boolean"?n=m.z.boolean():r==="biguint"?n=m.z.string():n=m.z.string(),typeof e.min=="number"&&n instanceof m.z.ZodNumber&&(n=n.min(e.min)),typeof e.max=="number"&&n instanceof m.z.ZodNumber&&(n=n.max(e.max)),e.pattern&&n instanceof m.z.ZodString&&(n=n.regex(new RegExp(e.pattern)));let i=_(e.options);if(i&&i.length>0){if(n instanceof m.z.ZodString)n=m.z.enum(i);else if(n instanceof m.z.ZodNumber){let u=i.map(p=>Number(p)).filter(p=>!isNaN(p));u.length>0&&(n=n.refine(p=>u.includes(p),{message:`Value must be one of: ${u.join(", ")}`}))}}let t=[],o=f(e.description);o&&t.push(o),e.bot&&t.push(e.bot),t.push(`Type: ${e.type}`),t.push(e.required?"Required":"Optional"),i&&i.length>0&&t.push(`Options: ${i.join(", ")}`);let s=f(e.patternDescription);s&&t.push(s);let a=t.join(". ");return a&&(n=n.describe(a)),e.required!==!0&&(n=n.optional()),n},x=e=>{let n={};for(let r of e){if(r.source==="hidden"||r.source!=="field")continue;let i=r.as||r.name;n[i]=O(r)}return console.log("[MCP] buildZodInputSchema - inputs:",e.length,"shape keys:",Object.keys(n)),Object.keys(n).length>0?n:void 0},E=(e,n,r,i,t)=>{let o=t||n.inputs||[],s=x(o),a=C(`${e.name}_${i}`);return console.log(`[MCP] convertActionToTool - tool: ${a}, inputsToUse: ${o.length}, inputSchema keys:`,s?Object.keys(s):"undefined"),{name:a,description:r,inputSchema:s}},N=(e,n,r)=>{let i=r||e.inputs||[],t=x(i),o=e.destination.tool;return{name:C(o),description:n,inputSchema:t}},_=e=>{if(e){if(Array.isArray(e))return e;if(typeof e=="object")return Object.keys(e)}},C=e=>e.replace(/\s+/g,"_").replace(/:/g,"_").replace(/[^A-Za-z0-9_.-]/g,"_").replace(/^[^A-Za-z0-9]+|[^A-Za-z0-9]+$/g,"").replace(/_+/g,"_"),q=(e,n)=>n==="date-time"||n==="date"||e==="string"?"string":e==="number"||e==="integer"?"uint256":e==="boolean"?"bool":"string";var S=require("@modelcontextprotocol/sdk/server/mcp"),M=require("@modelcontextprotocol/sdk/server/zod-compat");var D=e=>{if(e)return e._zod?e._zod:(0,M.normalizeObjectSchema)(e)||e},k=(e,n,r,i)=>{let t=new S.McpServer({name:e.name,version:e.version||"1.0.0"}),o=e.executor||i;for(let s=0;s<r.length;s++){let{tools:a,resources:u}=r[s],p=n[s];a?.forEach(c=>{let g=D(c.inputSchema);t.registerTool(c.name,{description:c.description||"",inputSchema:g},async y=>{if(o){let W=T(p,y||{});return await o(p,W)}return{content:[{type:"text",text:`Tool ${c.name} executed successfully`}]}})}),u?.forEach(c=>{t.registerResource(c.name||c.uri,c.uri,{description:c.description,mimeType:c.mimeType},async()=>({contents:[{uri:c.uri,mimeType:c.mimeType||"text/plain",text:"Resource content"}]}))})}return t};var I=require("@modelcontextprotocol/sdk/client/index"),v=require("@modelcontextprotocol/sdk/client/streamableHttp");var b=class{constructor(n){this.config=n}async getWarpsFromTools(n,r){let i=new v.StreamableHTTPClientTransport(new URL(n),{requestInit:{headers:r||{}}}),t=new I.Client({name:"warps-mcp-client",version:"1.0.0"},{capabilities:{}});try{await t.connect(i);let o=await t.listTools();return await t.close(),await Promise.all(o.tools.map(s=>A(this.config,s,n,r)))}catch(o){throw await t.close().catch(()=>{}),o}}};0&&(module.exports={WarpMcp,convertMcpArgsToWarpInputs,convertMcpToolToWarp,convertWarpToMcpCapabilities,createMcpServerFromWarps});
|
package/dist/index.mjs
CHANGED
|
@@ -1,284 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { getWarpPrimaryAction, WarpSerializer } from "@vleap/warps";
|
|
3
|
-
var convertMcpArgsToWarpInputs = (warp, args) => {
|
|
4
|
-
const { action } = getWarpPrimaryAction(warp);
|
|
5
|
-
if (!action.inputs) return [];
|
|
6
|
-
const serializer = new WarpSerializer();
|
|
7
|
-
return action.inputs.map((input) => {
|
|
8
|
-
const key = input.as || input.name;
|
|
9
|
-
const value = args[key] ?? input.default ?? null;
|
|
10
|
-
if (value === null && input.type === "bool") {
|
|
11
|
-
return serializer.nativeToString(input.type, false);
|
|
12
|
-
}
|
|
13
|
-
return serializer.nativeToString(input.type, value);
|
|
14
|
-
});
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
// src/helpers/warps.ts
|
|
18
|
-
import {
|
|
19
|
-
WarpBuilder,
|
|
20
|
-
getWarpPrimaryAction as getWarpPrimaryAction2
|
|
21
|
-
} from "@vleap/warps";
|
|
22
|
-
import { z } from "zod";
|
|
23
|
-
var convertMcpToolToWarp = async (config, tool, url, headers) => {
|
|
24
|
-
const inputs = [];
|
|
25
|
-
if (tool.inputSchema?.properties) {
|
|
26
|
-
const properties = tool.inputSchema.properties;
|
|
27
|
-
const required = tool.inputSchema.required || [];
|
|
28
|
-
Object.entries(properties).forEach(([key, value]) => {
|
|
29
|
-
const isRequired = required.includes(key);
|
|
30
|
-
const inputType = convertJsonSchemaTypeToWarpType(value.type, value.format);
|
|
31
|
-
const inputDef = {
|
|
32
|
-
name: key,
|
|
33
|
-
label: value.title || { en: key },
|
|
34
|
-
description: value.description ? { en: value.description.trim() } : null,
|
|
35
|
-
type: inputType,
|
|
36
|
-
position: `payload:${key}`,
|
|
37
|
-
source: "field",
|
|
38
|
-
required: isRequired,
|
|
39
|
-
default: value.default
|
|
40
|
-
};
|
|
41
|
-
inputs.push(inputDef);
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
const output = {};
|
|
45
|
-
if (tool.outputSchema?.properties) {
|
|
46
|
-
Object.keys(tool.outputSchema.properties).forEach((key) => {
|
|
47
|
-
output[key] = `out.${key}`;
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
const mcpAction = {
|
|
51
|
-
type: "mcp",
|
|
52
|
-
label: { en: tool.name },
|
|
53
|
-
description: tool.description ? { en: tool.description.trim() } : null,
|
|
54
|
-
destination: { url, tool: tool.name, headers },
|
|
55
|
-
inputs
|
|
56
|
-
};
|
|
57
|
-
return await new WarpBuilder(config).setName(tool.name).setTitle({ en: tool.name }).setDescription(tool.description ? { en: tool.description.trim() } : null).addAction(mcpAction).setOutput(Object.keys(output).length > 0 ? output : null).build(false);
|
|
58
|
-
};
|
|
59
|
-
var convertWarpToMcpCapabilities = (warp) => {
|
|
60
|
-
const tools = [];
|
|
61
|
-
const warpDescription = extractText(warp.description);
|
|
62
|
-
let primaryActionInputs;
|
|
63
|
-
try {
|
|
64
|
-
const { action: primaryAction } = getWarpPrimaryAction2(warp);
|
|
65
|
-
primaryActionInputs = primaryAction.inputs;
|
|
66
|
-
console.log(`[MCP] Warp ${warp.name} - primaryActionInputs:`, primaryActionInputs?.length || 0, primaryActionInputs?.map((i) => ({ name: i.name, source: i.source, position: i.position })));
|
|
67
|
-
} catch (error) {
|
|
68
|
-
console.log(`[MCP] Warp ${warp.name} - failed to get primary action:`, error);
|
|
69
|
-
primaryActionInputs = void 0;
|
|
70
|
-
}
|
|
71
|
-
warp.actions.forEach((action, index) => {
|
|
72
|
-
const actionDescription = extractText(action.description);
|
|
73
|
-
const description = warpDescription || actionDescription;
|
|
74
|
-
if (action.type === "mcp") {
|
|
75
|
-
const mcpAction = action;
|
|
76
|
-
if (mcpAction.destination) {
|
|
77
|
-
const tool = convertMcpActionToTool(mcpAction, description, primaryActionInputs);
|
|
78
|
-
tools.push(tool);
|
|
79
|
-
}
|
|
80
|
-
} else {
|
|
81
|
-
const tool = convertActionToTool(warp, action, description, index, primaryActionInputs);
|
|
82
|
-
tools.push(tool);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
console.log(`[MCP] convertWarpToMcpCapabilities - warp: ${warp.name}, tools: ${tools.length}, tools with schema:`, tools.filter((t) => t.inputSchema).length);
|
|
86
|
-
return { tools, resources: [] };
|
|
87
|
-
};
|
|
88
|
-
var extractText = (text) => {
|
|
89
|
-
if (!text) return void 0;
|
|
90
|
-
if (typeof text === "string") return text;
|
|
91
|
-
if (typeof text === "object" && "en" in text) return text.en;
|
|
92
|
-
return void 0;
|
|
93
|
-
};
|
|
94
|
-
var buildZodSchemaFromInput = (input) => {
|
|
95
|
-
let schema;
|
|
96
|
-
const inputType = input.type.toLowerCase();
|
|
97
|
-
if (inputType === "string" || inputType === "address" || inputType === "hex") {
|
|
98
|
-
schema = z.string();
|
|
99
|
-
} else if (inputType === "number" || inputType === "uint8" || inputType === "uint16" || inputType === "uint32" || inputType === "uint64" || inputType === "uint128" || inputType === "uint256") {
|
|
100
|
-
schema = z.number();
|
|
101
|
-
} else if (inputType === "bool" || inputType === "boolean") {
|
|
102
|
-
schema = z.boolean();
|
|
103
|
-
} else if (inputType === "biguint") {
|
|
104
|
-
schema = z.string();
|
|
105
|
-
} else {
|
|
106
|
-
schema = z.string();
|
|
107
|
-
}
|
|
108
|
-
if (typeof input.min === "number") {
|
|
109
|
-
if (schema instanceof z.ZodNumber) {
|
|
110
|
-
schema = schema.min(input.min);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
if (typeof input.max === "number") {
|
|
114
|
-
if (schema instanceof z.ZodNumber) {
|
|
115
|
-
schema = schema.max(input.max);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (input.pattern) {
|
|
119
|
-
if (schema instanceof z.ZodString) {
|
|
120
|
-
schema = schema.regex(new RegExp(input.pattern));
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
const enumValues = extractEnumValues(input.options);
|
|
124
|
-
if (enumValues && enumValues.length > 0) {
|
|
125
|
-
if (schema instanceof z.ZodString) {
|
|
126
|
-
schema = z.enum(enumValues);
|
|
127
|
-
} else if (schema instanceof z.ZodNumber) {
|
|
128
|
-
const numberValues = enumValues.map((v) => Number(v)).filter((v) => !isNaN(v));
|
|
129
|
-
if (numberValues.length > 0) {
|
|
130
|
-
schema = schema.refine((val) => numberValues.includes(val), {
|
|
131
|
-
message: `Value must be one of: ${numberValues.join(", ")}`
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
const descriptionParts = [];
|
|
137
|
-
const inputDescription = extractText(input.description);
|
|
138
|
-
if (inputDescription) {
|
|
139
|
-
descriptionParts.push(inputDescription);
|
|
140
|
-
}
|
|
141
|
-
if (input.bot) {
|
|
142
|
-
descriptionParts.push(input.bot);
|
|
143
|
-
}
|
|
144
|
-
descriptionParts.push(`Type: ${input.type}`);
|
|
145
|
-
descriptionParts.push(input.required ? "Required" : "Optional");
|
|
146
|
-
if (enumValues && enumValues.length > 0) {
|
|
147
|
-
descriptionParts.push(`Options: ${enumValues.join(", ")}`);
|
|
148
|
-
}
|
|
149
|
-
const patternDesc = extractText(input.patternDescription);
|
|
150
|
-
if (patternDesc) {
|
|
151
|
-
descriptionParts.push(patternDesc);
|
|
152
|
-
}
|
|
153
|
-
const fullDescription = descriptionParts.join(". ");
|
|
154
|
-
if (fullDescription) {
|
|
155
|
-
schema = schema.describe(fullDescription);
|
|
156
|
-
}
|
|
157
|
-
if (input.required !== true) {
|
|
158
|
-
schema = schema.optional();
|
|
159
|
-
}
|
|
160
|
-
return schema;
|
|
161
|
-
};
|
|
162
|
-
var buildZodInputSchema = (inputs) => {
|
|
163
|
-
const shape = {};
|
|
164
|
-
for (const input of inputs) {
|
|
165
|
-
if (input.source === "hidden") continue;
|
|
166
|
-
if (input.source !== "field") continue;
|
|
167
|
-
const key = input.as || input.name;
|
|
168
|
-
shape[key] = buildZodSchemaFromInput(input);
|
|
169
|
-
}
|
|
170
|
-
console.log("[MCP] buildZodInputSchema - inputs:", inputs.length, "shape keys:", Object.keys(shape));
|
|
171
|
-
return Object.keys(shape).length > 0 ? shape : void 0;
|
|
172
|
-
};
|
|
173
|
-
var convertActionToTool = (warp, action, description, index, primaryActionInputs) => {
|
|
174
|
-
const inputsToUse = primaryActionInputs || action.inputs || [];
|
|
175
|
-
const inputSchema = buildZodInputSchema(inputsToUse);
|
|
176
|
-
const name = sanitizeMcpName(`${warp.name}_${index}`);
|
|
177
|
-
console.log(`[MCP] convertActionToTool - tool: ${name}, inputsToUse: ${inputsToUse.length}, inputSchema keys:`, inputSchema ? Object.keys(inputSchema) : "undefined");
|
|
178
|
-
return {
|
|
179
|
-
name,
|
|
180
|
-
description,
|
|
181
|
-
inputSchema
|
|
182
|
-
};
|
|
183
|
-
};
|
|
184
|
-
var convertMcpActionToTool = (action, description, primaryActionInputs) => {
|
|
185
|
-
const inputsToUse = primaryActionInputs || action.inputs || [];
|
|
186
|
-
const inputSchema = buildZodInputSchema(inputsToUse);
|
|
187
|
-
const toolName = action.destination.tool;
|
|
188
|
-
return {
|
|
189
|
-
name: sanitizeMcpName(toolName),
|
|
190
|
-
description,
|
|
191
|
-
inputSchema
|
|
192
|
-
};
|
|
193
|
-
};
|
|
194
|
-
var extractEnumValues = (options) => {
|
|
195
|
-
if (!options) return void 0;
|
|
196
|
-
if (Array.isArray(options)) return options;
|
|
197
|
-
if (typeof options === "object") return Object.keys(options);
|
|
198
|
-
return void 0;
|
|
199
|
-
};
|
|
200
|
-
var sanitizeMcpName = (name) => {
|
|
201
|
-
return name.replace(/\s+/g, "_").replace(/:/g, "_").replace(/[^A-Za-z0-9_.-]/g, "_").replace(/^[^A-Za-z0-9]+|[^A-Za-z0-9]+$/g, "").replace(/_+/g, "_");
|
|
202
|
-
};
|
|
203
|
-
var convertJsonSchemaTypeToWarpType = (type, format) => {
|
|
204
|
-
if (format === "date-time" || format === "date") return "string";
|
|
205
|
-
if (type === "string") return "string";
|
|
206
|
-
if (type === "number") return "uint256";
|
|
207
|
-
if (type === "integer") return "uint256";
|
|
208
|
-
if (type === "boolean") return "bool";
|
|
209
|
-
if (type === "array") return "string";
|
|
210
|
-
if (type === "object") return "string";
|
|
211
|
-
return "string";
|
|
212
|
-
};
|
|
213
|
-
|
|
214
|
-
// src/server.ts
|
|
215
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp";
|
|
216
|
-
import { normalizeObjectSchema } from "@modelcontextprotocol/sdk/server/zod-compat";
|
|
217
|
-
var processInputSchema = (inputSchema) => {
|
|
218
|
-
if (!inputSchema) return void 0;
|
|
219
|
-
if (inputSchema._zod) return inputSchema._zod;
|
|
220
|
-
return normalizeObjectSchema(inputSchema) || inputSchema;
|
|
221
|
-
};
|
|
222
|
-
var createMcpServerFromWarps = (config, warps, capabilities, executor) => {
|
|
223
|
-
const server = new McpServer({ name: config.name, version: config.version || "1.0.0" });
|
|
224
|
-
const defaultExecutor = config.executor || executor;
|
|
225
|
-
for (let i = 0; i < capabilities.length; i++) {
|
|
226
|
-
const { tools, resources } = capabilities[i];
|
|
227
|
-
const warp = warps[i];
|
|
228
|
-
tools?.forEach((tool) => {
|
|
229
|
-
const inputSchema = processInputSchema(tool.inputSchema);
|
|
230
|
-
server.registerTool(tool.name, { description: tool.description || "", inputSchema }, async (args) => {
|
|
231
|
-
if (defaultExecutor) {
|
|
232
|
-
const inputs = convertMcpArgsToWarpInputs(warp, args || {});
|
|
233
|
-
const result = await defaultExecutor(warp, inputs);
|
|
234
|
-
return result;
|
|
235
|
-
}
|
|
236
|
-
return { content: [{ type: "text", text: `Tool ${tool.name} executed successfully` }] };
|
|
237
|
-
});
|
|
238
|
-
});
|
|
239
|
-
resources?.forEach((resource) => {
|
|
240
|
-
server.registerResource(
|
|
241
|
-
resource.name || resource.uri,
|
|
242
|
-
resource.uri,
|
|
243
|
-
{ description: resource.description, mimeType: resource.mimeType },
|
|
244
|
-
async () => ({
|
|
245
|
-
contents: [{ uri: resource.uri, mimeType: resource.mimeType || "text/plain", text: "Resource content" }]
|
|
246
|
-
})
|
|
247
|
-
);
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
return server;
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
// src/WarpMcp.ts
|
|
254
|
-
import { Client } from "@modelcontextprotocol/sdk/client/index";
|
|
255
|
-
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp";
|
|
256
|
-
var WarpMcp = class {
|
|
257
|
-
constructor(config) {
|
|
258
|
-
this.config = config;
|
|
259
|
-
}
|
|
260
|
-
async getWarpsFromTools(url, headers) {
|
|
261
|
-
const transport = new StreamableHTTPClientTransport(new URL(url), {
|
|
262
|
-
requestInit: { headers: headers || {} }
|
|
263
|
-
});
|
|
264
|
-
const client = new Client({ name: "warps-mcp-client", version: "1.0.0" }, { capabilities: {} });
|
|
265
|
-
try {
|
|
266
|
-
await client.connect(transport);
|
|
267
|
-
const tools = await client.listTools();
|
|
268
|
-
await client.close();
|
|
269
|
-
return await Promise.all(tools.tools.map((tool) => convertMcpToolToWarp(this.config, tool, url, headers)));
|
|
270
|
-
} catch (error) {
|
|
271
|
-
await client.close().catch(() => {
|
|
272
|
-
});
|
|
273
|
-
throw error;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
};
|
|
277
|
-
export {
|
|
278
|
-
WarpMcp,
|
|
279
|
-
convertMcpArgsToWarpInputs,
|
|
280
|
-
convertMcpToolToWarp,
|
|
281
|
-
convertWarpToMcpCapabilities,
|
|
282
|
-
createMcpServerFromWarps
|
|
283
|
-
};
|
|
284
|
-
//# sourceMappingURL=index.mjs.map
|
|
1
|
+
import{getWarpPrimaryAction as b,WarpSerializer as x}from"@vleap/warps";var y=(e,n)=>{let{action:r}=b(e);if(!r.inputs)return[];let i=new x;return r.inputs.map(t=>{let o=t.as||t.name,s=n[o]??t.default??null;return s===null&&t.type==="bool"?i.nativeToString(t.type,!1):i.nativeToString(t.type,s)})};import{WarpBuilder as C,getWarpPrimaryAction as S}from"@vleap/warps";import{z as m}from"zod";var W=async(e,n,r,i)=>{let t=[];if(n.inputSchema?.properties){let a=n.inputSchema.properties,u=n.inputSchema.required||[];Object.entries(a).forEach(([p,c])=>{let f=u.includes(p),d=Z(c.type,c.format),g={name:p,label:c.title||{en:p},description:c.description?{en:c.description.trim()}:null,type:d,position:`payload:${p}`,source:"field",required:f,default:c.default};t.push(g)})}let o={};n.outputSchema?.properties&&Object.keys(n.outputSchema.properties).forEach(a=>{o[a]=`out.${a}`});let s={type:"mcp",label:{en:n.name},description:n.description?{en:n.description.trim()}:null,destination:{url:r,tool:n.name,headers:i},inputs:t};return await new C(e).setName(n.name).setTitle({en:n.name}).setDescription(n.description?{en:n.description.trim()}:null).addAction(s).setOutput(Object.keys(o).length>0?o:null).build(!1)},X=e=>{let n=[],r=l(e.description),i;try{let{action:t}=S(e);i=t.inputs,console.log(`[MCP] Warp ${e.name} - primaryActionInputs:`,i?.length||0,i?.map(o=>({name:o.name,source:o.source,position:o.position})))}catch(t){console.log(`[MCP] Warp ${e.name} - failed to get primary action:`,t),i=void 0}return e.actions.forEach((t,o)=>{let s=l(t.description),a=r||s;if(t.type==="mcp"){let u=t;if(u.destination){let p=v(u,a,i);n.push(p)}}else{let u=I(e,t,a,o,i);n.push(u)}}),console.log(`[MCP] convertWarpToMcpCapabilities - warp: ${e.name}, tools: ${n.length}, tools with schema:`,n.filter(t=>t.inputSchema).length),{tools:n,resources:[]}},l=e=>{if(e){if(typeof e=="string")return e;if(typeof e=="object"&&"en"in e)return e.en}},M=e=>{let n,r=e.type.toLowerCase();r==="string"||r==="address"||r==="hex"?n=m.string():r==="number"||r==="uint8"||r==="uint16"||r==="uint32"||r==="uint64"||r==="uint128"||r==="uint256"?n=m.number():r==="bool"||r==="boolean"?n=m.boolean():r==="biguint"?n=m.string():n=m.string(),typeof e.min=="number"&&n instanceof m.ZodNumber&&(n=n.min(e.min)),typeof e.max=="number"&&n instanceof m.ZodNumber&&(n=n.max(e.max)),e.pattern&&n instanceof m.ZodString&&(n=n.regex(new RegExp(e.pattern)));let i=w(e.options);if(i&&i.length>0){if(n instanceof m.ZodString)n=m.enum(i);else if(n instanceof m.ZodNumber){let u=i.map(p=>Number(p)).filter(p=>!isNaN(p));u.length>0&&(n=n.refine(p=>u.includes(p),{message:`Value must be one of: ${u.join(", ")}`}))}}let t=[],o=l(e.description);o&&t.push(o),e.bot&&t.push(e.bot),t.push(`Type: ${e.type}`),t.push(e.required?"Required":"Optional"),i&&i.length>0&&t.push(`Options: ${i.join(", ")}`);let s=l(e.patternDescription);s&&t.push(s);let a=t.join(". ");return a&&(n=n.describe(a)),e.required!==!0&&(n=n.optional()),n},h=e=>{let n={};for(let r of e){if(r.source==="hidden"||r.source!=="field")continue;let i=r.as||r.name;n[i]=M(r)}return console.log("[MCP] buildZodInputSchema - inputs:",e.length,"shape keys:",Object.keys(n)),Object.keys(n).length>0?n:void 0},I=(e,n,r,i,t)=>{let o=t||n.inputs||[],s=h(o),a=T(`${e.name}_${i}`);return console.log(`[MCP] convertActionToTool - tool: ${a}, inputsToUse: ${o.length}, inputSchema keys:`,s?Object.keys(s):"undefined"),{name:a,description:r,inputSchema:s}},v=(e,n,r)=>{let i=r||e.inputs||[],t=h(i),o=e.destination.tool;return{name:T(o),description:n,inputSchema:t}},w=e=>{if(e){if(Array.isArray(e))return e;if(typeof e=="object")return Object.keys(e)}},T=e=>e.replace(/\s+/g,"_").replace(/:/g,"_").replace(/[^A-Za-z0-9_.-]/g,"_").replace(/^[^A-Za-z0-9]+|[^A-Za-z0-9]+$/g,"").replace(/_+/g,"_"),Z=(e,n)=>n==="date-time"||n==="date"||e==="string"?"string":e==="number"||e==="integer"?"uint256":e==="boolean"?"bool":"string";import{McpServer as $}from"@modelcontextprotocol/sdk/server/mcp";import{normalizeObjectSchema as j}from"@modelcontextprotocol/sdk/server/zod-compat";var z=e=>{if(e)return e._zod?e._zod:j(e)||e},se=(e,n,r,i)=>{let t=new $({name:e.name,version:e.version||"1.0.0"}),o=e.executor||i;for(let s=0;s<r.length;s++){let{tools:a,resources:u}=r[s],p=n[s];a?.forEach(c=>{let f=z(c.inputSchema);t.registerTool(c.name,{description:c.description||"",inputSchema:f},async d=>{if(o){let g=y(p,d||{});return await o(p,g)}return{content:[{type:"text",text:`Tool ${c.name} executed successfully`}]}})}),u?.forEach(c=>{t.registerResource(c.name||c.uri,c.uri,{description:c.description,mimeType:c.mimeType},async()=>({contents:[{uri:c.uri,mimeType:c.mimeType||"text/plain",text:"Resource content"}]}))})}return t};import{Client as P}from"@modelcontextprotocol/sdk/client/index";import{StreamableHTTPClientTransport as R}from"@modelcontextprotocol/sdk/client/streamableHttp";var A=class{constructor(n){this.config=n}async getWarpsFromTools(n,r){let i=new R(new URL(n),{requestInit:{headers:r||{}}}),t=new P({name:"warps-mcp-client",version:"1.0.0"},{capabilities:{}});try{await t.connect(i);let o=await t.listTools();return await t.close(),await Promise.all(o.tools.map(s=>W(this.config,s,n,r)))}catch(o){throw await t.close().catch(()=>{}),o}}};export{A as WarpMcp,y as convertMcpArgsToWarpInputs,W as convertMcpToolToWarp,X as convertWarpToMcpCapabilities,se as createMcpServerFromWarps};
|
package/package.json
CHANGED
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/helpers/execution.ts","../src/helpers/warps.ts","../src/server.ts","../src/WarpMcp.ts"],"sourcesContent":["export * from './helpers/index'\nexport * from './server'\nexport * from './types'\nexport * from './WarpMcp'\n","import { getWarpPrimaryAction, Warp, WarpActionInput, WarpSerializer } from '@vleap/warps'\n\nexport const convertMcpArgsToWarpInputs = (warp: Warp, args: Record<string, any>): string[] => {\n const { action } = getWarpPrimaryAction(warp)\n if (!action.inputs) return []\n\n const serializer = new WarpSerializer()\n return action.inputs.map((input: WarpActionInput) => {\n const key = input.as || input.name\n const value = args[key] ?? input.default ?? null\n\n if (value === null && input.type === 'bool') {\n return serializer.nativeToString(input.type, false)\n }\n\n return serializer.nativeToString(input.type, value)\n })\n}\n","import {\n Warp,\n WarpActionInput,\n WarpActionInputType,\n WarpBuilder,\n WarpClientConfig,\n WarpCollectAction,\n WarpContractAction,\n WarpMcpAction,\n WarpQueryAction,\n WarpText,\n WarpTransferAction,\n getWarpPrimaryAction,\n} from '@vleap/warps'\nimport { z } from 'zod'\n\nexport const convertMcpToolToWarp = async (\n config: WarpClientConfig,\n tool: { name: string; description?: string; inputSchema?: any; outputSchema?: any },\n url: string,\n headers?: Record<string, string>\n): Promise<Warp> => {\n const inputs: WarpActionInput[] = []\n\n if (tool.inputSchema?.properties) {\n const properties = tool.inputSchema.properties\n const required = tool.inputSchema.required || []\n\n Object.entries(properties).forEach(([key, value]: [string, any]) => {\n const isRequired = required.includes(key)\n const inputType = convertJsonSchemaTypeToWarpType(value.type, value.format)\n\n const inputDef: WarpActionInput = {\n name: key,\n label: value.title || { en: key },\n description: value.description ? { en: value.description.trim() } : null,\n type: inputType,\n position: `payload:${key}`,\n source: 'field',\n required: isRequired,\n default: value.default,\n }\n\n inputs.push(inputDef)\n })\n }\n\n const output: Record<string, string> = {}\n if (tool.outputSchema?.properties) {\n Object.keys(tool.outputSchema.properties).forEach((key) => {\n output[key] = `out.${key}`\n })\n }\n\n const mcpAction: WarpMcpAction = {\n type: 'mcp',\n label: { en: tool.name },\n description: tool.description ? { en: tool.description.trim() } : null,\n destination: { url, tool: tool.name, headers },\n inputs,\n }\n\n return await new WarpBuilder(config)\n .setName(tool.name)\n .setTitle({ en: tool.name })\n .setDescription(tool.description ? { en: tool.description.trim() } : null)\n .addAction(mcpAction)\n .setOutput(Object.keys(output).length > 0 ? output : null)\n .build(false)\n}\n\nexport const convertWarpToMcpCapabilities = (warp: Warp): { tools: any[]; resources?: any[] } => {\n const tools: any[] = []\n const warpDescription = extractText(warp.description)\n\n let primaryActionInputs: WarpActionInput[] | undefined\n try {\n const { action: primaryAction } = getWarpPrimaryAction(warp)\n primaryActionInputs = primaryAction.inputs\n console.log(`[MCP] Warp ${warp.name} - primaryActionInputs:`, primaryActionInputs?.length || 0, primaryActionInputs?.map(i => ({ name: i.name, source: i.source, position: i.position })))\n } catch (error) {\n console.log(`[MCP] Warp ${warp.name} - failed to get primary action:`, error)\n primaryActionInputs = undefined\n }\n\n warp.actions.forEach((action, index) => {\n const actionDescription = extractText(action.description)\n const description = warpDescription || actionDescription\n\n if (action.type === 'mcp') {\n const mcpAction = action as WarpMcpAction\n if (mcpAction.destination) {\n const tool = convertMcpActionToTool(mcpAction, description, primaryActionInputs)\n tools.push(tool)\n }\n } else {\n const tool = convertActionToTool(warp, action, description, index, primaryActionInputs)\n tools.push(tool)\n }\n })\n\n console.log(`[MCP] convertWarpToMcpCapabilities - warp: ${warp.name}, tools: ${tools.length}, tools with schema:`, tools.filter(t => t.inputSchema).length)\n return { tools, resources: [] }\n}\n\nconst extractText = (text: WarpText | null | undefined): string | undefined => {\n if (!text) return undefined\n if (typeof text === 'string') return text\n if (typeof text === 'object' && 'en' in text) return text.en\n return undefined\n}\n\nconst buildZodSchemaFromInput = (input: WarpActionInput): z.ZodTypeAny => {\n let schema: z.ZodTypeAny\n\n const inputType = input.type.toLowerCase()\n if (inputType === 'string' || inputType === 'address' || inputType === 'hex') {\n schema = z.string()\n } else if (\n inputType === 'number' ||\n inputType === 'uint8' ||\n inputType === 'uint16' ||\n inputType === 'uint32' ||\n inputType === 'uint64' ||\n inputType === 'uint128' ||\n inputType === 'uint256'\n ) {\n schema = z.number()\n } else if (inputType === 'bool' || inputType === 'boolean') {\n schema = z.boolean()\n } else if (inputType === 'biguint') {\n schema = z.string()\n } else {\n schema = z.string()\n }\n\n if (typeof input.min === 'number') {\n if (schema instanceof z.ZodNumber) {\n schema = schema.min(input.min)\n }\n }\n\n if (typeof input.max === 'number') {\n if (schema instanceof z.ZodNumber) {\n schema = schema.max(input.max)\n }\n }\n\n if (input.pattern) {\n if (schema instanceof z.ZodString) {\n schema = schema.regex(new RegExp(input.pattern))\n }\n }\n\n const enumValues = extractEnumValues(input.options)\n if (enumValues && enumValues.length > 0) {\n if (schema instanceof z.ZodString) {\n schema = z.enum(enumValues as [string, ...string[]])\n } else if (schema instanceof z.ZodNumber) {\n const numberValues = enumValues.map((v) => Number(v)).filter((v) => !isNaN(v))\n if (numberValues.length > 0) {\n schema = schema.refine((val) => numberValues.includes(val), {\n message: `Value must be one of: ${numberValues.join(', ')}`,\n })\n }\n }\n }\n\n const descriptionParts: string[] = []\n const inputDescription = extractText(input.description)\n if (inputDescription) {\n descriptionParts.push(inputDescription)\n }\n\n if (input.bot) {\n descriptionParts.push(input.bot)\n }\n\n descriptionParts.push(`Type: ${input.type}`)\n descriptionParts.push(input.required ? 'Required' : 'Optional')\n\n if (enumValues && enumValues.length > 0) {\n descriptionParts.push(`Options: ${enumValues.join(', ')}`)\n }\n\n const patternDesc = extractText(input.patternDescription)\n if (patternDesc) {\n descriptionParts.push(patternDesc)\n }\n\n const fullDescription = descriptionParts.join('. ')\n if (fullDescription) {\n schema = schema.describe(fullDescription)\n }\n\n if (input.required !== true) {\n schema = schema.optional()\n }\n\n return schema\n}\n\nconst buildZodInputSchema = (inputs: WarpActionInput[]): Record<string, z.ZodTypeAny> | undefined => {\n const shape: Record<string, z.ZodTypeAny> = {}\n\n for (const input of inputs) {\n if (input.source === 'hidden') continue\n if (input.source !== 'field') continue\n\n const key = input.as || input.name\n shape[key] = buildZodSchemaFromInput(input)\n }\n\n console.log('[MCP] buildZodInputSchema - inputs:', inputs.length, 'shape keys:', Object.keys(shape))\n return Object.keys(shape).length > 0 ? shape : undefined\n}\n\nconst convertActionToTool = (\n warp: Warp,\n action: WarpTransferAction | WarpContractAction | WarpCollectAction | WarpQueryAction,\n description: string | undefined,\n index: number,\n primaryActionInputs?: WarpActionInput[]\n): any => {\n const inputsToUse = primaryActionInputs || action.inputs || []\n const inputSchema = buildZodInputSchema(inputsToUse)\n const name = sanitizeMcpName(`${warp.name}_${index}`)\n\n console.log(`[MCP] convertActionToTool - tool: ${name}, inputsToUse: ${inputsToUse.length}, inputSchema keys:`, inputSchema ? Object.keys(inputSchema) : 'undefined')\n\n return {\n name,\n description,\n inputSchema,\n }\n}\n\nconst convertMcpActionToTool = (action: WarpMcpAction, description: string | undefined, primaryActionInputs?: WarpActionInput[]): any => {\n const inputsToUse = primaryActionInputs || action.inputs || []\n const inputSchema = buildZodInputSchema(inputsToUse)\n const toolName = action.destination!.tool\n\n return {\n name: sanitizeMcpName(toolName),\n description,\n inputSchema,\n }\n}\n\n\nconst extractEnumValues = (options: string[] | { [key: string]: WarpText } | undefined): string[] | undefined => {\n if (!options) return undefined\n if (Array.isArray(options)) return options\n if (typeof options === 'object') return Object.keys(options)\n return undefined\n}\n\nconst sanitizeMcpName = (name: string): string => {\n return name\n .replace(/\\s+/g, '_')\n .replace(/:/g, '_')\n .replace(/[^A-Za-z0-9_.-]/g, '_')\n .replace(/^[^A-Za-z0-9]+|[^A-Za-z0-9]+$/g, '')\n .replace(/_+/g, '_')\n}\n\nconst convertJsonSchemaTypeToWarpType = (type: string, format?: string): WarpActionInputType => {\n if (format === 'date-time' || format === 'date') return 'string'\n if (type === 'string') return 'string'\n if (type === 'number') return 'uint256'\n if (type === 'integer') return 'uint256'\n if (type === 'boolean') return 'bool'\n if (type === 'array') return 'string'\n if (type === 'object') return 'string'\n return 'string'\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp'\nimport { normalizeObjectSchema } from '@modelcontextprotocol/sdk/server/zod-compat'\nimport { Warp } from '@vleap/warps'\nimport { convertMcpArgsToWarpInputs } from './helpers/execution'\nimport { McpCapabilities, McpServerConfig, WarpExecutor } from './types'\n\nconst processInputSchema = (inputSchema: any): any => {\n if (!inputSchema) return undefined\n if (inputSchema._zod) return inputSchema._zod\n return normalizeObjectSchema(inputSchema) || inputSchema\n}\n\nexport const createMcpServerFromWarps = (\n config: McpServerConfig,\n warps: Warp[],\n capabilities: McpCapabilities[],\n executor?: WarpExecutor\n): McpServer => {\n const server = new McpServer({ name: config.name, version: config.version || '1.0.0' })\n const defaultExecutor = config.executor || executor\n\n for (let i = 0; i < capabilities.length; i++) {\n const { tools, resources } = capabilities[i]\n const warp = warps[i]\n\n tools?.forEach((tool) => {\n const inputSchema = processInputSchema(tool.inputSchema)\n server.registerTool(tool.name, { description: tool.description || '', inputSchema }, async (args: any) => {\n if (defaultExecutor) {\n const inputs = convertMcpArgsToWarpInputs(warp, args || {})\n const result = await defaultExecutor(warp, inputs)\n return result\n }\n return { content: [{ type: 'text' as const, text: `Tool ${tool.name} executed successfully` }] }\n })\n })\n\n resources?.forEach((resource) => {\n server.registerResource(\n resource.name || resource.uri,\n resource.uri,\n { description: resource.description, mimeType: resource.mimeType },\n async () => ({\n contents: [{ uri: resource.uri, mimeType: resource.mimeType || 'text/plain', text: 'Resource content' }],\n })\n )\n })\n }\n\n return server\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp'\nimport { Warp, WarpClientConfig } from '@vleap/warps'\nimport { convertMcpToolToWarp } from './helpers/warps'\n\nexport class WarpMcp {\n constructor(private readonly config: WarpClientConfig) {}\n\n async getWarpsFromTools(url: string, headers?: Record<string, string>): Promise<Warp[]> {\n const transport = new StreamableHTTPClientTransport(new URL(url), {\n requestInit: { headers: headers || {} },\n })\n\n const client = new Client({ name: 'warps-mcp-client', version: '1.0.0' }, { capabilities: {} })\n\n try {\n await client.connect(transport)\n\n const tools = await client.listTools()\n\n await client.close()\n\n return await Promise.all(tools.tools.map((tool) => convertMcpToolToWarp(this.config, tool, url, headers)))\n } catch (error) {\n await client.close().catch(() => {})\n throw error\n }\n }\n}\n"],"mappings":"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","names":["import_warps"]}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helpers/execution.ts","../src/helpers/warps.ts","../src/server.ts","../src/WarpMcp.ts"],"sourcesContent":["import { getWarpPrimaryAction, Warp, WarpActionInput, WarpSerializer } from '@vleap/warps'\n\nexport const convertMcpArgsToWarpInputs = (warp: Warp, args: Record<string, any>): string[] => {\n const { action } = getWarpPrimaryAction(warp)\n if (!action.inputs) return []\n\n const serializer = new WarpSerializer()\n return action.inputs.map((input: WarpActionInput) => {\n const key = input.as || input.name\n const value = args[key] ?? input.default ?? null\n\n if (value === null && input.type === 'bool') {\n return serializer.nativeToString(input.type, false)\n }\n\n return serializer.nativeToString(input.type, value)\n })\n}\n","import {\n Warp,\n WarpActionInput,\n WarpActionInputType,\n WarpBuilder,\n WarpClientConfig,\n WarpCollectAction,\n WarpContractAction,\n WarpMcpAction,\n WarpQueryAction,\n WarpText,\n WarpTransferAction,\n getWarpPrimaryAction,\n} from '@vleap/warps'\nimport { z } from 'zod'\n\nexport const convertMcpToolToWarp = async (\n config: WarpClientConfig,\n tool: { name: string; description?: string; inputSchema?: any; outputSchema?: any },\n url: string,\n headers?: Record<string, string>\n): Promise<Warp> => {\n const inputs: WarpActionInput[] = []\n\n if (tool.inputSchema?.properties) {\n const properties = tool.inputSchema.properties\n const required = tool.inputSchema.required || []\n\n Object.entries(properties).forEach(([key, value]: [string, any]) => {\n const isRequired = required.includes(key)\n const inputType = convertJsonSchemaTypeToWarpType(value.type, value.format)\n\n const inputDef: WarpActionInput = {\n name: key,\n label: value.title || { en: key },\n description: value.description ? { en: value.description.trim() } : null,\n type: inputType,\n position: `payload:${key}`,\n source: 'field',\n required: isRequired,\n default: value.default,\n }\n\n inputs.push(inputDef)\n })\n }\n\n const output: Record<string, string> = {}\n if (tool.outputSchema?.properties) {\n Object.keys(tool.outputSchema.properties).forEach((key) => {\n output[key] = `out.${key}`\n })\n }\n\n const mcpAction: WarpMcpAction = {\n type: 'mcp',\n label: { en: tool.name },\n description: tool.description ? { en: tool.description.trim() } : null,\n destination: { url, tool: tool.name, headers },\n inputs,\n }\n\n return await new WarpBuilder(config)\n .setName(tool.name)\n .setTitle({ en: tool.name })\n .setDescription(tool.description ? { en: tool.description.trim() } : null)\n .addAction(mcpAction)\n .setOutput(Object.keys(output).length > 0 ? output : null)\n .build(false)\n}\n\nexport const convertWarpToMcpCapabilities = (warp: Warp): { tools: any[]; resources?: any[] } => {\n const tools: any[] = []\n const warpDescription = extractText(warp.description)\n\n let primaryActionInputs: WarpActionInput[] | undefined\n try {\n const { action: primaryAction } = getWarpPrimaryAction(warp)\n primaryActionInputs = primaryAction.inputs\n console.log(`[MCP] Warp ${warp.name} - primaryActionInputs:`, primaryActionInputs?.length || 0, primaryActionInputs?.map(i => ({ name: i.name, source: i.source, position: i.position })))\n } catch (error) {\n console.log(`[MCP] Warp ${warp.name} - failed to get primary action:`, error)\n primaryActionInputs = undefined\n }\n\n warp.actions.forEach((action, index) => {\n const actionDescription = extractText(action.description)\n const description = warpDescription || actionDescription\n\n if (action.type === 'mcp') {\n const mcpAction = action as WarpMcpAction\n if (mcpAction.destination) {\n const tool = convertMcpActionToTool(mcpAction, description, primaryActionInputs)\n tools.push(tool)\n }\n } else {\n const tool = convertActionToTool(warp, action, description, index, primaryActionInputs)\n tools.push(tool)\n }\n })\n\n console.log(`[MCP] convertWarpToMcpCapabilities - warp: ${warp.name}, tools: ${tools.length}, tools with schema:`, tools.filter(t => t.inputSchema).length)\n return { tools, resources: [] }\n}\n\nconst extractText = (text: WarpText | null | undefined): string | undefined => {\n if (!text) return undefined\n if (typeof text === 'string') return text\n if (typeof text === 'object' && 'en' in text) return text.en\n return undefined\n}\n\nconst buildZodSchemaFromInput = (input: WarpActionInput): z.ZodTypeAny => {\n let schema: z.ZodTypeAny\n\n const inputType = input.type.toLowerCase()\n if (inputType === 'string' || inputType === 'address' || inputType === 'hex') {\n schema = z.string()\n } else if (\n inputType === 'number' ||\n inputType === 'uint8' ||\n inputType === 'uint16' ||\n inputType === 'uint32' ||\n inputType === 'uint64' ||\n inputType === 'uint128' ||\n inputType === 'uint256'\n ) {\n schema = z.number()\n } else if (inputType === 'bool' || inputType === 'boolean') {\n schema = z.boolean()\n } else if (inputType === 'biguint') {\n schema = z.string()\n } else {\n schema = z.string()\n }\n\n if (typeof input.min === 'number') {\n if (schema instanceof z.ZodNumber) {\n schema = schema.min(input.min)\n }\n }\n\n if (typeof input.max === 'number') {\n if (schema instanceof z.ZodNumber) {\n schema = schema.max(input.max)\n }\n }\n\n if (input.pattern) {\n if (schema instanceof z.ZodString) {\n schema = schema.regex(new RegExp(input.pattern))\n }\n }\n\n const enumValues = extractEnumValues(input.options)\n if (enumValues && enumValues.length > 0) {\n if (schema instanceof z.ZodString) {\n schema = z.enum(enumValues as [string, ...string[]])\n } else if (schema instanceof z.ZodNumber) {\n const numberValues = enumValues.map((v) => Number(v)).filter((v) => !isNaN(v))\n if (numberValues.length > 0) {\n schema = schema.refine((val) => numberValues.includes(val), {\n message: `Value must be one of: ${numberValues.join(', ')}`,\n })\n }\n }\n }\n\n const descriptionParts: string[] = []\n const inputDescription = extractText(input.description)\n if (inputDescription) {\n descriptionParts.push(inputDescription)\n }\n\n if (input.bot) {\n descriptionParts.push(input.bot)\n }\n\n descriptionParts.push(`Type: ${input.type}`)\n descriptionParts.push(input.required ? 'Required' : 'Optional')\n\n if (enumValues && enumValues.length > 0) {\n descriptionParts.push(`Options: ${enumValues.join(', ')}`)\n }\n\n const patternDesc = extractText(input.patternDescription)\n if (patternDesc) {\n descriptionParts.push(patternDesc)\n }\n\n const fullDescription = descriptionParts.join('. ')\n if (fullDescription) {\n schema = schema.describe(fullDescription)\n }\n\n if (input.required !== true) {\n schema = schema.optional()\n }\n\n return schema\n}\n\nconst buildZodInputSchema = (inputs: WarpActionInput[]): Record<string, z.ZodTypeAny> | undefined => {\n const shape: Record<string, z.ZodTypeAny> = {}\n\n for (const input of inputs) {\n if (input.source === 'hidden') continue\n if (input.source !== 'field') continue\n\n const key = input.as || input.name\n shape[key] = buildZodSchemaFromInput(input)\n }\n\n console.log('[MCP] buildZodInputSchema - inputs:', inputs.length, 'shape keys:', Object.keys(shape))\n return Object.keys(shape).length > 0 ? shape : undefined\n}\n\nconst convertActionToTool = (\n warp: Warp,\n action: WarpTransferAction | WarpContractAction | WarpCollectAction | WarpQueryAction,\n description: string | undefined,\n index: number,\n primaryActionInputs?: WarpActionInput[]\n): any => {\n const inputsToUse = primaryActionInputs || action.inputs || []\n const inputSchema = buildZodInputSchema(inputsToUse)\n const name = sanitizeMcpName(`${warp.name}_${index}`)\n\n console.log(`[MCP] convertActionToTool - tool: ${name}, inputsToUse: ${inputsToUse.length}, inputSchema keys:`, inputSchema ? Object.keys(inputSchema) : 'undefined')\n\n return {\n name,\n description,\n inputSchema,\n }\n}\n\nconst convertMcpActionToTool = (action: WarpMcpAction, description: string | undefined, primaryActionInputs?: WarpActionInput[]): any => {\n const inputsToUse = primaryActionInputs || action.inputs || []\n const inputSchema = buildZodInputSchema(inputsToUse)\n const toolName = action.destination!.tool\n\n return {\n name: sanitizeMcpName(toolName),\n description,\n inputSchema,\n }\n}\n\n\nconst extractEnumValues = (options: string[] | { [key: string]: WarpText } | undefined): string[] | undefined => {\n if (!options) return undefined\n if (Array.isArray(options)) return options\n if (typeof options === 'object') return Object.keys(options)\n return undefined\n}\n\nconst sanitizeMcpName = (name: string): string => {\n return name\n .replace(/\\s+/g, '_')\n .replace(/:/g, '_')\n .replace(/[^A-Za-z0-9_.-]/g, '_')\n .replace(/^[^A-Za-z0-9]+|[^A-Za-z0-9]+$/g, '')\n .replace(/_+/g, '_')\n}\n\nconst convertJsonSchemaTypeToWarpType = (type: string, format?: string): WarpActionInputType => {\n if (format === 'date-time' || format === 'date') return 'string'\n if (type === 'string') return 'string'\n if (type === 'number') return 'uint256'\n if (type === 'integer') return 'uint256'\n if (type === 'boolean') return 'bool'\n if (type === 'array') return 'string'\n if (type === 'object') return 'string'\n return 'string'\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp'\nimport { normalizeObjectSchema } from '@modelcontextprotocol/sdk/server/zod-compat'\nimport { Warp } from '@vleap/warps'\nimport { convertMcpArgsToWarpInputs } from './helpers/execution'\nimport { McpCapabilities, McpServerConfig, WarpExecutor } from './types'\n\nconst processInputSchema = (inputSchema: any): any => {\n if (!inputSchema) return undefined\n if (inputSchema._zod) return inputSchema._zod\n return normalizeObjectSchema(inputSchema) || inputSchema\n}\n\nexport const createMcpServerFromWarps = (\n config: McpServerConfig,\n warps: Warp[],\n capabilities: McpCapabilities[],\n executor?: WarpExecutor\n): McpServer => {\n const server = new McpServer({ name: config.name, version: config.version || '1.0.0' })\n const defaultExecutor = config.executor || executor\n\n for (let i = 0; i < capabilities.length; i++) {\n const { tools, resources } = capabilities[i]\n const warp = warps[i]\n\n tools?.forEach((tool) => {\n const inputSchema = processInputSchema(tool.inputSchema)\n server.registerTool(tool.name, { description: tool.description || '', inputSchema }, async (args: any) => {\n if (defaultExecutor) {\n const inputs = convertMcpArgsToWarpInputs(warp, args || {})\n const result = await defaultExecutor(warp, inputs)\n return result\n }\n return { content: [{ type: 'text' as const, text: `Tool ${tool.name} executed successfully` }] }\n })\n })\n\n resources?.forEach((resource) => {\n server.registerResource(\n resource.name || resource.uri,\n resource.uri,\n { description: resource.description, mimeType: resource.mimeType },\n async () => ({\n contents: [{ uri: resource.uri, mimeType: resource.mimeType || 'text/plain', text: 'Resource content' }],\n })\n )\n })\n }\n\n return server\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp'\nimport { Warp, WarpClientConfig } from '@vleap/warps'\nimport { convertMcpToolToWarp } from './helpers/warps'\n\nexport class WarpMcp {\n constructor(private readonly config: WarpClientConfig) {}\n\n async getWarpsFromTools(url: string, headers?: Record<string, string>): Promise<Warp[]> {\n const transport = new StreamableHTTPClientTransport(new URL(url), {\n requestInit: { headers: headers || {} },\n })\n\n const client = new Client({ name: 'warps-mcp-client', version: '1.0.0' }, { capabilities: {} })\n\n try {\n await client.connect(transport)\n\n const tools = await client.listTools()\n\n await client.close()\n\n return await Promise.all(tools.tools.map((tool) => convertMcpToolToWarp(this.config, tool, url, headers)))\n } catch (error) {\n await client.close().catch(() => {})\n throw error\n }\n }\n}\n"],"mappings":";AAAA,SAAS,sBAA6C,sBAAsB;AAErE,IAAM,6BAA6B,CAAC,MAAY,SAAwC;AAC7F,QAAM,EAAE,OAAO,IAAI,qBAAqB,IAAI;AAC5C,MAAI,CAAC,OAAO,OAAQ,QAAO,CAAC;AAE5B,QAAM,aAAa,IAAI,eAAe;AACtC,SAAO,OAAO,OAAO,IAAI,CAAC,UAA2B;AACnD,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,UAAM,QAAQ,KAAK,GAAG,KAAK,MAAM,WAAW;AAE5C,QAAI,UAAU,QAAQ,MAAM,SAAS,QAAQ;AAC3C,aAAO,WAAW,eAAe,MAAM,MAAM,KAAK;AAAA,IACpD;AAEA,WAAO,WAAW,eAAe,MAAM,MAAM,KAAK;AAAA,EACpD,CAAC;AACH;;;ACjBA;AAAA,EAIE;AAAA,EAQA,wBAAAA;AAAA,OACK;AACP,SAAS,SAAS;AAEX,IAAM,uBAAuB,OAClC,QACA,MACA,KACA,YACkB;AAClB,QAAM,SAA4B,CAAC;AAEnC,MAAI,KAAK,aAAa,YAAY;AAChC,UAAM,aAAa,KAAK,YAAY;AACpC,UAAM,WAAW,KAAK,YAAY,YAAY,CAAC;AAE/C,WAAO,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAqB;AAClE,YAAM,aAAa,SAAS,SAAS,GAAG;AACxC,YAAM,YAAY,gCAAgC,MAAM,MAAM,MAAM,MAAM;AAE1E,YAAM,WAA4B;AAAA,QAChC,MAAM;AAAA,QACN,OAAO,MAAM,SAAS,EAAE,IAAI,IAAI;AAAA,QAChC,aAAa,MAAM,cAAc,EAAE,IAAI,MAAM,YAAY,KAAK,EAAE,IAAI;AAAA,QACpE,MAAM;AAAA,QACN,UAAU,WAAW,GAAG;AAAA,QACxB,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS,MAAM;AAAA,MACjB;AAEA,aAAO,KAAK,QAAQ;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,QAAM,SAAiC,CAAC;AACxC,MAAI,KAAK,cAAc,YAAY;AACjC,WAAO,KAAK,KAAK,aAAa,UAAU,EAAE,QAAQ,CAAC,QAAQ;AACzD,aAAO,GAAG,IAAI,OAAO,GAAG;AAAA,IAC1B,CAAC;AAAA,EACH;AAEA,QAAM,YAA2B;AAAA,IAC/B,MAAM;AAAA,IACN,OAAO,EAAE,IAAI,KAAK,KAAK;AAAA,IACvB,aAAa,KAAK,cAAc,EAAE,IAAI,KAAK,YAAY,KAAK,EAAE,IAAI;AAAA,IAClE,aAAa,EAAE,KAAK,MAAM,KAAK,MAAM,QAAQ;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO,MAAM,IAAI,YAAY,MAAM,EAChC,QAAQ,KAAK,IAAI,EACjB,SAAS,EAAE,IAAI,KAAK,KAAK,CAAC,EAC1B,eAAe,KAAK,cAAc,EAAE,IAAI,KAAK,YAAY,KAAK,EAAE,IAAI,IAAI,EACxE,UAAU,SAAS,EACnB,UAAU,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS,IAAI,EACxD,MAAM,KAAK;AAChB;AAEO,IAAM,+BAA+B,CAAC,SAAoD;AAC/F,QAAM,QAAe,CAAC;AACtB,QAAM,kBAAkB,YAAY,KAAK,WAAW;AAEpD,MAAI;AACJ,MAAI;AACF,UAAM,EAAE,QAAQ,cAAc,IAAIA,sBAAqB,IAAI;AAC3D,0BAAsB,cAAc;AACpC,YAAQ,IAAI,cAAc,KAAK,IAAI,2BAA2B,qBAAqB,UAAU,GAAG,qBAAqB,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,EAAE,QAAQ,UAAU,EAAE,SAAS,EAAE,CAAC;AAAA,EAC3L,SAAS,OAAO;AACd,YAAQ,IAAI,cAAc,KAAK,IAAI,oCAAoC,KAAK;AAC5E,0BAAsB;AAAA,EACxB;AAEA,OAAK,QAAQ,QAAQ,CAAC,QAAQ,UAAU;AACtC,UAAM,oBAAoB,YAAY,OAAO,WAAW;AACxD,UAAM,cAAc,mBAAmB;AAEvC,QAAI,OAAO,SAAS,OAAO;AACzB,YAAM,YAAY;AAClB,UAAI,UAAU,aAAa;AACzB,cAAM,OAAO,uBAAuB,WAAW,aAAa,mBAAmB;AAC/E,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF,OAAO;AACL,YAAM,OAAO,oBAAoB,MAAM,QAAQ,aAAa,OAAO,mBAAmB;AACtF,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF,CAAC;AAED,UAAQ,IAAI,8CAA8C,KAAK,IAAI,YAAY,MAAM,MAAM,wBAAwB,MAAM,OAAO,OAAK,EAAE,WAAW,EAAE,MAAM;AAC1J,SAAO,EAAE,OAAO,WAAW,CAAC,EAAE;AAChC;AAEA,IAAM,cAAc,CAAC,SAA0D;AAC7E,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,OAAO,SAAS,YAAY,QAAQ,KAAM,QAAO,KAAK;AAC1D,SAAO;AACT;AAEA,IAAM,0BAA0B,CAAC,UAAyC;AACxE,MAAI;AAEJ,QAAM,YAAY,MAAM,KAAK,YAAY;AACzC,MAAI,cAAc,YAAY,cAAc,aAAa,cAAc,OAAO;AAC5E,aAAS,EAAE,OAAO;AAAA,EACpB,WACE,cAAc,YACd,cAAc,WACd,cAAc,YACd,cAAc,YACd,cAAc,YACd,cAAc,aACd,cAAc,WACd;AACA,aAAS,EAAE,OAAO;AAAA,EACpB,WAAW,cAAc,UAAU,cAAc,WAAW;AAC1D,aAAS,EAAE,QAAQ;AAAA,EACrB,WAAW,cAAc,WAAW;AAClC,aAAS,EAAE,OAAO;AAAA,EACpB,OAAO;AACL,aAAS,EAAE,OAAO;AAAA,EACpB;AAEA,MAAI,OAAO,MAAM,QAAQ,UAAU;AACjC,QAAI,kBAAkB,EAAE,WAAW;AACjC,eAAS,OAAO,IAAI,MAAM,GAAG;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,OAAO,MAAM,QAAQ,UAAU;AACjC,QAAI,kBAAkB,EAAE,WAAW;AACjC,eAAS,OAAO,IAAI,MAAM,GAAG;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,MAAM,SAAS;AACjB,QAAI,kBAAkB,EAAE,WAAW;AACjC,eAAS,OAAO,MAAM,IAAI,OAAO,MAAM,OAAO,CAAC;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,aAAa,kBAAkB,MAAM,OAAO;AAClD,MAAI,cAAc,WAAW,SAAS,GAAG;AACvC,QAAI,kBAAkB,EAAE,WAAW;AACjC,eAAS,EAAE,KAAK,UAAmC;AAAA,IACrD,WAAW,kBAAkB,EAAE,WAAW;AACxC,YAAM,eAAe,WAAW,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC7E,UAAI,aAAa,SAAS,GAAG;AAC3B,iBAAS,OAAO,OAAO,CAAC,QAAQ,aAAa,SAAS,GAAG,GAAG;AAAA,UAC1D,SAAS,yBAAyB,aAAa,KAAK,IAAI,CAAC;AAAA,QAC3D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAA6B,CAAC;AACpC,QAAM,mBAAmB,YAAY,MAAM,WAAW;AACtD,MAAI,kBAAkB;AACpB,qBAAiB,KAAK,gBAAgB;AAAA,EACxC;AAEA,MAAI,MAAM,KAAK;AACb,qBAAiB,KAAK,MAAM,GAAG;AAAA,EACjC;AAEA,mBAAiB,KAAK,SAAS,MAAM,IAAI,EAAE;AAC3C,mBAAiB,KAAK,MAAM,WAAW,aAAa,UAAU;AAE9D,MAAI,cAAc,WAAW,SAAS,GAAG;AACvC,qBAAiB,KAAK,YAAY,WAAW,KAAK,IAAI,CAAC,EAAE;AAAA,EAC3D;AAEA,QAAM,cAAc,YAAY,MAAM,kBAAkB;AACxD,MAAI,aAAa;AACf,qBAAiB,KAAK,WAAW;AAAA,EACnC;AAEA,QAAM,kBAAkB,iBAAiB,KAAK,IAAI;AAClD,MAAI,iBAAiB;AACnB,aAAS,OAAO,SAAS,eAAe;AAAA,EAC1C;AAEA,MAAI,MAAM,aAAa,MAAM;AAC3B,aAAS,OAAO,SAAS;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,IAAM,sBAAsB,CAAC,WAAwE;AACnG,QAAM,QAAsC,CAAC;AAE7C,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,WAAW,SAAU;AAC/B,QAAI,MAAM,WAAW,QAAS;AAE9B,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,UAAM,GAAG,IAAI,wBAAwB,KAAK;AAAA,EAC5C;AAEA,UAAQ,IAAI,uCAAuC,OAAO,QAAQ,eAAe,OAAO,KAAK,KAAK,CAAC;AACnG,SAAO,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,QAAQ;AACjD;AAEA,IAAM,sBAAsB,CAC1B,MACA,QACA,aACA,OACA,wBACQ;AACR,QAAM,cAAc,uBAAuB,OAAO,UAAU,CAAC;AAC7D,QAAM,cAAc,oBAAoB,WAAW;AACnD,QAAM,OAAO,gBAAgB,GAAG,KAAK,IAAI,IAAI,KAAK,EAAE;AAEpD,UAAQ,IAAI,qCAAqC,IAAI,kBAAkB,YAAY,MAAM,uBAAuB,cAAc,OAAO,KAAK,WAAW,IAAI,WAAW;AAEpK,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,yBAAyB,CAAC,QAAuB,aAAiC,wBAAiD;AACvI,QAAM,cAAc,uBAAuB,OAAO,UAAU,CAAC;AAC7D,QAAM,cAAc,oBAAoB,WAAW;AACnD,QAAM,WAAW,OAAO,YAAa;AAErC,SAAO;AAAA,IACL,MAAM,gBAAgB,QAAQ;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACF;AAGA,IAAM,oBAAoB,CAAC,YAAsF;AAC/G,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,MAAM,QAAQ,OAAO,EAAG,QAAO;AACnC,MAAI,OAAO,YAAY,SAAU,QAAO,OAAO,KAAK,OAAO;AAC3D,SAAO;AACT;AAEA,IAAM,kBAAkB,CAAC,SAAyB;AAChD,SAAO,KACJ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,MAAM,GAAG,EACjB,QAAQ,oBAAoB,GAAG,EAC/B,QAAQ,kCAAkC,EAAE,EAC5C,QAAQ,OAAO,GAAG;AACvB;AAEA,IAAM,kCAAkC,CAAC,MAAc,WAAyC;AAC9F,MAAI,WAAW,eAAe,WAAW,OAAQ,QAAO;AACxD,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,SAAS,UAAW,QAAO;AAC/B,MAAI,SAAS,UAAW,QAAO;AAC/B,MAAI,SAAS,QAAS,QAAO;AAC7B,MAAI,SAAS,SAAU,QAAO;AAC9B,SAAO;AACT;;;ACnRA,SAAS,iBAAiB;AAC1B,SAAS,6BAA6B;AAKtC,IAAM,qBAAqB,CAAC,gBAA0B;AACpD,MAAI,CAAC,YAAa,QAAO;AACzB,MAAI,YAAY,KAAM,QAAO,YAAY;AACzC,SAAO,sBAAsB,WAAW,KAAK;AAC/C;AAEO,IAAM,2BAA2B,CACtC,QACA,OACA,cACA,aACc;AACd,QAAM,SAAS,IAAI,UAAU,EAAE,MAAM,OAAO,MAAM,SAAS,OAAO,WAAW,QAAQ,CAAC;AACtF,QAAM,kBAAkB,OAAO,YAAY;AAE3C,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,UAAM,EAAE,OAAO,UAAU,IAAI,aAAa,CAAC;AAC3C,UAAM,OAAO,MAAM,CAAC;AAEpB,WAAO,QAAQ,CAAC,SAAS;AACvB,YAAM,cAAc,mBAAmB,KAAK,WAAW;AACvD,aAAO,aAAa,KAAK,MAAM,EAAE,aAAa,KAAK,eAAe,IAAI,YAAY,GAAG,OAAO,SAAc;AACxG,YAAI,iBAAiB;AACnB,gBAAM,SAAS,2BAA2B,MAAM,QAAQ,CAAC,CAAC;AAC1D,gBAAM,SAAS,MAAM,gBAAgB,MAAM,MAAM;AACjD,iBAAO;AAAA,QACT;AACA,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,KAAK,IAAI,yBAAyB,CAAC,EAAE;AAAA,MACjG,CAAC;AAAA,IACH,CAAC;AAED,eAAW,QAAQ,CAAC,aAAa;AAC/B,aAAO;AAAA,QACL,SAAS,QAAQ,SAAS;AAAA,QAC1B,SAAS;AAAA,QACT,EAAE,aAAa,SAAS,aAAa,UAAU,SAAS,SAAS;AAAA,QACjE,aAAa;AAAA,UACX,UAAU,CAAC,EAAE,KAAK,SAAS,KAAK,UAAU,SAAS,YAAY,cAAc,MAAM,mBAAmB,CAAC;AAAA,QACzG;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AClDA,SAAS,cAAc;AACvB,SAAS,qCAAqC;AAIvC,IAAM,UAAN,MAAc;AAAA,EACnB,YAA6B,QAA0B;AAA1B;AAAA,EAA2B;AAAA,EAExD,MAAM,kBAAkB,KAAa,SAAmD;AACtF,UAAM,YAAY,IAAI,8BAA8B,IAAI,IAAI,GAAG,GAAG;AAAA,MAChE,aAAa,EAAE,SAAS,WAAW,CAAC,EAAE;AAAA,IACxC,CAAC;AAED,UAAM,SAAS,IAAI,OAAO,EAAE,MAAM,oBAAoB,SAAS,QAAQ,GAAG,EAAE,cAAc,CAAC,EAAE,CAAC;AAE9F,QAAI;AACF,YAAM,OAAO,QAAQ,SAAS;AAE9B,YAAM,QAAQ,MAAM,OAAO,UAAU;AAErC,YAAM,OAAO,MAAM;AAEnB,aAAO,MAAM,QAAQ,IAAI,MAAM,MAAM,IAAI,CAAC,SAAS,qBAAqB,KAAK,QAAQ,MAAM,KAAK,OAAO,CAAC,CAAC;AAAA,IAC3G,SAAS,OAAO;AACd,YAAM,OAAO,MAAM,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACnC,YAAM;AAAA,IACR;AAAA,EACF;AACF;","names":["getWarpPrimaryAction"]}
|