@mcp-use/cli 4.0.0-beta.12 → 4.0.0-beta.14

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/bin.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import{a as n}from"./chunk-XIPXOMHU.js";import"./chunk-USIKTT3N.js";n(process.argv.slice(2),{frameworkVersion:"4.0.0-beta.12"}).then(e=>{process.exitCode=e},e=>{console.error(e instanceof Error?e.message:String(e)),process.exitCode=1});
2
+ import{a as n}from"./chunk-5CBUF6UX.js";import"./chunk-USIKTT3N.js";n(process.argv.slice(2),{frameworkVersion:"4.0.0-beta.14"}).then(e=>{process.exitCode=e},e=>{console.error(e instanceof Error?e.message:String(e)),process.exitCode=1});
@@ -0,0 +1,14 @@
1
+ import{a as u,b as v,c as j,d as f,e as I,f as D,g as H,h as C,i as A,j as y,l as E}from"./chunk-VSIT62BK.js";import{createHash as de}from"crypto";import{rm as K}from"fs/promises";import{join as $}from"path";import{createInterface as fe}from"readline/promises";import{parseArgs as x}from"util";var m=["-h, --help","Show this help"],g=["--json","Emit machine-readable JSON (accepted anywhere after client)"],P=new Map;function p(e,t){P.set(e,t)}p("",{usage:"mcp-use client <command>",summary:"Connect to and invoke saved HTTP(S) MCP servers.",commands:[["connect <name> <url>","Connect and save a server"],["list","List saved servers"],["remove <name>","Remove a saved server"],["<name>","Invoke a saved server"]],options:[m]});p("connect",{usage:"mcp-use client connect <name> <url> [options]",summary:"Connect to and save an HTTP(S) MCP server.",options:[['-H, --header <"Key: Value">',"Static header (repeatable)"],["--no-oauth","Skip OAuth on authorization challenges"],["--auth-timeout <ms>","OAuth wait timeout (default: 300000)"],["--protocol <auto|legacy|modern>","Protocol mode (default: auto; modern is stateless/sessionless)"],["--no-open","Print the OAuth URL without opening a browser"],g,m]});p("list",{usage:"mcp-use client list [options]",summary:"List saved MCP servers.",options:[g,m]});p("remove",{usage:"mcp-use client remove <name> [options]",summary:"Immediately remove a saved server and its credentials.",options:[m]});p("<name>",{usage:"mcp-use client <name> <command>",summary:"Invoke a saved MCP server.",commands:[["tools","List, describe, or call tools"],["resources","List or read resources"],["prompts","List or get prompts"],["auth","Inspect or clear saved OAuth state"]],options:[m]});p("<name> tools",{usage:"mcp-use client <name> tools <command>",summary:"Use tools on a saved MCP server.",commands:[["list","List tools"],["describe <tool>","Show a tool definition"],["call <tool> [args...]","Call a tool"]],options:[m]});p("<name> tools list",{usage:"mcp-use client <name> tools list [options]",summary:"List tools on a saved MCP server.",options:[g,m]});p("<name> tools describe",{usage:"mcp-use client <name> tools describe <tool> [options]",summary:"Show one tool definition.",options:[g,m]});p("<name> tools call",{usage:"mcp-use client <name> tools call <tool> [args...] [options]",summary:"Call a tool on a saved MCP server.",options:[["--timeout <ms>","Call timeout (default: 30000)"],g,m],notes:["Arguments are one JSON object or key=value/key:=<json> pairs; do not mix forms."]});p("<name> resources",{usage:"mcp-use client <name> resources <command>",summary:"Use resources on a saved MCP server.",commands:[["list","List resources"],["read <uri>","Read a resource"]],options:[m]});p("<name> resources list",{usage:"mcp-use client <name> resources list [options]",summary:"List resources on a saved MCP server.",options:[g,m]});p("<name> resources read",{usage:"mcp-use client <name> resources read <uri> [options]",summary:"Read one resource.",options:[g,m]});p("<name> prompts",{usage:"mcp-use client <name> prompts <command>",summary:"Use prompts on a saved MCP server.",commands:[["list","List prompts"],["get <prompt> [args...]","Get a prompt"]],options:[m]});p("<name> prompts list",{usage:"mcp-use client <name> prompts list [options]",summary:"List prompts on a saved MCP server.",options:[g,m]});p("<name> prompts get",{usage:"mcp-use client <name> prompts get <prompt> [args...] [options]",summary:"Get a prompt from a saved MCP server.",options:[g,m],notes:["Arguments are one JSON object or key=value/key:=<json> pairs; do not mix forms."]});p("<name> auth",{usage:"mcp-use client <name> auth <command>",summary:"Manage saved OAuth state.",commands:[["status","Show OAuth status"],["logout","Delete saved OAuth credentials"]],options:[m]});p("<name> auth status",{usage:"mcp-use client <name> auth status [options]",summary:"Show saved OAuth status.",options:[g,m]});p("<name> auth logout",{usage:"mcp-use client <name> auth logout [options]",summary:"Delete saved OAuth credentials but keep the server.",options:[["--yes","Skip the confirmation prompt"],g,m]});function B(e){let t=e.filter(a=>a!=="--help"&&a!=="-h"&&a!=="--json"),n=t[0];if(n===void 0)return{text:S(P.get(""))};if(n==="connect"||n==="list"||n==="remove")return{text:S(P.get(n))};let o=t[1];if(o===void 0)return{text:S(P.get("<name>"))};if(!["tools","resources","prompts","auth"].includes(o))return{error:`Unknown client command family: ${o}`};let r=t[2],s=`<name> ${o}`;if(r===void 0)return{text:S(P.get(s))};let i=`${s} ${r}`,l=P.get(i);return l===void 0?{error:`Unknown client ${o} command: ${r}`}:{text:S(l)}}function S(e){let t=[`Usage: ${e.usage}`,e.summary];return e.commands!==void 0&&t.push(J("Commands",e.commands)),e.options!==void 0&&t.push(J("Options",e.options)),e.notes!==void 0&&t.push(e.notes.join(`
2
+ `)),t.join(`
3
+
4
+ `)}function J(e,t){let n=Math.max(...t.map(([o])=>o.length));return`${e}:
5
+ ${t.map(([o,r])=>` ${o.padEnd(n)} ${r}`).join(`
6
+ `)}`}import{spawn as Q}from"child_process";import{readFileSync as X}from"fs";import{chmod as ee,mkdir as te}from"fs/promises";import{dirname as ne,join as b,resolve as oe}from"path";import{pathToFileURL as G}from"url";var k=b(E,"client-sdk"),h="@mcp-use/client",re="^2.0.0-alpha.0",se=[`[mcp-use] ${h} is not installed.`,"The `mcp-use client` and `mcp-use screenshot` commands require it.","Install it in your project:",""," npm install @mcp-use/client",""," pnpm add @mcp-use/client",""," bun add @mcp-use/client"].join(`
7
+ `);async function ie(e){let t=oe(e);for(;;){if(await C(b(t,"package.json")))return t;let n=ne(t);if(n===t)return;t=n}}async function q(){try{return await le()}catch(e){if(!F(e))throw e;let t=await ae();try{return t.location==="sandbox"?await pe():await me(t.projectRoot)}catch(n){throw F(n)?new u(se):n}}}async function ae(){let e=ue(),t=`${h}@${e}`,n=await ie(process.cwd());if(process.stderr.write(`[mcp-use] installing ${h}\u2026
8
+ `),n!==void 0){let[s,i]=ce(t);if(await z(s,i,n)!==0)throw new v("client_install_failed",`Failed to install ${h}.`);return{location:"project",projectRoot:n}}await te(k,{recursive:!0,mode:448}),await ee(k,448);let o=b(k,"package.json");if(await C(o)||await y(o,{private:!0,dependencies:{[h]:e}}),await z("npm",["install",t],k)!==0)throw new v("client_install_failed",`Failed to install ${h}.`);return{location:"sandbox"}}function ce(e){let t=process.env.npm_config_user_agent??"";return t.startsWith("pnpm/")?["pnpm",["add",e]]:t.startsWith("bun/")?["bun",["add",e]]:["npm",["install",e]]}function ue(){for(let e of["../package.json","../../package.json"])try{let t=X(new URL(e,import.meta.url),"utf8"),n=JSON.parse(t);if(n.name!=="mcp-use")continue;let o=n.peerDependencies?.[h];if(typeof o=="string"&&o.length>0)return o}catch{}return re}async function le(){return import("@mcp-use/client")}async function me(e){let t=G(b(e,"package.json")).href;return import(await import.meta.resolve(h,t))}async function pe(){let e=b(k,"node_modules",h,"dist","index.js");return await import(G(e).href)}function F(e){if(!(e instanceof Error))return!1;let t=e.code;return t==="ERR_MODULE_NOT_FOUND"||t==="MODULE_NOT_FOUND"?e.message.includes(h)||e.message.includes("Cannot find package"):!1}function z(e,t,n){return new Promise((o,r)=>{let s=Q(e,t,{cwd:n,stdio:"inherit",shell:process.platform==="win32"});s.once("error",r),s.once("exit",(i,l)=>{o(l==="SIGINT"?130:i??1)})})}var W=$(E,"client"),L=$(W,"servers.json");async function Fe(e){if(e.includes("--help")||e.includes("-h")){let s=B(e);return s.text!==void 0?(process.stdout.write(`${s.text}
9
+ `),0):(process.stderr.write(`${s.error}
10
+ `),2)}let t=j(e),n=e.filter(s=>s!=="--json"),o=n[0],r=t&&o!=="remove";try{if(o==="connect")return await ge(n.slice(1),t);if(o==="list")return await we(n.slice(1),t);if(o==="remove"){let s=e.indexOf("remove");return await he(e.filter((i,l)=>l!==s))}if(o===void 0)throw new u("Usage: mcp-use client <connect|list|remove|name>");return await ve(o,n.slice(1),t)}catch(s){return I(s instanceof TypeError?new u(s.message):s,r)}}async function ge(e,t){let{values:n,positionals:o}=x({args:[...e],allowPositionals:!0,strict:!0,options:{header:{type:"string",short:"H",multiple:!0},"no-oauth":{type:"boolean"},"auth-timeout":{type:"string"},protocol:{type:"string",default:"auto"},"no-open":{type:"boolean"}}});if(o.length!==2)throw new u("Usage: mcp-use client connect <name> <url>");let[r,s]=o;ke(r);let i=new URL(s);if(!["http:","https:"].includes(i.protocol))throw new u("Client URLs must use http or https.");let l=Se(n.protocol),a=Z(n["auth-timeout"]??"300000","--auth-timeout"),c=await R();if(c.servers[r]!==void 0)throw new u(`Saved server already exists: ${r}`);let d={headers:Ce(n.header??[])},w={url:i.href,oauth:n["no-oauth"]!==!0,protocol:l};return await(await M(r,w,d,a,Y({noOpen:n["no-open"]===!0,json:t}))).disconnect(),c.servers[r]=w,await y(L,c),await y(N(r),d),f({name:r,url:w.url,protocol:l},t,`Connected and saved ${r}.`),0}async function we(e,t){O(e);let n=await R(),o=Object.entries(n.servers).map(([r,s])=>({name:r,...s}));return f(o,t,o.map(r=>`${r.name} ${r.url}`).join(`
11
+ `)||"No saved servers."),0}async function he(e){let{positionals:t}=x({args:[...e],allowPositionals:!0,strict:!0,options:{}}),n=_(t,"mcp-use client remove <name>"),o=await R();return delete o.servers[n],await y(L,o),await K(U(n),{recursive:!0,force:!0}),f({removed:n},!1,`Removed ${n}.`),0}async function ve(e,t,n){let r=(await R()).servers[e];if(r===void 0)throw new u(`Unknown saved server: ${e}. Run \`mcp-use client connect ${e} <url>\`.`);let s=t[0],i=t[1];if(s==="auth"){if(i==="status"){O(t.slice(2));let c=await C(T(e));return f({name:e,oauth:r.oauth,authenticated:c},n,c?"Authenticated.":"No saved OAuth session."),0}if(i==="logout"){let{values:c,positionals:d}=x({args:[...t.slice(2)],allowPositionals:!0,strict:!0,options:{yes:{type:"boolean"}}});if(d.length!==0)throw new u(`Usage: mcp-use client ${e} auth logout`);return await D(`Delete OAuth credentials for ${e}?`,{yes:c.yes===!0,json:n})&&(await K(T(e),{recursive:!0,force:!0}),f({loggedOut:e},n,`Logged out ${e}.`)),0}}let l=await A(N(e),{}),a=await M(e,r,l,3e5,Y({noOpen:!1,json:n}));try{if(s==="tools"){if(i==="list"){O(t.slice(2));let c=await a.listTools();return f(c,n,c.map(d=>d.description?`${d.name} - ${d.description}`:d.name).join(`
12
+ `)),0}if(i==="describe"){let c=_(t.slice(2),`mcp-use client ${e} tools describe <tool>`),d=(await a.listTools()).find(w=>w.name===c);if(d===void 0)throw new u(`Tool not found: ${c}`);return f(d,n),0}if(i==="call")return await ye(a,e,t.slice(2),n)}if(s==="resources"){if(i==="list"){O(t.slice(2));let c=await a.listResources();return f(c,n),0}if(i==="read"){let c=_(t.slice(2),`mcp-use client ${e} resources read <uri>`);return f(await a.readResource(c),n),0}}if(s==="prompts"){if(i==="list")return O(t.slice(2)),f(await a.listPrompts(),n),0;if(i==="get"){let c=t[2];if(c===void 0)throw new u(`Usage: mcp-use client ${e} prompts get <prompt> [args]`);return f(await a.getPrompt(c,V(t.slice(3))),n),0}}throw new u(`Usage: mcp-use client ${e} <tools|resources|prompts|auth> ...`)}finally{await a.disconnect()}}async function ye(e,t,n,o){let r=n[0];if(r===void 0)throw new u(`Usage: mcp-use client ${t} tools call <tool> [args]`);let{values:s,positionals:i}=x({args:[...n.slice(1)],allowPositionals:!0,strict:!0,options:{timeout:{type:"string",default:"30000"}}}),l=Z(s.timeout,"--timeout"),a=await e.callTool(r,V(i),{timeout:l});if(a.isError===!0)throw new v("tool_error",`Tool ${r} returned an error.`,a);return f(a,o),0}async function M(e,t,n,o,r=process.stdin.isTTY?"ask":"never"){let{createOAuthProvider:s,MCPClient:i}=await q(),l=T(e),a=t.oauth?await s(t.url,{baseDir:l,authTimeoutMs:o,storageKeyPrefix:`mcp-use-cli:${e}`,openBrowser:async w=>{if(r==="never"){process.stderr.write(`Open this URL to authenticate:
13
+ ${w}
14
+ `);return}await Pe(),H(w)}}):void 0,c=t.protocol==="auto"?{protocolNegotiation:"auto"}:t.protocol==="modern"?{protocolNegotiation:{pin:"2026-07-28"}}:{protocolNegotiation:"legacy",clientOptions:{supportedProtocolVersions:["2025-11-25"]}},d=new i({mcpServers:{[e]:{url:t.url,...n.headers!==void 0?{headers:n.headers}:{},...a!==void 0?{authProvider:a}:{oauth:!1},...c}}});try{return await d.connect(e)}catch(w){throw Oe(w,t.protocol)}}async function ze(e,t=3e5){let o=(await R()).servers[e];if(o===void 0)throw new u(`Unknown saved server: ${e}`);let r=await A(N(e),{});return M(e,o,r,t)}async function Ge(e,t){return M("screenshot",{url:e,oauth:!1,protocol:"auto"},{headers:t},3e5)}function V(e){if(e.length===0)return{};if(e.length===1&&e[0]?.trimStart().startsWith("{")){let n=JSON.parse(e[0]);if(n===null||Array.isArray(n)||typeof n!="object")throw new u("The JSON argument must be an object.");return n}let t={};for(let n of e){let o=n.indexOf(":="),r=n.indexOf("="),s=o>=0?o:r,i=o>=0?2:1;if(s<=0)throw new u(`Expected key=value or key:=<json>, received: ${n}`);let l=n.slice(0,s).replace(/^--/,""),a=n.slice(s+i);t[l]=o>=0?JSON.parse(a):a}return t}function Y(e){return e.json||e.noOpen||!process.stdin.isTTY?"never":"ask"}async function Pe(){let e=fe({input:process.stdin,output:process.stderr});try{await e.question("This server requires OAuth. Press Enter to open your browser.")}finally{e.close()}}function Ce(e){let t={};for(let n of e){let o=n.indexOf(":");if(o<=0)throw new u(`Invalid header: ${n}`);t[n.slice(0,o).trim()]=n.slice(o+1).trim()}return t}function Se(e){if(e!=="auto"&&e!=="legacy"&&e!=="modern")throw new u("Invalid protocol. Expected auto, legacy, or modern.");return e}function Z(e,t){let n=Number(e);if(!Number.isInteger(n)||n<=0)throw new u(`${t} must be a positive integer.`);return n}function ke(e){if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(e))throw new u("Server names must be 1-64 filesystem-safe letters, numbers, dots, dashes, or underscores.")}async function R(){let e=await A(L,{servers:{}}),t={servers:{}},n=!1;for(let[o,r]of Object.entries(e.servers)){let s=be(r.protocol);t.servers[o]={...r,protocol:s},n||=s!==r.protocol}return n&&await y(L,t),t}function be(e){if(e==="auto"||e==="legacy"||e==="modern")return e;if(e===void 0)return"auto";if(e==="2025-11-25")return"legacy";if(e==="2026-07-28")return"modern";throw new u("Saved server has an invalid protocol setting. Remove and reconnect it.")}function Oe(e,t){return t==="auto"||!(e instanceof Error)||!e.message.includes("Unsupported protocol version")&&!e.message.includes("pinned protocol version")?e:t==="legacy"?new v("protocol_mismatch","Server does not support the requested legacy protocol."):new v("protocol_mismatch","Server does not support the requested modern protocol (stateless/sessionless, no fallback).")}function U(e){return $(W,"credentials",de("sha256").update(e).digest("hex"))}function N(e){return $(U(e),"credentials.json")}function T(e){return $(U(e),"oauth")}function O(e){x({args:[...e],allowPositionals:!1,strict:!0,options:{}})}function _(e,t){if(e.length!==1)throw new u(`Usage: ${t}`);return e[0]}export{Fe as a,ze as b,Ge as c,V as d};
@@ -0,0 +1,9 @@
1
+ import{a as v,b as h,d as x}from"./chunk-7G4TXPP4.js";import{existsSync as b}from"fs";import{join as S}from"path";import{fileURLToPath as A}from"url";var T=["vite.config.ts","vite.config.js","vite.config.mts","vite.config.cjs"];function re(e){for(let t of T){let n=S(e,t);if(b(n))return n}return!1}function se(){return A(import.meta.resolve("tailwindcss/index.css"))}import{join as u}from"path";var W=".mcp-use",L="manifest.json";function ce(e){let t=u(e,W),n=u(t,"build");return{projectRoot:e,workspace:t,build:n,generated:u(t,"generated"),cache:u(t,"cache"),state:u(t,"state"),cloud:u(t,"cloud"),buildManifest:u(n,L),tunnel:u(t,"state","tunnel.json")}}import{readFile as C}from"fs/promises";import{dirname as U,resolve as j}from"path";var p="virtual:mcp-use/legacy-widget-metadata:",V=`\0${p}`;function de(e){return`${p}${encodeURIComponent(e)}`}function I(){return{name:"mcp-use-legacy-widget-metadata",resolveId(e){if(e.startsWith(p))return`\0${e}`},async load(e){if(!e.startsWith(V))return;let t=decodeURIComponent(e.slice(V.length));this.addWatchFile(t);let n=await C(t,"utf8");return N(n,t)}}}function N(e,t){let n=/\bexport\s+const\s+widgetMetadata\b/g.exec(e);if(n===null)return`export const widgetMetadata = undefined;
2
+ `;let r=O(e,n.index+n[0].length);if(r===-1)throw new Error(`Could not read widgetMetadata from ${t}: expected an exported const initializer.`);let i=k(e,r+1),o=e.slice(r+1,i).trim();if(o==="")throw new Error(`Could not read widgetMetadata from ${t}: the initializer is empty.`);return`${z(e,o,t).join(`
3
+ `)}
4
+ export const widgetMetadata = ${o};
5
+ `}function O(e,t){for(let n=t;n<e.length;n+=1)if(e[n]==="="&&e[n+1]!==">")return n;return-1}function k(e,t){let n=[],r,i=!1,o=!1,c=!1;for(let a=t;a<e.length;a+=1){let s=e[a],d=e[a+1];if(o){s===`
6
+ `&&(o=!1);continue}if(c){s==="*"&&d==="/"&&(c=!1,a+=1);continue}if(r!==void 0){i?i=!1:s==="\\"?i=!0:s===r&&(r=void 0);continue}if(s==="/"&&d==="/"){o=!0,a+=1;continue}if(s==="/"&&d==="*"){c=!0,a+=1;continue}if(s==="'"||s==='"'||s==="`"){r=s;continue}if(s==="("||s==="["||s==="{"){n.push(s);continue}if(s===")"||s==="]"||s==="}"){n.pop();continue}if(s===";"&&n.length===0)return a}return e.length}function z(e,t,n){let r=[],i=/\bimport\s+([\s\S]*?)\s+from\s+(["'])([^"']+)\2\s*(?:with\s*\{[^}]*\})?\s*;?/g;for(let o of e.matchAll(i)){let c=o[0],a=o[1]??"",s=o[3]??"";if(!F(a).some(P=>X(t,P)))continue;let M=s.startsWith(".")?j(U(n),s):s;r.push(c.replace(s,M))}return r}function F(e){let t=[],n=e.replace(/^\s*type\s+/,"").trim(),r=/\*\s+as\s+([A-Za-z_$][\w$]*)/.exec(n);r?.[1]!==void 0&&t.push(r[1]);let i=/\{([\s\S]*?)\}/.exec(n)?.[1];if(i!==void 0)for(let c of i.split(",")){let a=c.trim().replace(/^type\s+/,"");if(a==="")continue;let s=/\bas\s+([A-Za-z_$][\w$]*)$/.exec(a)?.[1];t.push(s??a.split(/\s+/)[0])}let o=n.split(/[,{*]/,1)[0]?.trim();return o!==void 0&&/^[A-Za-z_$][\w$]*$/.test(o)&&t.push(o),t}function X(e,t){return new RegExp(`(^|[^\\w$])${B(t)}([^\\w$]|$)`).test(e)}function B(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}import{existsSync as _,readdirSync as Z}from"fs";import{dirname as y,isAbsolute as q,join as J,resolve as l}from"path";import G from"@vitejs/plugin-react";var K="views",f="virtual:mcp-use/views/",m=`\0${f}`;function R(e,t){let n=t??K;return q(n)?n:l(e,n)}function xe(e,t,n){let r=R(e,t),i=t===void 0?l(e,"resources"):l(y(r),"resources"),o=new Map;E(r,"view.tsx",!1,o),n?.includeLegacy===!0&&E(i,"widget.tsx",!0,o);let c=[...o.values()];return c.sort((a,s)=>a.name.localeCompare(s.name)),c}function E(e,t,n,r){if(_(e))for(let i of Z(e,{withFileTypes:!0})){if(!i.isDirectory())continue;let o=J(e,i.name,t);if(_(o)){if(n&&r.has(i.name)){console.warn(`[mcp-use] Both native and legacy view entries exist for "${i.name}"; using views/${i.name}/view.tsx.`);continue}r.set(i.name,{name:i.name,entryPath:o,...n&&{legacy:!0}})}}}function H(e){return`${f}${e}`}function Q(e){return`/@id/__x00__${f}${e}`}function Ve(e,t,n){let r=R(t,n),i=n===void 0?l(t,"resources"):l(y(r),"resources");return e===r||e.startsWith(`${r}/`)||e===i||e.startsWith(`${i}/`)}function Ie(e){let t={};for(let n of e)t[n.name]={kind:"external",entry:Q(n.name),css:[],scripts:["/@vite/client"]};return t}async function _e(e,t,n){let{createServer:r}=await import("vite");return r({root:e,configFile:n,envDir:!1,logLevel:"warn",cacheDir:t,resolve:{tsconfigPaths:!0,alias:v(e)},oxc:{jsx:{runtime:"automatic"}},plugins:[x(e),I(),G()],server:{middlewareMode:!0,hmr:!1,ws:!1},ssr:{...h(e)}})}var g="virtual:mcp-use/tailwind.css",D=`\0${g}`,w="virtual:mcp-use/csp-runtime",$=`\0${w}`,Y=["react","react-dom"],ee={exclude:["mcp-use/react"],include:["react","react-dom","react-dom/client"]};function Re(e){return{name:"mcp-use-views",config(){return{resolve:{dedupe:Y},optimizeDeps:ee}},applyToEnvironment(t){return t.name==="client"},resolveId(t){if(t===w)return $;if(t===g)return D;if(t.startsWith(f))return`\0${t}`},load(t){if(t===$)return["globalThis.__zod_globalConfig ??= {};","globalThis.__zod_globalConfig.jitless = true;",""].join(`
7
+ `);if(t===D)return['@import "tailwindcss";',"@custom-variant dark (&:where(.dark, .dark *, [data-theme=dark], [data-theme=dark] *));"].join(`
8
+ `);if(!t.startsWith(m))return;let n=t.slice(m.length),r=e.getViews().find(o=>o.name===n);if(r===void 0)return;let i=[];return i.push(`import ${JSON.stringify(w)};`),e.dev?.reactRefresh===!0&&i.push('import "@vitejs/plugin-react/preamble";'),i.push(`import ${JSON.stringify(g)};`),i.push('import { bootstrapView } from "mcp-use/react";'),i.push(`import * as viewModule from ${JSON.stringify(r.entryPath)};`),r.legacy===!0?i.push("const legacyMetadata = viewModule.widgetMetadata?.metadata;","bootstrapView({ ...viewModule, viewConfig: {"," ...(legacyMetadata?.autoResize !== undefined && { autoResize: legacyMetadata.autoResize }),","} });"):i.push("bootstrapView(viewModule);"),e.dev!==void 0&&i.push("if (import.meta.hot) {"," import.meta.hot.accept();","}"),i.push(""),i.join(`
9
+ `)}}}export{re as a,se as b,ce as c,de as d,I as e,R as f,xe as g,H as h,Ve as i,Ie as j,_e as k,Y as l,ee as m,Re as n};
@@ -1,4 +1,4 @@
1
- import{a as O,b as N,c as j,d as b,e as k,f as F,g as W,h as q,k as S,l as H}from"../chunk-2N6PJAKM.js";import{a as C,b as E,c as I,d as L}from"../chunk-7G4TXPP4.js";import{a as $,b as T}from"../chunk-FLGSKQGU.js";import{randomBytes as Z}from"crypto";import{existsSync as re}from"fs";import{cp as de,mkdir as P,rm as fe,writeFile as D}from"fs/promises";import{join as w,relative as v,resolve as pe}from"path";import me from"@tailwindcss/vite";import ge from"@vitejs/plugin-react";import{build as B}from"vite";import{createServerModuleRunner as J}from"vite";var ce="/mcp",z="http://localhost:3000",h="__mcpUseV1CompatServer";function G(){return globalThis[h]}async function ue(e,t,o){let n=o.filter(r=>r.legacy===!0);if(n.length===0)return;if(typeof t.__registerLegacyViews!="function")throw new Error("Legacy resources/*/widget.tsx views require the temporary mcp-use/server compatibility entry.");let i={};for(let r of n)i[r.name]=await e.import(b(r.entryPath));t.__registerLegacyViews(i)}async function V(e,t){let o=J(e,{hmr:!1,sourcemapInterceptor:"node"}),n=process.env.MCP_URL,i=process.env.MCP_USE_CLI_IMPORT;try{process.env.MCP_USE_CLI_IMPORT="1",n===void 0&&(process.env.MCP_URL=z),delete globalThis[h];let a=(await o.import(t)).default??G();if(a===null||typeof a!="object")throw new Error("The server entry must default-export the MCPServer instance.");return{basePath:a.basePath??ce,supportsLegacyViews:typeof a.__registerLegacyViews=="function"}}finally{delete globalThis[h],n===void 0?delete process.env.MCP_URL:process.env.MCP_URL=n,i===void 0?delete process.env.MCP_USE_CLI_IMPORT:process.env.MCP_USE_CLI_IMPORT=i,await o.close()}}async function Y(e,t){return(await V(e,t)).basePath}async function A(e,t,o,n=[]){let i=J(e,{hmr:!1,sourcemapInterceptor:"node"}),r=process.env.MCP_USE_CLI_IMPORT,a=process.env.MCP_URL;try{process.env.MCP_USE_CLI_IMPORT="1",a===void 0&&(process.env.MCP_URL=z),delete globalThis[h];let s=(await i.import(t)).default??G();if(s===null||typeof s!="object")throw new Error("The server entry must default-export the MCPServer instance.");if(typeof s.__primeViews!="function")throw new Error("The entry's default export does not support __primeViews.");await ue(i,s,n),s.__primeViews(o),s.__mount()}finally{delete globalThis[h],r===void 0?delete process.env.MCP_USE_CLI_IMPORT:process.env.MCP_USE_CLI_IMPORT=r,a===void 0?delete process.env.MCP_URL:process.env.MCP_URL=a,await i.close()}}function le(e){return e.replace(/\/+$/,"")}function K(e){return le(e)}import{hostHeaderValidationResponse as $e,originValidationResponse as Ce}from"@modelcontextprotocol/server";function Q(e,t){let o=t.replace(/^\/+/,"");return e==="/"?`/${o}`:`${e}/${o}`}function X(e,t){return`${Q(e,`_mcp-use/views/${t}`)}/`}var y="index.js",we="entry-wrapper.ts",ye=100*1024*1024;async function ee(e,t){let o=w(e,"public");re(o)&&await de(o,t,{recursive:!0})}async function te(e,t,o,n){let i=w(e,we);await P(e,{recursive:!0});let r=JSON.stringify(o),a=n.filter(s=>s.legacy===!0),c=a.length>0?[`import ${JSON.stringify(t)};`,'import { registerViews } from "mcp-use";']:[`import * as serverModule from ${JSON.stringify(t)};`,'import { registerViews } from "mcp-use";'];if(a.forEach((s,f)=>{c.push(`import * as legacyWidget${f} from ${JSON.stringify(b(s.entryPath))};`)}),c.push(a.length>0?"const server = globalThis.__mcpUseV1CompatServer;":"const server = serverModule.default;",'if (!server) throw new Error("The server entry must default-export MCPServer or use the deprecated mcp-use/server compatibility entry.");'),a.length>0){let s=a.map((f,p)=>`${JSON.stringify(f.name)}: legacyWidget${p}`).join(", ");c.push(`server.__registerLegacyViews?.({ ${s} });`)}return c.push(`server[registerViews] ? server[registerViews](${r}) : server.__primeViews(${r});`,"export default server;",""),await D(i,c.join(`
1
+ import{a as O,b as N,c as j,d as b,e as k,f as F,g as W,h as q,k as S,n as H}from"../chunk-YMYENQ4W.js";import{a as C,b as E,c as I,d as L}from"../chunk-7G4TXPP4.js";import{a as $,b as T}from"../chunk-FLGSKQGU.js";import{randomBytes as Z}from"crypto";import{existsSync as re}from"fs";import{cp as de,mkdir as P,rm as fe,writeFile as D}from"fs/promises";import{join as w,relative as v,resolve as pe}from"path";import me from"@tailwindcss/vite";import ge from"@vitejs/plugin-react";import{build as B}from"vite";import{createServerModuleRunner as J}from"vite";var ce="/mcp",z="http://localhost:3000",h="__mcpUseV1CompatServer";function G(){return globalThis[h]}async function ue(e,t,o){let n=o.filter(r=>r.legacy===!0);if(n.length===0)return;if(typeof t.__registerLegacyViews!="function")throw new Error("Legacy resources/*/widget.tsx views require the temporary mcp-use/server compatibility entry.");let i={};for(let r of n)i[r.name]=await e.import(b(r.entryPath));t.__registerLegacyViews(i)}async function V(e,t){let o=J(e,{hmr:!1,sourcemapInterceptor:"node"}),n=process.env.MCP_URL,i=process.env.MCP_USE_CLI_IMPORT;try{process.env.MCP_USE_CLI_IMPORT="1",n===void 0&&(process.env.MCP_URL=z),delete globalThis[h];let a=(await o.import(t)).default??G();if(a===null||typeof a!="object")throw new Error("The server entry must default-export the MCPServer instance.");return{basePath:a.basePath??ce,supportsLegacyViews:typeof a.__registerLegacyViews=="function"}}finally{delete globalThis[h],n===void 0?delete process.env.MCP_URL:process.env.MCP_URL=n,i===void 0?delete process.env.MCP_USE_CLI_IMPORT:process.env.MCP_USE_CLI_IMPORT=i,await o.close()}}async function Y(e,t){return(await V(e,t)).basePath}async function A(e,t,o,n=[]){let i=J(e,{hmr:!1,sourcemapInterceptor:"node"}),r=process.env.MCP_USE_CLI_IMPORT,a=process.env.MCP_URL;try{process.env.MCP_USE_CLI_IMPORT="1",a===void 0&&(process.env.MCP_URL=z),delete globalThis[h];let s=(await i.import(t)).default??G();if(s===null||typeof s!="object")throw new Error("The server entry must default-export the MCPServer instance.");if(typeof s.__primeViews!="function")throw new Error("The entry's default export does not support __primeViews.");await ue(i,s,n),s.__primeViews(o),s.__mount()}finally{delete globalThis[h],r===void 0?delete process.env.MCP_USE_CLI_IMPORT:process.env.MCP_USE_CLI_IMPORT=r,a===void 0?delete process.env.MCP_URL:process.env.MCP_URL=a,await i.close()}}function le(e){return e.replace(/\/+$/,"")}function K(e){return le(e)}import{hostHeaderValidationResponse as $e,originValidationResponse as Ce}from"@modelcontextprotocol/server";function Q(e,t){let o=t.replace(/^\/+/,"");return e==="/"?`/${o}`:`${e}/${o}`}function X(e,t){return`${Q(e,`_mcp-use/views/${t}`)}/`}var y="index.js",we="entry-wrapper.ts",ye=100*1024*1024;async function ee(e,t){let o=w(e,"public");re(o)&&await de(o,t,{recursive:!0})}async function te(e,t,o,n){let i=w(e,we);await P(e,{recursive:!0});let r=JSON.stringify(o),a=n.filter(s=>s.legacy===!0),c=a.length>0?[`import ${JSON.stringify(t)};`,'import { registerViews } from "mcp-use";']:[`import * as serverModule from ${JSON.stringify(t)};`,'import { registerViews } from "mcp-use";'];if(a.forEach((s,f)=>{c.push(`import * as legacyWidget${f} from ${JSON.stringify(b(s.entryPath))};`)}),c.push(a.length>0?"const server = globalThis.__mcpUseV1CompatServer;":"const server = serverModule.default;",'if (!server) throw new Error("The server entry must default-export MCPServer or use the deprecated mcp-use/server compatibility entry.");'),a.length>0){let s=a.map((f,p)=>`${JSON.stringify(f.name)}: legacyWidget${p}`).join(", ");c.push(`server.__registerLegacyViews?.({ ${s} });`)}return c.push(`server[registerViews] ? server[registerViews](${r}) : server.__primeViews(${r});`,"export default server;",""),await D(i,c.join(`
2
2
  `)),i}function he(){let e=process.env.MCP_ASSETS_URL;if(!(e===void 0||e.trim()===""))try{return K(new URL(e).href.replace(/\/$/,""))}catch{return}}function U(e,t,o,n){let i=e.replace(/^\/+/,"");return`${o}${X(n,t)}${i}`}function ve(e,t,o,n){return e.kind!=="external"?e:{...e,entry:U(e.entry,t,o,n),css:e.css.map(i=>U(i,t,o,n)),...e.scripts!==void 0&&{scripts:e.scripts.map(i=>U(i,t,o,n))}}}async function Me(e,t){let o=w(t.viewsOutDir,e.name),n=await B({root:t.cwd,configFile:t.userViteConfig,envDir:!1,publicDir:!1,logLevel:"warn",cacheDir:t.cacheDir,resolve:{tsconfigPaths:!0,alias:{tailwindcss:N()}},oxc:{jsx:{runtime:"automatic"}},plugins:[me(),ge(),H({getViews:()=>[e]})],build:{outDir:o,emptyOutDir:!0,write:!t.inline,target:"es2022",sourcemap:t.inline?!1:t.sourceMaps,minify:!0,cssCodeSplit:!1,chunkSizeWarningLimit:1e3,assetsInlineLimit:ye,rollupOptions:{input:{[e.name]:q(e.name)},output:{format:"es",codeSplitting:!t.inline,entryFileNames:"assets/[name]-[hash].js",chunkFileNames:"assets/[name]-[hash].js",assetFileNames:"assets/[name]-[hash][extname]"}}},base:"./"}),i=Array.isArray(n)?n[0]:n;if(i===void 0||!("output"in i))throw new Error(`Client build for view "${e.name}" produced no output.`);let r=i.output,a=Array.isArray(r)?r:Object.values(r),c,s,f,p=[];for(let m of a){if(typeof m!="object"||m===null||!("fileName"in m)||typeof m.fileName!="string")continue;let u=m;u.type==="chunk"&&u.isEntry===!0?(c=u.fileName,f=u.code):u.type==="asset"&&u.fileName.endsWith(".css")&&(s=u.fileName,typeof u.source=="string"?p.push(u.source):u.source instanceof Uint8Array&&p.push(new TextDecoder().decode(u.source)))}if(c===void 0)throw new Error(`Client build produced no entry chunk for view "${e.name}".`);if(t.inline){if(f===void 0)throw new Error(`Client build produced no entry source for view "${e.name}".`);return{kind:"inline",js:f,css:p.join(`
3
3
  `)}}return{kind:"external",entry:c.replace(/^\/+/,""),css:s!==void 0?[s.replace(/^\/+/,"")]:[]}}async function _e(e){let t=performance.now();I(e.cwd,"production");let o=e.mcpDir===void 0?e.cwd:pe(e.cwd,e.mcpDir),n=e.entry===void 0?$(o):$(e.cwd,e.entry),i=await T(e.cwd,n);(i==="created"||i==="updated")&&console.log(`[mcp-use] ${i} mcp-env.d.ts`);let r=j(e.cwd),a=e.viewsDir??(e.mcpDir===void 0?void 0:w(e.mcpDir,"views"));re(F(e.cwd,a))||console.log("[mcp-use] views directory not configured.");let c=W(e.cwd,a,{includeLegacy:!0}),s=c,f=O(e.cwd),p=e.sourceMaps===!0,m=e.inline===!0,d,u;if(c.some(l=>l.legacy===!0)){d=await S(e.cwd,r.cache,!1);let l;try{l=await V(d.environments.ssr,n)}catch(g){throw await d.close(),g}u=l.basePath,l.supportsLegacyViews||(s=c.filter(g=>g.legacy!==!0))}if(s.length===0){d??=await S(e.cwd,r.cache,!1);try{await A(d.environments.ssr,n,{},s);let ae=await te(r.cache,n,{},s);await B({root:e.cwd,configFile:!1,envDir:!1,publicDir:!1,logLevel:"warn",cacheDir:r.cache,resolve:{tsconfigPaths:!0,alias:C(e.cwd)},plugins:[L(e.cwd)],build:{ssr:ae,outDir:r.build,emptyOutDir:!0,target:"node22",sourcemap:p,minify:!1,rollupOptions:{output:{format:"es",entryFileNames:y}}},ssr:{...E(e.cwd),target:"node"}})}finally{await d?.close()}await ee(e.cwd,w(r.build,"views/public"));let l={buildId:Z(8).toString("hex"),entryPoint:y,createdAt:new Date().toISOString(),views:{}};await P(r.build,{recursive:!0}),await D(r.buildManifest,`${JSON.stringify(l,null,2)}
4
4
  `);let g=Math.round(performance.now()-t);console.log(`[mcp-use] built ${v(e.cwd,n)} \u2192 ${v(e.cwd,r.build)}/${y} (${g}ms)`);return}await fe(r.build,{recursive:!0,force:!0});let M=w(r.build,"views");await P(M,{recursive:!0}),d??=await S(e.cwd,r.cache,!1);let _,R={},x=he();try{_=u??await Y(d.environments.ssr,n);for(let l of s){let g=await Me(l,{cwd:e.cwd,cacheDir:r.cache,viewsOutDir:M,userViteConfig:f,sourceMaps:p,inline:m});x!==void 0&&!m&&(g=ve(g,l.name,x,_)),R[l.name]=g}x!==void 0&&!m&&(console.log(`[mcp-use] MCP_ASSETS_URL set \u2014 manifest uses CDN URLs; upload ${v(e.cwd,M)}/ to your asset host.`),_!=="/mcp"&&console.log(`[mcp-use] CDN manifest uses basePath ${_} from server entry`)),await ee(e.cwd,w(M,"public")),await A(d.environments.ssr,n,R,s)}finally{await d.close()}let ne=await te(r.cache,n,R,s);await B({root:e.cwd,configFile:!1,envDir:!1,publicDir:!1,logLevel:"warn",cacheDir:r.cache,resolve:{tsconfigPaths:!0,alias:C(e.cwd)},oxc:{jsx:{runtime:"automatic"}},plugins:[L(e.cwd),k()],build:{ssr:ne,outDir:r.build,emptyOutDir:!1,target:"node22",sourcemap:p,minify:!1,rollupOptions:{output:{format:"es",entryFileNames:y}}},ssr:{...E(e.cwd),target:"node"}});let ie={buildId:Z(8).toString("hex"),entryPoint:y,createdAt:new Date().toISOString(),views:R};await P(r.build,{recursive:!0}),await D(r.buildManifest,`${JSON.stringify(ie,null,2)}
@@ -1 +1 @@
1
- import{a,b,c,d}from"../chunk-NFT6Z2DG.js";import"../chunk-VSIT62BK.js";import"../chunk-LNASFQWW.js";export{c as openDirectConnection,b as openSavedConnection,d as parseMcpArguments,a as runClient};
1
+ import{a,b,c,d}from"../chunk-KL7RFX6A.js";import"../chunk-VSIT62BK.js";import"../chunk-LNASFQWW.js";export{c as openDirectConnection,b as openSavedConnection,d as parseMcpArguments,a as runClient};
@@ -1,2 +1,2 @@
1
- import{b as ie}from"../chunk-OVFUQAEG.js";import{a as ne,b as re}from"../chunk-N7BU45K6.js";import{b as Q,c as Z}from"../chunk-USIKTT3N.js";import{a as ae,b as ce,c as le,d as de,e as ue,f as pe,g as H,i as F,j as fe,l as me}from"../chunk-2N6PJAKM.js";import{b as oe,c as se,d as A}from"../chunk-7G4TXPP4.js";import{a as x,b as te}from"../chunk-FLGSKQGU.js";import{a as ee}from"../chunk-LNASFQWW.js";import{existsSync as Ve}from"fs";import{createServer as xe}from"http";import{networkInterfaces as Ae}from"os";import{join as Fe,resolve as Be}from"path";import Ne from"@tailwindcss/vite";import We from"@vitejs/plugin-react";import{createServer as Ge,createServerModuleRunner as qe}from"vite";import{InMemoryServerEventBus as Je,localhostAllowedHostnames as ze,localhostAllowedOrigins as Ke,validateHostHeader as Xe,validateOriginHeader as Ye}from"@modelcontextprotocol/server";import{connect as Ce,createServer as Oe}from"net";var ve=100,He=300,Ue=new Set(["127.0.0.1","localhost","::1"]);function ke(e,r){return new Promise(s=>{let n=Oe();n.unref(),n.once("error",()=>s(!1)),n.listen({port:e,host:r},()=>{n.close(()=>s(!0))})})}function we(e,r){return new Promise(s=>{let n=Ce({port:e,host:r});n.setTimeout(He),n.once("connect",()=>{n.destroy(),s(!0)}),n.once("timeout",()=>{n.destroy(),s(!1)}),n.once("error",()=>{n.destroy(),s(!1)})})}async function De(e){return await we(e,"127.0.0.1")||await we(e,"::1")}async function he(e,r){for(let s=e;s<e+ve;s++)if(await ke(s,r)&&!(Ue.has(r)&&await De(s)))return{port:s,requested:e};throw new Error(`No free port found between ${e} and ${e+ve-1} on ${r}.`)}function ge(e,r){let s=()=>{let n=e.getBasePath(),{url:a}=e.tunnel.status();return{mcpUrl:a!==null?`${a.replace(/\/+$/,"")}${n}`:null,port:e.port,fromCli:!0,tunnelUrl:a}};return async n=>{let a=e.getBasePath(),u=`${a}/inspector/api/dev/info`,p=`${a}/inspector/api/dev/start-tunnel`,f=`${a}/inspector/api/dev/stop-tunnel`,y=new URL(n.url).pathname;if(n.method==="GET"&&y===u)return Response.json(s());if(n.method==="POST"&&y===p)try{return await e.tunnel.start(e.port),Response.json({ok:!0,restarting:!1})}catch(M){let U=M instanceof Error?M.message:"Failed to start tunnel";return Response.json({error:U},{status:500})}return n.method==="POST"&&y===f?(await e.tunnel.stop(),Response.json({ok:!0})):r(n)}}import{readFileSync as Ee}from"fs";import{createRequire as je}from"module";import{join as Te}from"path";import{pathToFileURL as $e}from"url";async function Re(e){let r=Te(e,"package.json"),s=JSON.parse(Ee(r,"utf8"));if([s.dependencies,s.devDependencies,s.optionalDependencies].some(u=>u!==null&&typeof u=="object"&&"@mcp-use/inspector"in u)){let u=je(r);try{let p=u.resolve("@mcp-use/inspector");return ye(await import($e(p).href))}catch(p){if(!Pe(p))throw p}}try{return ye(await import("@mcp-use/inspector"))}catch(u){if(Pe(u))return{installed:!1};throw u}}function ye(e){if(typeof e.mountInspector!="function")throw new Error("The installed @mcp-use/inspector is incompatible: its package entry does not export mountInspector(). Update the development dependency.");return{installed:!0,module:e}}function Pe(e){let r=e!==null&&typeof e=="object"&&"code"in e?String(e.code):void 0;return r==="ERR_MODULE_NOT_FOUND"||r==="MODULE_NOT_FOUND"}var _e="__mcpUseV1CompatServer";function Qe(e){ee(e)}function Ze(){for(let e of Object.values(Ae()))for(let r of e??[])if(!r.internal&&r.family==="IPv4")return r.address}function et(e){if(e!==void 0)try{return new URL(`http://${e}`).hostname.replace(/^\[|\]$/g,"")}catch{return}}function tt(e){let r=e.getHeader("Vary"),s=typeof r=="string"?r:Array.isArray(r)?r.join(", "):r!==void 0?String(r):"";s.split(",").map(n=>n.trim().toLowerCase()).includes("origin")||e.setHeader("Vary",s===""?"Origin":`${s}, Origin`)}function nt(e,r,s){if(s.tunnelActive){r.setHeader("Access-Control-Allow-Origin","*");return}if(!s.localhostBind)return;let n=e.headers.origin;if(n==="null"){r.setHeader("Access-Control-Allow-Origin","null");return}if(typeof n!="string"||n==="")return;let a=Ye(n,Ke());!a.ok||a.origin===void 0||(r.setHeader("Access-Control-Allow-Origin",a.origin),tt(r))}function rt(e){let r=e.default??globalThis[_e];if(r===null||typeof r!="object")throw new Error("The server entry must default-export the MCPServer instance (`export default server`) and never call listen() itself \u2014 `mcp-use dev` owns the socket.");let s=r;if(typeof s.fetch!="function")throw new Error("The entry's default export has no fetch() \u2014 it must be the MCPServer instance (`export default server`).");return s}async function ot(e){process.env.MCP_USE_DEV_CLI="1";let r=le(e.cwd),s=new Je(t=>{console.error("[mcp-use] notification delivery failed:",t)});se(e.cwd,"development");let n=Z(e.host),a=["127.0.0.1","localhost","::1"].includes(n),u=n==="0.0.0.0"||n==="::",p=xe(),{port:f,requested:y}=await he(Q(e.port),n);f!==y&&console.log(`[mcp-use] port ${y} is taken, using ${f}`),process.env.PORT=String(f);let M=process.env.MCP_URL===void 0&&(n==="127.0.0.1"||n==="localhost"||n==="::1")?`http://localhost:${f}`:void 0,U=e.mcpDir===void 0?e.cwd:Be(e.cwd,e.mcpDir),B=e.entry===void 0?x(U):x(e.cwd,e.entry),k=await te(e.cwd,B);(k==="created"||k==="updated")&&console.log(`[mcp-use] ${k} mcp-env.d.ts`);let P=e.viewsDir??(e.mcpDir===void 0?void 0:Fe(e.mcpDir,"views"));Ve(pe(e.cwd,P))||console.log("[mcp-use] views directory not configured.");let d=H(e.cwd,P,{includeLegacy:!0}),L=!1,R=d.length>0,Me=ae(e.cwd),D=["127.0.0.1","localhost","0.0.0.0","::","::1"].includes(n)?"localhost":n,b=`http://${D.includes(":")?`[${D}]`:D}:${f}`,m=await Ge({root:e.cwd,configFile:R?Me:!1,envDir:!1,logLevel:"warn",cacheDir:r.cache,resolve:{tsconfigPaths:!0,alias:{tailwindcss:ce()}},oxc:{jsx:{runtime:"automatic"}},plugins:R?[A(e.cwd),ue(),Ne(),me({getViews:()=>d,dev:{reactRefresh:!0}}),We()]:[A(e.cwd)],server:{middlewareMode:!0,...R&&{origin:b},cors:!1,hmr:R?{server:p}:!1,...!R&&{ws:!1}},ssr:{...oe(e.cwd)}}),E=m.environments.ssr,_=qe(E,{hmr:!1,sourcemapInterceptor:"node"}),N=async()=>{let t=async()=>{delete globalThis[_e];let i=process.env.MCP_USE_CLI_IMPORT,l;try{process.env.MCP_USE_CLI_IMPORT="1",l=await _.import(B)}finally{i===void 0?delete process.env.MCP_USE_CLI_IMPORT:process.env.MCP_USE_CLI_IMPORT=i}let c=rt(l);L=typeof c.__registerLegacyViews=="function",d=H(e.cwd,P,{includeLegacy:L});let w=d.filter(g=>g.legacy===!0);if(w.length>0){if(typeof c.__registerLegacyViews!="function")throw new Error("Legacy resources/*/widget.tsx views require the temporary mcp-use/server compatibility entry.");let g={};for(let O of w)g[O.name]=await _.import(de(O.entryPath));c.__registerLegacyViews(g)}let S=fe(d);if(typeof c.__primeViews!="function")throw new Error("Loaded MCPServer instance does not support __primeViews.");return c.__primeViews(S,{dev:!0,projectRoot:e.cwd}),c};if(M===void 0)return t();let o=process.env.MCP_URL;try{return process.env.MCP_URL=M,await t()}finally{o===void 0?delete process.env.MCP_URL:process.env.MCP_URL=o}},j,v;try{let t=await N();t.__setEventBus(s),t.__mount(),j=async o=>t.fetch(o),v=t.basePath??"/mcp"}catch(t){throw await _.close(),await m.close(),t}let T,I,W,G=t=>{if(T===void 0||W===t)return;let o=T.mountInspector({basePath:t,autoConnectUrl:`${b}${t}`,oauthProxyAllowLoopback:a||u,devMode:!0,manufactChatUrl:process.env.MANUFACT_CHAT_URL});if(typeof o!="function")throw new Error("The installed @mcp-use/inspector is incompatible: mountInspector() did not return a Fetch handler.");I=o,W=t};try{if(e.inspector!==!1){let t=await Re(e.cwd);t.installed&&(T=t.module,G(v))}}catch(t){throw await _.close(),await m.close(),t}let $=!1,V=!1,q=()=>{if($){V=!0;return}$=!0,(async()=>{do{V=!1;try{_.evaluatedModules.clear();let t=await N();t.__setEventBus(s),t.__mount();let o=async l=>t.fetch(l),i=t.basePath??"/mcp";G(i),j=o,v=i,s.publish({kind:"tools_list_changed"}),s.publish({kind:"prompts_list_changed"}),s.publish({kind:"resources_list_changed"}),console.log("[mcp-use] reloaded server entry")}catch(t){console.error(`[mcp-use] reload failed \u2014 keeping the previous server:
2
- `,t)}}while(V);$=!1})()},J=t=>{if(F(t,e.cwd,P))return;let o=E.moduleGraph.getModulesByFile(t);if(!(o===void 0||o.size===0)){for(let i of o)E.moduleGraph.invalidateModule(i);q()}},z=t=>{if(!F(t,e.cwd,P))return;let o=d;d=H(e.cwd,P,{includeLegacy:L});let i=o.length!==d.length||o.some((c,w)=>c.name!==d[w]?.name||c.entryPath!==d[w]?.entryPath),l=L&&d.some(c=>c.legacy===!0&&c.entryPath===t);(i||l)&&q()},K=t=>{z(t),J(t)},C=t=>{z(t),J(t)};m.watcher.on("change",K),m.watcher.on("add",C),m.watcher.on("unlink",C);let h=ie(r.tunnel);p.prependListener("upgrade",t=>{let o=h.status().url;if(o===null)return;let i=new URL(o).hostname;t.headers.host?.split(":")[0]===i&&(t.headers.host=`localhost:${f}`)});let be=(t,o)=>{let i=h.status().url,l=i!==null?new URL(i).hostname:null,c=l!==null?[l]:[],w=Xe(t.headers.host,[...ze(),...c]);return w.ok?!1:(o.writeHead(403,{"content-type":"application/json"}),o.end(JSON.stringify({jsonrpc:"2.0",error:{code:-32e3,message:w.message},id:null})),!0)},X=async()=>{m.watcher.off("change",K),m.watcher.off("add",C),m.watcher.off("unlink",C),await h.stop(),await new Promise(t=>p.close(()=>t())),await _.close(),await m.close()},Ie=ge({getBasePath:()=>v,port:f,tunnel:h},t=>I!==void 0&&ne(t,v)?I(t):j(t)),{toNodeHandler:Se}=await import("../node-bridge-JJIA6K5P.js"),Y=Se({fetch:Ie}),Le=(t,o)=>{if(a&&be(t,o))return;let i=t.url??"/",l=new URL(i,"http://127.0.0.1").pathname,c=h.status().url,w=c===null?null:new URL(c).hostname,S=et(t.headers.host);if((w!==null&&S===w||u&&S!==void 0&&!["localhost","127.0.0.1","::1"].includes(S))&&re(l,v)){o.writeHead(404,{"content-type":"text/plain; charset=utf-8"}),o.end("Not Found");return}let g=R&&d.length>0,O=t.method==="GET"&&(l.startsWith("/@")||l.startsWith("/node_modules/")||l.startsWith("/.mcp-use/")||g&&l.startsWith("/views/"));g&&O?(nt(t,o,{tunnelActive:h.status().url!==null,localhostBind:a}),m.middlewares(t,o,()=>{Y(t,o)})):Y(t,o)};if(p.on("request",Le),await new Promise((t,o)=>{p.once("error",o),p.listen(f,n,()=>t())}),console.log("[mcp-use] dev server ready"),d.length>0&&console.log(` \u279C Views: ${d.map(t=>t.name).join(", ")}`),console.log(` \u279C MCP endpoint: ${b}${v}`),I!==void 0?console.log(` \u279C Inspector: ${b}${v}/inspector`):e.inspector!==!1&&console.warn("[mcp-use] Built-in Inspector is unavailable; reinstall mcp-use to restore visual testing."),n==="0.0.0.0"||n==="::"){let t=Ze();t!==void 0&&console.log(` \u279C Network: http://${t}:${f}${v}`)}if(a||console.warn(`[mcp-use] --host ${n} serves beyond this machine without Host validation or authentication \u2014 anyone with network access can call the MCP endpoint and dev routes.`),e.tunnel===!0)try{let{url:t}=await h.start(f);console.log(` \u279C Tunnel: ${t}${v}`)}catch(t){throw await X(),t}I!==void 0&&e.open!==!1&&process.stdout.isTTY===!0&&Qe(`${b}${v}/inspector`),await new Promise(t=>{let o=!1,i=()=>{o||(o=!0,process.off("SIGINT",i),process.off("SIGTERM",i),(async()=>(await X(),t()))())};process.on("SIGINT",i),process.on("SIGTERM",i),e.signal!==void 0&&(e.signal.aborted?i():e.signal.addEventListener("abort",i,{once:!0}))})}export{ot as runDev};
1
+ import{b as ie}from"../chunk-OVFUQAEG.js";import{a as ne,b as re}from"../chunk-N7BU45K6.js";import{b as Z,c as Q}from"../chunk-USIKTT3N.js";import{a as ae,b as ce,c as le,d as de,e as ue,f as pe,g as D,i as F,j as fe,l as me,m as ve,n as we}from"../chunk-YMYENQ4W.js";import{b as oe,c as se,d as x}from"../chunk-7G4TXPP4.js";import{a as A,b as te}from"../chunk-FLGSKQGU.js";import{a as ee}from"../chunk-LNASFQWW.js";import{existsSync as xe}from"fs";import{createServer as Fe}from"http";import{networkInterfaces as Be}from"os";import{join as Ne,resolve as We}from"path";import Ge from"@tailwindcss/vite";import qe from"@vitejs/plugin-react";import{createServer as ze,createServerModuleRunner as Je}from"vite";import{InMemoryServerEventBus as Ke,localhostAllowedHostnames as Xe,localhostAllowedOrigins as Ye,validateHostHeader as Ze,validateOriginHeader as Qe}from"@modelcontextprotocol/server";import{connect as De,createServer as Oe}from"net";var he=100,He=300,Ue=new Set(["127.0.0.1","localhost","::1"]);function ke(e,r){return new Promise(s=>{let n=Oe();n.unref(),n.once("error",()=>s(!1)),n.listen({port:e,host:r},()=>{n.close(()=>s(!0))})})}function ge(e,r){return new Promise(s=>{let n=De({port:e,host:r});n.setTimeout(He),n.once("connect",()=>{n.destroy(),s(!0)}),n.once("timeout",()=>{n.destroy(),s(!1)}),n.once("error",()=>{n.destroy(),s(!1)})})}async function Te(e){return await ge(e,"127.0.0.1")||await ge(e,"::1")}async function ye(e,r){for(let s=e;s<e+he;s++)if(await ke(s,r)&&!(Ue.has(r)&&await Te(s)))return{port:s,requested:e};throw new Error(`No free port found between ${e} and ${e+he-1} on ${r}.`)}function Pe(e,r){let s=()=>{let n=e.getBasePath(),{url:a}=e.tunnel.status();return{mcpUrl:a!==null?`${a.replace(/\/+$/,"")}${n}`:null,port:e.port,fromCli:!0,tunnelUrl:a}};return async n=>{let a=e.getBasePath(),u=`${a}/inspector/api/dev/info`,p=`${a}/inspector/api/dev/start-tunnel`,f=`${a}/inspector/api/dev/stop-tunnel`,y=new URL(n.url).pathname;if(n.method==="GET"&&y===u)return Response.json(s());if(n.method==="POST"&&y===p)try{return await e.tunnel.start(e.port),Response.json({ok:!0,restarting:!1})}catch(M){let O=M instanceof Error?M.message:"Failed to start tunnel";return Response.json({error:O},{status:500})}return n.method==="POST"&&y===f?(await e.tunnel.stop(),Response.json({ok:!0})):r(n)}}import{readFileSync as je}from"fs";import{createRequire as Ve}from"module";import{join as $e}from"path";import{pathToFileURL as Ae}from"url";async function Me(e){let r=$e(e,"package.json"),s=JSON.parse(je(r,"utf8"));if([s.dependencies,s.devDependencies,s.optionalDependencies].some(u=>u!==null&&typeof u=="object"&&"@mcp-use/inspector"in u)){let u=Ve(r);try{let p=u.resolve("@mcp-use/inspector");return _e(await import(Ae(p).href))}catch(p){if(!Re(p))throw p}}try{return _e(await import("@mcp-use/inspector"))}catch(u){if(Re(u))return{installed:!1};throw u}}function _e(e){if(typeof e.mountInspector!="function")throw new Error("The installed @mcp-use/inspector is incompatible: its package entry does not export mountInspector(). Update the development dependency.");return{installed:!0,module:e}}function Re(e){let r=e!==null&&typeof e=="object"&&"code"in e?String(e.code):void 0;return r==="ERR_MODULE_NOT_FOUND"||r==="MODULE_NOT_FOUND"}var Ie="__mcpUseV1CompatServer";function et(e){ee(e)}function tt(){for(let e of Object.values(Be()))for(let r of e??[])if(!r.internal&&r.family==="IPv4")return r.address}function nt(e){if(e!==void 0)try{return new URL(`http://${e}`).hostname.replace(/^\[|\]$/g,"")}catch{return}}function rt(e){let r=e.getHeader("Vary"),s=typeof r=="string"?r:Array.isArray(r)?r.join(", "):r!==void 0?String(r):"";s.split(",").map(n=>n.trim().toLowerCase()).includes("origin")||e.setHeader("Vary",s===""?"Origin":`${s}, Origin`)}function ot(e,r,s){if(s.tunnelActive){r.setHeader("Access-Control-Allow-Origin","*");return}if(!s.localhostBind)return;let n=e.headers.origin;if(n==="null"){r.setHeader("Access-Control-Allow-Origin","null");return}if(typeof n!="string"||n==="")return;let a=Qe(n,Ye());!a.ok||a.origin===void 0||(r.setHeader("Access-Control-Allow-Origin",a.origin),rt(r))}function st(e){let r=e.default??globalThis[Ie];if(r===null||typeof r!="object")throw new Error("The server entry must default-export the MCPServer instance (`export default server`) and never call listen() itself \u2014 `mcp-use dev` owns the socket.");let s=r;if(typeof s.fetch!="function")throw new Error("The entry's default export has no fetch() \u2014 it must be the MCPServer instance (`export default server`).");return s}async function it(e){process.env.MCP_USE_DEV_CLI="1";let r=le(e.cwd),s=new Ke(t=>{console.error("[mcp-use] notification delivery failed:",t)});se(e.cwd,"development");let n=Q(e.host),a=["127.0.0.1","localhost","::1"].includes(n),u=n==="0.0.0.0"||n==="::",p=Fe(),{port:f,requested:y}=await ye(Z(e.port),n);f!==y&&console.log(`[mcp-use] port ${y} is taken, using ${f}`),process.env.PORT=String(f);let M=process.env.MCP_URL===void 0&&(n==="127.0.0.1"||n==="localhost"||n==="::1")?`http://localhost:${f}`:void 0,O=e.mcpDir===void 0?e.cwd:We(e.cwd,e.mcpDir),B=e.entry===void 0?A(O):A(e.cwd,e.entry),H=await te(e.cwd,B);(H==="created"||H==="updated")&&console.log(`[mcp-use] ${H} mcp-env.d.ts`);let P=e.viewsDir??(e.mcpDir===void 0?void 0:Ne(e.mcpDir,"views"));xe(pe(e.cwd,P))||console.log("[mcp-use] views directory not configured.");let d=D(e.cwd,P,{includeLegacy:!0}),C=!1,_=d.length>0,be=ae(e.cwd),U=["127.0.0.1","localhost","0.0.0.0","::","::1"].includes(n)?"localhost":n,I=`http://${U.includes(":")?`[${U}]`:U}:${f}`,m=await ze({root:e.cwd,configFile:_?be:!1,envDir:!1,logLevel:"warn",cacheDir:r.cache,resolve:{tsconfigPaths:!0,alias:{tailwindcss:ce()},dedupe:me},optimizeDeps:ve,oxc:{jsx:{runtime:"automatic"}},plugins:_?[x(e.cwd),ue(),Ge(),we({getViews:()=>d,dev:{reactRefresh:!0}}),qe()]:[x(e.cwd)],server:{middlewareMode:!0,..._&&{origin:I},cors:!1,hmr:_?{server:p}:!1,...!_&&{ws:!1}},ssr:{...oe(e.cwd)}}),k=m.environments.ssr,R=Je(k,{hmr:!1,sourcemapInterceptor:"node"}),N=async()=>{let t=async()=>{delete globalThis[Ie];let i=process.env.MCP_USE_CLI_IMPORT,l;try{process.env.MCP_USE_CLI_IMPORT="1",l=await R.import(B)}finally{i===void 0?delete process.env.MCP_USE_CLI_IMPORT:process.env.MCP_USE_CLI_IMPORT=i}let c=st(l);C=typeof c.__registerLegacyViews=="function",d=D(e.cwd,P,{includeLegacy:C});let w=d.filter(g=>g.legacy===!0);if(w.length>0){if(typeof c.__registerLegacyViews!="function")throw new Error("Legacy resources/*/widget.tsx views require the temporary mcp-use/server compatibility entry.");let g={};for(let L of w)g[L.name]=await R.import(de(L.entryPath));c.__registerLegacyViews(g)}let S=fe(d);if(typeof c.__primeViews!="function")throw new Error("Loaded MCPServer instance does not support __primeViews.");return c.__primeViews(S,{dev:!0,projectRoot:e.cwd}),c};if(M===void 0)return t();let o=process.env.MCP_URL;try{return process.env.MCP_URL=M,await t()}finally{o===void 0?delete process.env.MCP_URL:process.env.MCP_URL=o}},T,v;try{let t=await N();t.__setEventBus(s),t.__mount(),T=async o=>t.fetch(o),v=t.basePath??"/mcp"}catch(t){throw await R.close(),await m.close(),t}let j,b,W,G=t=>{if(j===void 0||W===t)return;let o=j.mountInspector({basePath:t,autoConnectUrl:`${I}${t}`,oauthProxyAllowLoopback:a||u,devMode:!0,manufactChatUrl:process.env.MANUFACT_CHAT_URL});if(typeof o!="function")throw new Error("The installed @mcp-use/inspector is incompatible: mountInspector() did not return a Fetch handler.");b=o,W=t};try{if(e.inspector!==!1){let t=await Me(e.cwd);t.installed&&(j=t.module,G(v))}}catch(t){throw await R.close(),await m.close(),t}let V=!1,$=!1,q=()=>{if(V){$=!0;return}V=!0,(async()=>{do{$=!1;try{R.evaluatedModules.clear();let t=await N();t.__setEventBus(s),t.__mount();let o=async l=>t.fetch(l),i=t.basePath??"/mcp";G(i),T=o,v=i,s.publish({kind:"tools_list_changed"}),s.publish({kind:"prompts_list_changed"}),s.publish({kind:"resources_list_changed"}),console.log("[mcp-use] reloaded server entry")}catch(t){console.error(`[mcp-use] reload failed \u2014 keeping the previous server:
2
+ `,t)}}while($);V=!1})()},z=t=>{if(F(t,e.cwd,P))return;let o=k.moduleGraph.getModulesByFile(t);if(!(o===void 0||o.size===0)){for(let i of o)k.moduleGraph.invalidateModule(i);q()}},J=t=>{if(!F(t,e.cwd,P))return;let o=d;d=D(e.cwd,P,{includeLegacy:C});let i=o.length!==d.length||o.some((c,w)=>c.name!==d[w]?.name||c.entryPath!==d[w]?.entryPath),l=C&&d.some(c=>c.legacy===!0&&c.entryPath===t);(i||l)&&q()},K=t=>{J(t),z(t)},E=t=>{J(t),z(t)};m.watcher.on("change",K),m.watcher.on("add",E),m.watcher.on("unlink",E);let h=ie(r.tunnel);p.prependListener("upgrade",t=>{let o=h.status().url;if(o===null)return;let i=new URL(o).hostname;t.headers.host?.split(":")[0]===i&&(t.headers.host=`localhost:${f}`)});let Se=(t,o)=>{let i=h.status().url,l=i!==null?new URL(i).hostname:null,c=l!==null?[l]:[],w=Ze(t.headers.host,[...Xe(),...c]);return w.ok?!1:(o.writeHead(403,{"content-type":"application/json"}),o.end(JSON.stringify({jsonrpc:"2.0",error:{code:-32e3,message:w.message},id:null})),!0)},X=async()=>{m.watcher.off("change",K),m.watcher.off("add",E),m.watcher.off("unlink",E),await h.stop(),await new Promise(t=>p.close(()=>t())),await R.close(),await m.close()},Ce=Pe({getBasePath:()=>v,port:f,tunnel:h},t=>b!==void 0&&ne(t,v)?b(t):T(t)),{toNodeHandler:Ee}=await import("../node-bridge-WOT2W5YZ.js"),Y=Ee({fetch:Ce}),Le=(t,o)=>{if(a&&Se(t,o))return;let i=t.url??"/",l=new URL(i,"http://127.0.0.1").pathname,c=h.status().url,w=c===null?null:new URL(c).hostname,S=nt(t.headers.host);if((w!==null&&S===w||u&&S!==void 0&&!["localhost","127.0.0.1","::1"].includes(S))&&re(l,v)){o.writeHead(404,{"content-type":"text/plain; charset=utf-8"}),o.end("Not Found");return}let g=_&&d.length>0,L=t.method==="GET"&&(l.startsWith("/@")||l.startsWith("/node_modules/")||l.startsWith("/.mcp-use/")||g&&l.startsWith("/views/"));g&&L?(ot(t,o,{tunnelActive:h.status().url!==null,localhostBind:a}),m.middlewares(t,o,()=>{Y(t,o)})):Y(t,o)};if(p.on("request",Le),await new Promise((t,o)=>{p.once("error",o),p.listen(f,n,()=>t())}),console.log("[mcp-use] dev server ready"),d.length>0&&console.log(` \u279C Views: ${d.map(t=>t.name).join(", ")}`),console.log(` \u279C MCP endpoint: ${I}${v}`),b!==void 0?console.log(` \u279C Inspector: ${I}${v}/inspector`):e.inspector!==!1&&console.warn("[mcp-use] Built-in Inspector is unavailable; reinstall mcp-use to restore visual testing."),n==="0.0.0.0"||n==="::"){let t=tt();t!==void 0&&console.log(` \u279C Network: http://${t}:${f}${v}`)}if(a||console.warn(`[mcp-use] --host ${n} serves beyond this machine without Host validation or authentication \u2014 anyone with network access can call the MCP endpoint and dev routes.`),e.tunnel===!0)try{let{url:t}=await h.start(f);console.log(` \u279C Tunnel: ${t}${v}`)}catch(t){throw await X(),t}b!==void 0&&e.open!==!1&&process.stdout.isTTY===!0&&et(`${I}${v}/inspector`),await new Promise(t=>{let o=!1,i=()=>{o||(o=!0,process.off("SIGINT",i),process.off("SIGTERM",i),(async()=>(await X(),t()))())};process.on("SIGINT",i),process.on("SIGTERM",i),e.signal!==void 0&&(e.signal.aborted?i():e.signal.addEventListener("abort",i,{once:!0}))})}export{it as runDev};
@@ -1,4 +1,4 @@
1
- import{b as M,c as $,d as x}from"../chunk-NFT6Z2DG.js";import{a as c,b as s,c as _,d as k,e as R}from"../chunk-VSIT62BK.js";import"../chunk-LNASFQWW.js";import{spawn as H}from"child_process";import{access as N,mkdtemp as j,rm as A,writeFile as F}from"fs/promises";import{createServer as G}from"net";import{tmpdir as J}from"os";import{basename as V,join as q,resolve as W}from"path";import{parseArgs as z}from"util";import{fileURLToPath as K}from"url";async function Pe(r){let n=_(r),e,t,i;try{let{values:o,positionals:a}=z({args:[...r],allowPositionals:!0,strict:!0,options:{server:{type:"string"},mcp:{type:"string"},tool:{type:"string"},header:{type:"string",short:"H",multiple:!0},output:{type:"string"},width:{type:"string",default:"1280"},height:{type:"string",default:"720"},"device-scale-factor":{type:"string",default:"1"},theme:{type:"string",default:"light"},inspector:{type:"string"},"cdp-url":{type:"string"},"wait-for":{type:"string"},delay:{type:"string",default:"0"},timeout:{type:"string",default:"30000"},json:{type:"boolean"}}});if(o.server===void 0==(o.mcp===void 0))throw new c("Exactly one of --server or --mcp is required.");if(o.tool===void 0)throw new c("--tool is required.");if(o.server!==void 0&&o.header!==void 0)throw new c("--header is valid only with --mcp.");if(o.theme!=="light"&&o.theme!=="dark")throw new c("--theme must be light or dark.");let w=h(o.width,"--width"),y=h(o.height,"--height"),u=Number(o["device-scale-factor"]);if(!Number.isFinite(u)||u<=0||u>4)throw new c("--device-scale-factor must be greater than 0 and at most 4.");let l=h(o.timeout,"--timeout"),b=de(o.delay,"--delay"),U=ce(o.header??[]);e=o.server!==void 0?await M(o.server):await $(new URL(o.mcp).href,U);let P=(await e.listTools()).find(O=>O.name===o.tool);if(P===void 0)throw new s("tool_not_found",`Tool not found: ${o.tool}`);let m=Z(P),C=x(a),f=await e.callTool(o.tool,C,{timeout:l});if(f.isError===!0)throw new s("tool_failed",`Tool ${o.tool} returned an error.`,f);let I=await e.readResource(m);ee(I),i=o.inspector===void 0?await X(l):void 0;let E=(o.inspector??i.origin).replace(/\/+$/,"");await B(E,l);let S=te(m),p=new URL(`${E}/inspector/preview/${encodeURIComponent(S)}`);p.searchParams.set("protocol","1"),p.searchParams.set("theme",o.theme),p.searchParams.set("width",String(w)),t=o["cdp-url"]!==void 0?await re(o["cdp-url"]):await ne(),await t.cdp.send("Emulation.setDeviceMetricsOverride",{width:w,height:y,deviceScaleFactor:u,mobile:!1},t.sessionId),await t.cdp.send("Page.enable",{},t.sessionId),await t.cdp.send("Runtime.enable",{},t.sessionId),await t.cdp.send("Page.addScriptToEvaluateOnNewDocument",{source:`globalThis.__mcpUsePreviewBundle = ${ue({resourceUri:m,resourceContents:I,toolInput:C,toolOutput:f})};`},t.sessionId),await t.cdp.send("Page.navigate",{url:p.href},t.sessionId),await oe(t,l),await ie(t,o["wait-for"],l),b>0&&await d(b);let T=await t.cdp.send("Page.captureScreenshot",{format:"png",captureBeyondViewport:!1},t.sessionId);if(typeof T.data!="string")throw new s("capture_failed","Chrome returned no screenshot data.");let g=W(o.output??`${S}-${new Date().toISOString().replace(/[:.]/g,"-")}.png`);return await F(g,Buffer.from(T.data,"base64")),k({path:g,width:w,height:y,deviceScaleFactor:u},n,g),0}catch(o){return R(o instanceof TypeError?new c(o.message):o,n)}finally{await t?.close().catch(()=>{}),await i?.close().catch(()=>{}),await e?.disconnect().catch(()=>{})}}async function X(r){let n=await D(),e=import.meta.resolve("@mcp-use/inspector"),t=K(new URL("../cli.js",e)),i=H(process.execPath,[t,"--port",String(n),"--no-open"],{stdio:"ignore"}),o=`http://127.0.0.1:${n}`;try{await Q(o,i,Math.min(r,1e4))}catch(a){throw i.kill("SIGTERM"),a}return{origin:o,async close(){await Y(i)}}}async function Q(r,n,e){let t=Date.now()+e;for(;Date.now()<t;){if(n.exitCode!==null)throw new s("inspector_start_failed",`Packaged Inspector exited before becoming ready (code ${n.exitCode}).`);try{await B(r,Math.min(1e3,e));return}catch{await d(100)}}throw new s("inspector_start_failed","Packaged Inspector did not start in time.")}async function Y(r){r.exitCode===null&&(r.kill("SIGTERM"),await Promise.race([new Promise(n=>r.once("exit",()=>n())),d(2e3)]),r.exitCode===null&&r.kill("SIGKILL"))}async function B(r,n){let e=await fetch(`${r}/inspector/health`,{signal:AbortSignal.timeout(n)});if(!e.ok)throw new s("incompatible_inspector",`Inspector health check failed (${e.status}).`);let t=await e.json();if(t.status!=="ok"||t.protocol!=="mcp-use-inspector-preview"||t.version!==1||!t.capabilities?.includes("view-preview"))throw new s("incompatible_inspector","Inspector does not support mcp-use-inspector-preview version 1.")}function Z(r){let n=r!==null&&typeof r=="object"?r._meta:void 0,t=(n?.ui!==null&&typeof n?.ui=="object"?n.ui.resourceUri:void 0)??n?.["ui/resourceUri"];if(typeof t!="string")throw new s("missing_view","Tool does not advertise an MCP Apps UI resource.");return t}function ee(r){let n=r!==null&&typeof r=="object"?r.contents:void 0;if(!Array.isArray(n))throw new s("invalid_view","View resource has no contents.");let e=n.find(t=>t!==null&&typeof t=="object"&&typeof t.text=="string");if(e===void 0)throw new s("invalid_view","View resource has no HTML document.");return e.text}function te(r){let n=new URL(r);return V(n.pathname).replace(/\.html$/,"")||n.hostname}async function ne(){let r=await se(),n=await D(),e=await j(q(J(),"mcp-use-chrome-")),t=H(r,[`--remote-debugging-port=${n}`,`--user-data-dir=${e}`,"--headless=new","--no-first-run","--no-default-browser-check","about:blank"],{stdio:"ignore"});try{let i=await ae(`http://127.0.0.1:${n}/json/version`,1e4),o=await L(i.webSocketDebuggerUrl);return{...o,async close(){await o.close(),t.kill("SIGTERM"),await A(e,{recursive:!0,force:!0})}}}catch(i){throw t.kill("SIGTERM"),await A(e,{recursive:!0,force:!0}),i}}async function re(r){return L(r)}async function L(r){let n=await v.connect(r),e=await n.send("Target.createTarget",{url:"about:blank"}),t=await n.send("Target.attachToTarget",{targetId:e.targetId,flatten:!0});return{cdp:n,sessionId:t.sessionId,async close(){await n.send("Target.closeTarget",{targetId:e.targetId}).catch(()=>{}),n.close()}}}async function oe(r,n){let e=Date.now()+n;for(;Date.now()<e;){if((await r.cdp.send("Runtime.evaluate",{expression:"document.readyState",returnByValue:!0},r.sessionId)).result?.value==="complete")return;await d(100)}throw new s("browser_timeout","Inspector page did not load in time.")}async function ie(r,n,e){let t=Date.now()+e;for(;Date.now()<t;){let i=`(() => ({
1
+ import{b as M,c as $,d as x}from"../chunk-KL7RFX6A.js";import{a as c,b as s,c as _,d as k,e as R}from"../chunk-VSIT62BK.js";import"../chunk-LNASFQWW.js";import{spawn as H}from"child_process";import{access as N,mkdtemp as j,rm as A,writeFile as F}from"fs/promises";import{createServer as G}from"net";import{tmpdir as J}from"os";import{basename as V,join as q,resolve as W}from"path";import{parseArgs as z}from"util";import{fileURLToPath as K}from"url";async function Pe(r){let n=_(r),e,t,i;try{let{values:o,positionals:a}=z({args:[...r],allowPositionals:!0,strict:!0,options:{server:{type:"string"},mcp:{type:"string"},tool:{type:"string"},header:{type:"string",short:"H",multiple:!0},output:{type:"string"},width:{type:"string",default:"1280"},height:{type:"string",default:"720"},"device-scale-factor":{type:"string",default:"1"},theme:{type:"string",default:"light"},inspector:{type:"string"},"cdp-url":{type:"string"},"wait-for":{type:"string"},delay:{type:"string",default:"0"},timeout:{type:"string",default:"30000"},json:{type:"boolean"}}});if(o.server===void 0==(o.mcp===void 0))throw new c("Exactly one of --server or --mcp is required.");if(o.tool===void 0)throw new c("--tool is required.");if(o.server!==void 0&&o.header!==void 0)throw new c("--header is valid only with --mcp.");if(o.theme!=="light"&&o.theme!=="dark")throw new c("--theme must be light or dark.");let w=h(o.width,"--width"),y=h(o.height,"--height"),u=Number(o["device-scale-factor"]);if(!Number.isFinite(u)||u<=0||u>4)throw new c("--device-scale-factor must be greater than 0 and at most 4.");let l=h(o.timeout,"--timeout"),b=de(o.delay,"--delay"),U=ce(o.header??[]);e=o.server!==void 0?await M(o.server):await $(new URL(o.mcp).href,U);let P=(await e.listTools()).find(O=>O.name===o.tool);if(P===void 0)throw new s("tool_not_found",`Tool not found: ${o.tool}`);let m=Z(P),C=x(a),f=await e.callTool(o.tool,C,{timeout:l});if(f.isError===!0)throw new s("tool_failed",`Tool ${o.tool} returned an error.`,f);let I=await e.readResource(m);ee(I),i=o.inspector===void 0?await X(l):void 0;let E=(o.inspector??i.origin).replace(/\/+$/,"");await B(E,l);let S=te(m),p=new URL(`${E}/inspector/preview/${encodeURIComponent(S)}`);p.searchParams.set("protocol","1"),p.searchParams.set("theme",o.theme),p.searchParams.set("width",String(w)),t=o["cdp-url"]!==void 0?await re(o["cdp-url"]):await ne(),await t.cdp.send("Emulation.setDeviceMetricsOverride",{width:w,height:y,deviceScaleFactor:u,mobile:!1},t.sessionId),await t.cdp.send("Page.enable",{},t.sessionId),await t.cdp.send("Runtime.enable",{},t.sessionId),await t.cdp.send("Page.addScriptToEvaluateOnNewDocument",{source:`globalThis.__mcpUsePreviewBundle = ${ue({resourceUri:m,resourceContents:I,toolInput:C,toolOutput:f})};`},t.sessionId),await t.cdp.send("Page.navigate",{url:p.href},t.sessionId),await oe(t,l),await ie(t,o["wait-for"],l),b>0&&await d(b);let T=await t.cdp.send("Page.captureScreenshot",{format:"png",captureBeyondViewport:!1},t.sessionId);if(typeof T.data!="string")throw new s("capture_failed","Chrome returned no screenshot data.");let g=W(o.output??`${S}-${new Date().toISOString().replace(/[:.]/g,"-")}.png`);return await F(g,Buffer.from(T.data,"base64")),k({path:g,width:w,height:y,deviceScaleFactor:u},n,g),0}catch(o){return R(o instanceof TypeError?new c(o.message):o,n)}finally{await t?.close().catch(()=>{}),await i?.close().catch(()=>{}),await e?.disconnect().catch(()=>{})}}async function X(r){let n=await D(),e=import.meta.resolve("@mcp-use/inspector"),t=K(new URL("../cli.js",e)),i=H(process.execPath,[t,"--port",String(n),"--no-open"],{stdio:"ignore"}),o=`http://127.0.0.1:${n}`;try{await Q(o,i,Math.min(r,1e4))}catch(a){throw i.kill("SIGTERM"),a}return{origin:o,async close(){await Y(i)}}}async function Q(r,n,e){let t=Date.now()+e;for(;Date.now()<t;){if(n.exitCode!==null)throw new s("inspector_start_failed",`Packaged Inspector exited before becoming ready (code ${n.exitCode}).`);try{await B(r,Math.min(1e3,e));return}catch{await d(100)}}throw new s("inspector_start_failed","Packaged Inspector did not start in time.")}async function Y(r){r.exitCode===null&&(r.kill("SIGTERM"),await Promise.race([new Promise(n=>r.once("exit",()=>n())),d(2e3)]),r.exitCode===null&&r.kill("SIGKILL"))}async function B(r,n){let e=await fetch(`${r}/inspector/health`,{signal:AbortSignal.timeout(n)});if(!e.ok)throw new s("incompatible_inspector",`Inspector health check failed (${e.status}).`);let t=await e.json();if(t.status!=="ok"||t.protocol!=="mcp-use-inspector-preview"||t.version!==1||!t.capabilities?.includes("view-preview"))throw new s("incompatible_inspector","Inspector does not support mcp-use-inspector-preview version 1.")}function Z(r){let n=r!==null&&typeof r=="object"?r._meta:void 0,t=(n?.ui!==null&&typeof n?.ui=="object"?n.ui.resourceUri:void 0)??n?.["ui/resourceUri"];if(typeof t!="string")throw new s("missing_view","Tool does not advertise an MCP Apps UI resource.");return t}function ee(r){let n=r!==null&&typeof r=="object"?r.contents:void 0;if(!Array.isArray(n))throw new s("invalid_view","View resource has no contents.");let e=n.find(t=>t!==null&&typeof t=="object"&&typeof t.text=="string");if(e===void 0)throw new s("invalid_view","View resource has no HTML document.");return e.text}function te(r){let n=new URL(r);return V(n.pathname).replace(/\.html$/,"")||n.hostname}async function ne(){let r=await se(),n=await D(),e=await j(q(J(),"mcp-use-chrome-")),t=H(r,[`--remote-debugging-port=${n}`,`--user-data-dir=${e}`,"--headless=new","--no-first-run","--no-default-browser-check","about:blank"],{stdio:"ignore"});try{let i=await ae(`http://127.0.0.1:${n}/json/version`,1e4),o=await L(i.webSocketDebuggerUrl);return{...o,async close(){await o.close(),t.kill("SIGTERM"),await A(e,{recursive:!0,force:!0})}}}catch(i){throw t.kill("SIGTERM"),await A(e,{recursive:!0,force:!0}),i}}async function re(r){return L(r)}async function L(r){let n=await v.connect(r),e=await n.send("Target.createTarget",{url:"about:blank"}),t=await n.send("Target.attachToTarget",{targetId:e.targetId,flatten:!0});return{cdp:n,sessionId:t.sessionId,async close(){await n.send("Target.closeTarget",{targetId:e.targetId}).catch(()=>{}),n.close()}}}async function oe(r,n){let e=Date.now()+n;for(;Date.now()<e;){if((await r.cdp.send("Runtime.evaluate",{expression:"document.readyState",returnByValue:!0},r.sessionId)).result?.value==="complete")return;await d(100)}throw new s("browser_timeout","Inspector page did not load in time.")}async function ie(r,n,e){let t=Date.now()+e;for(;Date.now()<t;){let i=`(() => ({
2
2
  ready: document.body?.dataset.viewReady === "true",
3
3
  error: document.body?.dataset.viewError || null,
4
4
  selector: ${JSON.stringify(n)} === undefined || !!document.querySelector(${JSON.stringify(n??"")})
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{a}from"./chunk-XIPXOMHU.js";import"./chunk-USIKTT3N.js";export{a as main};
1
+ import{a}from"./chunk-5CBUF6UX.js";import"./chunk-USIKTT3N.js";export{a as main};
@@ -0,0 +1 @@
1
+ var w=new WeakSet,b=new WeakMap;function p(e,d){if(e.body===null)return!1;if(w.has(e))return!0;let r=d===void 0?void 0:b.get(d);return r!==void 0&&r.body!==null&&r.body===e.body}function H(e,d){return async(r,o,f)=>{typeof f=="function"&&(f=void 0);let c=!1,s=new AbortController;o.on("close",()=>{c||s.abort()}),o.destroyed===!0&&s.abort();let u,n;try{u=await m(r,f,{signal:s.signal}),n=await e.fetch(u,{...r.auth!==void 0&&{authInfo:r.auth},...f!==void 0&&{parsedBody:f}})}catch(t){try{d?.onerror?.(t instanceof Error?t:new Error(String(t)))}catch{}n=A(k(f))}let i={};for(let[t,l]of n.headers)i[t]=l;if(o.writeHead(n.status,i),n.body===null){c=!0,o.end();return}if(p(n,u)){try{let t=new Uint8Array(await n.arrayBuffer());c=!0,o.end(t)}catch{c=!0,o.end()}return}let a,h=()=>{a?.(),a=void 0},R=()=>new Promise(t=>{a=t});o.on("drain",h);let y=new Promise(t=>{s.signal.addEventListener("abort",()=>t(),{once:!0})});try{for await(let t of n.body){if(s.signal.aborted)break;let l=t instanceof Uint8Array?t:new Uint8Array(t);o.write(l)===!1&&await Promise.race([R(),y])}}catch{}c=!0,o.end()}}async function m(e,d,r){let o=(e.method??"GET").toUpperCase(),c=`http://${g(e.headers.host)??g(e.headers[":authority"])??"localhost"}${e.url??"/"}`,s=new Headers;for(let[n,i]of Object.entries(e.headers))if(!(i===void 0||n.startsWith(":")))if(Array.isArray(i))for(let a of i)s.append(n,a);else s.set(n,i);let u;if(o!=="GET"&&o!=="HEAD")if(d===void 0){let n=new TextDecoder,i="";for await(let a of e)i+=typeof a=="string"?a:n.decode(a,{stream:!0});i+=n.decode(),i.length>0&&(u=i)}else{let n=JSON.stringify(d);s.delete("content-encoding"),s.delete("transfer-encoding"),n===void 0?s.delete("content-length"):(u=n,s.set("content-length",String(new TextEncoder().encode(n).byteLength)))}return new Request(c,{method:o,headers:s,...r?.signal!==void 0&&{signal:r.signal},...u!==void 0&&{body:u}})}function g(e){return Array.isArray(e)?e[0]:e}function k(e){if(e===null||typeof e!="object"||Array.isArray(e))return null;let{method:d,id:r}=e;return typeof d!="string"?null:typeof r=="string"||typeof r=="number"?r:null}function A(e){return Response.json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:e},{status:500})}export{H as toNodeHandler,m as toWebRequest};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mcp-use/cli",
3
3
  "type": "module",
4
- "version": "4.0.0-beta.12",
4
+ "version": "4.0.0-beta.14",
5
5
  "description": "Prebuilt CLI, development server, and build pipeline for mcp-use",
6
6
  "author": "mcp-use, Inc.",
7
7
  "license": "MIT",
@@ -1,8 +0,0 @@
1
- import{a as w,b as v,d as h}from"./chunk-7G4TXPP4.js";import{existsSync as _}from"fs";import{join as b}from"path";import{fileURLToPath as P}from"url";var S=["vite.config.ts","vite.config.js","vite.config.mts","vite.config.cjs"];function ee(e){for(let t of S){let n=b(e,t);if(_(n))return n}return!1}function te(){return P(import.meta.resolve("tailwindcss/index.css"))}import{join as u}from"path";var W=".mcp-use",A="manifest.json";function re(e){let t=u(e,W),n=u(t,"build");return{projectRoot:e,workspace:t,build:n,generated:u(t,"generated"),cache:u(t,"cache"),state:u(t,"state"),cloud:u(t,"cloud"),buildManifest:u(n,A),tunnel:u(t,"state","tunnel.json")}}import{readFile as L}from"fs/promises";import{dirname as T,resolve as U}from"path";var p="virtual:mcp-use/legacy-widget-metadata:",x=`\0${p}`;function ce(e){return`${p}${encodeURIComponent(e)}`}function V(){return{name:"mcp-use-legacy-widget-metadata",resolveId(e){if(e.startsWith(p))return`\0${e}`},async load(e){if(!e.startsWith(x))return;let t=decodeURIComponent(e.slice(x.length));this.addWatchFile(t);let n=await L(t,"utf8");return j(n,t)}}}function j(e,t){let n=/\bexport\s+const\s+widgetMetadata\b/g.exec(e);if(n===null)return`export const widgetMetadata = undefined;
2
- `;let r=C(e,n.index+n[0].length);if(r===-1)throw new Error(`Could not read widgetMetadata from ${t}: expected an exported const initializer.`);let i=k(e,r+1),o=e.slice(r+1,i).trim();if(o==="")throw new Error(`Could not read widgetMetadata from ${t}: the initializer is empty.`);return`${N(e,o,t).join(`
3
- `)}
4
- export const widgetMetadata = ${o};
5
- `}function C(e,t){for(let n=t;n<e.length;n+=1)if(e[n]==="="&&e[n+1]!==">")return n;return-1}function k(e,t){let n=[],r,i=!1,o=!1,c=!1;for(let a=t;a<e.length;a+=1){let s=e[a],d=e[a+1];if(o){s===`
6
- `&&(o=!1);continue}if(c){s==="*"&&d==="/"&&(c=!1,a+=1);continue}if(r!==void 0){i?i=!1:s==="\\"?i=!0:s===r&&(r=void 0);continue}if(s==="/"&&d==="/"){o=!0,a+=1;continue}if(s==="/"&&d==="*"){c=!0,a+=1;continue}if(s==="'"||s==='"'||s==="`"){r=s;continue}if(s==="("||s==="["||s==="{"){n.push(s);continue}if(s===")"||s==="]"||s==="}"){n.pop();continue}if(s===";"&&n.length===0)return a}return e.length}function N(e,t,n){let r=[],i=/\bimport\s+([\s\S]*?)\s+from\s+(["'])([^"']+)\2\s*(?:with\s*\{[^}]*\})?\s*;?/g;for(let o of e.matchAll(i)){let c=o[0],a=o[1]??"",s=o[3]??"";if(!O(a).some(D=>F(t,D)))continue;let R=s.startsWith(".")?U(T(n),s):s;r.push(c.replace(s,R))}return r}function O(e){let t=[],n=e.replace(/^\s*type\s+/,"").trim(),r=/\*\s+as\s+([A-Za-z_$][\w$]*)/.exec(n);r?.[1]!==void 0&&t.push(r[1]);let i=/\{([\s\S]*?)\}/.exec(n)?.[1];if(i!==void 0)for(let c of i.split(",")){let a=c.trim().replace(/^type\s+/,"");if(a==="")continue;let s=/\bas\s+([A-Za-z_$][\w$]*)$/.exec(a)?.[1];t.push(s??a.split(/\s+/)[0])}let o=n.split(/[,{*]/,1)[0]?.trim();return o!==void 0&&/^[A-Za-z_$][\w$]*$/.test(o)&&t.push(o),t}function F(e,t){return new RegExp(`(^|[^\\w$])${z(t)}([^\\w$]|$)`).test(e)}function z(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}import{existsSync as y,readdirSync as X}from"fs";import{dirname as $,isAbsolute as B,join as q,resolve as f}from"path";import Z from"@vitejs/plugin-react";var J="views",l="virtual:mcp-use/views/",m=`\0${l}`;function E(e,t){let n=t??J;return B(n)?n:f(e,n)}function ge(e,t,n){let r=E(e,t),i=t===void 0?f(e,"resources"):f($(r),"resources"),o=new Map;I(r,"view.tsx",!1,o),n?.includeLegacy===!0&&I(i,"widget.tsx",!0,o);let c=[...o.values()];return c.sort((a,s)=>a.name.localeCompare(s.name)),c}function I(e,t,n,r){if(y(e))for(let i of X(e,{withFileTypes:!0})){if(!i.isDirectory())continue;let o=q(e,i.name,t);if(y(o)){if(n&&r.has(i.name)){console.warn(`[mcp-use] Both native and legacy view entries exist for "${i.name}"; using views/${i.name}/view.tsx.`);continue}r.set(i.name,{name:i.name,entryPath:o,...n&&{legacy:!0}})}}}function G(e){return`${l}${e}`}function K(e){return`/@id/__x00__${l}${e}`}function we(e,t,n){let r=E(t,n),i=n===void 0?f(t,"resources"):f($(r),"resources");return e===r||e.startsWith(`${r}/`)||e===i||e.startsWith(`${i}/`)}function ve(e){let t={};for(let n of e)t[n.name]={kind:"external",entry:K(n.name),css:[],scripts:["/@vite/client"]};return t}async function he(e,t,n){let{createServer:r}=await import("vite");return r({root:e,configFile:n,envDir:!1,logLevel:"warn",cacheDir:t,resolve:{tsconfigPaths:!0,alias:w(e)},oxc:{jsx:{runtime:"automatic"}},plugins:[h(e),V(),Z()],server:{middlewareMode:!0,hmr:!1,ws:!1},ssr:{...v(e)}})}var g="virtual:mcp-use/tailwind.css",M=`\0${g}`;function ye(e){return{name:"mcp-use-views",applyToEnvironment(t){return t.name==="client"},resolveId(t){if(t===g)return M;if(t.startsWith(l))return`\0${t}`},load(t){if(t===M)return['@import "tailwindcss";',"@custom-variant dark (&:where(.dark, .dark *, [data-theme=dark], [data-theme=dark] *));"].join(`
7
- `);if(!t.startsWith(m))return;let n=t.slice(m.length),r=e.getViews().find(o=>o.name===n);if(r===void 0)return;let i=[];return e.dev?.reactRefresh===!0&&i.push('import "@vitejs/plugin-react/preamble";'),i.push(`import ${JSON.stringify(g)};`),i.push('import { bootstrapView } from "mcp-use/react";'),i.push(`import * as viewModule from ${JSON.stringify(r.entryPath)};`),r.legacy===!0?i.push("const legacyMetadata = viewModule.widgetMetadata?.metadata;","bootstrapView({ ...viewModule, viewConfig: {"," ...(legacyMetadata?.autoResize !== undefined && { autoResize: legacyMetadata.autoResize }),","} });"):i.push("bootstrapView(viewModule);"),e.dev!==void 0&&i.push("if (import.meta.hot) {"," import.meta.hot.accept();","}"),i.push(""),i.join(`
8
- `)}}}export{ee as a,te as b,re as c,ce as d,V as e,E as f,ge as g,G as h,we as i,ve as j,he as k,ye as l};
@@ -1,37 +0,0 @@
1
- import{a as c,b as g,c as j,d as p,e as x,f as L,g as N,h,i as k,j as w,l as R}from"./chunk-VSIT62BK.js";import{createHash as ie}from"crypto";import{rm as J}from"fs/promises";import{join as C}from"path";import{createInterface as ae}from"readline/promises";import{parseArgs as b}from"util";import{spawn as q}from"child_process";import{readFileSync as z}from"fs";import{chmod as K,mkdir as W}from"fs/promises";import{dirname as V,join as y,resolve as Y}from"path";import{pathToFileURL as M}from"url";var v=y(R,"client-sdk"),m="@mcp-use/client",Z="^2.0.0-alpha.0",Q=[`[mcp-use] ${m} is not installed.`,"The `mcp-use client` and `mcp-use screenshot` commands require it.","Install it in your project:",""," npm install @mcp-use/client",""," pnpm add @mcp-use/client",""," bun add @mcp-use/client"].join(`
2
- `);async function X(e){let n=Y(e);for(;;){if(await h(y(n,"package.json")))return n;let t=V(n);if(t===n)return;n=t}}async function D(){try{return await oe()}catch(e){if(!U(e))throw e;let n=await ee();try{return n.location==="sandbox"?await se():await re(n.projectRoot)}catch(t){throw U(t)?new c(Q):t}}}async function ee(){let e=ne(),n=`${m}@${e}`,t=await X(process.cwd());if(process.stderr.write(`[mcp-use] installing ${m}\u2026
3
- `),t!==void 0){let[s,i]=te(n);if(await I(s,i,t)!==0)throw new g("client_install_failed",`Failed to install ${m}.`);return{location:"project",projectRoot:t}}await W(v,{recursive:!0,mode:448}),await K(v,448);let o=y(v,"package.json");if(await h(o)||await w(o,{private:!0,dependencies:{[m]:e}}),await I("npm",["install",n],v)!==0)throw new g("client_install_failed",`Failed to install ${m}.`);return{location:"sandbox"}}function te(e){let n=process.env.npm_config_user_agent??"";return n.startsWith("pnpm/")?["pnpm",["add",e]]:n.startsWith("bun/")?["bun",["add",e]]:["npm",["install",e]]}function ne(){for(let e of["../package.json","../../package.json"])try{let n=z(new URL(e,import.meta.url),"utf8"),t=JSON.parse(n);if(t.name!=="mcp-use")continue;let o=t.peerDependencies?.[m];if(typeof o=="string"&&o.length>0)return o}catch{}return Z}async function oe(){return import("@mcp-use/client")}async function re(e){let n=M(y(e,"package.json")).href;return import(await import.meta.resolve(m,n))}async function se(){let e=y(v,"node_modules",m,"dist","index.js");return await import(M(e).href)}function U(e){if(!(e instanceof Error))return!1;let n=e.code;return n==="ERR_MODULE_NOT_FOUND"||n==="MODULE_NOT_FOUND"?e.message.includes(m)||e.message.includes("Cannot find package"):!1}function I(e,n,t){return new Promise((o,r)=>{let s=q(e,n,{cwd:t,stdio:"inherit",shell:process.platform==="win32"});s.once("error",r),s.once("exit",(i,u)=>{o(u==="SIGINT"?130:i??1)})})}var B=C(R,"client"),_=C(B,"servers.json"),ce=`Usage: mcp-use client <command> [options]
4
-
5
- Commands:
6
- connect <name> <url> Connect and save an HTTP(S) MCP server
7
- list [--json] List saved servers
8
- remove <name> Remove a saved server
9
- <name> Invoke tools/resources/prompts on a saved server
10
-
11
- Connect options:
12
- -H, --header <"Key: Value"> Static header (repeatable)
13
- --no-oauth Skip OAuth on authorization challenges
14
- --auth-timeout <ms> OAuth wait timeout (default: 300000)
15
- --protocol <auto|2026-07-28|2025-11-25>
16
- --no-open Print the OAuth URL only
17
- --json Emit machine-readable output
18
-
19
- Saved server commands:
20
- mcp-use client <name> tools list [--json]
21
- mcp-use client <name> tools describe <tool> [--json]
22
- mcp-use client <name> tools call <tool> [args...] [--timeout <ms>] [--json]
23
- mcp-use client <name> resources list [--json]
24
- mcp-use client <name> resources read <uri> [--json]
25
- mcp-use client <name> prompts list [--json]
26
- mcp-use client <name> prompts get <prompt> [args...] [--json]
27
- mcp-use client <name> auth status [--json]
28
- mcp-use client <name> auth logout [--yes] [--json]
29
-
30
- Examples:
31
- mcp-use client connect linear https://mcp.linear.app/mcp
32
- mcp-use client linear tools list
33
- mcp-use client linear tools call search_issues query="open bugs"`;async function xe(e){if(e.includes("--help")||e.includes("-h"))return console.log(ce),0;let n=j(e),t=e.filter(s=>s!=="--json"),o=t[0],r=n&&o!=="remove";try{if(o==="connect")return await le(t.slice(1),n);if(o==="list")return await ue(t.slice(1),n);if(o==="remove"){let s=e.indexOf("remove");return await de(e.filter((i,u)=>u!==s))}if(o===void 0)throw new c("Usage: mcp-use client <connect|list|remove|name>");return await pe(o,t.slice(1),n)}catch(s){return x(s instanceof TypeError?new c(s.message):s,r)}}async function le(e,n){let{values:t,positionals:o}=b({args:[...e],allowPositionals:!0,strict:!0,options:{header:{type:"string",short:"H",multiple:!0},"no-oauth":{type:"boolean"},"auth-timeout":{type:"string"},protocol:{type:"string",default:"auto"},"no-open":{type:"boolean"}}});if(o.length!==2)throw new c("Usage: mcp-use client connect <name> <url>");let[r,s]=o;he(r);let i=new URL(s);if(!["http:","https:"].includes(i.protocol))throw new c("Client URLs must use http or https.");let u=ge(t.protocol),l=G(t["auth-timeout"]??"300000","--auth-timeout"),a=await S();if(a.servers[r]!==void 0)throw new c(`Saved server already exists: ${r}`);let d={headers:we(t.header??[])},f={url:i.href,oauth:t["no-oauth"]!==!0,protocol:u};return await(await E(r,f,d,l,H({noOpen:t["no-open"]===!0,json:n}))).disconnect(),a.servers[r]=f,await w(_,a),await w(A(r),d),p({name:r,url:f.url,protocol:u},n,`Connected and saved ${r}.`),0}async function ue(e,n){P(e);let t=await S(),o=Object.entries(t.servers).map(([r,s])=>({name:r,...s}));return p(o,n,o.map(r=>`${r.name} ${r.url}`).join(`
34
- `)||"No saved servers."),0}async function de(e){let{positionals:n}=b({args:[...e],allowPositionals:!0,strict:!0,options:{}}),t=O(n,"mcp-use client remove <name>"),o=await S();return delete o.servers[t],await w(_,o),await J(T(t),{recursive:!0,force:!0}),p({removed:t},!1,`Removed ${t}.`),0}async function pe(e,n,t){let r=(await S()).servers[e];if(r===void 0)throw new c(`Unknown saved server: ${e}. Run \`mcp-use client connect ${e} <url>\`.`);let s=n[0],i=n[1];if(s==="auth"){if(i==="status"){P(n.slice(2));let a=await h($(e));return p({name:e,oauth:r.oauth,authenticated:a},t,a?"Authenticated.":"No saved OAuth session."),0}if(i==="logout"){let{values:a,positionals:d}=b({args:[...n.slice(2)],allowPositionals:!0,strict:!0,options:{yes:{type:"boolean"}}});if(d.length!==0)throw new c(`Usage: mcp-use client ${e} auth logout`);return await L(`Delete OAuth credentials for ${e}?`,{yes:a.yes===!0,json:t})&&(await J($(e),{recursive:!0,force:!0}),p({loggedOut:e},t,`Logged out ${e}.`)),0}}let u=await k(A(e),{}),l=await E(e,r,u,3e5,H({noOpen:!1,json:t}));try{if(s==="tools"){if(i==="list"){P(n.slice(2));let a=await l.listTools();return p(a,t,a.map(d=>d.description?`${d.name} - ${d.description}`:d.name).join(`
35
- `)),0}if(i==="describe"){let a=O(n.slice(2),`mcp-use client ${e} tools describe <tool>`),d=(await l.listTools()).find(f=>f.name===a);if(d===void 0)throw new c(`Tool not found: ${a}`);return p(d,t),0}if(i==="call")return await me(l,e,n.slice(2),t)}if(s==="resources"){if(i==="list"){P(n.slice(2));let a=await l.listResources();return p(a,t),0}if(i==="read"){let a=O(n.slice(2),`mcp-use client ${e} resources read <uri>`);return p(await l.readResource(a),t),0}}if(s==="prompts"){if(i==="list")return P(n.slice(2)),p(await l.listPrompts(),t),0;if(i==="get"){let a=n[2];if(a===void 0)throw new c(`Usage: mcp-use client ${e} prompts get <prompt> [args]`);return p(await l.getPrompt(a,F(n.slice(3))),t),0}}throw new c(`Usage: mcp-use client ${e} <tools|resources|prompts|auth> ...`)}finally{await l.disconnect()}}async function me(e,n,t,o){let r=t[0];if(r===void 0)throw new c(`Usage: mcp-use client ${n} tools call <tool> [args]`);let{values:s,positionals:i}=b({args:[...t.slice(1)],allowPositionals:!0,strict:!0,options:{timeout:{type:"string",default:"30000"}}}),u=G(s.timeout,"--timeout"),l=await e.callTool(r,F(i),{timeout:u});if(l.isError===!0)throw new g("tool_error",`Tool ${r} returned an error.`,l);return p(l,o),0}async function E(e,n,t,o,r=process.stdin.isTTY?"ask":"never"){let{createOAuthProvider:s,MCPClient:i}=await D(),u=$(e),l=n.oauth?await s(n.url,{baseDir:u,authTimeoutMs:o,storageKeyPrefix:`mcp-use-cli:${e}`,openBrowser:async f=>{if(r==="never"){process.stderr.write(`Open this URL to authenticate:
36
- ${f}
37
- `);return}await fe(),N(f)}}):void 0,a=n.protocol==="auto"?"auto":{pin:n.protocol};return new i({mcpServers:{[e]:{url:n.url,...t.headers!==void 0?{headers:t.headers}:{},...l!==void 0?{authProvider:l}:{oauth:!1},protocolNegotiation:a}}}).connect(e)}async function Le(e,n=3e5){let o=(await S()).servers[e];if(o===void 0)throw new c(`Unknown saved server: ${e}`);let r=await k(A(e),{});return E(e,o,r,n)}async function Ne(e,n){return E("screenshot",{url:e,oauth:!1,protocol:"auto"},{headers:n},3e5)}function F(e){if(e.length===0)return{};if(e.length===1&&e[0]?.trimStart().startsWith("{")){let t=JSON.parse(e[0]);if(t===null||Array.isArray(t)||typeof t!="object")throw new c("The JSON argument must be an object.");return t}let n={};for(let t of e){let o=t.indexOf(":="),r=t.indexOf("="),s=o>=0?o:r,i=o>=0?2:1;if(s<=0)throw new c(`Expected key=value or key:=<json>, received: ${t}`);let u=t.slice(0,s).replace(/^--/,""),l=t.slice(s+i);n[u]=o>=0?JSON.parse(l):l}return n}function H(e){return e.json||e.noOpen||!process.stdin.isTTY?"never":"ask"}async function fe(){let e=ae({input:process.stdin,output:process.stderr});try{await e.question("This server requires OAuth. Press Enter to open your browser.")}finally{e.close()}}function we(e){let n={};for(let t of e){let o=t.indexOf(":");if(o<=0)throw new c(`Invalid header: ${t}`);n[t.slice(0,o).trim()]=t.slice(o+1).trim()}return n}function ge(e){if(e!=="auto"&&e!=="2026-07-28"&&e!=="2025-11-25")throw new c(`Invalid protocol: ${e}`);return e}function G(e,n){let t=Number(e);if(!Number.isInteger(t)||t<=0)throw new c(`${n} must be a positive integer.`);return t}function he(e){if(!/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(e))throw new c("Server names must be 1-64 filesystem-safe letters, numbers, dots, dashes, or underscores.")}async function S(){return k(_,{servers:{}})}function T(e){return C(B,"credentials",ie("sha256").update(e).digest("hex"))}function A(e){return C(T(e),"credentials.json")}function $(e){return C(T(e),"oauth")}function P(e){b({args:[...e],allowPositionals:!1,strict:!0,options:{}})}function O(e,n){if(e.length!==1)throw new c(`Usage: ${n}`);return e[0]}export{xe as a,Le as b,Ne as c,F as d};
@@ -1 +0,0 @@
1
- function b(e,c){return async(a,i,d)=>{typeof d=="function"&&(d=void 0);let l=!1,t=new AbortController;i.on("close",()=>{l||t.abort()}),i.destroyed===!0&&t.abort();let s;try{let n=await w(a,d,{signal:t.signal});s=await e.fetch(n,{...a.auth!==void 0&&{authInfo:a.auth},...d!==void 0&&{parsedBody:d}})}catch(n){try{c?.onerror?.(n instanceof Error?n:new Error(String(n)))}catch{}s=y(m(d))}let r={};for(let[n,f]of s.headers)r[n]=f;if(i.writeHead(s.status,r),s.body===null){l=!0,i.end();return}let o,u=()=>{o?.(),o=void 0},h=()=>new Promise(n=>{o=n});i.on("drain",u);let p=new Promise(n=>{t.signal.addEventListener("abort",()=>n(),{once:!0})});try{for await(let n of s.body){if(t.signal.aborted)break;let f=n instanceof Uint8Array?n:new Uint8Array(n);i.write(f)===!1&&await Promise.race([h(),p])}}catch{}l=!0,i.end()}}async function w(e,c,a){let i=(e.method??"GET").toUpperCase(),l=`http://${g(e.headers.host)??g(e.headers[":authority"])??"localhost"}${e.url??"/"}`,t=new Headers;for(let[r,o]of Object.entries(e.headers))if(!(o===void 0||r.startsWith(":")))if(Array.isArray(o))for(let u of o)t.append(r,u);else t.set(r,o);let s;if(i!=="GET"&&i!=="HEAD")if(c===void 0){let r=new TextDecoder,o="";for await(let u of e)o+=typeof u=="string"?u:r.decode(u,{stream:!0});o+=r.decode(),o.length>0&&(s=o)}else{let r=JSON.stringify(c);t.delete("content-encoding"),t.delete("transfer-encoding"),r===void 0?t.delete("content-length"):(s=r,t.set("content-length",String(new TextEncoder().encode(r).byteLength)))}return new Request(l,{method:i,headers:t,...a?.signal!==void 0&&{signal:a.signal},...s!==void 0&&{body:s}})}function g(e){return Array.isArray(e)?e[0]:e}function m(e){if(e===null||typeof e!="object"||Array.isArray(e))return null;let{method:c,id:a}=e;return typeof c!="string"?null:typeof a=="string"||typeof a=="number"?a:null}function y(e){return Response.json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:e},{status:500})}export{b as toNodeHandler,w as toWebRequest};
File without changes