@mcp-use/cli 4.0.0-beta.4 → 4.0.0-beta.5

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,11 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import{a as i}from"./chunk-JAFV3QGS.js";import{readFileSync as l}from"fs";import{resolve as c}from"path";var r=`mcp-use \u2014 run MCP servers built with mcp-use
2
+ import{a as s}from"./chunk-USIKTT3N.js";import{readFileSync as a}from"fs";import{resolve as i}from"path";var o=`mcp-use \u2014 run MCP servers built with mcp-use
3
3
 
4
4
  Usage: mcp-use <command> [options]
5
5
 
6
6
  Commands:
7
7
  dev Start the dev server
8
8
  build Build the server into .mcp-use/build
9
+ typecheck Refresh MCP types and run the project's TypeScript compiler
9
10
  start Serve the production build from .mcp-use/build
10
11
  login Authenticate the cloud CLI
11
12
  logout Delete local cloud credentials
@@ -21,17 +22,18 @@ Commands:
21
22
  Options:
22
23
  -p, --port <n> Port to serve on (dev/start; default: $PORT or 3000)
23
24
  --host <host> Host to bind (dev/start; default: $HOST or 127.0.0.1)
24
- --entry <path> Server entry module (dev/build only)
25
+ --entry <path> Server entry module (dev/build/typecheck only)
25
26
  --path <directory> Project root (default: current directory)
26
27
  --mcp-dir <dir> Directory containing the MCP entry and views/
27
28
  --views-dir <dir> Views directory (default: views/ or <mcp-dir>/views/)
28
29
  --source-maps Emit source maps in build output (build only)
29
30
  --inline Embed view JS and CSS in MCP resources (build only)
31
+ -- <tsc options> Forward remaining options to TypeScript (typecheck only)
30
32
  --with-inspector Mount Inspector on the production listener (start only)
31
33
  --tunnel Expose the dev server through a public tunnel (dev only)
32
34
  --no-open Do not auto-open the inspector in a browser (dev only)
33
35
  --no-inspector Start dev without loading the optional Inspector
34
36
  -h, --help Show this help
35
- -v, --version Print the version`;async function u(t){if(t.length===1&&["--version","-v"].includes(t[0]??""))return console.log(s()),0;if(t.some(e=>e==="--help"||e==="-h")){let e=t[0];if(e===void 0||e==="--help"||e==="-h")return console.log(r),0}let n=t[0];if(n==="login"||n==="logout"||n==="whoami"){let{runIdentity:e}=await import("./commands/identity.js");return e(n,t.slice(1))}if(n==="org"){let{runOrganizations:e}=await import("./commands/organizations.js");return e(t.slice(1))}if(n==="servers"){let{runServers:e}=await import("./commands/servers.js");return e(t.slice(1))}if(n==="deployments"){let{runDeployments:e}=await import("./commands/deployments.js");return e(t.slice(1))}if(n==="deploy"){let{runDeploy:e}=await import("./commands/deploy.js");return e(t.slice(1))}if(n==="client"){let{runClient:e}=await import("./commands/client.js");return e(t.slice(1))}if(n==="skills"){let{runSkills:e}=await import("./commands/skills.js");return e(t.slice(1))}if(n==="screenshot"){let{runScreenshot:e}=await import("./commands/screenshot.js");return e(t.slice(1))}let o;try{o=i(t)}catch(e){return console.error(e instanceof Error?e.message:String(e)),2}if(o.version)return console.log(s()),0;if(o.help)return console.log(r),0;switch(o.command){case"start":return a(o);case"dev":case"build":return d(o.command,o);case void 0:return console.error(r),2;default:return console.error(`Unknown command: ${o.command}
37
+ -v, --version Print the version`;async function u(t){if(t.length===1&&["--version","-v"].includes(t[0]??""))return console.log(c()),0;if(t.some(e=>e==="--help"||e==="-h")){let e=t[0];if(e===void 0||e==="--help"||e==="-h")return console.log(o),0}let n=t[0];if(n==="login"||n==="logout"||n==="whoami"){let{runIdentity:e}=await import("./commands/identity.js");return e(n,t.slice(1))}if(n==="org"){let{runOrganizations:e}=await import("./commands/organizations.js");return e(t.slice(1))}if(n==="servers"){let{runServers:e}=await import("./commands/servers.js");return e(t.slice(1))}if(n==="deployments"){let{runDeployments:e}=await import("./commands/deployments.js");return e(t.slice(1))}if(n==="deploy"){let{runDeploy:e}=await import("./commands/deploy.js");return e(t.slice(1))}if(n==="client"){let{runClient:e}=await import("./commands/client.js");return e(t.slice(1))}if(n==="skills"){let{runSkills:e}=await import("./commands/skills.js");return e(t.slice(1))}if(n==="screenshot"){let{runScreenshot:e}=await import("./commands/screenshot.js");return e(t.slice(1))}let r;try{r=s(t)}catch(e){return console.error(e instanceof Error?e.message:String(e)),2}if(r.version)return console.log(c()),0;if(r.help)return console.log(o),0;switch(r.command){case"start":return p(r);case"dev":case"build":return d(r.command,r);case"typecheck":return l(r);case void 0:return console.error(o),2;default:return console.error(`Unknown command: ${r.command}
36
38
 
37
- ${r}`),2}}async function a(t){let n;try{let{runStart:e}=await import("./commands/start.js");n=await e({cwd:c(process.cwd(),t.path??"."),port:t.port,host:t.host,...t.withInspector&&{withInspector:!0}})}catch(e){return console.error(e instanceof Error?e.message:String(e)),1}console.log(`mcp-use server running at ${n.url}`);let o=()=>{n.close().then(()=>process.exit(0),e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)})};return process.once("SIGINT",o),process.once("SIGTERM",o),0}async function d(t,n){let o={cwd:c(process.cwd(),n.path??"."),...n.entry!==void 0&&{entry:n.entry},...n.mcpDir!==void 0&&{mcpDir:n.mcpDir},...n.viewsDir!==void 0&&{viewsDir:n.viewsDir},...n.port!==void 0&&{port:n.port},...n.host!==void 0&&{host:n.host},...n.tunnel&&{tunnel:!0},...!n.open&&{open:!1},...!n.inspector&&{inspector:!1},...n.sourceMaps&&{sourceMaps:!0},...n.inline&&{inline:!0}};try{if(t==="dev"){let{runDev:e}=await import("./commands/dev.js");await e(o)}else{let{runBuild:e}=await import("./commands/build.js");await e(o)}return 0}catch(e){return console.error(e instanceof Error?e.message:String(e)),1}}function s(){return"2.0.0-beta.27"}u(process.argv.slice(2)).then(t=>{process.exitCode=t},t=>{console.error(t instanceof Error?t.message:String(t)),process.exitCode=1});
39
+ ${o}`),2}}async function l(t){try{let{runTypecheck:n}=await import("./commands/typecheck.js");return await n({cwd:i(process.cwd(),t.path??"."),...t.entry!==void 0&&{entry:t.entry},...t.mcpDir!==void 0&&{mcpDir:t.mcpDir},...t.passthrough.length>0&&{tscArgs:t.passthrough}})}catch(n){return console.error(n instanceof Error?n.message:String(n)),1}}async function p(t){let n;try{let{runStart:e}=await import("./commands/start.js");n=await e({cwd:i(process.cwd(),t.path??"."),port:t.port,host:t.host,...t.inspector===!0&&{withInspector:!0}})}catch(e){return console.error(e instanceof Error?e.message:String(e)),1}console.log(`mcp-use server running at ${n.url}`);let r=()=>{n.close().then(()=>process.exit(0),e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)})};return process.once("SIGINT",r),process.once("SIGTERM",r),0}async function d(t,n){let r={cwd:i(process.cwd(),n.path??"."),...n.entry!==void 0&&{entry:n.entry},...n.mcpDir!==void 0&&{mcpDir:n.mcpDir},...n.viewsDir!==void 0&&{viewsDir:n.viewsDir},...n.port!==void 0&&{port:n.port},...n.host!==void 0&&{host:n.host},...n.tunnel&&{tunnel:!0},...!n.open&&{open:!1},...n.inspector===!1&&{inspector:!1},...n.sourceMaps&&{sourceMaps:!0},...n.inline&&{inline:!0}};try{if(t==="dev"){let{runDev:e}=await import("./commands/dev.js");await e(r)}else{let{runBuild:e}=await import("./commands/build.js");await e(r)}return 0}catch(e){return console.error(e instanceof Error?e.message:String(e)),1}}function c(){return"2.0.0-beta.28"}u(process.argv.slice(2)).then(t=>{process.exitCode=t},t=>{console.error(t instanceof Error?t.message:String(t)),process.exitCode=1});
@@ -0,0 +1,3 @@
1
+ import{a as p,b as f,d as l}from"./chunk-7G4TXPP4.js";import{existsSync as v}from"fs";import{join as w}from"path";import{fileURLToPath as V}from"url";var h=["vite.config.ts","vite.config.js","vite.config.mts","vite.config.cjs"];function W(t){for(let e of h){let r=w(t,e);if(v(r))return r}return!1}function b(){return V(import.meta.resolve("tailwindcss/index.css"))}import{join as s}from"path";var I=".mcp-use",x="manifest.json";function U(t){let e=s(t,I),r=s(e,"build");return{projectRoot:t,workspace:e,build:r,generated:s(e,"generated"),cache:s(e,"cache"),state:s(e,"state"),cloud:s(e,"cloud"),buildManifest:s(r,x),tunnel:s(e,"state","tunnel.json")}}import{existsSync as m,readdirSync as D}from"fs";import{isAbsolute as _,join as y,resolve as E}from"path";var P="views",a="virtual:mcp-use/views/",c=`\0${a}`;function d(t,e){let r=e??P;return _(r)?r:E(t,r)}function C(t,e){let r=d(t,e);if(!m(r))return[];let n=[];for(let i of D(r,{withFileTypes:!0})){if(!i.isDirectory())continue;let o=y(r,i.name,"view.tsx");m(o)&&n.push({name:i.name,entryPath:o})}return n.sort((i,o)=>i.name.localeCompare(o.name)),n}function R(t){return`${a}${t}`}function S(t){return`/@id/__x00__${a}${t}`}function F(t,e,r){let n=d(e,r);return t===n||t.startsWith(`${n}/`)}function B(t){let e={};for(let r of t)e[r.name]={kind:"external",entry:S(r.name),css:[],scripts:["/@vite/client"]};return e}async function X(t,e,r){let{createServer:n}=await import("vite");return n({root:t,configFile:r,envDir:!1,logLevel:"warn",cacheDir:e,resolve:{tsconfigPaths:!0,alias:p(t)},plugins:[l(t)],server:{middlewareMode:!0,hmr:!1},ssr:{...f(t)}})}var u="virtual:mcp-use/tailwind.css",g=`\0${u}`;function K(t){return{name:"mcp-use-views",applyToEnvironment(e){return e.name==="client"},resolveId(e){if(e===u)return g;if(e.startsWith(a))return`\0${e}`},load(e){if(e===g)return['@import "tailwindcss";',"@custom-variant dark (&:where(.dark, .dark *, [data-theme=dark], [data-theme=dark] *));"].join(`
2
+ `);if(!e.startsWith(c))return;let r=e.slice(c.length),n=t.getViews().find(o=>o.name===r);if(n===void 0)return;let i=[];return t.dev?.reactRefresh===!0&&i.push('import "@vitejs/plugin-react/preamble";'),i.push(`import ${JSON.stringify(u)};`),i.push('import { bootstrapView } from "mcp-use/react";',`import * as viewModule from ${JSON.stringify(n.entryPath)};`,"bootstrapView(viewModule);"),t.dev!==void 0&&i.push("if (import.meta.hot) {"," import.meta.hot.accept();","}"),i.push(""),i.join(`
3
+ `)}}}export{W as a,b,U as c,C as d,R as e,F as f,B as g,X as h,K as i};
@@ -0,0 +1,2 @@
1
+ import{existsSync as s}from"fs";import{isAbsolute as p,join as f,resolve as d}from"path";var i=["src/index.ts","src/index.tsx","src/server.ts","src/server.tsx","index.ts","index.tsx","server.ts","server.tsx"];function j(t,e){if(e!==void 0){let n=p(e)?e:d(t,e);if(!s(n))throw new Error(`Entry not found: ${n} (from --entry "${e}")`);return n}for(let n of i){let r=f(t,n);if(s(r))return r}throw new Error(`No server entry found in ${t}. Looked for: ${i.join(", ")}. Create one of these (default-exporting your MCPServer instance) or pass --entry <path>.`)}import{readFile as l,writeFile as a}from"fs/promises";import{extname as E,join as m,relative as g,sep as x}from"path";var h="mcp-env.d.ts",u="// Generated by mcp-use. Do not edit.",y=["// mcp-use generated env declaration","// mcp-use auto-generated typing"];function A(t,e){let n=g(t,e).split(x).join("/"),r=E(n),o=r===".mts"?".mjs":r===".cts"?".cjs":r===".ts"||r===".tsx"?".js":r;return r!==o&&(n=`${n.slice(0,-r.length)}${o}`),n.startsWith(".")?n:`./${n}`}function D(t,e){let n=A(t,e);return[u,'declare module "*.css";',"",'declare module "mcp-use/react" {'," interface Register {",` tools: typeof import(${JSON.stringify(n)});`," }","}","","export {};",""].join(`
2
+ `)}async function N(t,e){let n=m(t,h),r=D(t,e);try{let o=await l(n,"utf8");return o===r?"unchanged":v(o)?(await a(n,r,"utf8"),"updated"):"user-owned"}catch(o){if(!c(o,"ENOENT"))throw o}try{return await a(n,r,{encoding:"utf8",flag:"wx"}),"created"}catch(o){if(!c(o,"EEXIST"))throw o;return N(t,e)}}function v(t){return[u,...y].some(e=>t.startsWith(e))}function c(t,e){return t!==null&&typeof t=="object"&&"code"in t&&t.code===e}export{j as a,N as b};
@@ -0,0 +1 @@
1
+ var f="127.0.0.1";function u(n,e,t=process.env){if(n!==void 0)return n;let r=t.HOST?.trim();return r!==void 0&&r!==""?r:e??f}function a(n,e,t=process.env){if(n!==void 0)return n;let r=c(t.PORT);return r!==void 0?r:e??3e3}function c(n){if(n===void 0||n.trim()==="")return;let e=Number(n);return Number.isInteger(e)&&e>=0&&e<=65535?e:void 0}function m(n){let e={command:void 0,port:void 0,entry:void 0,path:void 0,mcpDir:void 0,viewsDir:void 0,host:void 0,tunnel:!1,open:!0,inspector:void 0,sourceMaps:!1,inline:!1,help:!1,version:!1,passthrough:[]};for(let t=0;t<n.length;t++){let r=n[t];if(r===void 0)continue;if(r==="--"){if(e.command!=="typecheck")throw new Error("TypeScript argument forwarding is only available for typecheck");e.passthrough=n.slice(t+1);break}let i=r,d;if(r.startsWith("--")){let s=r.indexOf("=");s!==-1&&(i=r.slice(0,s),d=r.slice(s+1))}let o=()=>{if(d!==void 0)return d;let s=n[++t];if(s===void 0||s.startsWith("-"))throw new Error(`Missing value for ${i}`);return s};switch(i){case"-h":case"--help":e.help=!0;break;case"-v":case"--version":e.version=!0;break;case"-p":case"--port":e.port=p(o());break;case"--entry":e.entry=o();break;case"--path":e.path=o();break;case"--mcp-dir":e.mcpDir=o();break;case"--views-dir":e.viewsDir=o();break;case"--host":e.host=o();break;case"--tunnel":e.tunnel=!0;break;case"--no-open":e.open=!1;break;case"--no-inspector":e.inspector=!1;break;case"--with-inspector":e.inspector=!0;break;case"--source-maps":e.sourceMaps=!0;break;case"--inline":e.inline=!0;break;default:if(i.startsWith("-"))throw new Error(`Unknown option: ${i}`);if(e.command!==void 0)throw new Error(`Unexpected argument: ${i}`);e.command=i}}return e}function h(n,e=process.env,t){return a(n,t,e)}function k(n,e=process.env,t){return u(n,t,e)}function p(n){let e=Number(n);if(!l(e))throw new Error(`Invalid port: ${n}`);return e}function l(n){return Number.isInteger(n)&&n>=0&&n<=65535}export{m as a,h as b,k as c};
@@ -1,5 +1,5 @@
1
- import{a as $,b as B,c as P,d as U,e as V,f as L,g as F,j as _,k as C}from"../chunk-33YPDBCS.js";import{a as b,b as M,c as E,d as x}from"../chunk-7G4TXPP4.js";import{randomBytes as H}from"crypto";import{existsSync as X}from"fs";import{cp as Z,mkdir as v,rm as ee,writeFile as A}from"fs/promises";import{join as f,relative as y,resolve as te}from"path";import re from"@tailwindcss/vite";import ne from"@vitejs/plugin-react";import{build as D}from"vite";import{createServerModuleRunner as N}from"vite";var G="/mcp",K="http://localhost:3000";async function j(e,t){let i=N(e,{hmr:!1,sourcemapInterceptor:"node"}),n=process.env.MCP_URL;try{n===void 0&&(process.env.MCP_URL=K);let o=(await i.import(t)).default;if(o===null||typeof o!="object")throw new Error("The server entry must default-export the MCPServer instance.");return o.basePath??G}finally{n===void 0?delete process.env.MCP_URL:process.env.MCP_URL=n,await i.close()}}async function O(e,t,i){let n=N(e,{hmr:!1,sourcemapInterceptor:"node"});try{let o=(await n.import(t)).default;if(o===null||typeof o!="object")throw new Error("The server entry must default-export the MCPServer instance.");if(typeof o.__primeViews!="function")throw new Error("The entry's default export does not support __primeViews.");o.__primeViews(i),o.getHandler()}finally{await n.close()}}function Q(e){return e.replace(/\/+$/,"")}function k(e){return Q(e)}import{hostHeaderValidationResponse as ge,originValidationResponse as we}from"@modelcontextprotocol/server";function T(e,t){let i=t.replace(/^\/+/,"");return e==="/"?`/${i}`:`${e}/${i}`}function q(e,t){return`${T(e,`_mcp-use/views/${t}`)}/`}var p="index.js",ie="entry-wrapper.ts",se=100*1024*1024;async function I(e,t){let i=f(e,"public");X(i)&&await Z(i,t,{recursive:!0})}async function oe(e,t,i){let n=f(e,ie);await v(e,{recursive:!0});let r=JSON.stringify(i);return await A(n,[`import server from ${JSON.stringify(t)};`,'import { registerViews } from "mcp-use";',`server[registerViews](${r});`,"export default server;",""].join(`
2
- `)),n}function ae(){let e=process.env.MCP_ASSETS_URL;if(!(e===void 0||e.trim()===""))try{return k(new URL(e).href.replace(/\/$/,""))}catch{return}}function S(e,t,i,n){let r=e.replace(/^\/+/,"");return`${i}${q(n,t)}${r}`}function ce(e,t,i,n){return e.kind!=="external"?e:{...e,entry:S(e.entry,t,i,n),css:e.css.map(r=>S(r,t,i,n)),...e.scripts!==void 0&&{scripts:e.scripts.map(r=>S(r,t,i,n))}}}async function ue(e,t){let i=f(t.viewsOutDir,e.name),n=await D({root:t.cwd,configFile:t.userViteConfig,envDir:!1,publicDir:!1,logLevel:"warn",cacheDir:t.cacheDir,resolve:{tsconfigPaths:!0,alias:{tailwindcss:P()}},plugins:[re(),ne(),C({getViews:()=>[e]})],build:{outDir:i,emptyOutDir:!0,write:!t.inline,target:"es2022",sourcemap:t.inline?!1:t.sourceMaps,minify:!0,cssCodeSplit:!1,chunkSizeWarningLimit:1e3,assetsInlineLimit:se,rollupOptions:{input:{[e.name]:F(e.name)},output:{format:"es",codeSplitting:!t.inline,entryFileNames:"assets/[name]-[hash].js",chunkFileNames:"assets/[name]-[hash].js",assetFileNames:"assets/[name]-[hash][extname]"}}},base:"./"}),r=Array.isArray(n)?n[0]:n;if(r===void 0||!("output"in r))throw new Error(`Client build for view "${e.name}" produced no output.`);let o=r.output,m=Array.isArray(o)?o:Object.values(o),g,u,l,c=[];for(let a of m){if(typeof a!="object"||a===null||!("fileName"in a)||typeof a.fileName!="string")continue;let s=a;s.type==="chunk"&&s.isEntry===!0?(g=s.fileName,l=s.code):s.type==="asset"&&s.fileName.endsWith(".css")&&(u=s.fileName,typeof s.source=="string"?c.push(s.source):s.source instanceof Uint8Array&&c.push(new TextDecoder().decode(s.source)))}if(g===void 0)throw new Error(`Client build produced no entry chunk for view "${e.name}".`);if(t.inline){if(l===void 0)throw new Error(`Client build produced no entry source for view "${e.name}".`);return{kind:"inline",js:l,css:c.join(`
3
- `)}}return{kind:"external",entry:g.replace(/^\/+/,""),css:u!==void 0?[u.replace(/^\/+/,"")]:[]}}async function le(e){let t=performance.now();E(e.cwd,"production");let i=e.mcpDir===void 0?e.cwd:te(e.cwd,e.mcpDir),n=e.entry===void 0?$(i):$(e.cwd,e.entry);await U(e.cwd,n)&&console.log("[mcp-use] created mcp-env.d.ts");let r=V(e.cwd),o=e.viewsDir??(e.mcpDir===void 0?void 0:f(e.mcpDir,"views")),m=L(e.cwd,o),g=B(e.cwd),u=e.sourceMaps===!0,l=e.inline===!0;if(m.length===0){await D({root:e.cwd,configFile:!1,envDir:!1,publicDir:!1,logLevel:"warn",cacheDir:r.cache,resolve:{tsconfigPaths:!0,alias:b(e.cwd)},plugins:[x(e.cwd)],build:{ssr:n,outDir:r.build,emptyOutDir:!0,target:"node22",sourcemap:u,minify:!1,rollupOptions:{output:{format:"es",entryFileNames:p}}},ssr:{...M(e.cwd),target:"node"}}),await I(e.cwd,f(r.build,"views/public"));let d={buildId:H(8).toString("hex"),entryPoint:p,createdAt:new Date().toISOString(),views:{}};await v(r.build,{recursive:!0}),await A(r.buildManifest,`${JSON.stringify(d,null,2)}
4
- `);let h=Math.round(performance.now()-t);console.log(`[mcp-use] built ${y(e.cwd,n)} \u2192 ${y(e.cwd,r.build)}/${p} (${h}ms)`);return}await ee(r.build,{recursive:!0,force:!0});let c=f(r.build,"views");await v(c,{recursive:!0});let a=await _(e.cwd,r.cache,!1),w,s={},R=ae();try{w=await j(a.environments.ssr,n);for(let d of m){let h=await ue(d,{cwd:e.cwd,cacheDir:r.cache,viewsOutDir:c,userViteConfig:g,sourceMaps:u,inline:l});R!==void 0&&!l&&(h=ce(h,d.name,R,w)),s[d.name]=h}R!==void 0&&!l&&(console.log(`[mcp-use] MCP_ASSETS_URL set \u2014 manifest uses CDN URLs; upload ${y(e.cwd,c)}/ to your asset host.`),w!=="/mcp"&&console.log(`[mcp-use] CDN manifest uses basePath ${w} from server entry`)),await I(e.cwd,f(c,"public")),await O(a.environments.ssr,n,s)}finally{await a.close()}let W=await oe(r.cache,n,s);await D({root:e.cwd,configFile:!1,envDir:!1,publicDir:!1,logLevel:"warn",cacheDir:r.cache,resolve:{tsconfigPaths:!0,alias:b(e.cwd)},plugins:[x(e.cwd)],build:{ssr:W,outDir:r.build,emptyOutDir:!1,target:"node22",sourcemap:u,minify:!1,rollupOptions:{output:{format:"es",entryFileNames:p}}},ssr:{...M(e.cwd),target:"node"}});let J={buildId:H(8).toString("hex"),entryPoint:p,createdAt:new Date().toISOString(),views:s};await v(r.build,{recursive:!0}),await A(r.buildManifest,`${JSON.stringify(J,null,2)}
5
- `);let z=Math.round(performance.now()-t),Y=m.map(d=>d.name).join(", ");console.log(`[mcp-use] built ${y(e.cwd,n)} + views (${Y}) \u2192 ${y(e.cwd,r.build)}/${p} (${z}ms)`)}export{le as runBuild};
1
+ import{a as U,b as V,c as P,d as C,e as L,h as N,i as j}from"../chunk-ALPMVGHI.js";import{a as x,b as R,c as B,d as S}from"../chunk-7G4TXPP4.js";import{a as $,b as _}from"../chunk-DB3E6LBX.js";import{randomBytes as H}from"crypto";import{existsSync as Z}from"fs";import{cp as ee,mkdir as v,rm as te,writeFile as E}from"fs/promises";import{join as f,relative as w,resolve as re}from"path";import ne from"@tailwindcss/vite";import ie from"@vitejs/plugin-react";import{build as D}from"vite";import{createServerModuleRunner as O}from"vite";var K="/mcp",Q="http://localhost:3000";async function F(e,t){let i=O(e,{hmr:!1,sourcemapInterceptor:"node"}),n=process.env.MCP_URL;try{n===void 0&&(process.env.MCP_URL=Q);let r=(await i.import(t)).default;if(r===null||typeof r!="object")throw new Error("The server entry must default-export the MCPServer instance.");return r.basePath??K}finally{n===void 0?delete process.env.MCP_URL:process.env.MCP_URL=n,await i.close()}}async function T(e,t,i){let n=O(e,{hmr:!1,sourcemapInterceptor:"node"});try{let r=(await n.import(t)).default;if(r===null||typeof r!="object")throw new Error("The server entry must default-export the MCPServer instance.");if(typeof r.__primeViews!="function")throw new Error("The entry's default export does not support __primeViews.");r.__primeViews(i),r.__mount()}finally{await n.close()}}function X(e){return e.replace(/\/+$/,"")}function k(e){return X(e)}import{hostHeaderValidationResponse as we,originValidationResponse as he}from"@modelcontextprotocol/server";function I(e,t){let i=t.replace(/^\/+/,"");return e==="/"?`/${i}`:`${e}/${i}`}function q(e,t){return`${I(e,`_mcp-use/views/${t}`)}/`}var p="index.js",se="entry-wrapper.ts",oe=100*1024*1024;async function W(e,t){let i=f(e,"public");Z(i)&&await ee(i,t,{recursive:!0})}async function ae(e,t,i){let n=f(e,se);await v(e,{recursive:!0});let s=JSON.stringify(i);return await E(n,[`import server from ${JSON.stringify(t)};`,'import { registerViews } from "mcp-use";',`server[registerViews](${s});`,"export default server;",""].join(`
2
+ `)),n}function ce(){let e=process.env.MCP_ASSETS_URL;if(!(e===void 0||e.trim()===""))try{return k(new URL(e).href.replace(/\/$/,""))}catch{return}}function A(e,t,i,n){let s=e.replace(/^\/+/,"");return`${i}${q(n,t)}${s}`}function ue(e,t,i,n){return e.kind!=="external"?e:{...e,entry:A(e.entry,t,i,n),css:e.css.map(s=>A(s,t,i,n)),...e.scripts!==void 0&&{scripts:e.scripts.map(s=>A(s,t,i,n))}}}async function le(e,t){let i=f(t.viewsOutDir,e.name),n=await D({root:t.cwd,configFile:t.userViteConfig,envDir:!1,publicDir:!1,logLevel:"warn",cacheDir:t.cacheDir,resolve:{tsconfigPaths:!0,alias:{tailwindcss:V()}},plugins:[ne(),ie(),j({getViews:()=>[e]})],build:{outDir:i,emptyOutDir:!0,write:!t.inline,target:"es2022",sourcemap:t.inline?!1:t.sourceMaps,minify:!0,cssCodeSplit:!1,chunkSizeWarningLimit:1e3,assetsInlineLimit:oe,rollupOptions:{input:{[e.name]:L(e.name)},output:{format:"es",codeSplitting:!t.inline,entryFileNames:"assets/[name]-[hash].js",chunkFileNames:"assets/[name]-[hash].js",assetFileNames:"assets/[name]-[hash][extname]"}}},base:"./"}),s=Array.isArray(n)?n[0]:n;if(s===void 0||!("output"in s))throw new Error(`Client build for view "${e.name}" produced no output.`);let r=s.output,b=Array.isArray(r)?r:Object.values(r),c,m,u,l=[];for(let a of b){if(typeof a!="object"||a===null||!("fileName"in a)||typeof a.fileName!="string")continue;let o=a;o.type==="chunk"&&o.isEntry===!0?(c=o.fileName,u=o.code):o.type==="asset"&&o.fileName.endsWith(".css")&&(m=o.fileName,typeof o.source=="string"?l.push(o.source):o.source instanceof Uint8Array&&l.push(new TextDecoder().decode(o.source)))}if(c===void 0)throw new Error(`Client build produced no entry chunk for view "${e.name}".`);if(t.inline){if(u===void 0)throw new Error(`Client build produced no entry source for view "${e.name}".`);return{kind:"inline",js:u,css:l.join(`
3
+ `)}}return{kind:"external",entry:c.replace(/^\/+/,""),css:m!==void 0?[m.replace(/^\/+/,"")]:[]}}async function de(e){let t=performance.now();B(e.cwd,"production");let i=e.mcpDir===void 0?e.cwd:re(e.cwd,e.mcpDir),n=e.entry===void 0?$(i):$(e.cwd,e.entry),s=await _(e.cwd,n);(s==="created"||s==="updated")&&console.log(`[mcp-use] ${s} mcp-env.d.ts`);let r=P(e.cwd),b=e.viewsDir??(e.mcpDir===void 0?void 0:f(e.mcpDir,"views")),c=C(e.cwd,b),m=U(e.cwd),u=e.sourceMaps===!0,l=e.inline===!0;if(c.length===0){await D({root:e.cwd,configFile:!1,envDir:!1,publicDir:!1,logLevel:"warn",cacheDir:r.cache,resolve:{tsconfigPaths:!0,alias:x(e.cwd)},plugins:[S(e.cwd)],build:{ssr:n,outDir:r.build,emptyOutDir:!0,target:"node22",sourcemap:u,minify:!1,rollupOptions:{output:{format:"es",entryFileNames:p}}},ssr:{...R(e.cwd),target:"node"}}),await W(e.cwd,f(r.build,"views/public"));let d={buildId:H(8).toString("hex"),entryPoint:p,createdAt:new Date().toISOString(),views:{}};await v(r.build,{recursive:!0}),await E(r.buildManifest,`${JSON.stringify(d,null,2)}
4
+ `);let g=Math.round(performance.now()-t);console.log(`[mcp-use] built ${w(e.cwd,n)} \u2192 ${w(e.cwd,r.build)}/${p} (${g}ms)`);return}await te(r.build,{recursive:!0,force:!0});let a=f(r.build,"views");await v(a,{recursive:!0});let h=await N(e.cwd,r.cache,!1),o,y={},M=ce();try{o=await F(h.environments.ssr,n);for(let d of c){let g=await le(d,{cwd:e.cwd,cacheDir:r.cache,viewsOutDir:a,userViteConfig:m,sourceMaps:u,inline:l});M!==void 0&&!l&&(g=ue(g,d.name,M,o)),y[d.name]=g}M!==void 0&&!l&&(console.log(`[mcp-use] MCP_ASSETS_URL set \u2014 manifest uses CDN URLs; upload ${w(e.cwd,a)}/ to your asset host.`),o!=="/mcp"&&console.log(`[mcp-use] CDN manifest uses basePath ${o} from server entry`)),await W(e.cwd,f(a,"public")),await T(h.environments.ssr,n,y)}finally{await h.close()}let J=await ae(r.cache,n,y);await D({root:e.cwd,configFile:!1,envDir:!1,publicDir:!1,logLevel:"warn",cacheDir:r.cache,resolve:{tsconfigPaths:!0,alias:x(e.cwd)},plugins:[S(e.cwd)],build:{ssr:J,outDir:r.build,emptyOutDir:!1,target:"node22",sourcemap:u,minify:!1,rollupOptions:{output:{format:"es",entryFileNames:p}}},ssr:{...R(e.cwd),target:"node"}});let z={buildId:H(8).toString("hex"),entryPoint:p,createdAt:new Date().toISOString(),views:y};await v(r.build,{recursive:!0}),await E(r.buildManifest,`${JSON.stringify(z,null,2)}
5
+ `);let Y=Math.round(performance.now()-t),G=c.map(d=>d.name).join(", ");console.log(`[mcp-use] built ${w(e.cwd,n)} + views (${G}) \u2192 ${w(e.cwd,r.build)}/${p} (${Y}ms)`)}export{de as runBuild};
@@ -1,2 +1,2 @@
1
- import{a as Z,b as ee}from"../chunk-N7BU45K6.js";import{b as Y,c as Q}from"../chunk-JAFV3QGS.js";import{a as W,b as re,c as oe,d as se,e as ie,f as G,h as z,i as ae,k as ce}from"../chunk-33YPDBCS.js";import{b as ne,c as te,d as B}from"../chunk-7G4TXPP4.js";import{spawn as je}from"child_process";import{createServer as Ne}from"http";import{networkInterfaces as Ve}from"os";import{join as Be,resolve as We}from"path";import Ge from"@tailwindcss/vite";import ze from"@vitejs/plugin-react";import{createServer as qe,createServerModuleRunner as Je}from"vite";import{InMemoryServerEventBus as Ke,localhostAllowedHostnames as Xe,localhostAllowedOrigins as Ye,validateHostHeader as Qe,validateOriginHeader as Ze}from"@modelcontextprotocol/server";import{connect as Se,createServer as Me}from"net";var le=100,Ie=300,Re=new Set(["127.0.0.1","localhost","::1"]);function ke(e,r){return new Promise(o=>{let t=Me();t.unref(),t.once("error",()=>o(!1)),t.listen({port:e,host:r},()=>{t.close(()=>o(!0))})})}function ue(e,r){return new Promise(o=>{let t=Se({port:e,host:r});t.setTimeout(Ie),t.once("connect",()=>{t.destroy(),o(!0)}),t.once("timeout",()=>{t.destroy(),o(!1)}),t.once("error",()=>{t.destroy(),o(!1)})})}async function Te(e){return await ue(e,"127.0.0.1")||await ue(e,"::1")}async function de(e,r){for(let o=e;o<e+le;o++)if(await ke(o,r)&&!(Re.has(r)&&await Te(o)))return{port:o,requested:e};throw new Error(`No free port found between ${e} and ${e+le-1} on ${r}.`)}function pe(e,r){let o=()=>{let t=e.getBasePath(),{url:a}=e.tunnel.status();return{mcpUrl:a!==null?`${a.replace(/\/+$/,"")}${t}`:null,port:e.port,fromCli:!0,tunnelUrl:a}};return async t=>{let a=e.getBasePath(),u=`${a}/inspector/api/dev/info`,d=`${a}/inspector/api/dev/start-tunnel`,p=`${a}/inspector/api/dev/stop-tunnel`,T=new URL(t.url).pathname;if(t.method==="GET"&&T===u)return Response.json(o());if(t.method==="POST"&&T===d)try{return await e.tunnel.start(e.port),Response.json({ok:!0,restarting:!1})}catch(E){let H=E instanceof Error?E.message:"Failed to start tunnel";return Response.json({error:H},{status:500})}return t.method==="POST"&&T===p?(await e.tunnel.stop(),Response.json({ok:!0})):r(t)}}import{readFileSync as _e}from"fs";import{createRequire as Ee}from"module";import{join as He}from"path";import{pathToFileURL as $e}from"url";async function we(e){let r=He(e,"package.json"),o=JSON.parse(_e(r,"utf8"));if([o.dependencies,o.devDependencies,o.optionalDependencies].some(u=>u!==null&&typeof u=="object"&&"@mcp-use/inspector"in u)){let u=Ee(r);try{let d=u.resolve("@mcp-use/inspector");return fe(await import($e(d).href))}catch(d){if(!me(d))throw d}}try{return fe(await import("@mcp-use/inspector"))}catch(u){if(me(u))return{installed:!1};throw u}}function fe(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 me(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"}import{mkdir as De,readFile as Oe,writeFile as xe}from"fs/promises";import{spawn as Ae}from"child_process";import{dirname as Ce}from"path";var Ue="https://local.mcp-use.run";function Le(){return process.env.MCP_USE_TUNNEL_API??Ue}var q=1e3,Fe=3e4;function he(e){let r,o=null,t,a,u=!1,d,p=q,T=c=>new Promise(i=>{setTimeout(i,c)}),E=()=>{r!==void 0&&"markShutdown"in r&&typeof r.markShutdown=="function"&&r.markShutdown()},H=async c=>{try{await fetch(`${Le()}/api/tunnels/${c}`,{method:"DELETE",signal:AbortSignal.timeout(2e3)})}catch{}},O=async()=>{try{let c=await Oe(e,"utf8"),i=JSON.parse(c);return typeof i.subdomain=="string"?i.subdomain:void 0}catch{return}},$=async c=>{try{await De(Ce(e),{recursive:!0}),await xe(e,JSON.stringify({subdomain:c},null,2),"utf8")}catch(i){console.warn(`[mcp-use] failed to save tunnel subdomain: ${i instanceof Error?i.message:String(i)}`)}},w=()=>{},M=(c,i)=>new Promise((f,b)=>{console.log(`[mcp-use] starting tunnel for port ${c}\u2026`);let g=process.env.npm_config_user_agent??"",[x,_]=g.startsWith("pnpm/")?["pnpm",["--silent","dlx","@mcp-use/tunnel",String(c)]]:g.startsWith("bun/")?["bunx",["@mcp-use/tunnel",String(c)]]:["npx",["--yes","--prefer-offline","@mcp-use/tunnel",String(c)]];i!==void 0&&_.push("--subdomain",i);let S=Ae(x,_,{stdio:["ignore","pipe","pipe"],shell:process.platform==="win32"}),I=!1,h=!1,A=()=>{h=!0};S.markShutdown=A,S.stdout.on("data",P=>{let v=P.toString(),C=v.includes("Shutting down")||v.includes("\u{1F6D1}"),U=v.includes("\u2716")||v.includes("Error:");!h&&!C&&!U&&process.stdout.write(v);let D=v.match(/https?:\/\/([a-z0-9-]+\.[a-z0-9.-]+)/i);if(D!==null&&!I){let L=D[0],N=D[1]??"",y=N.match(/^([a-z0-9-]+)\./i)?.[1]??N.split(".")[0]??"";/^[a-z0-9-]+$/i.test(y)||(console.warn(`[mcp-use] warning: extracted subdomain "${y}" does not match expected format`),y=""),I=!0,clearTimeout(R),f({url:L,subdomain:y,process:S})}}),S.stderr.on("data",P=>{let v=P.toString();!h&&!v.includes("INFO")&&!v.includes("bore_cli")&&!v.includes("Shutting down")&&!/npm warn Unknown (?:env|project|user|builtin) config/.test(v)&&process.stderr.write(P)}),S.on("error",P=>{I||(clearTimeout(R),b(new Error(`Failed to start tunnel: ${P.message}`)))}),S.on("exit",P=>{P!==0&&P!==null&&!I&&(clearTimeout(R),b(new Error(`Tunnel process exited with code ${P}`))),r===S&&(r=void 0,o=null,u?t=void 0:w())});let R=setTimeout(()=>{I||(S.kill(),b(new Error("Tunnel setup timed out")))},3e4)});return w=()=>{u||a===void 0||o!==null||d===void 0&&(d=(async()=>{for(;!u&&a!==void 0&&o===null;){console.log("[mcp-use] tunnel disconnected, restarting\u2026");let c=t??await O();try{c!==void 0&&await H(c);let i;try{i=await M(a,c)}catch(f){if(c!==void 0)console.log(`[mcp-use] subdomain "${c}" unavailable, requesting a new one\u2026`),i=await M(a,void 0);else throw f}r=i.process,o=i.url,t=i.subdomain,await $(i.subdomain),p=q;return}catch(i){console.warn(`[mcp-use] tunnel restart failed: ${i instanceof Error?i.message:String(i)}`),await T(p),p=Math.min(p*2,Fe)}}})().finally(()=>{d=void 0}))},{status(){return{url:o}},async start(c){if(u=!1,a=c,o!==null)return{url:o,subdomain:t??""};let i=await O();i!==void 0&&(console.log(`[mcp-use] found existing subdomain: ${i}`),await H(i));let f;try{f=await M(c,i)}catch(b){if(i!==void 0)console.log(`[mcp-use] subdomain "${i}" unavailable, requesting a new one\u2026`),f=await M(c,void 0);else throw b}return r=f.process,o=f.url,t=f.subdomain,await $(f.subdomain),{url:f.url,subdomain:f.subdomain}},async stop(){u=!0,E(),d!==void 0&&await d,t!==void 0&&await H(t),r!==void 0&&(r.kill("SIGINT"),r=void 0),a=void 0,o=null,t=void 0,p=q}}}function en(e){let[r,o]=process.platform==="darwin"?["open",[e]]:process.platform==="win32"?["cmd",["/c","start","",e]]:["xdg-open",[e]];try{let t=je(r,o,{stdio:"ignore",detached:!0});t.on("error",()=>{}),t.unref()}catch{}}function nn(){for(let e of Object.values(Ve()))for(let r of e??[])if(!r.internal&&r.family==="IPv4")return r.address}function tn(e){if(e!==void 0)try{return new URL(`http://${e}`).hostname.replace(/^\[|\]$/g,"")}catch{return}}function rn(e){let r=e.getHeader("Vary"),o=typeof r=="string"?r:Array.isArray(r)?r.join(", "):r!==void 0?String(r):"";o.split(",").map(t=>t.trim().toLowerCase()).includes("origin")||e.setHeader("Vary",o===""?"Origin":`${o}, Origin`)}function on(e,r,o){if(o.tunnelActive){r.setHeader("Access-Control-Allow-Origin","*");return}if(!o.localhostBind)return;let t=e.headers.origin;if(t==="null"){r.setHeader("Access-Control-Allow-Origin","null");return}if(typeof t!="string"||t==="")return;let a=Ze(t,Ye());!a.ok||a.origin===void 0||(r.setHeader("Access-Control-Allow-Origin",a.origin),rn(r))}function sn(e){let r=e.default;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 o=r;if(typeof o.getHandler!="function")throw new Error("The entry's default export has no getHandler() \u2014 it must be the MCPServer instance (`export default server`).");return o}async function an(e){process.env.MCP_USE_DEV_CLI="1";let r=ie(e.cwd),o=new Ke(n=>{console.error("[mcp-use] notification delivery failed:",n)});te(e.cwd,"development");let t=Q(e.host),a=["127.0.0.1","localhost","::1"].includes(t),u=t==="0.0.0.0"||t==="::",d=Ne(),{port:p,requested:T}=await de(Y(e.port),t);p!==T&&console.log(`[mcp-use] port ${T} is taken, using ${p}`),process.env.PORT=String(p);let E=process.env.MCP_URL===void 0&&(t==="127.0.0.1"||t==="localhost"||t==="::1")?`http://localhost:${p}`:void 0,H=e.mcpDir===void 0?e.cwd:We(e.cwd,e.mcpDir),O=e.entry===void 0?W(H):W(e.cwd,e.entry);await se(e.cwd,O)&&console.log("[mcp-use] created mcp-env.d.ts");let $=e.viewsDir??(e.mcpDir===void 0?void 0:Be(e.mcpDir,"views")),w=G(e.cwd,$),M=w.length>0,c=re(e.cwd),f=["127.0.0.1","localhost","0.0.0.0","::","::1"].includes(t)?"localhost":t,b=`http://${f.includes(":")?`[${f}]`:f}:${p}`,g=await qe({root:e.cwd,configFile:M?c:!1,envDir:!1,logLevel:"warn",cacheDir:r.cache,resolve:{tsconfigPaths:!0,alias:{tailwindcss:oe()}},plugins:M?[B(e.cwd),Ge(),ce({getViews:()=>w,dev:{reactRefresh:!0}}),ze()]:[B(e.cwd)],server:{middlewareMode:!0,...M&&{origin:b},cors:!1,hmr:M?{server:d}:!1},ssr:{...ne(e.cwd)}}),x=g.environments.ssr,_=Je(x,{hmr:!1,sourcemapInterceptor:"node"}),S=async()=>{let n=async()=>{let l=await _.import(O),m=sn(l);if(w.length>0){let k=ae(w);if(typeof m.__primeViews!="function")throw new Error("Loaded MCPServer instance does not support __primeViews.");m.__primeViews(k,{dev:!0,projectRoot:e.cwd})}return m};if(E===void 0)return n();let s=process.env.MCP_URL;try{return process.env.MCP_URL=E,await n()}finally{s===void 0?delete process.env.MCP_URL:process.env.MCP_URL=s}},I,h;try{let n=await S();I=n.getHandler({bus:o}),h=n.basePath??"/mcp"}catch(n){throw await _.close(),await g.close(),n}let A,R,P,v=n=>{if(A===void 0||P===n)return;let s=A.mountInspector({basePath:n,autoConnectUrl:`${b}${n}`,oauthProxyAllowLoopback:a||u,devMode:!0});if(typeof s!="function")throw new Error("The installed @mcp-use/inspector is incompatible: mountInspector() did not return a Fetch handler.");R=s,P=n};try{if(e.inspector!==!1){let n=await we(e.cwd);n.installed&&(A=n.module,v(h))}}catch(n){throw await _.close(),await g.close(),n}let C=!1,U=!1,D=()=>{if(C){U=!0;return}C=!0,(async()=>{do{U=!1;try{_.evaluatedModules.clear();let n=await S(),s=n.getHandler({bus:o}),l=n.basePath??"/mcp";v(l),I=s,h=l,o.publish({kind:"tools_list_changed"}),o.publish({kind:"prompts_list_changed"}),o.publish({kind:"resources_list_changed"}),console.log("[mcp-use] reloaded server entry")}catch(n){console.error(`[mcp-use] reload failed \u2014 keeping the previous server:
2
- `,n)}}while(U);C=!1})()},L=n=>{if(z(n,e.cwd,$))return;let s=x.moduleGraph.getModulesByFile(n);if(!(s===void 0||s.size===0)){for(let l of s)x.moduleGraph.invalidateModule(l);D()}},N=n=>{if(!z(n,e.cwd,$))return;let s=w;w=G(e.cwd,$),(s.length!==w.length||s.some((m,k)=>m.name!==w[k]?.name||m.entryPath!==w[k]?.entryPath))&&D()},F=n=>{N(n),L(n)};g.watcher.on("change",L),g.watcher.on("add",F),g.watcher.on("unlink",F);let y=he(r.tunnel);d.prependListener("upgrade",n=>{let s=y.status().url;if(s===null)return;let l=new URL(s).hostname;n.headers.host?.split(":")[0]===l&&(n.headers.host=`localhost:${p}`)});let ge=(n,s)=>{let l=y.status().url,m=l!==null?new URL(l).hostname:null,k=m!==null?[m]:[],j=Qe(n.headers.host,[...Xe(),...k]);return j.ok?!1:(s.writeHead(403,{"content-type":"application/json"}),s.end(JSON.stringify({jsonrpc:"2.0",error:{code:-32e3,message:j.message},id:null})),!0)},J=async()=>{g.watcher.off("change",L),g.watcher.off("add",F),g.watcher.off("unlink",F),await y.stop(),await new Promise(n=>d.close(()=>n())),await _.close(),await g.close()},ve=pe({getBasePath:()=>h,port:p,tunnel:y},n=>R!==void 0&&Z(n,h)?R(n):I(n)),{toNodeHandler:Pe}=await import("../node-bridge-JJIA6K5P.js"),K=Pe({fetch:ve}),ye=(n,s)=>{if(a&&ge(n,s))return;let l=n.url??"/",m=new URL(l,"http://127.0.0.1").pathname,k=y.status().url,j=k===null?null:new URL(k).hostname,V=tn(n.headers.host);if((j!==null&&V===j||u&&V!==void 0&&!["localhost","127.0.0.1","::1"].includes(V))&&ee(m,h)){s.writeHead(404,{"content-type":"text/plain; charset=utf-8"}),s.end("Not Found");return}let X=M&&w.length>0,be=n.method==="GET"&&(m.startsWith("/@")||m.startsWith("/node_modules/")||m.startsWith("/.mcp-use/")||X&&m.startsWith("/views/"));X&&be?(on(n,s,{tunnelActive:y.status().url!==null,localhostBind:a}),g.middlewares(n,s,()=>{K(n,s)})):K(n,s)};if(d.on("request",ye),await new Promise((n,s)=>{d.once("error",s),d.listen(p,t,()=>n())}),console.log("[mcp-use] dev server ready"),w.length>0&&console.log(` \u279C Views: ${w.map(n=>n.name).join(", ")}`),console.log(` \u279C MCP endpoint: ${b}${h}`),R!==void 0?console.log(` \u279C Inspector: ${b}${h}/inspector`):e.inspector!==!1&&console.warn("[mcp-use] Built-in Inspector is unavailable; reinstall mcp-use to restore visual testing."),t==="0.0.0.0"||t==="::"){let n=nn();n!==void 0&&console.log(` \u279C Network: http://${n}:${p}${h}`)}if(a||console.warn(`[mcp-use] --host ${t} 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:n}=await y.start(p);console.log(` \u279C Tunnel: ${n}${h}`)}catch(n){throw await J(),n}R!==void 0&&e.open!==!1&&process.stdout.isTTY===!0&&en(`${b}${h}/inspector`),await new Promise(n=>{let s=!1,l=()=>{s||(s=!0,process.off("SIGINT",l),process.off("SIGTERM",l),(async()=>(await J(),n()))())};process.on("SIGINT",l),process.on("SIGTERM",l),e.signal!==void 0&&(e.signal.aborted?l():e.signal.addEventListener("abort",l,{once:!0}))})}export{an as runDev};
1
+ import{a as ne,b as te}from"../chunk-N7BU45K6.js";import{b as Q,c as Z}from"../chunk-USIKTT3N.js";import{a as se,b as ie,c as ae,d as G,f as q,g as ce,i as le}from"../chunk-ALPMVGHI.js";import{b as re,c as oe,d as W}from"../chunk-7G4TXPP4.js";import{a as V,b as ee}from"../chunk-DB3E6LBX.js";import{spawn as Ne}from"child_process";import{createServer as Be}from"http";import{networkInterfaces as Ve}from"os";import{join as We,resolve as Ge}from"path";import qe from"@tailwindcss/vite";import ze from"@vitejs/plugin-react";import{createServer as Je,createServerModuleRunner as Ke}from"vite";import{InMemoryServerEventBus as Xe,localhostAllowedHostnames as Ye,localhostAllowedOrigins as Qe,validateHostHeader as Ze,validateOriginHeader as en}from"@modelcontextprotocol/server";import{connect as Me,createServer as Re}from"net";var ue=100,Ie=300,_e=new Set(["127.0.0.1","localhost","::1"]);function ke(e,r){return new Promise(o=>{let t=Re();t.unref(),t.once("error",()=>o(!1)),t.listen({port:e,host:r},()=>{t.close(()=>o(!0))})})}function de(e,r){return new Promise(o=>{let t=Me({port:e,host:r});t.setTimeout(Ie),t.once("connect",()=>{t.destroy(),o(!0)}),t.once("timeout",()=>{t.destroy(),o(!1)}),t.once("error",()=>{t.destroy(),o(!1)})})}async function Te(e){return await de(e,"127.0.0.1")||await de(e,"::1")}async function pe(e,r){for(let o=e;o<e+ue;o++)if(await ke(o,r)&&!(_e.has(r)&&await Te(o)))return{port:o,requested:e};throw new Error(`No free port found between ${e} and ${e+ue-1} on ${r}.`)}function fe(e,r){let o=()=>{let t=e.getBasePath(),{url:c}=e.tunnel.status();return{mcpUrl:c!==null?`${c.replace(/\/+$/,"")}${t}`:null,port:e.port,fromCli:!0,tunnelUrl:c}};return async t=>{let c=e.getBasePath(),u=`${c}/inspector/api/dev/info`,d=`${c}/inspector/api/dev/start-tunnel`,p=`${c}/inspector/api/dev/stop-tunnel`,R=new URL(t.url).pathname;if(t.method==="GET"&&R===u)return Response.json(o());if(t.method==="POST"&&R===d)try{return await e.tunnel.start(e.port),Response.json({ok:!0,restarting:!1})}catch(k){let T=k instanceof Error?k.message:"Failed to start tunnel";return Response.json({error:T},{status:500})}return t.method==="POST"&&R===p?(await e.tunnel.stop(),Response.json({ok:!0})):r(t)}}import{readFileSync as Ee}from"fs";import{createRequire as $e}from"module";import{join as De}from"path";import{pathToFileURL as Oe}from"url";async function he(e){let r=De(e,"package.json"),o=JSON.parse(Ee(r,"utf8"));if([o.dependencies,o.devDependencies,o.optionalDependencies].some(u=>u!==null&&typeof u=="object"&&"@mcp-use/inspector"in u)){let u=$e(r);try{let d=u.resolve("@mcp-use/inspector");return me(await import(Oe(d).href))}catch(d){if(!we(d))throw d}}try{return me(await import("@mcp-use/inspector"))}catch(u){if(we(u))return{installed:!1};throw u}}function me(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 we(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"}import{mkdir as xe,readFile as He,writeFile as Ae}from"fs/promises";import{spawn as Ce}from"child_process";import{dirname as Ue}from"path";var Le="https://local.mcp-use.run";function je(){return process.env.MCP_USE_TUNNEL_API??Le}var z=1e3,Fe=3e4;function ve(e){let r,o=null,t,c,u=!1,d,p=z,R=a=>new Promise(i=>{setTimeout(i,a)}),k=()=>{r!==void 0&&"markShutdown"in r&&typeof r.markShutdown=="function"&&r.markShutdown()},T=async a=>{try{await fetch(`${je()}/api/tunnels/${a}`,{method:"DELETE",signal:AbortSignal.timeout(2e3)})}catch{}},U=async()=>{try{let a=await He(e,"utf8"),i=JSON.parse(a);return typeof i.subdomain=="string"?i.subdomain:void 0}catch{return}},H=async a=>{try{await xe(Ue(e),{recursive:!0}),await Ae(e,JSON.stringify({subdomain:a},null,2),"utf8")}catch(i){console.warn(`[mcp-use] failed to save tunnel subdomain: ${i instanceof Error?i.message:String(i)}`)}},E=()=>{},m=(a,i)=>new Promise((g,b)=>{console.log(`[mcp-use] starting tunnel for port ${a}\u2026`);let I=process.env.npm_config_user_agent??"",[P,A]=I.startsWith("pnpm/")?["pnpm",["--silent","dlx","@mcp-use/tunnel",String(a)]]:I.startsWith("bun/")?["bunx",["@mcp-use/tunnel",String(a)]]:["npx",["--yes","--prefer-offline","@mcp-use/tunnel",String(a)]];i!==void 0&&A.push("--subdomain",i);let h=Ce(P,A,{stdio:["ignore","pipe","pipe"],shell:process.platform==="win32"}),_=!1,$=!1,y=()=>{$=!0};h.markShutdown=y,h.stdout.on("data",w=>{let v=w.toString(),F=v.includes("Shutting down")||v.includes("\u{1F6D1}"),L=v.includes("\u2716")||v.includes("Error:");!$&&!F&&!L&&process.stdout.write(v);let O=v.match(/https?:\/\/([a-z0-9-]+\.[a-z0-9.-]+)/i);if(O!==null&&!_){let N=O[0],C=O[1]??"",S=C.match(/^([a-z0-9-]+)\./i)?.[1]??C.split(".")[0]??"";/^[a-z0-9-]+$/i.test(S)||(console.warn(`[mcp-use] warning: extracted subdomain "${S}" does not match expected format`),S=""),_=!0,clearTimeout(D),g({url:N,subdomain:S,process:h})}}),h.stderr.on("data",w=>{let v=w.toString();!$&&!v.includes("INFO")&&!v.includes("bore_cli")&&!v.includes("Shutting down")&&!/npm warn Unknown (?:env|project|user|builtin) config/.test(v)&&process.stderr.write(w)}),h.on("error",w=>{_||(clearTimeout(D),b(new Error(`Failed to start tunnel: ${w.message}`)))}),h.on("exit",w=>{w!==0&&w!==null&&!_&&(clearTimeout(D),b(new Error(`Tunnel process exited with code ${w}`))),r===h&&(r=void 0,o=null,u?t=void 0:E())});let D=setTimeout(()=>{_||(h.kill(),b(new Error("Tunnel setup timed out")))},3e4)});return E=()=>{u||c===void 0||o!==null||d===void 0&&(d=(async()=>{for(;!u&&c!==void 0&&o===null;){console.log("[mcp-use] tunnel disconnected, restarting\u2026");let a=t??await U();try{a!==void 0&&await T(a);let i;try{i=await m(c,a)}catch(g){if(a!==void 0)console.log(`[mcp-use] subdomain "${a}" unavailable, requesting a new one\u2026`),i=await m(c,void 0);else throw g}r=i.process,o=i.url,t=i.subdomain,await H(i.subdomain),p=z;return}catch(i){console.warn(`[mcp-use] tunnel restart failed: ${i instanceof Error?i.message:String(i)}`),await R(p),p=Math.min(p*2,Fe)}}})().finally(()=>{d=void 0}))},{status(){return{url:o}},async start(a){if(u=!1,c=a,o!==null)return{url:o,subdomain:t??""};let i=await U();i!==void 0&&(console.log(`[mcp-use] found existing subdomain: ${i}`),await T(i));let g;try{g=await m(a,i)}catch(b){if(i!==void 0)console.log(`[mcp-use] subdomain "${i}" unavailable, requesting a new one\u2026`),g=await m(a,void 0);else throw b}return r=g.process,o=g.url,t=g.subdomain,await H(g.subdomain),{url:g.url,subdomain:g.subdomain}},async stop(){u=!0,k(),d!==void 0&&await d,t!==void 0&&await T(t),r!==void 0&&(r.kill("SIGINT"),r=void 0),c=void 0,o=null,t=void 0,p=z}}}function nn(e){let[r,o]=process.platform==="darwin"?["open",[e]]:process.platform==="win32"?["cmd",["/c","start","",e]]:["xdg-open",[e]];try{let t=Ne(r,o,{stdio:"ignore",detached:!0});t.on("error",()=>{}),t.unref()}catch{}}function tn(){for(let e of Object.values(Ve()))for(let r of e??[])if(!r.internal&&r.family==="IPv4")return r.address}function rn(e){if(e!==void 0)try{return new URL(`http://${e}`).hostname.replace(/^\[|\]$/g,"")}catch{return}}function on(e){let r=e.getHeader("Vary"),o=typeof r=="string"?r:Array.isArray(r)?r.join(", "):r!==void 0?String(r):"";o.split(",").map(t=>t.trim().toLowerCase()).includes("origin")||e.setHeader("Vary",o===""?"Origin":`${o}, Origin`)}function sn(e,r,o){if(o.tunnelActive){r.setHeader("Access-Control-Allow-Origin","*");return}if(!o.localhostBind)return;let t=e.headers.origin;if(t==="null"){r.setHeader("Access-Control-Allow-Origin","null");return}if(typeof t!="string"||t==="")return;let c=en(t,Qe());!c.ok||c.origin===void 0||(r.setHeader("Access-Control-Allow-Origin",c.origin),on(r))}function an(e){let r=e.default;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 o=r;if(typeof o.fetch!="function")throw new Error("The entry's default export has no fetch() \u2014 it must be the MCPServer instance (`export default server`).");return o}async function cn(e){process.env.MCP_USE_DEV_CLI="1";let r=ae(e.cwd),o=new Xe(n=>{console.error("[mcp-use] notification delivery failed:",n)});oe(e.cwd,"development");let t=Z(e.host),c=["127.0.0.1","localhost","::1"].includes(t),u=t==="0.0.0.0"||t==="::",d=Be(),{port:p,requested:R}=await pe(Q(e.port),t);p!==R&&console.log(`[mcp-use] port ${R} is taken, using ${p}`),process.env.PORT=String(p);let k=process.env.MCP_URL===void 0&&(t==="127.0.0.1"||t==="localhost"||t==="::1")?`http://localhost:${p}`:void 0,T=e.mcpDir===void 0?e.cwd:Ge(e.cwd,e.mcpDir),U=e.entry===void 0?V(T):V(e.cwd,e.entry),H=await ee(e.cwd,U);(H==="created"||H==="updated")&&console.log(`[mcp-use] ${H} mcp-env.d.ts`);let E=e.viewsDir??(e.mcpDir===void 0?void 0:We(e.mcpDir,"views")),m=G(e.cwd,E),a=m.length>0,i=se(e.cwd),b=["127.0.0.1","localhost","0.0.0.0","::","::1"].includes(t)?"localhost":t,I=`http://${b.includes(":")?`[${b}]`:b}:${p}`,P=await Je({root:e.cwd,configFile:a?i:!1,envDir:!1,logLevel:"warn",cacheDir:r.cache,resolve:{tsconfigPaths:!0,alias:{tailwindcss:ie()}},plugins:a?[W(e.cwd),qe(),le({getViews:()=>m,dev:{reactRefresh:!0}}),ze()]:[W(e.cwd)],server:{middlewareMode:!0,...a&&{origin:I},cors:!1,hmr:a?{server:d}:!1},ssr:{...re(e.cwd)}}),A=P.environments.ssr,h=Ke(A,{hmr:!1,sourcemapInterceptor:"node"}),_=async()=>{let n=async()=>{let l=await h.import(U),f=an(l);if(m.length>0){let M=ce(m);if(typeof f.__primeViews!="function")throw new Error("Loaded MCPServer instance does not support __primeViews.");f.__primeViews(M,{dev:!0,projectRoot:e.cwd})}return f};if(k===void 0)return n();let s=process.env.MCP_URL;try{return process.env.MCP_URL=k,await n()}finally{s===void 0?delete process.env.MCP_URL:process.env.MCP_URL=s}},$,y;try{let n=await _();n.__setEventBus(o),n.__mount(),$=async s=>n.fetch(s),y=n.basePath??"/mcp"}catch(n){throw await h.close(),await P.close(),n}let D,w,v,F=n=>{if(D===void 0||v===n)return;let s=D.mountInspector({basePath:n,autoConnectUrl:`${I}${n}`,oauthProxyAllowLoopback:c||u,devMode:!0});if(typeof s!="function")throw new Error("The installed @mcp-use/inspector is incompatible: mountInspector() did not return a Fetch handler.");w=s,v=n};try{if(e.inspector!==!1){let n=await he(e.cwd);n.installed&&(D=n.module,F(y))}}catch(n){throw await h.close(),await P.close(),n}let L=!1,O=!1,N=()=>{if(L){O=!0;return}L=!0,(async()=>{do{O=!1;try{h.evaluatedModules.clear();let n=await _();n.__setEventBus(o),n.__mount();let s=async f=>n.fetch(f),l=n.basePath??"/mcp";F(l),$=s,y=l,o.publish({kind:"tools_list_changed"}),o.publish({kind:"prompts_list_changed"}),o.publish({kind:"resources_list_changed"}),console.log("[mcp-use] reloaded server entry")}catch(n){console.error(`[mcp-use] reload failed \u2014 keeping the previous server:
2
+ `,n)}}while(O);L=!1})()},C=n=>{if(q(n,e.cwd,E))return;let s=A.moduleGraph.getModulesByFile(n);if(!(s===void 0||s.size===0)){for(let l of s)A.moduleGraph.invalidateModule(l);N()}},J=n=>{if(!q(n,e.cwd,E))return;let s=m;m=G(e.cwd,E),(s.length!==m.length||s.some((f,M)=>f.name!==m[M]?.name||f.entryPath!==m[M]?.entryPath))&&N()},S=n=>{J(n),C(n)};P.watcher.on("change",C),P.watcher.on("add",S),P.watcher.on("unlink",S);let x=ve(r.tunnel);d.prependListener("upgrade",n=>{let s=x.status().url;if(s===null)return;let l=new URL(s).hostname;n.headers.host?.split(":")[0]===l&&(n.headers.host=`localhost:${p}`)});let ge=(n,s)=>{let l=x.status().url,f=l!==null?new URL(l).hostname:null,M=f!==null?[f]:[],j=Ze(n.headers.host,[...Ye(),...M]);return j.ok?!1:(s.writeHead(403,{"content-type":"application/json"}),s.end(JSON.stringify({jsonrpc:"2.0",error:{code:-32e3,message:j.message},id:null})),!0)},K=async()=>{P.watcher.off("change",C),P.watcher.off("add",S),P.watcher.off("unlink",S),await x.stop(),await new Promise(n=>d.close(()=>n())),await h.close(),await P.close()},Pe=fe({getBasePath:()=>y,port:p,tunnel:x},n=>w!==void 0&&ne(n,y)?w(n):$(n)),{toNodeHandler:ye}=await import("../node-bridge-JJIA6K5P.js"),X=ye({fetch:Pe}),be=(n,s)=>{if(c&&ge(n,s))return;let l=n.url??"/",f=new URL(l,"http://127.0.0.1").pathname,M=x.status().url,j=M===null?null:new URL(M).hostname,B=rn(n.headers.host);if((j!==null&&B===j||u&&B!==void 0&&!["localhost","127.0.0.1","::1"].includes(B))&&te(f,y)){s.writeHead(404,{"content-type":"text/plain; charset=utf-8"}),s.end("Not Found");return}let Y=a&&m.length>0,Se=n.method==="GET"&&(f.startsWith("/@")||f.startsWith("/node_modules/")||f.startsWith("/.mcp-use/")||Y&&f.startsWith("/views/"));Y&&Se?(sn(n,s,{tunnelActive:x.status().url!==null,localhostBind:c}),P.middlewares(n,s,()=>{X(n,s)})):X(n,s)};if(d.on("request",be),await new Promise((n,s)=>{d.once("error",s),d.listen(p,t,()=>n())}),console.log("[mcp-use] dev server ready"),m.length>0&&console.log(` \u279C Views: ${m.map(n=>n.name).join(", ")}`),console.log(` \u279C MCP endpoint: ${I}${y}`),w!==void 0?console.log(` \u279C Inspector: ${I}${y}/inspector`):e.inspector!==!1&&console.warn("[mcp-use] Built-in Inspector is unavailable; reinstall mcp-use to restore visual testing."),t==="0.0.0.0"||t==="::"){let n=tn();n!==void 0&&console.log(` \u279C Network: http://${n}:${p}${y}`)}if(c||console.warn(`[mcp-use] --host ${t} 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:n}=await x.start(p);console.log(` \u279C Tunnel: ${n}${y}`)}catch(n){throw await K(),n}w!==void 0&&e.open!==!1&&process.stdout.isTTY===!0&&nn(`${I}${y}/inspector`),await new Promise(n=>{let s=!1,l=()=>{s||(s=!0,process.off("SIGINT",l),process.off("SIGTERM",l),(async()=>(await K(),n()))())};process.on("SIGINT",l),process.on("SIGTERM",l),e.signal!==void 0&&(e.signal.aborted?l():e.signal.addEventListener("abort",l,{once:!0}))})}export{cn as runDev};
@@ -1,4 +1,4 @@
1
- import{a as b}from"../chunk-N7BU45K6.js";import{b as h,c as w}from"../chunk-JAFV3QGS.js";import{c as y}from"../chunk-7G4TXPP4.js";import{readFile as I}from"fs/promises";import{join as p}from"path";import{pathToFileURL as v}from"url";var k=".mcp-use",M="build",x="manifest.json";async function N(t){let e=p(t.cwd,k,M),r=p(e,x),a;try{a=await I(r,"utf8")}catch{throw new Error(`No production build found (missing ${r}).
2
- Run \`mcp-use build\` first, then \`mcp-use start\`.`)}let s;try{let o=JSON.parse(a);if(typeof o.entryPoint!="string"||o.entryPoint==="")throw new Error("missing entryPoint");s=o.entryPoint}catch(o){let E=o instanceof Error?o.message:String(o);throw new Error(`Invalid build manifest at ${r} (${E}).
3
- Re-run \`mcp-use build\`.`)}process.env.NODE_ENV??="production",y(t.cwd,"production");let i=p(e,s),u=await import(v(i).href);if(!("default"in u)||u.default===void 0)throw new Error(`The built entry (${i}) has no default export.
4
- The server entry must \`export default\` its MCPServer instance (see the mcp-use entry contract).`);let n=u.default;if(!R(n))throw new Error(`The default export of ${i} is not an MCPServer: it has no listen() method. Export the MCPServer instance as the default export.`);let P=typeof n.port=="number"?n.port:void 0,S=typeof n.host=="string"?n.host:void 0,l=h(t.port,process.env,P),f=w(t.host,process.env,S),c=await(t.withInspector===!0?L(n,l,f):n.listen(l,{host:f})),m=typeof c?.port=="number"?c.port:l,g=typeof c?.url=="string"?c.url:`http://localhost:${m}`;return{port:m,url:g,close:async()=>{await n.close?.()}}}async function L(t,e,r){let{mountInspector:a}=await O(),s=typeof t.basePath=="string"?t.basePath:"/mcp",i=a({basePath:s,devMode:!1,oauthProxyAllowLoopback:!1});return t.listen(e,{host:r,routes:[{match:d=>b(d,s),handler:i}]})}async function O(){let t;try{t=await import("@mcp-use/inspector")}catch(e){throw _(e)?new Error("Built-in Inspector is unavailable; reinstall mcp-use to restore it."):e}if(typeof t.mountInspector!="function")throw new Error("The installed @mcp-use/inspector is incompatible: its package entry does not export mountInspector(). Reinstall mcp-use.");return{mountInspector:t.mountInspector}}function R(t){return typeof t=="object"&&t!==null&&typeof t.listen=="function"}function _(t){return t!==null&&typeof t=="object"&&"code"in t&&(t.code==="ERR_MODULE_NOT_FOUND"||t.code==="MODULE_NOT_FOUND")}export{N as runStart};
1
+ import{a as b}from"../chunk-N7BU45K6.js";import{b as h,c as w}from"../chunk-USIKTT3N.js";import{c as y}from"../chunk-7G4TXPP4.js";import{readFile as E}from"fs/promises";import{join as d}from"path";import{pathToFileURL as I}from"url";var k=".mcp-use",x="build",M="manifest.json";async function N(t){let e=d(t.cwd,k,x),r=d(e,M),u;try{u=await E(r,"utf8")}catch{throw new Error(`No production build found (missing ${r}).
2
+ Run \`mcp-use build\` first, then \`mcp-use start\`.`)}let s;try{let o=JSON.parse(u);if(typeof o.entryPoint!="string"||o.entryPoint==="")throw new Error("missing entryPoint");s=o.entryPoint}catch(o){let v=o instanceof Error?o.message:String(o);throw new Error(`Invalid build manifest at ${r} (${v}).
3
+ Re-run \`mcp-use build\`.`)}process.env.NODE_ENV??="production",y(t.cwd,"production");let i=d(e,s),a=await import(I(i).href);if(!("default"in a)||a.default===void 0)throw new Error(`The built entry (${i}) has no default export.
4
+ The server entry must \`export default\` its MCPServer instance (see the mcp-use entry contract).`);let n=a.default;if(!O(n))throw new Error(`The default export of ${i} is not an MCPServer: it has no listen() method. Export the MCPServer instance as the default export.`);let P=typeof n.port=="number"?n.port:void 0,S=typeof n.host=="string"?n.host:void 0,l=h(t.port,process.env,P),f=w(t.host,process.env,S),c=await(t.withInspector===!0?R(n,l,f):n.listen(l,{host:f})),m=typeof c?.port=="number"?c.port:l,g=typeof c?.url=="string"?c.url:`http://localhost:${m}`;return{port:m,url:g,close:async()=>{await n.close?.()}}}async function R(t,e,r){let{mountInspector:u}=await L(),s=typeof t.basePath=="string"?t.basePath:"/mcp",i=u({basePath:s,devMode:!1,oauthProxyAllowLoopback:!1});return t.app.use("*",async(p,a)=>{if(b(p.req.raw,s))return i(p.req.raw);await a()}),t.listen(e,{host:r})}async function L(){let t;try{t=await import("@mcp-use/inspector")}catch(e){throw _(e)?new Error("Built-in Inspector is unavailable; reinstall mcp-use to restore it."):e}if(typeof t.mountInspector!="function")throw new Error("The installed @mcp-use/inspector is incompatible: its package entry does not export mountInspector(). Reinstall mcp-use.");return{mountInspector:t.mountInspector}}function O(t){return typeof t=="object"&&t!==null&&typeof t.listen=="function"}function _(t){return t!==null&&typeof t=="object"&&"code"in t&&(t.code==="ERR_MODULE_NOT_FOUND"||t.code==="MODULE_NOT_FOUND")}export{N as runStart};
@@ -0,0 +1 @@
1
+ import{a as i,b as o}from"../chunk-DB3E6LBX.js";import{spawn as d}from"child_process";import{createRequire as l}from"module";import{dirname as u,join as p,resolve as y}from"path";async function f(e){let c=e.mcpDir===void 0?e.cwd:y(e.cwd,e.mcpDir),n=e.entry===void 0?i(c):i(e.cwd,e.entry),r=await o(e.cwd,n);r==="created"||r==="updated"?console.log(`[mcp-use] ${r} mcp-env.d.ts`):r==="user-owned"&&console.warn("[mcp-use] mcp-env.d.ts is user-owned; leaving it unchanged");let t=g(e.cwd);return w(t,e.cwd,e.tscArgs??[])}function g(e){let c=l(p(e,"package.json"));try{let n=c.resolve("typescript/package.json");return p(u(n),"bin","tsc")}catch{throw new Error(`TypeScript is not installed in ${e}. Install it with npm install --save-dev typescript.`)}}function w(e,c,n){return new Promise((r,t)=>{let s=d(process.execPath,[e,...n,"--noEmit"],{cwd:c,stdio:"inherit"});s.once("error",t),s.once("close",(a,m)=>{r(a??(m==="SIGINT"?130:1))})})}export{f as runTypecheck};
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.4",
4
+ "version": "4.0.0-beta.5",
5
5
  "description": "Prebuilt CLI, development server, and build pipeline for mcp-use",
6
6
  "author": "mcp-use, Inc.",
7
7
  "license": "MIT",
@@ -1,4 +0,0 @@
1
- import{a as p,b as f,d as l}from"./chunk-7G4TXPP4.js";import{existsSync as m}from"fs";import{isAbsolute as x,join as h,resolve as V}from"path";var d=["src/index.ts","src/index.tsx","src/server.ts","src/server.tsx","index.ts","index.tsx","server.ts","server.tsx"];function B(r,t){if(t!==void 0){let e=x(t)?t:V(r,t);if(!m(e))throw new Error(`Entry not found: ${e} (from --entry "${t}")`);return e}for(let e of d){let n=h(r,e);if(m(n))return n}throw new Error(`No server entry found in ${r}. Looked for: ${d.join(", ")}. Create one of these (default-exporting your MCPServer instance) or pass --entry <path>.`)}import{existsSync as y}from"fs";import{join as E}from"path";import{fileURLToPath as I}from"url";var D=["vite.config.ts","vite.config.js","vite.config.mts","vite.config.cjs"];function q(r){for(let t of D){let e=E(r,t);if(y(e))return e}return!1}function z(){return I(import.meta.resolve("tailwindcss/index.css"))}import{writeFile as P}from"fs/promises";import{extname as _,join as S,relative as R,sep as A}from"path";var j="mcp-env.d.ts";function M(r,t){let e=R(r,t).split(A).join("/"),n=_(e),i=n===".mts"?".mjs":n===".cts"?".cjs":n===".ts"||n===".tsx"?".js":n;return n!==i&&(e=`${e.slice(0,-n.length)}${i}`),e.startsWith(".")?e:`./${e}`}function $(r,t){let e=M(r,t);return["// mcp-use generated env declaration",'declare module "*.css";',"",'declare module "mcp-use/react" {'," interface Register {",` tools: typeof import(${JSON.stringify(e)});`," }","}","","export {};",""].join(`
2
- `)}async function tt(r,t){let e=S(r,j);try{return await P(e,$(r,t),{encoding:"utf8",flag:"wx"}),!0}catch(n){if(n!==null&&typeof n=="object"&&"code"in n&&n.code==="EEXIST")return!1;throw n}}import{join as s}from"path";var T=".mcp-use",b="manifest.json";function nt(r){let t=s(r,T),e=s(t,"build");return{projectRoot:r,workspace:t,build:e,generated:s(t,"generated"),cache:s(t,"cache"),state:s(t,"state"),cloud:s(t,"cloud"),buildManifest:s(e,b),tunnel:s(t,"state","tunnel.json")}}import{existsSync as g,readdirSync as L}from"fs";import{isAbsolute as N,join as W,resolve as C}from"path";var O="views",a="virtual:mcp-use/views/",c=`\0${a}`;function v(r,t){let e=t??O;return N(e)?e:C(r,e)}function ct(r,t){let e=v(r,t);if(!g(e))return[];let n=[];for(let i of L(e,{withFileTypes:!0})){if(!i.isDirectory())continue;let o=W(e,i.name,"view.tsx");g(o)&&n.push({name:i.name,entryPath:o})}return n.sort((i,o)=>i.name.localeCompare(o.name)),n}function U(r){return`${a}${r}`}function k(r){return`/@id/__x00__${a}${r}`}function ut(r,t,e){let n=v(t,e);return r===n||r.startsWith(`${n}/`)}function pt(r){let t={};for(let e of r)t[e.name]={kind:"external",entry:k(e.name),css:[],scripts:["/@vite/client"]};return t}async function ft(r,t,e){let{createServer:n}=await import("vite");return n({root:r,configFile:e,envDir:!1,logLevel:"warn",cacheDir:t,resolve:{tsconfigPaths:!0,alias:p(r)},plugins:[l(r)],server:{middlewareMode:!0,hmr:!1},ssr:{...f(r)}})}var u="virtual:mcp-use/tailwind.css",w=`\0${u}`;function dt(r){return{name:"mcp-use-views",applyToEnvironment(t){return t.name==="client"},resolveId(t){if(t===u)return w;if(t.startsWith(a))return`\0${t}`},load(t){if(t===w)return['@import "tailwindcss";',"@custom-variant dark (&:where(.dark, .dark *, [data-theme=dark], [data-theme=dark] *));"].join(`
3
- `);if(!t.startsWith(c))return;let e=t.slice(c.length),n=r.getViews().find(o=>o.name===e);if(n===void 0)return;let i=[];return r.dev?.reactRefresh===!0&&i.push('import "@vitejs/plugin-react/preamble";'),i.push(`import ${JSON.stringify(u)};`),i.push('import { bootstrapView } from "mcp-use/react";',`import * as viewModule from ${JSON.stringify(n.entryPath)};`,"bootstrapView(viewModule);"),r.dev!==void 0&&i.push("if (import.meta.hot) {"," import.meta.hot.accept();","}"),i.push(""),i.join(`
4
- `)}}}export{B as a,q as b,z as c,tt as d,nt as e,ct as f,U as g,ut as h,pt as i,ft as j,dt as k};
@@ -1 +0,0 @@
1
- var f="127.0.0.1";function u(n,e,t=process.env){if(n!==void 0)return n;let r=t.HOST?.trim();return r!==void 0&&r!==""?r:e??f}function a(n,e,t=process.env){if(n!==void 0)return n;let r=c(t.PORT);return r!==void 0?r:e??3e3}function c(n){if(n===void 0||n.trim()==="")return;let e=Number(n);return Number.isInteger(e)&&e>=0&&e<=65535?e:void 0}function m(n){let e={command:void 0,port:void 0,entry:void 0,path:void 0,mcpDir:void 0,viewsDir:void 0,host:void 0,tunnel:!1,open:!0,inspector:!0,withInspector:!1,sourceMaps:!1,inline:!1,help:!1,version:!1};for(let t=0;t<n.length;t++){let r=n[t];if(r===void 0)continue;let i=r,d;if(r.startsWith("--")){let s=r.indexOf("=");s!==-1&&(i=r.slice(0,s),d=r.slice(s+1))}let o=()=>{if(d!==void 0)return d;let s=n[++t];if(s===void 0||s.startsWith("-"))throw new Error(`Missing value for ${i}`);return s};switch(i){case"-h":case"--help":e.help=!0;break;case"-v":case"--version":e.version=!0;break;case"-p":case"--port":e.port=p(o());break;case"--entry":e.entry=o();break;case"--path":e.path=o();break;case"--mcp-dir":e.mcpDir=o();break;case"--views-dir":e.viewsDir=o();break;case"--host":e.host=o();break;case"--tunnel":e.tunnel=!0;break;case"--no-open":e.open=!1;break;case"--no-inspector":e.inspector=!1;break;case"--with-inspector":e.withInspector=!0;break;case"--source-maps":e.sourceMaps=!0;break;case"--inline":e.inline=!0;break;default:if(i.startsWith("-"))throw new Error(`Unknown option: ${i}`);if(e.command!==void 0)throw new Error(`Unexpected argument: ${i}`);e.command=i}}return e}function h(n,e=process.env,t){return a(n,t,e)}function v(n,e=process.env,t){return u(n,t,e)}function p(n){let e=Number(n);if(!l(e))throw new Error(`Invalid port: ${n}`);return e}function l(n){return Number.isInteger(n)&&n>=0&&n<=65535}export{m as a,h as b,v as c};