@vleap/warps-mcp 1.0.0-beta.5 → 1.0.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -110,9 +110,12 @@ var convertWarpToMcpCapabilities = (warp) => {
110
110
  });
111
111
  return { tools, resources };
112
112
  };
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, "_");
115
+ };
113
116
  var convertActionToTool = (warp, action, description, outputSchema, index) => {
114
117
  const inputSchema = buildInputSchema(action.inputs || []);
115
- const name = `${warp.name}_${index}`;
118
+ const name = sanitizeMcpName(`${warp.name}_${index}`);
116
119
  let url;
117
120
  let headers;
118
121
  if (action.type === "collect") {
@@ -132,7 +135,7 @@ var convertActionToTool = (warp, action, description, outputSchema, index) => {
132
135
  };
133
136
  };
134
137
  var convertActionToResource = (warp, action, description, index) => {
135
- const name = `${warp.name}_${index}`;
138
+ const name = sanitizeMcpName(`${warp.name}_${index}`);
136
139
  let uri;
137
140
  let mimeType;
138
141
  let headers;
@@ -165,7 +168,7 @@ var convertMcpActionToTool = (warp, action, description, outputSchema) => {
165
168
  const inputSchema = buildInputSchema(action.inputs || []);
166
169
  const { url, tool: toolName, headers } = action.destination;
167
170
  return {
168
- name: toolName,
171
+ name: sanitizeMcpName(toolName),
169
172
  description,
170
173
  inputSchema: Object.keys(inputSchema.properties).length > 0 ? inputSchema : void 0,
171
174
  outputSchema,
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 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 = `${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 = `${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: 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 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;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAWO;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,yBAAY,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,oBAAuB;AACvB,4BAA8C;AAIvC,IAAM,UAAN,MAAc;AAAA,EACnB,YAA6B,QAA0B;AAA1B;AAAA,EAA2B;AAAA,EAExD,MAAM,kBAAkB,KAAa,SAAmD;AACtF,UAAM,YAAY,IAAI,oDAA8B,IAAI,IAAI,GAAG,GAAG;AAAA,MAChE,aAAa,EAAE,SAAS,WAAW,CAAC,EAAE;AAAA,IACxC,CAAC;AAED,UAAM,SAAS,IAAI,qBAAO,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":[]}
package/dist/index.mjs CHANGED
@@ -84,9 +84,12 @@ var convertWarpToMcpCapabilities = (warp) => {
84
84
  });
85
85
  return { tools, resources };
86
86
  };
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, "_");
89
+ };
87
90
  var convertActionToTool = (warp, action, description, outputSchema, index) => {
88
91
  const inputSchema = buildInputSchema(action.inputs || []);
89
- const name = `${warp.name}_${index}`;
92
+ const name = sanitizeMcpName(`${warp.name}_${index}`);
90
93
  let url;
91
94
  let headers;
92
95
  if (action.type === "collect") {
@@ -106,7 +109,7 @@ var convertActionToTool = (warp, action, description, outputSchema, index) => {
106
109
  };
107
110
  };
108
111
  var convertActionToResource = (warp, action, description, index) => {
109
- const name = `${warp.name}_${index}`;
112
+ const name = sanitizeMcpName(`${warp.name}_${index}`);
110
113
  let uri;
111
114
  let mimeType;
112
115
  let headers;
@@ -139,7 +142,7 @@ var convertMcpActionToTool = (warp, action, description, outputSchema) => {
139
142
  const inputSchema = buildInputSchema(action.inputs || []);
140
143
  const { url, tool: toolName, headers } = action.destination;
141
144
  return {
142
- name: toolName,
145
+ name: sanitizeMcpName(toolName),
143
146
  description,
144
147
  inputSchema: Object.keys(inputSchema.properties).length > 0 ? inputSchema : void 0,
145
148
  outputSchema,
@@ -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 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 = `${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 = `${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: 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 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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vleap/warps-mcp",
3
- "version": "1.0.0-beta.5",
3
+ "version": "1.0.0-beta.6",
4
4
  "description": "MCP adapter for Warps SDK",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",