@joai/warps-mcp 1.0.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var T=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var D=(r,e)=>{for(var n in e)T(r,n,{get:e[n],enumerable:!0})},J=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of N(e))!U.call(r,i)&&i!==n&&T(r,i,{get:()=>e[i],enumerable:!(t=k(e,i))||t.enumerable});return r};var F=r=>J(T({},"__esModule",{value:!0}),r);var nr={};D(nr,{WarpMcp:()=>
|
|
1
|
+
"use strict";var T=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var D=(r,e)=>{for(var n in e)T(r,n,{get:e[n],enumerable:!0})},J=(r,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of N(e))!U.call(r,i)&&i!==n&&T(r,i,{get:()=>e[i],enumerable:!(t=k(e,i))||t.enumerable});return r};var F=r=>J(T({},"__esModule",{value:!0}),r);var nr={};D(nr,{WarpMcp:()=>w,buildZodInputSchema:()=>M,convertActionToTool:()=>h,convertMcpActionToTool:()=>C,convertMcpArgsToWarpInputs:()=>A,convertMcpToolToWarp:()=>P,convertPromptActionToPrompt:()=>R,convertWarpToMcpCapabilities:()=>Z,convertWarpsToMcpCapabilities:()=>Y,createAppResource:()=>x,createMcpServerFromWarps:()=>tr,extractTextOrUndefined:()=>l,interpolatePromptWithArgs:()=>S});module.exports=F(nr);var z=require("@joai/warps"),A=(r,e)=>{let{action:n}=(0,z.getWarpPrimaryAction)(r);return n.inputs?n.inputs.map(t=>{let i=t.as||t.name,o=e[i]??t.default??null;return o===null&&t.type==="bool"?"false":o==null?"":String(o)}):[]};var d=require("@joai/warps");var I=require("@joai/warps"),m=require("zod");var L=r=>{if(r){if(Array.isArray(r))return r;if(typeof r=="object")return Object.keys(r)}},V=(r,e)=>{let n,t=r.type.toLowerCase();t==="string"||t==="address"||t==="hex"?n=m.z.string():t==="number"||t==="uint8"||t==="uint16"||t==="uint32"||t==="uint64"||t==="uint128"||t==="uint256"?n=m.z.number():t==="bool"||t==="boolean"?n=m.z.boolean():t==="biguint"?n=m.z.string():n=m.z.string(),typeof r.min=="number"&&n instanceof m.z.ZodNumber&&(n=n.min(r.min)),typeof r.max=="number"&&n instanceof m.z.ZodNumber&&(n=n.max(r.max)),r.pattern&&n instanceof m.z.ZodString&&(n=n.regex(new RegExp(r.pattern)));let i=L(r.options);if(i&&i.length>0){if(n instanceof m.z.ZodString)n=m.z.enum(i);else if(n instanceof m.z.ZodNumber){let u=i.map(s=>Number(s)).filter(s=>!isNaN(s));u.length>0&&(n=n.refine(s=>u.includes(s),{message:`Value must be one of: ${u.join(", ")}`}))}}let o=[],a=l(r.description,e);a&&o.push(a),r.bot&&o.push(r.bot),o.push(`Type: ${r.type}`),o.push(r.required?"Required":"Optional"),i&&i.length>0&&o.push(`Options: ${i.join(", ")}`);let p=l(r.patternDescription,e);p&&o.push(p);let c=o.join(". ");return c&&(n=n.describe(c)),r.required!==!0&&(n=n.optional()),n},M=(r,e)=>{let n={};for(let t of r){if(t.source==="hidden"||t.source!=="field")continue;let i=t.as||t.name;n[i]=V(t,e)}return Object.keys(n).length>0?n:void 0},h=(r,e,n,t,i,o)=>{let a=H(r),p=t||e.inputs||[],c=M(p,o);return{name:a,description:n,inputSchema:c,meta:v(r,i,o)}},C=(r,e,n,t,i,o)=>{let a=t||e.inputs||[],p=M(a,o),c=e.destination?.tool;if(!c)throw new Error(`Tool name is required for MCP action ${e.type}`);return{name:c,description:n,inputSchema:p,meta:v(r,i,o)}},v=(r,e,n)=>{let t={visibility:["model","app"]};return e&&(t.resourceUri=e.uri),{ui:t}},H=r=>{let e=r.meta?.identifier;if(!e)throw new Error(`Warp identifier for warp ${r.name} is required`);return(0,I.removeWarpChainPrefix)(e)};var b=require("@joai/warps"),Q="text/html;profile=mcp-app",B=async r=>{if(r.startsWith("http://")||r.startsWith("https://")){let e=await fetch(r);if(!e.ok)throw new Error(`Failed to download component from ${r}: HTTP ${e.status} ${e.statusText}`);return e.text()}throw new Error(`Unsupported component path: ${r}`)},x=async(r,e,n)=>{if(!r.meta?.identifier)return null;try{let t=await B(e);return{name:r.name,uri:`ui://widget/${r.meta.identifier}`,description:`MCP app for ${r.name}`,mimeType:Q,content:t}}catch(t){let i=t instanceof Error?t.message:String(t),o=t instanceof Error?t.stack:void 0;return b.WarpLogger.error(`[MCP] Failed to create app resource for warp "${r.name}" (path: ${e}):`,i),o&&b.WarpLogger.error("[MCP] Error stack:",o),null}};var Z=async(r,e)=>{let n=null,t=null,i=null;if(r.ui&&r.ui!=="table"&&(t=await x(r,r.ui,e)),r.actions.length===0)return{tool:null,resource:t,prompt:null};try{let{action:o}=(0,d.getWarpPrimaryAction)(r),a=l(r.description,e)||l(o.description,e);if(o.type==="prompt")i=R(r,o,a,e);else if(o.type==="mcp"){let p=o;p.destination&&(n=C(r,p,a,o.inputs,t,e))}else n=h(r,o,a,o.inputs,t,e)}catch{return{tool:null,resource:t,prompt:null}}return{tool:n,resource:t,prompt:i}},Y=async(r,e)=>Promise.all(r.map(n=>Z(n,e))),G=(r,e)=>e==="date-time"||e==="date"||r==="string"?"string":r==="number"||r==="integer"?"uint256":r==="boolean"?"bool":"string",P=async(r,e,n,t)=>{let i=[];if(e.inputSchema?.properties){let p=e.inputSchema.properties,c=e.inputSchema.required||[];Object.entries(p).forEach(([u,s])=>{let f=c.includes(u),g=G(s.type||"string",s.format),y={name:u,label:typeof s.title=="string"?{en:s.title}:s.title||{en:u},description:s.description?{en:s.description.trim()}:null,type:g,position:`payload:${u}`,source:"field",required:f,...s.default!==void 0&&typeof s.default=="string"||typeof s.default=="number"||typeof s.default=="boolean"?{default:s.default}:{}};i.push(y)})}let o={};e.outputSchema?.properties&&Object.keys(e.outputSchema.properties).forEach(p=>{o[p]=`out.${p}`});let a={type:"mcp",label:{en:e.name},description:e.description?{en:e.description.trim()}:null,destination:{url:n,tool:e.name,headers:t},inputs:i};return await new d.WarpBuilder(r).setName(e.name||"unnamed_tool").setTitle({en:e.name||"Unnamed Tool"}).setDescription(e.description?{en:e.description.trim()}:null).addAction(a).setOutput(Object.keys(o).length>0?o:null).build(!1)},l=(r,e)=>r&&(0,d.resolveWarpText)(r,e)||void 0;var S=(r,e)=>{let n=r;for(let[t,i]of Object.entries(e)){let o=new RegExp(`\\{\\{\\s*${t}\\s*\\}\\}`,"g");n=n.replace(o,i??"")}return n},K=r=>(r.includes(":")?r.split(":").slice(1).join(":"):r).trim().toLowerCase().replace(/\s+/g,"_").replace(/:/g,"_").replace(/[^a-z0-9_.-]/g,"_").replace(/^[^a-z0-9]+|[^a-z0-9]+$/g,"").replace(/[_-]+/g,e=>e.includes("_")?"_":e).replace(/_+/g,"_"),X=(r,e)=>{let n=[];for(let t of r){if(t.source==="hidden"||t.source!=="field")continue;let i=t.as||t.name,o=l(t.description,e);n.push({name:i,description:o,required:t.required===!0})}return n},R=(r,e,n,t)=>{let i=K(r.name),o=e.inputs||[],a=X(o,t);return{name:i,description:n,arguments:a.length>0?a:void 0,prompt:e.prompt}};var _=require("@modelcontextprotocol/sdk/server/mcp.js"),E=require("@modelcontextprotocol/sdk/server/zod-compat.js"),W=require("@modelcontextprotocol/ext-apps/server"),$=require("zod");var rr=r=>{if(r)return typeof r=="object"&&"_zod"in r?r._zod:typeof r=="object"&&!Array.isArray(r)&&(0,E.normalizeObjectSchema)(r)||r},er=r=>{if(!r.arguments||r.arguments.length===0)return;let e={};for(let n of r.arguments){let t=$.z.string();n.description&&(t=t.describe(n.description)),n.required||(t=t.optional()),e[n.name]=t}return e},tr=(r,e,n,t)=>{let i=new _.McpServer({name:r.name,version:r.version||"1.0.0"});for(let o=0;o<n.length;o++){let{tool:a,resource:p,prompt:c}=n[o],u=e[o];if(a){let s=rr(a.inputSchema),f={description:a.description||"",inputSchema:s,...a.meta&&{_meta:a.meta}},g=async y=>{let q=A(u,y||{});return await t(u,q)};a.meta?.ui?.resourceUri?(0,W.registerAppTool)(i,a.name,f,g):i.registerTool(a.name,f,g)}if(p&&(p.mimeType?.includes("profile=mcp-app")?(0,W.registerAppResource)(i,p.name||p.uri,p.uri,{description:p.description},async()=>{let s={uri:p.uri,text:p.content||"",mimeType:p.mimeType};return p.meta&&(s._meta=p.meta),{contents:[s]}}):i.registerResource(p.name||p.uri,p.uri,{description:p.description,mimeType:p.mimeType},async()=>{let s={uri:p.uri,text:p.content||"",mimeType:p.mimeType};return p.meta&&(s._meta=p.meta),{contents:[s]}})),c){let s=er(c);i.registerPrompt(c.name,{description:c.description||"",argsSchema:s},f=>({messages:[{role:"user",content:{type:"text",text:S(c.prompt,f)}}]}))}}return i};var j=require("@modelcontextprotocol/sdk/client/index.js"),O=require("@modelcontextprotocol/sdk/client/streamableHttp.js");var w=class{constructor(e){this.config=e}async getWarpsFromTools(e,n){let t=new O.StreamableHTTPClientTransport(new URL(e),{requestInit:{headers:n||{}}}),i=new j.Client({name:"warps-mcp-client",version:"1.0.0"},{capabilities:{}});try{await i.connect(t);let o=await i.listTools();return await i.close(),await Promise.all(o.tools.map(a=>P(this.config,a,e,n)))}catch(o){throw await i.close().catch(()=>{}),o}}};0&&(module.exports={WarpMcp,buildZodInputSchema,convertActionToTool,convertMcpActionToTool,convertMcpArgsToWarpInputs,convertMcpToolToWarp,convertPromptActionToPrompt,convertWarpToMcpCapabilities,convertWarpsToMcpCapabilities,createAppResource,createMcpServerFromWarps,extractTextOrUndefined,interpolatePromptWithArgs});
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getWarpPrimaryAction as
|
|
1
|
+
import{getWarpPrimaryAction as w}from"@joai/warps";var W=(r,e)=>{let{action:n}=w(r);return n.inputs?n.inputs.map(t=>{let i=t.as||t.name,o=e[i]??t.default??null;return o===null&&t.type==="bool"?"false":o==null?"":String(o)}):[]};import{WarpBuilder as $,getWarpPrimaryAction as j,resolveWarpText as O}from"@joai/warps";import{removeWarpChainPrefix as z}from"@joai/warps";import{z as m}from"zod";var I=r=>{if(r){if(Array.isArray(r))return r;if(typeof r=="object")return Object.keys(r)}},v=(r,e)=>{let n,t=r.type.toLowerCase();t==="string"||t==="address"||t==="hex"?n=m.string():t==="number"||t==="uint8"||t==="uint16"||t==="uint32"||t==="uint64"||t==="uint128"||t==="uint256"?n=m.number():t==="bool"||t==="boolean"?n=m.boolean():t==="biguint"?n=m.string():n=m.string(),typeof r.min=="number"&&n instanceof m.ZodNumber&&(n=n.min(r.min)),typeof r.max=="number"&&n instanceof m.ZodNumber&&(n=n.max(r.max)),r.pattern&&n instanceof m.ZodString&&(n=n.regex(new RegExp(r.pattern)));let i=I(r.options);if(i&&i.length>0){if(n instanceof m.ZodString)n=m.enum(i);else if(n instanceof m.ZodNumber){let u=i.map(s=>Number(s)).filter(s=>!isNaN(s));u.length>0&&(n=n.refine(s=>u.includes(s),{message:`Value must be one of: ${u.join(", ")}`}))}}let o=[],a=l(r.description,e);a&&o.push(a),r.bot&&o.push(r.bot),o.push(`Type: ${r.type}`),o.push(r.required?"Required":"Optional"),i&&i.length>0&&o.push(`Options: ${i.join(", ")}`);let p=l(r.patternDescription,e);p&&o.push(p);let c=o.join(". ");return c&&(n=n.describe(c)),r.required!==!0&&(n=n.optional()),n},y=(r,e)=>{let n={};for(let t of r){if(t.source==="hidden"||t.source!=="field")continue;let i=t.as||t.name;n[i]=v(t,e)}return Object.keys(n).length>0?n:void 0},T=(r,e,n,t,i,o)=>{let a=Z(r),p=t||e.inputs||[],c=y(p,o);return{name:a,description:n,inputSchema:c,meta:M(r,i,o)}},A=(r,e,n,t,i,o)=>{let a=t||e.inputs||[],p=y(a,o),c=e.destination?.tool;if(!c)throw new Error(`Tool name is required for MCP action ${e.type}`);return{name:c,description:n,inputSchema:p,meta:M(r,i,o)}},M=(r,e,n)=>{let t={visibility:["model","app"]};return e&&(t.resourceUri=e.uri),{ui:t}},Z=r=>{let e=r.meta?.identifier;if(!e)throw new Error(`Warp identifier for warp ${r.name} is required`);return z(e)};import{WarpLogger as h}from"@joai/warps";var _="text/html;profile=mcp-app",E=async r=>{if(r.startsWith("http://")||r.startsWith("https://")){let e=await fetch(r);if(!e.ok)throw new Error(`Failed to download component from ${r}: HTTP ${e.status} ${e.statusText}`);return e.text()}throw new Error(`Unsupported component path: ${r}`)},C=async(r,e,n)=>{if(!r.meta?.identifier)return null;try{let t=await E(e);return{name:r.name,uri:`ui://widget/${r.meta.identifier}`,description:`MCP app for ${r.name}`,mimeType:_,content:t}}catch(t){let i=t instanceof Error?t.message:String(t),o=t instanceof Error?t.stack:void 0;return h.error(`[MCP] Failed to create app resource for warp "${r.name}" (path: ${e}):`,i),o&&h.error("[MCP] Error stack:",o),null}};var q=async(r,e)=>{let n=null,t=null,i=null;if(r.ui&&r.ui!=="table"&&(t=await C(r,r.ui,e)),r.actions.length===0)return{tool:null,resource:t,prompt:null};try{let{action:o}=j(r),a=l(r.description,e)||l(o.description,e);if(o.type==="prompt")i=x(r,o,a,e);else if(o.type==="mcp"){let p=o;p.destination&&(n=A(r,p,a,o.inputs,t,e))}else n=T(r,o,a,o.inputs,t,e)}catch{return{tool:null,resource:t,prompt:null}}return{tool:n,resource:t,prompt:i}},vr=async(r,e)=>Promise.all(r.map(n=>q(n,e))),k=(r,e)=>e==="date-time"||e==="date"||r==="string"?"string":r==="number"||r==="integer"?"uint256":r==="boolean"?"bool":"string",b=async(r,e,n,t)=>{let i=[];if(e.inputSchema?.properties){let p=e.inputSchema.properties,c=e.inputSchema.required||[];Object.entries(p).forEach(([u,s])=>{let f=c.includes(u),d=k(s.type||"string",s.format),g={name:u,label:typeof s.title=="string"?{en:s.title}:s.title||{en:u},description:s.description?{en:s.description.trim()}:null,type:d,position:`payload:${u}`,source:"field",required:f,...s.default!==void 0&&typeof s.default=="string"||typeof s.default=="number"||typeof s.default=="boolean"?{default:s.default}:{}};i.push(g)})}let o={};e.outputSchema?.properties&&Object.keys(e.outputSchema.properties).forEach(p=>{o[p]=`out.${p}`});let a={type:"mcp",label:{en:e.name},description:e.description?{en:e.description.trim()}:null,destination:{url:n,tool:e.name,headers:t},inputs:i};return await new $(r).setName(e.name||"unnamed_tool").setTitle({en:e.name||"Unnamed Tool"}).setDescription(e.description?{en:e.description.trim()}:null).addAction(a).setOutput(Object.keys(o).length>0?o:null).build(!1)},l=(r,e)=>r&&O(r,e)||void 0;var P=(r,e)=>{let n=r;for(let[t,i]of Object.entries(e)){let o=new RegExp(`\\{\\{\\s*${t}\\s*\\}\\}`,"g");n=n.replace(o,i??"")}return n},N=r=>(r.includes(":")?r.split(":").slice(1).join(":"):r).trim().toLowerCase().replace(/\s+/g,"_").replace(/:/g,"_").replace(/[^a-z0-9_.-]/g,"_").replace(/^[^a-z0-9]+|[^a-z0-9]+$/g,"").replace(/[_-]+/g,e=>e.includes("_")?"_":e).replace(/_+/g,"_"),U=(r,e)=>{let n=[];for(let t of r){if(t.source==="hidden"||t.source!=="field")continue;let i=t.as||t.name,o=l(t.description,e);n.push({name:i,description:o,required:t.required===!0})}return n},x=(r,e,n,t)=>{let i=N(r.name),o=e.inputs||[],a=U(o,t);return{name:i,description:n,arguments:a.length>0?a:void 0,prompt:e.prompt}};import{McpServer as D}from"@modelcontextprotocol/sdk/server/mcp.js";import{normalizeObjectSchema as J}from"@modelcontextprotocol/sdk/server/zod-compat.js";import{registerAppTool as F,registerAppResource as L}from"@modelcontextprotocol/ext-apps/server";import{z as V}from"zod";var H=r=>{if(r)return typeof r=="object"&&"_zod"in r?r._zod:typeof r=="object"&&!Array.isArray(r)&&J(r)||r},Q=r=>{if(!r.arguments||r.arguments.length===0)return;let e={};for(let n of r.arguments){let t=V.string();n.description&&(t=t.describe(n.description)),n.required||(t=t.optional()),e[n.name]=t}return e},Ur=(r,e,n,t)=>{let i=new D({name:r.name,version:r.version||"1.0.0"});for(let o=0;o<n.length;o++){let{tool:a,resource:p,prompt:c}=n[o],u=e[o];if(a){let s=H(a.inputSchema),f={description:a.description||"",inputSchema:s,...a.meta&&{_meta:a.meta}},d=async g=>{let S=W(u,g||{});return await t(u,S)};a.meta?.ui?.resourceUri?F(i,a.name,f,d):i.registerTool(a.name,f,d)}if(p&&(p.mimeType?.includes("profile=mcp-app")?L(i,p.name||p.uri,p.uri,{description:p.description},async()=>{let s={uri:p.uri,text:p.content||"",mimeType:p.mimeType};return p.meta&&(s._meta=p.meta),{contents:[s]}}):i.registerResource(p.name||p.uri,p.uri,{description:p.description,mimeType:p.mimeType},async()=>{let s={uri:p.uri,text:p.content||"",mimeType:p.mimeType};return p.meta&&(s._meta=p.meta),{contents:[s]}})),c){let s=Q(c);i.registerPrompt(c.name,{description:c.description||"",argsSchema:s},f=>({messages:[{role:"user",content:{type:"text",text:P(c.prompt,f)}}]}))}}return i};import{Client as B}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as Y}from"@modelcontextprotocol/sdk/client/streamableHttp.js";var R=class{constructor(e){this.config=e}async getWarpsFromTools(e,n){let t=new Y(new URL(e),{requestInit:{headers:n||{}}}),i=new B({name:"warps-mcp-client",version:"1.0.0"},{capabilities:{}});try{await i.connect(t);let o=await i.listTools();return await i.close(),await Promise.all(o.tools.map(a=>b(this.config,a,e,n)))}catch(o){throw await i.close().catch(()=>{}),o}}};export{R as WarpMcp,y as buildZodInputSchema,T as convertActionToTool,A as convertMcpActionToTool,W as convertMcpArgsToWarpInputs,b as convertMcpToolToWarp,x as convertPromptActionToPrompt,q as convertWarpToMcpCapabilities,vr as convertWarpsToMcpCapabilities,C as createAppResource,Ur as createMcpServerFromWarps,l as extractTextOrUndefined,P as interpolatePromptWithArgs};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@joai/warps-mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "MCP adapter for Warps SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -43,6 +43,6 @@
|
|
|
43
43
|
"zod": "^4.3.5"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
|
-
"@joai/warps": "^3.
|
|
46
|
+
"@joai/warps": "^3.1.0"
|
|
47
47
|
}
|
|
48
48
|
}
|