@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 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 && tool.inputSchema.properties) {
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 && tool.outputSchema.properties) {
54
- const properties = tool.outputSchema.properties;
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 resources = [];
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 && typeof action.description === "object" && "en" in action.description ? action.description.en : void 0;
87
- const finalDescription = description || actionDescription || void 0;
88
- if (action.type === "transfer" || action.type === "contract") {
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(warp, mcpAction, finalDescription, hasOutput ? outputSchema : void 0);
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, resources };
84
+ return { tools };
112
85
  };
113
- var sanitizeMcpName = (name) => {
114
- 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, "_");
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, outputSchema, index) => {
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
- mimeType,
164
- headers
98
+ inputSchema: hasProperties(inputSchema) ? inputSchema : void 0
165
99
  };
166
100
  };
167
- var convertMcpActionToTool = (warp, action, description, outputSchema) => {
101
+ var convertMcpActionToTool = (action, description) => {
168
102
  const inputSchema = buildInputSchema(action.inputs || []);
169
- const { url, tool: toolName, headers } = action.destination;
103
+ const toolName = action.destination.tool;
170
104
  return {
171
105
  name: sanitizeMcpName(toolName),
172
106
  description,
173
- inputSchema: Object.keys(inputSchema.properties).length > 0 ? inputSchema : void 0,
174
- outputSchema,
175
- url,
176
- headers
107
+ inputSchema: hasProperties(inputSchema) ? inputSchema : void 0
177
108
  };
178
109
  };
179
110
  var buildInputSchema = (inputs) => {
180
- const inputSchema = {
111
+ const schema = {
181
112
  type: "object",
182
113
  properties: {},
183
114
  required: []
184
115
  };
185
116
  inputs.forEach((input) => {
186
- if (input.position && typeof input.position === "string" && input.position.startsWith("payload:")) {
187
- const key = input.position.replace("payload:", "");
188
- const jsonSchemaType = convertWarpTypeToJsonSchemaType(input.type);
189
- const property = {
190
- type: jsonSchemaType.type
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 inputSchema;
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 && tool.inputSchema.properties) {
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 && tool.outputSchema.properties) {
28
- const properties = tool.outputSchema.properties;
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 resources = [];
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 && typeof action.description === "object" && "en" in action.description ? action.description.en : void 0;
61
- const finalDescription = description || actionDescription || void 0;
62
- if (action.type === "transfer" || action.type === "contract") {
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(warp, mcpAction, finalDescription, hasOutput ? outputSchema : void 0);
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, resources };
58
+ return { tools };
86
59
  };
87
- var sanitizeMcpName = (name) => {
88
- 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, "_");
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, outputSchema, index) => {
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
- mimeType,
138
- headers
72
+ inputSchema: hasProperties(inputSchema) ? inputSchema : void 0
139
73
  };
140
74
  };
141
- var convertMcpActionToTool = (warp, action, description, outputSchema) => {
75
+ var convertMcpActionToTool = (action, description) => {
142
76
  const inputSchema = buildInputSchema(action.inputs || []);
143
- const { url, tool: toolName, headers } = action.destination;
77
+ const toolName = action.destination.tool;
144
78
  return {
145
79
  name: sanitizeMcpName(toolName),
146
80
  description,
147
- inputSchema: Object.keys(inputSchema.properties).length > 0 ? inputSchema : void 0,
148
- outputSchema,
149
- url,
150
- headers
81
+ inputSchema: hasProperties(inputSchema) ? inputSchema : void 0
151
82
  };
152
83
  };
153
84
  var buildInputSchema = (inputs) => {
154
- const inputSchema = {
85
+ const schema = {
155
86
  type: "object",
156
87
  properties: {},
157
88
  required: []
158
89
  };
159
90
  inputs.forEach((input) => {
160
- if (input.position && typeof input.position === "string" && input.position.startsWith("payload:")) {
161
- const key = input.position.replace("payload:", "");
162
- const jsonSchemaType = convertWarpTypeToJsonSchemaType(input.type);
163
- const property = {
164
- type: jsonSchemaType.type
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 inputSchema;
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";
@@ -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":";AAAA;AAAA,EAIE;AAAA,OAOK;AAEA,IAAM,uBAAuB,OAClC,QACA,MACA,KACA,YACkB;AAClB,QAAM,SAA4B,CAAC;AAEnC,MAAI,KAAK,eAAe,KAAK,YAAY,YAAY;AACnD,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,gBAAgB,KAAK,aAAa,YAAY;AACrD,UAAM,aAAa,KAAK,aAAa;AACrC,WAAO,KAAK,UAAU,EAAE,QAAQ,CAAC,QAAQ;AACvC,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,SAAmD;AAC9F,QAAM,QAAe,CAAC;AACtB,QAAM,YAAmB,CAAC;AAE1B,QAAM,cAAc,KAAK,eAAe,OAAO,KAAK,gBAAgB,YAAY,QAAQ,KAAK,cAAc,KAAK,YAAY,KAAK;AAEjI,QAAM,eAAoB;AAAA,IACxB,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,EACf;AAEA,MAAI,KAAK,UAAU,OAAO,KAAK,KAAK,MAAM,EAAE,SAAS,GAAG;AACtD,WAAO,KAAK,KAAK,MAAM,EAAE,QAAQ,CAAC,QAAQ;AACxC,mBAAa,WAAW,GAAG,IAAI;AAAA,QAC7B,MAAM;AAAA,QACN,aAAa,gBAAgB,GAAG;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,OAAO,KAAK,aAAa,UAAU,EAAE,SAAS;AAEhE,OAAK,QAAQ,QAAQ,CAAC,QAAQ,UAAU;AACtC,UAAM,oBACJ,OAAO,eAAe,OAAO,OAAO,gBAAgB,YAAY,QAAQ,OAAO,cAAc,OAAO,YAAY,KAAK;AAEvH,UAAM,mBAAmB,eAAe,qBAAqB;AAE7D,QAAI,OAAO,SAAS,cAAc,OAAO,SAAS,YAAY;AAC5D,YAAM,OAAO,oBAAoB,MAAM,QAAQ,kBAAkB,YAAY,eAAe,QAAW,KAAK;AAC5G,YAAM,KAAK,IAAI;AAAA,IACjB,WAAW,OAAO,SAAS,SAAS;AAClC,YAAM,WAAW,wBAAwB,MAAM,QAAQ,kBAAkB,KAAK;AAC9E,gBAAU,KAAK,QAAQ;AAAA,IACzB,WAAW,OAAO,SAAS,WAAW;AACpC,YAAM,gBAAgB;AACtB,UACE,cAAc,eACd,OAAO,cAAc,gBAAgB,YACrC,YAAY,cAAc,gBACzB,cAAc,YAAY,WAAW,UACpC,cAAc,YAAY,WAAW,SACrC,cAAc,YAAY,WAAW,WACvC;AACA,cAAM,OAAO,oBAAoB,MAAM,QAAQ,kBAAkB,YAAY,eAAe,QAAW,KAAK;AAC5G,cAAM,KAAK,IAAI;AAAA,MACjB,OAAO;AACL,cAAM,WAAW,wBAAwB,MAAM,QAAQ,kBAAkB,KAAK;AAC9E,kBAAU,KAAK,QAAQ;AAAA,MACzB;AAAA,IACF,WAAW,OAAO,SAAS,OAAO;AAChC,YAAM,YAAY;AAClB,UAAI,UAAU,aAAa;AACzB,cAAM,OAAO,uBAAuB,MAAM,WAAW,kBAAkB,YAAY,eAAe,MAAS;AAC3G,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,EAAE,OAAO,UAAU;AAC5B;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,sBAAsB,CAC1B,MACA,QACA,aACA,cACA,UACQ;AACR,QAAM,cAAc,iBAAiB,OAAO,UAAU,CAAC,CAAC;AACxD,QAAM,OAAO,gBAAgB,GAAG,KAAK,IAAI,IAAI,KAAK,EAAE;AAEpD,MAAI;AACJ,MAAI;AAEJ,MAAI,OAAO,SAAS,WAAW;AAC7B,UAAM,gBAAgB;AACtB,QAAI,cAAc,eAAe,OAAO,cAAc,gBAAgB,YAAY,SAAS,cAAc,aAAa;AACpH,YAAM,cAAc,YAAY;AAChC,gBAAU,cAAc,YAAY;AAAA,IACtC;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,OAAO,KAAK,YAAY,UAAU,EAAE,SAAS,IAAI,cAAc;AAAA,IAC5E;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,0BAA0B,CAC9B,MACA,QACA,aACA,UACQ;AACR,QAAM,OAAO,gBAAgB,GAAG,KAAK,IAAI,IAAI,KAAK,EAAE;AACpD,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,MAAI,OAAO,SAAS,SAAS;AAC3B,UAAM,cAAc;AACpB,QAAI,YAAY,SAAS;AACvB,YAAM,YAAY;AAAA,IACpB;AAAA,EACF,WAAW,OAAO,SAAS,WAAW;AACpC,UAAM,gBAAgB;AACtB,QAAI,cAAc,aAAa;AAC7B,UAAI,OAAO,cAAc,gBAAgB,UAAU;AACjD,cAAM,cAAc;AAAA,MACtB,WAAW,OAAO,cAAc,gBAAgB,YAAY,SAAS,cAAc,aAAa;AAC9F,cAAM,cAAc,YAAY;AAChC,kBAAU,cAAc,YAAY;AACpC,mBAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,yBAAyB,CAAC,MAAY,QAAuB,aAAiC,iBAAuC;AACzI,QAAM,cAAc,iBAAiB,OAAO,UAAU,CAAC,CAAC;AACxD,QAAM,EAAE,KAAK,MAAM,UAAU,QAAQ,IAAI,OAAO;AAEhD,SAAO;AAAA,IACL,MAAM,gBAAgB,QAAQ;AAAA,IAC9B;AAAA,IACA,aAAa,OAAO,KAAK,YAAY,UAAU,EAAE,SAAS,IAAI,cAAc;AAAA,IAC5E;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,mBAAmB,CAAC,WAAmC;AAC3D,QAAM,cAAmB;AAAA,IACvB,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,UAAU,CAAC;AAAA,EACb;AAEA,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,MAAM,YAAY,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,WAAW,UAAU,GAAG;AACjG,YAAM,MAAM,MAAM,SAAS,QAAQ,YAAY,EAAE;AACjD,YAAM,iBAAiB,gCAAgC,MAAM,IAAI;AAEjE,YAAM,WAAgB;AAAA,QACpB,MAAM,eAAe;AAAA,MACvB;AAEA,UAAI,eAAe,QAAQ;AACzB,iBAAS,SAAS,eAAe;AAAA,MACnC;AAEA,UAAI,MAAM,SAAS,OAAO,MAAM,UAAU,YAAY,QAAQ,MAAM,OAAO;AACzE,iBAAS,QAAQ,MAAM,MAAM;AAAA,MAC/B;AAEA,UAAI,MAAM,eAAe,OAAO,MAAM,gBAAgB,YAAY,QAAQ,MAAM,aAAa;AAC3F,iBAAS,cAAc,MAAM,YAAY;AAAA,MAC3C;AAEA,UAAI,MAAM,YAAY,QAAW;AAC/B,iBAAS,UAAU,MAAM;AAAA,MAC3B;AAEA,kBAAY,WAAW,GAAG,IAAI;AAE9B,UAAI,MAAM,UAAU;AAClB,oBAAY,SAAS,KAAK,GAAG;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;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;AAEA,IAAM,kCAAkC,CAAC,aAAwD;AAC/F,MAAI,aAAa,SAAU,QAAO,EAAE,MAAM,SAAS;AACnD,MAAI,aAAa,OAAQ,QAAO,EAAE,MAAM,UAAU;AAClD,MACE,aAAa,WACb,aAAa,YACb,aAAa,YACb,aAAa,YACb,aAAa,aACb,aAAa,aACb,aAAa,WACb;AACA,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AACA,MAAI,aAAa,SAAU,QAAO,EAAE,MAAM,SAAS;AACnD,SAAO,EAAE,MAAM,SAAS;AAC1B;;;ACrSA,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":[]}
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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vleap/warps-mcp",
3
- "version": "1.0.0-beta.6",
3
+ "version": "1.0.0-beta.8",
4
4
  "description": "MCP adapter for Warps SDK",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",