@vleap/warps-mcp 1.0.0-beta.6 → 1.0.0-beta.8
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.d.cts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +89 -115
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +89 -115
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -8,7 +8,6 @@ declare const convertMcpToolToWarp: (config: WarpClientConfig, tool: {
|
|
|
8
8
|
}, url: string, headers?: Record<string, string>) => Promise<Warp>;
|
|
9
9
|
declare const convertWarpToMcpCapabilities: (warp: Warp) => {
|
|
10
10
|
tools: any[];
|
|
11
|
-
resources: any[];
|
|
12
11
|
};
|
|
13
12
|
|
|
14
13
|
declare class WarpMcp {
|
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,6 @@ declare const convertMcpToolToWarp: (config: WarpClientConfig, tool: {
|
|
|
8
8
|
}, url: string, headers?: Record<string, string>) => Promise<Warp>;
|
|
9
9
|
declare const convertWarpToMcpCapabilities: (warp: Warp) => {
|
|
10
10
|
tools: any[];
|
|
11
|
-
resources: any[];
|
|
12
11
|
};
|
|
13
12
|
|
|
14
13
|
declare class WarpMcp {
|
package/dist/index.js
CHANGED
|
@@ -30,7 +30,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
30
30
|
var import_warps = require("@vleap/warps");
|
|
31
31
|
var convertMcpToolToWarp = async (config, tool, url, headers) => {
|
|
32
32
|
const inputs = [];
|
|
33
|
-
if (tool.inputSchema
|
|
33
|
+
if (tool.inputSchema?.properties) {
|
|
34
34
|
const properties = tool.inputSchema.properties;
|
|
35
35
|
const required = tool.inputSchema.required || [];
|
|
36
36
|
Object.entries(properties).forEach(([key, value]) => {
|
|
@@ -50,9 +50,8 @@ var convertMcpToolToWarp = async (config, tool, url, headers) => {
|
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
52
|
const output = {};
|
|
53
|
-
if (tool.outputSchema
|
|
54
|
-
|
|
55
|
-
Object.keys(properties).forEach((key) => {
|
|
53
|
+
if (tool.outputSchema?.properties) {
|
|
54
|
+
Object.keys(tool.outputSchema.properties).forEach((key) => {
|
|
56
55
|
output[key] = `out.${key}`;
|
|
57
56
|
});
|
|
58
57
|
}
|
|
@@ -67,147 +66,122 @@ var convertMcpToolToWarp = async (config, tool, url, headers) => {
|
|
|
67
66
|
};
|
|
68
67
|
var convertWarpToMcpCapabilities = (warp) => {
|
|
69
68
|
const tools = [];
|
|
70
|
-
const
|
|
71
|
-
const description = warp.description && typeof warp.description === "object" && "en" in warp.description ? warp.description.en : void 0;
|
|
72
|
-
const outputSchema = {
|
|
73
|
-
type: "object",
|
|
74
|
-
properties: {}
|
|
75
|
-
};
|
|
76
|
-
if (warp.output && Object.keys(warp.output).length > 0) {
|
|
77
|
-
Object.keys(warp.output).forEach((key) => {
|
|
78
|
-
outputSchema.properties[key] = {
|
|
79
|
-
type: "string",
|
|
80
|
-
description: `Output field ${key}`
|
|
81
|
-
};
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
const hasOutput = Object.keys(outputSchema.properties).length > 0;
|
|
69
|
+
const warpDescription = extractText(warp.description);
|
|
85
70
|
warp.actions.forEach((action, index) => {
|
|
86
|
-
const actionDescription = action.description
|
|
87
|
-
const
|
|
88
|
-
if (action.type === "
|
|
89
|
-
const tool = convertActionToTool(warp, action, finalDescription, hasOutput ? outputSchema : void 0, index);
|
|
90
|
-
tools.push(tool);
|
|
91
|
-
} else if (action.type === "query") {
|
|
92
|
-
const resource = convertActionToResource(warp, action, finalDescription, index);
|
|
93
|
-
resources.push(resource);
|
|
94
|
-
} else if (action.type === "collect") {
|
|
95
|
-
const collectAction = action;
|
|
96
|
-
if (collectAction.destination && typeof collectAction.destination === "object" && "method" in collectAction.destination && (collectAction.destination.method === "POST" || collectAction.destination.method === "PUT" || collectAction.destination.method === "DELETE")) {
|
|
97
|
-
const tool = convertActionToTool(warp, action, finalDescription, hasOutput ? outputSchema : void 0, index);
|
|
98
|
-
tools.push(tool);
|
|
99
|
-
} else {
|
|
100
|
-
const resource = convertActionToResource(warp, action, finalDescription, index);
|
|
101
|
-
resources.push(resource);
|
|
102
|
-
}
|
|
103
|
-
} else if (action.type === "mcp") {
|
|
71
|
+
const actionDescription = extractText(action.description);
|
|
72
|
+
const description = warpDescription || actionDescription;
|
|
73
|
+
if (action.type === "mcp") {
|
|
104
74
|
const mcpAction = action;
|
|
105
75
|
if (mcpAction.destination) {
|
|
106
|
-
const tool = convertMcpActionToTool(
|
|
76
|
+
const tool = convertMcpActionToTool(mcpAction, description);
|
|
107
77
|
tools.push(tool);
|
|
108
78
|
}
|
|
79
|
+
} else {
|
|
80
|
+
const tool = convertActionToTool(warp, action, description, index);
|
|
81
|
+
tools.push(tool);
|
|
109
82
|
}
|
|
110
83
|
});
|
|
111
|
-
return { tools
|
|
84
|
+
return { tools };
|
|
112
85
|
};
|
|
113
|
-
var
|
|
114
|
-
|
|
86
|
+
var extractText = (text) => {
|
|
87
|
+
if (!text) return void 0;
|
|
88
|
+
if (typeof text === "string") return text;
|
|
89
|
+
if (typeof text === "object" && "en" in text) return text.en;
|
|
90
|
+
return void 0;
|
|
115
91
|
};
|
|
116
|
-
var convertActionToTool = (warp, action, description,
|
|
92
|
+
var convertActionToTool = (warp, action, description, index) => {
|
|
117
93
|
const inputSchema = buildInputSchema(action.inputs || []);
|
|
118
94
|
const name = sanitizeMcpName(`${warp.name}_${index}`);
|
|
119
|
-
let url;
|
|
120
|
-
let headers;
|
|
121
|
-
if (action.type === "collect") {
|
|
122
|
-
const collectAction = action;
|
|
123
|
-
if (collectAction.destination && typeof collectAction.destination === "object" && "url" in collectAction.destination) {
|
|
124
|
-
url = collectAction.destination.url;
|
|
125
|
-
headers = collectAction.destination.headers;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return {
|
|
129
|
-
name,
|
|
130
|
-
description,
|
|
131
|
-
inputSchema: Object.keys(inputSchema.properties).length > 0 ? inputSchema : void 0,
|
|
132
|
-
outputSchema,
|
|
133
|
-
url,
|
|
134
|
-
headers
|
|
135
|
-
};
|
|
136
|
-
};
|
|
137
|
-
var convertActionToResource = (warp, action, description, index) => {
|
|
138
|
-
const name = sanitizeMcpName(`${warp.name}_${index}`);
|
|
139
|
-
let uri;
|
|
140
|
-
let mimeType;
|
|
141
|
-
let headers;
|
|
142
|
-
if (action.type === "query") {
|
|
143
|
-
const queryAction = action;
|
|
144
|
-
if (queryAction.address) {
|
|
145
|
-
uri = queryAction.address;
|
|
146
|
-
}
|
|
147
|
-
} else if (action.type === "collect") {
|
|
148
|
-
const collectAction = action;
|
|
149
|
-
if (collectAction.destination) {
|
|
150
|
-
if (typeof collectAction.destination === "string") {
|
|
151
|
-
uri = collectAction.destination;
|
|
152
|
-
} else if (typeof collectAction.destination === "object" && "url" in collectAction.destination) {
|
|
153
|
-
uri = collectAction.destination.url;
|
|
154
|
-
headers = collectAction.destination.headers;
|
|
155
|
-
mimeType = "application/json";
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
95
|
return {
|
|
160
|
-
uri: uri || name,
|
|
161
96
|
name,
|
|
162
97
|
description,
|
|
163
|
-
|
|
164
|
-
headers
|
|
98
|
+
inputSchema: hasProperties(inputSchema) ? inputSchema : void 0
|
|
165
99
|
};
|
|
166
100
|
};
|
|
167
|
-
var convertMcpActionToTool = (
|
|
101
|
+
var convertMcpActionToTool = (action, description) => {
|
|
168
102
|
const inputSchema = buildInputSchema(action.inputs || []);
|
|
169
|
-
const
|
|
103
|
+
const toolName = action.destination.tool;
|
|
170
104
|
return {
|
|
171
105
|
name: sanitizeMcpName(toolName),
|
|
172
106
|
description,
|
|
173
|
-
inputSchema:
|
|
174
|
-
outputSchema,
|
|
175
|
-
url,
|
|
176
|
-
headers
|
|
107
|
+
inputSchema: hasProperties(inputSchema) ? inputSchema : void 0
|
|
177
108
|
};
|
|
178
109
|
};
|
|
179
110
|
var buildInputSchema = (inputs) => {
|
|
180
|
-
const
|
|
111
|
+
const schema = {
|
|
181
112
|
type: "object",
|
|
182
113
|
properties: {},
|
|
183
114
|
required: []
|
|
184
115
|
};
|
|
185
116
|
inputs.forEach((input) => {
|
|
186
|
-
if (input
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if (jsonSchemaType.format) {
|
|
193
|
-
property.format = jsonSchemaType.format;
|
|
194
|
-
}
|
|
195
|
-
if (input.label && typeof input.label === "object" && "en" in input.label) {
|
|
196
|
-
property.title = input.label.en;
|
|
197
|
-
}
|
|
198
|
-
if (input.description && typeof input.description === "object" && "en" in input.description) {
|
|
199
|
-
property.description = input.description.en;
|
|
200
|
-
}
|
|
201
|
-
if (input.default !== void 0) {
|
|
202
|
-
property.default = input.default;
|
|
203
|
-
}
|
|
204
|
-
inputSchema.properties[key] = property;
|
|
205
|
-
if (input.required) {
|
|
206
|
-
inputSchema.required.push(key);
|
|
207
|
-
}
|
|
117
|
+
if (!isPayloadInput(input)) return;
|
|
118
|
+
const key = extractPayloadKey(input.position);
|
|
119
|
+
const property = buildPropertySchema(input);
|
|
120
|
+
schema.properties[key] = property;
|
|
121
|
+
if (input.required) {
|
|
122
|
+
schema.required.push(key);
|
|
208
123
|
}
|
|
209
124
|
});
|
|
210
|
-
return
|
|
125
|
+
return schema;
|
|
126
|
+
};
|
|
127
|
+
var isPayloadInput = (input) => {
|
|
128
|
+
return typeof input.position === "string" && input.position.startsWith("payload:");
|
|
129
|
+
};
|
|
130
|
+
var extractPayloadKey = (position) => {
|
|
131
|
+
return position.replace("payload:", "");
|
|
132
|
+
};
|
|
133
|
+
var buildPropertySchema = (input) => {
|
|
134
|
+
const jsonSchemaType = convertWarpTypeToJsonSchemaType(input.type);
|
|
135
|
+
const property = {
|
|
136
|
+
type: jsonSchemaType.type
|
|
137
|
+
};
|
|
138
|
+
if (jsonSchemaType.format) {
|
|
139
|
+
property.format = jsonSchemaType.format;
|
|
140
|
+
}
|
|
141
|
+
const title = extractText(input.label) || input.name;
|
|
142
|
+
if (title) {
|
|
143
|
+
property.title = title;
|
|
144
|
+
}
|
|
145
|
+
const description = buildDescription(input);
|
|
146
|
+
if (description) {
|
|
147
|
+
property.description = description;
|
|
148
|
+
}
|
|
149
|
+
if (input.default !== void 0) {
|
|
150
|
+
property.default = input.default;
|
|
151
|
+
}
|
|
152
|
+
if (typeof input.min === "number") {
|
|
153
|
+
property.minimum = input.min;
|
|
154
|
+
}
|
|
155
|
+
if (typeof input.max === "number") {
|
|
156
|
+
property.maximum = input.max;
|
|
157
|
+
}
|
|
158
|
+
if (input.pattern) {
|
|
159
|
+
property.pattern = input.pattern;
|
|
160
|
+
}
|
|
161
|
+
const enumValues = extractEnumValues(input.options);
|
|
162
|
+
if (enumValues) {
|
|
163
|
+
property.enum = enumValues;
|
|
164
|
+
}
|
|
165
|
+
return property;
|
|
166
|
+
};
|
|
167
|
+
var buildDescription = (input) => {
|
|
168
|
+
const description = extractText(input.description);
|
|
169
|
+
const patternDesc = extractText(input.patternDescription);
|
|
170
|
+
if (!description && !patternDesc) return void 0;
|
|
171
|
+
if (description && patternDesc) return `${description}. ${patternDesc}`;
|
|
172
|
+
return description || patternDesc;
|
|
173
|
+
};
|
|
174
|
+
var extractEnumValues = (options) => {
|
|
175
|
+
if (!options) return void 0;
|
|
176
|
+
if (Array.isArray(options)) return options;
|
|
177
|
+
if (typeof options === "object") return Object.keys(options);
|
|
178
|
+
return void 0;
|
|
179
|
+
};
|
|
180
|
+
var hasProperties = (schema) => {
|
|
181
|
+
return schema && schema.properties && Object.keys(schema.properties).length > 0;
|
|
182
|
+
};
|
|
183
|
+
var sanitizeMcpName = (name) => {
|
|
184
|
+
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, "_");
|
|
211
185
|
};
|
|
212
186
|
var convertJsonSchemaTypeToWarpType = (type, format) => {
|
|
213
187
|
if (format === "date-time" || format === "date") return "string";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/helpers/warps.ts","../src/WarpMcp.ts"],"sourcesContent":["export * from './helpers'\nexport * from './WarpMcp'\n","import {\n Warp,\n WarpActionInput,\n WarpActionInputType,\n WarpBuilder,\n WarpClientConfig,\n WarpCollectAction,\n WarpContractAction,\n WarpMcpAction,\n WarpQueryAction,\n WarpTransferAction,\n} from '@vleap/warps'\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 && 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 && tool.outputSchema.properties) {\n const properties = tool.outputSchema.properties\n Object.keys(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 resources: any[] = []\n\n const description = warp.description && typeof warp.description === 'object' && 'en' in warp.description ? warp.description.en : undefined\n\n const outputSchema: any = {\n type: 'object',\n properties: {},\n }\n\n if (warp.output && Object.keys(warp.output).length > 0) {\n Object.keys(warp.output).forEach((key) => {\n outputSchema.properties[key] = {\n type: 'string',\n description: `Output field ${key}`,\n }\n })\n }\n\n const hasOutput = Object.keys(outputSchema.properties).length > 0\n\n warp.actions.forEach((action, index) => {\n const actionDescription =\n action.description && typeof action.description === 'object' && 'en' in action.description ? action.description.en : undefined\n\n const finalDescription = description || actionDescription || undefined\n\n if (action.type === 'transfer' || action.type === 'contract') {\n const tool = convertActionToTool(warp, action, finalDescription, hasOutput ? outputSchema : undefined, index)\n tools.push(tool)\n } else if (action.type === 'query') {\n const resource = convertActionToResource(warp, action, finalDescription, index)\n resources.push(resource)\n } else if (action.type === 'collect') {\n const collectAction = action as WarpCollectAction\n if (\n collectAction.destination &&\n typeof collectAction.destination === 'object' &&\n 'method' in collectAction.destination &&\n (collectAction.destination.method === 'POST' ||\n collectAction.destination.method === 'PUT' ||\n collectAction.destination.method === 'DELETE')\n ) {\n const tool = convertActionToTool(warp, action, finalDescription, hasOutput ? outputSchema : undefined, index)\n tools.push(tool)\n } else {\n const resource = convertActionToResource(warp, action, finalDescription, index)\n resources.push(resource)\n }\n } else if (action.type === 'mcp') {\n const mcpAction = action as WarpMcpAction\n if (mcpAction.destination) {\n const tool = convertMcpActionToTool(warp, mcpAction, finalDescription, hasOutput ? outputSchema : undefined)\n tools.push(tool)\n }\n }\n })\n\n return { tools, resources }\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 convertActionToTool = (\n warp: Warp,\n action: WarpTransferAction | WarpContractAction | WarpCollectAction,\n description: string | undefined,\n outputSchema: any | undefined,\n index: number\n): any => {\n const inputSchema = buildInputSchema(action.inputs || [])\n const name = sanitizeMcpName(`${warp.name}_${index}`)\n\n let url: string | undefined\n let headers: Record<string, string> | undefined\n\n if (action.type === 'collect') {\n const collectAction = action as WarpCollectAction\n if (collectAction.destination && typeof collectAction.destination === 'object' && 'url' in collectAction.destination) {\n url = collectAction.destination.url\n headers = collectAction.destination.headers\n }\n }\n\n return {\n name,\n description,\n inputSchema: Object.keys(inputSchema.properties).length > 0 ? inputSchema : undefined,\n outputSchema,\n url,\n headers,\n }\n}\n\nconst convertActionToResource = (\n warp: Warp,\n action: WarpQueryAction | WarpCollectAction,\n description: string | undefined,\n index: number\n): any => {\n const name = sanitizeMcpName(`${warp.name}_${index}`)\n let uri: string | undefined\n let mimeType: string | undefined\n let headers: Record<string, string> | undefined\n\n if (action.type === 'query') {\n const queryAction = action as WarpQueryAction\n if (queryAction.address) {\n uri = queryAction.address\n }\n } else if (action.type === 'collect') {\n const collectAction = action as WarpCollectAction\n if (collectAction.destination) {\n if (typeof collectAction.destination === 'string') {\n uri = collectAction.destination\n } else if (typeof collectAction.destination === 'object' && 'url' in collectAction.destination) {\n uri = collectAction.destination.url\n headers = collectAction.destination.headers\n mimeType = 'application/json'\n }\n }\n }\n\n return {\n uri: uri || name,\n name,\n description,\n mimeType,\n headers,\n }\n}\n\nconst convertMcpActionToTool = (warp: Warp, action: WarpMcpAction, description: string | undefined, outputSchema: any | undefined): any => {\n const inputSchema = buildInputSchema(action.inputs || [])\n const { url, tool: toolName, headers } = action.destination!\n\n return {\n name: sanitizeMcpName(toolName),\n description,\n inputSchema: Object.keys(inputSchema.properties).length > 0 ? inputSchema : undefined,\n outputSchema,\n url,\n headers,\n }\n}\n\nconst buildInputSchema = (inputs: WarpActionInput[]): any => {\n const inputSchema: any = {\n type: 'object',\n properties: {},\n required: [],\n }\n\n inputs.forEach((input) => {\n if (input.position && typeof input.position === 'string' && input.position.startsWith('payload:')) {\n const key = input.position.replace('payload:', '')\n const jsonSchemaType = convertWarpTypeToJsonSchemaType(input.type)\n\n const property: any = {\n type: jsonSchemaType.type,\n }\n\n if (jsonSchemaType.format) {\n property.format = jsonSchemaType.format\n }\n\n if (input.label && typeof input.label === 'object' && 'en' in input.label) {\n property.title = input.label.en\n }\n\n if (input.description && typeof input.description === 'object' && 'en' in input.description) {\n property.description = input.description.en\n }\n\n if (input.default !== undefined) {\n property.default = input.default\n }\n\n inputSchema.properties[key] = property\n\n if (input.required) {\n inputSchema.required.push(key)\n }\n }\n })\n\n return inputSchema\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\nconst convertWarpTypeToJsonSchemaType = (warpType: string): { type: string; format?: string } => {\n if (warpType === 'string') return { type: 'string' }\n if (warpType === 'bool') return { type: 'boolean' }\n if (\n warpType === 'uint8' ||\n warpType === 'uint16' ||\n warpType === 'uint32' ||\n warpType === 'uint64' ||\n warpType === 'uint128' ||\n warpType === 'uint256' ||\n warpType === 'biguint'\n ) {\n return { type: 'integer' }\n }\n if (warpType === 'number') return { type: 'number' }\n return { type: 'string' }\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/helpers/warps.ts","../src/WarpMcp.ts"],"sourcesContent":["export * from './helpers'\nexport * from './WarpMcp'\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} from '@vleap/warps'\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[] } => {\n const tools: any[] = []\n const warpDescription = extractText(warp.description)\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)\n tools.push(tool)\n }\n } else {\n const tool = convertActionToTool(warp, action, description, index)\n tools.push(tool)\n }\n })\n\n return { tools }\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 convertActionToTool = (\n warp: Warp,\n action: WarpTransferAction | WarpContractAction | WarpCollectAction | WarpQueryAction,\n description: string | undefined,\n index: number\n): any => {\n const inputSchema = buildInputSchema(action.inputs || [])\n const name = sanitizeMcpName(`${warp.name}_${index}`)\n\n return {\n name,\n description,\n inputSchema: hasProperties(inputSchema) ? inputSchema : undefined,\n }\n}\n\nconst convertMcpActionToTool = (action: WarpMcpAction, description: string | undefined): any => {\n const inputSchema = buildInputSchema(action.inputs || [])\n const toolName = action.destination!.tool\n\n return {\n name: sanitizeMcpName(toolName),\n description,\n inputSchema: hasProperties(inputSchema) ? inputSchema : undefined,\n }\n}\n\nconst buildInputSchema = (inputs: WarpActionInput[]): any => {\n const schema: any = {\n type: 'object',\n properties: {},\n required: [],\n }\n\n inputs.forEach((input) => {\n if (!isPayloadInput(input)) return\n\n const key = extractPayloadKey(input.position as string)\n const property = buildPropertySchema(input)\n\n schema.properties[key] = property\n\n if (input.required) {\n schema.required.push(key)\n }\n })\n\n return schema\n}\n\nconst isPayloadInput = (input: WarpActionInput): boolean => {\n return typeof input.position === 'string' && input.position.startsWith('payload:')\n}\n\nconst extractPayloadKey = (position: string): string => {\n return position.replace('payload:', '')\n}\n\nconst buildPropertySchema = (input: WarpActionInput): any => {\n const jsonSchemaType = convertWarpTypeToJsonSchemaType(input.type)\n const property: any = {\n type: jsonSchemaType.type,\n }\n\n if (jsonSchemaType.format) {\n property.format = jsonSchemaType.format\n }\n\n const title = extractText(input.label) || input.name\n if (title) {\n property.title = title\n }\n\n const description = buildDescription(input)\n if (description) {\n property.description = description\n }\n\n if (input.default !== undefined) {\n property.default = input.default\n }\n\n if (typeof input.min === 'number') {\n property.minimum = input.min\n }\n\n if (typeof input.max === 'number') {\n property.maximum = input.max\n }\n\n if (input.pattern) {\n property.pattern = input.pattern\n }\n\n const enumValues = extractEnumValues(input.options)\n if (enumValues) {\n property.enum = enumValues\n }\n\n return property\n}\n\nconst buildDescription = (input: WarpActionInput): string | undefined => {\n const description = extractText(input.description)\n const patternDesc = extractText(input.patternDescription)\n\n if (!description && !patternDesc) return undefined\n if (description && patternDesc) return `${description}. ${patternDesc}`\n return description || patternDesc\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 hasProperties = (schema: any): boolean => {\n return schema && schema.properties && Object.keys(schema.properties).length > 0\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\nconst convertWarpTypeToJsonSchemaType = (warpType: string): { type: string; format?: string } => {\n if (warpType === 'string') return { type: 'string' }\n if (warpType === 'bool') return { type: 'boolean' }\n if (\n warpType === 'uint8' ||\n warpType === 'uint16' ||\n warpType === 'uint32' ||\n warpType === 'uint64' ||\n warpType === 'uint128' ||\n warpType === 'uint256' ||\n warpType === 'biguint'\n ) {\n return { type: 'integer' }\n }\n if (warpType === 'number') return { type: 'number' }\n return { type: 'string' }\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\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":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "@vleap/warps";
|
|
5
5
|
var convertMcpToolToWarp = async (config, tool, url, headers) => {
|
|
6
6
|
const inputs = [];
|
|
7
|
-
if (tool.inputSchema
|
|
7
|
+
if (tool.inputSchema?.properties) {
|
|
8
8
|
const properties = tool.inputSchema.properties;
|
|
9
9
|
const required = tool.inputSchema.required || [];
|
|
10
10
|
Object.entries(properties).forEach(([key, value]) => {
|
|
@@ -24,9 +24,8 @@ var convertMcpToolToWarp = async (config, tool, url, headers) => {
|
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
26
|
const output = {};
|
|
27
|
-
if (tool.outputSchema
|
|
28
|
-
|
|
29
|
-
Object.keys(properties).forEach((key) => {
|
|
27
|
+
if (tool.outputSchema?.properties) {
|
|
28
|
+
Object.keys(tool.outputSchema.properties).forEach((key) => {
|
|
30
29
|
output[key] = `out.${key}`;
|
|
31
30
|
});
|
|
32
31
|
}
|
|
@@ -41,147 +40,122 @@ var convertMcpToolToWarp = async (config, tool, url, headers) => {
|
|
|
41
40
|
};
|
|
42
41
|
var convertWarpToMcpCapabilities = (warp) => {
|
|
43
42
|
const tools = [];
|
|
44
|
-
const
|
|
45
|
-
const description = warp.description && typeof warp.description === "object" && "en" in warp.description ? warp.description.en : void 0;
|
|
46
|
-
const outputSchema = {
|
|
47
|
-
type: "object",
|
|
48
|
-
properties: {}
|
|
49
|
-
};
|
|
50
|
-
if (warp.output && Object.keys(warp.output).length > 0) {
|
|
51
|
-
Object.keys(warp.output).forEach((key) => {
|
|
52
|
-
outputSchema.properties[key] = {
|
|
53
|
-
type: "string",
|
|
54
|
-
description: `Output field ${key}`
|
|
55
|
-
};
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
const hasOutput = Object.keys(outputSchema.properties).length > 0;
|
|
43
|
+
const warpDescription = extractText(warp.description);
|
|
59
44
|
warp.actions.forEach((action, index) => {
|
|
60
|
-
const actionDescription = action.description
|
|
61
|
-
const
|
|
62
|
-
if (action.type === "
|
|
63
|
-
const tool = convertActionToTool(warp, action, finalDescription, hasOutput ? outputSchema : void 0, index);
|
|
64
|
-
tools.push(tool);
|
|
65
|
-
} else if (action.type === "query") {
|
|
66
|
-
const resource = convertActionToResource(warp, action, finalDescription, index);
|
|
67
|
-
resources.push(resource);
|
|
68
|
-
} else if (action.type === "collect") {
|
|
69
|
-
const collectAction = action;
|
|
70
|
-
if (collectAction.destination && typeof collectAction.destination === "object" && "method" in collectAction.destination && (collectAction.destination.method === "POST" || collectAction.destination.method === "PUT" || collectAction.destination.method === "DELETE")) {
|
|
71
|
-
const tool = convertActionToTool(warp, action, finalDescription, hasOutput ? outputSchema : void 0, index);
|
|
72
|
-
tools.push(tool);
|
|
73
|
-
} else {
|
|
74
|
-
const resource = convertActionToResource(warp, action, finalDescription, index);
|
|
75
|
-
resources.push(resource);
|
|
76
|
-
}
|
|
77
|
-
} else if (action.type === "mcp") {
|
|
45
|
+
const actionDescription = extractText(action.description);
|
|
46
|
+
const description = warpDescription || actionDescription;
|
|
47
|
+
if (action.type === "mcp") {
|
|
78
48
|
const mcpAction = action;
|
|
79
49
|
if (mcpAction.destination) {
|
|
80
|
-
const tool = convertMcpActionToTool(
|
|
50
|
+
const tool = convertMcpActionToTool(mcpAction, description);
|
|
81
51
|
tools.push(tool);
|
|
82
52
|
}
|
|
53
|
+
} else {
|
|
54
|
+
const tool = convertActionToTool(warp, action, description, index);
|
|
55
|
+
tools.push(tool);
|
|
83
56
|
}
|
|
84
57
|
});
|
|
85
|
-
return { tools
|
|
58
|
+
return { tools };
|
|
86
59
|
};
|
|
87
|
-
var
|
|
88
|
-
|
|
60
|
+
var extractText = (text) => {
|
|
61
|
+
if (!text) return void 0;
|
|
62
|
+
if (typeof text === "string") return text;
|
|
63
|
+
if (typeof text === "object" && "en" in text) return text.en;
|
|
64
|
+
return void 0;
|
|
89
65
|
};
|
|
90
|
-
var convertActionToTool = (warp, action, description,
|
|
66
|
+
var convertActionToTool = (warp, action, description, index) => {
|
|
91
67
|
const inputSchema = buildInputSchema(action.inputs || []);
|
|
92
68
|
const name = sanitizeMcpName(`${warp.name}_${index}`);
|
|
93
|
-
let url;
|
|
94
|
-
let headers;
|
|
95
|
-
if (action.type === "collect") {
|
|
96
|
-
const collectAction = action;
|
|
97
|
-
if (collectAction.destination && typeof collectAction.destination === "object" && "url" in collectAction.destination) {
|
|
98
|
-
url = collectAction.destination.url;
|
|
99
|
-
headers = collectAction.destination.headers;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return {
|
|
103
|
-
name,
|
|
104
|
-
description,
|
|
105
|
-
inputSchema: Object.keys(inputSchema.properties).length > 0 ? inputSchema : void 0,
|
|
106
|
-
outputSchema,
|
|
107
|
-
url,
|
|
108
|
-
headers
|
|
109
|
-
};
|
|
110
|
-
};
|
|
111
|
-
var convertActionToResource = (warp, action, description, index) => {
|
|
112
|
-
const name = sanitizeMcpName(`${warp.name}_${index}`);
|
|
113
|
-
let uri;
|
|
114
|
-
let mimeType;
|
|
115
|
-
let headers;
|
|
116
|
-
if (action.type === "query") {
|
|
117
|
-
const queryAction = action;
|
|
118
|
-
if (queryAction.address) {
|
|
119
|
-
uri = queryAction.address;
|
|
120
|
-
}
|
|
121
|
-
} else if (action.type === "collect") {
|
|
122
|
-
const collectAction = action;
|
|
123
|
-
if (collectAction.destination) {
|
|
124
|
-
if (typeof collectAction.destination === "string") {
|
|
125
|
-
uri = collectAction.destination;
|
|
126
|
-
} else if (typeof collectAction.destination === "object" && "url" in collectAction.destination) {
|
|
127
|
-
uri = collectAction.destination.url;
|
|
128
|
-
headers = collectAction.destination.headers;
|
|
129
|
-
mimeType = "application/json";
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
69
|
return {
|
|
134
|
-
uri: uri || name,
|
|
135
70
|
name,
|
|
136
71
|
description,
|
|
137
|
-
|
|
138
|
-
headers
|
|
72
|
+
inputSchema: hasProperties(inputSchema) ? inputSchema : void 0
|
|
139
73
|
};
|
|
140
74
|
};
|
|
141
|
-
var convertMcpActionToTool = (
|
|
75
|
+
var convertMcpActionToTool = (action, description) => {
|
|
142
76
|
const inputSchema = buildInputSchema(action.inputs || []);
|
|
143
|
-
const
|
|
77
|
+
const toolName = action.destination.tool;
|
|
144
78
|
return {
|
|
145
79
|
name: sanitizeMcpName(toolName),
|
|
146
80
|
description,
|
|
147
|
-
inputSchema:
|
|
148
|
-
outputSchema,
|
|
149
|
-
url,
|
|
150
|
-
headers
|
|
81
|
+
inputSchema: hasProperties(inputSchema) ? inputSchema : void 0
|
|
151
82
|
};
|
|
152
83
|
};
|
|
153
84
|
var buildInputSchema = (inputs) => {
|
|
154
|
-
const
|
|
85
|
+
const schema = {
|
|
155
86
|
type: "object",
|
|
156
87
|
properties: {},
|
|
157
88
|
required: []
|
|
158
89
|
};
|
|
159
90
|
inputs.forEach((input) => {
|
|
160
|
-
if (input
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
if (jsonSchemaType.format) {
|
|
167
|
-
property.format = jsonSchemaType.format;
|
|
168
|
-
}
|
|
169
|
-
if (input.label && typeof input.label === "object" && "en" in input.label) {
|
|
170
|
-
property.title = input.label.en;
|
|
171
|
-
}
|
|
172
|
-
if (input.description && typeof input.description === "object" && "en" in input.description) {
|
|
173
|
-
property.description = input.description.en;
|
|
174
|
-
}
|
|
175
|
-
if (input.default !== void 0) {
|
|
176
|
-
property.default = input.default;
|
|
177
|
-
}
|
|
178
|
-
inputSchema.properties[key] = property;
|
|
179
|
-
if (input.required) {
|
|
180
|
-
inputSchema.required.push(key);
|
|
181
|
-
}
|
|
91
|
+
if (!isPayloadInput(input)) return;
|
|
92
|
+
const key = extractPayloadKey(input.position);
|
|
93
|
+
const property = buildPropertySchema(input);
|
|
94
|
+
schema.properties[key] = property;
|
|
95
|
+
if (input.required) {
|
|
96
|
+
schema.required.push(key);
|
|
182
97
|
}
|
|
183
98
|
});
|
|
184
|
-
return
|
|
99
|
+
return schema;
|
|
100
|
+
};
|
|
101
|
+
var isPayloadInput = (input) => {
|
|
102
|
+
return typeof input.position === "string" && input.position.startsWith("payload:");
|
|
103
|
+
};
|
|
104
|
+
var extractPayloadKey = (position) => {
|
|
105
|
+
return position.replace("payload:", "");
|
|
106
|
+
};
|
|
107
|
+
var buildPropertySchema = (input) => {
|
|
108
|
+
const jsonSchemaType = convertWarpTypeToJsonSchemaType(input.type);
|
|
109
|
+
const property = {
|
|
110
|
+
type: jsonSchemaType.type
|
|
111
|
+
};
|
|
112
|
+
if (jsonSchemaType.format) {
|
|
113
|
+
property.format = jsonSchemaType.format;
|
|
114
|
+
}
|
|
115
|
+
const title = extractText(input.label) || input.name;
|
|
116
|
+
if (title) {
|
|
117
|
+
property.title = title;
|
|
118
|
+
}
|
|
119
|
+
const description = buildDescription(input);
|
|
120
|
+
if (description) {
|
|
121
|
+
property.description = description;
|
|
122
|
+
}
|
|
123
|
+
if (input.default !== void 0) {
|
|
124
|
+
property.default = input.default;
|
|
125
|
+
}
|
|
126
|
+
if (typeof input.min === "number") {
|
|
127
|
+
property.minimum = input.min;
|
|
128
|
+
}
|
|
129
|
+
if (typeof input.max === "number") {
|
|
130
|
+
property.maximum = input.max;
|
|
131
|
+
}
|
|
132
|
+
if (input.pattern) {
|
|
133
|
+
property.pattern = input.pattern;
|
|
134
|
+
}
|
|
135
|
+
const enumValues = extractEnumValues(input.options);
|
|
136
|
+
if (enumValues) {
|
|
137
|
+
property.enum = enumValues;
|
|
138
|
+
}
|
|
139
|
+
return property;
|
|
140
|
+
};
|
|
141
|
+
var buildDescription = (input) => {
|
|
142
|
+
const description = extractText(input.description);
|
|
143
|
+
const patternDesc = extractText(input.patternDescription);
|
|
144
|
+
if (!description && !patternDesc) return void 0;
|
|
145
|
+
if (description && patternDesc) return `${description}. ${patternDesc}`;
|
|
146
|
+
return description || patternDesc;
|
|
147
|
+
};
|
|
148
|
+
var extractEnumValues = (options) => {
|
|
149
|
+
if (!options) return void 0;
|
|
150
|
+
if (Array.isArray(options)) return options;
|
|
151
|
+
if (typeof options === "object") return Object.keys(options);
|
|
152
|
+
return void 0;
|
|
153
|
+
};
|
|
154
|
+
var hasProperties = (schema) => {
|
|
155
|
+
return schema && schema.properties && Object.keys(schema.properties).length > 0;
|
|
156
|
+
};
|
|
157
|
+
var sanitizeMcpName = (name) => {
|
|
158
|
+
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, "_");
|
|
185
159
|
};
|
|
186
160
|
var convertJsonSchemaTypeToWarpType = (type, format) => {
|
|
187
161
|
if (format === "date-time" || format === "date") return "string";
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helpers/warps.ts","../src/WarpMcp.ts"],"sourcesContent":["import {\n Warp,\n WarpActionInput,\n WarpActionInputType,\n WarpBuilder,\n WarpClientConfig,\n WarpCollectAction,\n WarpContractAction,\n WarpMcpAction,\n WarpQueryAction,\n WarpTransferAction,\n} from '@vleap/warps'\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 && 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 && tool.outputSchema.properties) {\n const properties = tool.outputSchema.properties\n Object.keys(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 resources: any[] = []\n\n const description = warp.description && typeof warp.description === 'object' && 'en' in warp.description ? warp.description.en : undefined\n\n const outputSchema: any = {\n type: 'object',\n properties: {},\n }\n\n if (warp.output && Object.keys(warp.output).length > 0) {\n Object.keys(warp.output).forEach((key) => {\n outputSchema.properties[key] = {\n type: 'string',\n description: `Output field ${key}`,\n }\n })\n }\n\n const hasOutput = Object.keys(outputSchema.properties).length > 0\n\n warp.actions.forEach((action, index) => {\n const actionDescription =\n action.description && typeof action.description === 'object' && 'en' in action.description ? action.description.en : undefined\n\n const finalDescription = description || actionDescription || undefined\n\n if (action.type === 'transfer' || action.type === 'contract') {\n const tool = convertActionToTool(warp, action, finalDescription, hasOutput ? outputSchema : undefined, index)\n tools.push(tool)\n } else if (action.type === 'query') {\n const resource = convertActionToResource(warp, action, finalDescription, index)\n resources.push(resource)\n } else if (action.type === 'collect') {\n const collectAction = action as WarpCollectAction\n if (\n collectAction.destination &&\n typeof collectAction.destination === 'object' &&\n 'method' in collectAction.destination &&\n (collectAction.destination.method === 'POST' ||\n collectAction.destination.method === 'PUT' ||\n collectAction.destination.method === 'DELETE')\n ) {\n const tool = convertActionToTool(warp, action, finalDescription, hasOutput ? outputSchema : undefined, index)\n tools.push(tool)\n } else {\n const resource = convertActionToResource(warp, action, finalDescription, index)\n resources.push(resource)\n }\n } else if (action.type === 'mcp') {\n const mcpAction = action as WarpMcpAction\n if (mcpAction.destination) {\n const tool = convertMcpActionToTool(warp, mcpAction, finalDescription, hasOutput ? outputSchema : undefined)\n tools.push(tool)\n }\n }\n })\n\n return { tools, resources }\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 convertActionToTool = (\n warp: Warp,\n action: WarpTransferAction | WarpContractAction | WarpCollectAction,\n description: string | undefined,\n outputSchema: any | undefined,\n index: number\n): any => {\n const inputSchema = buildInputSchema(action.inputs || [])\n const name = sanitizeMcpName(`${warp.name}_${index}`)\n\n let url: string | undefined\n let headers: Record<string, string> | undefined\n\n if (action.type === 'collect') {\n const collectAction = action as WarpCollectAction\n if (collectAction.destination && typeof collectAction.destination === 'object' && 'url' in collectAction.destination) {\n url = collectAction.destination.url\n headers = collectAction.destination.headers\n }\n }\n\n return {\n name,\n description,\n inputSchema: Object.keys(inputSchema.properties).length > 0 ? inputSchema : undefined,\n outputSchema,\n url,\n headers,\n }\n}\n\nconst convertActionToResource = (\n warp: Warp,\n action: WarpQueryAction | WarpCollectAction,\n description: string | undefined,\n index: number\n): any => {\n const name = sanitizeMcpName(`${warp.name}_${index}`)\n let uri: string | undefined\n let mimeType: string | undefined\n let headers: Record<string, string> | undefined\n\n if (action.type === 'query') {\n const queryAction = action as WarpQueryAction\n if (queryAction.address) {\n uri = queryAction.address\n }\n } else if (action.type === 'collect') {\n const collectAction = action as WarpCollectAction\n if (collectAction.destination) {\n if (typeof collectAction.destination === 'string') {\n uri = collectAction.destination\n } else if (typeof collectAction.destination === 'object' && 'url' in collectAction.destination) {\n uri = collectAction.destination.url\n headers = collectAction.destination.headers\n mimeType = 'application/json'\n }\n }\n }\n\n return {\n uri: uri || name,\n name,\n description,\n mimeType,\n headers,\n }\n}\n\nconst convertMcpActionToTool = (warp: Warp, action: WarpMcpAction, description: string | undefined, outputSchema: any | undefined): any => {\n const inputSchema = buildInputSchema(action.inputs || [])\n const { url, tool: toolName, headers } = action.destination!\n\n return {\n name: sanitizeMcpName(toolName),\n description,\n inputSchema: Object.keys(inputSchema.properties).length > 0 ? inputSchema : undefined,\n outputSchema,\n url,\n headers,\n }\n}\n\nconst buildInputSchema = (inputs: WarpActionInput[]): any => {\n const inputSchema: any = {\n type: 'object',\n properties: {},\n required: [],\n }\n\n inputs.forEach((input) => {\n if (input.position && typeof input.position === 'string' && input.position.startsWith('payload:')) {\n const key = input.position.replace('payload:', '')\n const jsonSchemaType = convertWarpTypeToJsonSchemaType(input.type)\n\n const property: any = {\n type: jsonSchemaType.type,\n }\n\n if (jsonSchemaType.format) {\n property.format = jsonSchemaType.format\n }\n\n if (input.label && typeof input.label === 'object' && 'en' in input.label) {\n property.title = input.label.en\n }\n\n if (input.description && typeof input.description === 'object' && 'en' in input.description) {\n property.description = input.description.en\n }\n\n if (input.default !== undefined) {\n property.default = input.default\n }\n\n inputSchema.properties[key] = property\n\n if (input.required) {\n inputSchema.required.push(key)\n }\n }\n })\n\n return inputSchema\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\nconst convertWarpTypeToJsonSchemaType = (warpType: string): { type: string; format?: string } => {\n if (warpType === 'string') return { type: 'string' }\n if (warpType === 'bool') return { type: 'boolean' }\n if (\n warpType === 'uint8' ||\n warpType === 'uint16' ||\n warpType === 'uint32' ||\n warpType === 'uint64' ||\n warpType === 'uint128' ||\n warpType === 'uint256' ||\n warpType === 'biguint'\n ) {\n return { type: 'integer' }\n }\n if (warpType === 'number') return { type: 'number' }\n return { type: 'string' }\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/helpers/warps.ts","../src/WarpMcp.ts"],"sourcesContent":["import {\n Warp,\n WarpActionInput,\n WarpActionInputType,\n WarpBuilder,\n WarpClientConfig,\n WarpCollectAction,\n WarpContractAction,\n WarpMcpAction,\n WarpQueryAction,\n WarpText,\n WarpTransferAction,\n} from '@vleap/warps'\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[] } => {\n const tools: any[] = []\n const warpDescription = extractText(warp.description)\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)\n tools.push(tool)\n }\n } else {\n const tool = convertActionToTool(warp, action, description, index)\n tools.push(tool)\n }\n })\n\n return { tools }\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 convertActionToTool = (\n warp: Warp,\n action: WarpTransferAction | WarpContractAction | WarpCollectAction | WarpQueryAction,\n description: string | undefined,\n index: number\n): any => {\n const inputSchema = buildInputSchema(action.inputs || [])\n const name = sanitizeMcpName(`${warp.name}_${index}`)\n\n return {\n name,\n description,\n inputSchema: hasProperties(inputSchema) ? inputSchema : undefined,\n }\n}\n\nconst convertMcpActionToTool = (action: WarpMcpAction, description: string | undefined): any => {\n const inputSchema = buildInputSchema(action.inputs || [])\n const toolName = action.destination!.tool\n\n return {\n name: sanitizeMcpName(toolName),\n description,\n inputSchema: hasProperties(inputSchema) ? inputSchema : undefined,\n }\n}\n\nconst buildInputSchema = (inputs: WarpActionInput[]): any => {\n const schema: any = {\n type: 'object',\n properties: {},\n required: [],\n }\n\n inputs.forEach((input) => {\n if (!isPayloadInput(input)) return\n\n const key = extractPayloadKey(input.position as string)\n const property = buildPropertySchema(input)\n\n schema.properties[key] = property\n\n if (input.required) {\n schema.required.push(key)\n }\n })\n\n return schema\n}\n\nconst isPayloadInput = (input: WarpActionInput): boolean => {\n return typeof input.position === 'string' && input.position.startsWith('payload:')\n}\n\nconst extractPayloadKey = (position: string): string => {\n return position.replace('payload:', '')\n}\n\nconst buildPropertySchema = (input: WarpActionInput): any => {\n const jsonSchemaType = convertWarpTypeToJsonSchemaType(input.type)\n const property: any = {\n type: jsonSchemaType.type,\n }\n\n if (jsonSchemaType.format) {\n property.format = jsonSchemaType.format\n }\n\n const title = extractText(input.label) || input.name\n if (title) {\n property.title = title\n }\n\n const description = buildDescription(input)\n if (description) {\n property.description = description\n }\n\n if (input.default !== undefined) {\n property.default = input.default\n }\n\n if (typeof input.min === 'number') {\n property.minimum = input.min\n }\n\n if (typeof input.max === 'number') {\n property.maximum = input.max\n }\n\n if (input.pattern) {\n property.pattern = input.pattern\n }\n\n const enumValues = extractEnumValues(input.options)\n if (enumValues) {\n property.enum = enumValues\n }\n\n return property\n}\n\nconst buildDescription = (input: WarpActionInput): string | undefined => {\n const description = extractText(input.description)\n const patternDesc = extractText(input.patternDescription)\n\n if (!description && !patternDesc) return undefined\n if (description && patternDesc) return `${description}. ${patternDesc}`\n return description || patternDesc\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 hasProperties = (schema: any): boolean => {\n return schema && schema.properties && Object.keys(schema.properties).length > 0\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\nconst convertWarpTypeToJsonSchemaType = (warpType: string): { type: string; format?: string } => {\n if (warpType === 'string') return { type: 'string' }\n if (warpType === 'bool') return { type: 'boolean' }\n if (\n warpType === 'uint8' ||\n warpType === 'uint16' ||\n warpType === 'uint32' ||\n warpType === 'uint64' ||\n warpType === 'uint128' ||\n warpType === 'uint256' ||\n warpType === 'biguint'\n ) {\n return { type: 'integer' }\n }\n if (warpType === 'number') return { type: 'number' }\n return { type: 'string' }\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\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":[]}
|