@mcp-use/cli 4.1.8 → 4.1.9-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{a as o}from"./chunk-
|
|
2
|
+
import{a as o}from"./chunk-JBGCRKRU.js";import"./chunk-RXKUVCL7.js";import"./chunk-WOT6VMZA.js";import{readFileSync as i}from"fs";import{createRequire as a}from"module";import{dirname as t,join as c,parse as m}from"path";function p(){try{let e=a(import.meta.url).resolve("mcp-use"),n=t(e),s=m(n).root;for(;n!==s;){try{let r=JSON.parse(i(c(n,"package.json"),"utf8"));if(r.name==="mcp-use"&&typeof r.version=="string")return r.version}catch{}n=t(n)}}catch{}}o(process.argv.slice(2),{frameworkVersion:p()??"4.1.9-canary.0"}).then(e=>{process.exitCode=e},e=>{console.error(e instanceof Error?e.message:String(e)),process.exitCode=1});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as
|
|
1
|
+
import{b as R,c as B,d as H}from"../chunk-YTNIFIL2.js";import{a,b as s,d as x,e as M,f as T}from"../chunk-Q6AC7LJS.js";import"../chunk-S3WHXP7I.js";import"../chunk-WOT6VMZA.js";import{spawn as $}from"child_process";import{access as j,mkdtemp as F,rm as A,writeFile as G}from"fs/promises";import{createServer as V}from"net";import{tmpdir as J}from"os";import{basename as q,join as z,resolve as W}from"path";import{parseArgs as K}from"util";import{fileURLToPath as X}from"url";var Q=`Usage: mcp-use screenshot (--server <name> | --mcp <url>) --tool <name> [args...] [options]
|
|
2
2
|
|
|
3
3
|
Call a view-backed MCP tool and capture its rendered MCP App as PNG.
|
|
4
4
|
|
|
@@ -38,13 +38,14 @@ Exit codes:
|
|
|
38
38
|
0 Capture succeeded or help
|
|
39
39
|
2 Invalid arguments
|
|
40
40
|
1 MCP, tool, Inspector, browser, readiness, or write failure`;async function ke(n){if(n.some(o=>o==="--help"||o==="-h"))return process.stdout.write(`${Q}
|
|
41
|
-
`),0;let e=
|
|
41
|
+
`),0;let e=x(n),r,t,i;try{let{values:o,positionals:c}=K({args:[...n],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:"768"},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 a("Exactly one of --server or --mcp is required.");if(o.tool===void 0)throw new a("--tool is required.");if(o.server!==void 0&&o.header!==void 0)throw new a("--header is valid only with --mcp.");if(o.theme!=="light"&&o.theme!=="dark")throw new a("--theme must be light or dark.");let d=v(o.width,"--width"),b=v(o.height,"--height"),l=Number(o["device-scale-factor"]);if(!Number.isFinite(l)||l<=0||l>4)throw new a("--device-scale-factor must be greater than 0 and at most 4.");let p=v(o.timeout,"--timeout"),P=we(o.delay,"--delay"),N=me(o.header??[]);r=o.server!==void 0?await R(o.server,3e5,e):await B(new URL(o.mcp).href,N,e);let C=(await r.listTools()).find(O=>O.name===o.tool);if(C===void 0)throw new s("tool_not_found",`Tool not found: ${o.tool}`);let w=te(C),I=H(c),h=await r.callTool(o.tool,I,{timeout:p});if(h.isError===!0)throw new s("tool_failed",`Tool ${o.tool} returned an error.`,h);let S=await r.readResource(w);re(S),i=o.inspector===void 0?await Y(p):void 0;let E=(o.inspector??i.origin).replace(/\/+$/,"");await U(E,p);let k=ne(w),m=new URL(`${E}/inspector/preview/${encodeURIComponent(k)}`);m.searchParams.set("protocol","1"),m.searchParams.set("theme",o.theme),m.searchParams.set("width",String(d)),t=o["cdp-url"]!==void 0?await ie(o["cdp-url"]):await oe(),await t.cdp.send("Emulation.setDeviceMetricsOverride",{width:d,height:b,deviceScaleFactor:l,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 = ${he({resourceUri:w,resourceContents:S,toolInput:I,toolOutput:h})};`},t.sessionId),await t.cdp.send("Page.navigate",{url:m.href},t.sessionId),await se(t,p),await ce(t,o["wait-for"],p),P>0&&await u(P);let f=await de(t),_=await t.cdp.send("Page.captureScreenshot",{format:"png",captureBeyondViewport:!0,fromSurface:!0,clip:{...f,scale:1}},t.sessionId);if(typeof _.data!="string")throw new s("capture_failed","Chrome returned no screenshot data.");let g=W(o.output??`${k}-${new Date().toISOString().replace(/[:.]/g,"-")}.png`);return await G(g,Buffer.from(_.data,"base64")),M({path:g,width:f.width,height:f.height,viewport:{width:d,height:b},deviceScaleFactor:l,theme:o.theme},e,g),0}catch(o){return T(o instanceof TypeError?new a(o.message):o,e)}finally{await t?.close().catch(()=>{}),await i?.close().catch(()=>{}),await r?.disconnect().catch(()=>{})}}async function Y(n){let e=await L(),r=import.meta.resolve("@mcp-use/inspector"),t=X(new URL("../cli.js",r)),i=$(process.execPath,[t,"--port",String(e),"--no-open"],{stdio:"ignore"}),o=`http://127.0.0.1:${e}`;try{await Z(o,i,Math.min(n,1e4))}catch(c){throw i.kill("SIGTERM"),c}return{origin:o,async close(){await ee(i)}}}async function Z(n,e,r){let t=Date.now()+r;for(;Date.now()<t;){if(e.exitCode!==null)throw new s("inspector_start_failed",`Packaged Inspector exited before becoming ready (code ${e.exitCode}).`);try{await U(n,Math.min(1e3,r));return}catch{await u(100)}}throw new s("inspector_start_failed","Packaged Inspector did not start in time.")}async function ee(n){n.exitCode===null&&(n.kill("SIGTERM"),await Promise.race([new Promise(e=>n.once("exit",()=>e())),u(2e3)]),n.exitCode===null&&n.kill("SIGKILL"))}async function U(n,e){let r=await fetch(`${n}/inspector/health`,{signal:AbortSignal.timeout(e)});if(!r.ok)throw new s("incompatible_inspector",`Inspector health check failed (${r.status}).`);let t=await r.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 te(n){let e=n!==null&&typeof n=="object"?n._meta:void 0,t=(e?.ui!==null&&typeof e?.ui=="object"?e.ui.resourceUri:void 0)??e?.["ui/resourceUri"];if(typeof t!="string")throw new s("missing_view","Tool does not advertise an MCP Apps UI resource.");return t}function re(n){let e=n!==null&&typeof n=="object"?n.contents:void 0;if(!Array.isArray(e))throw new s("invalid_view","View resource has no contents.");let r=e.find(t=>t!==null&&typeof t=="object"&&typeof t.text=="string");if(r===void 0)throw new s("invalid_view","View resource has no HTML document.");return r.text}function ne(n){let e=new URL(n);return q(e.pathname).replace(/\.html$/,"")||e.hostname}async function oe(){let n=await le(),e=await L(),r=await F(z(J(),"mcp-use-chrome-")),t=$(n,[`--remote-debugging-port=${e}`,`--user-data-dir=${r}`,"--headless=new","--no-first-run","--no-default-browser-check","about:blank"],{stdio:"ignore"});try{let i=await pe(`http://127.0.0.1:${e}/json/version`,1e4),o=await D(i.webSocketDebuggerUrl);return{...o,async close(){await o.close(),t.kill("SIGTERM"),await A(r,{recursive:!0,force:!0})}}}catch(i){throw t.kill("SIGTERM"),await A(r,{recursive:!0,force:!0}),i}}async function ie(n){return D(n)}async function D(n){let e=await y.connect(n),r=await e.send("Target.createTarget",{url:"about:blank"}),t=await e.send("Target.attachToTarget",{targetId:r.targetId,flatten:!0});return{cdp:e,sessionId:t.sessionId,async close(){await e.send("Target.closeTarget",{targetId:r.targetId}).catch(()=>{}),e.close()}}}async function se(n,e){let r=Date.now()+e;for(;Date.now()<r;){if((await n.cdp.send("Runtime.evaluate",{expression:"document.readyState",returnByValue:!0},n.sessionId)).result?.value==="complete")return;await u(100)}throw new s("browser_timeout","Inspector page did not load in time.")}function ae(n){if(n?.error==="view_load_failed")return new s("view_load_failed",n.errorMessage?`MCP App failed to initialize: ${n.errorMessage}`:"MCP App failed to initialize.")}async function ce(n,e,r){let t=Date.now()+r;for(;Date.now()<t;){let i=`(() => ({
|
|
42
42
|
ready: document.body?.dataset.viewReady === "true",
|
|
43
43
|
error: document.body?.dataset.viewError || null,
|
|
44
|
+
errorMessage: document.body?.dataset.viewErrorMessage || null,
|
|
44
45
|
selector: ${JSON.stringify(e)} === undefined || !!document.querySelector(${JSON.stringify(e??"")})
|
|
45
|
-
}))()`,
|
|
46
|
+
}))()`,c=(await n.cdp.send("Runtime.evaluate",{expression:i,returnByValue:!0},n.sessionId)).result?.value,d=ae(c);if(d)throw d;if(c?.ready===!0&&c.selector===!0)return;await u(100)}throw new s("browser_timeout","View did not become ready in time.")}async function de(n){let e=await n.cdp.send("Runtime.evaluate",{expression:`(() => {
|
|
46
47
|
const frame = document.querySelector("iframe");
|
|
47
48
|
if (!frame) return null;
|
|
48
49
|
const rect = frame.getBoundingClientRect();
|
|
49
50
|
return { x: rect.x, y: rect.y, width: rect.width, height: rect.height };
|
|
50
|
-
})()`,returnByValue:!0},n.sessionId);return
|
|
51
|
+
})()`,returnByValue:!0},n.sessionId);return ue(e.result?.value)}function ue(n){if(n===null||typeof n!="object")throw new s("capture_failed","Inspector preview did not expose rendered widget bounds.");let e=n;if([e.x,e.y,e.width,e.height].some(o=>typeof o!="number"||!Number.isFinite(o))||e.width<=0||e.height<=0)throw new s("capture_failed","Inspector preview returned invalid widget bounds.");let t=Math.floor(e.x),i=Math.floor(e.y);return{x:t,y:i,width:Math.ceil(e.x+e.width)-t,height:Math.ceil(e.y+e.height)-i}}var y=class n{#t;#r=1;#e=new Map;constructor(e){this.#t=e,e.addEventListener("message",r=>{let t=JSON.parse(String(r.data));if(t.id===void 0)return;let i=this.#e.get(t.id);i!==void 0&&(this.#e.delete(t.id),t.error!==void 0?i.reject(new Error(t.error.message??"CDP command failed.")):i.resolve(t.result))}),e.addEventListener("close",()=>{for(let r of this.#e.values())r.reject(new Error("Chrome DevTools connection closed."));this.#e.clear()})}static async connect(e){let r=new WebSocket(e);return await new Promise((t,i)=>{r.addEventListener("open",()=>t(),{once:!0}),r.addEventListener("error",()=>i(new Error("Could not connect to Chrome DevTools.")),{once:!0})}),new n(r)}send(e,r={},t){let i=this.#r++;return new Promise((o,c)=>{this.#e.set(i,{resolve:o,reject:c}),this.#t.send(JSON.stringify({id:i,method:e,params:r,...t!==void 0?{sessionId:t}:{}}))})}close(){this.#t.close()}};async function le(){let e=[process.env.MCP_USE_CHROME_PATH??process.env.PUPPETEER_EXECUTABLE_PATH??process.env.CHROME_PATH,...process.platform==="darwin"?["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Chromium.app/Contents/MacOS/Chromium","/Applications/Brave Browser.app/Contents/MacOS/Brave Browser","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"]:process.platform==="win32"?[`${process.env.PROGRAMFILES??""}\\Google\\Chrome\\Application\\chrome.exe`,`${process.env.LOCALAPPDATA??""}\\Google\\Chrome\\Application\\chrome.exe`]:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium","/usr/bin/chromium-browser"]].filter(r=>r!==void 0&&r!=="");for(let r of e)try{return await j(r),r}catch{}throw new s("chrome_not_found","Chrome, Chromium, Edge, or Brave was not found. Set MCP_USE_CHROME_PATH.")}function L(){return new Promise((n,e)=>{let r=V();r.once("error",e),r.listen(0,"127.0.0.1",()=>{let t=r.address(),i=typeof t=="object"&&t!==null?t.port:0;r.close(o=>o?e(o):n(i))})})}async function pe(n,e){let r=Date.now()+e;for(;Date.now()<r;){try{let t=await fetch(n);if(t.ok)return await t.json()}catch{}await u(100)}throw new s("chrome_start_failed","Chrome DevTools did not start.")}function me(n){let e={};for(let r of n){let t=r.indexOf(":");if(t<=0)throw new a(`Invalid header: ${r}`);e[r.slice(0,t).trim()]=r.slice(t+1).trim()}return e}function v(n,e){let r=Number(n);if(!Number.isFinite(r)||r<=0)throw new a(`${e} must be positive.`);return r}function we(n,e){let r=Number(n);if(!Number.isFinite(r)||r<0)throw new a(`${e} must be non-negative.`);return r}function he(n){return JSON.stringify(n).replace(/</g,"\\u003c").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function u(n){return new Promise(e=>setTimeout(e,n))}export{ue as normalizeCaptureBounds,ae as readyStateFailure,ke as runScreenshot};
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a}from"./chunk-
|
|
1
|
+
import{a}from"./chunk-JBGCRKRU.js";import"./chunk-RXKUVCL7.js";import"./chunk-WOT6VMZA.js";export{a as main};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-use/cli",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "4.1.
|
|
4
|
+
"version": "4.1.9-canary.0",
|
|
5
5
|
"description": "Prebuilt CLI, development server, and build pipeline for mcp-use",
|
|
6
6
|
"author": "mcp-use, Inc.",
|
|
7
7
|
"license": "MIT",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
53
|
"@mcp-use/client": "^2.0.1 || ^2.1.0 || ^2.1.1 || ^2.1.2 || ^2.1.3 || ^2.1.4 || ^2.1.5 || ^2.2.0 || ^2.2.1 || ^2.2.2",
|
|
54
|
-
"@mcp-use/inspector": "^20.3.3"
|
|
54
|
+
"@mcp-use/inspector": "^20.3.3 || ^20.3.4-canary.0"
|
|
55
55
|
},
|
|
56
56
|
"peerDependenciesMeta": {
|
|
57
57
|
"@mcp-use/client": {
|
|
File without changes
|