mcp-use 2.0.0-beta.18 → 2.0.0-beta.4
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/.tsbuildinfo +1 -1
- package/dist/bin/main.d.ts.map +1 -1
- package/dist/bin.js +2 -5
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-O3CUL5VH.js → chunk-AQ2ZZM2P.js} +18 -68
- package/dist/chunk-AQ2ZZM2P.js.map +1 -0
- package/dist/{chunk-RHITI5QM.js → chunk-RQRT27Q3.js} +16 -190
- package/dist/chunk-RQRT27Q3.js.map +1 -0
- package/dist/{chunk-QUUANIE4.js → chunk-SFI2T6TE.js} +80 -34
- package/dist/chunk-SFI2T6TE.js.map +1 -0
- package/dist/chunk-VV2P4ZFZ.js +187 -0
- package/dist/chunk-VV2P4ZFZ.js.map +1 -0
- package/dist/cli/build.d.ts +1 -1
- package/dist/cli/build.d.ts.map +1 -1
- package/dist/cli/dev.d.ts.map +1 -1
- package/dist/cli/port.d.ts.map +1 -1
- package/dist/cli/tunnel.d.ts.map +1 -1
- package/dist/cli/views-plugin.d.ts.map +1 -1
- package/dist/cli/views.d.ts +5 -7
- package/dist/cli/views.d.ts.map +1 -1
- package/dist/commands/build.js +13 -28
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/client.d.ts.map +1 -1
- package/dist/commands/client.js +1 -1
- package/dist/commands/dev.js +14 -109
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/load-client.d.ts +2 -9
- package/dist/commands/load-client.d.ts.map +1 -1
- package/dist/commands/screenshot.js +1 -1
- package/dist/completable.d.ts +0 -9
- package/dist/completable.d.ts.map +1 -1
- package/dist/config.d.ts +4 -125
- package/dist/config.d.ts.map +1 -1
- package/dist/fetch-app.d.ts +0 -43
- package/dist/fetch-app.d.ts.map +1 -1
- package/dist/index.d.ts +5 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +125 -1148
- package/dist/index.js.map +1 -1
- package/dist/inspector-shell.d.ts +4 -17
- package/dist/inspector-shell.d.ts.map +1 -1
- package/dist/mount-mcp.d.ts +4 -0
- package/dist/mount-mcp.d.ts.map +1 -1
- package/dist/oauth/index.js +1 -2
- package/dist/{chunk-SMN75YED.js → public-route-7IK5D7V7.js} +10 -16
- package/dist/public-route-7IK5D7V7.js.map +1 -0
- package/dist/react/components/theme-provider.d.ts +0 -3
- package/dist/react/components/theme-provider.d.ts.map +1 -1
- package/dist/react/hooks/use-host-context.d.ts +0 -5
- package/dist/react/hooks/use-host-context.d.ts.map +1 -1
- package/dist/react/index.d.ts +0 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +3 -124
- package/dist/react/index.js.map +1 -1
- package/dist/react/runtime/view-runtime.d.ts +0 -23
- package/dist/react/runtime/view-runtime.d.ts.map +1 -1
- package/dist/react/types/register.d.ts +1 -1
- package/dist/react/types/register.d.ts.map +1 -1
- package/dist/resources.d.ts +4 -59
- package/dist/resources.d.ts.map +1 -1
- package/dist/server.d.ts +5 -118
- package/dist/server.d.ts.map +1 -1
- package/dist/tools.d.ts +1 -12
- package/dist/tools.d.ts.map +1 -1
- package/dist/views/document.d.ts.map +1 -1
- package/dist/views/public-route.d.ts +3 -9
- package/dist/views/public-route.d.ts.map +1 -1
- package/dist/views/routes.d.ts +1 -5
- package/dist/views/routes.d.ts.map +1 -1
- package/dist/views/wire.d.ts +3 -7
- package/dist/views/wire.d.ts.map +1 -1
- package/package.json +9 -17
- package/dist/branding.d.ts +0 -82
- package/dist/branding.d.ts.map +0 -1
- package/dist/chunk-FC2Z2VFO.js +0 -99
- package/dist/chunk-FC2Z2VFO.js.map +0 -1
- package/dist/chunk-KIZ72TIK.js +0 -38
- package/dist/chunk-KIZ72TIK.js.map +0 -1
- package/dist/chunk-O3CUL5VH.js.map +0 -1
- package/dist/chunk-QUUANIE4.js.map +0 -1
- package/dist/chunk-RHITI5QM.js.map +0 -1
- package/dist/chunk-SMN75YED.js.map +0 -1
- package/dist/chunk-XUI7QE2D.js +0 -98
- package/dist/chunk-XUI7QE2D.js.map +0 -1
- package/dist/chunk-Z326HADF.js +0 -82
- package/dist/chunk-Z326HADF.js.map +0 -1
- package/dist/chunk-ZJJD33SF.js +0 -741
- package/dist/chunk-ZJJD33SF.js.map +0 -1
- package/dist/cli/mcp-env-declaration.d.ts +0 -20
- package/dist/cli/mcp-env-declaration.d.ts.map +0 -1
- package/dist/internal/resource-completion.js +0 -7
- package/dist/internal/resource-completion.js.map +0 -1
- package/dist/landing-handler-WE66NIGB.js +0 -37
- package/dist/landing-handler-WE66NIGB.js.map +0 -1
- package/dist/landing-handler.d.ts +0 -24
- package/dist/landing-handler.d.ts.map +0 -1
- package/dist/landing.d.ts +0 -67
- package/dist/landing.d.ts.map +0 -1
- package/dist/landing.js +0 -7
- package/dist/landing.js.map +0 -1
- package/dist/middleware/cors.d.ts +0 -11
- package/dist/middleware/cors.d.ts.map +0 -1
- package/dist/middleware/mcp-middleware.d.ts +0 -175
- package/dist/middleware/mcp-middleware.d.ts.map +0 -1
- package/dist/oauth/better-auth.d.ts +0 -29
- package/dist/oauth/better-auth.d.ts.map +0 -1
- package/dist/oauth/better-auth.js +0 -76
- package/dist/oauth/better-auth.js.map +0 -1
- package/dist/proxy-DJYWGTGX.js +0 -282
- package/dist/proxy-DJYWGTGX.js.map +0 -1
- package/dist/proxy.d.ts +0 -153
- package/dist/proxy.d.ts.map +0 -1
- package/dist/public-route-5JEGFEIN.js +0 -9
- package/dist/public-route-5JEGFEIN.js.map +0 -1
- package/dist/react/hooks/use-files.d.ts +0 -25
- package/dist/react/hooks/use-files.d.ts.map +0 -1
- package/dist/react/types/file-types.d.ts +0 -16
- package/dist/react/types/file-types.d.ts.map +0 -1
- package/dist/resource-completion.d.ts +0 -12
- package/dist/resource-completion.d.ts.map +0 -1
package/dist/bin/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/bin/main.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kFAAkF;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,gFAAgF;IAChF,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA+BD;;;;;;;;GAQG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/bin/main.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kFAAkF;IAClF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,gFAAgF;IAChF,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA+BD;;;;;;;;GAQG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0EnE"}
|
package/dist/bin.js
CHANGED
|
@@ -39,11 +39,8 @@ async function main(argv) {
|
|
|
39
39
|
return 0;
|
|
40
40
|
}
|
|
41
41
|
if (argv.some((token) => token === "--help" || token === "-h")) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
console.log(HELP);
|
|
45
|
-
return 0;
|
|
46
|
-
}
|
|
42
|
+
console.log(HELP);
|
|
43
|
+
return 0;
|
|
47
44
|
}
|
|
48
45
|
const command = argv[0];
|
|
49
46
|
if (command === "login" || command === "logout" || command === "whoami") {
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bin/main.ts","../src/bin.ts"],"sourcesContent":["/**\n * Command dispatch for the `mcp-use` bin (specs/CLI_SPEC.md).\n *\n * Every substantial command is dispatched through its own dynamic import.\n * The library entry, bin, and production `start` path therefore never\n * evaluate Vite or an unrelated command implementation.\n */\nimport { readFileSync } from \"node:fs\";\n\nimport { parseArgs, type ParsedArgs } from \"./args.js\";\n\n/**\n * Options this bin passes to the cli's `runDev`/`runBuild`.\n *\n * @internal\n */\nexport interface CliCommandOptions {\n /** Project root the command operates on (`process.cwd()`). */\n cwd: string;\n /** Server entry module override (`--entry`). */\n entry?: string;\n /** Port override (`--port`/`-p`). */\n port?: number;\n /** Host override (`--host`). */\n host?: string;\n /** Start a public tunnel at dev startup (`--tunnel`). */\n tunnel?: boolean;\n /** Auto-open the inspector in a browser at dev startup (`--no-open` disables). */\n open?: boolean;\n /** Record inspector availability in the build manifest (`--with-inspector`). */\n withInspector?: boolean;\n}\n\nconst HELP = `mcp-use — run MCP servers built with mcp-use\n\nUsage: mcp-use <command> [options]\n\nCommands:\n dev Start the dev server\n build Build the server into .mcp-use/build\n start Serve the production build from .mcp-use/build\n login Authenticate the cloud CLI\n logout Delete local cloud credentials\n whoami Show the authenticated cloud identity\n org Manage the active organization\n servers Manage cloud servers and environment variables\n deployments Manage cloud deployments and logs\n deploy Deploy the current GitHub project\n client Connect to and invoke MCP servers\n skills Install maintained coding-agent skills\n screenshot Capture an MCP Apps view\n\nOptions:\n -p, --port <n> Port to serve on (default: $PORT or 3000)\n --host <host> Host to bind (dev only)\n --entry <path> Server entry module (dev/build only)\n --with-inspector Record inspector availability in the build manifest (build only)\n --tunnel Expose the dev server through a public tunnel (dev only)\n --no-open Do not auto-open the inspector in a browser (dev only)\n -h, --help Show this help\n -v, --version Print the version`;\n\n/**\n * Run the `mcp-use` CLI.\n *\n * @param argv - Raw arguments, typically `process.argv.slice(2)`.\n * @returns The process exit code. A `0` from `start`/`dev` means the command\n * launched successfully and the process should stay alive serving.\n *\n * @internal\n */\nexport async function main(argv: readonly string[]): Promise<number> {\n if (argv.length === 1 && [\"--version\", \"-v\"].includes(argv[0] ?? \"\")) {\n console.log(readOwnVersion());\n return 0;\n }\n if (argv.some((token) => token === \"--help\" || token === \"-h\")) {\n const command = argv[0];\n if (command === undefined || command === \"--help\" || command === \"-h\") {\n console.log(HELP);\n return 0;\n }\n }\n\n const command = argv[0];\n if (command === \"login\" || command === \"logout\" || command === \"whoami\") {\n const { runIdentity } = await import(\"../commands/identity.js\");\n return runIdentity(command, argv.slice(1));\n }\n if (command === \"org\") {\n const { runOrganizations } = await import(\"../commands/organizations.js\");\n return runOrganizations(argv.slice(1));\n }\n if (command === \"servers\") {\n const { runServers } = await import(\"../commands/servers.js\");\n return runServers(argv.slice(1));\n }\n if (command === \"deployments\") {\n const { runDeployments } = await import(\"../commands/deployments.js\");\n return runDeployments(argv.slice(1));\n }\n if (command === \"deploy\") {\n const { runDeploy } = await import(\"../commands/deploy.js\");\n return runDeploy(argv.slice(1));\n }\n if (command === \"client\") {\n const { runClient } = await import(\"../commands/client.js\");\n return runClient(argv.slice(1));\n }\n if (command === \"skills\") {\n const { runSkills } = await import(\"../commands/skills.js\");\n return runSkills(argv.slice(1));\n }\n if (command === \"screenshot\") {\n const { runScreenshot } = await import(\"../commands/screenshot.js\");\n return runScreenshot(argv.slice(1));\n }\n\n let args: ParsedArgs;\n try {\n args = parseArgs(argv);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n return 2;\n }\n\n if (args.version) {\n console.log(readOwnVersion());\n return 0;\n }\n if (args.help) {\n console.log(HELP);\n return 0;\n }\n\n switch (args.command) {\n case \"start\":\n return startCommand(args);\n case \"dev\":\n case \"build\":\n return cliCommand(args.command, args);\n case undefined:\n console.error(HELP);\n return 2;\n default:\n console.error(`Unknown command: ${args.command}\\n\\n${HELP}`);\n return 2;\n }\n}\n\n/** `mcp-use start`: serve the production build, wire shutdown signals. */\nasync function startCommand(args: ParsedArgs): Promise<number> {\n let started;\n try {\n const { runStart } = await import(\"../commands/start.js\");\n started = await runStart({ cwd: process.cwd(), port: args.port });\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n return 1;\n }\n\n console.log(`mcp-use server running at ${started.url}`);\n\n const shutdown = (): void => {\n started.close().then(\n () => process.exit(0),\n (error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n );\n };\n process.once(\"SIGINT\", shutdown);\n process.once(\"SIGTERM\", shutdown);\n return 0;\n}\n\n/** `mcp-use dev` / `mcp-use build`: dispatch to dedicated command chunks. */\nasync function cliCommand(\n command: \"dev\" | \"build\",\n args: ParsedArgs\n): Promise<number> {\n const options: CliCommandOptions = {\n cwd: process.cwd(),\n ...(args.entry !== undefined && { entry: args.entry }),\n ...(args.port !== undefined && { port: args.port }),\n ...(args.host !== undefined && { host: args.host }),\n ...(args.tunnel && { tunnel: true }),\n ...(!args.open && { open: false }),\n ...(args.withInspector && { withInspector: true }),\n };\n\n try {\n if (command === \"dev\") {\n const { runDev } = await import(\"../commands/dev.js\");\n await runDev(options);\n } else {\n const { runBuild } = await import(\"../commands/build.js\");\n await runBuild(options);\n }\n return 0;\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n return 1;\n }\n}\n\n/**\n * Read this package's own version for `--version`.\n *\n * Probes both layouts — `dist/bin.js` (bundled, package root is one level\n * up) and `src/bin/main.ts` (tests, package root is two levels up) — and\n * verifies the manifest's `name` so an unrelated package.json never wins.\n */\nfunction readOwnVersion(): string {\n for (const relative of [\"../package.json\", \"../../package.json\"]) {\n try {\n const raw = readFileSync(new URL(relative, import.meta.url), \"utf8\");\n const pkg = JSON.parse(raw) as { name?: unknown; version?: unknown };\n if (\n (pkg.name === \"mcp-use\" || pkg.name === \"mcp-use\") &&\n typeof pkg.version === \"string\"\n ) {\n return pkg.version;\n }\n } catch {\n // Not there or unreadable — try the next candidate.\n }\n }\n return \"unknown\";\n}\n","#!/usr/bin/env node\n/*\n * `mcp-use` bin entry point (specs/CLI_SPEC.md).\n *\n * Kept to a single call so all logic lives in testable modules under\n * src/bin/. On success the process is NOT exited: `start` (and `dev`) keep\n * serving, and `--help`/`--version` let the event loop drain naturally.\n */\nimport { main } from \"./bin/main.js\";\n\nmain(process.argv.slice(2)).then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n);\n"],"mappings":";;;;;;AAOA,SAAS,oBAAoB;AA0B7B,IAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsCb,eAAsB,KAAK,MAA0C;AACnE,MAAI,KAAK,WAAW,KAAK,CAAC,aAAa,IAAI,EAAE,SAAS,KAAK,CAAC,KAAK,EAAE,GAAG;AACpE,YAAQ,IAAI,eAAe,CAAC;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,KAAK,CAAC,UAAU,UAAU,YAAY,UAAU,IAAI,GAAG;AAC9D,UAAMA,WAAU,KAAK,CAAC;AACtB,QAAIA,aAAY,UAAaA,aAAY,YAAYA,aAAY,MAAM;AACrE,cAAQ,IAAI,IAAI;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,UAAU,KAAK,CAAC;AACtB,MAAI,YAAY,WAAW,YAAY,YAAY,YAAY,UAAU;AACvE,UAAM,EAAE,YAAY,IAAI,MAAM,OAAO,wBAAyB;AAC9D,WAAO,YAAY,SAAS,KAAK,MAAM,CAAC,CAAC;AAAA,EAC3C;AACA,MAAI,YAAY,OAAO;AACrB,UAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,6BAA8B;AACxE,WAAO,iBAAiB,KAAK,MAAM,CAAC,CAAC;AAAA,EACvC;AACA,MAAI,YAAY,WAAW;AACzB,UAAM,EAAE,WAAW,IAAI,MAAM,OAAO,uBAAwB;AAC5D,WAAO,WAAW,KAAK,MAAM,CAAC,CAAC;AAAA,EACjC;AACA,MAAI,YAAY,eAAe;AAC7B,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,2BAA4B;AACpE,WAAO,eAAe,KAAK,MAAM,CAAC,CAAC;AAAA,EACrC;AACA,MAAI,YAAY,UAAU;AACxB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,sBAAuB;AAC1D,WAAO,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,EAChC;AACA,MAAI,YAAY,UAAU;AACxB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,sBAAuB;AAC1D,WAAO,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,EAChC;AACA,MAAI,YAAY,UAAU;AACxB,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,sBAAuB;AAC1D,WAAO,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,EAChC;AACA,MAAI,YAAY,cAAc;AAC5B,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,0BAA2B;AAClE,WAAO,cAAc,KAAK,MAAM,CAAC,CAAC;AAAA,EACpC;AAEA,MAAI;AACJ,MAAI;AACF,WAAO,UAAU,IAAI;AAAA,EACvB,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS;AAChB,YAAQ,IAAI,eAAe,CAAC;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,MAAM;AACb,YAAQ,IAAI,IAAI;AAChB,WAAO;AAAA,EACT;AAEA,UAAQ,KAAK,SAAS;AAAA,IACpB,KAAK;AACH,aAAO,aAAa,IAAI;AAAA,IAC1B,KAAK;AAAA,IACL,KAAK;AACH,aAAO,WAAW,KAAK,SAAS,IAAI;AAAA,IACtC,KAAK;AACH,cAAQ,MAAM,IAAI;AAClB,aAAO;AAAA,IACT;AACE,cAAQ,MAAM,oBAAoB,KAAK,OAAO;AAAA;AAAA,EAAO,IAAI,EAAE;AAC3D,aAAO;AAAA,EACX;AACF;AAGA,eAAe,aAAa,MAAmC;AAC7D,MAAI;AACJ,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,qBAAsB;AACxD,cAAU,MAAM,SAAS,EAAE,KAAK,QAAQ,IAAI,GAAG,MAAM,KAAK,KAAK,CAAC;AAAA,EAClE,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,WAAO;AAAA,EACT;AAEA,UAAQ,IAAI,6BAA6B,QAAQ,GAAG,EAAE;AAEtD,QAAM,WAAW,MAAY;AAC3B,YAAQ,MAAM,EAAE;AAAA,MACd,MAAM,QAAQ,KAAK,CAAC;AAAA,MACpB,CAAC,UAAmB;AAClB,gBAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,UAAQ,KAAK,UAAU,QAAQ;AAC/B,UAAQ,KAAK,WAAW,QAAQ;AAChC,SAAO;AACT;AAGA,eAAe,WACb,SACA,MACiB;AACjB,QAAM,UAA6B;AAAA,IACjC,KAAK,QAAQ,IAAI;AAAA,IACjB,GAAI,KAAK,UAAU,UAAa,EAAE,OAAO,KAAK,MAAM;AAAA,IACpD,GAAI,KAAK,SAAS,UAAa,EAAE,MAAM,KAAK,KAAK;AAAA,IACjD,GAAI,KAAK,SAAS,UAAa,EAAE,MAAM,KAAK,KAAK;AAAA,IACjD,GAAI,KAAK,UAAU,EAAE,QAAQ,KAAK;AAAA,IAClC,GAAI,CAAC,KAAK,QAAQ,EAAE,MAAM,MAAM;AAAA,IAChC,GAAI,KAAK,iBAAiB,EAAE,eAAe,KAAK;AAAA,EAClD;AAEA,MAAI;AACF,QAAI,YAAY,OAAO;AACrB,YAAM,EAAE,OAAO,IAAI,MAAM,OAAO,mBAAoB;AACpD,YAAM,OAAO,OAAO;AAAA,IACtB,OAAO;AACL,YAAM,EAAE,SAAS,IAAI,MAAM,OAAO,qBAAsB;AACxD,YAAM,SAAS,OAAO;AAAA,IACxB;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,WAAO;AAAA,EACT;AACF;AASA,SAAS,iBAAyB;AAChC,aAAW,YAAY,CAAC,mBAAmB,oBAAoB,GAAG;AAChE,QAAI;AACF,YAAM,MAAM,aAAa,IAAI,IAAI,UAAU,YAAY,GAAG,GAAG,MAAM;AACnE,YAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,WACG,IAAI,SAAS,aAAa,IAAI,SAAS,cACxC,OAAO,IAAI,YAAY,UACvB;AACA,eAAO,IAAI;AAAA,MACb;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;;;AC5NA,KAAK,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAE;AAAA,EAC1B,CAAC,SAAS;AACR,YAAQ,WAAW;AAAA,EACrB;AAAA,EACA,CAAC,UAAmB;AAClB,YAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpE,YAAQ,WAAW;AAAA,EACrB;AACF;","names":["command"]}
|
|
1
|
+
{"version":3,"sources":["../src/bin/main.ts","../src/bin.ts"],"sourcesContent":["/**\n * Command dispatch for the `mcp-use` bin (specs/CLI_SPEC.md).\n *\n * Every substantial command is dispatched through its own dynamic import.\n * The library entry, bin, and production `start` path therefore never\n * evaluate Vite or an unrelated command implementation.\n */\nimport { readFileSync } from \"node:fs\";\n\nimport { parseArgs, type ParsedArgs } from \"./args.js\";\n\n/**\n * Options this bin passes to the cli's `runDev`/`runBuild`.\n *\n * @internal\n */\nexport interface CliCommandOptions {\n /** Project root the command operates on (`process.cwd()`). */\n cwd: string;\n /** Server entry module override (`--entry`). */\n entry?: string;\n /** Port override (`--port`/`-p`). */\n port?: number;\n /** Host override (`--host`). */\n host?: string;\n /** Start a public tunnel at dev startup (`--tunnel`). */\n tunnel?: boolean;\n /** Auto-open the inspector in a browser at dev startup (`--no-open` disables). */\n open?: boolean;\n /** Record inspector availability in the build manifest (`--with-inspector`). */\n withInspector?: boolean;\n}\n\nconst HELP = `mcp-use — run MCP servers built with mcp-use\n\nUsage: mcp-use <command> [options]\n\nCommands:\n dev Start the dev server\n build Build the server into .mcp-use/build\n start Serve the production build from .mcp-use/build\n login Authenticate the cloud CLI\n logout Delete local cloud credentials\n whoami Show the authenticated cloud identity\n org Manage the active organization\n servers Manage cloud servers and environment variables\n deployments Manage cloud deployments and logs\n deploy Deploy the current GitHub project\n client Connect to and invoke MCP servers\n skills Install maintained coding-agent skills\n screenshot Capture an MCP Apps view\n\nOptions:\n -p, --port <n> Port to serve on (default: $PORT or 3000)\n --host <host> Host to bind (dev only)\n --entry <path> Server entry module (dev/build only)\n --with-inspector Record inspector availability in the build manifest (build only)\n --tunnel Expose the dev server through a public tunnel (dev only)\n --no-open Do not auto-open the inspector in a browser (dev only)\n -h, --help Show this help\n -v, --version Print the version`;\n\n/**\n * Run the `mcp-use` CLI.\n *\n * @param argv - Raw arguments, typically `process.argv.slice(2)`.\n * @returns The process exit code. A `0` from `start`/`dev` means the command\n * launched successfully and the process should stay alive serving.\n *\n * @internal\n */\nexport async function main(argv: readonly string[]): Promise<number> {\n if (argv.length === 1 && [\"--version\", \"-v\"].includes(argv[0] ?? \"\")) {\n console.log(readOwnVersion());\n return 0;\n }\n if (argv.some((token) => token === \"--help\" || token === \"-h\")) {\n console.log(HELP);\n return 0;\n }\n\n const command = argv[0];\n if (command === \"login\" || command === \"logout\" || command === \"whoami\") {\n const { runIdentity } = await import(\"../commands/identity.js\");\n return runIdentity(command, argv.slice(1));\n }\n if (command === \"org\") {\n const { runOrganizations } = await import(\"../commands/organizations.js\");\n return runOrganizations(argv.slice(1));\n }\n if (command === \"servers\") {\n const { runServers } = await import(\"../commands/servers.js\");\n return runServers(argv.slice(1));\n }\n if (command === \"deployments\") {\n const { runDeployments } = await import(\"../commands/deployments.js\");\n return runDeployments(argv.slice(1));\n }\n if (command === \"deploy\") {\n const { runDeploy } = await import(\"../commands/deploy.js\");\n return runDeploy(argv.slice(1));\n }\n if (command === \"client\") {\n const { runClient } = await import(\"../commands/client.js\");\n return runClient(argv.slice(1));\n }\n if (command === \"skills\") {\n const { runSkills } = await import(\"../commands/skills.js\");\n return runSkills(argv.slice(1));\n }\n if (command === \"screenshot\") {\n const { runScreenshot } = await import(\"../commands/screenshot.js\");\n return runScreenshot(argv.slice(1));\n }\n\n let args: ParsedArgs;\n try {\n args = parseArgs(argv);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n return 2;\n }\n\n if (args.version) {\n console.log(readOwnVersion());\n return 0;\n }\n if (args.help) {\n console.log(HELP);\n return 0;\n }\n\n switch (args.command) {\n case \"start\":\n return startCommand(args);\n case \"dev\":\n case \"build\":\n return cliCommand(args.command, args);\n case undefined:\n console.error(HELP);\n return 2;\n default:\n console.error(`Unknown command: ${args.command}\\n\\n${HELP}`);\n return 2;\n }\n}\n\n/** `mcp-use start`: serve the production build, wire shutdown signals. */\nasync function startCommand(args: ParsedArgs): Promise<number> {\n let started;\n try {\n const { runStart } = await import(\"../commands/start.js\");\n started = await runStart({ cwd: process.cwd(), port: args.port });\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n return 1;\n }\n\n console.log(`mcp-use server running at ${started.url}`);\n\n const shutdown = (): void => {\n started.close().then(\n () => process.exit(0),\n (error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n );\n };\n process.once(\"SIGINT\", shutdown);\n process.once(\"SIGTERM\", shutdown);\n return 0;\n}\n\n/** `mcp-use dev` / `mcp-use build`: dispatch to dedicated command chunks. */\nasync function cliCommand(\n command: \"dev\" | \"build\",\n args: ParsedArgs\n): Promise<number> {\n const options: CliCommandOptions = {\n cwd: process.cwd(),\n ...(args.entry !== undefined && { entry: args.entry }),\n ...(args.port !== undefined && { port: args.port }),\n ...(args.host !== undefined && { host: args.host }),\n ...(args.tunnel && { tunnel: true }),\n ...(!args.open && { open: false }),\n ...(args.withInspector && { withInspector: true }),\n };\n\n try {\n if (command === \"dev\") {\n const { runDev } = await import(\"../commands/dev.js\");\n await runDev(options);\n } else {\n const { runBuild } = await import(\"../commands/build.js\");\n await runBuild(options);\n }\n return 0;\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n return 1;\n }\n}\n\n/**\n * Read this package's own version for `--version`.\n *\n * Probes both layouts — `dist/bin.js` (bundled, package root is one level\n * up) and `src/bin/main.ts` (tests, package root is two levels up) — and\n * verifies the manifest's `name` so an unrelated package.json never wins.\n */\nfunction readOwnVersion(): string {\n for (const relative of [\"../package.json\", \"../../package.json\"]) {\n try {\n const raw = readFileSync(new URL(relative, import.meta.url), \"utf8\");\n const pkg = JSON.parse(raw) as { name?: unknown; version?: unknown };\n if (\n (pkg.name === \"mcp-use\" || pkg.name === \"mcp-use\") &&\n typeof pkg.version === \"string\"\n ) {\n return pkg.version;\n }\n } catch {\n // Not there or unreadable — try the next candidate.\n }\n }\n return \"unknown\";\n}\n","#!/usr/bin/env node\n/*\n * `mcp-use` bin entry point (specs/CLI_SPEC.md).\n *\n * Kept to a single call so all logic lives in testable modules under\n * src/bin/. On success the process is NOT exited: `start` (and `dev`) keep\n * serving, and `--help`/`--version` let the event loop drain naturally.\n */\nimport { main } from \"./bin/main.js\";\n\nmain(process.argv.slice(2)).then(\n (code) => {\n process.exitCode = code;\n },\n (error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n);\n"],"mappings":"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","names":[]}
|
|
@@ -47,88 +47,42 @@ function resolveTailwindCss() {
|
|
|
47
47
|
return fileURLToPath(import.meta.resolve("tailwindcss/index.css"));
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
// src/cli/mcp-env-declaration.ts
|
|
51
|
-
import { writeFile } from "fs/promises";
|
|
52
|
-
import { extname, join as join3, relative, sep } from "path";
|
|
53
|
-
var MCP_ENV_DECLARATION_NAME = "mcp-env.d.ts";
|
|
54
|
-
function declarationImportPath(cwd, entry) {
|
|
55
|
-
let importPath = relative(cwd, entry).split(sep).join("/");
|
|
56
|
-
const extension = extname(importPath);
|
|
57
|
-
const runtimeExtension = extension === ".mts" ? ".mjs" : extension === ".cts" ? ".cjs" : extension === ".ts" || extension === ".tsx" ? ".js" : extension;
|
|
58
|
-
if (extension !== runtimeExtension) {
|
|
59
|
-
importPath = `${importPath.slice(0, -extension.length)}${runtimeExtension}`;
|
|
60
|
-
}
|
|
61
|
-
return importPath.startsWith(".") ? importPath : `./${importPath}`;
|
|
62
|
-
}
|
|
63
|
-
function renderMcpEnvDeclaration(cwd, entry) {
|
|
64
|
-
const importPath = declarationImportPath(cwd, entry);
|
|
65
|
-
return [
|
|
66
|
-
"// mcp-use generated env declaration",
|
|
67
|
-
'declare module "*.css";',
|
|
68
|
-
"",
|
|
69
|
-
'declare module "mcp-use/react" {',
|
|
70
|
-
" interface Register {",
|
|
71
|
-
` tools: typeof import(${JSON.stringify(importPath)});`,
|
|
72
|
-
" }",
|
|
73
|
-
"}",
|
|
74
|
-
"",
|
|
75
|
-
"export {};",
|
|
76
|
-
""
|
|
77
|
-
].join("\n");
|
|
78
|
-
}
|
|
79
|
-
async function ensureMcpEnvDeclaration(cwd, entry) {
|
|
80
|
-
const declarationPath = join3(cwd, MCP_ENV_DECLARATION_NAME);
|
|
81
|
-
try {
|
|
82
|
-
await writeFile(declarationPath, renderMcpEnvDeclaration(cwd, entry), {
|
|
83
|
-
encoding: "utf8",
|
|
84
|
-
flag: "wx"
|
|
85
|
-
});
|
|
86
|
-
return true;
|
|
87
|
-
} catch (error) {
|
|
88
|
-
if (error !== null && typeof error === "object" && "code" in error && error.code === "EEXIST") {
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
throw error;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
50
|
// src/cli/workspace.ts
|
|
96
|
-
import { join as
|
|
51
|
+
import { join as join3 } from "path";
|
|
97
52
|
var WORKSPACE_DIR_NAME = ".mcp-use";
|
|
98
53
|
var BUILD_MANIFEST_NAME = "manifest.json";
|
|
99
54
|
function resolveWorkspacePaths(projectRoot) {
|
|
100
|
-
const workspace =
|
|
101
|
-
const build =
|
|
55
|
+
const workspace = join3(projectRoot, WORKSPACE_DIR_NAME);
|
|
56
|
+
const build = join3(workspace, "build");
|
|
102
57
|
return {
|
|
103
58
|
projectRoot,
|
|
104
59
|
workspace,
|
|
105
60
|
build,
|
|
106
|
-
generated:
|
|
107
|
-
cache:
|
|
108
|
-
state:
|
|
109
|
-
cloud:
|
|
110
|
-
buildManifest:
|
|
111
|
-
tunnel:
|
|
61
|
+
generated: join3(workspace, "generated"),
|
|
62
|
+
cache: join3(workspace, "cache"),
|
|
63
|
+
state: join3(workspace, "state"),
|
|
64
|
+
cloud: join3(workspace, "cloud"),
|
|
65
|
+
buildManifest: join3(build, BUILD_MANIFEST_NAME),
|
|
66
|
+
tunnel: join3(workspace, "state", "tunnel.json")
|
|
112
67
|
};
|
|
113
68
|
}
|
|
114
69
|
|
|
115
70
|
// src/cli/views.ts
|
|
116
71
|
import { existsSync as existsSync3, readdirSync } from "fs";
|
|
117
|
-
import { join as
|
|
118
|
-
var VIEWS_SOURCE_DIR = "views";
|
|
72
|
+
import { join as join4 } from "path";
|
|
119
73
|
var VIRTUAL_VIEW_PREFIX = "virtual:mcp-use/views/";
|
|
120
74
|
var VIRTUAL_VIEW_RESOLVED_PREFIX = `\0${VIRTUAL_VIEW_PREFIX}`;
|
|
121
75
|
function discoverViews(cwd) {
|
|
122
|
-
const
|
|
123
|
-
if (!existsSync3(
|
|
76
|
+
const resourcesDir = join4(cwd, "resources");
|
|
77
|
+
if (!existsSync3(resourcesDir)) {
|
|
124
78
|
return [];
|
|
125
79
|
}
|
|
126
80
|
const views = [];
|
|
127
|
-
for (const entry of readdirSync(
|
|
81
|
+
for (const entry of readdirSync(resourcesDir, { withFileTypes: true })) {
|
|
128
82
|
if (!entry.isDirectory()) {
|
|
129
83
|
continue;
|
|
130
84
|
}
|
|
131
|
-
const entryPath =
|
|
85
|
+
const entryPath = join4(resourcesDir, entry.name, "view.tsx");
|
|
132
86
|
if (existsSync3(entryPath)) {
|
|
133
87
|
views.push({ name: entry.name, entryPath });
|
|
134
88
|
}
|
|
@@ -144,7 +98,7 @@ function devVirtualEntryPath(name) {
|
|
|
144
98
|
}
|
|
145
99
|
function isViewPath(file, cwd) {
|
|
146
100
|
const rel = file.startsWith(cwd) ? file.slice(cwd.length + 1) : file;
|
|
147
|
-
return /^
|
|
101
|
+
return /^resources\/[^/]+\//.test(rel) || /^resources\/[^/]+\/view\.tsx$/.test(rel);
|
|
148
102
|
}
|
|
149
103
|
function buildDevViewsManifest(views) {
|
|
150
104
|
const manifest = {};
|
|
@@ -163,7 +117,7 @@ async function createBindingValidationServer(cwd, cacheDir, configFile) {
|
|
|
163
117
|
return createServer({
|
|
164
118
|
root: cwd,
|
|
165
119
|
configFile,
|
|
166
|
-
|
|
120
|
+
envFile: false,
|
|
167
121
|
logLevel: "warn",
|
|
168
122
|
cacheDir,
|
|
169
123
|
server: { middlewareMode: true, hmr: false },
|
|
@@ -191,10 +145,7 @@ function mcpUseViewsPlugin(options) {
|
|
|
191
145
|
},
|
|
192
146
|
load(id) {
|
|
193
147
|
if (id === VIRTUAL_TAILWIND_RESOLVED_ID) {
|
|
194
|
-
return
|
|
195
|
-
'@import "tailwindcss";',
|
|
196
|
-
"@custom-variant dark (&:where(.dark, .dark *, [data-theme=dark], [data-theme=dark] *));"
|
|
197
|
-
].join("\n");
|
|
148
|
+
return `@import "tailwindcss";`;
|
|
198
149
|
}
|
|
199
150
|
if (!id.startsWith(VIRTUAL_VIEW_RESOLVED_PREFIX)) {
|
|
200
151
|
return void 0;
|
|
@@ -231,7 +182,6 @@ export {
|
|
|
231
182
|
discoverEntry,
|
|
232
183
|
resolveUserViteConfig,
|
|
233
184
|
resolveTailwindCss,
|
|
234
|
-
ensureMcpEnvDeclaration,
|
|
235
185
|
resolveWorkspacePaths,
|
|
236
186
|
discoverViews,
|
|
237
187
|
virtualViewId,
|
|
@@ -240,4 +190,4 @@ export {
|
|
|
240
190
|
createBindingValidationServer,
|
|
241
191
|
mcpUseViewsPlugin
|
|
242
192
|
};
|
|
243
|
-
//# sourceMappingURL=chunk-
|
|
193
|
+
//# sourceMappingURL=chunk-AQ2ZZM2P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/entry.ts","../src/cli/vite-config.ts","../src/cli/workspace.ts","../src/cli/views.ts","../src/cli/views-plugin.ts"],"sourcesContent":["/**\n * Server-entry discovery for `mcp-use build` and `mcp-use dev`.\n *\n * The entry contract (CLI_SPEC.md): the user's entry module default-exports\n * the `MCPServer` instance and never calls `listen()` itself — the CLI owns\n * the socket.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { isAbsolute, join, resolve } from \"node:path\";\n\n/**\n * Conventional entry locations, checked in order relative to the project\n * root; the first existing file wins.\n *\n * @internal\n */\nexport const ENTRY_CANDIDATES = [\n \"src/index.ts\",\n \"src/server.ts\",\n \"index.ts\",\n \"server.ts\",\n] as const;\n\n/**\n * Locate the server entry for a project.\n *\n * With `override` set (the `--entry` flag), the path is resolved against\n * `cwd` and must exist. Otherwise the {@link ENTRY_CANDIDATES} are probed in\n * order and the first hit wins.\n *\n * @param cwd - Absolute path to the project root.\n * @param override - Explicit entry path (`--entry`), absolute or relative to `cwd`.\n * @returns Absolute path to the entry file.\n * @throws If the override does not exist, or no conventional candidate is\n * found — the error lists every location that was checked.\n *\n * @internal\n */\nexport function discoverEntry(cwd: string, override?: string): string {\n if (override !== undefined) {\n const entry = isAbsolute(override) ? override : resolve(cwd, override);\n if (!existsSync(entry)) {\n throw new Error(`Entry not found: ${entry} (from --entry \"${override}\")`);\n }\n return entry;\n }\n for (const candidate of ENTRY_CANDIDATES) {\n const entry = join(cwd, candidate);\n if (existsSync(entry)) {\n return entry;\n }\n }\n throw new Error(\n `No server entry found in ${cwd}. Looked for: ` +\n `${ENTRY_CANDIDATES.join(\", \")}. ` +\n `Create one of these (default-exporting your MCPServer instance) ` +\n `or pass --entry <path>.`\n );\n}\n","/**\n * Resolve the project-level Vite config used only by the views client build.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst VITE_CONFIG_CANDIDATES = [\n \"vite.config.ts\",\n \"vite.config.js\",\n \"vite.config.mts\",\n \"vite.config.cjs\",\n] as const;\n\n/**\n * Locate a project Vite config, or disable config loading when absent.\n *\n * @param cwd - Absolute project root.\n * @returns Absolute config path or `false`.\n *\n * @internal\n */\nexport function resolveUserViteConfig(cwd: string): string | false {\n for (const name of VITE_CONFIG_CANDIDATES) {\n const path = join(cwd, name);\n if (existsSync(path)) return path;\n }\n return false;\n}\n\n/**\n * Resolve the framework-owned Tailwind stylesheet for project CSS imports.\n *\n * @returns Absolute path exported by the installed `tailwindcss` dependency.\n *\n * @internal\n */\nexport function resolveTailwindCss(): string {\n return fileURLToPath(import.meta.resolve(\"tailwindcss/index.css\"));\n}\n","/**\n * The per-project `.mcp-use/` workspace convention — the Next.js `.next`\n * analog. Everything tooling writes for a project lives under this single,\n * gitignored directory so a checkout stays clean and `rm -rf .mcp-use` is\n * always safe.\n *\n * The layout is a fixed convention, not configuration: there is deliberately\n * no config file and no `outDir` knob (runtime/project configuration lives on\n * the `MCPServer` constructor).\n *\n * This module is PURE: it only derives path strings (no filesystem access).\n *\n * Layout (relative to the project root):\n *\n * ```text\n * .mcp-use/\n * ├─ build/ ← compiled server + manifest.json (this package)\n * ├─ generated/ ← output of the typegen escape-hatch command — reserved (VIEWS_SPEC.md)\n * ├─ cache/ ← disposable dev/build scratch\n * ├─ state/ ← mutable runtime state (e.g. tunnel.json)\n * └─ cloud/ ← cloud linkage (link.json)\n * ```\n *\n * `build/` must contain NO mutable runtime state (that is `state/`'s job) so\n * build output stays reproducible and disposable. This is the per-project\n * workspace, distinct from the global `~/.mcp-use/` store (CLI auth,\n * credentials, per-user caches).\n */\n\nimport { join } from \"node:path\";\n\n/**\n * Fixed name of the per-project workspace directory.\n *\n * @internal\n */\nexport const WORKSPACE_DIR_NAME = \".mcp-use\";\n\n/**\n * Basename of the build manifest written inside the build output directory.\n *\n * @internal\n */\nexport const BUILD_MANIFEST_NAME = \"manifest.json\";\n\n/**\n * Manifest written to `.mcp-use/build/manifest.json` by {@link runBuild} and\n * read back by `mcp-use start`.\n *\n * @internal\n */\nexport interface BuildManifest {\n /** Unique identifier for this build (random hex, regenerated per build). */\n buildId: string;\n /**\n * Filename of the emitted server entry, relative to the build directory\n * (e.g. `\"index.js\"`). `mcp-use start` imports `<build>/<entryPoint>` and\n * serves its default export.\n */\n entryPoint: string;\n /** ISO-8601 timestamp of when the build finished. */\n createdAt: string;\n /**\n * Whether the build was created with `mcp-use build --with-inspector`.\n * Consumed by `mcp-use start` to decide whether to mount the inspector shell.\n */\n inspector: boolean;\n}\n\n/**\n * Every resolved path for a project's `.mcp-use/` workspace.\n *\n * @internal\n */\nexport interface WorkspacePaths {\n /** The project root (the directory containing `.mcp-use/`). */\n projectRoot: string;\n /** The `.mcp-use/` workspace directory. */\n workspace: string;\n /** Build output directory: `.mcp-use/build`. */\n build: string;\n /**\n * Generated `.d.ts` artifacts directory — reserved for the typegen\n * escape-hatch command (VIEWS_SPEC.md § Typegen, demoted).\n */\n generated: string;\n /** Disposable dev/build scratch directory. */\n cache: string;\n /** Mutable runtime state directory. */\n state: string;\n /** Cloud linkage directory — reserved. */\n cloud: string;\n /** Build manifest: `<build>/manifest.json`. */\n buildManifest: string;\n /** Tunnel subdomain persistence: `<state>/tunnel.json`. */\n tunnel: string;\n}\n\n/**\n * Derive every workspace path for a project from its root. Pure — no\n * filesystem access.\n *\n * @param projectRoot - Absolute path to the project root.\n *\n * @example\n * ```ts\n * const paths = resolveWorkspacePaths(process.cwd());\n * console.log(paths.build); // <cwd>/.mcp-use/build\n * ```\n *\n * @internal\n */\nexport function resolveWorkspacePaths(projectRoot: string): WorkspacePaths {\n const workspace = join(projectRoot, WORKSPACE_DIR_NAME);\n const build = join(workspace, \"build\");\n return {\n projectRoot,\n workspace,\n build,\n generated: join(workspace, \"generated\"),\n cache: join(workspace, \"cache\"),\n state: join(workspace, \"state\"),\n cloud: join(workspace, \"cloud\"),\n buildManifest: join(build, BUILD_MANIFEST_NAME),\n tunnel: join(workspace, \"state\", \"tunnel.json\"),\n };\n}\n","/**\n * View discovery for `mcp-use build` / `mcp-use dev`.\n *\n * Views live under `resources/<name>/view.tsx` (VIEWS_SPEC.md § File-based views).\n */\n\nimport { existsSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ViteDevServer } from \"vite\";\n\nimport type { ViewsManifest } from \"../views/types.js\";\n\n/** Prefix for per-view virtual entry modules (`virtual:mcp-use/views/<name>`). */\nexport const VIRTUAL_VIEW_PREFIX = \"virtual:mcp-use/views/\";\n\n/** Resolved virtual id prefix (Rollup null-prefixed module id). */\nexport const VIRTUAL_VIEW_RESOLVED_PREFIX = `\\0${VIRTUAL_VIEW_PREFIX}`;\n\n/**\n * One discovered view directory.\n *\n * @internal\n */\nexport interface DiscoveredView {\n /** View directory name (the `resources/<name>` segment). */\n name: string;\n /** Absolute path to `resources/<name>/view.tsx`. */\n entryPath: string;\n}\n\n/**\n * Scan `resources/<name>/view.tsx` under the project root.\n *\n * A missing or empty `resources/` directory yields an empty list — tool-only\n * projects keep byte-identical CLI behavior.\n *\n * @param cwd - Absolute project root.\n * @returns Discovered views sorted by name.\n *\n * @internal\n */\nexport function discoverViews(cwd: string): DiscoveredView[] {\n const resourcesDir = join(cwd, \"resources\");\n if (!existsSync(resourcesDir)) {\n return [];\n }\n\n const views: DiscoveredView[] = [];\n for (const entry of readdirSync(resourcesDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue;\n }\n const entryPath = join(resourcesDir, entry.name, \"view.tsx\");\n if (existsSync(entryPath)) {\n views.push({ name: entry.name, entryPath });\n }\n }\n views.sort((a, b) => a.name.localeCompare(b.name));\n return views;\n}\n\n/**\n * Virtual module id for a view entry (`virtual:mcp-use/views/<name>`).\n *\n * @param name - View directory name.\n *\n * @internal\n */\nexport function virtualViewId(name: string): string {\n return `${VIRTUAL_VIEW_PREFIX}${name}`;\n}\n\n/**\n * Dev URL path Vite serves a resolved virtual module at (browser-loadable).\n *\n * @param name - View directory name.\n *\n * @internal\n */\nexport function devVirtualEntryPath(name: string): string {\n return `/@id/__x00__${VIRTUAL_VIEW_PREFIX}${name}`;\n}\n\n/**\n * Whether a filesystem path is a view component file or lives under a view dir.\n *\n * @internal\n */\nexport function isViewPath(file: string, cwd: string): boolean {\n const rel = file.startsWith(cwd) ? file.slice(cwd.length + 1) : file;\n return (\n /^resources\\/[^/]+\\//.test(rel) || /^resources\\/[^/]+\\/view\\.tsx$/.test(rel)\n );\n}\n\n/**\n * Whether a path is a view's `view.tsx` entry.\n *\n * @internal\n */\nexport function isViewEntryPath(file: string, cwd: string): boolean {\n const rel = file.startsWith(cwd) ? file.slice(cwd.length + 1) : file;\n return /^resources\\/[^/]+\\/view\\.tsx$/.test(rel);\n}\n\n/**\n * Build a dev-shaped views manifest (Vite URLs, `/@vite/client` script hook).\n *\n * @internal\n */\nexport function buildDevViewsManifest(views: DiscoveredView[]): ViewsManifest {\n const manifest: ViewsManifest = {};\n for (const view of views) {\n manifest[view.name] = {\n kind: \"external\",\n entry: devVirtualEntryPath(view.name),\n css: [],\n scripts: [\"/@vite/client\"],\n };\n }\n return manifest;\n}\n\n/**\n * Create a temporary Vite dev server for build-time binding validation.\n *\n * @internal\n */\nexport async function createBindingValidationServer(\n cwd: string,\n cacheDir: string,\n configFile: string | false\n): Promise<ViteDevServer> {\n const { createServer } = await import(\"vite\");\n return createServer({\n root: cwd,\n configFile,\n envFile: false,\n logLevel: \"warn\",\n cacheDir,\n server: { middlewareMode: true, hmr: false },\n ssr: { external: true },\n });\n}\n","/**\n * Vite plugin: virtual view entry modules and optional SSR wrapper entry.\n */\n\nimport type { Plugin } from \"vite\";\n\nimport type { DiscoveredView } from \"./views.js\";\nimport {\n VIRTUAL_VIEW_PREFIX,\n VIRTUAL_VIEW_RESOLVED_PREFIX,\n virtualViewId,\n} from \"./views.js\";\n\nconst VIRTUAL_TAILWIND_ID = \"virtual:mcp-use/tailwind.css\";\nconst VIRTUAL_TAILWIND_RESOLVED_ID = `\\0${VIRTUAL_TAILWIND_ID}`;\n\n/**\n * Options for {@link mcpUseViewsPlugin}.\n *\n * @internal\n */\nexport interface McpUseViewsPluginOptions {\n /** Static list or live getter (dev rediscovery). */\n getViews: () => DiscoveredView[];\n /**\n * Dev-mode entry shape. When present, every virtual entry self-accepts HMR\n * updates (`import.meta.hot.accept()`) so an update that propagates past the\n * view module re-runs the bootstrap instead of full-reloading the iframe\n * document (which would wipe bridge state). Absent for builds — entries stay\n * byte-identical to the production contract.\n */\n dev?: {\n /**\n * Whether React Fast Refresh is active (`@vitejs/plugin-react` resolved).\n * When `true`, entries import the plugin's virtual refresh preamble\n * (`@vitejs/plugin-react/preamble`) before any component module so the\n * refresh runtime hooks the document — the role `transformIndexHtml`\n * plays for Vite-served HTML, which synthesized srcdoc documents never\n * pass through.\n */\n reactRefresh: boolean;\n };\n}\n\n/**\n * Vite plugin that resolves `virtual:mcp-use/views/<name>` to bootstrap code.\n *\n * Applies only to the **client** environment.\n *\n * @internal\n */\nexport function mcpUseViewsPlugin(options: McpUseViewsPluginOptions): Plugin {\n return {\n name: \"mcp-use-views\",\n applyToEnvironment(environment) {\n return environment.name === \"client\";\n },\n resolveId(id) {\n if (id === VIRTUAL_TAILWIND_ID) {\n return VIRTUAL_TAILWIND_RESOLVED_ID;\n }\n if (!id.startsWith(VIRTUAL_VIEW_PREFIX)) {\n return undefined;\n }\n return `\\0${id}`;\n },\n load(id) {\n if (id === VIRTUAL_TAILWIND_RESOLVED_ID) {\n return `@import \"tailwindcss\";`;\n }\n if (!id.startsWith(VIRTUAL_VIEW_RESOLVED_PREFIX)) {\n return undefined;\n }\n const name = id.slice(VIRTUAL_VIEW_RESOLVED_PREFIX.length);\n const view = options.getViews().find((v) => v.name === name);\n if (view === undefined) {\n return undefined;\n }\n const lines: string[] = [];\n if (options.dev?.reactRefresh === true) {\n // Must be the first import: the preamble hooks the refresh runtime\n // into the window before react-dom (via the bootstrap import below)\n // or any refresh-wrapped view module evaluates.\n lines.push(`import \"@vitejs/plugin-react/preamble\";`);\n }\n lines.push(`import ${JSON.stringify(VIRTUAL_TAILWIND_ID)};`);\n lines.push(\n `import { bootstrapView } from \"mcp-use/react\";`,\n `import * as viewModule from ${JSON.stringify(view.entryPath)};`,\n `bootstrapView(viewModule);`\n );\n if (options.dev !== undefined) {\n lines.push(\n `if (import.meta.hot) {`,\n ` import.meta.hot.accept();`,\n `}`\n );\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n },\n };\n}\n\n/**\n * Rollup input map for a client views build (one entry per view).\n *\n * @internal\n */\nexport function clientBuildInputs(\n views: DiscoveredView[]\n): Record<string, string> {\n const input: Record<string, string> = {};\n for (const view of views) {\n input[view.name] = virtualViewId(view.name);\n }\n return input;\n}\n"],"mappings":"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","names":["existsSync","join","join","existsSync","join"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
CommandError,
|
|
3
2
|
GLOBAL_STATE_DIR,
|
|
4
3
|
UsageError,
|
|
5
4
|
confirm,
|
|
@@ -15,20 +14,12 @@ import {
|
|
|
15
14
|
// src/commands/client.ts
|
|
16
15
|
import { createHash } from "crypto";
|
|
17
16
|
import { rm } from "fs/promises";
|
|
18
|
-
import { join
|
|
17
|
+
import { join } from "path";
|
|
19
18
|
import { parseArgs } from "util";
|
|
20
19
|
|
|
21
20
|
// src/commands/load-client.ts
|
|
22
|
-
import { spawn } from "child_process";
|
|
23
|
-
import { readFileSync } from "fs";
|
|
24
|
-
import { chmod, mkdir } from "fs/promises";
|
|
25
|
-
import { dirname, join, resolve } from "path";
|
|
26
|
-
import { pathToFileURL } from "url";
|
|
27
|
-
var CLIENT_SDK_DIR = join(GLOBAL_STATE_DIR, "client-sdk");
|
|
28
|
-
var CLIENT_PACKAGE = "@mcp-use/client";
|
|
29
|
-
var DEFAULT_PEER_RANGE = "^2.0.0-alpha.0";
|
|
30
21
|
var INSTALL_HINT = [
|
|
31
|
-
|
|
22
|
+
"[mcp-use] @mcp-use/client is not installed.",
|
|
32
23
|
"The `mcp-use client` and `mcp-use screenshot` commands require it.",
|
|
33
24
|
"Install it in your project:",
|
|
34
25
|
"",
|
|
@@ -38,171 +29,29 @@ var INSTALL_HINT = [
|
|
|
38
29
|
"",
|
|
39
30
|
" bun add @mcp-use/client"
|
|
40
31
|
].join("\n");
|
|
41
|
-
async function findProjectRoot(startDir) {
|
|
42
|
-
let current = resolve(startDir);
|
|
43
|
-
for (; ; ) {
|
|
44
|
-
if (await pathExists(join(current, "package.json"))) return current;
|
|
45
|
-
const parent = dirname(current);
|
|
46
|
-
if (parent === current) return void 0;
|
|
47
|
-
current = parent;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
32
|
async function loadClientPackage() {
|
|
51
33
|
try {
|
|
52
|
-
return await
|
|
34
|
+
return await import("@mcp-use/client");
|
|
53
35
|
} catch (error) {
|
|
54
|
-
if (
|
|
55
|
-
|
|
56
|
-
try {
|
|
57
|
-
return installed.location === "sandbox" ? await importSandboxClientModule() : await importProjectClientModule(installed.projectRoot);
|
|
58
|
-
} catch (retryError) {
|
|
59
|
-
if (isClientPackageMissing(retryError)) {
|
|
60
|
-
throw new UsageError(INSTALL_HINT);
|
|
61
|
-
}
|
|
62
|
-
throw retryError;
|
|
36
|
+
if (isClientPackageMissing(error)) {
|
|
37
|
+
throw new UsageError(INSTALL_HINT);
|
|
63
38
|
}
|
|
39
|
+
throw error;
|
|
64
40
|
}
|
|
65
41
|
}
|
|
66
|
-
async function installClientPackage() {
|
|
67
|
-
const versionSpec = readClientPeerRange();
|
|
68
|
-
const dependency = `${CLIENT_PACKAGE}@${versionSpec}`;
|
|
69
|
-
const projectRoot = await findProjectRoot(process.cwd());
|
|
70
|
-
process.stderr.write(`[mcp-use] installing ${CLIENT_PACKAGE}\u2026
|
|
71
|
-
`);
|
|
72
|
-
if (projectRoot !== void 0) {
|
|
73
|
-
const [command, args] = packageManagerInstallArgs(dependency);
|
|
74
|
-
const code2 = await spawnAndWait(command, args, projectRoot);
|
|
75
|
-
if (code2 !== 0) {
|
|
76
|
-
throw new CommandError(
|
|
77
|
-
"client_install_failed",
|
|
78
|
-
`Failed to install ${CLIENT_PACKAGE}.`
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
return { location: "project", projectRoot };
|
|
82
|
-
}
|
|
83
|
-
await mkdir(CLIENT_SDK_DIR, { recursive: true, mode: 448 });
|
|
84
|
-
await chmod(CLIENT_SDK_DIR, 448);
|
|
85
|
-
const manifestPath = join(CLIENT_SDK_DIR, "package.json");
|
|
86
|
-
if (!await pathExists(manifestPath)) {
|
|
87
|
-
await writePrivateJson(manifestPath, {
|
|
88
|
-
private: true,
|
|
89
|
-
dependencies: {
|
|
90
|
-
[CLIENT_PACKAGE]: versionSpec
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
const code = await spawnAndWait(
|
|
95
|
-
"npm",
|
|
96
|
-
["install", dependency],
|
|
97
|
-
CLIENT_SDK_DIR
|
|
98
|
-
);
|
|
99
|
-
if (code !== 0) {
|
|
100
|
-
throw new CommandError(
|
|
101
|
-
"client_install_failed",
|
|
102
|
-
`Failed to install ${CLIENT_PACKAGE}.`
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
return { location: "sandbox" };
|
|
106
|
-
}
|
|
107
|
-
function packageManagerInstallArgs(dependency) {
|
|
108
|
-
const userAgent = process.env["npm_config_user_agent"] ?? "";
|
|
109
|
-
if (userAgent.startsWith("pnpm/")) {
|
|
110
|
-
return ["pnpm", ["add", dependency]];
|
|
111
|
-
}
|
|
112
|
-
if (userAgent.startsWith("bun/")) {
|
|
113
|
-
return ["bun", ["add", dependency]];
|
|
114
|
-
}
|
|
115
|
-
return ["npm", ["install", dependency]];
|
|
116
|
-
}
|
|
117
|
-
function readClientPeerRange() {
|
|
118
|
-
for (const relative of ["../package.json", "../../package.json"]) {
|
|
119
|
-
try {
|
|
120
|
-
const raw = readFileSync(new URL(relative, import.meta.url), "utf8");
|
|
121
|
-
const pkg = JSON.parse(raw);
|
|
122
|
-
if (pkg.name !== "mcp-use") continue;
|
|
123
|
-
const range = pkg.peerDependencies?.[CLIENT_PACKAGE];
|
|
124
|
-
if (typeof range === "string" && range.length > 0) return range;
|
|
125
|
-
} catch {
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return DEFAULT_PEER_RANGE;
|
|
129
|
-
}
|
|
130
|
-
async function importClientModule() {
|
|
131
|
-
return import("@mcp-use/client");
|
|
132
|
-
}
|
|
133
|
-
async function importProjectClientModule(projectRoot) {
|
|
134
|
-
const parent = pathToFileURL(join(projectRoot, "package.json")).href;
|
|
135
|
-
const resolved = await import.meta.resolve(CLIENT_PACKAGE, parent);
|
|
136
|
-
return import(resolved);
|
|
137
|
-
}
|
|
138
|
-
async function importSandboxClientModule() {
|
|
139
|
-
const entry = join(
|
|
140
|
-
CLIENT_SDK_DIR,
|
|
141
|
-
"node_modules",
|
|
142
|
-
CLIENT_PACKAGE,
|
|
143
|
-
"dist",
|
|
144
|
-
"index.js"
|
|
145
|
-
);
|
|
146
|
-
const mod = await import(pathToFileURL(entry).href);
|
|
147
|
-
return mod;
|
|
148
|
-
}
|
|
149
42
|
function isClientPackageMissing(error) {
|
|
150
43
|
if (!(error instanceof Error)) return false;
|
|
151
44
|
const code = error.code;
|
|
152
45
|
if (code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND") {
|
|
153
|
-
return error.message.includes(
|
|
46
|
+
return error.message.includes("@mcp-use/client") || error.message.includes("Cannot find package");
|
|
154
47
|
}
|
|
155
48
|
return false;
|
|
156
49
|
}
|
|
157
|
-
function spawnAndWait(command, args, cwd) {
|
|
158
|
-
return new Promise((resolveCode, reject) => {
|
|
159
|
-
const child = spawn(command, args, {
|
|
160
|
-
cwd,
|
|
161
|
-
stdio: "inherit",
|
|
162
|
-
shell: process.platform === "win32"
|
|
163
|
-
});
|
|
164
|
-
child.once("error", reject);
|
|
165
|
-
child.once("exit", (code, signal) => {
|
|
166
|
-
resolveCode(signal === "SIGINT" ? 130 : code ?? 1);
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
50
|
|
|
171
51
|
// src/commands/client.ts
|
|
172
|
-
var CLIENT_DIR =
|
|
173
|
-
var SERVERS_PATH =
|
|
174
|
-
var CLIENT_HELP = `Usage: mcp-use client <command> [options]
|
|
175
|
-
|
|
176
|
-
Commands:
|
|
177
|
-
connect <name> <url> Connect and save an HTTP(S) MCP server
|
|
178
|
-
list List saved servers
|
|
179
|
-
remove <name> Remove a saved server
|
|
180
|
-
<name> Invoke tools/resources/prompts on a saved server
|
|
181
|
-
|
|
182
|
-
Connect options:
|
|
183
|
-
-H, --header <"Key: Value"> Static header (repeatable)
|
|
184
|
-
--no-oauth Skip OAuth on authorization challenges
|
|
185
|
-
--auth-timeout <ms> OAuth wait timeout (default: 300000)
|
|
186
|
-
--protocol <auto|2026-07-28|2025-11-25>
|
|
187
|
-
--open Open the OAuth URL in a browser without prompting
|
|
188
|
-
--no-open Print the OAuth URL only
|
|
189
|
-
--json Emit machine-readable output
|
|
190
|
-
|
|
191
|
-
Saved server commands:
|
|
192
|
-
mcp-use client <name> tools list|describe|call ...
|
|
193
|
-
mcp-use client <name> resources list|read ...
|
|
194
|
-
mcp-use client <name> prompts list|get ...
|
|
195
|
-
mcp-use client <name> auth status|logout
|
|
196
|
-
|
|
197
|
-
Examples:
|
|
198
|
-
mcp-use client connect linear https://mcp.linear.app/mcp
|
|
199
|
-
mcp-use client linear tools list
|
|
200
|
-
mcp-use client linear tools call search_issues query="open bugs"`;
|
|
52
|
+
var CLIENT_DIR = join(GLOBAL_STATE_DIR, "client");
|
|
53
|
+
var SERVERS_PATH = join(CLIENT_DIR, "servers.json");
|
|
201
54
|
async function runClient(argv) {
|
|
202
|
-
if (argv.includes("--help") || argv.includes("-h")) {
|
|
203
|
-
console.log(CLIENT_HELP);
|
|
204
|
-
return 0;
|
|
205
|
-
}
|
|
206
55
|
const json = wantsJson(argv);
|
|
207
56
|
try {
|
|
208
57
|
const first = argv[0];
|
|
@@ -230,14 +79,9 @@ async function connect(argv, json) {
|
|
|
230
79
|
"no-oauth": { type: "boolean" },
|
|
231
80
|
"auth-timeout": { type: "string" },
|
|
232
81
|
protocol: { type: "string", default: "auto" },
|
|
233
|
-
open: { type: "boolean" },
|
|
234
|
-
"no-open": { type: "boolean" },
|
|
235
82
|
json: { type: "boolean" }
|
|
236
83
|
}
|
|
237
84
|
});
|
|
238
|
-
if (values.open === true && values["no-open"] === true) {
|
|
239
|
-
throw new UsageError("Cannot combine --open and --no-open.");
|
|
240
|
-
}
|
|
241
85
|
if (positionals.length !== 2) {
|
|
242
86
|
throw new UsageError("Usage: mcp-use client connect <name> <url>");
|
|
243
87
|
}
|
|
@@ -266,12 +110,7 @@ async function connect(argv, json) {
|
|
|
266
110
|
name,
|
|
267
111
|
definition,
|
|
268
112
|
credentials,
|
|
269
|
-
timeout
|
|
270
|
-
resolveBrowserMode({
|
|
271
|
-
open: values.open === true,
|
|
272
|
-
noOpen: values["no-open"] === true,
|
|
273
|
-
json
|
|
274
|
-
})
|
|
113
|
+
timeout
|
|
275
114
|
);
|
|
276
115
|
await connection.disconnect();
|
|
277
116
|
saved.servers[name] = definition;
|
|
@@ -473,25 +312,17 @@ async function callTool(connection, serverName, argv, json) {
|
|
|
473
312
|
printResult(result, json);
|
|
474
313
|
return 0;
|
|
475
314
|
}
|
|
476
|
-
async function openConnection(name, definition, credentials, authTimeoutMs
|
|
315
|
+
async function openConnection(name, definition, credentials, authTimeoutMs) {
|
|
477
316
|
const { createOAuthProvider, MCPClient } = await loadClientPackage();
|
|
478
317
|
const oauthBase = oauthDirectory(name);
|
|
479
318
|
const authProvider = definition.oauth ? await createOAuthProvider(definition.url, {
|
|
480
319
|
baseDir: oauthBase,
|
|
481
320
|
authTimeoutMs,
|
|
482
321
|
storageKeyPrefix: `mcp-use-cli:${name}`,
|
|
483
|
-
openBrowser:
|
|
322
|
+
openBrowser: (url) => {
|
|
484
323
|
process.stderr.write(`Open this URL to authenticate:
|
|
485
324
|
${url}
|
|
486
325
|
`);
|
|
487
|
-
if (browserMode === "never") return;
|
|
488
|
-
if (browserMode === "ask") {
|
|
489
|
-
const accepted = await confirm("Open in browser?", {
|
|
490
|
-
yes: false,
|
|
491
|
-
json: false
|
|
492
|
-
});
|
|
493
|
-
if (!accepted) return;
|
|
494
|
-
}
|
|
495
326
|
openBrowser(url);
|
|
496
327
|
}
|
|
497
328
|
// Conditional exports select NodeOAuthOptions at runtime. TypeScript
|
|
@@ -556,11 +387,6 @@ function parseMcpArguments(argv) {
|
|
|
556
387
|
}
|
|
557
388
|
return result;
|
|
558
389
|
}
|
|
559
|
-
function resolveBrowserMode(options) {
|
|
560
|
-
if (options.json || options.noOpen || !process.stdin.isTTY) return "never";
|
|
561
|
-
if (options.open) return "always";
|
|
562
|
-
return "ask";
|
|
563
|
-
}
|
|
564
390
|
function parseHeaders(values) {
|
|
565
391
|
const headers = {};
|
|
566
392
|
for (const value of values) {
|
|
@@ -594,17 +420,17 @@ async function readServers() {
|
|
|
594
420
|
return readJson(SERVERS_PATH, { servers: {} });
|
|
595
421
|
}
|
|
596
422
|
function credentialsDirectory(name) {
|
|
597
|
-
return
|
|
423
|
+
return join(
|
|
598
424
|
CLIENT_DIR,
|
|
599
425
|
"credentials",
|
|
600
426
|
createHash("sha256").update(name).digest("hex")
|
|
601
427
|
);
|
|
602
428
|
}
|
|
603
429
|
function credentialsPath(name) {
|
|
604
|
-
return
|
|
430
|
+
return join(credentialsDirectory(name), "credentials.json");
|
|
605
431
|
}
|
|
606
432
|
function oauthDirectory(name) {
|
|
607
|
-
return
|
|
433
|
+
return join(credentialsDirectory(name), "oauth");
|
|
608
434
|
}
|
|
609
435
|
function parseJsonOnly(argv) {
|
|
610
436
|
parseArgs({
|
|
@@ -625,4 +451,4 @@ export {
|
|
|
625
451
|
openDirectConnection,
|
|
626
452
|
parseMcpArguments
|
|
627
453
|
};
|
|
628
|
-
//# sourceMappingURL=chunk-
|
|
454
|
+
//# sourceMappingURL=chunk-RQRT27Q3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/client.ts","../src/commands/load-client.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parseArgs } from \"node:util\";\n\nimport type { MCPConnection } from \"@mcp-use/client\";\n\nimport { loadClientPackage } from \"./load-client.js\";\nimport {\n confirm,\n GLOBAL_STATE_DIR,\n openBrowser,\n pathExists,\n printResult,\n readJson,\n reportError,\n UsageError,\n wantsJson,\n writePrivateJson,\n} from \"./shared.js\";\n\ninterface SavedServer {\n url: string;\n oauth: boolean;\n protocol: \"auto\" | \"2026-07-28\" | \"2025-11-25\";\n}\n\ninterface SavedServers {\n servers: Record<string, SavedServer>;\n}\n\ninterface SavedCredentials {\n headers?: Record<string, string>;\n}\n\nconst CLIENT_DIR = join(GLOBAL_STATE_DIR, \"client\");\nconst SERVERS_PATH = join(CLIENT_DIR, \"servers.json\");\n\n/** Run the `mcp-use client` command family. */\nexport async function runClient(argv: readonly string[]): Promise<number> {\n const json = wantsJson(argv);\n try {\n const first = argv[0];\n if (first === \"connect\") return await connect(argv.slice(1), json);\n if (first === \"list\") return await list(argv.slice(1), json);\n if (first === \"remove\") return await remove(argv.slice(1), json);\n if (first === undefined) {\n throw new UsageError(\"Usage: mcp-use client <connect|list|remove|name>\");\n }\n return await savedServerCommand(first, argv.slice(1), json);\n } catch (error) {\n return reportError(\n error instanceof TypeError ? new UsageError(error.message) : error,\n json\n );\n }\n}\n\nasync function connect(\n argv: readonly string[],\n json: boolean\n): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...argv],\n allowPositionals: true,\n strict: true,\n options: {\n header: { type: \"string\", short: \"H\", multiple: true },\n \"no-oauth\": { type: \"boolean\" },\n \"auth-timeout\": { type: \"string\" },\n protocol: { type: \"string\", default: \"auto\" },\n json: { type: \"boolean\" },\n },\n });\n if (positionals.length !== 2) {\n throw new UsageError(\"Usage: mcp-use client connect <name> <url>\");\n }\n const [name, rawUrl] = positionals as [string, string];\n validateName(name);\n const url = new URL(rawUrl);\n if (![\"http:\", \"https:\"].includes(url.protocol)) {\n throw new UsageError(\"Client URLs must use http or https.\");\n }\n const protocol = parseProtocol(values.protocol);\n const timeout = parsePositiveInteger(\n values[\"auth-timeout\"] ?? \"300000\",\n \"--auth-timeout\"\n );\n const saved = await readServers();\n if (saved.servers[name] !== undefined) {\n throw new UsageError(`Saved server already exists: ${name}`);\n }\n const credentials = { headers: parseHeaders(values.header ?? []) };\n const definition: SavedServer = {\n url: url.href,\n oauth: values[\"no-oauth\"] !== true,\n protocol,\n };\n const connection = await openConnection(\n name,\n definition,\n credentials,\n timeout\n );\n await connection.disconnect();\n saved.servers[name] = definition;\n await writePrivateJson(SERVERS_PATH, saved);\n await writePrivateJson(credentialsPath(name), credentials);\n printResult(\n { name, url: definition.url, protocol },\n json,\n `Connected and saved ${name}.`\n );\n return 0;\n}\n\nasync function list(argv: readonly string[], json: boolean): Promise<number> {\n parseJsonOnly(argv);\n const saved = await readServers();\n const result = Object.entries(saved.servers).map(([name, server]) => ({\n name,\n ...server,\n }));\n printResult(\n result,\n json,\n result.map((server) => `${server.name}\\t${server.url}`).join(\"\\n\") ||\n \"No saved servers.\"\n );\n return 0;\n}\n\nasync function remove(argv: readonly string[], json: boolean): Promise<number> {\n const { values, positionals } = parseArgs({\n args: [...argv],\n allowPositionals: true,\n strict: true,\n options: { yes: { type: \"boolean\" }, json: { type: \"boolean\" } },\n });\n const name = one(positionals, \"mcp-use client remove <name>\");\n if (\n !(await confirm(`Remove saved server ${name}?`, {\n yes: values.yes === true,\n json,\n }))\n ) {\n return 0;\n }\n const saved = await readServers();\n delete saved.servers[name];\n await writePrivateJson(SERVERS_PATH, saved);\n await rm(credentialsDirectory(name), { recursive: true, force: true });\n printResult({ removed: name }, json, `Removed ${name}.`);\n return 0;\n}\n\nasync function savedServerCommand(\n name: string,\n argv: readonly string[],\n json: boolean\n): Promise<number> {\n const saved = await readServers();\n const definition = saved.servers[name];\n if (definition === undefined) {\n throw new UsageError(\n `Unknown saved server: ${name}. Run \\`mcp-use client connect ${name} <url>\\`.`\n );\n }\n const family = argv[0];\n const operation = argv[1];\n if (family === \"auth\") {\n if (operation === \"status\") {\n parseJsonOnly(argv.slice(2));\n const authenticated = await pathExists(oauthDirectory(name));\n printResult(\n { name, oauth: definition.oauth, authenticated },\n json,\n authenticated ? \"Authenticated.\" : \"No saved OAuth session.\"\n );\n return 0;\n }\n if (operation === \"logout\") {\n const { values, positionals } = parseArgs({\n args: [...argv.slice(2)],\n allowPositionals: true,\n strict: true,\n options: { yes: { type: \"boolean\" }, json: { type: \"boolean\" } },\n });\n if (positionals.length !== 0) {\n throw new UsageError(`Usage: mcp-use client ${name} auth logout`);\n }\n if (\n !(await confirm(`Delete OAuth credentials for ${name}?`, {\n yes: values.yes === true,\n json,\n }))\n ) {\n return 0;\n }\n await rm(oauthDirectory(name), { recursive: true, force: true });\n printResult({ loggedOut: name }, json, `Logged out ${name}.`);\n return 0;\n }\n }\n\n const credentials = await readJson<SavedCredentials>(\n credentialsPath(name),\n {}\n );\n const connection = await openConnection(\n name,\n definition,\n credentials,\n 300_000\n );\n try {\n if (family === \"tools\") {\n if (operation === \"list\") {\n parseJsonOnly(argv.slice(2));\n const tools = await connection.listTools();\n printResult(\n tools,\n json,\n tools\n .map((tool) => `${tool.name}\\t${tool.description ?? \"\"}`)\n .join(\"\\n\")\n );\n return 0;\n }\n if (operation === \"describe\") {\n const toolName = one(\n argv.slice(2),\n `mcp-use client ${name} tools describe <tool>`\n );\n const tool = (await connection.listTools()).find(\n (candidate) => candidate.name === toolName\n );\n if (tool === undefined)\n throw new UsageError(`Tool not found: ${toolName}`);\n printResult(tool, json);\n return 0;\n }\n if (operation === \"call\") {\n return await callTool(connection, name, argv.slice(2), json);\n }\n }\n if (family === \"resources\") {\n if (operation === \"list\") {\n parseJsonOnly(argv.slice(2));\n const resources = await connection.listResources();\n printResult(resources, json);\n return 0;\n }\n if (operation === \"read\") {\n const uri = one(\n argv.slice(2),\n `mcp-use client ${name} resources read <uri>`\n );\n printResult(await connection.readResource(uri), json);\n return 0;\n }\n }\n if (family === \"prompts\") {\n if (operation === \"list\") {\n parseJsonOnly(argv.slice(2));\n printResult(await connection.listPrompts(), json);\n return 0;\n }\n if (operation === \"get\") {\n const prompt = argv[2];\n if (prompt === undefined) {\n throw new UsageError(\n `Usage: mcp-use client ${name} prompts get <prompt> [args]`\n );\n }\n printResult(\n await connection.getPrompt(prompt, parseMcpArguments(argv.slice(3))),\n json\n );\n return 0;\n }\n }\n throw new UsageError(\n `Usage: mcp-use client ${name} <tools|resources|prompts|auth> ...`\n );\n } finally {\n await connection.disconnect();\n }\n}\n\nasync function callTool(\n connection: MCPConnection,\n serverName: string,\n argv: readonly string[],\n json: boolean\n): Promise<number> {\n const tool = argv[0];\n if (tool === undefined) {\n throw new UsageError(\n `Usage: mcp-use client ${serverName} tools call <tool> [args]`\n );\n }\n const { values, positionals } = parseArgs({\n args: [...argv.slice(1)],\n allowPositionals: true,\n strict: true,\n options: {\n timeout: { type: \"string\", default: \"30000\" },\n json: { type: \"boolean\" },\n },\n });\n const timeout = parsePositiveInteger(values.timeout, \"--timeout\");\n const result = await connection.callTool(\n tool,\n parseMcpArguments(positionals),\n { timeout }\n );\n if (result.isError === true) {\n throw new Error(\n `Tool ${tool} returned an error: ${JSON.stringify(result)}`\n );\n }\n printResult(result, json);\n return 0;\n}\n\nasync function openConnection(\n name: string,\n definition: SavedServer,\n credentials: SavedCredentials,\n authTimeoutMs: number\n): Promise<MCPConnection> {\n const { createOAuthProvider, MCPClient } = await loadClientPackage();\n const oauthBase = oauthDirectory(name);\n const authProvider = definition.oauth\n ? await createOAuthProvider(definition.url, {\n baseDir: oauthBase,\n authTimeoutMs,\n storageKeyPrefix: `mcp-use-cli:${name}`,\n openBrowser: (url: string) => {\n process.stderr.write(`Open this URL to authenticate:\\n${url}\\n`);\n openBrowser(url);\n },\n // Conditional exports select NodeOAuthOptions at runtime. TypeScript\n // resolves the package's browser-default declaration in this build.\n } as unknown as Parameters<typeof createOAuthProvider>[1])\n : undefined;\n const protocolNegotiation =\n definition.protocol === \"auto\" ? \"auto\" : { pin: definition.protocol };\n const client = new MCPClient({\n mcpServers: {\n [name]: {\n url: definition.url,\n ...(credentials.headers !== undefined\n ? { headers: credentials.headers }\n : {}),\n ...(authProvider !== undefined ? { authProvider } : { oauth: false }),\n protocolNegotiation,\n },\n },\n });\n return client.connect(name);\n}\n\n/**\n * Open a saved server for another CLI command.\n *\n * @internal\n */\nexport async function openSavedConnection(\n name: string,\n authTimeoutMs = 300_000\n): Promise<MCPConnection> {\n const saved = await readServers();\n const definition = saved.servers[name];\n if (definition === undefined) {\n throw new UsageError(`Unknown saved server: ${name}`);\n }\n const credentials = await readJson<SavedCredentials>(\n credentialsPath(name),\n {}\n );\n return openConnection(name, definition, credentials, authTimeoutMs);\n}\n\n/**\n * Open an ad-hoc HTTP MCP connection.\n *\n * @internal\n */\nexport async function openDirectConnection(\n url: string,\n headers: Record<string, string>\n): Promise<MCPConnection> {\n return openConnection(\n \"screenshot\",\n { url, oauth: false, protocol: \"auto\" },\n { headers },\n 300_000\n );\n}\n\n/**\n * Parse the CLI's JSON/key-value MCP argument grammar.\n *\n * @internal\n */\nexport function parseMcpArguments(\n argv: readonly string[]\n): Record<string, unknown> {\n if (argv.length === 0) return {};\n if (argv.length === 1 && argv[0]?.trimStart().startsWith(\"{\")) {\n const value = JSON.parse(argv[0]) as unknown;\n if (value === null || Array.isArray(value) || typeof value !== \"object\") {\n throw new UsageError(\"The JSON argument must be an object.\");\n }\n return value as Record<string, unknown>;\n }\n const result: Record<string, unknown> = {};\n for (const token of argv) {\n const typed = token.indexOf(\":=\");\n const plain = token.indexOf(\"=\");\n const separator = typed >= 0 ? typed : plain;\n const width = typed >= 0 ? 2 : 1;\n if (separator <= 0) {\n throw new UsageError(\n `Expected key=value or key:=<json>, received: ${token}`\n );\n }\n const key = token.slice(0, separator).replace(/^--/, \"\");\n const raw = token.slice(separator + width);\n result[key] = typed >= 0 ? (JSON.parse(raw) as unknown) : raw;\n }\n return result;\n}\n\nfunction parseHeaders(values: readonly string[]): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const value of values) {\n const separator = value.indexOf(\":\");\n if (separator <= 0) throw new UsageError(`Invalid header: ${value}`);\n headers[value.slice(0, separator).trim()] = value\n .slice(separator + 1)\n .trim();\n }\n return headers;\n}\n\nfunction parseProtocol(value: string | undefined): SavedServer[\"protocol\"] {\n if (value !== \"auto\" && value !== \"2026-07-28\" && value !== \"2025-11-25\") {\n throw new UsageError(`Invalid protocol: ${value}`);\n }\n return value;\n}\n\nfunction parsePositiveInteger(value: string | undefined, name: string): number {\n const result = Number(value);\n if (!Number.isInteger(result) || result <= 0) {\n throw new UsageError(`${name} must be a positive integer.`);\n }\n return result;\n}\n\nfunction validateName(name: string): void {\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(name)) {\n throw new UsageError(\n \"Server names must be 1-64 filesystem-safe letters, numbers, dots, dashes, or underscores.\"\n );\n }\n}\n\nasync function readServers(): Promise<SavedServers> {\n return readJson(SERVERS_PATH, { servers: {} });\n}\n\nfunction credentialsDirectory(name: string): string {\n return join(\n CLIENT_DIR,\n \"credentials\",\n createHash(\"sha256\").update(name).digest(\"hex\")\n );\n}\n\nfunction credentialsPath(name: string): string {\n return join(credentialsDirectory(name), \"credentials.json\");\n}\n\nfunction oauthDirectory(name: string): string {\n return join(credentialsDirectory(name), \"oauth\");\n}\n\nfunction parseJsonOnly(argv: readonly string[]): void {\n parseArgs({\n args: [...argv],\n allowPositionals: false,\n strict: true,\n options: { json: { type: \"boolean\" } },\n });\n}\n\nfunction one(positionals: readonly string[], usage: string): string {\n if (positionals.length !== 1) throw new UsageError(`Usage: ${usage}`);\n return positionals[0]!;\n}\n","import { UsageError } from \"./shared.js\";\n\n/** Runtime surface loaded from the independently published client SDK. */\nexport type ClientPackage = typeof import(\"@mcp-use/client\");\n\nconst INSTALL_HINT = [\n \"[mcp-use] @mcp-use/client is not installed.\",\n \"The `mcp-use client` and `mcp-use screenshot` commands require it.\",\n \"Install it in your project:\",\n \"\",\n \" npm install @mcp-use/client\",\n \"\",\n \" pnpm add @mcp-use/client\",\n \"\",\n \" bun add @mcp-use/client\",\n].join(\"\\n\");\n\n/**\n * Load `@mcp-use/client` on demand so the framework library entry does not\n * pull the client SDK (or legacy v1 transitive deps) into every install.\n *\n * @throws {@link UsageError} When the package is not installed, with install\n * instructions for npm, pnpm, and bun.\n */\nexport async function loadClientPackage(): Promise<ClientPackage> {\n try {\n return await import(\"@mcp-use/client\");\n } catch (error) {\n if (isClientPackageMissing(error)) {\n throw new UsageError(INSTALL_HINT);\n }\n throw error;\n }\n}\n\nfunction isClientPackageMissing(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ERR_MODULE_NOT_FOUND\" || code === \"MODULE_NOT_FOUND\") {\n return (\n error.message.includes(\"@mcp-use/client\") ||\n error.message.includes(\"Cannot find package\")\n );\n }\n return false;\n}\n"],"mappings":"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","names":[]}
|