@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 +6 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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":"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","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,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helpers/warps.ts","../src/WarpMcp.ts"],"sourcesContent":["import {\n Warp,\n WarpActionInput,\n WarpActionInputType,\n WarpBuilder,\n WarpClientConfig,\n WarpCollectAction,\n WarpContractAction,\n WarpMcpAction,\n WarpQueryAction,\n WarpTransferAction,\n} from '@vleap/warps'\n\nexport const convertMcpToolToWarp = async (\n config: WarpClientConfig,\n tool: { name: string; description?: string; inputSchema?: any; outputSchema?: any },\n url: string,\n headers?: Record<string, string>\n): Promise<Warp> => {\n const inputs: WarpActionInput[] = []\n\n if (tool.inputSchema && tool.inputSchema.properties) {\n const properties = tool.inputSchema.properties\n const required = tool.inputSchema.required || []\n\n Object.entries(properties).forEach(([key, value]: [string, any]) => {\n const isRequired = required.includes(key)\n const inputType = convertJsonSchemaTypeToWarpType(value.type, value.format)\n\n const inputDef: WarpActionInput = {\n name: key,\n label: value.title || { en: key },\n description: value.description ? { en: value.description.trim() } : null,\n type: inputType,\n position: `payload:${key}`,\n source: 'field',\n required: isRequired,\n default: value.default,\n }\n\n inputs.push(inputDef)\n })\n }\n\n const output: Record<string, string> = {}\n if (tool.outputSchema && tool.outputSchema.properties) {\n const properties = tool.outputSchema.properties\n Object.keys(properties).forEach((key) => {\n output[key] = `out.${key}`\n })\n }\n\n const mcpAction: WarpMcpAction = {\n type: 'mcp',\n label: { en: tool.name },\n description: tool.description ? { en: tool.description.trim() } : null,\n destination: { url, tool: tool.name, headers },\n inputs,\n }\n\n return await new WarpBuilder(config)\n .setName(tool.name)\n .setTitle({ en: tool.name })\n .setDescription(tool.description ? { en: tool.description.trim() } : null)\n .addAction(mcpAction)\n .setOutput(Object.keys(output).length > 0 ? output : null)\n .build(false)\n}\n\nexport const convertWarpToMcpCapabilities = (warp: Warp): { tools: any[]; resources: any[] } => {\n const tools: any[] = []\n const resources: any[] = []\n\n const description = warp.description && typeof warp.description === 'object' && 'en' in warp.description ? warp.description.en : undefined\n\n const outputSchema: any = {\n type: 'object',\n properties: {},\n }\n\n if (warp.output && Object.keys(warp.output).length > 0) {\n Object.keys(warp.output).forEach((key) => {\n outputSchema.properties[key] = {\n type: 'string',\n description: `Output field ${key}`,\n }\n })\n }\n\n const hasOutput = Object.keys(outputSchema.properties).length > 0\n\n warp.actions.forEach((action, index) => {\n const actionDescription =\n action.description && typeof action.description === 'object' && 'en' in action.description ? action.description.en : undefined\n\n const finalDescription = description || actionDescription || undefined\n\n if (action.type === 'transfer' || action.type === 'contract') {\n const tool = convertActionToTool(warp, action, finalDescription, hasOutput ? outputSchema : undefined, index)\n tools.push(tool)\n } else if (action.type === 'query') {\n const resource = convertActionToResource(warp, action, finalDescription, index)\n resources.push(resource)\n } else if (action.type === 'collect') {\n const collectAction = action as WarpCollectAction\n if (\n collectAction.destination &&\n typeof collectAction.destination === 'object' &&\n 'method' in collectAction.destination &&\n (collectAction.destination.method === 'POST' ||\n collectAction.destination.method === 'PUT' ||\n collectAction.destination.method === 'DELETE')\n ) {\n const tool = convertActionToTool(warp, action, finalDescription, hasOutput ? outputSchema : undefined, index)\n tools.push(tool)\n } else {\n const resource = convertActionToResource(warp, action, finalDescription, index)\n resources.push(resource)\n }\n } else if (action.type === 'mcp') {\n const mcpAction = action as WarpMcpAction\n if (mcpAction.destination) {\n const tool = convertMcpActionToTool(warp, mcpAction, finalDescription, hasOutput ? outputSchema : undefined)\n tools.push(tool)\n }\n }\n })\n\n return { tools, resources }\n}\n\nconst 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":[]}
|