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.
Files changed (120) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/bin/main.d.ts.map +1 -1
  3. package/dist/bin.js +2 -5
  4. package/dist/bin.js.map +1 -1
  5. package/dist/{chunk-O3CUL5VH.js → chunk-AQ2ZZM2P.js} +18 -68
  6. package/dist/chunk-AQ2ZZM2P.js.map +1 -0
  7. package/dist/{chunk-RHITI5QM.js → chunk-RQRT27Q3.js} +16 -190
  8. package/dist/chunk-RQRT27Q3.js.map +1 -0
  9. package/dist/{chunk-QUUANIE4.js → chunk-SFI2T6TE.js} +80 -34
  10. package/dist/chunk-SFI2T6TE.js.map +1 -0
  11. package/dist/chunk-VV2P4ZFZ.js +187 -0
  12. package/dist/chunk-VV2P4ZFZ.js.map +1 -0
  13. package/dist/cli/build.d.ts +1 -1
  14. package/dist/cli/build.d.ts.map +1 -1
  15. package/dist/cli/dev.d.ts.map +1 -1
  16. package/dist/cli/port.d.ts.map +1 -1
  17. package/dist/cli/tunnel.d.ts.map +1 -1
  18. package/dist/cli/views-plugin.d.ts.map +1 -1
  19. package/dist/cli/views.d.ts +5 -7
  20. package/dist/cli/views.d.ts.map +1 -1
  21. package/dist/commands/build.js +13 -28
  22. package/dist/commands/build.js.map +1 -1
  23. package/dist/commands/client.d.ts.map +1 -1
  24. package/dist/commands/client.js +1 -1
  25. package/dist/commands/dev.js +14 -109
  26. package/dist/commands/dev.js.map +1 -1
  27. package/dist/commands/load-client.d.ts +2 -9
  28. package/dist/commands/load-client.d.ts.map +1 -1
  29. package/dist/commands/screenshot.js +1 -1
  30. package/dist/completable.d.ts +0 -9
  31. package/dist/completable.d.ts.map +1 -1
  32. package/dist/config.d.ts +4 -125
  33. package/dist/config.d.ts.map +1 -1
  34. package/dist/fetch-app.d.ts +0 -43
  35. package/dist/fetch-app.d.ts.map +1 -1
  36. package/dist/index.d.ts +5 -20
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +125 -1148
  39. package/dist/index.js.map +1 -1
  40. package/dist/inspector-shell.d.ts +4 -17
  41. package/dist/inspector-shell.d.ts.map +1 -1
  42. package/dist/mount-mcp.d.ts +4 -0
  43. package/dist/mount-mcp.d.ts.map +1 -1
  44. package/dist/oauth/index.js +1 -2
  45. package/dist/{chunk-SMN75YED.js → public-route-7IK5D7V7.js} +10 -16
  46. package/dist/public-route-7IK5D7V7.js.map +1 -0
  47. package/dist/react/components/theme-provider.d.ts +0 -3
  48. package/dist/react/components/theme-provider.d.ts.map +1 -1
  49. package/dist/react/hooks/use-host-context.d.ts +0 -5
  50. package/dist/react/hooks/use-host-context.d.ts.map +1 -1
  51. package/dist/react/index.d.ts +0 -2
  52. package/dist/react/index.d.ts.map +1 -1
  53. package/dist/react/index.js +3 -124
  54. package/dist/react/index.js.map +1 -1
  55. package/dist/react/runtime/view-runtime.d.ts +0 -23
  56. package/dist/react/runtime/view-runtime.d.ts.map +1 -1
  57. package/dist/react/types/register.d.ts +1 -1
  58. package/dist/react/types/register.d.ts.map +1 -1
  59. package/dist/resources.d.ts +4 -59
  60. package/dist/resources.d.ts.map +1 -1
  61. package/dist/server.d.ts +5 -118
  62. package/dist/server.d.ts.map +1 -1
  63. package/dist/tools.d.ts +1 -12
  64. package/dist/tools.d.ts.map +1 -1
  65. package/dist/views/document.d.ts.map +1 -1
  66. package/dist/views/public-route.d.ts +3 -9
  67. package/dist/views/public-route.d.ts.map +1 -1
  68. package/dist/views/routes.d.ts +1 -5
  69. package/dist/views/routes.d.ts.map +1 -1
  70. package/dist/views/wire.d.ts +3 -7
  71. package/dist/views/wire.d.ts.map +1 -1
  72. package/package.json +9 -17
  73. package/dist/branding.d.ts +0 -82
  74. package/dist/branding.d.ts.map +0 -1
  75. package/dist/chunk-FC2Z2VFO.js +0 -99
  76. package/dist/chunk-FC2Z2VFO.js.map +0 -1
  77. package/dist/chunk-KIZ72TIK.js +0 -38
  78. package/dist/chunk-KIZ72TIK.js.map +0 -1
  79. package/dist/chunk-O3CUL5VH.js.map +0 -1
  80. package/dist/chunk-QUUANIE4.js.map +0 -1
  81. package/dist/chunk-RHITI5QM.js.map +0 -1
  82. package/dist/chunk-SMN75YED.js.map +0 -1
  83. package/dist/chunk-XUI7QE2D.js +0 -98
  84. package/dist/chunk-XUI7QE2D.js.map +0 -1
  85. package/dist/chunk-Z326HADF.js +0 -82
  86. package/dist/chunk-Z326HADF.js.map +0 -1
  87. package/dist/chunk-ZJJD33SF.js +0 -741
  88. package/dist/chunk-ZJJD33SF.js.map +0 -1
  89. package/dist/cli/mcp-env-declaration.d.ts +0 -20
  90. package/dist/cli/mcp-env-declaration.d.ts.map +0 -1
  91. package/dist/internal/resource-completion.js +0 -7
  92. package/dist/internal/resource-completion.js.map +0 -1
  93. package/dist/landing-handler-WE66NIGB.js +0 -37
  94. package/dist/landing-handler-WE66NIGB.js.map +0 -1
  95. package/dist/landing-handler.d.ts +0 -24
  96. package/dist/landing-handler.d.ts.map +0 -1
  97. package/dist/landing.d.ts +0 -67
  98. package/dist/landing.d.ts.map +0 -1
  99. package/dist/landing.js +0 -7
  100. package/dist/landing.js.map +0 -1
  101. package/dist/middleware/cors.d.ts +0 -11
  102. package/dist/middleware/cors.d.ts.map +0 -1
  103. package/dist/middleware/mcp-middleware.d.ts +0 -175
  104. package/dist/middleware/mcp-middleware.d.ts.map +0 -1
  105. package/dist/oauth/better-auth.d.ts +0 -29
  106. package/dist/oauth/better-auth.d.ts.map +0 -1
  107. package/dist/oauth/better-auth.js +0 -76
  108. package/dist/oauth/better-auth.js.map +0 -1
  109. package/dist/proxy-DJYWGTGX.js +0 -282
  110. package/dist/proxy-DJYWGTGX.js.map +0 -1
  111. package/dist/proxy.d.ts +0 -153
  112. package/dist/proxy.d.ts.map +0 -1
  113. package/dist/public-route-5JEGFEIN.js +0 -9
  114. package/dist/public-route-5JEGFEIN.js.map +0 -1
  115. package/dist/react/hooks/use-files.d.ts +0 -25
  116. package/dist/react/hooks/use-files.d.ts.map +0 -1
  117. package/dist/react/types/file-types.d.ts +0 -16
  118. package/dist/react/types/file-types.d.ts.map +0 -1
  119. package/dist/resource-completion.d.ts +0 -12
  120. package/dist/resource-completion.d.ts.map +0 -1
@@ -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,CA6EnE"}
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
- const command2 = argv[0];
43
- if (command2 === void 0 || command2 === "--help" || command2 === "-h") {
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":"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","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 join4 } from "path";
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 = join4(projectRoot, WORKSPACE_DIR_NAME);
101
- const build = join4(workspace, "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: join4(workspace, "generated"),
107
- cache: join4(workspace, "cache"),
108
- state: join4(workspace, "state"),
109
- cloud: join4(workspace, "cloud"),
110
- buildManifest: join4(build, BUILD_MANIFEST_NAME),
111
- tunnel: join4(workspace, "state", "tunnel.json")
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 join5 } from "path";
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 viewsDir = join5(cwd, VIEWS_SOURCE_DIR);
123
- if (!existsSync3(viewsDir)) {
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(viewsDir, { withFileTypes: true })) {
81
+ for (const entry of readdirSync(resourcesDir, { withFileTypes: true })) {
128
82
  if (!entry.isDirectory()) {
129
83
  continue;
130
84
  }
131
- const entryPath = join5(viewsDir, entry.name, "view.tsx");
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 /^views\/[^/]+\//.test(rel) || /^views\/[^/]+\/view\.tsx$/.test(rel);
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
- envDir: false,
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-O3CUL5VH.js.map
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 as join2 } from "path";
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
- `[mcp-use] ${CLIENT_PACKAGE} is not installed.`,
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 importClientModule();
34
+ return await import("@mcp-use/client");
53
35
  } catch (error) {
54
- if (!isClientPackageMissing(error)) throw error;
55
- const installed = await installClientPackage();
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(CLIENT_PACKAGE) || error.message.includes("Cannot find package");
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 = join2(GLOBAL_STATE_DIR, "client");
173
- var SERVERS_PATH = join2(CLIENT_DIR, "servers.json");
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, browserMode = process.stdin.isTTY ? "ask" : "never") {
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: async (url) => {
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 join2(
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 join2(credentialsDirectory(name), "credentials.json");
430
+ return join(credentialsDirectory(name), "credentials.json");
605
431
  }
606
432
  function oauthDirectory(name) {
607
- return join2(credentialsDirectory(name), "oauth");
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-RHITI5QM.js.map
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":[]}