@mcp-use/cli 3.2.1-canary.1 → 3.2.1-canary.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.9_tsx@4.21.0_typescript@5.9.3_yaml@2.8.3/node_modules/tsup/assets/cjs_shims.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/utilities.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/index.js","../src/index.ts","../../../node_modules/.pnpm/open@11.0.0/node_modules/open/index.js","../../../node_modules/.pnpm/wsl-utils@0.3.1/node_modules/wsl-utils/index.js","../../../node_modules/.pnpm/is-wsl@3.1.0/node_modules/is-wsl/index.js","../../../node_modules/.pnpm/is-inside-container@1.0.0/node_modules/is-inside-container/index.js","../../../node_modules/.pnpm/is-docker@3.0.0/node_modules/is-docker/index.js","../../../node_modules/.pnpm/powershell-utils@0.1.0/node_modules/powershell-utils/index.js","../../../node_modules/.pnpm/wsl-utils@0.3.1/node_modules/wsl-utils/utilities.js","../../../node_modules/.pnpm/define-lazy-prop@3.0.0/node_modules/define-lazy-prop/index.js","../../../node_modules/.pnpm/default-browser@5.5.0/node_modules/default-browser/index.js","../../../node_modules/.pnpm/default-browser-id@5.0.1/node_modules/default-browser-id/index.js","../../../node_modules/.pnpm/run-applescript@7.1.0/node_modules/run-applescript/index.js","../../../node_modules/.pnpm/bundle-name@4.1.0/node_modules/bundle-name/index.js","../../../node_modules/.pnpm/default-browser@5.5.0/node_modules/default-browser/windows.js","../../../node_modules/.pnpm/is-in-ssh@1.0.0/node_modules/is-in-ssh/index.js","../src/utils/config.ts","../src/utils/api.ts","../src/utils/errors.ts","../src/commands/auth.ts","../src/commands/client.ts","../src/utils/format.ts","../src/utils/parse-args.ts","../src/utils/oauth.ts","../src/utils/session-storage.ts","../src/utils/session.ts","../src/commands/client-auth.ts","../src/commands/screenshot.ts","../src/utils/cdp-screenshot.ts","../src/utils/chrome-path.ts","../src/commands/deploy.ts","../src/utils/git.ts","../src/utils/cloud-urls.ts","../src/utils/project-link.ts","../src/commands/deployments.ts","../src/commands/servers.ts","../src/commands/env.ts","../src/commands/org.ts","../src/commands/skills.ts","../src/utils/next-shims.ts","../src/utils/update-check.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","#!/usr/bin/env node\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport \"dotenv/config\";\nimport { spawn } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport open from \"open\";\nimport { viteSingleFile } from \"vite-plugin-singlefile\";\nimport { toJSONSchema } from \"zod\";\nimport { loginCommand, logoutCommand, whoamiCommand } from \"./commands/auth.js\";\nimport {\n PER_CLIENT_SCOPES,\n RESERVED_CLIENT_SUBCOMMANDS,\n createClientCommand,\n createPerClientCommand,\n} from \"./commands/client.js\";\nimport { getSession } from \"./utils/session-storage.js\";\nimport { formatError } from \"./utils/format.js\";\nimport { deployCommand } from \"./commands/deploy.js\";\nimport { createDeploymentsCommand } from \"./commands/deployments.js\";\nimport { createServersCommand } from \"./commands/servers.js\";\nimport {\n orgCurrentCommand,\n orgListCommand,\n orgSwitchCommand,\n} from \"./commands/org.js\";\nimport { createSkillsCommand } from \"./commands/skills.js\";\nimport {\n detectNextJsProject,\n loadNextJsEnvFiles,\n registerNextShimsInProcess,\n withNextShimsEnv,\n} from \"./utils/next-shims.js\";\nimport { notifyIfUpdateAvailable } from \"./utils/update-check.js\";\nconst program = new Command();\n\nconst packageContent = readFileSync(\n path.join(__dirname, \"../package.json\"),\n \"utf-8\"\n);\nconst packageJson = JSON.parse(packageContent);\nconst packageVersion = packageJson.version || \"unknown\";\n\nprogram\n .name(\"mcp-use\")\n .description(\"Create and run MCP servers with ui resources widgets\")\n .version(packageVersion)\n .showHelpAfterError(\"(Run `mcp-use --help` to see available commands)\");\n\n/**\n * Helper to display all package versions\n *\n * @param projectPath - Optional path to user's project directory.\n * When provided, resolves packages from the project's node_modules (standalone installation).\n * When omitted, falls back to relative paths (monorepo development).\n */\nfunction displayPackageVersions(projectPath?: string) {\n const packages = [\n { name: \"@mcp-use/cli\", relativePath: \"../package.json\" },\n {\n name: \"@mcp-use/inspector\",\n relativePath: \"../../inspector/package.json\",\n },\n {\n name: \"create-mcp-use-app\",\n relativePath: \"../../create-mcp-use-app/package.json\",\n },\n {\n name: \"mcp-use\",\n relativePath: \"../../mcp-use/package.json\",\n highlight: true,\n },\n ];\n\n console.log(chalk.gray(\"mcp-use packages:\"));\n\n for (const pkg of packages) {\n const paddedName = pkg.name.padEnd(22);\n\n try {\n let pkgPath: string;\n\n if (projectPath) {\n // Standalone installation: Try to resolve from user's project node_modules\n try {\n const projectRequire = createRequire(\n path.join(projectPath, \"package.json\")\n );\n pkgPath = projectRequire.resolve(`${pkg.name}/package.json`);\n } catch (resolveError) {\n // Package not found in project node_modules, try relative path as fallback\n pkgPath = path.join(__dirname, pkg.relativePath);\n }\n } else {\n // Monorepo development: Use relative paths\n pkgPath = path.join(__dirname, pkg.relativePath);\n }\n\n const pkgContent = readFileSync(pkgPath, \"utf-8\");\n const pkgJson = JSON.parse(pkgContent);\n const version = pkgJson.version || \"unknown\";\n\n if (pkg.highlight) {\n console.log(\n ` ${chalk.cyan.bold(paddedName)} ${chalk.cyan.bold(`v${version}`)}`\n );\n } else {\n console.log(chalk.gray(` ${paddedName} v${version}`));\n }\n } catch (error) {\n // Log debug message when package is not found (aids troubleshooting)\n if (process.env.DEBUG || process.env.VERBOSE) {\n console.log(chalk.dim(` ${paddedName} (not found)`));\n }\n }\n }\n}\n\n// Helper to check if port is available\nasync function isPortAvailable(\n port: number,\n host: string = \"localhost\"\n): Promise<boolean> {\n try {\n await fetch(`http://${host}:${port}`);\n return false; // Port is in use\n } catch {\n return true; // Port is available\n }\n}\n\n// Helper to find an available port\nasync function findAvailablePort(\n startPort: number,\n host: string = \"localhost\"\n): Promise<number> {\n for (let port = startPort; port < startPort + 100; port++) {\n if (await isPortAvailable(port, host)) {\n return port;\n }\n }\n throw new Error(\"No available ports found\");\n}\n\n// Helper to check if server is ready\nasync function waitForServer(\n port: number,\n host: string = \"localhost\",\n maxAttempts = 30\n): Promise<boolean> {\n for (let i = 0; i < maxAttempts; i++) {\n const controller = new AbortController();\n try {\n // Use /inspector/health endpoint for cleaner health checks\n // This avoids 400 errors from the MCP endpoint which requires session headers\n const response = await fetch(`http://${host}:${port}/inspector/health`, {\n signal: controller.signal,\n });\n\n if (response.ok) {\n return true;\n }\n } catch {\n // Server not ready yet\n } finally {\n controller.abort();\n }\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n return false;\n}\n\n// Helper to normalize host for browser connections\n// 0.0.0.0 is valid for server binding but browsers cannot connect to it\nfunction normalizeBrowserHost(host: string): string {\n return host === \"0.0.0.0\" ? \"localhost\" : host;\n}\n\n// Helper to run a command\nfunction runCommand(\n command: string,\n args: string[],\n cwd: string,\n env?: NodeJS.ProcessEnv,\n filterStderr: boolean = false\n): { promise: Promise<void>; process: any } {\n const proc = spawn(command, args, {\n cwd,\n stdio: filterStderr ? ([\"inherit\", \"inherit\", \"pipe\"] as const) : \"inherit\",\n shell: process.platform === \"win32\",\n env: env ? { ...process.env, ...env } : process.env,\n });\n\n // Filter stderr to suppress tsx's \"Force killing\" messages\n if (filterStderr && proc.stderr) {\n proc.stderr.on(\"data\", (data: Buffer) => {\n const text = data.toString();\n // Filter out tsx's force killing message\n if (\n !text.includes(\"Previous process hasn't exited yet\") &&\n !text.includes(\"Force killing\")\n ) {\n process.stderr.write(data);\n }\n });\n }\n\n const promise = new Promise<void>((resolve, reject) => {\n proc.on(\"error\", reject);\n proc.on(\"exit\", (code: number | null) => {\n if (code === 0 || code === 130 || code === 143) {\n // Exit codes: 0 = normal, 130 = SIGINT/SIGTERM, 143 = SIGTERM (alternative)\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n });\n\n return { promise, process: proc };\n}\n\n// Helper to start tunnel and get the URL\nasync function startTunnel(\n port: number,\n subdomain?: string\n): Promise<{ url: string; subdomain: string; process: any }> {\n return new Promise((resolve, reject) => {\n console.log(chalk.gray(`Starting tunnel for port ${port}...`));\n\n const tunnelArgs = [\"--yes\", \"@mcp-use/tunnel\", String(port)];\n\n // Pass subdomain as CLI flag if provided\n if (subdomain) {\n tunnelArgs.push(\"--subdomain\", subdomain);\n }\n\n const proc = spawn(\"npx\", tunnelArgs, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: process.platform === \"win32\",\n });\n\n let resolved = false;\n let isShuttingDown = false;\n\n proc.stdout?.on(\"data\", (data) => {\n const text = data.toString();\n const isShutdownMessage =\n text.includes(\"Shutting down\") || text.includes(\"🛑\");\n const isErrorMessage = text.includes(\"✖\") || text.includes(\"Error:\");\n\n if (!isShuttingDown && !isShutdownMessage && !isErrorMessage) {\n process.stdout.write(text);\n }\n\n // Look for the tunnel URL in the output\n // Expected format: https://subdomain.tunnel-domain.com\n const urlMatch = text.match(/https?:\\/\\/([a-z0-9-]+\\.[a-z0-9.-]+)/i);\n if (urlMatch && !resolved) {\n const url = urlMatch[0];\n // Extract subdomain from URL (e.g., \"happy-cat.local.mcp-use.run\" -> \"happy-cat\")\n const fullDomain = urlMatch[1];\n // Try to extract the subdomain using a case-insensitive regex.\n // If the regex fails, fallback to splitting by '.' and taking the first label.\n // Validate that the extracted subdomain matches the expected format (letters, numbers, hyphens).\n const subdomainMatch = fullDomain.match(/^([a-z0-9-]+)\\./i);\n let extractedSubdomain = subdomainMatch\n ? subdomainMatch[1]\n : fullDomain.split(\".\")[0];\n if (!/^[a-z0-9-]+$/i.test(extractedSubdomain)) {\n console.warn(\n chalk.yellow(\n `Warning: Extracted subdomain \"${extractedSubdomain}\" does not match expected format.`\n )\n );\n extractedSubdomain = \"\";\n }\n resolved = true;\n clearTimeout(setupTimeout);\n console.log(chalk.green.bold(`✓ Tunnel established: ${url}/mcp`));\n resolve({ url, subdomain: extractedSubdomain, process: proc });\n }\n });\n\n proc.stderr?.on(\"data\", (data) => {\n const text = data.toString();\n // Filter out bore debug logs and shutdown messages\n if (\n !isShuttingDown &&\n !text.includes(\"INFO\") &&\n !text.includes(\"bore_cli\") &&\n !text.includes(\"Shutting down\")\n ) {\n process.stderr.write(data);\n }\n });\n\n proc.on(\"error\", (error) => {\n if (!resolved) {\n clearTimeout(setupTimeout);\n reject(new Error(`Failed to start tunnel: ${error.message}`));\n }\n });\n\n proc.on(\"exit\", (code) => {\n if (code !== 0 && !resolved) {\n clearTimeout(setupTimeout);\n reject(new Error(`Tunnel process exited with code ${code}`));\n }\n });\n\n // Add method to mark shutdown state\n (proc as any).markShutdown = () => {\n isShuttingDown = true;\n };\n\n // Timeout after 30 seconds - only for initial setup\n const setupTimeout = setTimeout(() => {\n if (!resolved) {\n proc.kill();\n reject(new Error(\"Tunnel setup timed out\"));\n }\n }, 30000);\n });\n}\n\n/**\n * Resolve the entry file for an MCP server.\n * Priority: --entry flag > <mcpDir>/{index,server}.{ts,tsx} > top-level defaults.\n */\nasync function resolveEntryFile(\n projectPath: string,\n cliEntry?: string,\n mcpDir?: string\n): Promise<string> {\n if (cliEntry) {\n await access(path.join(projectPath, cliEntry)).catch(() => {\n throw new Error(`File not found: ${cliEntry}`);\n });\n return cliEntry;\n }\n\n if (mcpDir) {\n const mcpCandidates = [\n path.join(mcpDir, \"index.ts\"),\n path.join(mcpDir, \"index.tsx\"),\n path.join(mcpDir, \"server.ts\"),\n path.join(mcpDir, \"server.tsx\"),\n ];\n for (const candidate of mcpCandidates) {\n try {\n await access(path.join(projectPath, candidate));\n return candidate;\n } catch {\n continue;\n }\n }\n throw new Error(\n `No entry file found inside ${mcpDir}.\\n\\n` +\n `Expected one of: ${mcpCandidates.map((c) => path.relative(projectPath, path.join(projectPath, c))).join(\", \")}\\n\\n` +\n `Fix this by either:\\n` +\n ` 1. Creating ${path.join(mcpDir, \"index.ts\")}, or\\n` +\n ` 2. Passing --entry <file> on the command line`\n );\n }\n\n const candidates = [\"index.ts\", \"src/index.ts\", \"server.ts\", \"src/server.ts\"];\n for (const candidate of candidates) {\n try {\n await access(path.join(projectPath, candidate));\n return candidate;\n } catch {\n continue;\n }\n }\n\n throw new Error(\n `No entry file found.\\n\\n` +\n `Expected one of: ${candidates.join(\", \")}\\n\\n` +\n `Fix this by either:\\n` +\n ` 1. Creating one of the default entry files above, or\\n` +\n ` 2. Passing --entry <file> or --mcp-dir <dir> on the command line`\n );\n}\n\n/**\n * Resolve the widgets directory.\n * Priority: --widgets-dir flag > <mcpDir>/resources > \"resources\".\n */\nfunction resolveWidgetsDir(cliWidgetsDir?: string, mcpDir?: string): string {\n if (cliWidgetsDir) return cliWidgetsDir;\n if (mcpDir) return path.join(mcpDir, \"resources\");\n return \"resources\";\n}\n\n/**\n * Vite plugin that fails the widget build with a clear, actionable error when\n * a widget transitively imports a Next.js server-runtime module.\n *\n * The MCP server process silently shims these specifiers (see\n * src/shims/next-shims-*) because server-side code is supposed to work\n * there. Widgets run in a browser iframe, so the same import is almost\n * always a mistake — fetch server data through a tool call instead.\n *\n * Keep the rejection list aligned with src/shims/next-shims-registry.json;\n * we duplicate the array here (rather than reading the JSON) so this file\n * stays import-free for the source-mode tests that load it via tsx.\n */\nfunction makeWidgetServerOnlyGuard(widgetName: string) {\n const rejected = new Set([\n \"server-only\",\n \"client-only\",\n \"next/cache\",\n \"next/headers\",\n \"next/navigation\",\n \"next/server\",\n ]);\n return {\n name: \"mcp-use-widget-server-only-guard\",\n enforce: \"pre\" as const,\n resolveId(id: string, importer: string | undefined) {\n if (!rejected.has(id)) return null;\n const from = importer ? ` (imported from ${importer})` : \"\";\n throw new Error(\n `Widget \"${widgetName}\" imports \"${id}\"${from}, which is a Next.js ` +\n `server-only module. Widgets run in a browser iframe and cannot ` +\n `use server APIs.\\n\\n` +\n `To fix:\\n` +\n ` • Remove the import from the widget (or from any module the ` +\n `widget transitively imports)\\n` +\n ` • If the widget needs data from ${id}, read it inside an MCP ` +\n `tool in your server and pass the result through the widget's ` +\n `props`\n );\n },\n };\n}\n\nasync function findServerFile(\n projectPath: string,\n cliEntry?: string,\n cliMcpDir?: string\n): Promise<string> {\n return resolveEntryFile(projectPath, cliEntry, cliMcpDir);\n}\n\nfunction isBunRuntime(): boolean {\n return (\n typeof (globalThis as any).Bun !== \"undefined\" ||\n typeof (process.versions as any).bun === \"string\"\n );\n}\n\nasync function generateToolRegistryTypesForServer(\n projectPath: string,\n serverFileRelative: string\n): Promise<\"ok\" | \"failed\" | \"skipped\"> {\n const serverFile = path.join(projectPath, serverFileRelative);\n const serverFileExists = await access(serverFile)\n .then(() => true)\n .catch(() => false);\n\n if (!serverFileExists) {\n throw new Error(`Server file not found: ${serverFile}`);\n }\n\n // `tsx/esm/api` uses Node's custom loader hooks, which bun doesn't\n // implement. Under bun we can't generate the registry types at build\n // time; skip with a clear note so the build continues.\n if (isBunRuntime()) {\n console.log(\n chalk.yellow(\n \"⚠ Skipping tool registry type generation under bun runtime (requires Node.js loader hooks).\"\n )\n );\n console.log(\n chalk.gray(\n \" Run `mcp-use generate-types` with node to refresh .mcp-use/tool-registry.d.ts.\"\n )\n );\n return \"skipped\";\n }\n\n const previousHmrMode = (globalThis as any).__mcpUseHmrMode;\n\n try {\n // Prevent server startup side effects while importing registrations.\n (globalThis as any).__mcpUseHmrMode = true;\n (globalThis as any).__mcpUseLastServer = undefined;\n\n // Detect Next.js projects and install the server-runtime shim loaders\n // BEFORE tsx registers — otherwise transitive imports of `server-only`,\n // `next/cache`, etc. from the user entry throw during module evaluation.\n if (await detectNextJsProject(projectPath)) {\n await loadNextJsEnvFiles(projectPath);\n await registerNextShimsInProcess();\n }\n\n // Register tsx's loader hooks namespace-less + globally. We deliberately\n // do NOT use `tsImport` here: tsImport wraps tsx in a generated\n // namespace, and tsx's resolver bails via `return nextResolve(...)` for\n // any specifier whose parent URL doesn't carry that namespace — which\n // means transitive `@/lib/...` imports from the user entry never reach\n // tsx's tsconfig-paths resolver and fail with\n // `Cannot find package '@/lib'`. Namespace-less registration makes\n // tsx's resolver run uniformly on every specifier.\n //\n // Paired with tsx/cjs/api.register() because tsx compiles `.ts` to CJS\n // by default in non-`\"type\": \"module\"` packages (i.e. every Next.js\n // app), and the resulting `require()` chain needs the same tsconfig-\n // paths treatment applied on the CJS side.\n const projectTsconfigPath = path.join(projectPath, \"tsconfig.json\");\n const hasTsconfig = await access(projectTsconfigPath)\n .then(() => true)\n .catch(() => false);\n if (hasTsconfig) {\n process.env.TSX_TSCONFIG_PATH = projectTsconfigPath;\n }\n const previousCwd = process.cwd();\n if (previousCwd !== projectPath) process.chdir(projectPath);\n\n try {\n const projectRequire = createRequire(\n path.join(projectPath, \"package.json\")\n );\n\n // ESM side\n const tsxEsmApiPath = projectRequire.resolve(\"tsx/esm/api\");\n const tsxEsmApi = await import(pathToFileURL(tsxEsmApiPath).href);\n if (typeof tsxEsmApi.register === \"function\") {\n tsxEsmApi.register({\n tsconfig: hasTsconfig ? projectTsconfigPath : undefined,\n });\n }\n\n // CJS side (optional — tsx 4.x ships both entry points)\n try {\n const tsxCjsApiPath = projectRequire.resolve(\"tsx/cjs/api\");\n const tsxCjsApi = await import(pathToFileURL(tsxCjsApiPath).href);\n if (typeof tsxCjsApi.register === \"function\") {\n tsxCjsApi.register();\n }\n } catch {\n // tsx/cjs unavailable on this tsx version — ESM-only mode is fine\n // for projects that compile to ESM.\n }\n\n // Native dynamic import with a cache-buster. With tsx registered\n // globally and without a namespace, the whole dependency tree (user\n // entry + transitive `@/lib/...` imports + `mcp-use/server`) resolves\n // through tsx's tsconfig-aware resolver.\n await import(`${pathToFileURL(serverFile).href}?t=${Date.now()}`);\n } finally {\n if (process.cwd() !== previousCwd) process.chdir(previousCwd);\n }\n\n const server = (globalThis as any).__mcpUseLastServer;\n if (!server) {\n throw new Error(\n \"No MCPServer instance found. Make sure your server file creates an MCPServer instance.\"\n );\n }\n\n const mcpUsePath = path.join(projectPath, \"node_modules\", \"mcp-use\");\n const { generateToolRegistryTypes } = await import(\n pathToFileURL(path.join(mcpUsePath, \"dist\", \"src\", \"server\", \"index.js\"))\n .href\n ).then((mod) => mod);\n\n if (!generateToolRegistryTypes) {\n throw new Error(\"generateToolRegistryTypes not found in mcp-use package\");\n }\n\n const success = await generateToolRegistryTypes(\n server.registrations.tools,\n projectPath\n );\n return success ? \"ok\" : \"failed\";\n } finally {\n (globalThis as any).__mcpUseHmrMode = previousHmrMode ?? false;\n }\n}\n\nasync function buildWidgets(\n projectPath: string,\n options: {\n inline?: boolean;\n widgetsDir?: string;\n } = {}\n): Promise<Array<{ name: string; metadata: any }>> {\n const { inline = true } = options; // Default to true for VS Code compatibility\n const { promises: fs } = await import(\"node:fs\");\n const { build } = await import(\"vite\");\n\n // Resolve the widgets directory. Callers pass a relative path via\n // `widgetsDir` (from config / --widgets-dir / --mcp-dir); default is \"resources\".\n const widgetsDirRelative = options.widgetsDir ?? \"resources\";\n const resourcesDir = path.resolve(projectPath, widgetsDirRelative);\n\n // Get base URL from environment or use default\n const mcpUrl = process.env.MCP_URL;\n\n // Check if resources directory exists\n try {\n await access(resourcesDir);\n } catch {\n console.log(\n chalk.gray(\n `No ${widgetsDirRelative}/ directory found - skipping widget build`\n )\n );\n return [];\n }\n\n // Find all TSX widget files and folders with widget.tsx\n const entries: Array<{ name: string; path: string }> = [];\n try {\n const files = await fs.readdir(resourcesDir, { withFileTypes: true });\n for (const dirent of files) {\n // Exclude macOS resource fork files and other hidden/system files\n if (dirent.name.startsWith(\"._\") || dirent.name.startsWith(\".DS_Store\")) {\n continue;\n }\n\n if (\n dirent.isFile() &&\n (dirent.name.endsWith(\".tsx\") || dirent.name.endsWith(\".ts\"))\n ) {\n // Single file widget\n entries.push({\n name: dirent.name.replace(/\\.tsx?$/, \"\"),\n path: path.join(resourcesDir, dirent.name),\n });\n } else if (dirent.isDirectory()) {\n // Check for widget.tsx in folder\n const widgetPath = path.join(resourcesDir, dirent.name, \"widget.tsx\");\n try {\n await fs.access(widgetPath);\n entries.push({\n name: dirent.name,\n path: widgetPath,\n });\n } catch {\n // widget.tsx doesn't exist in this folder, skip it\n }\n }\n }\n } catch (error) {\n console.log(\n chalk.gray(`No widgets found in ${widgetsDirRelative}/ directory`)\n );\n return [];\n }\n\n if (entries.length === 0) {\n console.log(\n chalk.gray(`No widgets found in ${widgetsDirRelative}/ directory`)\n );\n return [];\n }\n\n console.log(\n chalk.gray(\n `Building ${entries.length} widget(s)${inline ? \" (inline mode for VS Code compatibility)\" : \"\"}...`\n )\n );\n\n const react = (await import(\"@vitejs/plugin-react\")).default;\n // @ts-ignore - @tailwindcss/vite may not have type declarations\n const tailwindcss = (await import(\"@tailwindcss/vite\")).default;\n\n // Check whether the project has a tsconfig.json. When present, we enable\n // Vite's native `resolve.tsconfigPaths` so widgets that `import '@/components/...'`\n // resolve through the project's own path aliases (e.g. a Next.js app where\n // `@/*` → `src/*`). When absent, we fall back to a hardcoded `@` → resourcesDir\n // alias below.\n const projectTsconfigPath = path.join(projectPath, \"tsconfig.json\");\n let hasProjectTsconfig = false;\n try {\n await access(projectTsconfigPath);\n hasProjectTsconfig = true;\n } catch {\n // No tsconfig — fall back to the legacy \"@\" → resourcesDir alias\n }\n\n // Read favicon config from package.json\n const packageJsonPath = path.join(projectPath, \"package.json\");\n let favicon = \"\";\n try {\n const pkgContent = await fs.readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n favicon = pkg.mcpUse?.favicon || \"\";\n } catch {\n // No package.json or no mcpUse config, that's fine\n }\n\n // Helper function to build a single widget\n const buildSingleWidget = async (entry: { name: string; path: string }) => {\n const widgetName = entry.name;\n const entryPath = entry.path.replace(/\\\\/g, \"/\");\n\n console.log(chalk.gray(` - Building ${widgetName}...`));\n\n // Create temp directory for build artifacts\n const tempDir = path.join(projectPath, \".mcp-use\", widgetName);\n await fs.mkdir(tempDir, { recursive: true });\n\n // Create CSS file with Tailwind directives\n const relativeResourcesPath = path\n .relative(tempDir, resourcesDir)\n .replace(/\\\\/g, \"/\");\n\n // Calculate relative path to mcp-use package dynamically\n const mcpUsePath = path.join(projectPath, \"node_modules\", \"mcp-use\");\n const relativeMcpUsePath = path\n .relative(tempDir, mcpUsePath)\n .replace(/\\\\/g, \"/\");\n\n // When the project has a `src/` tree (typical for Next.js apps), tell\n // Tailwind to scan it too — otherwise classes used inside shared\n // components imported via `@/components/...` would be missing from the\n // widget bundle.\n const projectSrcDir = path.join(projectPath, \"src\");\n let projectSrcSourceLine = \"\";\n try {\n await access(projectSrcDir);\n const relativeProjectSrcPath = path\n .relative(tempDir, projectSrcDir)\n .replace(/\\\\/g, \"/\");\n projectSrcSourceLine = `@source \"${relativeProjectSrcPath}\";\\n`;\n } catch {\n // No src/ directory at the project root, skip\n }\n\n const cssContent = `@import \"tailwindcss\";\\n\\n/* Configure Tailwind to scan the resources directory and mcp-use package */\\n@source \"${relativeResourcesPath}\";\\n@source \"${relativeMcpUsePath}/**/*.{ts,tsx,js,jsx}\";\\n${projectSrcSourceLine}`;\n await fs.writeFile(path.join(tempDir, \"styles.css\"), cssContent, \"utf8\");\n\n // Create entry file\n const entryContent = `import React from 'react'\nimport { createRoot } from 'react-dom/client'\nimport './styles.css'\nimport Component from '${entryPath}'\n\nconst container = document.getElementById('widget-root')\nif (container && Component) {\n const root = createRoot(container)\n root.render(<Component />)\n}\n`;\n\n // Create HTML template\n const htmlContent = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <title>${widgetName} Widget</title>${\n favicon\n ? `\n <link rel=\"icon\" href=\"/mcp-use/public/${favicon}\" />`\n : \"\"\n }\n </head>\n <body>\n <div id=\"widget-root\"></div>\n <script type=\"module\" src=\"/entry.tsx\"></script>\n </body>\n</html>`;\n\n await fs.writeFile(path.join(tempDir, \"entry.tsx\"), entryContent, \"utf8\");\n await fs.writeFile(path.join(tempDir, \"index.html\"), htmlContent, \"utf8\");\n\n // Build with Vite\n const outDir = path.join(\n projectPath,\n \"dist\",\n \"resources\",\n \"widgets\",\n widgetName\n );\n\n // Set base URL: use MCP_URL if set, otherwise relative path\n const baseUrl = mcpUrl\n ? `${mcpUrl}/${widgetName}/`\n : `/mcp-use/widgets/${widgetName}/`;\n\n // Extract metadata from widget before building\n let widgetMetadata: any = {};\n try {\n // Use a completely isolated temp directory for metadata extraction to avoid conflicts\n const metadataTempDir = path.join(\n projectPath,\n \".mcp-use\",\n `${widgetName}-metadata`\n );\n await fs.mkdir(metadataTempDir, { recursive: true });\n\n const { createServer } = await import(\"vite\");\n\n // Plugin to provide browser stubs for Node.js-only packages\n const nodeStubsPlugin = {\n name: \"node-stubs\",\n enforce: \"pre\" as const,\n resolveId(id: string) {\n if (id === \"posthog-node\" || id.startsWith(\"posthog-node/\")) {\n return \"\\0virtual:posthog-node-stub\";\n }\n return null;\n },\n load(id: string) {\n if (id === \"\\0virtual:posthog-node-stub\") {\n return `\nexport class PostHog {\n constructor() {}\n capture() {}\n identify() {}\n alias() {}\n flush() { return Promise.resolve(); }\n shutdown() { return Promise.resolve(); }\n}\nexport default PostHog;\n`;\n }\n return null;\n },\n };\n\n const serverOnlyGuard = makeWidgetServerOnlyGuard(widgetName);\n\n const metadataServer = await createServer({\n root: metadataTempDir,\n cacheDir: path.join(metadataTempDir, \".vite-cache\"),\n plugins: [serverOnlyGuard, nodeStubsPlugin, tailwindcss(), react()],\n // When the project has a tsconfig, enable Vite's native tsconfig-paths\n // resolver so `@/*` (or any custom alias) resolves through the\n // project's own paths config. Without a tsconfig, fall back to the\n // legacy hardcoded alias.\n resolve: hasProjectTsconfig\n ? { tsconfigPaths: true }\n : { alias: { \"@\": resourcesDir } },\n server: {\n middlewareMode: true,\n },\n optimizeDeps: {\n // Exclude Node.js-only packages from browser bundling\n exclude: [\"posthog-node\"],\n },\n ssr: {\n // Force Vite to transform these packages in SSR instead of using external requires\n noExternal: [\"@openai/apps-sdk-ui\", \"react-router\"],\n // Mark Node.js-only packages as external in SSR mode\n external: [\"posthog-node\"],\n },\n define: {\n // Define process.env for SSR context\n \"process.env.NODE_ENV\": JSON.stringify(\n process.env.NODE_ENV || \"development\"\n ),\n \"import.meta.env.DEV\": true,\n \"import.meta.env.PROD\": false,\n \"import.meta.env.MODE\": JSON.stringify(\"development\"),\n \"import.meta.env.SSR\": true,\n },\n clearScreen: false,\n logLevel: \"silent\",\n customLogger: {\n info: () => {},\n warn: () => {},\n error: () => {},\n clearScreen: () => {},\n hasErrorLogged: () => false,\n hasWarned: false,\n warnOnce: () => {},\n },\n });\n\n try {\n const mod = await metadataServer.ssrLoadModule(entryPath);\n if (mod.widgetMetadata) {\n // Handle props (preferred) or inputs (deprecated) field\n const schemaField =\n mod.widgetMetadata.props || mod.widgetMetadata.inputs;\n\n // Check if schemaField is a Zod v4 schema (has ~standard property from Standard Schema)\n // and convert to JSON Schema for serialization using Zod v4's built-in toJsonSchema\n let inputsValue = schemaField || {};\n if (\n schemaField &&\n typeof schemaField === \"object\" &&\n \"~standard\" in schemaField\n ) {\n // Convert Zod schema to JSON Schema for manifest serialization\n try {\n inputsValue = toJSONSchema(schemaField);\n } catch (conversionError) {\n console.warn(\n chalk.yellow(\n ` ⚠ Could not convert schema for ${widgetName}, using raw schema`\n )\n );\n }\n }\n\n // Destructure to exclude props (raw Zod schema) from being serialized\n const {\n props: _rawProps,\n inputs: _rawInputs,\n ...restMetadata\n } = mod.widgetMetadata;\n\n widgetMetadata = {\n ...restMetadata,\n title: mod.widgetMetadata.title || widgetName,\n description: mod.widgetMetadata.description,\n // Store the converted JSON Schema (props field is used by production mount)\n props: inputsValue,\n inputs: inputsValue,\n };\n }\n // Give a moment for any background esbuild operations to complete\n await new Promise((resolve) => setTimeout(resolve, 50));\n } catch (error) {\n console.warn(\n chalk.yellow(` ⚠ Could not extract metadata for ${widgetName}`)\n );\n } finally {\n await metadataServer.close();\n // Clean up metadata temp directory\n try {\n await fs.rm(metadataTempDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n } catch (error) {\n // Silently skip metadata extraction if it fails\n }\n\n try {\n // Enhanced plugin to stub Node.js-only packages and built-ins\n const buildNodeStubsPlugin = {\n name: \"node-stubs-build\",\n enforce: \"pre\" as const,\n resolveId(id: string) {\n // Stub posthog-node\n if (id === \"posthog-node\" || id.startsWith(\"posthog-node/\")) {\n return \"\\0virtual:posthog-node-stub\";\n }\n // Stub path module for browser builds\n if (id === \"path\" || id === \"node:path\") {\n return \"\\0virtual:path-stub\";\n }\n return null;\n },\n load(id: string) {\n if (id === \"\\0virtual:posthog-node-stub\") {\n return `\nexport class PostHog {\n constructor() {}\n capture() {}\n identify() {}\n alias() {}\n flush() { return Promise.resolve(); }\n shutdown() { return Promise.resolve(); }\n}\nexport default PostHog;\n`;\n }\n if (id === \"\\0virtual:path-stub\") {\n return `\nexport function join(...paths) {\n return paths.filter(Boolean).join(\"/\").replace(/\\\\/\\\\//g, \"/\").replace(/\\\\/$/, \"\");\n}\nexport function resolve(...paths) {\n return join(...paths);\n}\nexport function dirname(filepath) {\n const parts = filepath.split(\"/\");\n parts.pop();\n return parts.join(\"/\") || \"/\";\n}\nexport function basename(filepath, ext) {\n const parts = filepath.split(\"/\");\n let name = parts[parts.length - 1] || \"\";\n if (ext && name.endsWith(ext)) {\n name = name.slice(0, -ext.length);\n }\n return name;\n}\nexport function extname(filepath) {\n const name = basename(filepath);\n const index = name.lastIndexOf(\".\");\n return index > 0 ? name.slice(index) : \"\";\n}\nexport function normalize(filepath) {\n return filepath.replace(/\\\\/\\\\//g, \"/\");\n}\nexport function isAbsolute(filepath) {\n return filepath.startsWith(\"/\");\n}\nexport const sep = \"/\";\nexport const delimiter = \":\";\nexport const posix = {\n join,\n resolve,\n dirname,\n basename,\n extname,\n normalize,\n isAbsolute,\n sep,\n delimiter,\n};\nexport default {\n join,\n resolve,\n dirname,\n basename,\n extname,\n normalize,\n isAbsolute,\n sep,\n delimiter,\n posix,\n};\n`;\n }\n return null;\n },\n };\n\n // Build plugins array - add viteSingleFile when inlining for VS Code compatibility.\n // `@/*` aliases are resolved via Vite's native `resolve.tsconfigPaths`\n // below (when the project has a tsconfig.json at the root); this is what\n // lets a widget inside a Next.js app `import '@/components/ui/card'`\n // and resolve it through the app's own paths config.\n const buildServerOnlyGuard = makeWidgetServerOnlyGuard(widgetName);\n const buildPlugins = inline\n ? [\n buildServerOnlyGuard,\n buildNodeStubsPlugin,\n tailwindcss(),\n react(),\n viteSingleFile({ removeViteModuleLoader: true }),\n ]\n : [buildServerOnlyGuard, buildNodeStubsPlugin, tailwindcss(), react()];\n\n await build({\n root: tempDir,\n base: baseUrl,\n plugins: buildPlugins,\n // Only use renderBuiltUrl for non-inline builds (external assets need runtime URL resolution)\n ...(inline\n ? {}\n : {\n experimental: {\n renderBuiltUrl: (\n filename: string,\n { hostType }: { hostType: string }\n ) => {\n if ([\"js\", \"css\"].includes(hostType)) {\n return {\n runtime: `window.__getFile(${JSON.stringify(filename)})`,\n };\n } else {\n return { relative: true };\n }\n },\n },\n }),\n // When a tsconfig exists, enable Vite's native `resolve.tsconfigPaths`\n // so the project's path aliases resolve naturally. Otherwise fall\n // back to the legacy `@` → resourcesDir alias.\n resolve: hasProjectTsconfig\n ? { tsconfigPaths: true }\n : { alias: { \"@\": resourcesDir } },\n optimizeDeps: {\n // Exclude Node.js-only packages from browser bundling\n exclude: [\"posthog-node\"],\n },\n build: {\n outDir,\n emptyOutDir: true,\n // Disable source maps to avoid CSP eval violations\n // Source maps can use eval-based mappings which break strict CSP policies\n sourcemap: false,\n // Minify for smaller bundle size\n minify: true,\n // Widgets bundle React+Zod; suppress expected chunk size warning\n chunkSizeWarningLimit: 1024,\n // For inline builds, disable CSS code splitting and inline all assets\n ...(inline\n ? {\n cssCodeSplit: false,\n assetsInlineLimit: 100000000, // Inline all assets under 100MB (effectively all)\n }\n : {}),\n rolldownOptions: {\n input: path.join(tempDir, \"index.html\"),\n external: (id) => {\n return false;\n },\n },\n },\n });\n\n // Post-process JS bundles to patch Zod's JIT compilation\n // This prevents CSP eval violations in sandboxed iframes (MCP Apps hosts)\n // See: https://github.com/colinhacks/zod/issues/4461\n try {\n const assetsDir = path.join(outDir, \"assets\");\n const assetFiles = await fs.readdir(assetsDir);\n const jsFiles = assetFiles.filter((f) => f.endsWith(\".js\"));\n\n for (const jsFile of jsFiles) {\n const jsPath = path.join(assetsDir, jsFile);\n let content = await fs.readFile(jsPath, \"utf8\");\n\n // Patch Zod's globalConfig to disable JIT compilation\n // Zod 4.x uses: const globalConfig={};function config(o){return globalConfig}\n // After minification: const X={};function Y(o){return X}\n // We match the pattern where an empty object const is followed by a function returning it\n const zodConfigPatterns = [\n // Non-minified: export const globalConfig = {}\n /export\\s+const\\s+globalConfig\\s*=\\s*\\{\\s*\\}/g,\n // Minified pattern: ZodEncodeError\"}}const X={};function followed by return X\n // This is the unique signature of Zod's globalConfig\n /ZodEncodeError[^}]*\\}\\}const\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*\\{\\s*\\}/g,\n ];\n\n let patched = false;\n for (const pattern of zodConfigPatterns) {\n if (pattern.test(content)) {\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n content = content.replace(pattern, (match) => {\n return match.replace(/=\\s*\\{\\s*\\}/, \"={jitless:true}\");\n });\n patched = true;\n }\n }\n\n if (patched) {\n await fs.writeFile(jsPath, content, \"utf8\");\n console.log(chalk.gray(` → Patched Zod JIT in ${jsFile}`));\n }\n }\n } catch (error) {\n // Assets directory might not exist for some builds, that's okay\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n console.warn(chalk.yellow(` ⚠ Failed to patch Zod JIT: ${error}`));\n }\n }\n\n // Post-process HTML for static deployments (e.g., Supabase)\n // If MCP_SERVER_URL is set, inject window globals at build time\n const mcpServerUrl = process.env.MCP_SERVER_URL;\n if (mcpServerUrl) {\n try {\n const htmlPath = path.join(outDir, \"index.html\");\n let html = await fs.readFile(htmlPath, \"utf8\");\n\n // Inject window.__mcpPublicUrl and window.__getFile into <head>\n // Note: __mcpPublicUrl uses standard format for useWidget to derive mcp_url\n // __mcpPublicAssetsUrl points to where public files are actually stored\n const injectionScript = `<script>window.__getFile = (filename) => { return \"${mcpUrl}/${widgetName}/\"+filename }; window.__mcpPublicUrl = \"${mcpServerUrl}/mcp-use/public\"; window.__mcpPublicAssetsUrl = \"${mcpUrl}/public\";</script>`;\n\n // Check if script tag already exists in head\n if (!html.includes(\"window.__mcpPublicUrl\")) {\n html = html.replace(\n /<head[^>]*>/i,\n `<head>\\n ${injectionScript}`\n );\n }\n\n // Update base href if it exists, or inject it\n if (/<base\\s+[^>]*\\/?>/i.test(html)) {\n // Replace existing base tag\n html = html.replace(\n /<base\\s+[^>]*\\/?>/i,\n `<base href=\"${mcpServerUrl}\">`\n );\n } else {\n // Inject base tag after the injection script\n html = html.replace(\n injectionScript,\n `${injectionScript}\\n <base href=\"${mcpServerUrl}\">`\n );\n }\n\n await fs.writeFile(htmlPath, html, \"utf8\");\n console.log(\n chalk.gray(` → Injected MCP_SERVER_URL into ${widgetName}`)\n );\n } catch (error) {\n console.warn(\n chalk.yellow(\n ` ⚠ Failed to post-process HTML for ${widgetName}:`,\n error\n )\n );\n }\n }\n\n console.log(chalk.green(` ✓ Built ${widgetName}`));\n return {\n status: \"built\" as const,\n name: widgetName,\n metadata: widgetMetadata,\n };\n } catch (error) {\n console.error(chalk.red(` ✗ Failed to build ${widgetName}:`), error);\n return { status: \"failed\" as const, name: widgetName };\n }\n };\n\n // Build all widgets in parallel\n const buildResults = await Promise.all(\n entries.map((entry) => buildSingleWidget(entry))\n );\n\n const failed = buildResults.filter((r) => r.status === \"failed\");\n if (failed.length > 0) {\n // A failed widget build must fail the whole `mcp-use build`. Silently\n // dropping failures produced a manifest that looked healthy but shipped\n // zero widgets at runtime — indistinguishable from a project that\n // intentionally has none. Throw so the outer try/catch exits non-zero.\n const names = failed.map((f) => f.name).join(\", \");\n throw new Error(\n `${failed.length} widget(s) failed to build: ${names}. See errors above.`\n );\n }\n\n return buildResults.flatMap((r) =>\n r.status === \"built\" ? [{ name: r.name, metadata: r.metadata }] : []\n );\n}\n\n/**\n * Collect TypeScript files from tsconfig include/exclude patterns using only\n * Node.js built-ins (no globby/fast-glob, which break in ESM bundles).\n */\nasync function collectTsFiles(\n projectPath: string,\n includePatterns: string[],\n excludePatterns: string[]\n): Promise<string[]> {\n const { promises: fs } = await import(\"node:fs\");\n\n // Separate literal files from directory globs\n const literalFiles: string[] = [];\n const dirPrefixes: string[] = [];\n\n for (const pattern of includePatterns) {\n if (pattern.includes(\"*\")) {\n // Extract directory prefix before the first wildcard\n const prefix = pattern.split(\"*\")[0].replace(/\\/+$/, \"\") || \".\";\n dirPrefixes.push(prefix);\n } else {\n literalFiles.push(pattern);\n }\n }\n\n const files: string[] = [];\n\n // Add literal files that exist and are .ts/.tsx (not .d.ts)\n for (const file of literalFiles) {\n if (/\\.tsx?$/.test(file) && !file.endsWith(\".d.ts\")) {\n try {\n await access(path.join(projectPath, file));\n files.push(file);\n } catch {\n // File doesn't exist, skip\n }\n }\n }\n\n // Recursively scan directories\n const excludeSet = new Set(excludePatterns.map((e) => e.replace(/\\*+/g, \"\")));\n for (const prefix of dirPrefixes) {\n const dirPath = path.join(projectPath, prefix);\n try {\n const entries = await fs.readdir(dirPath, { recursive: true });\n for (const entry of entries) {\n const entryStr = String(entry);\n const rel = path.join(prefix, entryStr);\n if (\n /\\.tsx?$/.test(entryStr) &&\n !entryStr.endsWith(\".d.ts\") &&\n !excludeSet.has(rel.split(path.sep)[0])\n ) {\n files.push(rel);\n }\n }\n } catch {\n // Directory doesn't exist, skip\n }\n }\n\n return files;\n}\n\n/**\n * Transpile TypeScript files using esbuild instead of tsc.\n * esbuild strips types without analyzing them, so it cannot OOM on complex types.\n * Reads the project's tsconfig.json to determine source files, outDir, and compiler options.\n */\nasync function transpileWithEsbuild(projectPath: string): Promise<void> {\n const esbuild = await import(\"esbuild\");\n const { promises: fs } = await import(\"node:fs\");\n\n const tsconfigPath = path.join(projectPath, \"tsconfig.json\");\n let tsconfig: any = {};\n try {\n const raw = await fs.readFile(tsconfigPath, \"utf-8\");\n tsconfig = JSON.parse(raw);\n } catch {\n // No tsconfig — use defaults\n }\n\n const compilerOptions = tsconfig.compilerOptions || {};\n const outDir = compilerOptions.outDir || \"./dist\";\n const includePatterns = tsconfig.include || [\"**/*.ts\", \"**/*.tsx\"];\n const excludePatterns = tsconfig.exclude || [\"node_modules\", \"dist\"];\n\n const files = await collectTsFiles(\n projectPath,\n includePatterns,\n excludePatterns\n );\n\n if (files.length === 0) {\n console.log(chalk.yellow(\" No TypeScript files found to transpile.\"));\n return;\n }\n\n // Map tsconfig jsx setting to esbuild equivalent\n const jsxMap: Record<string, \"automatic\" | \"transform\" | \"preserve\"> = {\n \"react-jsx\": \"automatic\",\n \"react-jsxdev\": \"automatic\",\n react: \"transform\",\n preserve: \"preserve\",\n };\n const jsx = jsxMap[compilerOptions.jsx] || undefined;\n\n const target = (compilerOptions.target || \"ES2022\").toLowerCase();\n\n const moduleStr = (compilerOptions.module || \"ESNext\").toLowerCase();\n const format: \"esm\" | \"cjs\" = moduleStr.includes(\"commonjs\") ? \"cjs\" : \"esm\";\n\n // Match tsc's rootDir behavior: when set, esbuild's outbase should map to it\n // so that `src/index.ts` → `dist/index.js` (not `dist/src/index.js`).\n const outbase = compilerOptions.rootDir\n ? path.resolve(projectPath, compilerOptions.rootDir)\n : projectPath;\n\n await esbuild.build({\n entryPoints: files.map((f) => path.join(projectPath, f)),\n outdir: path.join(projectPath, outDir),\n outbase,\n bundle: true,\n packages: \"external\",\n format,\n target,\n jsx,\n sourcemap: compilerOptions.sourceMap ?? true,\n tsconfig: tsconfigPath,\n platform: \"node\",\n logLevel: \"warning\",\n });\n}\n\nprogram\n .command(\"build\")\n .description(\"Build TypeScript and MCP UI widgets\")\n .option(\"-p, --path <path>\", \"Path to project directory\", process.cwd())\n .option(\n \"--entry <file>\",\n \"Path to MCP server entry file (relative to project)\"\n )\n .option(\n \"--widgets-dir <dir>\",\n \"Path to widgets directory (relative to project)\"\n )\n .option(\n \"--mcp-dir <dir>\",\n \"Folder holding the MCP entry + resources (e.g. 'src/mcp' for Next.js apps)\"\n )\n .option(\"--with-inspector\", \"Include inspector in production build\")\n .option(\n \"--inline\",\n \"Inline all JS/CSS into HTML (required for VS Code MCP Apps)\"\n )\n .option(\"--no-inline\", \"Keep JS/CSS as separate files (default)\")\n .option(\"--no-typecheck\", \"Skip TypeScript type checking (faster builds)\")\n .action(async (options) => {\n try {\n const projectPath = path.resolve(options.path);\n const { promises: fs } = await import(\"node:fs\");\n\n displayPackageVersions(projectPath);\n\n // Resolve mcpDir for widgets + server entry\n const mcpDir = options.mcpDir as string | undefined;\n const widgetsDir = resolveWidgetsDir(options.widgetsDir, mcpDir);\n\n // Build widgets first (this generates schemas)\n // Use --inline flag for VS Code compatibility (VS Code's CSP blocks external scripts)\n const builtWidgets = await buildWidgets(projectPath, {\n inline: options.inline ?? false,\n widgetsDir,\n });\n\n // Find the source server file before building\n let sourceServerFile: string | undefined;\n try {\n sourceServerFile = await findServerFile(\n projectPath,\n options.entry,\n options.mcpDir\n );\n } catch (err) {\n // No server file found. Widget-only projects hit this on purpose,\n // but a misconfigured --mcp-dir is a user error worth surfacing so\n // it doesn't cascade into a manifest without an entryPoint and an\n // unclear start-time failure.\n console.log(\n chalk.yellow(\n `⚠ Could not locate a server entry file: ${err instanceof Error ? err.message : String(err)}`\n )\n );\n }\n\n if (sourceServerFile) {\n console.log(chalk.gray(\"Generating tool registry types...\"));\n // Type generation is a dev convenience (regenerates\n // .mcp-use/tool-registry.d.ts). Keep it non-fatal during build so\n // a runtime without the right loader hooks (e.g. bun alpine) or\n // an unrelated import-time error in the server file can't block\n // the Docker build.\n try {\n const typeGenResult = await generateToolRegistryTypesForServer(\n projectPath,\n sourceServerFile\n );\n if (typeGenResult === \"ok\") {\n console.log(chalk.green(\"✓ Tool registry types generated\"));\n } else if (typeGenResult === \"failed\") {\n console.log(\n chalk.yellow(\n \"⚠ Tool registry type generation had errors (non-blocking)\"\n )\n );\n }\n // \"skipped\" already logged its own warning inside the function.\n } catch (err) {\n console.log(\n chalk.yellow(\n \"⚠ Tool registry type generation failed (non-blocking): \" +\n (err instanceof Error ? err.message : String(err))\n )\n );\n }\n }\n\n // Transpile TypeScript with esbuild (fast, no OOM on complex types).\n // Type checking is a separate step via tsc --noEmit (skippable with --no-typecheck).\n //\n // SKIPPED when --mcp-dir is set (drop-in Next.js layout). The host app\n // (Next.js) owns its own build; trying to transpile every .ts/.tsx in\n // a Next.js project chokes on files like `tailwind.config.ts` that are\n // never meant to be runtime-compiled and on RSC-only files that\n // esbuild doesn't understand. In --mcp-dir mode, `mcp-use start` runs\n // the TypeScript source directly via tsx (same setup as `mcp-use dev`,\n // minus HMR), so there's nothing to transpile ahead of time. The\n // manifest written below still records the .ts source as the entry.\n if (!mcpDir) {\n console.log(chalk.gray(\"Building TypeScript...\"));\n await transpileWithEsbuild(projectPath);\n console.log(chalk.green(\"✓ TypeScript build complete!\"));\n } else {\n console.log(\n chalk.gray(\n \"Skipping TypeScript transpile (--mcp-dir mode runs source via tsx at start time)\"\n )\n );\n }\n\n // Type-check with tsc --noEmit (separate from transpilation).\n // Uses the locally installed typescript binary directly rather than npx to\n // prevent npx from auto-installing the unrelated `tsc@2.0.4` package.\n // Also skipped in --mcp-dir mode — the host Next.js app is responsible\n // for type-checking its own tree during `next build`.\n if (options.typecheck !== false && !mcpDir) {\n console.log(chalk.gray(\"Type checking...\"));\n // Use the current runtime binary (`process.execPath`) rather than\n // hardcoding \"node\". Alpine images built on `oven/bun:alpine`\n // don't ship a `node` binary, and bun runs tsc fine.\n const tscBin = path.join(\n projectPath,\n \"node_modules\",\n \"typescript\",\n \"bin\",\n \"tsc\"\n );\n const tscArgs = isBunRuntime()\n ? [tscBin, \"--noEmit\"]\n : [\"--max-old-space-size=4096\", tscBin, \"--noEmit\"];\n try {\n await runCommand(process.execPath, tscArgs, projectPath).promise;\n console.log(chalk.green(\"✓ Type check passed!\"));\n } catch {\n console.error(\n chalk.red(\"✗ Type check failed.\") +\n chalk.gray(\" Use --no-typecheck to skip.\")\n );\n process.exit(1);\n }\n }\n\n // Determine the entry point `mcp-use start` should run.\n // - Legacy layout: the file was transpiled to dist/ above; record\n // the compiled .js path.\n // - --mcp-dir layout: no transpile step ran, so point the manifest\n // at the .ts source. `mcp-use start` loads it via tsx (same setup\n // as `mcp-use dev`, minus HMR).\n let entryPoint: string | undefined;\n if (sourceServerFile) {\n if (mcpDir) {\n entryPoint = sourceServerFile;\n } else {\n // Check possible output locations based on common tsconfig patterns\n // tsc may or may not preserve the src/ prefix depending on rootDir setting\n const baseName = path.basename(sourceServerFile, \".ts\") + \".js\";\n const possibleOutputs = [\n `dist/${baseName}`, // rootDir set to project root or src\n `dist/src/${baseName}`, // no rootDir, source in src/\n `dist/${sourceServerFile.replace(/\\.ts$/, \".js\")}`, // exact path preserved\n ];\n for (const candidate of possibleOutputs) {\n try {\n await access(path.join(projectPath, candidate));\n entryPoint = candidate;\n break;\n } catch {\n continue;\n }\n }\n }\n }\n\n // Copy public folder if it exists\n const publicDir = path.join(projectPath, \"public\");\n try {\n await fs.access(publicDir);\n console.log(chalk.gray(\"Copying public assets...\"));\n await fs.cp(publicDir, path.join(projectPath, \"dist\", \"public\"), {\n recursive: true,\n });\n console.log(chalk.green(\"✓ Public assets copied\"));\n } catch {\n // Public folder doesn't exist, skip\n }\n\n // Create build manifest\n const manifestPath = path.join(projectPath, \"dist\", \"mcp-use.json\");\n\n // Read existing manifest to preserve tunnel subdomain and other fields\n let existingManifest: any = {};\n try {\n const existingContent = await fs.readFile(manifestPath, \"utf-8\");\n existingManifest = JSON.parse(existingContent);\n } catch {\n // File doesn't exist, that's okay\n }\n\n // Transform builtWidgets array into widgets object with metadata\n const widgetsData: Record<string, any> = {};\n for (const widget of builtWidgets) {\n widgetsData[widget.name] = widget.metadata;\n }\n\n // Convert to boolean: true if flag is present, false otherwise\n const includeInspector = !!options.withInspector;\n\n // Generate a build ID (hash of build time + random component for uniqueness)\n const buildTime = new Date().toISOString();\n const { createHash } = await import(\"node:crypto\");\n const buildId = createHash(\"sha256\")\n .update(buildTime + Math.random().toString())\n .digest(\"hex\")\n .substring(0, 16); // Use first 16 chars for shorter IDs\n\n // Merge with existing manifest, preserving tunnel and other fields\n const manifest = {\n ...existingManifest, // Preserve existing fields like tunnel\n includeInspector,\n buildTime,\n buildId,\n entryPoint, // Server entry point for `mcp-use start`\n widgets: widgetsData,\n };\n\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(\n manifestPath,\n JSON.stringify(manifest, null, 2),\n \"utf8\"\n );\n console.log(chalk.green(\"✓ Build manifest created\"));\n\n console.log(chalk.green.bold(`\\n✓ Build complete!`));\n if (builtWidgets.length > 0) {\n console.log(chalk.gray(` ${builtWidgets.length} widget(s) built`));\n }\n if (options.withInspector) {\n console.log(chalk.gray(\" Inspector included\"));\n }\n process.exit(0);\n } catch (error) {\n console.error(chalk.red(\"Build failed:\"), error);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"dev\")\n .description(\"Run development server with auto-reload and inspector\")\n .option(\"-p, --path <path>\", \"Path to project directory\", process.cwd())\n .option(\n \"--entry <file>\",\n \"Path to MCP server entry file (relative to project)\"\n )\n .option(\n \"--widgets-dir <dir>\",\n \"Path to widgets directory (relative to project)\"\n )\n .option(\n \"--mcp-dir <dir>\",\n \"Folder holding the MCP entry + resources (e.g. 'src/mcp' for Next.js apps)\"\n )\n .option(\"--port <port>\", \"Server port\", \"3000\")\n .option(\n \"--host <host>\",\n \"Server host (use 0.0.0.0 to listen on all interfaces)\",\n \"0.0.0.0\"\n )\n .option(\"--no-open\", \"Do not auto-open inspector\")\n .option(\"--no-hmr\", \"Disable hot module reloading (use tsx watch instead)\")\n .option(\"--tunnel\", \"Expose server through a tunnel\")\n .action(async (options) => {\n try {\n process.env.MCP_USE_CLI_DEV = \"1\";\n const projectPath = path.resolve(options.path);\n let port = parseInt(options.port, 10);\n const host = options.host;\n const useHmr = options.hmr !== false;\n\n displayPackageVersions(projectPath);\n\n // Check if port is available, find alternative if needed\n if (!(await isPortAvailable(port, host))) {\n console.log(chalk.yellow.bold(`⚠️ Port ${port} is already in use`));\n const availablePort = await findAvailablePort(port, host);\n console.log(chalk.green.bold(`✓ Using port ${availablePort} instead`));\n port = availablePort;\n }\n\n // Find the main source file (honors --entry / --mcp-dir flags and mcp-use.config.json)\n const serverFile = await findServerFile(\n projectPath,\n options.entry,\n options.mcpDir\n );\n\n // Resolve the widgets directory and expose it via an env var so the\n // running MCPServer (which picks `resources/` by default) discovers\n // widgets at `<mcpDir>/resources` when the developer used --mcp-dir.\n // The env var is the contract: mcp-use/server reads it when no\n // explicit `resourcesDir` is passed to mountWidgets.\n {\n const devMcpDir = options.mcpDir as string | undefined;\n const devWidgetsDir = resolveWidgetsDir(options.widgetsDir, devMcpDir);\n if (devWidgetsDir !== \"resources\") {\n process.env.MCP_USE_WIDGETS_DIR = devWidgetsDir;\n }\n }\n\n // Start tunnel if requested\n let tunnelProcess: any = undefined;\n let tunnelSubdomain: string | undefined = undefined;\n let tunnelUrl: string | undefined = undefined;\n\n if (options.tunnel) {\n try {\n const manifestPath = path.join(projectPath, \"dist\", \"mcp-use.json\");\n let existingSubdomain: string | undefined;\n\n try {\n const manifestContent = await readFile(manifestPath, \"utf-8\");\n const manifest = JSON.parse(manifestContent);\n existingSubdomain = manifest.tunnel?.subdomain;\n if (existingSubdomain) {\n console.log(\n chalk.gray(`Found existing subdomain: ${existingSubdomain}`)\n );\n const apiBase =\n process.env.MCP_USE_TUNNEL_API || \"https://local.mcp-use.run\";\n try {\n await fetch(`${apiBase}/api/tunnels/${existingSubdomain}`, {\n method: \"DELETE\",\n });\n } catch {\n // Best-effort cleanup; ignore DELETE failures\n }\n }\n } catch {\n // Manifest doesn't exist or is invalid, that's okay\n }\n\n let tunnelInfo: Awaited<ReturnType<typeof startTunnel>>;\n try {\n tunnelInfo = await startTunnel(port, existingSubdomain);\n } catch (e) {\n if (existingSubdomain) {\n console.log(\n chalk.yellow(\n `Subdomain \"${existingSubdomain}\" unavailable, requesting a new one…`\n )\n );\n tunnelInfo = await startTunnel(port);\n } else {\n throw e;\n }\n }\n tunnelUrl = tunnelInfo.url;\n tunnelProcess = tunnelInfo.process;\n tunnelSubdomain = tunnelInfo.subdomain;\n\n // Persist subdomain for reuse across restarts\n try {\n let manifest: any = {};\n try {\n const manifestContent = await readFile(manifestPath, \"utf-8\");\n manifest = JSON.parse(manifestContent);\n } catch {\n // File doesn't exist, create new manifest\n }\n\n if (!manifest.tunnel) {\n manifest.tunnel = {};\n }\n manifest.tunnel.subdomain = tunnelSubdomain;\n\n await mkdir(path.dirname(manifestPath), { recursive: true });\n await writeFile(\n manifestPath,\n JSON.stringify(manifest, null, 2),\n \"utf-8\"\n );\n } catch (error) {\n console.warn(\n chalk.yellow(\n `⚠️ Failed to save subdomain to mcp-use.json: ${error instanceof Error ? error.message : \"Unknown error\"}`\n )\n );\n }\n } catch (error) {\n console.error(chalk.red(\"Failed to start tunnel:\"), error);\n process.exit(1);\n }\n }\n\n // Set environment variables for the server\n const mcpUrl = `http://${host}:${port}`;\n process.env.PORT = String(port);\n process.env.HOST = host;\n process.env.NODE_ENV = \"development\";\n // Tunnel URL takes priority; otherwise preserve user-provided MCP_URL (e.g., for reverse proxy setups)\n if (tunnelUrl) {\n process.env.MCP_URL = tunnelUrl;\n } else if (!process.env.MCP_URL) {\n process.env.MCP_URL = mcpUrl;\n }\n // Detect Next.js projects so we can install shims for server-only /\n // next/cache / next/headers / next/navigation / next/server — all of\n // which throw or misbehave outside a Next.js request context. We also\n // mirror Next.js's .env cascade so tools imported from the app find\n // the variables they expect (DB URLs, feature-flag keys, etc.).\n const isNextJsProject = await detectNextJsProject(projectPath);\n if (isNextJsProject) {\n console.log(\n chalk.gray(\n \"Next.js detected — installing server-runtime shims (server-only, next/cache, next/headers, next/navigation, next/server)\"\n )\n );\n await loadNextJsEnvFiles(projectPath);\n }\n\n if (!useHmr) {\n // Fallback: Use tsx watch (restarts process on changes)\n console.log(chalk.gray(\"HMR disabled, using tsx watch (full restart)\"));\n\n const processes: any[] = [];\n const baseEnv: NodeJS.ProcessEnv = {\n // Inherit parent env (PATH, HOME, etc.) — without it, tsx can't\n // resolve its own tooling in some setups.\n ...process.env,\n PORT: String(port),\n HOST: host,\n NODE_ENV: \"development\",\n // Preserve user-provided MCP_URL (e.g., for reverse proxy setups)\n MCP_URL: process.env.MCP_URL || mcpUrl,\n };\n const env = isNextJsProject ? withNextShimsEnv(baseEnv) : baseEnv;\n\n // Use local tsx if available, otherwise fall back to npx\n const { createRequire } = await import(\"node:module\");\n let cmd: string;\n let args: string[];\n try {\n const projectRequire = createRequire(\n path.join(projectPath, \"package.json\")\n );\n // Resolve tsx bin from package.json instead of hardcoding internal path\n const tsxPkgPath = projectRequire.resolve(\"tsx/package.json\");\n const tsxPkg = JSON.parse(await readFile(tsxPkgPath, \"utf-8\"));\n // Handle both string and object forms of the bin field\n let binPath: string;\n if (typeof tsxPkg.bin === \"string\") {\n binPath = tsxPkg.bin;\n } else if (tsxPkg.bin && typeof tsxPkg.bin === \"object\") {\n // Use 'tsx' entry or the first entry\n binPath = tsxPkg.bin.tsx || Object.values(tsxPkg.bin)[0];\n } else {\n throw new Error(\"No bin field found in tsx package.json\");\n }\n const tsxBin = path.resolve(path.dirname(tsxPkgPath), binPath);\n cmd = \"node\";\n args = [tsxBin, \"watch\", serverFile];\n } catch (error) {\n // tsx not found locally or bin resolution failed, use npx\n console.log(\n chalk.yellow(\n `Could not resolve local tsx: ${error instanceof Error ? error.message : \"unknown error\"}`\n )\n );\n cmd = \"npx\";\n args = [\"tsx\", \"watch\", serverFile];\n }\n\n const serverCommand = runCommand(cmd, args, projectPath, env, true);\n processes.push(serverCommand.process);\n\n // Auto-open inspector if enabled\n if (options.open !== false) {\n const startTime = Date.now();\n const browserHost = normalizeBrowserHost(host);\n const ready = await waitForServer(port, browserHost);\n if (ready) {\n const mcpEndpoint = `http://${browserHost}:${port}/mcp`;\n const autoConnectEndpoint = tunnelUrl\n ? `${tunnelUrl}/mcp`\n : mcpEndpoint;\n const inspectorUrl = `http://${browserHost}:${port}/inspector?autoConnect=${encodeURIComponent(autoConnectEndpoint)}`;\n\n const readyTime = Date.now() - startTime;\n console.log(chalk.green.bold(`✓ Ready in ${readyTime}ms`));\n console.log(\n chalk.whiteBright(`Local: http://${browserHost}:${port}`)\n );\n console.log(chalk.whiteBright(`Network: http://${host}:${port}`));\n console.log(chalk.whiteBright(`MCP: ${mcpEndpoint}`));\n if (tunnelUrl) {\n console.log(chalk.whiteBright(`Tunnel: ${tunnelUrl}/mcp`));\n }\n console.log(chalk.whiteBright(`Inspector: ${inspectorUrl}\\n`));\n await open(inspectorUrl);\n }\n }\n\n // Handle cleanup\n let noHmrCleanupInProgress = false;\n const cleanup = async () => {\n if (noHmrCleanupInProgress) return;\n noHmrCleanupInProgress = true;\n\n console.log(chalk.gray(\"\\n\\nShutting down...\"));\n\n if (\n tunnelProcess &&\n typeof (tunnelProcess as any).markShutdown === \"function\"\n ) {\n (tunnelProcess as any).markShutdown();\n }\n\n if (tunnelSubdomain) {\n try {\n const apiBase =\n process.env.MCP_USE_API || \"https://local.mcp-use.run\";\n await fetch(`${apiBase}/api/tunnels/${tunnelSubdomain}`, {\n method: \"DELETE\",\n });\n } catch {\n // Ignore cleanup errors\n }\n }\n\n processes.forEach((proc) => {\n if (proc && typeof proc.kill === \"function\") {\n proc.kill(\"SIGINT\");\n }\n });\n\n if (tunnelProcess && typeof tunnelProcess.kill === \"function\") {\n tunnelProcess.kill(\"SIGINT\");\n }\n\n setTimeout(() => process.exit(0), 2000);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n await new Promise(() => {});\n return;\n }\n\n // HMR mode: Use chokidar to watch files and sync registrations\n console.log(\n chalk.gray(\n \"HMR enabled - changes will hot reload without dropping connections\"\n )\n );\n\n // Register Next.js server-runtime shims in-process. The HMR path calls\n // `tsImport` in this process (no child) so the loader has to be\n // registered here, before the first import of the user's server entry.\n if (isNextJsProject) {\n const registered = await registerNextShimsInProcess();\n if (!registered) {\n console.warn(\n chalk.yellow(\n \"[HMR] Warning: Next.js shim loader could not be found on disk. \" +\n \"Importing server-only / next/cache / etc. will throw. \" +\n \"Reinstall @mcp-use/cli to fix.\"\n )\n );\n }\n }\n\n const chokidarModule = await import(\"chokidar\");\n const chokidar = (chokidarModule as any).default || chokidarModule;\n const { fileURLToPath } = await import(\"node:url\");\n const { createRequire } = await import(\"node:module\");\n\n // Resolve the user's tsconfig up front — the server load path below\n // depends on tsx picking it up so `@/*` aliases resolve.\n const projectTsconfigPath = path.join(projectPath, \"tsconfig.json\");\n let tsconfigAvailable = false;\n try {\n await access(projectTsconfigPath);\n tsconfigAvailable = true;\n // Belt-and-braces: tsx also consults TSX_TSCONFIG_PATH and walks up\n // from cwd for auto-discovery. Setting both covers every tsx code\n // path (initialize hook, globalPreload hook, CJS require path).\n process.env.TSX_TSCONFIG_PATH = projectTsconfigPath;\n if (process.cwd() !== projectPath) process.chdir(projectPath);\n } catch {\n // No tsconfig at the project root — path aliases won't resolve.\n }\n\n // Install tsx's loader hooks globally (no namespace). We deliberately\n // do NOT use tsx's `tsImport` here: tsImport registers tsx with a\n // generated namespace, which causes tsx's resolver to bail for any\n // specifier whose URL doesn't carry that namespace — including all\n // transitive imports like `@/lib/...`. Registering without a namespace\n // means tsx's resolver runs for every specifier and always consults\n // the tsconfig paths matcher.\n //\n // We also need tsx's CJS register: a Next.js app's package.json has no\n // `\"type\": \"module\"`, so tsx compiles .ts to CJS, and the user entry's\n // `require()` chain needs tsx's CJS `.ts` compilation + tsconfig-paths\n // rewriting. Without tsx/cjs, require(\"@/lib/...\") throws.\n //\n // After register, we use native dynamic `import()` with a ?t= cache\n // buster on each reload (same technique tsImport uses internally).\n let tsxLoaderActive = false;\n try {\n const projectRequire = createRequire(\n path.join(projectPath, \"package.json\")\n );\n\n // ESM side — tsx/esm/api.register()\n const tsxEsmApiPath = projectRequire.resolve(\"tsx/esm/api\");\n const tsxEsmApi = await import(pathToFileURL(tsxEsmApiPath).href);\n if (typeof tsxEsmApi.register === \"function\") {\n tsxEsmApi.register({\n tsconfig: tsconfigAvailable ? projectTsconfigPath : undefined,\n onImport: (url: string) => {\n // `fileURLToPath` is in scope from the outer destructure above.\n const filePath = url.startsWith(\"file://\")\n ? fileURLToPath(url)\n : url;\n if (\n !filePath.includes(\"node_modules\") &&\n filePath.startsWith(projectPath)\n ) {\n console.debug(`[HMR] Loaded: ${url}`);\n }\n },\n });\n tsxLoaderActive = true;\n }\n\n // CJS side — tsx/cjs/api.register(). Handles require() of .ts files\n // and tsconfig-paths rewriting inside CJS-compiled modules.\n try {\n const tsxCjsApiPath = projectRequire.resolve(\"tsx/cjs/api\");\n const tsxCjsApi = await import(pathToFileURL(tsxCjsApiPath).href);\n if (typeof tsxCjsApi.register === \"function\") {\n tsxCjsApi.register();\n }\n } catch {\n // tsx/cjs isn't exposed in some tsx minor versions; skipping is OK\n // as long as the ESM side is up. In practice tsx 4.x ships both.\n }\n } catch {\n console.log(\n chalk.yellow(\n \"Warning: tsx not found in project dependencies. TypeScript HMR may not work.\\n\" +\n \"Add tsx to your devDependencies: npm install -D tsx\"\n )\n );\n }\n\n const serverFilePath = path.join(projectPath, serverFile);\n const serverFileUrl = pathToFileURL(serverFilePath).href;\n\n // Set HMR mode flag - this tells MCPServer.listen() to skip during imports\n // CLI manages the server lifecycle instead\n (globalThis as any).__mcpUseHmrMode = true;\n\n // Helper to import server module with cache busting\n const importServerModule = async () => {\n // Clear the global reference so we can detect if a new instance was created\n const previousServer = (globalThis as any).__mcpUseLastServer;\n (globalThis as any).__mcpUseLastServer = null;\n\n // Native dynamic import is the reload mechanism. tsx's resolver/\n // loader is registered globally above (no namespace), so TS files\n // and tsconfig `@/*` paths resolve automatically. The ?t= query\n // busts Node's module cache on every reload; transitive modules\n // also re-evaluate because their specifiers include the cache-busted\n // parent URL in the resolve chain.\n //\n // When tsx isn't available we still do native import — it'll only\n // work for JS files, which matches the old fallback behavior.\n if (!tsxLoaderActive) {\n // Unused: log already printed during register. Kept as a guard\n // so type-checkers can see the branch is intentional.\n }\n await import(`${serverFileUrl}?t=${Date.now()}`);\n\n // Get the server instance from the global registry\n // No export required - MCPServer tracks itself when created via globalThis\n const instance = (globalThis as any).__mcpUseLastServer;\n\n if (!instance) {\n // No new instance was created - restore the previous one\n (globalThis as any).__mcpUseLastServer = previousServer;\n console.warn(\n chalk.yellow(\n \"[HMR] Warning: Module re-import did not create a new MCPServer instance. \" +\n \"The module may be cached. Check that your server file creates an MCPServer.\"\n )\n );\n return null;\n }\n\n if (instance === previousServer) {\n // Same instance reference - the module was cached and not re-evaluated\n console.warn(\n chalk.yellow(\n \"[HMR] Warning: Module re-import returned the same server instance. \" +\n \"The module may not have been re-evaluated. \" +\n (!tsxLoaderActive\n ? \"Install tsx as a devDependency for reliable TypeScript HMR.\"\n : \"This may be a module cache issue.\")\n )\n );\n return null;\n }\n\n return instance;\n };\n\n // Initial import\n console.log(chalk.gray(`Loading server from ${serverFile}...`));\n let runningServer: any;\n\n try {\n runningServer = await importServerModule();\n\n if (!runningServer) {\n console.error(\n chalk.red(\n \"Error: Could not find MCPServer instance.\\n\" +\n \"Make sure your server file creates an MCPServer:\\n\" +\n \" const server = new MCPServer({ name: 'my-server', version: '1.0.0' });\"\n )\n );\n process.exit(1);\n }\n\n // Check if it has the required methods\n if (typeof runningServer.listen !== \"function\") {\n console.error(\n chalk.red(\"Error: MCPServer instance must have a listen() method\")\n );\n process.exit(1);\n }\n\n // Start the server - temporarily disable HMR flag so listen() works\n const startTime = Date.now();\n (globalThis as any).__mcpUseHmrMode = false;\n await runningServer.listen(port);\n (globalThis as any).__mcpUseHmrMode = true;\n\n // Auto-open inspector if enabled\n if (options.open !== false) {\n const browserHost = normalizeBrowserHost(host);\n const ready = await waitForServer(port, browserHost);\n if (ready) {\n const mcpEndpoint = `http://${browserHost}:${port}/mcp`;\n const autoConnectEndpoint = tunnelUrl\n ? `${tunnelUrl}/mcp`\n : mcpEndpoint;\n const inspectorUrl = `http://${browserHost}:${port}/inspector?autoConnect=${encodeURIComponent(autoConnectEndpoint)}`;\n\n const readyTime = Date.now() - startTime;\n console.log(chalk.green.bold(`✓ Ready in ${readyTime}ms`));\n console.log(\n chalk.whiteBright(`Local: http://${browserHost}:${port}`)\n );\n console.log(chalk.whiteBright(`Network: http://${host}:${port}`));\n console.log(chalk.whiteBright(`MCP: ${mcpEndpoint}`));\n if (tunnelUrl) {\n console.log(chalk.whiteBright(`Tunnel: ${tunnelUrl}/mcp`));\n }\n console.log(chalk.whiteBright(`Inspector: ${inspectorUrl}`));\n console.log(chalk.gray(`Watching for changes...\\n`));\n await open(inspectorUrl);\n }\n }\n } catch (error: any) {\n console.error(\n chalk.red(\"Failed to start server:\"),\n error?.message || error\n );\n if (error?.stack) {\n console.error(chalk.gray(error.stack));\n }\n process.exit(1);\n }\n\n // Log success when --no-open is used\n if (options.open === false) {\n const mcpEndpoint = `http://${host}:${port}/mcp`;\n console.log(chalk.green.bold(`✓ Server ready`));\n console.log(chalk.whiteBright(`Local: http://${host}:${port}`));\n console.log(chalk.whiteBright(`MCP: ${mcpEndpoint}`));\n if (tunnelUrl) {\n console.log(chalk.whiteBright(`Tunnel: ${tunnelUrl}/mcp`));\n }\n console.log(chalk.gray(`Watching for changes...\\n`));\n }\n\n // Watch for file changes - watch .ts/.tsx files in project directory\n let watcher = chokidar.watch(\".\", {\n cwd: projectPath,\n ignored: (path: string, stats?: any) => {\n // Normalize path separators for cross-platform compatibility\n const normalizedPath = path.replace(/\\\\/g, \"/\");\n\n // Ignore dotfiles and dot directories (hidden files)\n if (/(^|\\/)\\.[^/]/.test(normalizedPath)) {\n return true;\n }\n\n // Ignore node_modules directory and all its contents\n if (\n normalizedPath.includes(\"/node_modules/\") ||\n normalizedPath.endsWith(\"/node_modules\")\n ) {\n return true;\n }\n\n // Ignore dist directory and all its contents\n if (\n normalizedPath.includes(\"/dist/\") ||\n normalizedPath.endsWith(\"/dist\")\n ) {\n return true;\n }\n\n // Ignore resources directory (widgets watched separately by vite)\n if (\n normalizedPath.includes(\"/resources/\") ||\n normalizedPath.endsWith(\"/resources\")\n ) {\n return true;\n }\n\n // Ignore .d.ts files (TypeScript declaration files)\n if (stats?.isFile() && normalizedPath.endsWith(\".d.ts\")) {\n return true;\n }\n\n return false;\n },\n persistent: true,\n ignoreInitial: true,\n depth: 3, // Limit depth to avoid watching too many files\n });\n\n watcher\n .on(\"ready\", () => {\n const watched = watcher.getWatched();\n const dirs = Object.keys(watched);\n console.log(\n chalk.gray(`[HMR] Watcher ready, watching ${dirs.length} paths`)\n );\n })\n .on(\"error\", (error: unknown) => {\n console.error(\n chalk.red(\n `[HMR] Watcher error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n });\n\n // Debounce rapid changes\n let reloadTimeout: NodeJS.Timeout | null = null;\n let isReloading = false;\n\n const hmrOnChange = async (filePath: string) => {\n // Only handle .ts and .tsx files (not .d.ts)\n if (\n (!filePath.endsWith(\".ts\") && !filePath.endsWith(\".tsx\")) ||\n filePath.endsWith(\".d.ts\")\n ) {\n return;\n }\n if (isReloading) return;\n\n // Debounce multiple rapid changes\n if (reloadTimeout) {\n clearTimeout(reloadTimeout);\n }\n\n reloadTimeout = setTimeout(async () => {\n isReloading = true;\n // filePath is already relative due to cwd option\n console.log(chalk.yellow(`\\n[HMR] File changed: ${filePath}`));\n\n try {\n // Re-import the server module (this creates a new MCPServer instance)\n const newServer = await importServerModule();\n\n if (!newServer) {\n console.warn(\n chalk.yellow(\n \"[HMR] Warning: No MCPServer instance found after reload, skipping\"\n )\n );\n isReloading = false;\n return;\n }\n\n // Check if the running server has syncRegistrationsFrom\n if (typeof runningServer.syncRegistrationsFrom !== \"function\") {\n console.warn(\n chalk.yellow(\n \"[HMR] Warning: Server does not support hot reload (missing syncRegistrationsFrom)\"\n )\n );\n isReloading = false;\n return;\n }\n\n // Sync registrations from the new server to the running server\n const syncResult = runningServer.syncRegistrationsFrom(newServer);\n\n if (syncResult && syncResult.totalChanges > 0) {\n const parts: string[] = [];\n if (\n syncResult.tools.updated > 0 ||\n syncResult.tools.added > 0 ||\n syncResult.tools.removed > 0\n ) {\n const details: string[] = [];\n if (syncResult.tools.updated > 0)\n details.push(`${syncResult.tools.updated} updated`);\n if (syncResult.tools.added > 0)\n details.push(`${syncResult.tools.added} added`);\n if (syncResult.tools.removed > 0)\n details.push(`${syncResult.tools.removed} removed`);\n parts.push(`tools (${details.join(\", \")})`);\n }\n if (\n syncResult.prompts.updated > 0 ||\n syncResult.prompts.added > 0 ||\n syncResult.prompts.removed > 0\n ) {\n const details: string[] = [];\n if (syncResult.prompts.updated > 0)\n details.push(`${syncResult.prompts.updated} updated`);\n if (syncResult.prompts.added > 0)\n details.push(`${syncResult.prompts.added} added`);\n if (syncResult.prompts.removed > 0)\n details.push(`${syncResult.prompts.removed} removed`);\n parts.push(`prompts (${details.join(\", \")})`);\n }\n if (\n syncResult.resources.updated > 0 ||\n syncResult.resources.added > 0 ||\n syncResult.resources.removed > 0\n ) {\n const details: string[] = [];\n if (syncResult.resources.updated > 0)\n details.push(`${syncResult.resources.updated} updated`);\n if (syncResult.resources.added > 0)\n details.push(`${syncResult.resources.added} added`);\n if (syncResult.resources.removed > 0)\n details.push(`${syncResult.resources.removed} removed`);\n parts.push(`resources (${details.join(\", \")})`);\n }\n console.log(chalk.green(`[HMR] ✓ Reloaded: ${parts.join(\", \")}`));\n } else {\n console.log(\n chalk.gray(\n `[HMR] No changes detected (${runningServer.registeredTools?.length || 0} tools, ` +\n `${runningServer.registeredPrompts?.length || 0} prompts, ` +\n `${runningServer.registeredResources?.length || 0} resources registered)`\n )\n );\n }\n } catch (error: any) {\n console.error(chalk.red(`[HMR] Reload failed: ${error.message}`));\n // Keep running with old registrations\n }\n\n isReloading = false;\n }, 100);\n };\n watcher.on(\"change\", hmrOnChange);\n\n // Expose project path so tunnel.ts can read the manifest for subdomain reuse\n process.env.MCP_USE_PROJECT_PATH = projectPath;\n\n // Expose in-process restart hook for the inspector tunnel toggle.\n // Tears down the running server and re-sets up everything as if\n // `mcp-use dev` was called with or without --tunnel.\n (globalThis as any).__mcpUseDevRestart = async (withTunnel: boolean) => {\n console.log(\n chalk.yellow(\n `\\n[DEV] Restarting ${withTunnel ? \"with\" : \"without\"} tunnel…`\n )\n );\n\n // Suppress noise from in-flight requests terminated during teardown\n const origStderrWrite = process.stderr.write.bind(process.stderr);\n const stderrFilter = (chunk: any, ...args: any[]) => {\n const str =\n typeof chunk === \"string\" ? chunk : (chunk?.toString?.() ?? \"\");\n if (\n str.includes(\"TypeError: terminated\") ||\n str.includes(\"SocketError\") ||\n str.includes(\"UND_ERR_SOCKET\")\n ) {\n return true;\n }\n return origStderrWrite(chunk, ...args);\n };\n process.stderr.write = stderrFilter as typeof process.stderr.write;\n\n // 1. Tear down\n watcher.close();\n if (tunnelProcess && typeof tunnelProcess.kill === \"function\") {\n if (typeof (tunnelProcess as any).markShutdown === \"function\") {\n (tunnelProcess as any).markShutdown();\n }\n const dyingProc = tunnelProcess;\n tunnelProcess = undefined;\n dyingProc.kill(\"SIGINT\");\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n try {\n dyingProc.kill(\"SIGKILL\");\n } catch {\n /* ignore */\n }\n resolve();\n }, 5000);\n dyingProc.on(\"exit\", () => {\n clearTimeout(timeout);\n resolve();\n });\n });\n }\n if (tunnelSubdomain) {\n const apiBase =\n process.env.MCP_USE_API || \"https://local.mcp-use.run\";\n try {\n await fetch(`${apiBase}/api/tunnels/${tunnelSubdomain}`, {\n method: \"DELETE\",\n });\n } catch {\n /* ignore */\n }\n tunnelSubdomain = undefined;\n }\n if (runningServer && typeof runningServer.forceClose === \"function\") {\n await runningServer.forceClose();\n } else if (runningServer && typeof runningServer.close === \"function\") {\n await runningServer.close();\n }\n\n // 2. Start tunnel if requested\n tunnelUrl = undefined;\n if (withTunnel) {\n const manifestPath = path.join(projectPath, \"dist\", \"mcp-use.json\");\n let existingSubdomain: string | undefined;\n try {\n const manifestContent = await readFile(manifestPath, \"utf-8\");\n const manifest = JSON.parse(manifestContent);\n existingSubdomain = manifest.tunnel?.subdomain;\n if (existingSubdomain) {\n const apiBase =\n process.env.MCP_USE_API || \"https://local.mcp-use.run\";\n try {\n await fetch(`${apiBase}/api/tunnels/${existingSubdomain}`, {\n method: \"DELETE\",\n });\n } catch {\n /* ignore */\n }\n }\n } catch {\n /* ignore */\n }\n let tunnelInfo: Awaited<ReturnType<typeof startTunnel>>;\n try {\n tunnelInfo = await startTunnel(port, existingSubdomain);\n } catch {\n if (existingSubdomain) {\n console.log(\n chalk.yellow(\n `Subdomain \"${existingSubdomain}\" unavailable, requesting a new one…`\n )\n );\n tunnelInfo = await startTunnel(port);\n } else {\n throw new Error(\"Failed to start tunnel\");\n }\n }\n tunnelUrl = tunnelInfo.url;\n tunnelProcess = tunnelInfo.process;\n tunnelSubdomain = tunnelInfo.subdomain;\n process.env.MCP_URL = tunnelUrl;\n\n // Persist subdomain\n try {\n const mPath = path.join(projectPath, \"dist\", \"mcp-use.json\");\n let manifest: any = {};\n try {\n manifest = JSON.parse(await readFile(mPath, \"utf-8\"));\n } catch {\n /* ignore */\n }\n if (!manifest.tunnel) manifest.tunnel = {};\n manifest.tunnel.subdomain = tunnelSubdomain;\n await mkdir(path.dirname(mPath), { recursive: true });\n await writeFile(mPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n } catch {\n /* ignore */\n }\n } else {\n process.env.MCP_URL = `http://${host}:${port}`;\n }\n\n // 3. Re-import server module (HMR mode stays true so user's listen() is a no-op)\n console.log(chalk.gray(`Loading server from ${serverFile}...`));\n runningServer = await importServerModule();\n if (!runningServer) {\n console.error(\n chalk.red(\"Error: Could not find MCPServer instance after restart.\")\n );\n return;\n }\n // Temporarily disable HMR flag so our listen() actually starts the server\n (globalThis as any).__mcpUseHmrMode = false;\n await runningServer.listen(port);\n (globalThis as any).__mcpUseHmrMode = true;\n\n const browserHost = normalizeBrowserHost(host);\n const mcpEndpoint = `http://${browserHost}:${port}/mcp`;\n const autoConnectEndpoint = tunnelUrl\n ? `${tunnelUrl}/mcp`\n : mcpEndpoint;\n console.log(chalk.green.bold(`✓ Restarted`));\n console.log(chalk.whiteBright(`MCP: ${mcpEndpoint}`));\n if (tunnelUrl) {\n console.log(chalk.whiteBright(`Tunnel: ${tunnelUrl}/mcp`));\n }\n console.log(\n chalk.whiteBright(\n `Inspector: http://${browserHost}:${port}/inspector?autoConnect=${encodeURIComponent(autoConnectEndpoint)}`\n )\n );\n console.log(chalk.gray(`Watching for changes...\\n`));\n\n // 4. Re-create watcher (reuses same config)\n watcher = chokidar.watch(\".\", {\n cwd: projectPath,\n ignored: (p: string, stats?: any) => {\n const np = p.replace(/\\\\/g, \"/\");\n if (/(^|\\/)\\.[^/]/.test(np)) return true;\n if (np.includes(\"/node_modules/\") || np.endsWith(\"/node_modules\"))\n return true;\n if (np.includes(\"/dist/\") || np.endsWith(\"/dist\")) return true;\n if (np.includes(\"/resources/\") || np.endsWith(\"/resources\"))\n return true;\n if (stats?.isFile() && np.endsWith(\".d.ts\")) return true;\n return false;\n },\n persistent: true,\n ignoreInitial: true,\n depth: 3,\n });\n watcher\n .on(\"ready\", () => console.log(chalk.gray(`[HMR] Watcher ready`)))\n .on(\"error\", (err: unknown) =>\n console.error(\n chalk.red(\n `[HMR] Watcher error: ${err instanceof Error ? err.message : String(err)}`\n )\n )\n )\n .on(\"change\", hmrOnChange);\n\n // Restore stderr once the new server is stable\n setTimeout(() => {\n process.stderr.write = origStderrWrite;\n }, 2000);\n };\n\n // Handle cleanup\n let hmrCleanupInProgress = false;\n const cleanup = async () => {\n if (hmrCleanupInProgress) return;\n hmrCleanupInProgress = true;\n\n console.log(chalk.gray(\"\\n\\nShutting down...\"));\n watcher.close();\n\n if (\n tunnelProcess &&\n typeof (tunnelProcess as any).markShutdown === \"function\"\n ) {\n (tunnelProcess as any).markShutdown();\n }\n\n if (tunnelSubdomain) {\n try {\n const apiBase =\n process.env.MCP_USE_API || \"https://local.mcp-use.run\";\n await fetch(`${apiBase}/api/tunnels/${tunnelSubdomain}`, {\n method: \"DELETE\",\n });\n } catch {\n // Ignore cleanup errors\n }\n }\n\n if (tunnelProcess && typeof tunnelProcess.kill === \"function\") {\n tunnelProcess.kill(\"SIGINT\");\n setTimeout(() => process.exit(0), 2000);\n } else {\n process.exit(0);\n }\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n // Keep the process running\n await new Promise(() => {});\n } catch (error) {\n console.error(chalk.red(\"Dev mode failed:\"), error);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"start\")\n .description(\"Start production server\")\n .option(\"-p, --path <path>\", \"Path to project directory\", process.cwd())\n .option(\n \"--entry <file>\",\n \"Path to MCP server entry file (relative to project)\"\n )\n .option(\n \"--mcp-dir <dir>\",\n \"Folder holding the MCP entry + resources (e.g. 'src/mcp' for Next.js apps)\"\n )\n .option(\"--port <port>\", \"Server port\", \"3000\")\n .option(\"--tunnel\", \"Expose server through a tunnel\")\n .action(async (options) => {\n try {\n const projectPath = path.resolve(options.path);\n // Priority: --port flag > process.env.PORT > default\n // Check if --port or -p was explicitly provided in command line\n const portFlagProvided =\n process.argv.includes(\"--port\") ||\n process.argv.includes(\"-p\") ||\n process.argv.some((arg) => arg.startsWith(\"--port=\")) ||\n process.argv.some((arg) => arg.startsWith(\"-p=\"));\n\n let port = portFlagProvided\n ? parseInt(options.port, 10) // Flag explicitly provided, use it\n : parseInt(process.env.PORT || options.port || \"3000\", 10); // Check env, then default\n\n // Check if port is available, find alternative if needed\n if (!(await isPortAvailable(port))) {\n console.log(chalk.yellow.bold(`⚠️ Port ${port} is already in use`));\n const availablePort = await findAvailablePort(port);\n console.log(chalk.green.bold(`✓ Using port ${availablePort} instead`));\n port = availablePort;\n }\n\n console.log(\n `\\x1b[36m\\x1b[1mmcp-use\\x1b[0m \\x1b[90mVersion: ${packageJson.version}\\x1b[0m\\n`\n );\n\n // Start tunnel if requested\n let mcpUrl: string | undefined;\n let tunnelProcess: any = undefined;\n let tunnelSubdomain: string | undefined = undefined;\n if (options.tunnel) {\n try {\n // Read existing subdomain from mcp-use.json if available\n const manifestPath = path.join(projectPath, \"dist\", \"mcp-use.json\");\n let existingSubdomain: string | undefined;\n\n try {\n const manifestContent = await readFile(manifestPath, \"utf-8\");\n const manifest = JSON.parse(manifestContent);\n existingSubdomain = manifest.tunnel?.subdomain;\n if (existingSubdomain) {\n console.log(\n chalk.gray(`Found existing subdomain: ${existingSubdomain}`)\n );\n // Release the stale subdomain so the first attempt can reclaim it\n const apiBase =\n process.env.MCP_USE_API || \"https://local.mcp-use.run\";\n try {\n await fetch(`${apiBase}/api/tunnels/${existingSubdomain}`, {\n method: \"DELETE\",\n });\n } catch {\n // Best-effort cleanup; ignore DELETE failures\n }\n }\n } catch (error) {\n // Manifest doesn't exist or is invalid, that's okay\n console.debug(\n chalk.gray(\n `Debug: Failed to read or parse mcp-use.json: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n\n let tunnelInfo: Awaited<ReturnType<typeof startTunnel>>;\n try {\n tunnelInfo = await startTunnel(port, existingSubdomain);\n } catch (e) {\n if (existingSubdomain) {\n console.log(\n chalk.yellow(\n `Subdomain \"${existingSubdomain}\" unavailable, requesting a new one…`\n )\n );\n tunnelInfo = await startTunnel(port);\n } else {\n throw e;\n }\n }\n mcpUrl = tunnelInfo.url;\n tunnelProcess = tunnelInfo.process;\n const subdomain = tunnelInfo.subdomain;\n tunnelSubdomain = subdomain;\n\n // Update mcp-use.json with the subdomain\n try {\n let manifest: any = {};\n try {\n const manifestContent = await readFile(manifestPath, \"utf-8\");\n manifest = JSON.parse(manifestContent);\n } catch {\n // File doesn't exist, create new manifest\n }\n\n // Update or add tunnel subdomain\n if (!manifest.tunnel) {\n manifest.tunnel = {};\n }\n manifest.tunnel.subdomain = subdomain;\n\n // Ensure dist directory exists\n await mkdir(path.dirname(manifestPath), { recursive: true });\n\n // Write updated manifest\n await writeFile(\n manifestPath,\n JSON.stringify(manifest, null, 2),\n \"utf-8\"\n );\n } catch (error) {\n console.warn(\n chalk.yellow(\n `⚠️ Failed to save subdomain to mcp-use.json: ${error instanceof Error ? error.message : \"Unknown error\"}`\n )\n );\n }\n } catch (error) {\n console.error(chalk.red(\"Failed to start tunnel:\"), error);\n process.exit(1);\n }\n }\n\n // Find the built server file\n // First try to read from manifest (set during build)\n let serverFile: string | undefined;\n const manifestPath = path.join(projectPath, \"dist\", \"mcp-use.json\");\n\n try {\n const manifestContent = await readFile(manifestPath, \"utf-8\");\n const manifest = JSON.parse(manifestContent);\n if (manifest.entryPoint) {\n // Verify the entry point exists\n await access(path.join(projectPath, manifest.entryPoint));\n serverFile = manifest.entryPoint;\n }\n } catch {\n // Manifest doesn't exist or entryPoint not set, fall back to searching\n }\n\n // Fall back to checking common locations if manifest didn't help\n if (!serverFile) {\n // Resolve mcpDir from CLI flag so `--mcp-dir src/mcp` finds the\n // entry at dist/src/mcp/index.js (legacy transpile mode) or the TS\n // source at src/mcp/index.ts (drop-in mode — `build` skips transpile\n // and `start` runs the source via tsx).\n const startMcpDir = options.mcpDir as string | undefined;\n\n const serverCandidates = [\n ...(startMcpDir\n ? [\n `${startMcpDir}/index.ts`,\n `${startMcpDir}/index.tsx`,\n `dist/${startMcpDir}/index.js`,\n `dist/${startMcpDir}/server.js`,\n ]\n : []),\n \"dist/index.js\",\n \"dist/server.js\",\n \"dist/src/index.js\",\n \"dist/src/server.js\",\n ];\n\n for (const candidate of serverCandidates) {\n try {\n await access(path.join(projectPath, candidate));\n serverFile = candidate;\n break;\n } catch {\n continue;\n }\n }\n }\n\n if (!serverFile) {\n console.error(\n chalk.red(\n `No built server file found. Run 'mcp-use build' first.\\n\\nLooked for:\\n - dist/mcp-use.json (manifest with entryPoint)\\n - dist/index.js\\n - dist/server.js\\n - dist/src/index.js\\n - dist/src/server.js`\n )\n );\n process.exit(1);\n }\n\n console.log(\"Starting production server...\");\n\n // Detect Next.js projects the same way `dev` does: when `next` is in\n // the user's package.json, install the server-runtime shims so any\n // transitive `server-only` / `next/cache` / `next/headers` imports\n // resolve to inert stubs instead of throwing, and load the Next.js\n // env-file cascade so tools find the env vars they expect.\n const isNextJsProject = await detectNextJsProject(projectPath);\n if (isNextJsProject) {\n console.log(\n chalk.gray(\n \"Next.js detected — installing server-runtime shims for the production server\"\n )\n );\n await loadNextJsEnvFiles(projectPath);\n }\n\n const baseEnv: NodeJS.ProcessEnv = {\n ...process.env,\n PORT: String(port),\n NODE_ENV: \"production\",\n };\n\n if (mcpUrl) {\n baseEnv.MCP_URL = mcpUrl;\n console.log(chalk.whiteBright(`Tunnel: ${mcpUrl}/mcp`));\n } else if (!baseEnv.MCP_URL) {\n baseEnv.MCP_URL = `http://localhost:${port}`;\n }\n const env = isNextJsProject ? withNextShimsEnv(baseEnv) : baseEnv;\n\n // If the recorded entry is a TypeScript source (the --mcp-dir mode,\n // where `build` deliberately skips full-project transpilation), run\n // it through tsx. Otherwise the legacy path of `node dist/index.js`.\n const isTsEntry = /\\.(ts|tsx|mts|cts)$/.test(serverFile);\n let spawnCmd = \"node\";\n let spawnArgs: string[] = [serverFile];\n if (isTsEntry) {\n try {\n const projectRequire = createRequire(\n path.join(projectPath, \"package.json\")\n );\n const tsxPkgPath = projectRequire.resolve(\"tsx/package.json\");\n const tsxPkg = JSON.parse(await readFile(tsxPkgPath, \"utf-8\"));\n const binField =\n typeof tsxPkg.bin === \"string\"\n ? tsxPkg.bin\n : (tsxPkg.bin?.tsx ?? Object.values(tsxPkg.bin ?? {})[0]);\n if (!binField) throw new Error(\"tsx bin entry not found\");\n const tsxBin = path.resolve(path.dirname(tsxPkgPath), binField);\n spawnCmd = \"node\";\n spawnArgs = [tsxBin, serverFile];\n } catch (error) {\n console.log(\n chalk.yellow(\n `Could not resolve local tsx (${error instanceof Error ? error.message : String(error)}); falling back to npx`\n )\n );\n spawnCmd = \"npx\";\n spawnArgs = [\"tsx\", serverFile];\n }\n }\n\n const serverProc = spawn(spawnCmd, spawnArgs, {\n cwd: projectPath,\n stdio: \"inherit\",\n env,\n });\n\n // Handle cleanup\n let cleanupInProgress = false;\n const cleanup = async () => {\n if (cleanupInProgress) {\n return; // Prevent double cleanup\n }\n cleanupInProgress = true;\n\n console.log(chalk.gray(\"\\n\\nShutting down...\"));\n\n // Mark tunnel as shutting down to suppress output\n if (\n tunnelProcess &&\n typeof (tunnelProcess as any).markShutdown === \"function\"\n ) {\n (tunnelProcess as any).markShutdown();\n }\n\n // Clean up tunnel via API if subdomain is available\n if (tunnelSubdomain) {\n try {\n const apiBase =\n process.env.MCP_USE_API || \"https://local.mcp-use.run\";\n await fetch(`${apiBase}/api/tunnels/${tunnelSubdomain}`, {\n method: \"DELETE\",\n });\n } catch (err) {\n // Ignore cleanup errors\n }\n }\n\n const processesToKill = 1 + (tunnelProcess ? 1 : 0);\n let killedCount = 0;\n\n const checkAndExit = () => {\n killedCount++;\n if (killedCount >= processesToKill) {\n process.exit(0);\n }\n };\n\n // Handle server process\n serverProc.on(\"exit\", checkAndExit);\n serverProc.kill(\"SIGTERM\");\n\n // Handle tunnel process if it exists\n if (tunnelProcess && typeof tunnelProcess.kill === \"function\") {\n tunnelProcess.on(\"exit\", checkAndExit);\n // Use SIGINT for better cleanup of npx/node processes\n tunnelProcess.kill(\"SIGINT\");\n } else {\n checkAndExit();\n }\n\n // Fallback timeout in case processes don't exit\n setTimeout(() => {\n if (serverProc.exitCode === null) {\n serverProc.kill(\"SIGKILL\");\n }\n if (tunnelProcess && tunnelProcess.exitCode === null) {\n tunnelProcess.kill(\"SIGKILL\");\n }\n process.exit(0);\n }, 2000); // Increase timeout to 2 seconds to allow graceful shutdown\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n serverProc.on(\"exit\", async (code) => {\n // Server exited - cleanup tunnel before exiting CLI\n if (!cleanupInProgress) {\n await cleanup();\n }\n process.exit(code || 0);\n });\n } catch (error) {\n console.error(\"Start failed:\", error);\n process.exit(1);\n }\n });\n\n// Authentication commands\nprogram\n .command(\"login\")\n .description(\"Login to Manufact cloud\")\n .option(\n \"--api-key <key>\",\n \"Login with an API key directly (non-interactive, for CI/CD)\"\n )\n .option(\"--org <slug|id|name>\", \"Select an organization non-interactively\")\n .action(async (opts: { apiKey?: string; org?: string }) => {\n try {\n await loginCommand({ apiKey: opts.apiKey, org: opts.org });\n process.exit(0);\n } catch (error) {\n console.error(\n chalk.red.bold(\"\\n✗ Login failed:\"),\n chalk.red(error instanceof Error ? error.message : \"Unknown error\")\n );\n process.exit(1);\n }\n });\n\nprogram\n .command(\"logout\")\n .description(\"Logout from Manufact cloud\")\n .action(async () => {\n await logoutCommand();\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Show current user information\")\n .action(async () => {\n await whoamiCommand();\n });\n\n// Organization commands\nconst orgCommand = program.command(\"org\").description(\"Manage organizations\");\n\norgCommand\n .command(\"list\")\n .description(\"List your organizations\")\n .action(async () => {\n await orgListCommand();\n });\n\norgCommand\n .command(\"switch\")\n .description(\"Switch the active organization\")\n .action(async () => {\n await orgSwitchCommand();\n });\n\norgCommand\n .command(\"current\")\n .description(\"Show the currently active organization\")\n .action(async () => {\n await orgCurrentCommand();\n });\n\n// Deployment command\nprogram\n .command(\"deploy\")\n .description(\"Deploy MCP server from GitHub to Manufact cloud\")\n .option(\"--open\", \"Open deployment in browser after successful deploy\")\n .option(\"--name <name>\", \"Custom deployment name\")\n .option(\"--port <port>\", \"Server port\", \"3000\")\n .option(\"--runtime <runtime>\", \"Runtime (node or python)\")\n .option(\n \"--new\",\n \"Force creation of new deployment instead of reusing linked deployment\"\n )\n .option(\n \"--env <key=value...>\",\n \"Environment variables (can be used multiple times)\"\n )\n .option(\"--env-file <path>\", \"Path to .env file with environment variables\")\n .option(\n \"--root-dir <path>\",\n \"Root directory within repo to deploy from (for monorepos)\"\n )\n .option(\n \"--org <slug-or-id>\",\n \"Deploy to a specific organization (by slug or ID)\"\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--region <region>\", \"Deploy region: US, EU, or APAC (default: US)\")\n .option(\n \"--build-command <cmd>\",\n \"Custom build command (overrides auto-detection)\"\n )\n .option(\n \"--start-command <cmd>\",\n \"Custom start command (overrides auto-detection)\"\n )\n .action(async (options) => {\n await deployCommand({\n open: options.open,\n name: options.name,\n port: options.port ? parseInt(options.port, 10) : undefined,\n runtime: options.runtime,\n new: options.new,\n env: options.env,\n envFile: options.envFile,\n rootDir: options.rootDir,\n org: options.org,\n yes: options.yes,\n region: options.region,\n buildCommand: options.buildCommand,\n startCommand: options.startCommand,\n });\n });\n\n// Client command. The screenshot subcommand lives under `client`:\n// - `mcp-use client screenshot --mcp <url>` for ad-hoc/programmatic use\n// - `mcp-use client <name> screenshot` for saved servers (uses their auth)\nprogram.addCommand(createClientCommand());\n\n// Deployments command\nprogram.addCommand(createDeploymentsCommand());\n\n// Servers command\nprogram.addCommand(createServersCommand());\n\n// Skills command\nprogram.addCommand(createSkillsCommand());\n\n// Generate types command\nprogram\n .command(\"generate-types\")\n .description(\n \"Generate TypeScript type definitions for tools (writes .mcp-use/tool-registry.d.ts)\"\n )\n .option(\"-p, --path <path>\", \"Path to project directory\", process.cwd())\n .option(\"--server <file>\", \"Server entry file\", \"index.ts\")\n .action(async (options) => {\n const projectPath = path.resolve(options.path);\n\n try {\n console.log(chalk.blue(\"Generating tool registry types...\"));\n const result = await generateToolRegistryTypesForServer(\n projectPath,\n options.server\n );\n if (result === \"ok\") {\n console.log(\n chalk.green(\"✓ Tool registry types generated successfully\")\n );\n } else if (result === \"failed\") {\n console.log(chalk.yellow(\"⚠ Tool registry type generation had errors\"));\n }\n // \"skipped\" already logged its own warning inside the function.\n process.exit(0);\n } catch (error) {\n console.error(\n chalk.red(\"Failed to generate types:\"),\n error instanceof Error ? error.message : String(error)\n );\n if (error instanceof Error && error.stack) {\n console.error(chalk.gray(error.stack));\n }\n process.exit(1);\n }\n });\n\nprogram.hook(\"preAction\", async (_thisCommand, actionCommand) => {\n const projectPath = actionCommand.opts().path as string | undefined;\n await notifyIfUpdateAvailable(projectPath);\n});\n\n/**\n * Per-server routing for `mcp-use client <name> ...`.\n *\n * Commander doesn't natively dispatch on a dynamic positional that precedes a\n * subcommand group. So we intercept here: if the token after `client` isn't a\n * reserved subcommand (`connect`, `list`, `help`) or a flag, treat it as a\n * saved-server name and parse the remainder against a per-server command tree.\n */\nconst argv = process.argv;\n// `client` is only valid as a subcommand at argv[2] (node + script + first\n// user token). Don't use `indexOf`, since the literal string \"client\" can\n// also appear later in argv as someone's argument value.\nconst clientIdx = argv[2] === \"client\" ? 2 : -1;\nconst perClientName =\n clientIdx !== -1 &&\n argv.length > clientIdx + 1 &&\n !argv[clientIdx + 1].startsWith(\"-\") &&\n !RESERVED_CLIENT_SUBCOMMANDS.has(argv[clientIdx + 1])\n ? argv[clientIdx + 1]\n : null;\n\nif (perClientName) {\n // Catch a common mistake: user typed `mcp-use client tools call X` and\n // forgot the server name. Commander would otherwise route this as if\n // \"tools\" were the server name and complain about an unknown command.\n if (PER_CLIENT_SCOPES.has(perClientName)) {\n const rest = argv.slice(clientIdx + 1).join(\" \");\n console.error(formatError(\"Missing server name.\"));\n console.error(\"\");\n console.error(\n `'${perClientName}' is a per-server subcommand, not a server name. ` +\n `Address it through a saved server:`\n );\n console.error(\"\");\n console.error(` mcp-use client <name> ${rest}`);\n console.error(\"\");\n console.error(\"See your saved servers with:\");\n console.error(\" mcp-use client list\");\n process.exit(1);\n }\n\n const rest = argv.slice(clientIdx + 2);\n // Bare `mcp-use client <name>` (or with `--help`/`-h`) defaults to\n // commander's help for the per-server tree. That help is only useful when\n // the server actually exists — for an unknown name it leaks the subcommand\n // surface instead of telling the user how to save the server. Intercept\n // the no-subcommand path and check existence first.\n const isHelpOnly =\n rest.length === 0 ||\n (rest.length === 1 && (rest[0] === \"--help\" || rest[0] === \"-h\"));\n\n (async () => {\n if (isHelpOnly) {\n const config = await getSession(perClientName);\n if (!config) {\n console.error(formatError(`Server '${perClientName}' not found.`));\n console.error(\"\");\n console.error(\"Connect to an MCP server and save it under this name:\");\n console.error(` mcp-use client connect ${perClientName} <url>`);\n console.error(\"\");\n console.error(\"See your saved servers with:\");\n console.error(\" mcp-use client list\");\n process.exit(1);\n }\n }\n await createPerClientCommand(perClientName).parseAsync(rest, {\n from: \"user\",\n });\n })().catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n console.error(formatError(message));\n process.exit(1);\n });\n} else {\n program.parse();\n}\n","import process from 'node:process';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport childProcess from 'node:child_process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport {\n\tisWsl,\n\tpowerShellPath,\n\tconvertWslPathToWindows,\n\tcanAccessPowerShell,\n\twslDefaultBrowser,\n} from 'wsl-utils';\nimport {executePowerShell} from 'powershell-utils';\nimport defineLazyProperty from 'define-lazy-prop';\nimport defaultBrowser, {_windowsBrowserProgIdMap} from 'default-browser';\nimport isInsideContainer from 'is-inside-container';\nimport isInSsh from 'is-in-ssh';\n\nconst fallbackAttemptSymbol = Symbol('fallbackAttempt');\n\n// Path to included `xdg-open`.\nconst __dirname = import.meta.url ? path.dirname(fileURLToPath(import.meta.url)) : '';\nconst localXdgOpenPath = path.join(__dirname, 'xdg-open');\n\nconst {platform, arch} = process;\n\nconst tryEachApp = async (apps, opener) => {\n\tif (apps.length === 0) {\n\t\t// No app was provided\n\t\treturn;\n\t}\n\n\tconst errors = [];\n\n\tfor (const app of apps) {\n\t\ttry {\n\t\t\treturn await opener(app); // eslint-disable-line no-await-in-loop\n\t\t} catch (error) {\n\t\t\terrors.push(error);\n\t\t}\n\t}\n\n\tthrow new AggregateError(errors, 'Failed to open in all supported apps');\n};\n\n// eslint-disable-next-line complexity\nconst baseOpen = async options => {\n\toptions = {\n\t\twait: false,\n\t\tbackground: false,\n\t\tnewInstance: false,\n\t\tallowNonzeroExitCode: false,\n\t\t...options,\n\t};\n\n\tconst isFallbackAttempt = options[fallbackAttemptSymbol] === true;\n\tdelete options[fallbackAttemptSymbol];\n\n\tif (Array.isArray(options.app)) {\n\t\treturn tryEachApp(options.app, singleApp => baseOpen({\n\t\t\t...options,\n\t\t\tapp: singleApp,\n\t\t\t[fallbackAttemptSymbol]: true,\n\t\t}));\n\t}\n\n\tlet {name: app, arguments: appArguments = []} = options.app ?? {};\n\tappArguments = [...appArguments];\n\n\tif (Array.isArray(app)) {\n\t\treturn tryEachApp(app, appName => baseOpen({\n\t\t\t...options,\n\t\t\tapp: {\n\t\t\t\tname: appName,\n\t\t\t\targuments: appArguments,\n\t\t\t},\n\t\t\t[fallbackAttemptSymbol]: true,\n\t\t}));\n\t}\n\n\tif (app === 'browser' || app === 'browserPrivate') {\n\t\t// IDs from default-browser for macOS and windows are the same.\n\t\t// IDs are lowercased to increase chances of a match.\n\t\tconst ids = {\n\t\t\t'com.google.chrome': 'chrome',\n\t\t\t'google-chrome.desktop': 'chrome',\n\t\t\t'com.brave.browser': 'brave',\n\t\t\t'org.mozilla.firefox': 'firefox',\n\t\t\t'firefox.desktop': 'firefox',\n\t\t\t'com.microsoft.msedge': 'edge',\n\t\t\t'com.microsoft.edge': 'edge',\n\t\t\t'com.microsoft.edgemac': 'edge',\n\t\t\t'microsoft-edge.desktop': 'edge',\n\t\t\t'com.apple.safari': 'safari',\n\t\t};\n\n\t\t// Incognito flags for each browser in `apps`.\n\t\tconst flags = {\n\t\t\tchrome: '--incognito',\n\t\t\tbrave: '--incognito',\n\t\t\tfirefox: '--private-window',\n\t\t\tedge: '--inPrivate',\n\t\t\t// Safari doesn't support private mode via command line\n\t\t};\n\n\t\tlet browser;\n\t\tif (isWsl) {\n\t\t\tconst progId = await wslDefaultBrowser();\n\t\t\tconst browserInfo = _windowsBrowserProgIdMap.get(progId);\n\t\t\tbrowser = browserInfo ?? {};\n\t\t} else {\n\t\t\tbrowser = await defaultBrowser();\n\t\t}\n\n\t\tif (browser.id in ids) {\n\t\t\tconst browserName = ids[browser.id.toLowerCase()];\n\n\t\t\tif (app === 'browserPrivate') {\n\t\t\t\t// Safari doesn't support private mode via command line\n\t\t\t\tif (browserName === 'safari') {\n\t\t\t\t\tthrow new Error('Safari doesn\\'t support opening in private mode via command line');\n\t\t\t\t}\n\n\t\t\t\tappArguments.push(flags[browserName]);\n\t\t\t}\n\n\t\t\treturn baseOpen({\n\t\t\t\t...options,\n\t\t\t\tapp: {\n\t\t\t\t\tname: apps[browserName],\n\t\t\t\t\targuments: appArguments,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tthrow new Error(`${browser.name} is not supported as a default browser`);\n\t}\n\n\tlet command;\n\tconst cliArguments = [];\n\tconst childProcessOptions = {};\n\n\t// Determine if we should use Windows/PowerShell behavior in WSL.\n\t// We only use Windows integration if PowerShell is actually accessible.\n\t// This allows the package to work in sandboxed WSL environments where Windows access is restricted.\n\tlet shouldUseWindowsInWsl = false;\n\tif (isWsl && !isInsideContainer() && !isInSsh && !app) {\n\t\tshouldUseWindowsInWsl = await canAccessPowerShell();\n\t}\n\n\tif (platform === 'darwin') {\n\t\tcommand = 'open';\n\n\t\tif (options.wait) {\n\t\t\tcliArguments.push('--wait-apps');\n\t\t}\n\n\t\tif (options.background) {\n\t\t\tcliArguments.push('--background');\n\t\t}\n\n\t\tif (options.newInstance) {\n\t\t\tcliArguments.push('--new');\n\t\t}\n\n\t\tif (app) {\n\t\t\tcliArguments.push('-a', app);\n\t\t}\n\t} else if (platform === 'win32' || shouldUseWindowsInWsl) {\n\t\tcommand = await powerShellPath();\n\n\t\tcliArguments.push(...executePowerShell.argumentsPrefix);\n\n\t\tif (!isWsl) {\n\t\t\tchildProcessOptions.windowsVerbatimArguments = true;\n\t\t}\n\n\t\t// Convert WSL Linux paths to Windows paths\n\t\tif (isWsl && options.target) {\n\t\t\toptions.target = await convertWslPathToWindows(options.target);\n\t\t}\n\n\t\t// Suppress PowerShell progress messages that are written to stderr\n\t\tconst encodedArguments = ['$ProgressPreference = \\'SilentlyContinue\\';', 'Start'];\n\n\t\tif (options.wait) {\n\t\t\tencodedArguments.push('-Wait');\n\t\t}\n\n\t\tif (app) {\n\t\t\tencodedArguments.push(executePowerShell.escapeArgument(app));\n\t\t\tif (options.target) {\n\t\t\t\tappArguments.push(options.target);\n\t\t\t}\n\t\t} else if (options.target) {\n\t\t\tencodedArguments.push(executePowerShell.escapeArgument(options.target));\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tappArguments = appArguments.map(argument => executePowerShell.escapeArgument(argument));\n\t\t\tencodedArguments.push('-ArgumentList', appArguments.join(','));\n\t\t}\n\n\t\t// Using Base64-encoded command, accepted by PowerShell, to allow special characters.\n\t\toptions.target = executePowerShell.encodeCommand(encodedArguments.join(' '));\n\n\t\tif (!options.wait) {\n\t\t\t// PowerShell will keep the parent process alive unless stdio is ignored.\n\t\t\tchildProcessOptions.stdio = 'ignore';\n\t\t}\n\t} else {\n\t\tif (app) {\n\t\t\tcommand = app;\n\t\t} else {\n\t\t\t// When bundled by Webpack, there's no actual package file path and no local `xdg-open`.\n\t\t\tconst isBundled = !__dirname || __dirname === '/';\n\n\t\t\t// Check if local `xdg-open` exists and is executable.\n\t\t\tlet exeLocalXdgOpen = false;\n\t\t\ttry {\n\t\t\t\tawait fs.access(localXdgOpenPath, fsConstants.X_OK);\n\t\t\t\texeLocalXdgOpen = true;\n\t\t\t} catch {}\n\n\t\t\tconst useSystemXdgOpen = process.versions.electron\n\t\t\t\t?? (platform === 'android' || isBundled || !exeLocalXdgOpen);\n\t\t\tcommand = useSystemXdgOpen ? 'xdg-open' : localXdgOpenPath;\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tcliArguments.push(...appArguments);\n\t\t}\n\n\t\tif (!options.wait) {\n\t\t\t// `xdg-open` will block the process unless stdio is ignored\n\t\t\t// and it's detached from the parent even if it's unref'd.\n\t\t\tchildProcessOptions.stdio = 'ignore';\n\t\t\tchildProcessOptions.detached = true;\n\t\t}\n\t}\n\n\tif (platform === 'darwin' && appArguments.length > 0) {\n\t\tcliArguments.push('--args', ...appArguments);\n\t}\n\n\t// IMPORTANT: On macOS, the target MUST come AFTER '--args'.\n\t// When using --args, ALL following arguments are passed to the app.\n\t// Example: open -a \"chrome\" --args --incognito https://site.com\n\t// This passes BOTH --incognito AND https://site.com to Chrome.\n\t// Without this order, Chrome won't open in incognito. See #332.\n\tif (options.target) {\n\t\tcliArguments.push(options.target);\n\t}\n\n\tconst subprocess = childProcess.spawn(command, cliArguments, childProcessOptions);\n\n\tif (options.wait) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsubprocess.once('error', reject);\n\n\t\t\tsubprocess.once('close', exitCode => {\n\t\t\t\tif (!options.allowNonzeroExitCode && exitCode !== 0) {\n\t\t\t\t\treject(new Error(`Exited with code ${exitCode}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresolve(subprocess);\n\t\t\t});\n\t\t});\n\t}\n\n\t// When we're in a fallback attempt, we need to detect launch failures before trying the next app.\n\t// Wait for the close event to check the exit code before unreffing.\n\t// The launcher (open/xdg-open/PowerShell) exits quickly (~10-30ms) even on success.\n\tif (isFallbackAttempt) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsubprocess.once('error', reject);\n\n\t\t\tsubprocess.once('spawn', () => {\n\t\t\t\t// Keep error handler active for post-spawn errors\n\t\t\t\tsubprocess.once('close', exitCode => {\n\t\t\t\t\tsubprocess.off('error', reject);\n\n\t\t\t\t\tif (exitCode !== 0) {\n\t\t\t\t\t\treject(new Error(`Exited with code ${exitCode}`));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tsubprocess.unref();\n\t\t\t\t\tresolve(subprocess);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tsubprocess.unref();\n\n\t// Handle spawn errors before the caller can attach listeners.\n\t// This prevents unhandled error events from crashing the process.\n\treturn new Promise((resolve, reject) => {\n\t\tsubprocess.once('error', reject);\n\n\t\t// Wait for the subprocess to spawn before resolving.\n\t\t// This ensures the process is established before the caller continues,\n\t\t// preventing issues when process.exit() is called immediately after.\n\t\tsubprocess.once('spawn', () => {\n\t\t\tsubprocess.off('error', reject);\n\t\t\tresolve(subprocess);\n\t\t});\n\t});\n};\n\nconst open = (target, options) => {\n\tif (typeof target !== 'string') {\n\t\tthrow new TypeError('Expected a `target`');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\ttarget,\n\t});\n};\n\nexport const openApp = (name, options) => {\n\tif (typeof name !== 'string' && !Array.isArray(name)) {\n\t\tthrow new TypeError('Expected a valid `name`');\n\t}\n\n\tconst {arguments: appArguments = []} = options ?? {};\n\tif (appArguments !== undefined && appArguments !== null && !Array.isArray(appArguments)) {\n\t\tthrow new TypeError('Expected `appArguments` as Array type');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\tapp: {\n\t\t\tname,\n\t\t\targuments: appArguments,\n\t\t},\n\t});\n};\n\nfunction detectArchBinary(binary) {\n\tif (typeof binary === 'string' || Array.isArray(binary)) {\n\t\treturn binary;\n\t}\n\n\tconst {[arch]: archBinary} = binary;\n\n\tif (!archBinary) {\n\t\tthrow new Error(`${arch} is not supported`);\n\t}\n\n\treturn archBinary;\n}\n\nfunction detectPlatformBinary({[platform]: platformBinary}, {wsl} = {}) {\n\tif (wsl && isWsl) {\n\t\treturn detectArchBinary(wsl);\n\t}\n\n\tif (!platformBinary) {\n\t\tthrow new Error(`${platform} is not supported`);\n\t}\n\n\treturn detectArchBinary(platformBinary);\n}\n\nexport const apps = {\n\tbrowser: 'browser',\n\tbrowserPrivate: 'browserPrivate',\n};\n\ndefineLazyProperty(apps, 'chrome', () => detectPlatformBinary({\n\tdarwin: 'google chrome',\n\twin32: 'chrome',\n\t// `chromium-browser` is the older deb package name used by Ubuntu/Debian before snap.\n\tlinux: ['google-chrome', 'google-chrome-stable', 'chromium', 'chromium-browser'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe',\n\t\tx64: ['/mnt/c/Program Files/Google/Chrome/Application/chrome.exe', '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'brave', () => detectPlatformBinary({\n\tdarwin: 'brave browser',\n\twin32: 'brave',\n\tlinux: ['brave-browser', 'brave'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe',\n\t\tx64: ['/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe', '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'firefox', () => detectPlatformBinary({\n\tdarwin: 'firefox',\n\twin32: String.raw`C:\\Program Files\\Mozilla Firefox\\firefox.exe`,\n\tlinux: 'firefox',\n}, {\n\twsl: '/mnt/c/Program Files/Mozilla Firefox/firefox.exe',\n}));\n\ndefineLazyProperty(apps, 'edge', () => detectPlatformBinary({\n\tdarwin: 'microsoft edge',\n\twin32: 'msedge',\n\tlinux: ['microsoft-edge', 'microsoft-edge-dev'],\n}, {\n\twsl: '/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe',\n}));\n\ndefineLazyProperty(apps, 'safari', () => detectPlatformBinary({\n\tdarwin: 'Safari',\n}));\n\nexport default open;\n","import {promisify} from 'node:util';\nimport childProcess from 'node:child_process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport isWsl from 'is-wsl';\nimport {powerShellPath as windowsPowerShellPath, executePowerShell} from 'powershell-utils';\nimport {parseMountPointFromConfig} from './utilities.js';\n\nconst execFile = promisify(childProcess.execFile);\n\nexport const wslDrivesMountPoint = (() => {\n\t// Default value for \"root\" param\n\t// according to https://docs.microsoft.com/en-us/windows/wsl/wsl-config\n\tconst defaultMountPoint = '/mnt/';\n\n\tlet mountPoint;\n\n\treturn async function () {\n\t\tif (mountPoint) {\n\t\t\t// Return memoized mount point value\n\t\t\treturn mountPoint;\n\t\t}\n\n\t\tconst configFilePath = '/etc/wsl.conf';\n\n\t\tlet isConfigFileExists = false;\n\t\ttry {\n\t\t\tawait fs.access(configFilePath, fsConstants.F_OK);\n\t\t\tisConfigFileExists = true;\n\t\t} catch {}\n\n\t\tif (!isConfigFileExists) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tconst configContent = await fs.readFile(configFilePath, {encoding: 'utf8'});\n\t\tconst parsedMountPoint = parseMountPointFromConfig(configContent);\n\n\t\tif (parsedMountPoint === undefined) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tmountPoint = parsedMountPoint;\n\t\tmountPoint = mountPoint.endsWith('/') ? mountPoint : `${mountPoint}/`;\n\n\t\treturn mountPoint;\n\t};\n})();\n\nexport const powerShellPathFromWsl = async () => {\n\tconst mountPoint = await wslDrivesMountPoint();\n\treturn `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`;\n};\n\nexport const powerShellPath = isWsl ? powerShellPathFromWsl : windowsPowerShellPath;\n\n// Cache for PowerShell accessibility check\nlet canAccessPowerShellPromise;\n\nexport const canAccessPowerShell = async () => {\n\tcanAccessPowerShellPromise ??= (async () => {\n\t\ttry {\n\t\t\tconst psPath = await powerShellPath();\n\t\t\tawait fs.access(psPath, fsConstants.X_OK);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\t// PowerShell is not accessible (either doesn't exist, no execute permission, or other error)\n\t\t\treturn false;\n\t\t}\n\t})();\n\n\treturn canAccessPowerShellPromise;\n};\n\nexport const wslDefaultBrowser = async () => {\n\tconst psPath = await powerShellPath();\n\tconst command = String.raw`(Get-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice\").ProgId`;\n\n\tconst {stdout} = await executePowerShell(command, {powerShellPath: psPath});\n\n\treturn stdout.trim();\n};\n\nexport const convertWslPathToWindows = async path => {\n\t// Don't convert URLs\n\tif (/^[a-z]+:\\/\\//i.test(path)) {\n\t\treturn path;\n\t}\n\n\ttry {\n\t\tconst {stdout} = await execFile('wslpath', ['-aw', path], {encoding: 'utf8'});\n\t\treturn stdout.trim();\n\t} catch {\n\t\t// If wslpath fails, return the original path\n\t\treturn path;\n\t}\n};\n\nexport {default as isWsl} from 'is-wsl';\n","import process from 'node:process';\nimport os from 'node:os';\nimport fs from 'node:fs';\nimport isInsideContainer from 'is-inside-container';\n\nconst isWsl = () => {\n\tif (process.platform !== 'linux') {\n\t\treturn false;\n\t}\n\n\tif (os.release().toLowerCase().includes('microsoft')) {\n\t\tif (isInsideContainer()) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ttry {\n\t\treturn fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft')\n\t\t\t? !isInsideContainer() : false;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport default process.env.__IS_WSL_TEST__ ? isWsl : isWsl();\n","import fs from 'node:fs';\nimport isDocker from 'is-docker';\n\nlet cachedResult;\n\n// Podman detection\nconst hasContainerEnv = () => {\n\ttry {\n\t\tfs.statSync('/run/.containerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport default function isInsideContainer() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (cachedResult === undefined) {\n\t\tcachedResult = hasContainerEnv() || isDocker();\n\t}\n\n\treturn cachedResult;\n}\n","import fs from 'node:fs';\n\nlet isDockerCached;\n\nfunction hasDockerEnv() {\n\ttry {\n\t\tfs.statSync('/.dockerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasDockerCGroup() {\n\ttry {\n\t\treturn fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker');\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport default function isDocker() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (isDockerCached === undefined) {\n\t\tisDockerCached = hasDockerEnv() || hasDockerCGroup();\n\t}\n\n\treturn isDockerCached;\n}\n","import process from 'node:process';\nimport {Buffer} from 'node:buffer';\nimport {promisify} from 'node:util';\nimport childProcess from 'node:child_process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\n\nconst execFile = promisify(childProcess.execFile);\n\nexport const powerShellPath = () => `${process.env.SYSTEMROOT || process.env.windir || String.raw`C:\\Windows`}\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe`;\n\n// Cache for PowerShell accessibility check\nlet canAccessCache;\n\nexport const canAccessPowerShell = async () => {\n\tcanAccessCache ??= (async () => {\n\t\ttry {\n\t\t\tawait fs.access(powerShellPath(), fsConstants.X_OK);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t})();\n\n\treturn canAccessCache;\n};\n\nexport const executePowerShell = async (command, options = {}) => {\n\tconst {\n\t\tpowerShellPath: psPath,\n\t\t...execFileOptions\n\t} = options;\n\n\tconst encodedCommand = executePowerShell.encodeCommand(command);\n\n\treturn execFile(\n\t\tpsPath ?? powerShellPath(),\n\t\t[\n\t\t\t...executePowerShell.argumentsPrefix,\n\t\t\tencodedCommand,\n\t\t],\n\t\t{\n\t\t\tencoding: 'utf8',\n\t\t\t...execFileOptions,\n\t\t},\n\t);\n};\n\nexecutePowerShell.argumentsPrefix = [\n\t'-NoProfile',\n\t'-NonInteractive',\n\t'-ExecutionPolicy',\n\t'Bypass',\n\t'-EncodedCommand',\n];\n\nexecutePowerShell.encodeCommand = command => Buffer.from(command, 'utf16le').toString('base64');\n\nexecutePowerShell.escapeArgument = value => `'${String(value).replaceAll('\\'', '\\'\\'')}'`;\n","export function parseMountPointFromConfig(content) {\n\tfor (const line of content.split('\\n')) {\n\t\t// Skip comment lines\n\t\tif (/^\\s*#/.test(line)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Match root at start of line (after optional whitespace)\n\t\tconst match = /^\\s*root\\s*=\\s*(?<mountPoint>\"[^\"]*\"|'[^']*'|[^#]*)/.exec(line);\n\t\tif (!match) {\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn match.groups.mountPoint\n\t\t\t.trim()\n\t\t\t// Strip surrounding quotes\n\t\t\t.replaceAll(/^[\"']|[\"']$/g, '');\n\t}\n}\n","export default function defineLazyProperty(object, propertyName, valueGetter) {\n\tconst define = value => Object.defineProperty(object, propertyName, {value, enumerable: true, writable: true});\n\n\tObject.defineProperty(object, propertyName, {\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t\tget() {\n\t\t\tconst result = valueGetter();\n\t\t\tdefine(result);\n\t\t\treturn result;\n\t\t},\n\t\tset(value) {\n\t\t\tdefine(value);\n\t\t}\n\t});\n\n\treturn object;\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\nimport defaultBrowserId from 'default-browser-id';\nimport bundleName from 'bundle-name';\nimport windows from './windows.js';\n\nexport {_windowsBrowserProgIdMap} from './windows.js';\n\nconst execFileAsync = promisify(execFile);\n\n// Inlined: https://github.com/sindresorhus/titleize/blob/main/index.js\nconst titleize = string => string.toLowerCase().replaceAll(/(?:^|\\s|-)\\S/g, x => x.toUpperCase());\n\nexport default async function defaultBrowser() {\n\tif (process.platform === 'darwin') {\n\t\tconst id = await defaultBrowserId();\n\t\tconst name = await bundleName(id);\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'linux') {\n\t\tconst {stdout} = await execFileAsync('xdg-mime', ['query', 'default', 'x-scheme-handler/http']);\n\t\tconst id = stdout.trim();\n\t\tconst name = titleize(id.replace(/.desktop$/, '').replace('-', ' '));\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn windows();\n\t}\n\n\tthrow new Error('Only macOS, Linux, and Windows are supported');\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport default async function defaultBrowserId() {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst {stdout} = await execFileAsync('defaults', ['read', 'com.apple.LaunchServices/com.apple.launchservices.secure', 'LSHandlers']);\n\n\t// `(?!-)` is to prevent matching `LSHandlerRoleAll = \"-\";`.\n\tconst match = /LSHandlerRoleAll = \"(?!-)(?<id>[^\"]+?)\";\\s+?LSHandlerURLScheme = (?:http|https);/.exec(stdout);\n\n\tconst browserId = match?.groups.id ?? 'com.apple.Safari';\n\n\t// Correct the case for Safari's bundle identifier\n\tif (browserId === 'com.apple.safari') {\n\t\treturn 'com.apple.Safari';\n\t}\n\n\treturn browserId;\n}\n","import process from 'node:process';\nimport {promisify} from 'node:util';\nimport {execFile, execFileSync} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport async function runAppleScript(script, {humanReadableOutput = true, signal} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst execOptions = {};\n\tif (signal) {\n\t\texecOptions.signal = signal;\n\t}\n\n\tconst {stdout} = await execFileAsync('osascript', ['-e', script, outputArguments], execOptions);\n\treturn stdout.trim();\n}\n\nexport function runAppleScriptSync(script, {humanReadableOutput = true} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst stdout = execFileSync('osascript', ['-e', script, ...outputArguments], {\n\t\tencoding: 'utf8',\n\t\tstdio: ['ignore', 'pipe', 'ignore'],\n\t\ttimeout: 500,\n\t});\n\n\treturn stdout.trim();\n}\n","import {runAppleScript} from 'run-applescript';\n\nexport default async function bundleName(bundleId) {\n\treturn runAppleScript(`tell application \"Finder\" to set app_path to application file id \"${bundleId}\" as string\\ntell application \"System Events\" to get value of property list item \"CFBundleName\" of property list file (app_path & \":Contents:Info.plist\")`);\n}\n","import {promisify} from 'node:util';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\n// TODO: Fix the casing of bundle identifiers in the next major version.\n\n// Windows doesn't have browser IDs in the same way macOS/Linux does so we give fake\n// ones that look real and match the macOS/Linux versions for cross-platform apps.\nconst windowsBrowserProgIds = {\n\tMSEdgeHTM: {name: 'Edge', id: 'com.microsoft.edge'}, // The missing `L` is correct.\n\tMSEdgeBHTML: {name: 'Edge Beta', id: 'com.microsoft.edge.beta'},\n\tMSEdgeDHTML: {name: 'Edge Dev', id: 'com.microsoft.edge.dev'},\n\tAppXq0fevzme2pys62n3e0fbqa7peapykr8v: {name: 'Edge', id: 'com.microsoft.edge.old'},\n\tChromeHTML: {name: 'Chrome', id: 'com.google.chrome'},\n\tChromeBHTML: {name: 'Chrome Beta', id: 'com.google.chrome.beta'},\n\tChromeDHTML: {name: 'Chrome Dev', id: 'com.google.chrome.dev'},\n\tChromiumHTM: {name: 'Chromium', id: 'org.chromium.Chromium'},\n\tBraveHTML: {name: 'Brave', id: 'com.brave.Browser'},\n\tBraveBHTML: {name: 'Brave Beta', id: 'com.brave.Browser.beta'},\n\tBraveDHTML: {name: 'Brave Dev', id: 'com.brave.Browser.dev'},\n\tBraveSSHTM: {name: 'Brave Nightly', id: 'com.brave.Browser.nightly'},\n\tFirefoxURL: {name: 'Firefox', id: 'org.mozilla.firefox'},\n\tOperaStable: {name: 'Opera', id: 'com.operasoftware.Opera'},\n\tVivaldiHTM: {name: 'Vivaldi', id: 'com.vivaldi.Vivaldi'},\n\t'IE.HTTP': {name: 'Internet Explorer', id: 'com.microsoft.ie'},\n};\n\nexport const _windowsBrowserProgIdMap = new Map(Object.entries(windowsBrowserProgIds));\n\nexport class UnknownBrowserError extends Error {}\n\nexport default async function defaultBrowser(_execFileAsync = execFileAsync) {\n\tconst {stdout} = await _execFileAsync('reg', [\n\t\t'QUERY',\n\t\t' HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Associations\\\\UrlAssociations\\\\http\\\\UserChoice',\n\t\t'/v',\n\t\t'ProgId',\n\t]);\n\n\tconst match = /ProgId\\s*REG_SZ\\s*(?<id>\\S+)/.exec(stdout);\n\tif (!match) {\n\t\tthrow new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`);\n\t}\n\n\tconst {id} = match.groups;\n\n\t// Windows can append a hash suffix to ProgIds using a dot or hyphen\n\t// (e.g., `ChromeHTML.ABC123`, `FirefoxURL-6F193CCC56814779`).\n\t// Try exact match first, then try without the suffix.\n\tconst dotIndex = id.lastIndexOf('.');\n\tconst hyphenIndex = id.lastIndexOf('-');\n\tconst baseIdByDot = dotIndex === -1 ? undefined : id.slice(0, dotIndex);\n\tconst baseIdByHyphen = hyphenIndex === -1 ? undefined : id.slice(0, hyphenIndex);\n\n\treturn windowsBrowserProgIds[id] ?? windowsBrowserProgIds[baseIdByDot] ?? windowsBrowserProgIds[baseIdByHyphen] ?? {name: id, id};\n}\n","import process from 'node:process';\n\nconst isInSsh = Boolean(process.env.SSH_CONNECTION\n\t|| process.env.SSH_CLIENT\n\t|| process.env.SSH_TTY);\n\nexport default isInSsh;\n","import { promises as fs } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface McpConfig {\n apiKey?: string;\n apiUrl?: string;\n orgId?: string;\n orgName?: string;\n orgSlug?: string;\n /** @deprecated Use orgId. Read for backward compat with old config files. */\n profileId?: string;\n /** @deprecated Use orgName. */\n profileName?: string;\n /** @deprecated Use orgSlug. */\n profileSlug?: string;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), \".mcp-use\");\nconst CONFIG_FILE = path.join(CONFIG_DIR, \"config.json\");\n\n// Backend API URL (where /api/v1 endpoints are)\nconst DEFAULT_API_URL = process.env.MCP_API_URL\n ? process.env.MCP_API_URL.replace(/\\/api\\/v1$/, \"\") + \"/api/v1\" // Ensure /api/v1 suffix\n : \"https://cloud.mcp-use.com/api/v1\";\n\n// Frontend/Web URL (where /auth/cli page is)\nconst DEFAULT_WEB_URL = process.env.MCP_WEB_URL\n ? process.env.MCP_WEB_URL\n : \"https://manufact.com\";\n\n/**\n * Ensure config directory exists\n */\nasync function ensureConfigDir(): Promise<void> {\n try {\n await fs.mkdir(CONFIG_DIR, { recursive: true });\n } catch (error) {\n // Ignore error if directory already exists\n }\n}\n\n/**\n * Read config from disk, migrating legacy `profile*` keys to `org*`.\n */\nexport async function readConfig(): Promise<McpConfig> {\n try {\n const content = await fs.readFile(CONFIG_FILE, \"utf-8\");\n const raw = JSON.parse(content) as McpConfig;\n return {\n ...raw,\n orgId: raw.orgId ?? raw.profileId,\n orgName: raw.orgName ?? raw.profileName,\n orgSlug: raw.orgSlug ?? raw.profileSlug,\n };\n } catch (error) {\n return {};\n }\n}\n\n/**\n * Write config to disk. Persists only the new `org*` keys and removes legacy `profile*` keys.\n */\nexport async function writeConfig(config: McpConfig): Promise<void> {\n await ensureConfigDir();\n const { profileId: _a, profileName: _b, profileSlug: _c, ...clean } = config;\n await fs.writeFile(CONFIG_FILE, JSON.stringify(clean, null, 2), \"utf-8\");\n}\n\n/**\n * Delete config file\n */\nexport async function deleteConfig(): Promise<void> {\n try {\n await fs.unlink(CONFIG_FILE);\n } catch (error) {\n // Ignore error if file doesn't exist\n }\n}\n\n/**\n * Get API URL from config or use default\n */\nexport async function getApiUrl(): Promise<string> {\n const config = await readConfig();\n return config.apiUrl || DEFAULT_API_URL;\n}\n\n/**\n * Get API key from config\n */\nexport async function getApiKey(): Promise<string | null> {\n const config = await readConfig();\n return config.apiKey || null;\n}\n\n/**\n * Check if user is logged in\n */\nexport async function isLoggedIn(): Promise<boolean> {\n const apiKey = await getApiKey();\n return !!apiKey;\n}\n\n/**\n * Get the stored organization ID from config\n */\nexport async function getOrgId(): Promise<string | null> {\n const config = await readConfig();\n return config.orgId || null;\n}\n\n/**\n * Get web URL (for browser-based auth)\n * This is the frontend URL where /device verification page lives\n */\nexport async function getWebUrl(): Promise<string> {\n return DEFAULT_WEB_URL;\n}\n\n/**\n * Derive the auth base URL from the API URL.\n * Better Auth endpoints live at /api/auth/*, not under /api/v1/.\n * e.g. \"http://localhost:8000/api/v1\" -> \"http://localhost:8000\"\n */\nexport async function getAuthBaseUrl(): Promise<string> {\n const apiUrl = await getApiUrl();\n return apiUrl.replace(/\\/api\\/v1$/, \"\");\n}\n","import { getApiKey, getApiUrl, getAuthBaseUrl, getOrgId } from \"./config.js\";\n\nexport class GitHubAuthRequiredError extends Error {\n readonly authorizeUrl: string;\n constructor(message: string, authorizeUrl: string) {\n super(message);\n this.name = \"GitHubAuthRequiredError\";\n this.authorizeUrl = authorizeUrl;\n }\n}\n\n/** Thrown when the API returns 401 (invalid or expired API key for this backend). */\nexport class ApiUnauthorizedError extends Error {\n readonly status = 401 as const;\n constructor(\n message = \"Your session has expired or your API key is invalid.\"\n ) {\n super(message);\n this.name = \"ApiUnauthorizedError\";\n }\n}\n\nexport interface OrgInfo {\n id: string;\n name: string;\n slug: string | null;\n role: string;\n}\n\nexport interface AuthTestResponse {\n message: string;\n user_id: string;\n email: string;\n orgs: OrgInfo[];\n default_org_id: string | null;\n}\n\n/** Wire format returned by GET /test-auth (cli-compat route). */\ninterface AuthTestWireResponse {\n message: string;\n user_id: string;\n email: string;\n profiles: Array<{\n id: string;\n profile_name: string;\n slug: string | null;\n role: string;\n }>;\n default_profile_id: string | null;\n}\n\n// ── Server creation ────────────────────────────────────────────────\n\nexport interface CreateServerBody {\n type: \"github\";\n organizationId: string;\n installationId: string;\n name: string;\n repoFullName: string;\n branch?: string;\n rootDir?: string;\n port?: number;\n buildCommand?: string;\n startCommand?: string;\n env?: Record<string, string>;\n description?: string;\n tags?: string[];\n region?: string;\n}\n\nexport interface CreateServerResponse {\n server: { id: string; slug: string | null };\n deploymentId: string | null;\n}\n\n/** Connected GitHub repository (subset of OpenAPI server payload). */\nexport interface CloudServerConnectedRepository {\n id: string;\n repoFullName: string;\n productionBranch: string;\n isActive: boolean;\n userId: string;\n githubInstallationId: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/** Server record from `GET /servers` or `GET /servers/{id}` (fields used by CLI). */\nexport interface CloudServer {\n id: string;\n slug: string | null;\n organizationId: string;\n userId: string | null;\n connectedRepositoryId: string;\n connectedRepository?: CloudServerConnectedRepository;\n name: string | null;\n description: string | null;\n tags?: string[];\n config?: unknown;\n createdAt: string;\n updatedAt: string;\n displayPreferences?: { icon?: string; color?: string };\n status: string;\n latestDeploymentStatus: string | null;\n activeDeploymentId: string | null;\n previousDeploymentId: string | null;\n region: string;\n providerRegion?: string;\n runProvider?: string;\n buildProvider?: string;\n /** Public MCP endpoint when provisioned (preferred over synthesizing from id/slug). */\n mcpUrl?: string | null;\n domains?: unknown[];\n deployments?: unknown[];\n _count?: { deployments?: number };\n}\n\n// ── Deployments ────────────────────────────────────────────────────\n\nexport interface CreateDeploymentInput {\n serverId: string;\n name?: string;\n branch?: string;\n commitSha?: string;\n commitMessage?: string;\n trigger?: \"manual\" | \"webhook\" | \"redeploy\" | \"rollback\";\n prNumber?: number;\n}\n\nexport interface CreateDeploymentResponse {\n id: string;\n}\n\nexport interface Deployment {\n id: string;\n userId: string;\n name: string;\n source: unknown;\n status: \"pending\" | \"building\" | \"running\" | \"stopped\" | \"failed\";\n port: number | null;\n healthCheckPath: string | null;\n provider: string;\n appName: string;\n error: string | null;\n gitCommitSha: string | null;\n gitBranch: string | null;\n gitCommitMessage: string | null;\n isProductionDeployment: boolean | null;\n deploymentTrigger: string | null;\n serverId: string | null;\n createdAt: string;\n updatedAt: string;\n buildStartedAt: string | null;\n buildCompletedAt: string | null;\n archivedAt: string | null;\n mcpUrl?: string;\n}\n\nexport interface BuildLogsResponse {\n logs: string;\n offset: number;\n totalLength: number;\n status: string;\n}\n\n// ── GitHub ──────────────────────────────────────────────────────────\n\nexport interface GitHubInstallation {\n id: string;\n installation_id: string;\n account_login: string;\n account_type: string;\n}\n\nexport interface GitHubConnectionStatus {\n is_connected: boolean;\n installations?: GitHubInstallation[];\n}\n\nexport interface GitHubRepo {\n id: number;\n name: string;\n full_name: string;\n private: boolean;\n owner: {\n login: string;\n };\n}\n\nexport interface GitHubReposResponse {\n user: {\n login: string;\n id: number;\n avatar_url: string;\n };\n repos: GitHubRepo[];\n}\n\n// ── Env Variables ───────────────────────────────────────────────────\n\nexport type EnvEnvironment = \"production\" | \"preview\" | \"development\";\n\nexport interface EnvVariable {\n id: string;\n serverId: string;\n key: string;\n value: string;\n environments: EnvEnvironment[];\n sensitive: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateEnvVariableBody {\n key: string;\n value: string;\n environments?: EnvEnvironment[];\n sensitive?: boolean;\n}\n\nexport interface UpdateEnvVariableBody {\n value?: string;\n environments?: EnvEnvironment[];\n sensitive?: boolean;\n}\n\n// ── API client ─────────────────────────────────────────────────────\n\nexport class McpUseAPI {\n private baseUrl: string;\n private apiKey: string | undefined;\n private orgId: string | undefined;\n\n constructor(baseUrl?: string, apiKey?: string, orgId?: string) {\n this.baseUrl = baseUrl || \"\";\n this.apiKey = apiKey;\n this.orgId = orgId;\n }\n\n static async create(): Promise<McpUseAPI> {\n const baseUrl = await getApiUrl();\n const apiKey = await getApiKey();\n const orgId = await getOrgId();\n return new McpUseAPI(baseUrl, apiKey ?? undefined, orgId ?? undefined);\n }\n\n setOrgId(orgId: string): void {\n this.orgId = orgId;\n }\n\n private async request<T>(\n endpoint: string,\n options: {\n method?: string;\n headers?: Record<string, string>;\n body?: string;\n timeout?: number;\n } = {}\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...((options.headers as Record<string, string>) || {}),\n };\n\n if (this.apiKey) {\n headers[\"x-api-key\"] = this.apiKey;\n }\n\n if (this.orgId) {\n headers[\"x-profile-id\"] = this.orgId;\n }\n\n const timeout = options.timeout || 30000;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 401) {\n throw new ApiUnauthorizedError();\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n try {\n const parsed = JSON.parse(errorText);\n if (parsed.code === \"GITHUB_AUTH_REQUIRED\" && parsed.authorizeUrl) {\n throw new GitHubAuthRequiredError(\n parsed.error || \"GitHub authorization required\",\n parsed.authorizeUrl\n );\n }\n } catch (e) {\n if (e instanceof GitHubAuthRequiredError) throw e;\n }\n throw new Error(`API request failed: ${response.status} ${errorText}`);\n }\n\n return response.json() as Promise<T>;\n } catch (error: any) {\n clearTimeout(timeoutId);\n if (error.name === \"AbortError\") {\n throw new Error(`Request timeout after ${timeout / 1000}s.`);\n }\n throw error;\n }\n }\n\n /**\n * Create a persistent API key using a Better Auth access token.\n */\n async createApiKeyWithAccessToken(\n accessToken: string,\n name: string = \"CLI\"\n ): Promise<{ key: string }> {\n const authBase = await getAuthBaseUrl();\n const url = `${authBase}/api/auth/api-key/create`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify({ name, prefix: \"mcp_\" }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to create API key: ${response.status} ${error}`);\n }\n\n return response.json() as Promise<{ key: string }>;\n }\n\n // ── Auth ────────────────────────────────────────────────────────\n\n async testAuth(): Promise<AuthTestResponse> {\n const wire = await this.request<AuthTestWireResponse>(\"/test-auth\");\n return {\n message: wire.message,\n user_id: wire.user_id,\n email: wire.email,\n default_org_id: wire.default_profile_id,\n orgs: (wire.profiles ?? []).map((p) => ({\n id: p.id,\n name: p.profile_name,\n slug: p.slug,\n role: p.role,\n })),\n };\n }\n\n async setDefaultOrg(orgId: string): Promise<void> {\n await this.request(`/organizations/${orgId}/set-default`, {\n method: \"POST\",\n });\n }\n\n // ── Organization ID resolution ──────────────────────────────────\n\n async resolveOrganizationId(): Promise<string> {\n if (this.orgId) return this.orgId;\n const auth = await this.testAuth();\n const id = auth.default_org_id;\n if (!id) {\n throw new Error(\n \"No organization set. Run `mcp-use org switch` or use --org to specify one.\"\n );\n }\n return id;\n }\n\n // ── Servers ─────────────────────────────────────────────────────\n\n async createServer(body: CreateServerBody): Promise<CreateServerResponse> {\n return this.request<CreateServerResponse>(\"/servers\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n\n async listServers(params?: {\n organizationId?: string;\n limit?: number;\n skip?: number;\n sort?: string;\n }): Promise<CloudServer[]> {\n const search = new URLSearchParams();\n if (params?.organizationId) {\n search.set(\"organizationId\", params.organizationId);\n }\n if (params?.limit != null) {\n search.set(\"limit\", String(params.limit));\n }\n if (params?.skip != null) {\n search.set(\"skip\", String(params.skip));\n }\n if (params?.sort) {\n search.set(\"sort\", params.sort);\n }\n const q = search.toString();\n return this.request<CloudServer[]>(`/servers${q ? `?${q}` : \"\"}`);\n }\n\n async getServer(idOrSlug: string): Promise<CloudServer> {\n const path = encodeURIComponent(idOrSlug);\n return this.request<CloudServer>(`/servers/${path}`);\n }\n\n async deleteServer(id: string): Promise<void> {\n await this.request<{ success: boolean }>(\n `/servers/${encodeURIComponent(id)}`,\n {\n method: \"DELETE\",\n }\n );\n }\n\n // ── Env Variables ────────────────────────────────────────────────\n\n async listEnvVariables(serverId: string): Promise<EnvVariable[]> {\n return this.request<EnvVariable[]>(\n `/servers/${encodeURIComponent(serverId)}/env-variables`\n );\n }\n\n async createEnvVariable(\n serverId: string,\n body: CreateEnvVariableBody\n ): Promise<EnvVariable> {\n return this.request<EnvVariable>(\n `/servers/${encodeURIComponent(serverId)}/env-variables`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n }\n );\n }\n\n async updateEnvVariable(\n serverId: string,\n varId: string,\n body: UpdateEnvVariableBody\n ): Promise<EnvVariable> {\n return this.request<EnvVariable>(\n `/servers/${encodeURIComponent(serverId)}/env-variables/${encodeURIComponent(varId)}`,\n {\n method: \"PATCH\",\n body: JSON.stringify(body),\n }\n );\n }\n\n async deleteEnvVariable(serverId: string, varId: string): Promise<void> {\n await this.request<{ success: boolean }>(\n `/servers/${encodeURIComponent(serverId)}/env-variables/${encodeURIComponent(varId)}`,\n { method: \"DELETE\" }\n );\n }\n\n // ── Deployments ─────────────────────────────────────────────────\n\n async createDeployment(\n input: CreateDeploymentInput\n ): Promise<CreateDeploymentResponse> {\n return this.request<CreateDeploymentResponse>(\"/deployments\", {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n }\n\n async getDeployment(deploymentId: string): Promise<Deployment> {\n return this.request<Deployment>(`/deployments/${deploymentId}`);\n }\n\n async listDeployments(): Promise<Deployment[]> {\n return this.request<Deployment[]>(\"/deployments\");\n }\n\n async deleteDeployment(deploymentId: string): Promise<void> {\n await this.request(`/deployments/${deploymentId}`, {\n method: \"DELETE\",\n });\n }\n\n async stopDeployment(deploymentId: string): Promise<void> {\n await this.request(`/deployments/${deploymentId}/stop`, {\n method: \"POST\",\n });\n }\n\n async getDeploymentLogs(\n deploymentId: string,\n lines: number = 500\n ): Promise<string> {\n const resp = await this.request<{ logs: string }>(\n `/deployments/${deploymentId}/logs?lines=${lines}`,\n { timeout: 60000 }\n );\n return resp.logs;\n }\n\n async getDeploymentBuildLogs(\n deploymentId: string,\n offset: number = 0\n ): Promise<BuildLogsResponse> {\n return this.request<BuildLogsResponse>(\n `/deployments/${deploymentId}/build-logs?offset=${offset}`,\n { timeout: 60000 }\n );\n }\n\n // ── GitHub ──────────────────────────────────────────────────────\n\n async getGitHubConnectionStatus(): Promise<GitHubConnectionStatus> {\n const orgId = await this.resolveOrganizationId();\n const resp = await this.request<{\n installations: Array<{\n id: string;\n installationId: string;\n account: {\n login: string;\n avatar_url: string | null;\n type: string;\n } | null;\n }>;\n }>(`/github/installations?organizationId=${orgId}`);\n return {\n is_connected: resp.installations.length > 0,\n installations: resp.installations.map((i) => ({\n id: i.id,\n installation_id: i.installationId,\n account_login: i.account?.login ?? \"\",\n account_type: i.account?.type ?? \"User\",\n })),\n };\n }\n\n async getGitHubRepos(_refresh?: boolean): Promise<GitHubReposResponse> {\n const orgId = await this.resolveOrganizationId();\n const installResp = await this.request<{\n installations: Array<{\n id: string;\n installationId: string;\n account: {\n login: string;\n avatar_url: string | null;\n type: string;\n } | null;\n }>;\n }>(`/github/installations?organizationId=${orgId}`);\n\n if (installResp.installations.length === 0) {\n return { user: { login: \"\", id: 0, avatar_url: \"\" }, repos: [] };\n }\n\n const inst = installResp.installations[0];\n const reposResp = await this.request<{\n repos: Array<{\n id: number;\n name: string;\n fullName: string;\n private: boolean;\n ownerAvatarUrl: string | null;\n }>;\n }>(`/github/installations/${inst.installationId}/repos`);\n\n return {\n user: {\n login: inst.account?.login ?? \"\",\n id: 0,\n avatar_url: inst.account?.avatar_url ?? \"\",\n },\n repos: reposResp.repos.map((r) => ({\n id: r.id,\n name: r.name,\n full_name: r.fullName,\n private: r.private,\n owner: { login: r.fullName.split(\"/\")[0] ?? \"\" },\n })),\n };\n }\n\n async getGitHubAppName(): Promise<string> {\n if (process.env.MCP_GITHUB_APP_NAME) return process.env.MCP_GITHUB_APP_NAME;\n if (this.baseUrl.includes(\"localhost\")) return \"mcp-use-local\";\n if (this.baseUrl.includes(\".dev.\")) return \"mcp-use-dev\";\n return \"mcp-use\";\n }\n\n /**\n * Returns the GitHub numeric installation ID (not the DB UUID) for the org.\n * Used for building direct installation settings URLs.\n */\n async getGitHubInstallationId(): Promise<string | null> {\n const status = await this.getGitHubConnectionStatus();\n return status.installations?.[0]?.installation_id ?? null;\n }\n\n async createGitHubRepo(opts: {\n installationId: string;\n name: string;\n private?: boolean;\n org?: string;\n }): Promise<{ fullName: string; cloneUrl: string; htmlUrl: string }> {\n return this.request<{\n fullName: string;\n cloneUrl: string;\n htmlUrl: string;\n }>(`/github/installations/${opts.installationId}/repos`, {\n method: \"POST\",\n body: JSON.stringify({\n name: opts.name,\n private: opts.private ?? true,\n org: opts.org,\n }),\n });\n }\n\n async getGitHubOAuthUrl(): Promise<{ url: string; state: string }> {\n return this.request<{ url: string; state: string }>(\n \"/github/oauth/authorize\"\n );\n }\n\n async exchangeGitHubOAuthToken(\n code: string\n ): Promise<{ success: boolean; installationsUpdated: number }> {\n return this.request<{ success: boolean; installationsUpdated: number }>(\n \"/github/oauth/token\",\n {\n method: \"POST\",\n body: JSON.stringify({ code }),\n }\n );\n }\n}\n","import chalk from \"chalk\";\nimport { ApiUnauthorizedError } from \"./api.js\";\n\n/**\n * Treats `ApiUnauthorizedError` (401) as a \"please re-authenticate\" hint\n * instead of surfacing the raw API response.\n */\nexport function handleCommandError(error: unknown, context: string): never {\n if (error instanceof ApiUnauthorizedError) {\n console.error(\n chalk.red(\"\\n✗ Your session has expired or your API key is invalid.\")\n );\n console.error(\n chalk.gray(\n `Run ${chalk.white(\"npx mcp-use login\")} to re-authenticate.\\n`\n )\n );\n process.exit(1);\n }\n console.error(\n chalk.red.bold(`\\n✗ ${context}:`),\n chalk.red(error instanceof Error ? error.message : \"Unknown error\")\n );\n process.exit(1);\n}\n","import chalk from \"chalk\";\nimport open from \"open\";\nimport { ApiUnauthorizedError, McpUseAPI } from \"../utils/api.js\";\nimport {\n deleteConfig,\n getApiKey,\n getAuthBaseUrl,\n isLoggedIn,\n readConfig,\n writeConfig,\n} from \"../utils/config.js\";\nimport { handleCommandError } from \"../utils/errors.js\";\nimport type { AuthTestResponse, OrgInfo } from \"../utils/api.js\";\n\nconst DEVICE_CLIENT_ID = \"mcp-use-cli\";\nconst DEVICE_POLL_TIMEOUT = 1800000; // 30 minutes\n\ninterface DeviceCodeResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete?: string;\n expires_in: number;\n interval: number;\n}\n\ninterface DeviceTokenResponse {\n access_token?: string;\n error?: string;\n error_description?: string;\n}\n\nasync function requestDeviceCode(\n authBaseUrl: string\n): Promise<DeviceCodeResponse> {\n const url = `${authBaseUrl}/api/auth/device/code`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n client_id: DEVICE_CLIENT_ID,\n scope: \"openid profile email\",\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(\n `Failed to request device code: ${response.status} ${error}`\n );\n }\n\n return response.json() as Promise<DeviceCodeResponse>;\n}\n\nasync function pollForDeviceToken(\n authBaseUrl: string,\n deviceCode: string,\n intervalSeconds: number\n): Promise<string> {\n let pollingInterval = intervalSeconds;\n const deadline = Date.now() + DEVICE_POLL_TIMEOUT;\n\n while (Date.now() < deadline) {\n const delayMs = pollingInterval * 1000;\n await new Promise((r) => setTimeout(r, delayMs));\n\n const url = `${authBaseUrl}/api/auth/device/token`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceCode,\n client_id: DEVICE_CLIENT_ID,\n }),\n });\n\n const data = (await response.json()) as DeviceTokenResponse;\n\n if (data.access_token) {\n return data.access_token;\n }\n\n if (data.error) {\n switch (data.error) {\n case \"authorization_pending\":\n break;\n case \"slow_down\":\n pollingInterval += 5;\n break;\n case \"access_denied\":\n throw new Error(\"Authorization was denied by the user.\");\n case \"expired_token\":\n throw new Error(\"The device code has expired. Please try again.\");\n default:\n throw new Error(\n data.error_description || `Device auth error: ${data.error}`\n );\n }\n }\n }\n\n throw new Error(\"Login timed out. Please try again.\");\n}\n\n/**\n * Resolve an org identifier (slug, id, or case-insensitive name) against a list.\n * Returns null if no match.\n */\nexport function resolveOrgFromOption(\n orgs: OrgInfo[],\n identifier: string\n): OrgInfo | null {\n const needle = identifier.trim();\n if (!needle) return null;\n const lower = needle.toLowerCase();\n return (\n orgs.find(\n (o) =>\n o.slug === needle || o.id === needle || o.name.toLowerCase() === lower\n ) ?? null\n );\n}\n\n/**\n * Prompt user to pick an organization from a numbered list.\n */\nexport async function promptOrgSelection(\n orgs: OrgInfo[],\n defaultOrgId?: string | null\n): Promise<OrgInfo | null> {\n if (orgs.length === 0) return null;\n\n if (orgs.length === 1) {\n return orgs[0];\n }\n\n console.log(chalk.cyan.bold(\"\\n🏢 Select an organization:\\n\"));\n\n for (let i = 0; i < orgs.length; i++) {\n const o = orgs[i];\n const marker = o.id === defaultOrgId ? chalk.green(\" (current)\") : \"\";\n const slug = o.slug ? chalk.gray(` (${o.slug})`) : \"\";\n console.log(` ${chalk.white(`${i + 1}.`)} ${o.name}${slug}${marker}`);\n }\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n const defaultIdx = defaultOrgId\n ? orgs.findIndex((o) => o.id === defaultOrgId)\n : 0;\n const defaultDisplay = defaultIdx >= 0 ? defaultIdx + 1 : 1;\n\n rl.question(\n chalk.gray(`\\nEnter number [${defaultDisplay}]: `),\n (answer) => {\n rl.close();\n const trimmed = answer.trim();\n const idx = trimmed === \"\" ? defaultIdx : parseInt(trimmed, 10) - 1;\n if (idx >= 0 && idx < orgs.length) {\n resolve(orgs[idx]);\n } else {\n console.log(chalk.yellow(\"Invalid selection, using default.\"));\n resolve(orgs[defaultIdx >= 0 ? defaultIdx : 0]);\n }\n }\n );\n });\n}\n\n/**\n * Login command using OAuth 2.0 Device Authorization Grant (RFC 8628).\n */\nexport async function loginCommand(options?: {\n silent?: boolean;\n apiKey?: string;\n org?: string;\n}): Promise<void> {\n try {\n const directKey = options?.apiKey || process.env.MCP_USE_API_KEY;\n if (directKey) {\n await writeConfig({ apiKey: directKey });\n if (!options?.silent) {\n console.log(chalk.green.bold(\"✓ API key saved.\"));\n try {\n const api = await McpUseAPI.create();\n const authInfo = await api.testAuth();\n console.log(chalk.gray(` Authenticated as ${authInfo.email}`));\n } catch {\n console.log(\n chalk.gray(\n \" (could not verify key — will be checked on next command)\"\n )\n );\n }\n }\n return;\n }\n\n if (await isLoggedIn()) {\n let needsReauth = false;\n try {\n await (await McpUseAPI.create()).testAuth();\n } catch (e) {\n // Only a 401 means the stored key is actually bad. Network/disk\n // errors get the benefit of the doubt so offline users aren't\n // bounced into re-auth when we can't verify.\n if (e instanceof ApiUnauthorizedError) {\n needsReauth = true;\n }\n }\n\n if (!needsReauth) {\n if (!options?.silent) {\n console.log(\n chalk.yellow(\n \"You are already logged in. Run 'npx mcp-use logout' first if you want to login with a different account.\"\n )\n );\n }\n return;\n }\n\n if (!options?.silent) {\n console.log(\n chalk.yellow(\n \"⚠️ Stored credentials are invalid or expired. Re-authenticating...\"\n )\n );\n }\n await deleteConfig();\n }\n\n console.log(chalk.cyan.bold(\"Logging in to Manufact cloud...\\n\"));\n\n const authBaseUrl = await getAuthBaseUrl();\n\n const deviceResp = await requestDeviceCode(authBaseUrl);\n const {\n device_code,\n user_code,\n verification_uri,\n verification_uri_complete,\n interval,\n } = deviceResp;\n\n const displayCode =\n user_code.length === 8\n ? `${user_code.slice(0, 4)}-${user_code.slice(4)}`\n : user_code;\n\n console.log(chalk.white(\" Visit: \") + chalk.cyan(verification_uri));\n console.log(chalk.white(\" Code: \") + chalk.bold.white(displayCode));\n console.log();\n\n const urlToOpen = verification_uri_complete || verification_uri;\n try {\n await open(urlToOpen);\n console.log(chalk.gray(\" Browser opened. Waiting for approval...\"));\n } catch {\n console.log(chalk.gray(\" Open the URL above in your browser.\"));\n }\n\n const accessToken = await pollForDeviceToken(\n authBaseUrl,\n device_code,\n interval || 5\n );\n\n console.log(chalk.gray(\"\\n Creating persistent API key...\"));\n\n const api = await McpUseAPI.create();\n const keyResp = await api.createApiKeyWithAccessToken(accessToken, \"CLI\");\n\n await writeConfig({ apiKey: keyResp.key });\n\n console.log(chalk.green.bold(\"\\n✓ Successfully logged in!\"));\n\n let authInfo: AuthTestResponse | null = null;\n try {\n const freshApi = await McpUseAPI.create();\n authInfo = await freshApi.testAuth();\n } catch {\n console.log(\n chalk.gray(\n `\\n Your API key has been saved to ${chalk.white(\"~/.mcp-use/config.json\")}`\n )\n );\n }\n\n if (authInfo) {\n console.log(chalk.cyan.bold(\"\\nCurrent user:\\n\"));\n console.log(chalk.white(\" Email: \") + chalk.cyan(authInfo.email));\n console.log(chalk.white(\" User ID: \") + chalk.gray(authInfo.user_id));\n\n const storedKey = await getApiKey();\n if (storedKey) {\n const masked = storedKey.substring(0, 8) + \"...\";\n console.log(chalk.white(\" API Key: \") + chalk.gray(masked));\n }\n\n const orgs = authInfo.orgs ?? [];\n if (orgs.length > 0) {\n let selectedOrg: OrgInfo | null = null;\n\n if (options?.org) {\n selectedOrg = resolveOrgFromOption(orgs, options.org);\n if (!selectedOrg) {\n throw new Error(\n `Organization \"${options.org}\" not found. Run 'npx mcp-use org list' after logging in to see available organizations.`\n );\n }\n } else if (orgs.length === 1) {\n selectedOrg = orgs[0];\n } else if (!process.stdin.isTTY) {\n throw new Error(\n \"Multiple organizations available and no TTY for interactive selection. Re-run with --org <slug|id|name> to pick one non-interactively.\"\n );\n } else {\n selectedOrg = await promptOrgSelection(orgs, authInfo.default_org_id);\n }\n\n if (selectedOrg) {\n const config = await readConfig();\n await writeConfig({\n ...config,\n orgId: selectedOrg.id,\n orgName: selectedOrg.name,\n orgSlug: selectedOrg.slug ?? undefined,\n });\n\n const slug = selectedOrg.slug\n ? chalk.gray(` (${selectedOrg.slug})`)\n : \"\";\n console.log(\n chalk.white(\" Org: \") + chalk.cyan(selectedOrg.name) + slug\n );\n }\n }\n }\n\n console.log(\n chalk.gray(\n \"\\n Deploy your MCP servers with \" + chalk.white(\"npx mcp-use deploy\")\n )\n );\n console.log(\n chalk.gray(\" To logout, run \" + chalk.white(\"npx mcp-use logout\"))\n );\n } catch (error) {\n throw new Error(\n `Login failed: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Logout command - revokes API key and deletes config\n */\nexport async function logoutCommand(): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.yellow(\"⚠️ You are not logged in.\"));\n return;\n }\n\n console.log(chalk.cyan.bold(\"🔓 Logging out...\\n\"));\n\n await deleteConfig();\n\n console.log(chalk.green.bold(\"✓ Successfully logged out!\"));\n console.log(\n chalk.gray(\n \"\\nYour local config has been deleted. The API key will remain active until revoked from the web interface.\"\n )\n );\n } catch (error) {\n console.error(\n chalk.red.bold(\"\\n✗ Logout failed:\"),\n chalk.red(error instanceof Error ? error.message : \"Unknown error\")\n );\n process.exit(1);\n }\n}\n\n/**\n * Whoami command - shows current user info\n */\nexport async function whoamiCommand(): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.yellow(\"⚠️ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n return;\n }\n\n console.log(chalk.cyan.bold(\"👤 Current user:\\n\"));\n\n const api = await McpUseAPI.create();\n const authInfo = await api.testAuth();\n\n console.log(chalk.white(\"Email: \") + chalk.cyan(authInfo.email));\n console.log(chalk.white(\"User ID: \") + chalk.gray(authInfo.user_id));\n\n const apiKey = await getApiKey();\n if (apiKey) {\n const masked = apiKey.substring(0, 6) + \"...\";\n console.log(chalk.white(\"API Key: \") + chalk.gray(masked));\n }\n\n const config = await readConfig();\n const orgs = authInfo.orgs ?? [];\n if (orgs.length > 0) {\n const activeOrg = orgs.find(\n (o) => o.id === (config.orgId || authInfo.default_org_id)\n );\n\n if (activeOrg) {\n const slug = activeOrg.slug ? chalk.gray(` (${activeOrg.slug})`) : \"\";\n console.log(\n chalk.white(\"Org: \") + chalk.cyan(activeOrg.name) + slug\n );\n }\n\n if (orgs.length > 1) {\n console.log(\n chalk.gray(\n `\\n ${orgs.length} organizations available. Use ` +\n chalk.white(\"npx mcp-use org list\") +\n \" to see all.\"\n )\n );\n }\n }\n } catch (error) {\n handleCommandError(error, \"Failed to get user info\");\n }\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { MCPSession } from \"mcp-use/client\";\nimport { MCPClient } from \"mcp-use/client\";\nimport type { NodeOAuthClientProvider } from \"mcp-use/auth/node\";\nimport { createInterface } from \"node:readline\";\nimport {\n formatError,\n formatHeader,\n formatInfo,\n formatJson,\n formatKeyValue,\n formatPromptMessages,\n formatResourceContent,\n formatSchema,\n formatSuccess,\n formatTable,\n formatToolCall,\n formatToolMode,\n formatWarning,\n isStdoutTty,\n} from \"../utils/format.js\";\nimport { parsePromptArgs, parseToolArgs } from \"../utils/parse-args.js\";\nimport {\n buildOAuthProvider,\n isUnauthorized,\n runOAuthFlow,\n} from \"../utils/oauth.js\";\nimport {\n getSession,\n listAllSessions,\n removeSession,\n saveSession,\n updateSessionInfo,\n} from \"../utils/session-storage.js\";\nimport {\n activeSessions,\n cleanupAndExit,\n getCliClientInfo,\n getOrRestoreSession,\n} from \"../utils/session.js\";\nimport {\n authStatusCommand,\n authRefreshCommand,\n authLogoutCommand,\n} from \"./client-auth.js\";\nimport {\n captureToolScreenshot,\n createClientScreenshotCommand,\n createPerClientScreenshotCommand,\n detectToolResourceUri,\n parseDeviceScaleFactor,\n} from \"./screenshot.js\";\n\n/**\n * Reserved top-level subcommands under `mcp-use client`. Any other token in\n * that position is treated as a client name and routed via\n * `createPerClientCommand`. Keep this in sync with the subcommands registered\n * in `createClientCommand` below, plus commander's built-in help tokens.\n */\nexport const RESERVED_CLIENT_SUBCOMMANDS = new Set([\n \"connect\",\n \"list\",\n \"remove\",\n \"screenshot\",\n \"help\",\n]);\n\n/**\n * Per-client scope tokens that live under `mcp-use client <name> ...`. When a\n * user types one of these in the client-name slot (e.g.\n * `mcp-use client tools call foo`), they almost certainly forgot the client\n * name — route to a tailored error instead of \"unknown command\".\n */\nexport const PER_CLIENT_SCOPES = new Set([\n \"tools\",\n \"resources\",\n \"prompts\",\n \"auth\",\n \"disconnect\",\n \"interactive\",\n \"screenshot\",\n]);\n\nexport async function connectCommand(\n name: string | undefined,\n urlOrCommand: string | undefined,\n options: {\n stdio?: boolean;\n auth?: string;\n oauth?: boolean;\n authTimeout?: string;\n }\n): Promise<void> {\n // `connect` requires both <name> and <url>. Commander's default missing-arg\n // error (\"missing required argument 'url'\") is confusing when users pass a\n // URL as the only positional — they don't realize the server needs a name.\n // Catch the common shapes here and give a tailored fix-it message.\n if (!name || !urlOrCommand) {\n const looksLikeUrl = !!name && /^https?:\\/\\//i.test(name);\n\n if (looksLikeUrl && !urlOrCommand && !options.stdio) {\n console.error(formatError(\"Missing server name.\"));\n console.error(\"\");\n console.error(\n formatInfo(\n \"Each saved server needs a short name you'll use to address it later.\"\n )\n );\n console.error(\"\");\n console.error(\"Try:\");\n console.error(` mcp-use client connect <name> ${name}`);\n console.error(\"\");\n console.error(\"Example:\");\n console.error(` mcp-use client connect my-server ${name}`);\n console.error(\" mcp-use client my-server tools list\");\n } else if (name && !urlOrCommand) {\n console.error(\n formatError(options.stdio ? \"Missing <command>.\" : \"Missing <url>.\")\n );\n console.error(\"\");\n console.error(formatInfo(\"Usage:\"));\n console.error(\n options.stdio\n ? ` mcp-use client connect ${name} \"<command>\" --stdio`\n : ` mcp-use client connect ${name} <url>`\n );\n } else {\n console.error(formatError(\"Missing required arguments: <name> <url>.\"));\n console.error(\"\");\n console.error(formatInfo(\"Usage:\"));\n console.error(\" mcp-use client connect <name> <url>\");\n console.error(\"\");\n console.error(\"Example:\");\n console.error(\n \" mcp-use client connect manufact https://mcp.manufact.com/mcp\"\n );\n }\n await cleanupAndExit(1);\n }\n\n // Narrow for TS: the validation block above exits on missing args. The\n // `await cleanupAndExit` doesn't propagate `never` through control flow,\n // so assert here once instead of sprinkling `!` everywhere.\n const sessionName: string = name as string;\n const target: string = urlOrCommand as string;\n\n // Reject names that collide with per-server scope tokens. If someone saved a\n // server as `tools`, every `mcp-use client tools ...` invocation would be\n // intercepted by the \"missing server name\" routing in index.ts and the\n // saved entry would be unreachable. Fail fast at save time instead.\n if (PER_CLIENT_SCOPES.has(sessionName)) {\n console.error(\n formatError(\n `'${sessionName}' is a reserved name and can't be used for a saved server.`\n )\n );\n console.error(\"\");\n console.error(\n `Reserved names: ${Array.from(PER_CLIENT_SCOPES).sort().join(\", \")}`\n );\n console.error(\"\");\n console.error(\"Pick a different name, e.g.:\");\n console.error(` mcp-use client connect my-${sessionName} ${target}`);\n await cleanupAndExit(1);\n }\n\n try {\n const client = new MCPClient();\n let session: MCPSession;\n const cliClientInfo = getCliClientInfo();\n\n if (options.stdio) {\n const parts = target.split(\" \");\n const command = parts[0];\n const args = parts.slice(1);\n\n console.error(\n formatInfo(`Connecting to stdio server: ${command} ${args.join(\" \")}`)\n );\n\n client.addServer(sessionName, {\n command,\n args,\n clientInfo: cliClientInfo,\n });\n\n session = await client.createSession(sessionName);\n\n await saveSession(sessionName, {\n type: \"stdio\",\n command,\n args,\n lastUsed: new Date().toISOString(),\n });\n } else {\n console.error(formatInfo(`Connecting to ${target}...`));\n\n // Static --auth bypasses OAuth entirely. `--no-oauth` disables auto-OAuth\n // on 401 (commander maps `--no-oauth` to options.oauth === false).\n const wantOAuth = !options.auth && options.oauth !== false;\n let authProvider: NodeOAuthClientProvider | undefined;\n if (wantOAuth) {\n const authTimeoutMs = options.authTimeout\n ? Number.parseInt(options.authTimeout, 10)\n : undefined;\n authProvider = await buildOAuthProvider(target, {\n ...(authTimeoutMs ? { authTimeoutMs } : {}),\n });\n }\n\n client.addServer(sessionName, {\n url: target,\n ...(authProvider\n ? { authProvider }\n : options.auth\n ? { headers: { Authorization: `Bearer ${options.auth}` } }\n : {}),\n clientInfo: cliClientInfo,\n });\n\n try {\n session = await client.createSession(sessionName);\n } catch (err) {\n if (authProvider && isUnauthorized(err)) {\n console.error(\n formatWarning(\n \"Server requires authentication. Starting OAuth flow.\"\n )\n );\n await runOAuthFlow(authProvider, target);\n console.error(formatSuccess(\"Authentication successful\"));\n session = await client.createSession(sessionName);\n } else {\n throw err;\n }\n }\n\n await saveSession(sessionName, {\n type: \"http\",\n url: target,\n authMode: authProvider ? \"oauth\" : options.auth ? \"bearer\" : undefined,\n authToken: authProvider ? undefined : options.auth,\n lastUsed: new Date().toISOString(),\n });\n }\n\n activeSessions.set(sessionName, { client, session });\n\n const serverInfo = session.serverInfo;\n const capabilities = session.serverCapabilities;\n\n if (serverInfo) {\n await updateSessionInfo(sessionName, serverInfo, capabilities);\n }\n\n console.log(formatSuccess(`Connected as '${sessionName}'`));\n\n if (serverInfo) {\n console.log(\"\");\n console.log(formatHeader(\"Server Information:\"));\n console.log(\n formatKeyValue({\n Name: serverInfo.name,\n Version: serverInfo.version || \"unknown\",\n })\n );\n }\n\n if (capabilities) {\n console.log(\"\");\n console.log(formatHeader(\"Capabilities:\"));\n const caps = Object.keys(capabilities).join(\", \");\n console.log(` ${caps || \"none\"}`);\n }\n\n const tools = session.tools;\n console.log(\"\");\n console.log(\n formatInfo(\n `Available: ${tools.length} tool${tools.length !== 1 ? \"s\" : \"\"}`\n )\n );\n } catch (error: any) {\n console.error(formatError(`Connection failed: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nexport async function disconnectCommand(name: string): Promise<void> {\n try {\n const sessionData = activeSessions.get(name);\n if (sessionData) {\n await sessionData.client.closeAllSessions();\n activeSessions.delete(name);\n console.log(formatSuccess(`Disconnected from ${name}`));\n } else {\n console.log(formatInfo(`Server '${name}' is not connected`));\n }\n } catch (error: any) {\n console.error(formatError(`Failed to disconnect: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nexport async function removeClientCommand(name: string): Promise<void> {\n try {\n const config = await getSession(name);\n if (!config) {\n console.error(formatError(`Server '${name}' not found`));\n console.error(\"\");\n console.error(\"See your saved servers with:\");\n console.error(\" mcp-use client list\");\n await cleanupAndExit(1);\n }\n\n const sessionData = activeSessions.get(name);\n if (sessionData) {\n await sessionData.client.closeAllSessions();\n activeSessions.delete(name);\n }\n\n // OAuth tokens are keyed by URL hash, not by saved-server name, so two\n // saved entries pointing at the same URL share one token store. Only\n // wipe the tokens when this entry is the last one using the URL.\n const isOAuthHttp =\n config!.type === \"http\" &&\n config!.authMode === \"oauth\" &&\n typeof config!.url === \"string\";\n const sharedUrlSibling = isOAuthHttp\n ? (await listAllSessions()).find(\n (s) =>\n s.name !== name &&\n s.config.type === \"http\" &&\n s.config.url === config!.url\n )\n : undefined;\n\n await removeSession(name);\n console.log(formatSuccess(`Removed saved server '${name}'`));\n\n if (isOAuthHttp) {\n if (sharedUrlSibling) {\n console.log(\n formatInfo(\n `OAuth tokens for ${config!.url} were kept because saved server '${sharedUrlSibling.name}' still uses that URL.`\n )\n );\n } else {\n try {\n const provider = await buildOAuthProvider(config!.url!);\n await provider.invalidateCredentials(\"all\");\n console.log(formatInfo(`Removed OAuth tokens for ${config!.url}`));\n } catch (error: any) {\n console.error(\n formatWarning(\n `Saved entry removed, but failed to clear OAuth tokens for ${config!.url}: ${error.message}`\n )\n );\n }\n }\n }\n } catch (error: any) {\n console.error(formatError(`Failed to remove server: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nexport async function listClientsCommand(): Promise<void> {\n try {\n const sessions = await listAllSessions();\n\n if (sessions.length === 0) {\n if (isStdoutTty()) {\n console.log(formatInfo(\"No saved servers\"));\n console.log(\n formatInfo(\n \"Connect to a server with: npx mcp-use client connect <name> <url>\"\n )\n );\n }\n return;\n }\n\n const tty = isStdoutTty();\n if (tty) {\n console.log(formatHeader(\"Saved Servers:\"));\n console.log(\"\");\n }\n\n const tableData = sessions.map((s) => ({\n name: s.name,\n type: s.config.type,\n target:\n s.config.type === \"http\"\n ? s.config.url || \"\"\n : `${s.config.command} ${(s.config.args || []).join(\" \")}`,\n server: s.config.serverInfo?.name || \"unknown\",\n }));\n\n console.log(\n formatTable(tableData, [\n { key: \"name\", header: \"Name\" },\n { key: \"type\", header: \"Type\" },\n { key: \"target\", header: \"Target\", truncate: true },\n { key: \"server\", header: \"Server\" },\n ])\n );\n } catch (error: any) {\n console.error(formatError(`Failed to list servers: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nexport async function listToolsCommand(\n name: string,\n options: { json?: boolean }\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n const tools = await session.listTools();\n\n if (options.json) {\n console.log(formatJson(tools));\n } else if (tools.length === 0) {\n if (isStdoutTty()) console.log(formatInfo(\"No tools available\"));\n } else {\n const tty = isStdoutTty();\n if (tty) {\n console.log(formatHeader(`Available Tools (${tools.length}):`));\n console.log(\"\");\n }\n\n const tableData = tools.map((tool) => {\n const props = (tool.inputSchema as any)?.properties ?? {};\n const required = (tool.inputSchema as any)?.required ?? [];\n const total = Object.keys(props).length;\n const reqCount = Array.isArray(required) ? required.length : 0;\n const argsCell = total === 0 ? chalk.gray(\"—\") : `${reqCount}/${total}`;\n return {\n name: chalk.bold(tool.name),\n mode: formatToolMode((tool as any).annotations),\n args: argsCell,\n description: tool.description || chalk.gray(\"(no description)\"),\n };\n });\n\n console.log(\n formatTable(tableData, [\n { key: \"name\", header: \"Tool\" },\n { key: \"mode\", header: \"Mode\" },\n { key: \"args\", header: \"Args\" },\n { key: \"description\", header: \"Description\", truncate: true },\n ])\n );\n\n if (tty) {\n console.log(\"\");\n console.log(\n chalk.gray(\n \"ARGS shows required/total. Modes: read-only · write · destructive.\"\n )\n );\n }\n }\n } catch (error: any) {\n console.error(formatError(`Failed to list tools: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nexport async function describeToolCommand(\n name: string,\n toolName: string\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n const tools = session.tools;\n const tool = tools.find((t) => t.name === toolName);\n\n if (!tool) {\n console.error(formatError(`Tool '${toolName}' not found`));\n console.log(\"\");\n console.log(formatInfo(\"Available tools:\"));\n tools.forEach((t) => console.log(` • ${t.name}`));\n await cleanupAndExit(1);\n }\n\n console.log(formatHeader(`Tool: ${tool!.name}`));\n console.log(\"\");\n\n if (tool!.description) {\n console.log(tool!.description);\n console.log(\"\");\n }\n\n if (tool!.inputSchema) {\n console.log(formatHeader(\"Input Schema:\"));\n console.log(formatSchema(tool!.inputSchema));\n }\n } catch (error: any) {\n console.error(formatError(`Failed to describe tool: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nexport async function callToolCommand(\n name: string,\n toolName: string,\n argsList?: string[],\n options?: {\n timeout?: number;\n json?: boolean;\n screenshot?: boolean;\n screenshotOutput?: string;\n screenshotDeviceScaleFactor?: string;\n }\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n\n const tools = session.tools;\n const tool = tools.find((t) => t.name === toolName);\n\n let args: Record<string, unknown> = {};\n if (argsList && argsList.length > 0) {\n try {\n args = parseToolArgs(argsList, tool?.inputSchema as any);\n } catch (error: any) {\n console.error(formatError(error.message));\n console.log(\"\");\n console.log(formatInfo(\"Usage:\"));\n console.log(\n ` npx mcp-use client ${name} tools call ${toolName} key=value [key2=value2 ...]`\n );\n console.log(\n ` npx mcp-use client ${name} tools call ${toolName} nested:='{\"a\":1}' # JSON value`\n );\n console.log(\n ` npx mcp-use client ${name} tools call ${toolName} '{\"key\":\"value\"}' # full JSON object`\n );\n if (tool?.inputSchema) {\n console.log(\"\");\n console.log(formatInfo(\"Tool schema:\"));\n console.log(formatSchema(tool.inputSchema));\n }\n await cleanupAndExit(1);\n }\n } else if (\n tool?.inputSchema?.required &&\n tool.inputSchema.required.length > 0\n ) {\n console.error(formatError(\"This tool requires arguments.\"));\n console.log(\"\");\n console.log(formatInfo(\"Provide arguments as key=value pairs:\"));\n console.log(\n ` npx mcp-use client ${name} tools call ${toolName} key=value [key2=value2 ...]`\n );\n console.log(\"\");\n console.log(formatInfo(\"Tool schema:\"));\n console.log(formatSchema(tool.inputSchema));\n await cleanupAndExit(1);\n }\n\n console.error(formatInfo(`Calling tool '${toolName}'...`));\n const callResult = await session.callTool(toolName, args, {\n timeout: options?.timeout,\n });\n\n // Screenshot is opt-in via --screenshot. Any of the screenshot-related\n // flags also implies opt-in so users don't have to pass `--screenshot`\n // alongside `--screenshot-output`. Capture before printing so the path is\n // part of the printed result — agents reading `--json` output get it\n // inside the JSON. Failures don't fail the tool call.\n const toolWithMeta = session.tools.find((t) => t.name === toolName);\n const resourceUri = detectToolResourceUri(toolWithMeta);\n const wantsScreenshot =\n options?.screenshot === true ||\n options?.screenshotOutput !== undefined ||\n options?.screenshotDeviceScaleFactor !== undefined;\n\n let screenshot: {\n path: string;\n width: number;\n height: number;\n view: string;\n } | null = null;\n let screenshotError: string | null = null;\n let widgetHintUri: string | null = null;\n if (resourceUri) {\n if (wantsScreenshot) {\n console.error(\n formatInfo(`Capturing widget screenshot (${resourceUri})...`)\n );\n try {\n const screenshotOpts: {\n output?: string;\n deviceScaleFactor?: number;\n } = {};\n if (options?.screenshotOutput) {\n screenshotOpts.output = options.screenshotOutput;\n }\n if (options?.screenshotDeviceScaleFactor) {\n screenshotOpts.deviceScaleFactor = parseDeviceScaleFactor(\n options.screenshotDeviceScaleFactor\n );\n }\n const shot = await captureToolScreenshot(\n {\n session,\n toolName,\n toolArgs: args,\n toolOutput: callResult,\n resourceUri,\n },\n screenshotOpts\n );\n screenshot = {\n path: shot.outputPath,\n width: shot.width,\n height: shot.height,\n view: shot.view,\n };\n } catch (err: any) {\n screenshotError = err?.message ?? String(err);\n }\n } else {\n widgetHintUri = resourceUri;\n }\n }\n\n if (options?.json) {\n console.log(formatJson(callResult));\n } else {\n console.log(formatToolCall(callResult));\n }\n\n if (screenshot) {\n // Always announce the screenshot on stderr so `--json` stdout stays a\n // clean CallToolResult — agents piping JSON shouldn't have to filter\n // status lines out of their parse target.\n console.error(\n formatSuccess(\n `Saved widget screenshot: ${screenshot.path} (${screenshot.width}×${screenshot.height})`\n )\n );\n }\n if (screenshotError) {\n console.error(\n formatWarning(`Skipped widget screenshot: ${screenshotError}`)\n );\n }\n if (widgetHintUri) {\n console.error(\n formatInfo(\n `This tool renders a widget (${widgetHintUri}). Re-run with --screenshot to save a PNG of it.`\n )\n );\n }\n\n if (callResult.isError) {\n await cleanupAndExit(1);\n }\n } catch (error: any) {\n console.error(formatError(`Failed to call tool: ${error.message}`));\n if (error?.data !== undefined) {\n console.error(\n chalk.gray(\n typeof error.data === \"string\" ? error.data : formatJson(error.data)\n )\n );\n }\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nexport async function listResourcesCommand(\n name: string,\n options: { json?: boolean }\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n const resourcesResult = await session.listAllResources();\n const resources = resourcesResult.resources;\n\n if (options.json) {\n console.log(formatJson(resources));\n } else if (resources.length === 0) {\n if (isStdoutTty()) console.log(formatInfo(\"No resources available\"));\n } else {\n const tty = isStdoutTty();\n if (tty) {\n console.log(formatHeader(`Available Resources (${resources.length}):`));\n console.log(\"\");\n }\n\n const tableData = resources.map((resource) => ({\n name: chalk.bold(resource.name || \"(no name)\"),\n type: resource.mimeType || chalk.gray(\"unknown\"),\n uri: resource.uri,\n }));\n\n console.log(\n formatTable(tableData, [\n { key: \"name\", header: \"Name\" },\n { key: \"type\", header: \"Type\" },\n { key: \"uri\", header: \"URI\", truncate: true },\n ])\n );\n }\n } catch (error: any) {\n console.error(formatError(`Failed to list resources: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nexport async function readResourceCommand(\n name: string,\n uri: string,\n options: { json?: boolean }\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n\n console.error(formatInfo(`Reading resource: ${uri}`));\n const resource = await session.readResource(uri);\n\n if (options.json) {\n console.log(formatJson(resource));\n } else {\n console.log(formatResourceContent(resource));\n }\n } catch (error: any) {\n console.error(formatError(`Failed to read resource: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nexport async function subscribeResourceCommand(\n name: string,\n uri: string\n): Promise<void> {\n // Subscribe is intentionally long-lived: it keeps the process alive to\n // receive notifications until Ctrl+C. Don't run cleanupAndExit on the\n // success path — only on error.\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n\n await session.subscribeToResource(uri);\n console.log(formatSuccess(`Subscribed to resource: ${uri}`));\n\n session.on(\"notification\", async (notification) => {\n if (notification.method === \"notifications/resources/updated\") {\n console.log(\"\");\n console.log(formatInfo(\"Resource updated:\"));\n console.log(formatJson(notification.params));\n }\n });\n\n console.log(formatInfo(\"Listening for updates... (Press Ctrl+C to stop)\"));\n\n await new Promise(() => {});\n } catch (error: any) {\n console.error(\n formatError(`Failed to subscribe to resource: ${error.message}`)\n );\n await cleanupAndExit(1);\n }\n}\n\nexport async function unsubscribeResourceCommand(\n name: string,\n uri: string\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n\n await session.unsubscribeFromResource(uri);\n console.log(formatSuccess(`Unsubscribed from resource: ${uri}`));\n } catch (error: any) {\n console.error(\n formatError(`Failed to unsubscribe from resource: ${error.message}`)\n );\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nexport async function listPromptsCommand(\n name: string,\n options: { json?: boolean }\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n const promptsResult = await session.listPrompts();\n const prompts = promptsResult.prompts;\n\n if (options.json) {\n console.log(formatJson(prompts));\n } else if (prompts.length === 0) {\n if (isStdoutTty()) console.log(formatInfo(\"No prompts available\"));\n } else {\n const tty = isStdoutTty();\n if (tty) {\n console.log(formatHeader(`Available Prompts (${prompts.length}):`));\n console.log(\"\");\n }\n\n const tableData = prompts.map((prompt) => {\n const args = (prompt as any).arguments ?? [];\n const reqCount = Array.isArray(args)\n ? args.filter((a: any) => a?.required).length\n : 0;\n const total = Array.isArray(args) ? args.length : 0;\n const argsCell = total === 0 ? chalk.gray(\"—\") : `${reqCount}/${total}`;\n return {\n name: chalk.bold(prompt.name),\n args: argsCell,\n description: prompt.description || chalk.gray(\"(no description)\"),\n };\n });\n\n console.log(\n formatTable(tableData, [\n { key: \"name\", header: \"Prompt\" },\n { key: \"args\", header: \"Args\" },\n { key: \"description\", header: \"Description\", truncate: true },\n ])\n );\n }\n } catch (error: any) {\n console.error(formatError(`Failed to list prompts: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nexport async function getPromptCommand(\n name: string,\n promptName: string,\n argsList?: string[],\n options?: { json?: boolean }\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n\n let args: Record<string, string> = {};\n if (argsList && argsList.length > 0) {\n try {\n args = parsePromptArgs(argsList);\n } catch (error: any) {\n console.error(formatError(error.message));\n console.log(\"\");\n console.log(formatInfo(\"Usage:\"));\n console.log(\n ` npx mcp-use client ${name} prompts get ${promptName} key=value [key2=value2 ...]`\n );\n console.log(\n ` npx mcp-use client ${name} prompts get ${promptName} '{\"key\":\"value\"}' # full JSON object`\n );\n await cleanupAndExit(1);\n }\n }\n\n console.error(formatInfo(`Getting prompt '${promptName}'...`));\n const prompt = await session.getPrompt(promptName, args);\n\n if (options?.json) {\n console.log(formatJson(prompt));\n } else {\n console.log(formatHeader(`Prompt: ${promptName}`));\n console.log(\"\");\n\n if (prompt.description) {\n console.log(prompt.description);\n console.log(\"\");\n }\n\n if (prompt.messages) {\n console.log(formatHeader(\"Messages:\"));\n console.log(\"\");\n console.log(formatPromptMessages(prompt.messages));\n }\n }\n } catch (error: any) {\n console.error(formatError(`Failed to get prompt: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nexport async function interactiveCommand(name: string): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) return;\n\n const { name: sessionName, session } = result;\n\n console.log(formatHeader(\"MCP Interactive Mode\"));\n console.log(\"\");\n console.log(formatInfo(`Connected to: ${sessionName}`));\n console.log(\"\");\n console.log(chalk.gray(\"Commands:\"));\n console.log(chalk.gray(\" tools list - List available tools\"));\n console.log(\n chalk.gray(\n \" tools call <name> - Call a tool (will prompt for args)\"\n )\n );\n console.log(chalk.gray(\" tools describe <name> - Show tool details\"));\n console.log(\n chalk.gray(\" resources list - List available resources\")\n );\n console.log(chalk.gray(\" resources read <uri> - Read a resource\"));\n console.log(\n chalk.gray(\" prompts list - List available prompts\")\n );\n console.log(chalk.gray(\" prompts get <name> - Get a prompt\"));\n console.log(\n chalk.gray(\" exit, quit - Exit interactive mode\")\n );\n console.log(\"\");\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: chalk.cyan(\"mcp> \"),\n });\n\n rl.prompt();\n\n rl.on(\"line\", async (line) => {\n const trimmed = line.trim();\n\n if (!trimmed) {\n rl.prompt();\n return;\n }\n\n if (trimmed === \"exit\" || trimmed === \"quit\") {\n console.log(formatInfo(\"Goodbye!\"));\n rl.close();\n await cleanupAndExit(0);\n }\n\n const parts = trimmed.split(\" \");\n const scope = parts[0];\n const command = parts[1];\n const arg = parts[2];\n\n try {\n if (scope === \"tools\") {\n if (command === \"list\") {\n const tools = await session.listTools();\n console.log(\n formatInfo(\n `Available tools: ${tools.map((t) => t.name).join(\", \")}`\n )\n );\n } else if (command === \"call\" && arg) {\n // TODO(mcp-1566): mirror the auto widget-screenshot flow from\n // `client tools call` here. Skipped for now to keep the REPL terse.\n rl.question(\n \"Arguments (JSON, or press Enter for none): \",\n async (argsInput) => {\n try {\n const args = argsInput.trim() ? JSON.parse(argsInput) : {};\n const result = await session.callTool(arg, args);\n console.log(formatToolCall(result));\n } catch (error: any) {\n console.error(formatError(error.message));\n }\n rl.prompt();\n }\n );\n return;\n } else if (command === \"describe\" && arg) {\n const tools = session.tools;\n const tool = tools.find((t) => t.name === arg);\n if (tool) {\n console.log(formatHeader(`Tool: ${tool.name}`));\n if (tool.description) console.log(tool.description);\n if (tool.inputSchema) {\n console.log(\"\");\n console.log(formatSchema(tool.inputSchema));\n }\n } else {\n console.error(formatError(`Tool '${arg}' not found`));\n }\n } else {\n console.error(\n formatError(\n \"Invalid command. Try: tools list, tools call <name>, tools describe <name>\"\n )\n );\n }\n } else if (scope === \"resources\") {\n if (command === \"list\") {\n const result = await session.listAllResources();\n const resources = result.resources;\n console.log(\n formatInfo(\n `Available resources: ${resources.map((r) => r.uri).join(\", \")}`\n )\n );\n } else if (command === \"read\" && arg) {\n const resource = await session.readResource(arg);\n console.log(formatResourceContent(resource));\n } else {\n console.error(\n formatError(\n \"Invalid command. Try: resources list, resources read <uri>\"\n )\n );\n }\n } else if (scope === \"prompts\") {\n if (command === \"list\") {\n const result = await session.listPrompts();\n const prompts = result.prompts;\n console.log(\n formatInfo(\n `Available prompts: ${prompts.map((p) => p.name).join(\", \")}`\n )\n );\n } else if (command === \"get\" && arg) {\n rl.question(\n \"Arguments (JSON, or press Enter for none): \",\n async (argsInput) => {\n try {\n const args = argsInput.trim() ? JSON.parse(argsInput) : {};\n const prompt = await session.getPrompt(arg, args);\n console.log(formatPromptMessages(prompt.messages));\n } catch (error: any) {\n console.error(formatError(error.message));\n }\n rl.prompt();\n }\n );\n return;\n } else {\n console.error(\n formatError(\n \"Invalid command. Try: prompts list, prompts get <name>\"\n )\n );\n }\n } else {\n console.error(\n formatError(\n \"Unknown command. Type a valid scope: tools, resources, prompts\"\n )\n );\n }\n } catch (error: any) {\n console.error(formatError(error.message));\n }\n\n rl.prompt();\n });\n\n rl.on(\"close\", async () => {\n console.log(\"\");\n console.log(formatInfo(\"Goodbye!\"));\n await cleanupAndExit(0);\n });\n } catch (error: any) {\n console.error(\n formatError(`Failed to start interactive mode: ${error.message}`)\n );\n await cleanupAndExit(1);\n }\n}\n\n/**\n * Top-level `client` command. Exposes only commands that do not target an\n * existing saved server: `connect` (which creates one) and `list`. Per-server\n * operations live under `createPerClientCommand(<name>)` and are routed by\n * `index.ts` based on the positional after `client`.\n */\nexport function createClientCommand(): Command {\n const clientCommand = new Command(\"client\")\n .description(\n \"Interactive MCP client for terminal usage. Use `mcp-use client <name> ...` to run commands against a saved server.\"\n )\n .showHelpAfterError(\n \"(Run `mcp-use client --help` to see available commands)\"\n );\n\n clientCommand\n .command(\"connect [name] [url]\")\n .description(\n \"Connect to an MCP server and save it under a short name. Use the name to address it in later commands (e.g. `mcp-use client <name> tools list`).\"\n )\n .option(\"--stdio\", \"Use stdio connector instead of HTTP\")\n .option(\"--auth <token>\", \"Static Bearer token (skips OAuth)\")\n .option(\n \"--no-oauth\",\n \"Don't auto-trigger OAuth on 401; fail with the 401 instead\"\n )\n .option(\n \"--auth-timeout <ms>\",\n \"OAuth loopback wait timeout in ms (default 300000)\"\n )\n .action(connectCommand);\n\n clientCommand\n .command(\"list\")\n .description(\"List saved servers\")\n .action(listClientsCommand);\n\n clientCommand\n .command(\"remove <name>\")\n .description(\n \"Remove a saved server. Also clears any OAuth tokens for that URL, unless another saved server still uses it.\"\n )\n .action(removeClientCommand);\n\n clientCommand.addCommand(createClientScreenshotCommand());\n\n return clientCommand;\n}\n\n/**\n * Build the per-server command subtree for a given saved-server name. The\n * name is captured in each action closure so subcommand definitions stay\n * free of an extra positional argument.\n */\nexport function createPerClientCommand(name: string): Command {\n const cmd = new Command(`mcp-use client ${name}`)\n .description(`Commands for server '${name}'`)\n .showHelpAfterError(\n `(Run \\`mcp-use client ${name} --help\\` to see available commands)`\n );\n\n cmd\n .command(\"disconnect\")\n .description(\"Disconnect from this server\")\n .action(() => disconnectCommand(name));\n\n cmd\n .command(\"interactive\")\n .description(\"Start interactive REPL mode for this server\")\n .action(() => interactiveCommand(name));\n\n const toolsCommand = new Command(\"tools\")\n .description(\"Interact with MCP tools\")\n .showHelpAfterError(\n `(Run \\`mcp-use client ${name} tools --help\\` to see available actions)`\n );\n toolsCommand\n .command(\"list\")\n .description(\"List available tools\")\n .option(\"--json\", \"Output as JSON\")\n .action((options) => listToolsCommand(name, options));\n toolsCommand\n .command(\"call <tool> [args...]\")\n .description(\n \"Call a tool. Args as key=value pairs (use key:=<json> for nested values, or pass a JSON object)\"\n )\n .option(\"--timeout <ms>\", \"Request timeout in milliseconds\", parseInt)\n .option(\"--json\", \"Output as JSON\")\n .option(\n \"--screenshot\",\n \"Capture a PNG screenshot of the rendered widget for tools that declare a UI resource\"\n )\n .option(\n \"--screenshot-output <path>\",\n \"Output PNG path for the widget screenshot (implies --screenshot; defaults to ./<view>-<timestamp>.png)\"\n )\n .option(\n \"--screenshot-device-scale-factor <n>\",\n \"Device pixel ratio for the widget screenshot (implies --screenshot; e.g. 2 for Retina). Defaults to 1.\"\n )\n .action((tool, args, options) =>\n callToolCommand(name, tool, args, options)\n );\n toolsCommand\n .command(\"describe <tool>\")\n .description(\"Show tool details and schema\")\n .action((tool) => describeToolCommand(name, tool));\n cmd.addCommand(toolsCommand);\n\n const resourcesCommand = new Command(\"resources\")\n .description(\"Interact with MCP resources\")\n .showHelpAfterError(\n `(Run \\`mcp-use client ${name} resources --help\\` to see available actions)`\n );\n resourcesCommand\n .command(\"list\")\n .description(\"List available resources\")\n .option(\"--json\", \"Output as JSON\")\n .action((options) => listResourcesCommand(name, options));\n resourcesCommand\n .command(\"read <uri>\")\n .description(\"Read a resource by URI\")\n .option(\"--json\", \"Output as JSON\")\n .action((uri, options) => readResourceCommand(name, uri, options));\n resourcesCommand\n .command(\"subscribe <uri>\")\n .description(\"Subscribe to resource updates\")\n .action((uri) => subscribeResourceCommand(name, uri));\n resourcesCommand\n .command(\"unsubscribe <uri>\")\n .description(\"Unsubscribe from resource updates\")\n .action((uri) => unsubscribeResourceCommand(name, uri));\n cmd.addCommand(resourcesCommand);\n\n const promptsCommand = new Command(\"prompts\")\n .description(\"Interact with MCP prompts\")\n .showHelpAfterError(\n `(Run \\`mcp-use client ${name} prompts --help\\` to see available actions)`\n );\n promptsCommand\n .command(\"list\")\n .description(\"List available prompts\")\n .option(\"--json\", \"Output as JSON\")\n .action((options) => listPromptsCommand(name, options));\n promptsCommand\n .command(\"get <prompt> [args...]\")\n .description(\n \"Get a prompt. Args as key=value pairs (or pass a JSON object)\"\n )\n .option(\"--json\", \"Output as JSON\")\n .action((prompt, args, options) =>\n getPromptCommand(name, prompt, args, options)\n );\n cmd.addCommand(promptsCommand);\n\n const authCommand = new Command(\"auth\")\n .description(\"Manage OAuth tokens for HTTP servers\")\n .showHelpAfterError(\n `(Run \\`mcp-use client ${name} auth --help\\` to see available actions)`\n );\n authCommand\n .command(\"status\")\n .description(\"Show OAuth token status for this server\")\n .action(() => authStatusCommand(name));\n authCommand\n .command(\"refresh\")\n .description(\"Force-refresh the OAuth access token\")\n .action(() => authRefreshCommand(name));\n authCommand\n .command(\"logout\")\n .description(\"Remove stored OAuth tokens for this server's URL\")\n .action(() => authLogoutCommand(name));\n cmd.addCommand(authCommand);\n\n cmd.addCommand(createPerClientScreenshotCommand(name));\n\n return cmd;\n}\n","import chalk from \"chalk\";\nimport type { CallToolResult } from \"mcp-use/client\";\n\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g;\nconst GUTTER = \" \";\nconst MIN_TRUNCATABLE_WIDTH = 8;\nconst DEFAULT_MAX_WIDTH = 100;\n\nfunction stripAnsi(s: string): string {\n return s.replace(ANSI_RE, \"\");\n}\n\nfunction visibleWidth(s: string): number {\n return stripAnsi(s).length;\n}\n\nfunction padCell(s: string, width: number): string {\n const w = visibleWidth(s);\n if (w >= width) return s;\n return s + \" \".repeat(width - w);\n}\n\nfunction truncateCell(s: string, width: number): string {\n if (width <= 0) return \"\";\n const plain = stripAnsi(s);\n if (plain.length <= width) return s;\n if (width === 1) return \"…\";\n return plain.slice(0, width - 1) + \"…\";\n}\n\nexport interface TableColumn {\n key: string;\n header: string;\n width?: number;\n truncate?: boolean;\n}\n\nexport interface FormatTableOptions {\n /**\n * Force TSV output regardless of TTY detection. When undefined, auto-detects:\n * non-TTY stdout (pipes, agents, CI) gets TSV; TTY gets the borderless table.\n */\n tsv?: boolean;\n /**\n * Maximum total line width for the table. Defaults to the terminal width\n * (process.stdout.columns) or 100 when unavailable.\n */\n maxWidth?: number;\n}\n\n/**\n * Render rows as either a borderless aligned-columns table (TTY, gh-style)\n * or tab-separated values (non-TTY, machine-readable). Width math strips\n * ANSI escape sequences so colored cells align correctly.\n */\nexport function formatTable(\n data: Array<Record<string, any>>,\n columns: TableColumn[],\n options: FormatTableOptions = {}\n): string {\n const tsv = options.tsv ?? !process.stdout.isTTY;\n\n if (tsv) {\n return data\n .map((row) =>\n columns\n .map((c) =>\n stripAnsi(String(row[c.key] ?? \"\")).replace(/[\\t\\r\\n]+/g, \" \")\n )\n .join(\"\\t\")\n )\n .join(\"\\n\");\n }\n\n if (data.length === 0) {\n return chalk.gray(\"No items found\");\n }\n\n const maxWidth =\n options.maxWidth ?? process.stdout.columns ?? DEFAULT_MAX_WIDTH;\n\n // Natural width = max(header width, widest cell), per column.\n const natural = columns.map((col) => {\n const headerW = col.header.length;\n const dataW = data.reduce((m, row) => {\n return Math.max(m, visibleWidth(String(row[col.key] ?? \"\")));\n }, 0);\n return Math.max(headerW, dataW);\n });\n\n const widths = columns.map((c, i) => c.width ?? natural[i]);\n const overhead = GUTTER.length * (columns.length - 1);\n const totalWidth = () => widths.reduce((s, w) => s + w, 0) + overhead;\n\n // If the natural layout overflows, squeeze truncatable columns proportionally\n // to their natural size. Non-truncatable columns keep their full width.\n if (totalWidth() > maxWidth) {\n const truncIdxs = columns\n .map((c, i) => (c.truncate ? i : -1))\n .filter((i) => i >= 0);\n if (truncIdxs.length > 0) {\n const fixedSum = columns.reduce(\n (s, c, i) => s + (c.truncate ? 0 : widths[i]),\n 0\n );\n const remaining = Math.max(\n truncIdxs.length * MIN_TRUNCATABLE_WIDTH,\n maxWidth - fixedSum - overhead\n );\n const truncSum = truncIdxs.reduce((s, i) => s + widths[i], 0) || 1;\n let used = 0;\n truncIdxs.forEach((i, idx) => {\n if (idx === truncIdxs.length - 1) {\n widths[i] = Math.max(MIN_TRUNCATABLE_WIDTH, remaining - used);\n } else {\n const share = Math.max(\n MIN_TRUNCATABLE_WIDTH,\n Math.floor((widths[i] / truncSum) * remaining)\n );\n widths[i] = share;\n used += share;\n }\n });\n }\n }\n\n const lines: string[] = [];\n\n // Header: UPPERCASE, bold. Pad all but the last cell.\n const headerCells = columns.map((c, i) => {\n const text = c.header.toUpperCase();\n const cell = i === columns.length - 1 ? text : padCell(text, widths[i]);\n return chalk.bold(cell);\n });\n lines.push(headerCells.join(GUTTER).trimEnd());\n\n for (const row of data) {\n const cells = columns.map((c, i) => {\n let v = String(row[c.key] ?? \"\");\n if (visibleWidth(v) > widths[i]) {\n v = truncateCell(v, widths[i]);\n }\n return i === columns.length - 1 ? v : padCell(v, widths[i]);\n });\n lines.push(cells.join(GUTTER).trimEnd());\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Whether stdout is piped/redirected. Callers use this to suppress decorative\n * headers (\"Available Tools (N):\") in non-TTY mode so output stays parseable.\n */\nexport function isStdoutTty(): boolean {\n return Boolean(process.stdout.isTTY);\n}\n\n/**\n * One-word tool mode badge derived from MCP tool annotations.\n * `readOnlyHint` wins; explicit `destructiveHint` is shown red; everything\n * else is \"write\" (yellow), the safer-than-destructive default for the many\n * tools that simply don't annotate.\n */\nexport function formatToolMode(annotations?: {\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n}): string {\n if (annotations?.readOnlyHint === true) return chalk.green(\"read-only\");\n if (annotations?.destructiveHint === true) return chalk.red(\"destructive\");\n return chalk.yellow(\"write\");\n}\n\n/**\n * Format data as JSON\n */\nexport function formatJson(data: any, pretty = true): string {\n if (pretty) {\n return JSON.stringify(data, null, 2);\n }\n return JSON.stringify(data);\n}\n\n/**\n * Format a tool call result\n */\nexport function formatToolCall(result: CallToolResult): string {\n const lines: string[] = [];\n const { isError, structuredContent } = result;\n const hasStructured =\n structuredContent !== undefined && structuredContent !== null;\n // Per MCP spec, when a tool returns structuredContent it SHOULD also\n // serialize the same JSON into a TextContent block for backwards\n // compatibility. Treat structuredContent as canonical and drop the text\n // duplicate. Non-text blocks (image/resource markers) are kept — they carry\n // information the structured payload doesn't, even though the terminal can\n // only render them as placeholders.\n const visibleContent = (result.content ?? []).filter(\n (item) => !hasStructured || item.type !== \"text\"\n );\n const hasVisibleContent = visibleContent.length > 0;\n\n if (isError) {\n lines.push(chalk.red(\"✗ Tool execution failed\"));\n lines.push(\"\");\n } else {\n lines.push(chalk.green(\"✓ Tool executed successfully\"));\n lines.push(\"\");\n }\n\n if (hasVisibleContent) {\n if (isError) {\n lines.push(chalk.red.bold(\"Error details:\"));\n }\n visibleContent.forEach((item, index) => {\n if (visibleContent.length > 1) {\n lines.push(chalk.bold(`Content ${index + 1}:`));\n }\n\n if (item.type === \"text\") {\n lines.push(isError ? chalk.red(item.text) : item.text);\n } else if (item.type === \"image\") {\n lines.push(chalk.cyan(`[Image: ${item.mimeType || \"unknown type\"}]`));\n if (item.data) {\n lines.push(chalk.gray(`Data: ${item.data.substring(0, 50)}...`));\n }\n } else if (item.type === \"resource\") {\n lines.push(chalk.cyan(`[Resource]`));\n if (item.resource?.uri) {\n lines.push(chalk.gray(`URI: ${item.resource.uri}`));\n }\n if (item.resource && \"text\" in item.resource && item.resource.text) {\n lines.push(item.resource.text);\n }\n } else {\n lines.push(chalk.gray(`[Unknown content type: ${item.type}]`));\n }\n\n if (index < visibleContent.length - 1) {\n lines.push(\"\");\n }\n });\n }\n\n if (hasStructured) {\n if (isError) {\n lines.push(chalk.bold(\"Structured error data:\"));\n }\n lines.push(formatJson(structuredContent));\n }\n\n if (isError && !hasVisibleContent && !hasStructured) {\n lines.push(chalk.gray(\"(no error details provided by server)\"));\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format resource content\n */\nexport function formatResourceContent(content: any): string {\n if (!content || !content.contents) {\n return chalk.gray(\"No content\");\n }\n\n const lines: string[] = [];\n\n content.contents.forEach((item: any, index: number) => {\n if (content.contents.length > 1) {\n lines.push(chalk.bold(`Content ${index + 1}:`));\n }\n\n if (item.uri) {\n lines.push(chalk.gray(`URI: ${item.uri}`));\n }\n\n if (item.mimeType) {\n lines.push(chalk.gray(`Type: ${item.mimeType}`));\n }\n\n if (\"text\" in item && item.text) {\n lines.push(\"\");\n lines.push(item.text);\n } else if (\"blob\" in item && item.blob) {\n lines.push(\"\");\n lines.push(chalk.cyan(`[Binary data: ${item.blob.length} bytes]`));\n }\n\n if (index < content.contents.length - 1) {\n lines.push(\"\");\n lines.push(chalk.gray(\"─\".repeat(50)));\n lines.push(\"\");\n }\n });\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a JSON schema in a readable way\n */\nexport function formatSchema(schema: any, indent = 0): string {\n if (!schema) {\n return chalk.gray(\"No schema\");\n }\n\n const lines: string[] = [];\n const pad = \" \".repeat(indent);\n\n if (schema.type === \"object\" && schema.properties) {\n Object.entries(schema.properties).forEach(([key, value]: [string, any]) => {\n const required = schema.required?.includes(key);\n const type = value.type || \"any\";\n const desc = value.description || \"\";\n\n const keyStr = required ? chalk.bold(key) : key;\n const typeStr = chalk.cyan(`(${type})`);\n const requiredStr = required ? chalk.red(\" *required\") : \"\";\n\n lines.push(`${pad}${keyStr} ${typeStr}${requiredStr}`);\n\n if (desc) {\n lines.push(`${pad} ${chalk.gray(desc)}`);\n }\n\n // Handle nested objects\n if (value.type === \"object\" && value.properties) {\n lines.push(formatSchema(value, indent + 1));\n }\n\n // Handle arrays\n if (value.type === \"array\" && value.items) {\n lines.push(`${pad} ${chalk.gray(\"Items:\")}`);\n if (value.items.type === \"object\") {\n lines.push(formatSchema(value.items, indent + 2));\n } else {\n lines.push(\n `${pad} ${chalk.cyan(`(${value.items.type || \"any\"})`)}`\n );\n }\n }\n });\n } else {\n lines.push(`${pad}${chalk.cyan(`Type: ${schema.type || \"any\"}`)}`);\n if (schema.description) {\n lines.push(`${pad}${chalk.gray(schema.description)}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a list of items with bullets\n */\nexport function formatList(items: string[], bullet = \"•\"): string {\n return items.map((item) => ` ${bullet} ${item}`).join(\"\\n\");\n}\n\n/**\n * Format an error message\n */\nexport function formatError(error: Error | string): string {\n const message = typeof error === \"string\" ? error : error.message;\n return chalk.red(`✗ Error: ${message}`);\n}\n\n/**\n * Format a success message\n */\nexport function formatSuccess(message: string): string {\n return chalk.green(`✓ ${message}`);\n}\n\n/**\n * Format an info message\n */\nexport function formatInfo(message: string): string {\n return chalk.cyan(message);\n}\n\n/**\n * Format a warning message\n */\nexport function formatWarning(message: string): string {\n return chalk.yellow(`⚠ ${message}`);\n}\n\n/**\n * Create a section header\n */\nexport function formatHeader(text: string): string {\n return chalk.bold.white(text);\n}\n\n/**\n * Format key-value pairs\n */\nexport function formatKeyValue(\n pairs: Record<string, string | number | boolean>\n): string {\n const maxKeyLength = Math.max(...Object.keys(pairs).map((k) => k.length), 0);\n\n return Object.entries(pairs)\n .map(([key, value]) => {\n const paddedKey = key.padEnd(maxKeyLength);\n return ` ${chalk.gray(paddedKey)}: ${value}`;\n })\n .join(\"\\n\");\n}\n\n/**\n * Format prompt messages\n */\n/**\n * Format a date string as relative time (e.g., \"2 hours ago\", \"3 days ago\")\n */\nexport function formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n const diffWeeks = Math.floor(diffDays / 7);\n const diffMonths = Math.floor(diffDays / 30);\n const diffYears = Math.floor(diffDays / 365);\n\n if (diffYears > 0) {\n return `${diffYears} year${diffYears > 1 ? \"s\" : \"\"} ago`;\n } else if (diffMonths > 0) {\n return `${diffMonths} month${diffMonths > 1 ? \"s\" : \"\"} ago`;\n } else if (diffWeeks > 0) {\n return `${diffWeeks} week${diffWeeks > 1 ? \"s\" : \"\"} ago`;\n } else if (diffDays > 0) {\n return `${diffDays} day${diffDays > 1 ? \"s\" : \"\"} ago`;\n } else if (diffHours > 0) {\n return `${diffHours} hour${diffHours > 1 ? \"s\" : \"\"} ago`;\n } else if (diffMins > 0) {\n return `${diffMins} minute${diffMins > 1 ? \"s\" : \"\"} ago`;\n } else {\n return \"just now\";\n }\n}\n\nexport function formatPromptMessages(messages: any[]): string {\n if (!messages || messages.length === 0) {\n return chalk.gray(\"No messages\");\n }\n\n const lines: string[] = [];\n\n messages.forEach((msg, index) => {\n const role = msg.role || \"unknown\";\n const roleStr =\n role === \"user\"\n ? chalk.blue(\"[User]\")\n : role === \"assistant\"\n ? chalk.green(\"[Assistant]\")\n : chalk.gray(`[${role}]`);\n\n lines.push(`${roleStr}`);\n\n if (msg.content) {\n if (typeof msg.content === \"string\") {\n lines.push(msg.content);\n } else if (msg.content.type === \"text\") {\n lines.push(msg.content.text);\n } else if (msg.content.type === \"image\") {\n lines.push(chalk.cyan(`[Image: ${msg.content.mimeType}]`));\n } else if (msg.content.type === \"resource\") {\n lines.push(chalk.cyan(`[Resource: ${msg.content.resource?.uri}]`));\n if (msg.content.resource?.text) {\n lines.push(msg.content.resource.text);\n }\n }\n }\n\n if (index < messages.length - 1) {\n lines.push(\"\");\n }\n });\n\n return lines.join(\"\\n\");\n}\n","/**\n * Parse positional `key=value` arguments for `tools call` and `prompts get`.\n *\n * Forms accepted (per token):\n * key=value → string by default; coerced using the tool's input schema\n * (number/integer/boolean/array/object) when available\n * key:=jsonvalue → value is parsed as JSON (httpie convention); use this for\n * nested objects/arrays or to force a non-string scalar\n * --key=value → leading `--` is accepted and stripped (forgiving for users\n * who reach for a flag-style habit)\n *\n * Backward-compatible fallback: a single token that starts with `{` is parsed\n * as a JSON object covering all arguments at once.\n */\n\ntype JsonSchemaLike = {\n type?: string | string[];\n properties?: Record<string, JsonSchemaLike>;\n required?: string[];\n};\n\nexport function parseToolArgs(\n rawArgs: string[] | undefined,\n inputSchema?: JsonSchemaLike\n): Record<string, unknown> {\n if (!rawArgs || rawArgs.length === 0) return {};\n\n // Backward-compat: single JSON object argument\n if (rawArgs.length === 1) {\n const trimmed = rawArgs[0].trim();\n if (trimmed.startsWith(\"{\")) {\n try {\n const parsed = JSON.parse(trimmed);\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n throw new Error(\"expected a JSON object\");\n }\n return parsed as Record<string, unknown>;\n } catch (err) {\n throw new Error(`Invalid JSON arguments: ${(err as Error).message}`);\n }\n }\n }\n\n const props = inputSchema?.properties ?? {};\n const result: Record<string, unknown> = {};\n\n for (const raw of rawArgs) {\n // Strip optional leading `--` to be forgiving for flag-style habits.\n const token = raw.startsWith(\"--\") ? raw.slice(2) : raw;\n\n const jsonIdx = token.indexOf(\":=\");\n const eqIdx = token.indexOf(\"=\");\n\n let key: string;\n let rawValue: string;\n let forceJson = false;\n\n if (jsonIdx !== -1 && (eqIdx === -1 || jsonIdx < eqIdx)) {\n key = token.slice(0, jsonIdx);\n rawValue = token.slice(jsonIdx + 2);\n forceJson = true;\n } else if (eqIdx !== -1) {\n key = token.slice(0, eqIdx);\n rawValue = token.slice(eqIdx + 1);\n } else {\n throw new Error(\n `Invalid argument '${raw}'. Use key=value or key:=jsonvalue.`\n );\n }\n\n if (!key) {\n throw new Error(`Empty key in argument '${raw}'`);\n }\n\n result[key] = coerceArgValue(rawValue, props[key], forceJson, key);\n }\n\n return result;\n}\n\nfunction coerceArgValue(\n value: string,\n propSchema: JsonSchemaLike | undefined,\n forceJson: boolean,\n key: string\n): unknown {\n if (forceJson) {\n try {\n return JSON.parse(value);\n } catch (err) {\n throw new Error(\n `Invalid JSON value for '${key}': ${(err as Error).message}`\n );\n }\n }\n\n const types = Array.isArray(propSchema?.type)\n ? propSchema!.type\n : propSchema?.type\n ? [propSchema.type as string]\n : [];\n\n if (types.includes(\"null\") && (value === \"null\" || value === \"\")) {\n return null;\n }\n\n if (types.includes(\"integer\")) {\n const n = Number(value);\n if (!Number.isFinite(n) || !Number.isInteger(n)) {\n throw new Error(`Expected integer for '${key}', got '${value}'`);\n }\n return n;\n }\n\n if (types.includes(\"number\")) {\n const n = Number(value);\n if (!Number.isFinite(n)) {\n throw new Error(`Expected number for '${key}', got '${value}'`);\n }\n return n;\n }\n\n if (types.includes(\"boolean\")) {\n if (value === \"true\" || value === \"1\") return true;\n if (value === \"false\" || value === \"0\") return false;\n throw new Error(\n `Expected boolean (true/false) for '${key}', got '${value}'`\n );\n }\n\n if (types.includes(\"array\") || types.includes(\"object\")) {\n try {\n return JSON.parse(value);\n } catch (err) {\n const wanted = types.includes(\"array\") ? \"array\" : \"object\";\n throw new Error(\n `Expected JSON ${wanted} for '${key}'. Tip: use ${key}:=<json>. ${(err as Error).message}`\n );\n }\n }\n\n return value;\n}\n\n/**\n * Parse positional `key=value` arguments for prompts. Prompt arguments are\n * always strings per the MCP spec, so we skip type coercion entirely.\n */\nexport function parsePromptArgs(\n rawArgs: string[] | undefined\n): Record<string, string> {\n if (!rawArgs || rawArgs.length === 0) return {};\n\n if (rawArgs.length === 1) {\n const trimmed = rawArgs[0].trim();\n if (trimmed.startsWith(\"{\")) {\n try {\n const parsed = JSON.parse(trimmed);\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n throw new Error(\"expected a JSON object\");\n }\n // Coerce all values to strings for prompt args.\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(parsed)) {\n out[k] = typeof v === \"string\" ? v : JSON.stringify(v);\n }\n return out;\n } catch (err) {\n throw new Error(`Invalid JSON arguments: ${(err as Error).message}`);\n }\n }\n }\n\n const result: Record<string, string> = {};\n for (const raw of rawArgs) {\n const token = raw.startsWith(\"--\") ? raw.slice(2) : raw;\n const eqIdx = token.indexOf(\"=\");\n if (eqIdx === -1) {\n throw new Error(`Invalid argument '${raw}'. Use key=value.`);\n }\n const key = token.slice(0, eqIdx);\n const value = token.slice(eqIdx + 1);\n if (!key) {\n throw new Error(`Empty key in argument '${raw}'`);\n }\n result[key] = value;\n }\n return result;\n}\n","import {\n auth,\n NodeOAuthClientProvider,\n OAuthFlowError,\n UnauthorizedError,\n type NodeOAuthOptions,\n} from \"mcp-use/auth/node\";\nimport { createInterface } from \"node:readline\";\n\n/**\n * Build a NodeOAuthClientProvider that prints the authorization URL for the\n * user to open themselves. We never auto-launch a browser from the CLI — a\n * surprise window when an agent or script invokes `mcp-use` is worse than the\n * extra click for an interactive user.\n */\nexport async function buildOAuthProvider(\n serverUrl: string,\n options: Omit<NodeOAuthOptions, \"openBrowser\"> = {}\n): Promise<NodeOAuthClientProvider> {\n return NodeOAuthClientProvider.create(serverUrl, {\n clientName: \"mcp-use CLI\",\n clientUri: \"https://mcp-use.com\",\n storageKeyPrefix: \"mcp:auth\",\n ...options,\n openBrowser: async (url) => {\n console.error(`\\n Open this URL in a browser to authenticate:`);\n console.error(` ${url}\\n`);\n },\n });\n}\n\n/**\n * Run the full two-call OAuth dance:\n * 1. auth() → triggers redirectToAuthorization (prints URL, binds loopback)\n * 2. await provider.getAuthorizationCode()\n * 3. auth() with the code → exchanges for tokens, persists via FileKVStore\n *\n * Mirrors the orchestrator pattern in `useMcp.ts:1121-1145`.\n */\nexport async function runOAuthFlow(\n provider: NodeOAuthClientProvider,\n serverUrl: string,\n print: (line: string) => void = console.error.bind(console)\n): Promise<void> {\n print(`→ OAuth authentication required.`);\n print(\n ` Listening on http://127.0.0.1:${provider.callbackPort}/callback (waiting up to 5m)`\n );\n\n // SDK transports (e.g. StreamableHTTPClientTransport) auto-call auth() on a\n // 401, which already invokes redirectToAuthorization (loopback bound, browser\n // opened). In that case skip the first auth() call — calling it again would\n // throw \"an authorization is already in progress\".\n if (!provider.hasPendingFlow) {\n const result = await auth(provider, { serverUrl });\n if (result === \"AUTHORIZED\") {\n // Pre-existing valid tokens; nothing to do.\n return;\n }\n if (result !== \"REDIRECT\") {\n throw new OAuthFlowError(\n \"unexpected_auth_result\",\n `auth() returned ${result}`\n );\n }\n }\n\n const code = await provider.getAuthorizationCode();\n await auth(provider, { serverUrl, authorizationCode: code });\n}\n\n/** True if the unwrapped error is an SDK 401 we should respond to with OAuth. */\nexport function isUnauthorized(err: unknown): boolean {\n if (err instanceof UnauthorizedError) return true;\n // Some transports rewrap; check by name + message as a fallback.\n if (err instanceof Error && err.name === \"UnauthorizedError\") return true;\n // mcp-use's HttpConnector rewraps SDK 401s as a plain Error with `code = 401`\n // (see packages/mcp-use/src/connectors/http.ts:228, :255).\n if (err instanceof Error && (err as { code?: unknown }).code === 401) {\n return true;\n }\n return false;\n}\n\n/** Minimal yes/no prompt. Returns true on Y/y/yes/<enter>, false otherwise. */\nexport async function promptYesNo(\n question: string,\n defaultYes = true\n): Promise<boolean> {\n if (!process.stdin.isTTY) return false;\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const answer = await new Promise<string>((resolve) => {\n rl.question(`${question} ${defaultYes ? \"[Y/n] \" : \"[y/N] \"}`, resolve);\n });\n const trimmed = answer.trim().toLowerCase();\n if (!trimmed) return defaultYes;\n return trimmed === \"y\" || trimmed === \"yes\";\n } finally {\n rl.close();\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\n\nexport interface SessionConfig {\n type: \"http\" | \"stdio\";\n url?: string;\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n /** Static Bearer token. Used when authMode is undefined or \"bearer\". */\n authToken?: string;\n /**\n * How this session authenticates to the server.\n * - \"bearer\": static token in `authToken`.\n * - \"oauth\": tokens live in `~/.mcp-use/oauth/<urlHash>/`, managed by NodeOAuthClientProvider.\n * Undefined = legacy bearer (back-compat with sessions saved before OAuth shipped).\n */\n authMode?: \"bearer\" | \"oauth\";\n lastUsed: string;\n serverInfo?: {\n name: string;\n version?: string;\n };\n capabilities?: Record<string, unknown>;\n}\n\nexport interface SessionStorage {\n sessions: Record<string, SessionConfig>;\n}\n\nconst SESSION_FILE_PATH = join(homedir(), \".mcp-use\", \"cli-sessions.json\");\n\nlet _dirEnsured = false;\nasync function ensureSessionDir(): Promise<void> {\n if (_dirEnsured) return;\n // `mkdir({ recursive: true })` is a no-op when the dir already exists, so\n // we don't need a separate `existsSync` check.\n await mkdir(join(homedir(), \".mcp-use\"), { recursive: true });\n _dirEnsured = true;\n}\n\n/**\n * Load persisted servers from disk.\n *\n * Tolerates older files that include an `activeSession` field — the field is\n * silently dropped. The CLI no longer tracks an active server; every command\n * names its target explicitly.\n */\nexport async function loadSessions(): Promise<SessionStorage> {\n try {\n await ensureSessionDir();\n\n if (!existsSync(SESSION_FILE_PATH)) {\n return { sessions: {} };\n }\n\n const content = await readFile(SESSION_FILE_PATH, \"utf-8\");\n const parsed = JSON.parse(content);\n return { sessions: parsed?.sessions ?? {} };\n } catch {\n return { sessions: {} };\n }\n}\n\nasync function saveSessions(storage: SessionStorage): Promise<void> {\n await ensureSessionDir();\n await writeFile(SESSION_FILE_PATH, JSON.stringify(storage, null, 2), \"utf-8\");\n}\n\nexport async function saveSession(\n name: string,\n config: SessionConfig\n): Promise<void> {\n const storage = await loadSessions();\n storage.sessions[name] = {\n ...config,\n lastUsed: new Date().toISOString(),\n };\n await saveSessions(storage);\n}\n\nexport async function removeSession(name: string): Promise<void> {\n const storage = await loadSessions();\n delete storage.sessions[name];\n await saveSessions(storage);\n}\n\nexport async function getSession(name: string): Promise<SessionConfig | null> {\n const storage = await loadSessions();\n return storage.sessions[name] || null;\n}\n\nexport async function listAllSessions(): Promise<\n Array<{ name: string; config: SessionConfig }>\n> {\n const storage = await loadSessions();\n return Object.entries(storage.sessions).map(([name, config]) => ({\n name,\n config,\n }));\n}\n\nexport async function updateSessionInfo(\n name: string,\n serverInfo: { name: string; version?: string },\n capabilities?: Record<string, unknown>\n): Promise<void> {\n const storage = await loadSessions();\n\n if (storage.sessions[name]) {\n storage.sessions[name].serverInfo = serverInfo;\n storage.sessions[name].capabilities = capabilities;\n storage.sessions[name].lastUsed = new Date().toISOString();\n await saveSessions(storage);\n }\n}\n","import type { MCPSession } from \"mcp-use/client\";\nimport { MCPClient } from \"mcp-use/client\";\nimport type { NodeOAuthClientProvider } from \"mcp-use/auth/node\";\nimport { getPackageVersion } from \"mcp-use/server\";\nimport { formatError, formatInfo } from \"./format.js\";\nimport {\n buildOAuthProvider,\n isUnauthorized,\n promptYesNo,\n runOAuthFlow,\n} from \"./oauth.js\";\nimport { getSession } from \"./session-storage.js\";\n\nexport const activeSessions = new Map<\n string,\n { client: MCPClient; session: MCPSession }\n>();\n\n/**\n * Default clientInfo for mcp-use CLI.\n */\nexport function getCliClientInfo() {\n return {\n name: \"mcp-use CLI\",\n title: \"mcp-use CLI\",\n version: getPackageVersion(),\n description: \"mcp-use CLI - Command-line interface for MCP servers\",\n icons: [\n {\n src: \"https://manufact.com/logo.png\",\n },\n ],\n websiteUrl: \"https://manufact.com\",\n };\n}\n\n/**\n * Close every in-memory session and exit with `code`.\n *\n * Each `client` subcommand opens a fresh transport per process invocation,\n * which keeps an HTTP/SSE socket alive after the command returns. Without\n * this, the Node event loop never goes idle and headless agents hang.\n */\nexport async function cleanupAndExit(code: number): Promise<never> {\n for (const [name, { client }] of activeSessions) {\n try {\n await client.closeAllSessions();\n } catch {\n // best-effort: we're exiting anyway\n }\n activeSessions.delete(name);\n }\n process.exit(code);\n}\n\n/**\n * Get or restore a session by name. For OAuth-mode sessions whose tokens\n * have expired and can't be refreshed, prompts to re-auth on TTY or prints\n * a clear `connect` command to re-run on non-TTY.\n *\n * `sessionName` is required — there is no implicit \"active\" server.\n */\nexport async function getOrRestoreSession(\n sessionName: string\n): Promise<{ name: string; session: MCPSession } | null> {\n if (activeSessions.has(sessionName)) {\n const { session } = activeSessions.get(sessionName)!;\n return { name: sessionName, session };\n }\n\n const config = await getSession(sessionName);\n if (!config) {\n console.error(formatError(`Server '${sessionName}' not found`));\n console.error(\n formatInfo(\n `Connect with: npx mcp-use client connect ${sessionName} <url>`\n )\n );\n return null;\n }\n\n try {\n const client = new MCPClient();\n const cliClientInfo = getCliClientInfo();\n let authProvider: NodeOAuthClientProvider | undefined;\n\n if (config.type === \"http\") {\n if (config.authMode === \"oauth\") {\n authProvider = await buildOAuthProvider(config.url!);\n client.addServer(sessionName, {\n url: config.url!,\n authProvider,\n clientInfo: cliClientInfo,\n });\n } else {\n client.addServer(sessionName, {\n url: config.url!,\n headers: config.authToken\n ? { Authorization: `Bearer ${config.authToken}` }\n : undefined,\n clientInfo: cliClientInfo,\n });\n }\n } else if (config.type === \"stdio\") {\n client.addServer(sessionName, {\n command: config.command!,\n args: config.args || [],\n env: config.env,\n clientInfo: cliClientInfo,\n });\n } else {\n console.error(formatError(`Unknown session type: ${config.type}`));\n return null;\n }\n\n let session: MCPSession;\n try {\n session = await client.createSession(sessionName);\n } catch (err) {\n // OAuth-only fallback: tokens expired and refresh failed → re-auth.\n if (\n config.type === \"http\" &&\n config.authMode === \"oauth\" &&\n authProvider &&\n isUnauthorized(err)\n ) {\n const reAuth = await promptYesNo(\n `! Tokens for server '${sessionName}' expired and could not refresh. Re-authenticate now?`,\n true\n );\n if (!reAuth) {\n console.error(formatError(`Tokens expired and could not refresh.`));\n console.error(\n formatInfo(\n `Run: mcp-use client connect ${sessionName} ${config.url}`\n )\n );\n return null;\n }\n await runOAuthFlow(authProvider, config.url!);\n session = await client.createSession(sessionName);\n } else {\n throw err;\n }\n }\n\n activeSessions.set(sessionName, { client, session });\n return { name: sessionName, session };\n } catch (error: any) {\n console.error(formatError(`Failed to restore server: ${error.message}`));\n return null;\n }\n}\n","import {\n formatError,\n formatInfo,\n formatKeyValue,\n formatSuccess,\n} from \"../utils/format.js\";\nimport { buildOAuthProvider } from \"../utils/oauth.js\";\nimport { getSession } from \"../utils/session-storage.js\";\n\nasync function resolveSession(\n name: string\n): Promise<{ name: string; url: string } | null> {\n const config = await getSession(name);\n if (!config) {\n console.error(formatError(`Server '${name}' not found`));\n return null;\n }\n if (config.type !== \"http\") {\n console.error(formatError(\"Auth commands only apply to HTTP servers\"));\n return null;\n }\n if (config.authMode !== \"oauth\") {\n console.error(\n formatError(\n `Server '${name}' was not authenticated via OAuth (authMode=${config.authMode ?? \"bearer\"})`\n )\n );\n return null;\n }\n return { name, url: config.url! };\n}\n\nfunction formatExpiresIn(expSec: number): string {\n const ms = expSec * 1000 - Date.now();\n if (ms <= 0) return \"expired\";\n const mins = Math.round(ms / 60_000);\n if (mins < 60) return `${mins}m`;\n const hours = Math.floor(mins / 60);\n const rem = mins % 60;\n return rem ? `${hours}h${rem}m` : `${hours}h`;\n}\n\nfunction decodeJwtExp(token: string): number | null {\n try {\n const parts = token.split(\".\");\n if (parts.length < 2) return null;\n const payload = JSON.parse(\n Buffer.from(parts[1], \"base64url\").toString(\"utf-8\")\n );\n return typeof payload.exp === \"number\" ? payload.exp : null;\n } catch {\n return null;\n }\n}\n\nexport async function authStatusCommand(name: string): Promise<void> {\n const target = await resolveSession(name);\n if (!target) {\n process.exit(1);\n }\n const { name: serverName, url } = target;\n const provider = await buildOAuthProvider(url);\n const tokens = await provider.tokens();\n\n const fields: Record<string, string> = {\n server: serverName,\n url,\n tokens: tokens?.access_token ? \"present\" : \"missing\",\n };\n if (tokens?.scope) fields.scope = tokens.scope;\n if (tokens?.access_token) {\n const exp = decodeJwtExp(tokens.access_token);\n fields.expires_in = exp ? formatExpiresIn(exp) : \"unknown (opaque token)\";\n }\n fields.refresh = tokens?.refresh_token ? \"available\" : \"missing\";\n\n console.log(formatKeyValue(fields));\n\n if (!tokens?.access_token) process.exit(1);\n}\n\nexport async function authRefreshCommand(name: string): Promise<void> {\n const target = await resolveSession(name);\n if (!target) {\n process.exit(1);\n }\n const { name: serverName, url } = target;\n const provider = await buildOAuthProvider(url);\n const refreshed = await provider.forceRefresh();\n if (!refreshed) {\n console.error(\n formatError(\n \"Refresh failed (no refresh_token, or server rejected). Re-connect to re-authenticate.\"\n )\n );\n console.error(\n formatInfo(`Run: mcp-use client connect ${serverName} ${url}`)\n );\n process.exit(1);\n }\n const exp = refreshed.access_token\n ? decodeJwtExp(refreshed.access_token)\n : null;\n console.log(\n formatSuccess(\n `Refreshed access token${exp ? ` (expires in ${formatExpiresIn(exp)})` : \"\"}`\n )\n );\n}\n\nexport async function authLogoutCommand(name: string): Promise<void> {\n const target = await resolveSession(name);\n if (!target) {\n process.exit(1);\n }\n const { name: serverName, url } = target;\n const provider = await buildOAuthProvider(url);\n await provider.invalidateCredentials(\"all\");\n console.log(formatSuccess(`Removed tokens for ${url}`));\n console.log(\n formatInfo(\n `Server '${serverName}' kept; reconnect with \\`mcp-use client connect\\`.`\n )\n );\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { MCPSession } from \"mcp-use/client\";\nimport { MCPClient } from \"mcp-use/client\";\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir } from \"node:fs/promises\";\nimport { createServer } from \"node:net\";\nimport path from \"node:path\";\nimport { captureScreenshot } from \"../utils/cdp-screenshot.js\";\nimport { resolveChromePath } from \"../utils/chrome-path.js\";\nimport { formatError, formatInfo, formatSchema } from \"../utils/format.js\";\nimport { parseToolArgs } from \"../utils/parse-args.js\";\nimport {\n activeSessions,\n cleanupAndExit,\n getCliClientInfo,\n getOrRestoreSession,\n} from \"../utils/session.js\";\n\ninterface ScreenshotOptions {\n tool?: string;\n width: string;\n height: string;\n inspector?: string;\n mcp?: string;\n theme: \"light\" | \"dark\";\n output?: string;\n waitFor?: string;\n delay?: string;\n quiet?: boolean;\n timeout: string;\n cdpUrl?: string;\n header?: string[];\n deviceScaleFactor?: string;\n}\n\ninterface ScreenshotContext {\n sessionName?: string;\n usagePrefix: string;\n}\n\n/**\n * Curl-style `Key: Value` parser. Splits on the first `:` so values may\n * contain colons, and trims both sides so `Authorization:Bearer xyz` and\n * `Authorization: Bearer xyz` are equivalent.\n */\nexport function parseHeaderArg(raw: string): [string, string] {\n const idx = raw.indexOf(\":\");\n if (idx === -1) {\n throw new Error(\n `Invalid --header value \"${raw}\". Expected \"Key: Value\" (e.g. \"Authorization: Bearer xyz\").`\n );\n }\n const key = raw.slice(0, idx).trim();\n const value = raw.slice(idx + 1).trim();\n if (!key) {\n throw new Error(`Invalid --header value \"${raw}\". Header name is empty.`);\n }\n return [key, value];\n}\n\nexport function parseHeaderArgs(args: string[]): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const raw of args) {\n const [key, value] = parseHeaderArg(raw);\n headers[key] = value;\n }\n return headers;\n}\n\nfunction collectHeader(value: string, previous: string[] = []): string[] {\n return previous.concat([value]);\n}\n\ninterface ScreenshotBundle {\n resourceUri: string;\n resourceContents: unknown;\n toolInput?: Record<string, unknown>;\n toolOutput?: unknown;\n}\n\n/**\n * Inspect a tool's `_meta` for the UI resource URI it renders, if any. Falls back\n * to the OpenAI Apps `openai/outputTemplate` key for cross-ecosystem compatibility.\n */\nexport function detectToolResourceUri(\n tool: { _meta?: Record<string, unknown> } | undefined | null\n): string | null {\n if (!tool) return null;\n const meta = tool._meta;\n if (!meta) return null;\n const uiMeta = (meta.ui as { resourceUri?: string } | undefined) ?? undefined;\n return (\n uiMeta?.resourceUri ??\n (meta[\"openai/outputTemplate\"] as string | undefined) ??\n null\n );\n}\n\nexport interface CaptureToolScreenshotInputs {\n session: MCPSession;\n toolName: string;\n toolArgs: Record<string, unknown>;\n toolOutput: unknown;\n resourceUri: string;\n}\n\nexport interface CaptureToolScreenshotOptions {\n width?: number;\n height?: number;\n theme?: \"light\" | \"dark\";\n output?: string;\n waitFor?: string;\n delayMs?: number;\n timeoutMs?: number;\n inspector?: string;\n quiet?: boolean;\n /**\n * Pre-existing CDP WebSocket URL. When set, the screenshot is captured via\n * the remote browser instead of spawning a local Chrome. The inspector URL\n * must be reachable from that remote browser.\n */\n cdpUrl?: string;\n /**\n * Device pixel ratio for rendering. Defaults to 1. With a value of 2 the\n * resulting PNG is (width × 2) × (height × 2) device pixels (Retina-style\n * capture). Forwarded to `Emulation.setDeviceMetricsOverride`.\n */\n deviceScaleFactor?: number;\n}\n\nexport interface CaptureToolScreenshotResult {\n outputPath: string;\n width: number;\n height: number;\n view: string;\n}\n\n/**\n * End-to-end screenshot pipeline for a tool whose UI resource has already been\n * resolved. Reuses the caller's existing tool result so we don't re-invoke the\n * tool, ensures a dev server is running (spawning one if needed), reads the UI\n * resource, and captures via CDP. Cleans up any spawned dev server before\n * returning, even on failure.\n */\nexport async function captureToolScreenshot(\n inputs: CaptureToolScreenshotInputs,\n options: CaptureToolScreenshotOptions = {}\n): Promise<CaptureToolScreenshotResult> {\n const width = options.width ?? 800;\n const height = options.height ?? 600;\n const theme: \"light\" | \"dark\" = options.theme ?? \"light\";\n const timeoutMs = options.timeoutMs ?? 30000;\n const delayMs = options.delayMs ?? 0;\n\n const chromePath = options.cdpUrl ? undefined : resolveChromePath();\n const view = extractViewName(inputs.resourceUri);\n\n const devOptions: ScreenshotOptions = {\n width: String(width),\n height: String(height),\n theme,\n timeout: String(timeoutMs),\n inspector: options.inspector,\n quiet: options.quiet,\n };\n\n let devHandle: DevServerHandle | undefined;\n try {\n devHandle = await ensureDevServer(devOptions);\n\n const resourceContents = await inputs.session.readResource(\n inputs.resourceUri\n );\n const bundle: ScreenshotBundle = {\n resourceUri: inputs.resourceUri,\n resourceContents,\n toolInput: inputs.toolArgs,\n toolOutput: inputs.toolOutput,\n };\n\n const previewUrl = new URL(`/inspector/preview/${view}`, devHandle.url);\n previewUrl.searchParams.set(\"theme\", theme);\n\n const ts = timestampSuffix();\n const outputPath = path.resolve(options.output ?? `./${view}-${ts}.png`);\n await mkdir(path.dirname(outputPath), { recursive: true });\n\n await captureScreenshot({\n url: previewUrl.toString(),\n width,\n height,\n theme,\n waitForSelector: options.waitFor ?? 'body[data-view-ready=\"true\"]',\n timeoutMs,\n outputPath,\n chromePath,\n cdpUrl: options.cdpUrl,\n delayMs: Number.isFinite(delayMs) && delayMs > 0 ? delayMs : 0,\n bundle,\n deviceScaleFactor: options.deviceScaleFactor,\n });\n\n return { outputPath, width, height, view };\n } finally {\n killChild(devHandle?.child);\n }\n}\n\n/**\n * Allocate a free TCP port by binding to 0 and reading back what the OS chose.\n */\nfunction getFreePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const srv = createServer();\n srv.unref();\n srv.on(\"error\", reject);\n srv.listen(0, () => {\n const addr = srv.address();\n if (typeof addr === \"object\" && addr) {\n const port = addr.port;\n srv.close(() => resolve(port));\n } else {\n srv.close(() => reject(new Error(\"Failed to allocate free port\")));\n }\n });\n });\n}\n\n/**\n * Probe a server's `/inspector/health` endpoint. Returns true only if it\n * responds with the inspector's JSON payload (`{ status: \"ok\" }`).\n *\n * A bare `res.ok` check is not enough: a Vite/SPA dev server happily returns\n * 200 + HTML for any unknown path (SPA fallback), which would be misidentified\n * as a valid inspector and later cause a silent timeout when the preview\n * route is missing.\n */\nasync function probeServer(url: string, timeoutMs = 1500): Promise<boolean> {\n const controller = new AbortController();\n const t = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const u = new URL(\"/inspector/health\", url);\n const res = await fetch(u, { signal: controller.signal });\n if (!res.ok) return false;\n const ct = res.headers.get(\"content-type\") ?? \"\";\n if (!ct.includes(\"application/json\")) return false;\n const body = (await res.json()) as { status?: string };\n return body?.status === \"ok\";\n } catch {\n return false;\n } finally {\n clearTimeout(t);\n }\n}\n\n/**\n * Wait until `/inspector/health` reports ready, polling every 200ms.\n */\nasync function waitForHealth(url: string, timeoutMs = 15000): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (await probeServer(url)) return true;\n await new Promise((r) => setTimeout(r, 200));\n }\n return false;\n}\n\ninterface DevServerHandle {\n url: string;\n child?: ChildProcess;\n}\n\n/**\n * Resolve the path to `@mcp-use/inspector`'s standalone CLI entry. Throws\n * with a clear message when the inspector package can't be located — that\n * usually means the workspace hasn't been installed/built.\n *\n * We can't use `require.resolve('@mcp-use/inspector')` because the inspector\n * package's `exports` field only declares an `import` condition, so CJS\n * resolution fails. Subpath resolution (`/dist/cli.js`, `/package.json`)\n * also fails because neither is listed in `exports`. So we walk up from\n * both the current module and the CWD looking for the installed package.\n */\nfunction resolveInspectorCli(): string {\n const candidateRoots = new Set<string>();\n // CJS: __dirname is defined; ESM: derive from import.meta.url.\n const moduleDir =\n typeof __dirname !== \"undefined\"\n ? __dirname\n : path.dirname(new URL(import.meta.url).pathname);\n candidateRoots.add(moduleDir);\n candidateRoots.add(process.cwd());\n\n for (const start of candidateRoots) {\n let dir = start;\n while (true) {\n const candidate = path.join(\n dir,\n \"node_modules\",\n \"@mcp-use\",\n \"inspector\",\n \"dist\",\n \"cli.js\"\n );\n if (existsSync(candidate)) return candidate;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n }\n throw new Error(\n \"Could not locate `@mcp-use/inspector` in node_modules. Install the inspector package or pass --inspector <url> to use an existing instance.\"\n );\n}\n\n/**\n * Resolve a usable inspector host:\n *\n * - When `--inspector <url>` is given, probe it (strict: must return the\n * inspector's JSON health payload) and use it.\n * - Otherwise, always spawn a fresh `@mcp-use/inspector` on a free port.\n *\n * Note: we no longer try to reuse a server on `localhost:3000`. A Vite-only\n * dev server (or any unrelated 200-returning service) would otherwise be\n * misidentified and cause silent rendering failures. Always-spawn keeps\n * behavior predictable and decoupled from whatever else is running locally.\n */\nasync function ensureDevServer(\n options: ScreenshotOptions\n): Promise<DevServerHandle> {\n if (options.inspector) {\n const ok = await probeServer(options.inspector);\n if (!ok) {\n throw new Error(\n `Inspector at ${options.inspector} did not respond on /inspector/health with status:\"ok\"`\n );\n }\n return { url: options.inspector };\n }\n\n const port = await getFreePort();\n const url = `http://localhost:${port}`;\n if (!options.quiet) {\n console.error(formatInfo(`Starting inspector on port ${port}…`));\n }\n\n const inspectorCli = resolveInspectorCli();\n const child = spawn(\n process.execPath,\n [inspectorCli, \"--port\", String(port), \"--no-open\"],\n {\n cwd: process.cwd(),\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, MCP_INSPECTOR_MODE: \"standalone\" },\n }\n );\n\n const prefix = chalk.gray(\"[inspector]\");\n if (!options.quiet) {\n child.stdout?.on(\"data\", (d: Buffer) => {\n process.stderr.write(`${prefix} ${d}`);\n });\n child.stderr?.on(\"data\", (d: Buffer) => {\n process.stderr.write(`${prefix} ${d}`);\n });\n } else {\n child.stdout?.resume();\n child.stderr?.resume();\n }\n\n const ready = await waitForHealth(url);\n if (!ready) {\n child.kill(\"SIGTERM\");\n throw new Error(`Inspector failed to come up on ${url} within 15s.`);\n }\n return { url, child };\n}\n\nfunction killChild(child: ChildProcess | undefined) {\n if (!child || child.killed) return;\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // Ignore.\n }\n}\n\n/**\n * Returns a filesystem-safe timestamp string: YYYY-MM-DD_HH-mm-ss\n */\nexport function timestampSuffix(date = new Date()): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const datePart = `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n const timePart = `${pad(date.getHours())}-${pad(date.getMinutes())}-${pad(date.getSeconds())}`;\n return `${datePart}_${timePart}`;\n}\n\nexport function extractViewName(resourceUri: string): string {\n const m = resourceUri.match(/^ui:\\/\\/widget\\/(.+)$/);\n if (!m) return resourceUri;\n // Strip trailing .html and any .<buildId> segment before it.\n return m[1].replace(/\\.html$/, \"\").replace(/\\.[0-9a-f]+$/i, \"\");\n}\n\nexport function parseDimension(raw: string, name: string): number {\n const n = parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(`--${name} must be a positive integer (got \"${raw}\")`);\n }\n return n;\n}\n\n/**\n * Parse `--device-scale-factor <n>`. Allows fractional values (e.g. 1.5) and\n * caps at 4 to avoid accidental 16x-pixel screenshots (memory + disk).\n */\nexport function parseDeviceScaleFactor(raw: string): number {\n const n = parseFloat(raw);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(\n `--device-scale-factor must be a positive number (got \"${raw}\")`\n );\n }\n if (n > 4) {\n throw new Error(\n `--device-scale-factor must be <= 4 to avoid excessive pixel counts (got \"${raw}\")`\n );\n }\n return n;\n}\n\nexport function requiresArguments(inputSchema: unknown): boolean {\n if (!inputSchema || typeof inputSchema !== \"object\") return false;\n const required = (inputSchema as { required?: unknown }).required;\n return Array.isArray(required) && required.length > 0;\n}\n\nconst AD_HOC_SESSION_NAME = \"__screenshot_ad_hoc__\";\n\n/**\n * Resolve an authenticated MCPSession for the screenshot run.\n *\n * Resolution order:\n * 1. `sessionName` → restore that saved server (passed in by the per-client\n * subcommand `mcp-use client <name> screenshot`).\n * 2. `--mcp <url>` → open an unauthenticated ad-hoc session at that URL.\n */\nasync function resolveSessionForScreenshot(\n options: ScreenshotOptions,\n sessionName: string | undefined,\n headers: Record<string, string> | undefined\n): Promise<MCPSession | null> {\n if (sessionName) {\n const result = await getOrRestoreSession(sessionName);\n return result?.session ?? null;\n }\n\n if (options.mcp) {\n const client = new MCPClient();\n client.addServer(AD_HOC_SESSION_NAME, {\n url: options.mcp,\n ...(headers ? { headers } : {}),\n clientInfo: getCliClientInfo(),\n });\n try {\n const session = await client.createSession(AD_HOC_SESSION_NAME);\n activeSessions.set(AD_HOC_SESSION_NAME, { client, session });\n return session;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(formatError(`Failed to connect to ${options.mcp}: ${msg}`));\n return null;\n }\n }\n\n console.error(\n formatError(\n \"No MCP target. Pass --mcp <url> for an ad-hoc connection, or use `mcp-use client <name> screenshot` for a saved server.\"\n )\n );\n return null;\n}\n\nexport async function screenshotCommand(\n options: ScreenshotOptions,\n argsList: string[] | undefined,\n context: ScreenshotContext\n): Promise<void> {\n let exitCode = 0;\n\n try {\n if (!options.tool) {\n console.error(\n formatError(\n \"--tool <name> is required (optionally with key=value args).\"\n )\n );\n exitCode = 1;\n return;\n }\n\n let headers: Record<string, string> | undefined;\n if (options.header && options.header.length > 0) {\n if (!options.mcp) {\n console.error(\n formatError(\n \"--header is only supported with --mcp <url>. Saved servers carry their own auth from `mcp-use client connect`.\"\n )\n );\n exitCode = 1;\n return;\n }\n try {\n headers = parseHeaderArgs(options.header);\n } catch (err) {\n console.error(\n formatError(err instanceof Error ? err.message : String(err))\n );\n exitCode = 1;\n return;\n }\n }\n\n try {\n resolveChromePath();\n } catch (err) {\n console.error(\n formatError(err instanceof Error ? err.message : String(err))\n );\n exitCode = 1;\n return;\n }\n\n const width = parseDimension(options.width, \"width\");\n const height = parseDimension(options.height, \"height\");\n const navTimeout = parseInt(options.timeout, 10) || 30000;\n const delayMs = options.delay ? parseInt(options.delay, 10) : 0;\n const deviceScaleFactor = options.deviceScaleFactor\n ? parseDeviceScaleFactor(options.deviceScaleFactor)\n : undefined;\n\n // Resolve session before spawning the dev server so auth issues fail fast.\n const session = await resolveSessionForScreenshot(\n options,\n context.sessionName,\n headers\n );\n if (!session) {\n exitCode = 1;\n return;\n }\n\n const tool = session.tools.find((t) => t.name === options.tool);\n if (!tool) {\n throw new Error(\n `Tool \"${options.tool}\" not found. Available: ${session.tools\n .map((t) => t.name)\n .join(\", \")}`\n );\n }\n const resourceUri = detectToolResourceUri(tool);\n if (!resourceUri) {\n throw new Error(\n `Tool \"${options.tool}\" does not declare a UI resource (expected _meta.ui.resourceUri or openai/outputTemplate).`\n );\n }\n\n let toolArgs: Record<string, unknown> = {};\n if (argsList && argsList.length > 0) {\n try {\n toolArgs = parseToolArgs(\n argsList,\n tool.inputSchema as Parameters<typeof parseToolArgs>[1]\n );\n } catch (err) {\n console.error(\n formatError(err instanceof Error ? err.message : String(err))\n );\n console.log(\"\");\n console.log(formatInfo(\"Usage:\"));\n console.log(\n ` npx ${context.usagePrefix} --tool ${options.tool} key=value [key2=value2 ...]`\n );\n console.log(\n ` npx ${context.usagePrefix} --tool ${options.tool} nested:='{\"a\":1}' # JSON value`\n );\n console.log(\n ` npx ${context.usagePrefix} --tool ${options.tool} '{\"key\":\"value\"}' # full JSON object`\n );\n if (tool.inputSchema) {\n console.log(\"\");\n console.log(formatInfo(\"Tool schema:\"));\n console.log(formatSchema(tool.inputSchema));\n }\n exitCode = 1;\n return;\n }\n } else if (requiresArguments(tool.inputSchema)) {\n console.error(formatError(\"This tool requires arguments.\"));\n console.log(\"\");\n console.log(formatInfo(\"Provide arguments as key=value pairs:\"));\n console.log(\n ` npx ${context.usagePrefix} --tool ${options.tool} key=value [key2=value2 ...]`\n );\n console.log(\"\");\n console.log(formatInfo(\"Tool schema:\"));\n console.log(formatSchema(tool.inputSchema));\n exitCode = 1;\n return;\n }\n const toolOutput = await session.callTool(options.tool, toolArgs);\n\n const result = await captureToolScreenshot(\n {\n session,\n toolName: options.tool,\n toolArgs,\n toolOutput,\n resourceUri,\n },\n {\n width,\n height,\n theme: options.theme,\n output: options.output,\n waitFor: options.waitFor,\n delayMs,\n timeoutMs: navTimeout,\n inspector: options.inspector,\n quiet: options.quiet,\n cdpUrl: options.cdpUrl,\n deviceScaleFactor,\n }\n );\n\n console.log(\n `Saved screenshot: ${result.outputPath} (${result.width}×${result.height})`\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(formatError(`Screenshot failed: ${msg}`));\n exitCode = 1;\n } finally {\n await cleanupAndExit(exitCode);\n }\n}\n\n/**\n * Apply the screenshot flags that are common to both the ad-hoc top-level form\n * (`mcp-use client screenshot`) and the per-server form\n * (`mcp-use client <name> screenshot`).\n */\nfunction withCommonScreenshotOptions(cmd: Command): Command {\n return cmd\n .argument(\n \"[args...]\",\n \"Tool args as key=value pairs (use key:=<json> for nested values, or pass a single JSON object).\"\n )\n .option(\n \"--tool <name>\",\n \"Tool to call. Its UI resource is rendered with the result.\"\n )\n .option(\"--width <px>\", \"Browser viewport width in pixels.\", \"800\")\n .option(\"--height <px>\", \"Browser viewport height in pixels.\", \"600\")\n .option(\n \"--device-scale-factor <n>\",\n \"Device pixel ratio for rendering (e.g. 2 for Retina). Output PNG is (width × dsf) × (height × dsf). Must be > 0 and <= 4.\"\n )\n .option(\n \"--inspector <url>\",\n \"Inspector host that serves /inspector/preview/:view. When omitted, auto-spawns `@mcp-use/inspector` on a free port.\"\n )\n .option(\n \"--theme <light|dark>\",\n \"Color scheme to render the view in.\",\n \"light\"\n )\n .option(\n \"--output <path>\",\n \"Output PNG path. Defaults to ./<view>-<timestamp>.png in cwd.\"\n )\n .option(\n \"--wait-for <selector>\",\n 'Override readiness selector (default: body[data-view-ready=\"true\"]).'\n )\n .option(\n \"--delay <ms>\",\n \"Extra wait after readiness, to let chart animations / async layouts settle.\",\n \"0\"\n )\n .option(\"--timeout <ms>\", \"Navigation + readiness timeout in ms.\", \"30000\")\n .option(\n \"--cdp-url <url>\",\n \"Connect to an existing CDP WebSocket (ws:// or wss://) instead of spawning local Chrome. Useful for hosted browsers like Notte.\"\n )\n .option(\"--quiet\", \"Suppress dev-server output.\");\n}\n\n/**\n * Top-level ad-hoc form: `mcp-use client screenshot --mcp <url> --tool <name>`.\n *\n * Doesn't take a saved-server positional. The MCP server is supplied inline\n * via `--mcp`, and authenticated servers can be reached with repeatable\n * `-H, --header` flags. This is the programmatic entry point for one-off or\n * automated screenshot runs that don't want to first `mcp-use client connect`.\n */\nexport function createClientScreenshotCommand(): Command {\n const cmd = withCommonScreenshotOptions(\n new Command(\"screenshot\").description(\n \"Render an MCP Apps view headlessly and save a PNG. Connects to an MCP server inline via --mcp; for a saved server, use `mcp-use client <name> screenshot`.\"\n )\n )\n .option(\n \"--mcp <url>\",\n \"Ad-hoc MCP server URL. Required for the top-level form. No authentication unless --header is supplied.\"\n )\n .option(\n \"-H, --header <header>\",\n 'HTTP header to send to the --mcp <url> server, formatted \"Key: Value\". Repeatable. Use to pass an Authorization bearer token or other auth headers when screenshotting an authenticated MCP server.',\n collectHeader,\n [] as string[]\n );\n\n cmd.action(async (args: string[], opts: ScreenshotOptions) => {\n await screenshotCommand(opts, args, {\n usagePrefix: \"mcp-use client screenshot\",\n });\n });\n\n return cmd;\n}\n\n/**\n * Per-server form: `mcp-use client <name> screenshot --tool <name>`. The saved\n * server's auth (OAuth or bearer) is reused — no `--mcp`/`--header` flags.\n */\nexport function createPerClientScreenshotCommand(name: string): Command {\n const cmd = withCommonScreenshotOptions(\n new Command(\"screenshot\").description(\n `Render an MCP Apps view headlessly using the saved server '${name}'.`\n )\n );\n\n cmd.action(async (args: string[], opts: ScreenshotOptions) => {\n await screenshotCommand(opts, args, {\n sessionName: name,\n usagePrefix: `mcp-use client ${name} screenshot`,\n });\n });\n\n return cmd;\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport WebSocket from \"ws\";\n\nexport interface CaptureScreenshotOptions {\n url: string;\n width: number;\n height: number;\n theme: \"light\" | \"dark\";\n waitForSelector: string;\n timeoutMs: number;\n outputPath: string;\n /** Path to local Chrome. Required unless `cdpUrl` is supplied. */\n chromePath?: string;\n /**\n * Pre-existing CDP WebSocket URL (ws:// or wss://). When set, no local\n * Chrome is spawned — we connect directly to this endpoint. Useful for\n * driving a hosted Chromium (e.g. Notte) in sandboxed environments.\n */\n cdpUrl?: string;\n /** Extra wait after the readiness selector matches, to let animations settle. */\n delayMs?: number;\n /**\n * Device pixel ratio applied via `Emulation.setDeviceMetricsOverride`. The\n * viewport stays `width × height` in CSS pixels but the resulting PNG is\n * `(width × dsf) × (height × dsf)` device pixels — same convention as\n * Playwright/Puppeteer. Defaults to 1.\n */\n deviceScaleFactor?: number;\n /**\n * Optional pre-render bundle. When provided, it is JSON-serialized and\n * assigned to `globalThis.__mcpUsePreviewBundle` before any document\n * scripts run. The inspector preview route reads this global and renders\n * inline data instead of opening a live MCP connection from the browser.\n */\n bundle?: unknown;\n}\n\ninterface PendingCall {\n resolve: (result: unknown) => void;\n reject: (err: Error) => void;\n}\n\ninterface CdpMessage {\n id?: number;\n method?: string;\n result?: Record<string, unknown>;\n error?: { message?: string };\n}\n\n/**\n * Tiny CDP RPC client over a single WebSocket. Handles flat-mode session\n * routing — every call may carry a sessionId.\n */\nclass CdpClient {\n private nextId = 0;\n private readonly pending = new Map<number, PendingCall>();\n\n constructor(private readonly ws: WebSocket) {\n ws.on(\"message\", (data) => {\n let msg: CdpMessage;\n try {\n msg = JSON.parse(data.toString()) as CdpMessage;\n } catch {\n return;\n }\n if (typeof msg.id !== \"number\") return;\n const cb = this.pending.get(msg.id);\n if (!cb) return;\n this.pending.delete(msg.id);\n if (msg.error) {\n cb.reject(new Error(msg.error.message ?? \"CDP error\"));\n } else {\n cb.resolve(msg.result ?? {});\n }\n });\n ws.on(\"close\", () => {\n for (const cb of this.pending.values()) {\n cb.reject(new Error(\"CDP WebSocket closed\"));\n }\n this.pending.clear();\n });\n ws.on(\"error\", (err) => {\n for (const cb of this.pending.values()) {\n cb.reject(err);\n }\n this.pending.clear();\n });\n }\n\n send<T = Record<string, unknown>>(\n method: string,\n params: Record<string, unknown> = {},\n sessionId?: string\n ): Promise<T> {\n const id = ++this.nextId;\n const payload: Record<string, unknown> = { id, method, params };\n if (sessionId) payload.sessionId = sessionId;\n return new Promise<T>((resolve, reject) => {\n this.pending.set(id, {\n resolve: (r) => resolve(r as T),\n reject,\n });\n this.ws.send(JSON.stringify(payload));\n });\n }\n\n close(): void {\n try {\n this.ws.close();\n } catch {\n // Ignore.\n }\n }\n}\n\n/**\n * Watch Chrome's stderr for the `DevTools listening on ws://...` line that\n * Chrome prints once the debug port is bound. Rejects on timeout or premature\n * exit.\n */\nfunction waitForDevToolsUrl(\n child: ChildProcess,\n timeoutMs = 5000\n): Promise<string> {\n return new Promise((resolve, reject) => {\n let buf = \"\";\n const onData = (d: Buffer) => {\n buf += d.toString();\n const m = buf.match(/DevTools listening on (ws:\\/\\/\\S+)/);\n if (m) {\n cleanup();\n resolve(m[1]);\n }\n };\n const onExit = (code: number | null) => {\n cleanup();\n reject(\n new Error(\n `Chrome exited (code ${code}) before exposing a DevTools port. ` +\n `Last stderr: ${buf.slice(-500)}`\n )\n );\n };\n const cleanup = () => {\n child.stderr?.off(\"data\", onData);\n child.off(\"exit\", onExit);\n clearTimeout(timer);\n };\n const timer = setTimeout(() => {\n cleanup();\n reject(\n new Error(`Chrome did not expose a DevTools port within ${timeoutMs}ms`)\n );\n }, timeoutMs);\n child.stderr?.on(\"data\", onData);\n child.on(\"exit\", onExit);\n });\n}\n\n/**\n * Headlessly render `url` and write a PNG to disk.\n *\n * Two modes, selected by whether `opts.cdpUrl` is provided:\n * - **Remote** (`cdpUrl` set): connect directly to an existing CDP\n * WebSocket. No Chrome process is spawned.\n * - **Local** (`chromePath` set): spawn Chrome with\n * `--headless=new --remote-debugging-port=0` + throwaway user-data-dir\n * and parse the WebSocket URL from stderr.\n *\n * After the WebSocket is connected, the flow is identical:\n * - Open a tab via Target.createTarget, attach in flat mode.\n * - Apply viewport + prefers-color-scheme via Emulation.* commands.\n * - Page.navigate, then poll Runtime.evaluate for `waitForSelector`.\n * - Page.captureScreenshot, write PNG, clean up.\n */\nexport async function captureScreenshot(\n opts: CaptureScreenshotOptions\n): Promise<void> {\n let userDataDir: string | undefined;\n let child: ChildProcess | undefined;\n let cdp: CdpClient | undefined;\n let cleanedUp = false;\n const cleanup = () => {\n if (cleanedUp) return;\n cleanedUp = true;\n cdp?.close();\n if (child && !child.killed) {\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // Ignore.\n }\n const localChild = child;\n const killTimer = setTimeout(() => {\n if (!localChild.killed) {\n try {\n localChild.kill(\"SIGKILL\");\n } catch {\n // Ignore.\n }\n }\n }, 2000);\n killTimer.unref();\n }\n if (userDataDir) {\n try {\n rmSync(userDataDir, { recursive: true, force: true });\n } catch {\n // Ignore.\n }\n }\n };\n\n try {\n let wsUrl: string;\n if (opts.cdpUrl) {\n wsUrl = opts.cdpUrl;\n } else {\n if (!opts.chromePath) {\n throw new Error(\n \"captureScreenshot requires either `cdpUrl` or `chromePath`\"\n );\n }\n userDataDir = mkdtempSync(path.join(os.tmpdir(), \"mcp-use-chrome-\"));\n const chromeArgs = [\n \"--headless=new\",\n \"--remote-debugging-port=0\",\n `--user-data-dir=${userDataDir}`,\n \"--no-first-run\",\n \"--no-default-browser-check\",\n \"--disable-extensions\",\n \"--disable-gpu\",\n \"--hide-scrollbars\",\n \"--mute-audio\",\n `--window-size=${opts.width},${opts.height}`,\n \"about:blank\",\n ];\n child = spawn(opts.chromePath, chromeArgs, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n // Drain stdout so Chrome doesn't block on a full pipe.\n child.stdout?.resume();\n wsUrl = await waitForDevToolsUrl(child);\n }\n\n const ws = new WebSocket(wsUrl);\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n ws.off(\"error\", onError);\n resolve();\n };\n const onError = (err: Error) => {\n ws.off(\"open\", onOpen);\n reject(err);\n };\n ws.once(\"open\", onOpen);\n ws.once(\"error\", onError);\n });\n\n cdp = new CdpClient(ws);\n\n // We need a flat-mode sessionId attached to a page target. The two CDP\n // endpoints we support reach this differently:\n //\n // Local Chrome: we create a fresh target and attach to it explicitly.\n //\n // Remote endpoint (e.g. Notte): the endpoint is a browser-level WS\n // with a pre-existing page, and explicit Target.attachToTarget is\n // refused for security. Instead we ask for auto-attach in flat mode\n // and pick up the sessionId from the resulting Target.attachedToTarget\n // event. We attach the event listener BEFORE sending setAutoAttach so\n // we don't race the event for already-existing targets.\n let sessionId: string;\n if (opts.cdpUrl) {\n const attachPromise = new Promise<string>((resolve, reject) => {\n const timer = setTimeout(\n () =>\n reject(\n new Error(\n \"Timed out waiting for Target.attachedToTarget event from remote CDP\"\n )\n ),\n 10_000\n );\n const onMessage = (data: WebSocket.RawData) => {\n try {\n const msg = JSON.parse(data.toString()) as {\n method?: string;\n params?: {\n sessionId?: string;\n targetInfo?: { type?: string };\n };\n };\n if (\n msg.method === \"Target.attachedToTarget\" &&\n msg.params?.targetInfo?.type === \"page\" &&\n typeof msg.params.sessionId === \"string\"\n ) {\n clearTimeout(timer);\n ws.off(\"message\", onMessage);\n resolve(msg.params.sessionId);\n }\n } catch {\n // Ignore non-JSON or unrelated messages.\n }\n };\n ws.on(\"message\", onMessage);\n });\n await cdp.send(\"Target.setAutoAttach\", {\n autoAttach: true,\n waitForDebuggerOnStart: false,\n flatten: true,\n });\n sessionId = await attachPromise;\n } else {\n const { targetId } = await cdp.send<{ targetId: string }>(\n \"Target.createTarget\",\n { url: \"about:blank\" }\n );\n const attach = await cdp.send<{ sessionId: string }>(\n \"Target.attachToTarget\",\n { targetId, flatten: true }\n );\n sessionId = attach.sessionId;\n }\n\n await cdp.send(\"Page.enable\", {}, sessionId);\n await cdp.send(\n \"Emulation.setDeviceMetricsOverride\",\n {\n width: opts.width,\n height: opts.height,\n deviceScaleFactor: opts.deviceScaleFactor ?? 1,\n mobile: false,\n },\n sessionId\n );\n await cdp.send(\n \"Emulation.setEmulatedMedia\",\n {\n features: [\n { name: \"prefers-color-scheme\", value: opts.theme },\n { name: \"prefers-reduced-motion\", value: \"reduce\" },\n ],\n },\n sessionId\n );\n\n if (opts.bundle !== undefined) {\n // Inject the bundle as a global before any document scripts run.\n // JSON.stringify-of-JSON.stringify wraps the JSON literal as a string\n // expression so we can JSON.parse it inside the page — this avoids\n // having to escape `</script>` and other characters in the source.\n const payload = JSON.stringify(JSON.stringify(opts.bundle));\n await cdp.send(\n \"Page.addScriptToEvaluateOnNewDocument\",\n {\n source: `globalThis.__mcpUsePreviewBundle = JSON.parse(${payload});`,\n runImmediately: true,\n },\n sessionId\n );\n }\n\n await cdp.send(\"Page.navigate\", { url: opts.url }, sessionId);\n\n const start = Date.now();\n const exprSelector = JSON.stringify(opts.waitForSelector);\n while (true) {\n const r = await cdp.send<{\n result?: { value?: unknown };\n exceptionDetails?: unknown;\n }>(\n \"Runtime.evaluate\",\n {\n expression: `!!document.querySelector(${exprSelector})`,\n returnByValue: true,\n },\n sessionId\n );\n if (r.result?.value === true) break;\n if (Date.now() - start > opts.timeoutMs) {\n throw new Error(\n `Timed out after ${opts.timeoutMs}ms waiting for selector \"${opts.waitForSelector}\"`\n );\n }\n await new Promise((res) => setTimeout(res, 100));\n }\n\n if (opts.delayMs && opts.delayMs > 0) {\n await new Promise((res) => setTimeout(res, opts.delayMs));\n }\n\n const shot = await cdp.send<{ data: string }>(\n \"Page.captureScreenshot\",\n {\n format: \"png\",\n clip: {\n x: 0,\n y: 0,\n width: opts.width,\n height: opts.height,\n scale: 1,\n },\n },\n sessionId\n );\n\n writeFileSync(opts.outputPath, Buffer.from(shot.data, \"base64\"));\n } finally {\n cleanup();\n }\n}\n","import { accessSync, constants } from \"node:fs\";\nimport path from \"node:path\";\n\nconst ENV_VAR_NAMES = [\n \"MCP_USE_CHROME_PATH\",\n \"PUPPETEER_EXECUTABLE_PATH\",\n \"CHROME_PATH\",\n] as const;\n\nconst DARWIN_PATHS = [\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n \"/Applications/Chromium.app/Contents/MacOS/Chromium\",\n \"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\",\n \"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser\",\n];\n\nconst LINUX_BINARIES = [\n \"google-chrome-stable\",\n \"google-chrome\",\n \"chromium\",\n \"chromium-browser\",\n \"microsoft-edge\",\n \"microsoft-edge-stable\",\n \"brave-browser\",\n];\n\nconst WIN_SUBPATHS = [\n \"Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n \"Microsoft\\\\Edge\\\\Application\\\\msedge.exe\",\n \"BraveSoftware\\\\Brave-Browser\\\\Application\\\\brave.exe\",\n \"Chromium\\\\Application\\\\chrome.exe\",\n];\n\nfunction isAccessible(p: string): boolean {\n try {\n accessSync(p, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction findOnPath(binary: string): string | null {\n const PATH = process.env.PATH ?? \"\";\n for (const dir of PATH.split(\":\")) {\n if (!dir) continue;\n const candidate = path.posix.join(dir, binary);\n if (isAccessible(candidate)) return candidate;\n }\n return null;\n}\n\n/**\n * Locate a Chrome-family browser executable.\n *\n * Priority: MCP_USE_CHROME_PATH → PUPPETEER_EXECUTABLE_PATH → CHROME_PATH →\n * platform-specific install paths (Chrome → Canary → Chromium → Edge → Brave).\n *\n * Returns the absolute path to the executable, or null if none was found.\n */\nexport function findChrome(): string | null {\n for (const name of ENV_VAR_NAMES) {\n const v = process.env[name];\n if (v && isAccessible(v)) return v;\n }\n\n if (process.platform === \"darwin\") {\n for (const p of DARWIN_PATHS) {\n if (isAccessible(p)) return p;\n }\n return null;\n }\n\n if (process.platform === \"linux\") {\n for (const bin of LINUX_BINARIES) {\n const p = findOnPath(bin);\n if (p) return p;\n }\n return null;\n }\n\n if (process.platform === \"win32\") {\n const dirs = [\n process.env[\"ProgramFiles\"],\n process.env[\"ProgramFiles(x86)\"],\n process.env[\"LocalAppData\"],\n ].filter((d): d is string => Boolean(d));\n\n for (const dir of dirs) {\n for (const sub of WIN_SUBPATHS) {\n const candidate = path.join(dir, sub);\n if (isAccessible(candidate)) return candidate;\n }\n }\n return null;\n }\n\n return null;\n}\n\n/**\n * Like findChrome, but throws a user-facing error with install hints.\n */\nexport function resolveChromePath(): string {\n const found = findChrome();\n if (found) return found;\n throw new Error(\n \"Could not find Chrome, Chromium, Edge, or Brave on this system. \" +\n \"Install Chrome from https://google.com/chrome, or set MCP_USE_CHROME_PATH \" +\n \"(or PUPPETEER_EXECUTABLE_PATH / CHROME_PATH) to a browser executable.\"\n );\n}\n","import chalk from \"chalk\";\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport open from \"open\";\nimport type { GitHubConnectionStatus, OrgInfo } from \"../utils/api.js\";\nimport {\n ApiUnauthorizedError,\n GitHubAuthRequiredError,\n McpUseAPI,\n} from \"../utils/api.js\";\nimport {\n getWebUrl,\n isLoggedIn,\n readConfig,\n writeConfig,\n} from \"../utils/config.js\";\nimport {\n getGitInfo,\n gitInit,\n gitAddRemoteAndPush,\n gitCommitAndPush,\n GitCommandError,\n hasUncommittedChanges,\n isGitHubUrl,\n} from \"../utils/git.js\";\nimport { getMcpServerUrl } from \"../utils/cloud-urls.js\";\nimport { getProjectLink, saveProjectLink } from \"../utils/project-link.js\";\nimport {\n loginCommand,\n promptOrgSelection,\n resolveOrgFromOption,\n} from \"./auth.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nasync function parseEnvFile(filePath: string): Promise<Record<string, string>> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const envVars: Record<string, string> = {};\n const lines = content.split(\"\\n\");\n let currentKey: string | null = null;\n let currentValue = \"\";\n\n for (let line of lines) {\n line = line.trim();\n if (!line || line.startsWith(\"#\")) continue;\n if (currentKey && !line.includes(\"=\")) {\n currentValue += \"\\n\" + line;\n continue;\n }\n if (currentKey) {\n envVars[currentKey] = currentValue.replace(/^[\"']|[\"']$/g, \"\");\n currentKey = null;\n currentValue = \"\";\n }\n const equalIndex = line.indexOf(\"=\");\n if (equalIndex === -1) continue;\n const key = line.substring(0, equalIndex).trim();\n const value = line.substring(equalIndex + 1).trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n console.log(chalk.yellow(`⚠️ Skipping invalid env key: ${key}`));\n continue;\n }\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n envVars[key] = value.slice(1, -1);\n } else if (value.startsWith('\"') || value.startsWith(\"'\")) {\n currentKey = key;\n currentValue = value.slice(1);\n } else {\n envVars[key] = value;\n }\n }\n if (currentKey) {\n envVars[currentKey] = currentValue.replace(/^[\"']|[\"']$/g, \"\");\n }\n return envVars;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`Environment file not found: ${filePath}`);\n }\n throw new Error(\n `Failed to parse environment file: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\nfunction parseEnvVar(envStr: string): { key: string; value: string } {\n const equalIndex = envStr.indexOf(\"=\");\n if (equalIndex === -1) {\n throw new Error(`Invalid env format: \"${envStr}\". Expected KEY=VALUE`);\n }\n const key = envStr.substring(0, equalIndex).trim();\n const value = envStr.substring(equalIndex + 1);\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n throw new Error(`Invalid env key: \"${key}\".`);\n }\n return { key, value };\n}\n\n/**\n * Upsert env vars onto an existing server via the env-variables API.\n *\n * The `--env`/`--env-file` flags are only honored on initial server creation\n * (where `env` rides on the createServer body). On redeploys we have to call\n * the dedicated env-variables endpoints, otherwise the values are silently\n * dropped. Existing keys are updated; new keys are created. Keys not in the\n * supplied set are left alone — clearing requires `mcp-use servers env rm`.\n */\nexport async function syncEnvVarsToServer(\n api: McpUseAPI,\n serverId: string,\n envVars: Record<string, string>\n): Promise<{ created: number; updated: number }> {\n const entries = Object.entries(envVars);\n if (entries.length === 0) return { created: 0, updated: 0 };\n\n const existing = await api.listEnvVariables(serverId);\n const byKey = new Map(existing.map((v) => [v.key, v]));\n\n const results = await Promise.all(\n entries.map(async ([key, value]) => {\n const found = byKey.get(key);\n if (found) {\n await api.updateEnvVariable(serverId, found.id, { value });\n return \"updated\" as const;\n }\n await api.createEnvVariable(serverId, { key, value });\n return \"created\" as const;\n })\n );\n\n return {\n created: results.filter((r) => r === \"created\").length,\n updated: results.filter((r) => r === \"updated\").length,\n };\n}\n\nasync function buildEnvVars(\n options: DeployOptions\n): Promise<Record<string, string>> {\n const envVars: Record<string, string> = {};\n if (options.envFile) {\n try {\n const fileEnv = await parseEnvFile(options.envFile);\n Object.assign(envVars, fileEnv);\n console.log(\n chalk.gray(\n `Loaded ${Object.keys(fileEnv).length} variable(s) from ${options.envFile}`\n )\n );\n } catch (error) {\n console.log(\n chalk.red(\n `✗ ${error instanceof Error ? error.message : \"Failed to load env file\"}`\n )\n );\n process.exit(1);\n }\n }\n if (options.env && options.env.length > 0) {\n for (const envStr of options.env) {\n try {\n const { key, value } = parseEnvVar(envStr);\n envVars[key] = value;\n } catch (error) {\n console.log(\n chalk.red(\n `✗ ${error instanceof Error ? error.message : \"Invalid env variable\"}`\n )\n );\n process.exit(1);\n }\n }\n }\n return envVars;\n}\n\ninterface DeployOptions {\n open?: boolean;\n name?: string;\n port?: number;\n runtime?: \"node\" | \"python\";\n new?: boolean;\n env?: string[];\n envFile?: string;\n rootDir?: string;\n org?: string;\n yes?: boolean;\n region?: \"US\" | \"EU\" | \"APAC\";\n buildCommand?: string;\n startCommand?: string;\n}\n\nasync function isMcpProject(cwd: string = process.cwd()): Promise<boolean> {\n try {\n const content = await fs.readFile(path.join(cwd, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(content);\n return !!(\n pkg.dependencies?.[\"mcp-use\"] ||\n pkg.dependencies?.[\"@modelcontextprotocol/sdk\"] ||\n pkg.devDependencies?.[\"mcp-use\"] ||\n pkg.devDependencies?.[\"@modelcontextprotocol/sdk\"]\n );\n } catch {\n return false;\n }\n}\n\nasync function getProjectName(cwd: string = process.cwd()): Promise<string> {\n try {\n const content = await fs.readFile(path.join(cwd, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(content);\n if (pkg.name) return pkg.name;\n } catch {\n // fall through\n }\n return path.basename(cwd);\n}\n\nasync function detectBuildCommand(cwd: string): Promise<string | undefined> {\n try {\n const content = await fs.readFile(path.join(cwd, \"package.json\"), \"utf-8\");\n if (JSON.parse(content).scripts?.build) return \"npm run build\";\n } catch {\n // noop\n }\n return undefined;\n}\n\nasync function detectStartCommand(cwd: string): Promise<string | undefined> {\n try {\n const content = await fs.readFile(path.join(cwd, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(content);\n if (pkg.scripts?.start) return \"npm start\";\n if (pkg.main) return `node ${pkg.main}`;\n } catch {\n // noop\n }\n return undefined;\n}\n\nasync function detectRuntime(cwd: string): Promise<\"node\" | \"python\"> {\n for (const f of [\"requirements.txt\", \"pyproject.toml\", \"setup.py\"]) {\n try {\n await fs.access(path.join(cwd, f));\n return \"python\";\n } catch {\n continue;\n }\n }\n return \"node\";\n}\n\nasync function prompt(\n question: string,\n defaultValue: \"y\" | \"n\" = \"n\"\n): Promise<boolean> {\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n const indicator = defaultValue === \"y\" ? \"Y/n\" : \"y/N\";\n const q = question.replace(/(\\(y\\/n\\):)/, `(${indicator}):`);\n return new Promise((resolve) => {\n rl.question(q, (answer) => {\n rl.close();\n const a = answer.trim().toLowerCase();\n if (a === \"\") resolve(defaultValue === \"y\");\n else resolve(a === \"y\" || a === \"yes\");\n });\n });\n}\n\nasync function promptText(\n question: string,\n defaultValue?: string\n): Promise<string> {\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n const suffix = defaultValue ? chalk.gray(` [${defaultValue}]`) : \"\";\n return new Promise((resolve) => {\n rl.question(question + suffix + \" \", (answer) => {\n rl.close();\n resolve(answer.trim() || defaultValue || \"\");\n });\n });\n}\n\n// ---------------------------------------------------------------------------\n// .gitignore management\n// ---------------------------------------------------------------------------\n\nconst REQUIRED_IGNORES = [\n \"node_modules\",\n \"dist\",\n \".env\",\n \".env.local\",\n \".mcp-use\",\n];\n\nasync function ensureGitignore(cwd: string): Promise<void> {\n const gitignorePath = path.join(cwd, \".gitignore\");\n let content = \"\";\n try {\n content = await fs.readFile(gitignorePath, \"utf-8\");\n } catch {\n // file doesn't exist yet\n }\n const missing = REQUIRED_IGNORES.filter((entry) => !content.includes(entry));\n if (missing.length > 0) {\n const additions = missing.join(\"\\n\");\n const newContent =\n content + (content.endsWith(\"\\n\") ? \"\" : \"\\n\") + additions + \"\\n\";\n await fs.writeFile(gitignorePath, newContent, \"utf-8\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// Deployment progress (poll build-logs)\n// ---------------------------------------------------------------------------\n\nasync function displayDeploymentProgress(\n api: McpUseAPI,\n deploymentId: string,\n progressOptions?: { yes?: boolean }\n): Promise<void> {\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let frameIndex = 0;\n let spinnerInterval: NodeJS.Timeout | null = null;\n\n const startSpinner = (message: string) => {\n if (spinnerInterval) clearInterval(spinnerInterval);\n process.stdout.write(\"\\r\\x1b[K\");\n spinnerInterval = setInterval(() => {\n process.stdout.write(\n \"\\r\" + chalk.cyan(frames[frameIndex]) + \" \" + chalk.gray(message)\n );\n frameIndex = (frameIndex + 1) % frames.length;\n }, 80);\n };\n\n const stopSpinner = () => {\n if (spinnerInterval) {\n clearInterval(spinnerInterval);\n spinnerInterval = null;\n process.stdout.write(\"\\r\\x1b[K\");\n }\n };\n\n console.log();\n startSpinner(\"Deploying...\");\n\n let checkCount = 0;\n const maxChecks = 120;\n let delay = 2000;\n const maxDelay = 10000;\n let buildLogOffset = 0;\n\n while (checkCount < maxChecks) {\n const waitMs = delay;\n await new Promise<void>((r) => setTimeout(r, waitMs));\n checkCount++;\n\n try {\n const resp = await api.getDeploymentBuildLogs(\n deploymentId,\n buildLogOffset\n );\n if (resp.logs.length > 0) {\n for (const line of resp.logs.split(\"\\n\").filter((l) => l.trim())) {\n try {\n const d = JSON.parse(line);\n if (d.line) {\n stopSpinner();\n const color =\n d.level === \"error\"\n ? chalk.red\n : d.level === \"warn\"\n ? chalk.yellow\n : chalk.gray;\n const prefix = d.step ? chalk.cyan(`[${d.step}]`) + \" \" : \"\";\n console.log(prefix + color(d.line));\n }\n } catch {\n stopSpinner();\n console.log(chalk.gray(line));\n }\n }\n buildLogOffset = resp.offset;\n }\n } catch {\n // not ready yet\n }\n\n const dep = await api.getDeployment(deploymentId);\n\n if (dep.status === \"running\") {\n stopSpinner();\n const mcpUrl = getMcpServerUrl(dep);\n const webUrl = (await getWebUrl()).replace(/\\/$/, \"\");\n const config = await readConfig();\n let dashboardUrl: string | null = null;\n if (dep.serverId) {\n dashboardUrl = config.orgSlug\n ? `${webUrl}/cloud/${config.orgSlug}/servers/${dep.serverId}`\n : `${webUrl}/cloud/servers/${dep.serverId}`;\n }\n const inspectorUrl = `https://inspector.manufact.com/inspector?autoConnect=${encodeURIComponent(mcpUrl)}`;\n\n console.log(chalk.green.bold(\"✓ Deployment successful!\\n\"));\n if (mcpUrl) {\n console.log(chalk.white(\"🌐 MCP Server URL:\"));\n console.log(chalk.cyan.bold(` ${mcpUrl}\\n`));\n }\n if (dashboardUrl) {\n console.log(chalk.white(\"📊 Dashboard:\"));\n console.log(chalk.cyan.bold(` ${dashboardUrl}\\n`));\n }\n console.log(chalk.white(\"🔍 Inspector URL:\"));\n console.log(chalk.cyan.bold(` ${inspectorUrl}\\n`));\n console.log(chalk.gray(\"Deployment ID: \") + chalk.white(dep.id));\n return;\n } else if (dep.status === \"failed\") {\n stopSpinner();\n console.log(chalk.red.bold(\"✗ Deployment failed\\n\"));\n if (dep.error) {\n const internalPatterns = [\n \"GraphQL\",\n \"authenticated\",\n \"INTERNAL\",\n \"Fly API\",\n \"token validation\",\n \"context deadline\",\n \"Bad gateway\",\n \"502\",\n \"503\",\n ];\n const isInternalError = internalPatterns.some((p) =>\n dep.error!.includes(p)\n );\n if (isInternalError) {\n console.log(\n chalk.red(\"Error: \") +\n \"An internal infrastructure error occurred. Please try again.\"\n );\n console.log(chalk.gray(\" Details: \" + dep.error));\n } else {\n console.log(chalk.red(\"Error: \") + dep.error);\n }\n }\n process.exit(1);\n } else if (dep.status === \"building\" || dep.status === \"pending\") {\n startSpinner(\"Building and deploying...\");\n delay = Math.min(delay * 1.2, maxDelay);\n } else {\n stopSpinner();\n console.log(chalk.yellow(\"⚠️ Deployment status: \") + dep.status);\n return;\n }\n }\n\n stopSpinner();\n console.log(chalk.yellow(\"⚠️ Deployment is taking longer than expected.\"));\n console.log(\n chalk.gray(\"Check status with: \") +\n chalk.white(`mcp-use deployments get ${deploymentId}`)\n );\n}\n\n// ---------------------------------------------------------------------------\n// GitHub helpers\n// ---------------------------------------------------------------------------\n\nasync function promptReauthenticateOn401(\n options: DeployOptions,\n orgIdToRestore: string | undefined\n): Promise<McpUseAPI> {\n console.log(chalk.red(\"\\n✗ Session expired or API key invalid.\"));\n if (options.yes) {\n console.log(\n chalk.gray(\" Run mcp-use login to re-authenticate, then retry.\")\n );\n process.exit(1);\n }\n const should = await prompt(chalk.white(\"Log in again? (Y/n): \"), \"y\");\n if (!should) {\n process.exit(1);\n }\n await loginCommand({ silent: false });\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ Login failed. Please try again.\"));\n process.exit(1);\n }\n const fresh = await McpUseAPI.create();\n if (orgIdToRestore) {\n fresh.setOrgId(orgIdToRestore);\n }\n return fresh;\n}\n\nasync function ensureApiSessionForDeploy(\n api: McpUseAPI,\n options: DeployOptions,\n orgIdToRestore: string | undefined\n): Promise<McpUseAPI> {\n let client = api;\n for (;;) {\n try {\n await client.testAuth();\n return client;\n } catch (e) {\n if (!(e instanceof ApiUnauthorizedError)) throw e;\n client = await promptReauthenticateOn401(options, orgIdToRestore);\n }\n }\n}\n\nasync function getGitHubConnectionStatusWith401Retry(\n api: McpUseAPI,\n options: DeployOptions,\n orgIdToRestore: string | undefined\n): Promise<{ api: McpUseAPI; status: GitHubConnectionStatus }> {\n let client = api;\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n const status = await client.getGitHubConnectionStatus();\n return { api: client, status };\n } catch (e) {\n if (e instanceof ApiUnauthorizedError && attempt === 0) {\n client = await promptReauthenticateOn401(options, orgIdToRestore);\n await client.testAuth();\n continue;\n }\n throw e;\n }\n }\n throw new Error(\"Unreachable\");\n}\n\nasync function checkRepoAccess(\n api: McpUseAPI,\n owner: string,\n repo: string\n): Promise<boolean> {\n try {\n const resp = await api.getGitHubRepos(true);\n return resp.repos.some((r) => r.full_name === `${owner}/${repo}`);\n } catch {\n return false;\n }\n}\n\nasync function promptGitHubInstallation(\n api: McpUseAPI,\n reason: \"not_connected\" | \"no_access\",\n repoName?: string,\n opts?: {\n yes?: boolean;\n installationId?: string;\n reauth: () => Promise<McpUseAPI>;\n }\n): Promise<{ ok: boolean; api: McpUseAPI }> {\n const yes = !!opts?.yes;\n const reauth = opts?.reauth;\n console.log();\n\n if (reason === \"not_connected\") {\n console.log(chalk.yellow(\"⚠️ GitHub account not connected\"));\n console.log(\n chalk.white(\"Deployments require a connected GitHub account.\\n\")\n );\n } else {\n console.log(\n chalk.yellow(\"⚠️ GitHub App doesn't have access to this repository\")\n );\n console.log(\n chalk.white(\n `The GitHub App needs permission to access ${chalk.cyan(repoName || \"this repository\")}.\\n`\n )\n );\n }\n\n const shouldInstall = yes\n ? true\n : await prompt(\n chalk.white(\n `Would you like to ${reason === \"not_connected\" ? \"connect\" : \"configure\"} GitHub now? (Y/n): `\n ),\n \"y\"\n );\n if (!shouldInstall) return { ok: false, api };\n\n let client = api;\n\n try {\n let appName: string;\n for (;;) {\n try {\n appName = await client.getGitHubAppName();\n break;\n } catch (e) {\n if (e instanceof ApiUnauthorizedError && reauth) {\n client = await reauth();\n await client.testAuth();\n continue;\n }\n throw e;\n }\n }\n\n const installUrl = `https://github.com/apps/${appName}/installations/new`;\n\n console.log(chalk.cyan(`\\nOpening browser...`));\n console.log(chalk.gray(`URL: ${installUrl}\\n`));\n\n if (reason === \"no_access\") {\n console.log(\n chalk.white(\"Please add \") +\n chalk.cyan.bold(repoName || \"your repository\") +\n chalk.white(\" to the app's repository access, then return here.\\n\")\n );\n } else {\n console.log(\n chalk.white(\"Complete the GitHub App installation, then return here.\\n\")\n );\n }\n\n await open(installUrl);\n\n if (!yes) {\n await prompt(chalk.white(\"Press Enter when done...\"), \"y\");\n } else {\n console.log(chalk.gray(\"Waiting for GitHub configuration (polling)...\"));\n const deadline = Date.now() + 120_000;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 2000));\n try {\n const status = await client.getGitHubConnectionStatus();\n if (status.is_connected) {\n if (!repoName) return { ok: true, api: client };\n const [o, r] = repoName.split(\"/\");\n if (o && r && (await checkRepoAccess(client, o, r))) {\n return { ok: true, api: client };\n }\n }\n } catch (e) {\n if (e instanceof ApiUnauthorizedError && reauth) {\n client = await reauth();\n await client.testAuth();\n continue;\n }\n }\n }\n }\n\n return { ok: true, api: client };\n } catch (e) {\n if (e instanceof ApiUnauthorizedError) {\n console.log(chalk.red(\"\\n✗ Session expired or API key invalid.\"));\n process.exit(1);\n }\n console.log(chalk.yellow(\"\\n⚠️ Unable to open browser automatically\"));\n console.log(\n chalk.white(\"Please visit: \") +\n chalk.cyan(\"https://manufact.com/cloud/settings\")\n );\n return { ok: false, api: client };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main deploy command\n// ---------------------------------------------------------------------------\n\nexport async function deployCommand(options: DeployOptions): Promise<void> {\n try {\n const cwd = process.cwd();\n\n // ── Step 1: Auth ──────────────────────────────────────────────\n if (!(await isLoggedIn())) {\n console.log(chalk.cyan.bold(\"Welcome to Manufact Cloud!\\n\"));\n if (options.yes) {\n console.log(\n chalk.red(\n \"✗ Not logged in. Run \" +\n chalk.white(\"npx mcp-use login\") +\n \" first.\"\n )\n );\n process.exit(1);\n }\n\n const shouldLogin = await prompt(\n chalk.white(\"You need to log in to deploy. Log in now? (Y/n): \"),\n \"y\"\n );\n if (!shouldLogin) {\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(0);\n }\n\n try {\n await loginCommand({ silent: false });\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ Login failed. Please try again.\"));\n process.exit(1);\n }\n console.log(chalk.gray(\"\\nContinuing with deployment...\\n\"));\n } catch (error) {\n console.error(\n chalk.red.bold(\"✗ Login failed:\"),\n chalk.red(error instanceof Error ? error.message : \"Unknown error\")\n );\n process.exit(1);\n }\n }\n\n let api = await McpUseAPI.create();\n\n // ── Step 2: Org resolution ────────────────────────────────────\n let resolvedOrgId: string | undefined;\n let resolvedOrgName: string | undefined;\n let resolvedOrgSlug: string | undefined;\n\n if (options.org) {\n const authInfo = await api.testAuth();\n const match = resolveOrgFromOption(authInfo.orgs ?? [], options.org);\n if (match) {\n api.setOrgId(match.id);\n resolvedOrgId = match.id;\n resolvedOrgName = match.name;\n resolvedOrgSlug = match.slug ?? undefined;\n const slug = match.slug ? chalk.gray(` (${match.slug})`) : \"\";\n console.log(\n chalk.gray(\"Organization: \") + chalk.cyan(match.name) + slug\n );\n } else {\n console.error(\n chalk.red(\n `✗ Organization \"${options.org}\" not found. Run ${chalk.white(\"npx mcp-use org list\")} to see available organizations.`\n )\n );\n process.exit(1);\n }\n } else {\n const config = await readConfig();\n if (!config.orgId) {\n const authInfo = await api.testAuth();\n if (authInfo.orgs.length === 0) {\n console.log(\n chalk.red(\n \"✗ No organizations found. Please create one at manufact.com/cloud.\"\n )\n );\n process.exit(1);\n }\n let selectedOrg: OrgInfo | null;\n if (authInfo.orgs.length === 1) {\n selectedOrg = authInfo.orgs[0];\n } else {\n selectedOrg = await promptOrgSelection(\n authInfo.orgs,\n authInfo.default_org_id\n );\n }\n if (!selectedOrg) {\n console.log(chalk.red(\"✗ No organization selected.\"));\n process.exit(1);\n }\n api.setOrgId(selectedOrg.id);\n resolvedOrgId = selectedOrg.id;\n resolvedOrgName = selectedOrg.name;\n resolvedOrgSlug = selectedOrg.slug ?? undefined;\n await writeConfig({\n ...config,\n orgId: selectedOrg.id,\n orgName: selectedOrg.name,\n orgSlug: selectedOrg.slug ?? undefined,\n });\n console.log(\n chalk.gray(\"Organization: \") + chalk.cyan(selectedOrg.name)\n );\n } else {\n resolvedOrgId = config.orgId;\n resolvedOrgName = config.orgName;\n resolvedOrgSlug = config.orgSlug;\n api.setOrgId(config.orgId);\n if (config.orgName) {\n const slug = config.orgSlug ? chalk.gray(` (${config.orgSlug})`) : \"\";\n console.log(\n chalk.gray(\"Organization: \") + chalk.cyan(config.orgName) + slug\n );\n }\n }\n }\n\n api = await ensureApiSessionForDeploy(api, options, resolvedOrgId);\n\n console.log(chalk.cyan.bold(\"\\n🚀 Deploying to Manufact cloud...\\n\"));\n\n // ── Step 3: GitHub connection ─────────────────────────────────\n const reauth = () => promptReauthenticateOn401(options, resolvedOrgId);\n\n let ghConn = await getGitHubConnectionStatusWith401Retry(\n api,\n options,\n resolvedOrgId\n );\n api = ghConn.api;\n let connectionStatus = ghConn.status;\n\n if (!connectionStatus.is_connected) {\n const installed = await promptGitHubInstallation(\n api,\n \"not_connected\",\n undefined,\n {\n yes: options.yes,\n reauth,\n }\n );\n if (!installed.ok) {\n console.log(chalk.gray(\"Deployment cancelled.\"));\n process.exit(0);\n }\n api = installed.api;\n ghConn = await getGitHubConnectionStatusWith401Retry(\n api,\n options,\n resolvedOrgId\n );\n api = ghConn.api;\n connectionStatus = ghConn.status;\n if (!connectionStatus.is_connected) {\n console.log(chalk.red(\"\\n✗ GitHub connection could not be verified.\"));\n console.log(\n chalk.cyan(\n \" Visit https://manufact.com/cloud/settings to connect GitHub.\\n\"\n )\n );\n process.exit(1);\n }\n }\n\n const installations = connectionStatus.installations ?? [];\n if (installations.length === 0) {\n console.log(chalk.red(\"✗ No GitHub installations found.\"));\n process.exit(1);\n }\n\n console.log(chalk.green(\"✓ GitHub connected\\n\"));\n\n // Resolved later based on user selection or repo ownership.\n let installationDbId: string | undefined;\n let githubInstallationId: string | undefined;\n\n // ── Step 4: Project & Git ─────────────────────────────────────\n const projectDir = options.rootDir\n ? path.resolve(cwd, options.rootDir)\n : cwd;\n\n if (options.rootDir) {\n try {\n await fs.access(projectDir);\n } catch {\n console.log(\n chalk.red(`✗ Root directory not found: ${options.rootDir}`)\n );\n process.exit(1);\n }\n }\n\n const isMcp = await isMcpProject(projectDir);\n if (!isMcp && !options.yes) {\n console.log(\n chalk.yellow(\"⚠️ This doesn't look like an MCP server project.\")\n );\n const shouldContinue = await prompt(\n chalk.white(\"Continue anyway? (y/n): \")\n );\n if (!shouldContinue) {\n process.exit(0);\n }\n console.log();\n }\n\n let gitInfo = await getGitInfo(cwd);\n let repoFullName: string | undefined;\n let branch: string = \"main\";\n\n if (!gitInfo.isGitRepo || !gitInfo.remoteUrl) {\n // No git repo or no remote — offer to create one\n const projectName = options.name || (await getProjectName(projectDir));\n\n console.log(chalk.yellow(\"⚠️ No GitHub remote found.\\n\"));\n if (options.yes) {\n console.log(chalk.gray(\"Creating GitHub repository automatically...\"));\n } else {\n const shouldCreate = await prompt(\n chalk.white(\"Create a GitHub repository and push your code? (Y/n): \"),\n \"y\"\n );\n if (!shouldCreate) {\n console.log(\n chalk.gray(\n \"Deployment cancelled. Set up a GitHub remote and try again.\"\n )\n );\n process.exit(0);\n }\n }\n\n // Let the user pick which GitHub account to create the repo under.\n // Default to the first org-type installation (org accounts support auto-create).\n const defaultIdx = installations.findIndex(\n (i) => i.account_type === \"Organization\"\n );\n let selectedIdx = defaultIdx >= 0 ? defaultIdx : 0;\n\n if (installations.length > 1 && !options.yes) {\n console.log(\n chalk.cyan.bold(\"🐙 Select a GitHub account for the repository:\\n\")\n );\n for (let i = 0; i < installations.length; i++) {\n const inst = installations[i];\n const typeLabel =\n inst.account_type === \"Organization\"\n ? chalk.gray(\" (org)\")\n : chalk.gray(\" (personal)\");\n const marker = i === selectedIdx ? chalk.green(\" ← default\") : \"\";\n console.log(\n ` ${chalk.white(`${i + 1}.`)} ${inst.account_login}${typeLabel}${marker}`\n );\n }\n console.log();\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n const answer = await new Promise<string>((resolve) => {\n rl.question(\n chalk.gray(`Enter number [${selectedIdx + 1}]: `),\n (a) => {\n rl.close();\n resolve(a.trim());\n }\n );\n });\n const parsed = answer === \"\" ? selectedIdx : parseInt(answer, 10) - 1;\n if (parsed >= 0 && parsed < installations.length) {\n selectedIdx = parsed;\n }\n }\n\n const repoInstallation = installations[selectedIdx];\n installationDbId = repoInstallation.id;\n githubInstallationId = repoInstallation.installation_id;\n\n const repoName = options.yes\n ? projectName\n : await promptText(chalk.gray(\"Repository name:\"), projectName);\n\n await ensureGitignore(cwd);\n\n console.log(\n chalk.gray(\n `Creating repository on ${repoInstallation.account_login}...`\n )\n );\n\n let repoResult: { fullName: string; cloneUrl: string; htmlUrl: string };\n try {\n repoResult = await api.createGitHubRepo({\n installationId: repoInstallation.installation_id,\n name: repoName,\n private: true,\n org: repoInstallation.account_login,\n });\n } catch (err) {\n if (err instanceof GitHubAuthRequiredError) {\n console.log(\n chalk.yellow(\n `\\n Personal accounts require a one-time GitHub authorization.\\n`\n )\n );\n try {\n await open(err.authorizeUrl);\n console.log(\n chalk.gray(\" Browser opened. Authorize and return here.\\n\")\n );\n } catch {\n console.log(\n chalk.gray(\n ` Open this URL in your browser:\\n ${err.authorizeUrl}\\n`\n )\n );\n }\n const readline = await import(\"node:readline\");\n await new Promise<void>((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(\n chalk.gray(\" Press Enter after authorizing...\"),\n () => {\n rl.close();\n resolve();\n }\n );\n });\n console.log(chalk.gray(\"Retrying repository creation...\"));\n repoResult = await api.createGitHubRepo({\n installationId: repoInstallation.installation_id,\n name: repoName,\n private: true,\n org: repoInstallation.account_login,\n });\n } else {\n throw err;\n }\n }\n console.log(chalk.green(`✓ Created ${chalk.cyan(repoResult.fullName)}`));\n\n try {\n if (!gitInfo.isGitRepo) {\n await ensureGitignore(cwd);\n console.log(chalk.gray(\"Initializing git...\"));\n await gitInit(cwd, \"Initial commit\");\n console.log(chalk.gray(\"Pushing to GitHub...\"));\n await gitAddRemoteAndPush(cwd, repoResult.cloneUrl, \"main\");\n } else {\n if (await hasUncommittedChanges(cwd)) {\n console.log(\n chalk.red(\n \"✗ You have uncommitted changes. Commit and push before deploying.\"\n )\n );\n process.exit(1);\n }\n console.log(chalk.gray(\"Adding remote and pushing...\"));\n await gitAddRemoteAndPush(\n cwd,\n repoResult.cloneUrl,\n gitInfo.branch || \"main\"\n );\n }\n } catch (err) {\n if (err instanceof GitCommandError) {\n console.log(chalk.red(`\\n✗ Git step failed: \\`${err.command}\\``));\n const stderrTrimmed = (err.stderr || err.stdout).trim();\n if (stderrTrimmed) {\n console.log(chalk.gray(stderrTrimmed));\n }\n // Actionable hint for the most common failure: missing identity.\n if (/tell me who you are|user\\.email|user\\.name/i.test(err.stderr)) {\n console.log(\n chalk.yellow(\n \"\\n Set your git identity for this project and retry:\\n\" +\n ` git -C ${JSON.stringify(cwd)} config user.email \"you@example.com\"\\n` +\n ` git -C ${JSON.stringify(cwd)} config user.name \"Your Name\"`\n )\n );\n } else if (\n /non-fast-forward|rejected|unrelated histories/i.test(err.stderr)\n ) {\n console.log(\n chalk.yellow(\n \"\\n The remote branch already has commits. Either delete the empty GitHub repo and retry, \" +\n \"or reconcile manually:\\n\" +\n \" git pull --rebase origin main --allow-unrelated-histories\\n\" +\n \" git push -u origin main\"\n )\n );\n }\n process.exit(1);\n }\n throw err;\n }\n\n console.log(chalk.green(\"✓ Code pushed to GitHub\\n\"));\n\n gitInfo = await getGitInfo(cwd);\n repoFullName = repoResult.fullName;\n branch = gitInfo.branch || \"main\";\n } else if (!isGitHubUrl(gitInfo.remoteUrl!)) {\n console.log(chalk.red(\"✗ Remote is not a GitHub repository\"));\n console.log(chalk.yellow(` Current remote: ${gitInfo.remoteUrl}\\n`));\n process.exit(1);\n } else if (!gitInfo.owner || !gitInfo.repo) {\n console.log(chalk.red(\"✗ Could not parse GitHub repository information\"));\n process.exit(1);\n } else {\n repoFullName = `${gitInfo.owner}/${gitInfo.repo}`;\n branch = gitInfo.branch || \"main\";\n\n // Resolve installation matching the repo owner\n const ownerLower = gitInfo.owner!.toLowerCase();\n const matchingInst =\n installations.find(\n (i) => i.account_login.toLowerCase() === ownerLower\n ) ??\n installations.find((i) => i.account_type === \"Organization\") ??\n installations[0];\n installationDbId = matchingInst.id;\n githubInstallationId = matchingInst.installation_id;\n\n // Check for uncommitted changes\n if (gitInfo.hasUncommittedChanges) {\n if (options.yes) {\n console.log(\n chalk.red(\n \"✗ You have uncommitted changes. Commit and push before deploying.\"\n )\n );\n process.exit(1);\n }\n console.log(chalk.yellow(\"⚠️ You have uncommitted changes.\\n\"));\n const shouldCommit = await prompt(\n chalk.white(\"Commit and push changes before deploying? (Y/n): \"),\n \"y\"\n );\n if (shouldCommit) {\n await ensureGitignore(cwd);\n console.log(chalk.gray(\"Committing and pushing...\"));\n await gitCommitAndPush(cwd, \"Deploy changes\", branch);\n gitInfo = await getGitInfo(cwd);\n console.log(chalk.green(\"✓ Changes pushed\\n\"));\n } else {\n console.log(chalk.gray(\"Deploying from last pushed commit.\\n\"));\n }\n }\n\n // Check repo access\n console.log(chalk.gray(\"Checking repository access...\"));\n const hasAccess = await checkRepoAccess(\n api,\n gitInfo.owner!,\n gitInfo.repo!\n );\n if (!hasAccess) {\n console.log(\n chalk.yellow(\n `⚠️ GitHub App doesn't have access to ${chalk.cyan(repoFullName)}`\n )\n );\n const configured = await promptGitHubInstallation(\n api,\n \"no_access\",\n repoFullName,\n {\n yes: options.yes,\n installationId: githubInstallationId,\n reauth: () => promptReauthenticateOn401(options, resolvedOrgId),\n }\n );\n if (!configured.ok) {\n process.exit(0);\n }\n api = configured.api;\n const retry = await checkRepoAccess(api, gitInfo.owner!, gitInfo.repo!);\n if (!retry) {\n const appName = await api.getGitHubAppName();\n console.log(\n chalk.red(\n `\\n✗ Repository ${chalk.cyan(repoFullName)} is still not accessible.`\n )\n );\n console.log(\n chalk.cyan(\n ` https://github.com/apps/${appName}/installations/new\\n`\n )\n );\n process.exit(1);\n }\n }\n console.log(chalk.green(\"✓ Repository access confirmed\"));\n }\n\n // ── Step 5: Display config ────────────────────────────────────\n const projectName = options.name || (await getProjectName(projectDir));\n const port = options.port || 3000;\n const buildCommand = await detectBuildCommand(projectDir);\n const startCommand = await detectStartCommand(projectDir);\n const runtime = options.runtime || (await detectRuntime(projectDir));\n const envVars = await buildEnvVars(options);\n\n console.log();\n console.log(chalk.white(\"Deployment configuration:\"));\n console.log(chalk.gray(` Repository: `) + chalk.cyan(repoFullName));\n console.log(chalk.gray(` Branch: `) + chalk.cyan(branch));\n console.log(chalk.gray(` Name: `) + chalk.cyan(projectName));\n console.log(chalk.gray(` Runtime: `) + chalk.cyan(runtime));\n console.log(chalk.gray(` Port: `) + chalk.cyan(port));\n if (options.region)\n console.log(chalk.gray(` Region: `) + chalk.cyan(options.region));\n if (options.buildCommand)\n console.log(\n chalk.gray(` Build command: `) + chalk.cyan(options.buildCommand)\n );\n else if (buildCommand)\n console.log(\n chalk.gray(` Build command: `) +\n chalk.gray(buildCommand + \" (auto-detected)\")\n );\n if (options.startCommand)\n console.log(\n chalk.gray(` Start command: `) + chalk.cyan(options.startCommand)\n );\n else if (startCommand)\n console.log(\n chalk.gray(` Start command: `) +\n chalk.gray(startCommand + \" (auto-detected)\")\n );\n if (Object.keys(envVars).length > 0) {\n console.log(\n chalk.gray(` Environment: `) +\n chalk.cyan(`${Object.keys(envVars).length} variable(s)`)\n );\n }\n console.log();\n\n if (!options.yes) {\n const shouldDeploy = await prompt(chalk.white(`Deploy? (Y/n): `), \"y\");\n if (!shouldDeploy) {\n console.log(chalk.gray(\"Deployment cancelled.\"));\n process.exit(0);\n }\n }\n\n // ── Step 6: Deploy ────────────────────────────────────────────\n const existingLink = !options.new ? await getProjectLink(cwd) : null;\n let serverId = existingLink?.serverId;\n\n // When --org is specified, verify the linked server belongs to that org.\n // If not, ignore the link and create a new server in the specified org.\n if (serverId && resolvedOrgId) {\n try {\n const linkedServer = await api.getServer(serverId);\n if (linkedServer.organizationId !== resolvedOrgId) {\n const target = resolvedOrgName\n ? `${resolvedOrgName}${resolvedOrgSlug ? ` (${resolvedOrgSlug})` : \"\"}`\n : resolvedOrgId;\n console.log(\n chalk.yellow(\n `⚠️ Linked server belongs to a different organization. Creating a new server in ${target}...\\n`\n )\n );\n serverId = undefined;\n }\n } catch {\n // If we can't fetch the server, let the existing flow handle it\n }\n }\n\n if (existingLink && serverId) {\n try {\n const existingDep = await api.getDeployment(existingLink.deploymentId);\n if (existingDep && existingDep.status !== \"failed\") {\n console.log(chalk.green(`✓ Found linked server`));\n console.log(chalk.gray(` Redeploying to maintain the same URL...`));\n console.log(chalk.cyan(` URL: ${getMcpServerUrl(existingDep)}\\n`));\n\n if (Object.keys(envVars).length > 0) {\n const synced = await syncEnvVarsToServer(api, serverId, envVars);\n console.log(\n chalk.green(\n `✓ Synced ${synced.created + synced.updated} environment variable(s)` +\n (synced.created || synced.updated\n ? chalk.gray(\n ` (${synced.created} created, ${synced.updated} updated)`\n )\n : \"\")\n )\n );\n }\n\n const newDep = await api.createDeployment({\n serverId,\n branch,\n trigger: \"redeploy\",\n });\n\n await saveProjectLink(cwd, {\n ...existingLink,\n linkedAt: new Date().toISOString(),\n deploymentId: newDep.id,\n });\n\n console.log(\n chalk.green(\"✓ Deployment created: \") + chalk.gray(newDep.id)\n );\n await displayDeploymentProgress(api, newDep.id, { yes: options.yes });\n return;\n }\n } catch (err: any) {\n const is404 =\n err?.status === 404 || (err?.message ?? \"\").includes(\"404\");\n if (is404) {\n console.log(\n chalk.yellow(\"⚠️ Previously linked server no longer exists.\\n\")\n );\n if (!options.yes) {\n const shouldRecreate = await prompt(\n chalk.white(\"Create a new server and deploy? (Y/n): \"),\n \"y\"\n );\n if (!shouldRecreate) {\n console.log(chalk.gray(\"Deployment cancelled.\"));\n process.exit(0);\n }\n }\n serverId = undefined;\n }\n }\n }\n\n let deploymentId: string | undefined;\n\n if (serverId) {\n if (Object.keys(envVars).length > 0) {\n const synced = await syncEnvVarsToServer(api, serverId, envVars);\n console.log(\n chalk.green(\n `✓ Synced ${synced.created + synced.updated} environment variable(s)` +\n (synced.created || synced.updated\n ? chalk.gray(\n ` (${synced.created} created, ${synced.updated} updated)`\n )\n : \"\")\n )\n );\n }\n console.log(chalk.gray(\"Creating deployment...\"));\n try {\n const result = await api.createDeployment({\n serverId,\n branch,\n trigger: \"manual\",\n });\n deploymentId = result.id;\n } catch (err: any) {\n const is404 =\n err?.status === 404 || (err?.message ?? \"\").includes(\"404\");\n if (is404) {\n console.log(\n chalk.yellow(\n \"⚠️ Linked server no longer exists. Creating a new one...\\n\"\n )\n );\n serverId = undefined;\n } else {\n throw err;\n }\n }\n }\n\n if (!serverId) {\n const orgId = await api.resolveOrganizationId();\n\n if (!installationDbId) {\n console.log(\n chalk.red(\n \"✗ Could not determine GitHub installation for this repository.\"\n )\n );\n process.exit(1);\n }\n\n console.log(chalk.gray(\"Creating server and deployment...\"));\n const serverResult = await api.createServer({\n type: \"github\",\n organizationId: orgId,\n installationId: installationDbId,\n name: projectName,\n repoFullName: repoFullName!,\n branch,\n rootDir: options.rootDir,\n port,\n env: Object.keys(envVars).length > 0 ? envVars : undefined,\n region: options.region,\n buildCommand: options.buildCommand,\n startCommand: options.startCommand,\n });\n\n deploymentId = serverResult.deploymentId ?? \"\";\n if (!deploymentId) {\n console.log(\n chalk.green(\"✓ Server created: \") + chalk.gray(serverResult.server.id)\n );\n console.log(chalk.yellow(\"⚠️ No deployment was triggered.\"));\n return;\n }\n\n await saveProjectLink(cwd, {\n deploymentId,\n deploymentName: projectName,\n linkedAt: new Date().toISOString(),\n serverId: serverResult.server.id,\n });\n console.log(\n chalk.gray(` Linked to this project (stored in .mcp-use/project.json)`)\n );\n console.log(chalk.gray(` Future deploys will reuse the same URL\\n`));\n }\n\n if (!deploymentId) {\n console.log(chalk.red(\"✗ No deployment was created.\"));\n process.exit(1);\n }\n\n console.log(\n chalk.green(\"✓ Deployment created: \") + chalk.gray(deploymentId)\n );\n await displayDeploymentProgress(api, deploymentId, { yes: options.yes });\n\n if (options.open) {\n const dep = await api.getDeployment(deploymentId);\n const url = getMcpServerUrl(dep);\n if (url) {\n console.log(chalk.gray(\"\\nOpening in browser...\"));\n await open(url);\n }\n }\n } catch (error) {\n console.error(\n chalk.red.bold(\"\\n✗ Deployment failed:\"),\n chalk.red(error instanceof Error ? error.message : \"Unknown error\")\n );\n process.exit(1);\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport interface GitInfo {\n isGitRepo: boolean;\n remoteUrl?: string;\n owner?: string;\n repo?: string;\n branch?: string;\n commitSha?: string;\n commitMessage?: string;\n hasUncommittedChanges?: boolean;\n}\n\n/**\n * Read-only git probe. Swallows errors and returns `null` so callers can treat\n * \"command failed\" identically to \"empty output\" (e.g. not a repo, no remote).\n *\n * DO NOT use this for state-mutating commands (init/add/commit/push/remote add).\n * Use `gitCommandOrThrow` instead so failures surface to the user.\n */\nasync function gitCommand(\n args: string[],\n cwd: string = process.cwd()\n): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(\"git\", args, { cwd });\n return stdout.trim();\n } catch (error) {\n return null;\n }\n}\n\n/**\n * Error thrown by `gitCommandOrThrow` when a git command exits non-zero.\n * Carries the command string plus captured stderr/stdout for actionable errors.\n */\nexport class GitCommandError extends Error {\n readonly command: string;\n readonly stderr: string;\n readonly stdout: string;\n readonly exitCode: number | null;\n\n constructor(opts: {\n command: string;\n stderr: string;\n stdout: string;\n exitCode: number | null;\n }) {\n const trimmed = opts.stderr.trim() || opts.stdout.trim() || \"unknown error\";\n super(`git command failed: \\`${opts.command}\\`\\n${trimmed}`);\n this.name = \"GitCommandError\";\n this.command = opts.command;\n this.stderr = opts.stderr;\n this.stdout = opts.stdout;\n this.exitCode = opts.exitCode;\n }\n}\n\n/**\n * Execute a git command that MUST succeed. On non-zero exit, throws\n * `GitCommandError` with captured stderr so the caller can show actionable\n * errors instead of silently continuing.\n */\nasync function gitCommandOrThrow(\n args: string[],\n cwd: string = process.cwd()\n): Promise<string> {\n const command = `git ${args.join(\" \")}`;\n try {\n const { stdout } = await execFileAsync(\"git\", args, { cwd });\n return stdout.trim();\n } catch (error) {\n const e = error as {\n stderr?: string;\n stdout?: string;\n code?: number | null;\n message?: string;\n };\n throw new GitCommandError({\n command,\n stderr: (e.stderr ?? \"\").toString(),\n stdout: (e.stdout ?? \"\").toString(),\n exitCode: typeof e.code === \"number\" ? e.code : null,\n });\n }\n}\n\n/**\n * Check if directory is a git repository\n */\nexport async function isGitRepo(cwd: string = process.cwd()): Promise<boolean> {\n const result = await gitCommand([\"rev-parse\", \"--is-inside-work-tree\"], cwd);\n return result === \"true\";\n}\n\n/**\n * Get git remote URL\n */\nexport async function getRemoteUrl(\n cwd: string = process.cwd()\n): Promise<string | null> {\n return gitCommand([\"config\", \"--get\", \"remote.origin.url\"], cwd);\n}\n\n/**\n * Parse GitHub owner and repo from remote URL\n */\nexport function parseGitHubUrl(\n url: string\n): { owner: string; repo: string } | null {\n // Handle both SSH and HTTPS URLs\n // SSH: git@github.com:owner/repo.git\n // HTTPS: https://github.com/owner/repo.git\n const sshMatch = url.match(/git@github\\.com:([^/]+)\\/(.+?)(?:\\.git)?$/);\n const httpsMatch = url.match(\n /https:\\/\\/github\\.com\\/([^/]+)\\/(.+?)(?:\\.git)?$/\n );\n\n const match = sshMatch || httpsMatch;\n if (!match) return null;\n\n return {\n owner: match[1],\n repo: match[2],\n };\n}\n\n/**\n * Get current branch\n */\nexport async function getCurrentBranch(\n cwd: string = process.cwd()\n): Promise<string | null> {\n return gitCommand([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], cwd);\n}\n\n/**\n * Get current commit SHA\n */\nexport async function getCommitSha(\n cwd: string = process.cwd()\n): Promise<string | null> {\n return gitCommand([\"rev-parse\", \"HEAD\"], cwd);\n}\n\n/**\n * Get current commit message\n */\nexport async function getCommitMessage(\n cwd: string = process.cwd()\n): Promise<string | null> {\n return gitCommand([\"log\", \"-1\", \"--pretty=%B\"], cwd);\n}\n\n/**\n * Check if there are uncommitted changes\n */\nexport async function hasUncommittedChanges(\n cwd: string = process.cwd()\n): Promise<boolean> {\n const result = await gitCommand([\"status\", \"--porcelain\"], cwd);\n return result !== null && result.length > 0;\n}\n\n/**\n * Get all git info for current directory\n */\nexport async function getGitInfo(\n cwd: string = process.cwd()\n): Promise<GitInfo> {\n const isRepo = await isGitRepo(cwd);\n\n if (!isRepo) {\n return { isGitRepo: false };\n }\n\n const remoteUrl = await getRemoteUrl(cwd);\n const branch = await getCurrentBranch(cwd);\n const commitSha = await getCommitSha(cwd);\n const commitMessage = await getCommitMessage(cwd);\n const uncommittedChanges = await hasUncommittedChanges(cwd);\n\n let owner: string | undefined;\n let repo: string | undefined;\n\n if (remoteUrl) {\n const parsed = parseGitHubUrl(remoteUrl);\n if (parsed) {\n owner = parsed.owner;\n repo = parsed.repo;\n }\n }\n\n return {\n isGitRepo: true,\n remoteUrl: remoteUrl || undefined,\n owner,\n repo,\n branch: branch || undefined,\n commitSha: commitSha || undefined,\n commitMessage: commitMessage || undefined,\n hasUncommittedChanges: uncommittedChanges,\n };\n}\n\n/**\n * Initialize a git repo, add all files, commit, and normalize branch to `main`.\n *\n * Throws `GitCommandError` (typed Error) on any failure so callers can surface\n * the real stderr instead of silently continuing (previous behavior left the\n * repo in a half-baked state and the CLI still printed \"Code pushed\").\n */\nexport async function gitInit(\n cwd: string,\n message: string = \"Initial commit\"\n): Promise<void> {\n await gitCommandOrThrow([\"init\"], cwd);\n await gitCommandOrThrow([\"add\", \".\"], cwd);\n await gitCommandOrThrow([\"commit\", \"-m\", message], cwd);\n // Normalize branch name so a subsequent `git push -u origin main` always\n // matches, regardless of the user's `init.defaultBranch` config.\n await gitCommandOrThrow([\"branch\", \"-M\", \"main\"], cwd);\n // Guard: commit must exist before we try to push.\n await gitCommandOrThrow([\"rev-parse\", \"HEAD\"], cwd);\n}\n\n/**\n * Add a remote and push to it. Throws `GitCommandError` on failure.\n */\nexport async function gitAddRemoteAndPush(\n cwd: string,\n cloneUrl: string,\n branch: string = \"main\"\n): Promise<void> {\n await gitCommandOrThrow([\"remote\", \"add\", \"origin\", cloneUrl], cwd);\n await gitCommandOrThrow([\"push\", \"-u\", \"origin\", branch], cwd);\n}\n\n/**\n * Commit all changes and push. Throws `GitCommandError` on failure.\n */\nexport async function gitCommitAndPush(\n cwd: string,\n message: string,\n branch: string = \"main\"\n): Promise<void> {\n await gitCommandOrThrow([\"add\", \".\"], cwd);\n await gitCommandOrThrow([\"commit\", \"-m\", message], cwd);\n await gitCommandOrThrow([\"push\", \"origin\", branch], cwd);\n}\n\n/**\n * Check if remote is a GitHub URL\n */\nexport function isGitHubUrl(url: string): boolean {\n try {\n // Handle HTTP(S) URLs\n const parsedUrl = new URL(url);\n return (\n parsedUrl.hostname === \"github.com\" ||\n parsedUrl.hostname === \"www.github.com\"\n );\n } catch {\n // Handle SSH/shortened git URLs: git@github.com:user/repo.git\n // Extract the host before the \":\" or \"/\" (if git@host:repo or git@host/repo)\n const sshMatch = url.match(/^git@([^:/]+)[:/]/);\n if (sshMatch) {\n const host = sshMatch[1];\n return host === \"github.com\" || host === \"www.github.com\";\n }\n }\n return false;\n}\n","import type { Deployment } from \"./api.js\";\n\nconst GATEWAY_DOMAIN = \"run.mcp-use.com\";\n\nexport function buildGatewayUrl(slugOrId: string): string {\n return `https://${slugOrId}.${GATEWAY_DOMAIN}/mcp`;\n}\n\n/** MCP URL for a deployment: explicit `mcpUrl`, else gateway URL from `serverId`. */\nexport function getMcpServerUrl(deployment: Deployment): string {\n if (deployment.mcpUrl) return deployment.mcpUrl;\n if (deployment.serverId) return buildGatewayUrl(deployment.serverId);\n return \"\";\n}\n\n/**\n * MCP URL for a cloud server row/detail: use API `mcpUrl` when set; otherwise\n * gateway host uses **slug** when present (matches production hostnames), else `id`.\n */\nexport function getMcpServerUrlForCloudServer(server: {\n mcpUrl?: string | null;\n slug?: string | null;\n id: string;\n}): string {\n if (server.mcpUrl) return server.mcpUrl;\n const hostKey = (server.slug && server.slug.trim()) || server.id;\n return buildGatewayUrl(hostKey);\n}\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nexport const MCP_USE_DIR = \".mcp-use\";\nexport const MCP_USE_DIR_PROJECT = \"project.json\";\n\nexport interface ProjectLink {\n deploymentId: string;\n deploymentName: string;\n deploymentUrl?: string;\n linkedAt: string;\n serverId?: string;\n}\n\n// Get .mcp-use directory path\nexport function getMcpUseDirectory(cwd: string): string {\n return path.join(cwd, MCP_USE_DIR);\n}\n\n// Read project link\nexport async function getProjectLink(cwd: string): Promise<ProjectLink | null> {\n try {\n const linkPath = path.join(getMcpUseDirectory(cwd), MCP_USE_DIR_PROJECT);\n const content = await fs.readFile(linkPath, \"utf-8\");\n return JSON.parse(content);\n } catch (err: any) {\n if (err.code === \"ENOENT\") return null;\n throw err;\n }\n}\n\n// Write project link\nexport async function saveProjectLink(\n cwd: string,\n link: ProjectLink\n): Promise<void> {\n const mcpUseDir = getMcpUseDirectory(cwd);\n await fs.mkdir(mcpUseDir, { recursive: true });\n\n const linkPath = path.join(mcpUseDir, MCP_USE_DIR_PROJECT);\n await fs.writeFile(linkPath, JSON.stringify(link, null, 2), \"utf-8\");\n\n // Add to .gitignore\n await addToGitIgnore(cwd);\n}\n\n// Add .mcp-use to .gitignore\nasync function addToGitIgnore(cwd: string): Promise<void> {\n const gitignorePath = path.join(cwd, \".gitignore\");\n try {\n let content = \"\";\n try {\n content = await fs.readFile(gitignorePath, \"utf-8\");\n } catch (err: any) {\n if (err.code !== \"ENOENT\") throw err;\n }\n\n if (!content.includes(MCP_USE_DIR)) {\n const newContent =\n content +\n (content.endsWith(\"\\n\") ? \"\" : \"\\n\") +\n `\\n# mcp-use deployment\\n${MCP_USE_DIR}\\n`;\n await fs.writeFile(gitignorePath, newContent, \"utf-8\");\n }\n } catch (err) {\n // Ignore gitignore errors\n }\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { McpUseAPI } from \"../utils/api.js\";\nimport { getMcpServerUrl } from \"../utils/cloud-urls.js\";\nimport { isLoggedIn } from \"../utils/config.js\";\nimport { handleCommandError } from \"../utils/errors.js\";\nimport { formatRelativeTime } from \"../utils/format.js\";\n\nasync function prompt(question: string): Promise<boolean> {\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n const trimmedAnswer = answer.trim().toLowerCase();\n resolve(trimmedAnswer === \"y\" || trimmedAnswer === \"yes\");\n });\n });\n}\n\nfunction getStatusColor(status: string): (text: string) => string {\n switch (status) {\n case \"running\":\n return chalk.green;\n case \"building\":\n case \"pending\":\n return chalk.yellow;\n case \"failed\":\n case \"stopped\":\n return chalk.red;\n default:\n return chalk.gray;\n }\n}\n\nfunction formatId(id: string): string {\n return id;\n}\n\nasync function listDeploymentsCommand(): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n const [deployments, authResult] = await Promise.all([\n api.listDeployments(),\n api.testAuth(),\n ]);\n\n const orgMap = new Map(authResult.orgs.map((o) => [o.id, o.name]));\n\n const uniqueServerIds = [\n ...new Set(\n deployments\n .map((d) => d.serverId)\n .filter((id): id is string => id != null)\n ),\n ];\n\n const serverResults = await Promise.allSettled(\n uniqueServerIds.map((id) => api.getServer(id))\n );\n\n const serverOrgMap = new Map<string, string>();\n for (let i = 0; i < uniqueServerIds.length; i++) {\n const result = serverResults[i];\n if (result.status === \"fulfilled\") {\n const orgName =\n orgMap.get(result.value.organizationId) ??\n result.value.organizationId.substring(0, 19);\n serverOrgMap.set(uniqueServerIds[i], orgName);\n }\n }\n\n const sortedDeployments = [...deployments].sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n );\n\n if (sortedDeployments.length === 0) {\n console.log(chalk.yellow(\"No deployments found.\"));\n console.log(\n chalk.gray(\n \"\\nDeploy your first MCP server with \" + chalk.white(\"mcp-use deploy\")\n )\n );\n return;\n }\n\n console.log(\n chalk.cyan.bold(`\\n📦 Deployments (${sortedDeployments.length})\\n`)\n );\n\n console.log(\n chalk.white.bold(\n `${\"ID\".padEnd(40)} ${\"NAME\".padEnd(25)} ${\"ORG\".padEnd(20)} ${\"STATUS\".padEnd(12)} ${\"MCP URL\".padEnd(45)} ${\"CREATED\"}`\n )\n );\n console.log(chalk.gray(\"─\".repeat(155)));\n\n for (const deployment of sortedDeployments) {\n const id = formatId(deployment.id).padEnd(40);\n const name = deployment.name.substring(0, 24).padEnd(25);\n const orgName = deployment.serverId\n ? (serverOrgMap.get(deployment.serverId) ?? \"-\")\n : \"-\";\n const org = orgName.substring(0, 19).padEnd(20);\n const statusColor = getStatusColor(deployment.status);\n const status = statusColor(deployment.status.padEnd(12));\n const mcpUrl = (deployment.mcpUrl || \"-\").substring(0, 44).padEnd(45);\n const created = formatRelativeTime(deployment.createdAt);\n\n console.log(\n `${chalk.gray(id)} ${name} ${chalk.magenta(org)} ${status} ${chalk.cyan(mcpUrl)} ${chalk.gray(created)}`\n );\n }\n\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to list deployments\");\n }\n}\n\nasync function getDeploymentCommand(deploymentId: string): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n const deployment = await api.getDeployment(deploymentId);\n\n console.log(chalk.cyan.bold(\"\\n📦 Deployment Details\\n\"));\n\n console.log(chalk.white(\"ID: \") + chalk.gray(deployment.id));\n console.log(chalk.white(\"Name: \") + chalk.cyan(deployment.name));\n\n const statusColor = getStatusColor(deployment.status);\n console.log(\n chalk.white(\"Status: \") + statusColor(deployment.status)\n );\n\n if (deployment.serverId) {\n console.log(\n chalk.white(\"Server ID: \") + chalk.gray(deployment.serverId)\n );\n }\n\n const mcpUrl = getMcpServerUrl(deployment);\n if (mcpUrl) {\n console.log(chalk.white(\"MCP URL: \") + chalk.cyan(mcpUrl));\n }\n\n if (deployment.gitBranch) {\n console.log(\n chalk.white(\"Branch: \") + chalk.gray(deployment.gitBranch)\n );\n }\n if (deployment.gitCommitSha) {\n console.log(\n chalk.white(\"Commit: \") +\n chalk.gray(deployment.gitCommitSha.substring(0, 7))\n );\n }\n\n if (deployment.port) {\n console.log(chalk.white(\"Port: \") + chalk.gray(deployment.port));\n }\n\n if (deployment.provider) {\n console.log(\n chalk.white(\"Provider: \") + chalk.gray(deployment.provider)\n );\n }\n\n console.log(\n chalk.white(\"Created: \") +\n chalk.gray(formatRelativeTime(deployment.createdAt))\n );\n console.log(\n chalk.white(\"Updated: \") +\n chalk.gray(formatRelativeTime(deployment.updatedAt))\n );\n\n if (deployment.status === \"failed\" && deployment.error) {\n console.log(chalk.red(\"\\nError:\"));\n console.log(chalk.red(` ${deployment.error}`));\n }\n\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to get deployment\");\n }\n}\n\nasync function restartDeploymentCommand(\n deploymentId: string,\n options: { follow?: boolean }\n): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n const deployment = await api.getDeployment(deploymentId);\n\n if (!deployment.serverId) {\n console.log(\n chalk.red(\"✗ Cannot restart: deployment has no linked server.\")\n );\n process.exit(1);\n }\n\n console.log(\n chalk.cyan.bold(`\\n🔄 Restarting deployment: ${deployment.name}\\n`)\n );\n\n const newDep = await api.createDeployment({\n serverId: deployment.serverId,\n trigger: \"redeploy\",\n });\n\n console.log(chalk.green(\"✓ Restart initiated: \") + chalk.gray(newDep.id));\n\n if (options.follow) {\n console.log(chalk.gray(\"\\nFollowing build logs...\\n\"));\n\n let offset = 0;\n let terminal = false;\n while (!terminal) {\n await new Promise((r) => setTimeout(r, 2000));\n try {\n const resp = await api.getDeploymentBuildLogs(newDep.id, offset);\n if (resp.logs.length > 0) {\n const lines = resp.logs.split(\"\\n\").filter((l) => l.trim());\n for (const line of lines) {\n try {\n const logData = JSON.parse(line);\n if (logData.line) {\n const levelColor =\n logData.level === \"error\"\n ? chalk.red\n : logData.level === \"warn\"\n ? chalk.yellow\n : chalk.gray;\n const stepPrefix = logData.step\n ? chalk.cyan(`[${logData.step}]`) + \" \"\n : \"\";\n console.log(stepPrefix + levelColor(logData.line));\n }\n } catch {\n console.log(chalk.gray(line));\n }\n }\n offset = resp.offset;\n }\n if (\n resp.status === \"running\" ||\n resp.status === \"failed\" ||\n resp.status === \"stopped\"\n ) {\n terminal = true;\n }\n } catch {\n // Build logs not ready yet\n }\n }\n } else {\n console.log(\n chalk.gray(\n \"\\nCheck status with: \" +\n chalk.white(`mcp-use deployments get ${newDep.id}`)\n )\n );\n }\n\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to restart deployment\");\n }\n}\n\nasync function deleteDeploymentCommand(\n deploymentId: string,\n options: { yes?: boolean }\n): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n const deployment = await api.getDeployment(deploymentId);\n\n if (!options.yes) {\n console.log(\n chalk.yellow(\n `\\n⚠️ You are about to delete deployment: ${chalk.white(deployment.name)}`\n )\n );\n console.log(chalk.gray(` ID: ${deployment.id}`));\n if (deployment.mcpUrl) {\n console.log(chalk.gray(` URL: ${deployment.mcpUrl}\\n`));\n }\n\n const confirmed = await prompt(\n chalk.white(\"Are you sure you want to delete this deployment? (y/N): \")\n );\n\n if (!confirmed) {\n console.log(chalk.gray(\"Deletion cancelled.\"));\n return;\n }\n }\n\n await api.deleteDeployment(deploymentId);\n console.log(\n chalk.green.bold(`\\n✓ Deployment deleted: ${deployment.name}\\n`)\n );\n } catch (error) {\n handleCommandError(error, \"Failed to delete deployment\");\n }\n}\n\nasync function logsCommand(\n deploymentId: string,\n options: { build?: boolean; follow?: boolean }\n): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n\n if (options.follow) {\n console.log(chalk.gray(\"Following build logs...\\n\"));\n\n let offset = 0;\n let terminal = false;\n while (!terminal) {\n await new Promise((r) => setTimeout(r, 2000));\n try {\n const resp = await api.getDeploymentBuildLogs(deploymentId, offset);\n if (resp.logs.length > 0) {\n const lines = resp.logs.split(\"\\n\").filter((l) => l.trim());\n for (const line of lines) {\n try {\n const logData = JSON.parse(line);\n if (logData.line) {\n const levelColor =\n logData.level === \"error\"\n ? chalk.red\n : logData.level === \"warn\"\n ? chalk.yellow\n : chalk.gray;\n const stepPrefix = logData.step\n ? chalk.cyan(`[${logData.step}]`) + \" \"\n : \"\";\n console.log(stepPrefix + levelColor(logData.line));\n }\n } catch {\n console.log(chalk.gray(line));\n }\n }\n offset = resp.offset;\n }\n if (\n resp.status === \"running\" ||\n resp.status === \"failed\" ||\n resp.status === \"stopped\"\n ) {\n terminal = true;\n }\n } catch {\n // Build logs not ready yet\n }\n }\n } else if (options.build) {\n const resp = await api.getDeploymentBuildLogs(deploymentId);\n const logs = resp.logs;\n\n if (!logs || logs.trim() === \"\") {\n console.log(\n chalk.yellow(\"No build logs available for this deployment.\")\n );\n return;\n }\n\n const logLines = logs.split(\"\\n\").filter((l) => l.trim());\n for (const line of logLines) {\n try {\n const logData = JSON.parse(line);\n if (logData.line) {\n const levelColor =\n logData.level === \"error\"\n ? chalk.red\n : logData.level === \"warn\"\n ? chalk.yellow\n : chalk.gray;\n const stepPrefix = logData.step\n ? chalk.cyan(`[${logData.step}]`) + \" \"\n : \"\";\n console.log(stepPrefix + levelColor(logData.line));\n }\n } catch {\n console.log(chalk.gray(line));\n }\n }\n } else {\n const logs = await api.getDeploymentLogs(deploymentId);\n\n if (!logs || logs.trim() === \"\") {\n console.log(chalk.yellow(\"No logs available for this deployment.\"));\n return;\n }\n\n const logLines = logs.split(\"\\n\").filter((l) => l.trim());\n for (const line of logLines) {\n try {\n const logData = JSON.parse(line);\n if (logData.line) {\n const levelColor =\n logData.level === \"error\"\n ? chalk.red\n : logData.level === \"warn\"\n ? chalk.yellow\n : chalk.gray;\n const stepPrefix = logData.step\n ? chalk.cyan(`[${logData.step}]`) + \" \"\n : \"\";\n console.log(stepPrefix + levelColor(logData.line));\n }\n } catch {\n console.log(chalk.gray(line));\n }\n }\n }\n\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to get logs\");\n }\n}\n\nasync function stopDeploymentCommand(deploymentId: string): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n await api.stopDeployment(deploymentId);\n\n console.log(chalk.green.bold(`\\n✓ Deployment stopped\\n`));\n } catch (error) {\n handleCommandError(error, \"Failed to stop deployment\");\n }\n}\n\nasync function startDeploymentCommand(deploymentId: string): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n console.log(\n chalk.yellow(\n \"⚠️ Start is not supported in this version. Use `mcp-use deployments restart` to redeploy.\"\n )\n );\n } catch (error) {\n handleCommandError(error, \"Failed to start deployment\");\n }\n}\n\nexport function createDeploymentsCommand(): Command {\n const deploymentsCommand = new Command(\"deployments\")\n .description(\"Manage cloud deployments\")\n .showHelpAfterError(\n \"(Run `mcp-use deployments --help` to see available commands)\"\n );\n\n deploymentsCommand\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List all deployments\")\n .action(listDeploymentsCommand);\n\n deploymentsCommand\n .command(\"get\")\n .argument(\"<deployment-id>\", \"Deployment ID\")\n .description(\"Get deployment details\")\n .action(getDeploymentCommand);\n\n deploymentsCommand\n .command(\"restart\")\n .argument(\"<deployment-id>\", \"Deployment ID\")\n .option(\"-f, --follow\", \"Follow build logs\")\n .description(\n \"Restart a deployment (triggers a new deployment on the same server)\"\n )\n .action(restartDeploymentCommand);\n\n deploymentsCommand\n .command(\"delete\")\n .alias(\"rm\")\n .argument(\"<deployment-id>\", \"Deployment ID\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .description(\"Delete a deployment\")\n .action(deleteDeploymentCommand);\n\n deploymentsCommand\n .command(\"logs\")\n .argument(\"<deployment-id>\", \"Deployment ID\")\n .option(\"-b, --build\", \"Show build logs instead of runtime logs\")\n .option(\"-f, --follow\", \"Follow build logs in real-time\")\n .description(\"View deployment logs\")\n .action(logsCommand);\n\n deploymentsCommand\n .command(\"stop\")\n .argument(\"<deployment-id>\", \"Deployment ID\")\n .description(\"Stop a deployment\")\n .action(stopDeploymentCommand);\n\n deploymentsCommand\n .command(\"start\")\n .argument(\"<deployment-id>\", \"Deployment ID\")\n .description(\"Start a stopped deployment\")\n .action(startDeploymentCommand);\n\n return deploymentsCommand;\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { McpUseAPI } from \"../utils/api.js\";\nimport { getMcpServerUrlForCloudServer } from \"../utils/cloud-urls.js\";\nimport { getWebUrl, isLoggedIn, readConfig } from \"../utils/config.js\";\nimport { handleCommandError } from \"../utils/errors.js\";\nimport { formatRelativeTime } from \"../utils/format.js\";\nimport { resolveOrgFromOption } from \"./auth.js\";\nimport { createEnvCommand } from \"./env.js\";\n\nasync function prompt(question: string): Promise<boolean> {\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n const trimmedAnswer = answer.trim().toLowerCase();\n resolve(trimmedAnswer === \"y\" || trimmedAnswer === \"yes\");\n });\n });\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null;\n}\n\nfunction pickStr(obj: unknown, key: string): string {\n if (!isRecord(obj)) return \"-\";\n const v = obj[key];\n if (typeof v === \"string\") return v;\n if (v != null && typeof v !== \"object\") return String(v);\n return \"-\";\n}\n\nasync function applyOrgOption(api: McpUseAPI, org?: string): Promise<void> {\n if (!org) return;\n const authInfo = await api.testAuth();\n const match = resolveOrgFromOption(authInfo.orgs ?? [], org);\n if (!match) {\n console.error(\n chalk.red(\n `✗ Organization \"${org}\" not found. Run ${chalk.white(\"npx mcp-use org list\")} to see available organizations.`\n )\n );\n process.exit(1);\n }\n api.setOrgId(match.id);\n const slug = match.slug ? chalk.gray(` (${match.slug})`) : \"\";\n console.log(chalk.gray(\"Organization: \") + chalk.cyan(match.name) + slug);\n}\n\nfunction getStatusColor(status: string): (text: string) => string {\n const s = status.toLowerCase();\n if (s.includes(\"run\") || s === \"active\") return chalk.green;\n if (s.includes(\"fail\") || s.includes(\"error\")) return chalk.red;\n if (s.includes(\"build\") || s.includes(\"pend\")) return chalk.yellow;\n return chalk.gray;\n}\n\nasync function listServersCommand(options: {\n org?: string;\n limit?: string;\n skip?: string;\n sort?: string;\n}): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n await applyOrgOption(api, options.org);\n if (options.org) console.log();\n\n const limit = options.limit ? parseInt(options.limit, 10) : undefined;\n const skip = options.skip ? parseInt(options.skip, 10) : undefined;\n if (limit !== undefined && (Number.isNaN(limit) || limit < 1)) {\n console.log(chalk.red(\"✗ Invalid --limit\"));\n process.exit(1);\n }\n if (skip !== undefined && (Number.isNaN(skip) || skip < 0)) {\n console.log(chalk.red(\"✗ Invalid --skip\"));\n process.exit(1);\n }\n\n const servers = await api.listServers({\n limit,\n skip,\n sort: options.sort,\n });\n\n if (servers.length === 0) {\n console.log(chalk.yellow(\"No servers found.\"));\n console.log(\n chalk.gray(\n \"\\nCreate one by deploying with \" + chalk.white(\"mcp-use deploy\")\n )\n );\n return;\n }\n\n console.log(chalk.cyan.bold(`\\n🖥 Servers (${servers.length})\\n`));\n\n console.log(\n chalk.white.bold(\n `${\"ID\".padEnd(38)} ${\"NAME\".padEnd(22)} ${\"STATUS\".padEnd(14)} ${\"REPO\".padEnd(32)} ${\"MCP URL\".padEnd(52)}`\n )\n );\n console.log(chalk.gray(\"─\".repeat(165)));\n\n for (const s of servers) {\n const id = s.id.substring(0, 37).padEnd(38);\n const name = (s.name || s.slug || \"-\").substring(0, 21).padEnd(22);\n const statusColor = getStatusColor(s.status);\n const status = statusColor(s.status.substring(0, 13).padEnd(14));\n const repo = (s.connectedRepository?.repoFullName ?? \"-\")\n .substring(0, 31)\n .padEnd(32);\n const mcp = getMcpServerUrlForCloudServer(s).substring(0, 51).padEnd(52);\n console.log(\n `${chalk.gray(id)} ${name} ${status} ${chalk.gray(repo)} ${chalk.cyan(mcp)}`\n );\n }\n\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to list servers\");\n }\n}\n\nasync function getServerCommand(idOrSlug: string, options: { org?: string }) {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n await applyOrgOption(api, options.org);\n if (options.org) console.log();\n\n const server = await api.getServer(idOrSlug);\n\n console.log(chalk.cyan.bold(\"\\n🖥 Server Details\\n\"));\n\n console.log(chalk.white(\"ID: \") + chalk.gray(server.id));\n if (server.slug) {\n console.log(chalk.white(\"Slug: \") + chalk.cyan(server.slug));\n }\n console.log(\n chalk.white(\"Name: \") + chalk.cyan(server.name ?? \"-\")\n );\n const statusColor = getStatusColor(server.status);\n console.log(chalk.white(\"Status: \") + statusColor(server.status));\n if (server.latestDeploymentStatus) {\n console.log(\n chalk.white(\"Last deploy: \") +\n chalk.gray(server.latestDeploymentStatus)\n );\n }\n console.log(chalk.white(\"Region: \") + chalk.gray(server.region));\n console.log(\n chalk.white(\"MCP URL: \") +\n chalk.cyan(getMcpServerUrlForCloudServer(server))\n );\n\n if (server.connectedRepository) {\n const cr = server.connectedRepository;\n console.log(chalk.white(\"\\nRepository\"));\n console.log(chalk.white(\" Full name: \") + chalk.gray(cr.repoFullName));\n console.log(\n chalk.white(\" Prod branch: \") + chalk.gray(cr.productionBranch)\n );\n }\n\n if (server.activeDeploymentId) {\n console.log(\n chalk.white(\"\\nActive deployment: \") +\n chalk.cyan(server.activeDeploymentId)\n );\n }\n if (server.previousDeploymentId) {\n console.log(\n chalk.white(\"Previous deployment: \") +\n chalk.gray(server.previousDeploymentId)\n );\n }\n\n const depCount = server._count?.deployments;\n if (depCount != null) {\n console.log(\n chalk.white(\"Deployment count: \") + chalk.gray(String(depCount))\n );\n }\n\n console.log(\n chalk.white(\"Created: \") +\n chalk.gray(formatRelativeTime(server.createdAt))\n );\n console.log(\n chalk.white(\"Updated: \") +\n chalk.gray(formatRelativeTime(server.updatedAt))\n );\n\n const config = await readConfig();\n const base = (await getWebUrl()).replace(/\\/$/, \"\");\n if (config.orgSlug) {\n console.log(\n chalk.white(\"\\nDashboard: \") +\n chalk.cyan(`${base}/cloud/${config.orgSlug}/servers/${server.id}`)\n );\n } else {\n console.log(\n chalk.white(\"\\nDashboard: \") +\n chalk.cyan(`${base}/cloud/servers/${server.id}`)\n );\n }\n\n if (Array.isArray(server.deployments) && server.deployments.length > 0) {\n console.log(chalk.cyan.bold(\"\\nRecent deployments\\n\"));\n console.log(\n chalk.white.bold(\n `${\"ID\".padEnd(40)} ${\"NAME\".padEnd(24)} ${\"STATUS\".padEnd(12)} ${\"UPDATED\"}`\n )\n );\n console.log(chalk.gray(\"─\".repeat(100)));\n for (const d of server.deployments) {\n const did = pickStr(d, \"id\").padEnd(40);\n const dname = pickStr(d, \"name\").substring(0, 23).padEnd(24);\n const dst = pickStr(d, \"status\").padEnd(12);\n const du = pickStr(d, \"updatedAt\");\n const updated = du !== \"-\" ? formatRelativeTime(du) : chalk.gray(\"-\");\n const sc = getStatusColor(dst.trim());\n console.log(\n `${chalk.gray(did)} ${dname} ${sc(dst)} ${chalk.gray(updated)}`\n );\n }\n }\n\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to get server\");\n }\n}\n\nasync function deleteServerCommand(\n serverId: string,\n options: { yes?: boolean; org?: string }\n): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n await applyOrgOption(api, options.org);\n if (options.org) console.log();\n\n const server = await api.getServer(serverId);\n\n if (!options.yes) {\n console.log(\n chalk.yellow(\n `\\n⚠️ You are about to delete server: ${chalk.white(server.name || server.slug || server.id)}`\n )\n );\n console.log(chalk.gray(` ID: ${server.id}`));\n if (server.connectedRepository?.repoFullName) {\n console.log(\n chalk.gray(` Repo: ${server.connectedRepository.repoFullName}\\n`)\n );\n } else {\n console.log();\n }\n\n const confirmed = await prompt(\n chalk.white(\n \"This deletes the server and all its deployments. Continue? (y/N): \"\n )\n );\n\n if (!confirmed) {\n console.log(chalk.gray(\"Deletion cancelled.\"));\n return;\n }\n }\n\n await api.deleteServer(server.id);\n console.log(\n chalk.green.bold(\n `\\n✓ Server deleted: ${server.name || server.slug || server.id}\\n`\n )\n );\n } catch (error) {\n handleCommandError(error, \"Failed to delete server\");\n }\n}\n\nexport function createServersCommand(): Command {\n const serversCommand = new Command(\"servers\")\n .description(\"Manage cloud servers (Git-backed deploy targets)\")\n .showHelpAfterError(\n \"(Run `mcp-use servers --help` to see available commands)\"\n );\n\n serversCommand\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List servers for the current organization\")\n .option(\"--org <slug-or-id>\", \"Target organization (slug, id, or name)\")\n .option(\"--limit <n>\", \"Page size (1–100, default 50)\")\n .option(\"--skip <n>\", \"Offset for pagination\")\n .option(\"--sort <field:asc|desc>\", \"Sort (e.g. updatedAt:desc)\")\n .action(listServersCommand);\n\n serversCommand\n .command(\"get\")\n .argument(\"<id-or-slug>\", \"Server UUID or slug\")\n .option(\"--org <slug-or-id>\", \"Resolve org context before fetch\")\n .description(\"Show server details and recent deployments\")\n .action(getServerCommand);\n\n serversCommand\n .command(\"delete\")\n .alias(\"rm\")\n .argument(\"<server-id>\", \"Server UUID (or slug if API accepts it)\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .option(\"--org <slug-or-id>\", \"Target organization\")\n .description(\"Delete a server and all its deployments\")\n .action(deleteServerCommand);\n\n serversCommand.addCommand(createEnvCommand());\n\n return serversCommand;\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { EnvEnvironment, EnvVariable } from \"../utils/api.js\";\nimport { McpUseAPI } from \"../utils/api.js\";\nimport { isLoggedIn } from \"../utils/config.js\";\nimport { handleCommandError } from \"../utils/errors.js\";\n\nconst ALL_ENVS: EnvEnvironment[] = [\"production\", \"preview\", \"development\"];\n\nfunction parseEnvironments(raw: string): EnvEnvironment[] {\n const parts = raw\n .split(\",\")\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean);\n\n const valid: EnvEnvironment[] = [];\n for (const p of parts) {\n if (p === \"production\" || p === \"preview\" || p === \"development\") {\n valid.push(p);\n } else {\n console.error(\n chalk.red(\n `✗ Unknown environment \"${p}\". Valid values: production, preview, development`\n )\n );\n process.exit(1);\n }\n }\n\n if (valid.length === 0) {\n console.error(chalk.red(\"✗ At least one environment must be specified.\"));\n process.exit(1);\n }\n\n return valid;\n}\n\nfunction envBadge(env: EnvEnvironment): string {\n if (env === \"production\") return chalk.green(\"prod\");\n if (env === \"preview\") return chalk.yellow(\"prev\");\n return chalk.blue(\"dev\");\n}\n\nfunction printEnvVar(v: EnvVariable, showValue = false): void {\n const envs = v.environments.map(envBadge).join(\" \");\n const val = v.sensitive\n ? chalk.gray(\"<sensitive>\")\n : showValue\n ? chalk.cyan(v.value)\n : chalk.gray(\"(hidden — use --show-values to reveal)\");\n console.log(` ${chalk.white.bold(v.key.padEnd(32))} ${val}`);\n console.log(\n ` ${chalk.gray(\"id:\")} ${chalk.gray(v.id)} ${envs}${v.sensitive ? \" \" + chalk.yellow(\"🔒 sensitive\") : \"\"}`\n );\n}\n\nasync function requireLogin(): Promise<void> {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\")\n );\n process.exit(1);\n }\n}\n\nasync function listEnvCommand(options: {\n server: string;\n showValues?: boolean;\n}): Promise<void> {\n try {\n await requireLogin();\n\n const api = await McpUseAPI.create();\n const vars = await api.listEnvVariables(options.server);\n\n if (vars.length === 0) {\n console.log(\n chalk.yellow(\"\\nNo environment variables set for this server.\\n\")\n );\n return;\n }\n\n console.log(chalk.cyan.bold(`\\nEnvironment Variables (${vars.length})\\n`));\n for (const v of vars) {\n printEnvVar(v, options.showValues);\n console.log();\n }\n } catch (error) {\n handleCommandError(error, \"Failed to list environment variables\");\n }\n}\n\nasync function addEnvCommand(\n assignment: string,\n options: { server: string; env?: string; sensitive?: boolean }\n): Promise<void> {\n try {\n await requireLogin();\n\n const eqIdx = assignment.indexOf(\"=\");\n if (eqIdx === -1) {\n console.error(\n chalk.red(\n \"✗ Expected KEY=VALUE format, e.g. mcp-use servers env add API_KEY=abc123\"\n )\n );\n process.exit(1);\n }\n\n const key = assignment.substring(0, eqIdx).trim();\n const value = assignment.substring(eqIdx + 1);\n\n if (!key) {\n console.error(chalk.red(\"✗ Key must not be empty.\"));\n process.exit(1);\n }\n\n const environments = options.env\n ? parseEnvironments(options.env)\n : ALL_ENVS;\n\n const api = await McpUseAPI.create();\n const created = await api.createEnvVariable(options.server, {\n key,\n value,\n environments,\n sensitive: options.sensitive ?? false,\n });\n\n console.log(\n chalk.green(`\\n✓ Environment variable \"${created.key}\" added.\\n`)\n );\n printEnvVar(created, true);\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to add environment variable\");\n }\n}\n\nasync function updateEnvCommand(\n varId: string,\n options: { server: string; value?: string; env?: string; sensitive?: boolean }\n): Promise<void> {\n try {\n await requireLogin();\n\n if (!options.value && !options.env && options.sensitive === undefined) {\n console.error(\n chalk.red(\n \"✗ Nothing to update. Provide at least one of --value, --env, --sensitive.\"\n )\n );\n process.exit(1);\n }\n\n const body: {\n value?: string;\n environments?: EnvEnvironment[];\n sensitive?: boolean;\n } = {};\n if (options.value !== undefined) body.value = options.value;\n if (options.env) body.environments = parseEnvironments(options.env);\n if (options.sensitive !== undefined) body.sensitive = options.sensitive;\n\n const api = await McpUseAPI.create();\n const updated = await api.updateEnvVariable(options.server, varId, body);\n\n console.log(\n chalk.green(`\\n✓ Environment variable \"${updated.key}\" updated.\\n`)\n );\n printEnvVar(updated, !!options.value);\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to update environment variable\");\n }\n}\n\nasync function removeEnvCommand(\n varId: string,\n options: { server: string }\n): Promise<void> {\n try {\n await requireLogin();\n\n const api = await McpUseAPI.create();\n await api.deleteEnvVariable(options.server, varId);\n\n console.log(chalk.green(`\\n✓ Environment variable ${varId} removed.\\n`));\n } catch (error) {\n handleCommandError(error, \"Failed to remove environment variable\");\n }\n}\n\nexport function createEnvCommand(): Command {\n const envCommand = new Command(\"env\")\n .description(\"Manage environment variables for a server\")\n .showHelpAfterError(\"(Run `mcp-use env --help` to see available commands)\");\n\n envCommand\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List environment variables for a server\")\n .requiredOption(\"--server <id>\", \"Server UUID\")\n .option(\"--show-values\", \"Reveal non-sensitive values in output\")\n .action(listEnvCommand);\n\n envCommand\n .command(\"add\")\n .argument(\"<KEY=VALUE>\", \"Variable assignment, e.g. API_KEY=abc123\")\n .description(\"Add an environment variable to a server\")\n .requiredOption(\"--server <id>\", \"Server UUID\")\n .option(\n \"--env <environments>\",\n \"Comma-separated environments: production,preview,development (default: all)\"\n )\n .option(\n \"--sensitive\",\n \"Mark the variable as sensitive (value masked in UI)\"\n )\n .action(addEnvCommand);\n\n envCommand\n .command(\"update\")\n .argument(\"<var-id>\", \"Environment variable UUID\")\n .description(\"Update an existing environment variable\")\n .requiredOption(\"--server <id>\", \"Server UUID\")\n .option(\"--value <value>\", \"New value\")\n .option(\n \"--env <environments>\",\n \"New environments (comma-separated: production,preview,development)\"\n )\n .option(\"--sensitive\", \"Mark as sensitive\")\n .option(\"--no-sensitive\", \"Unmark as sensitive\")\n .action(updateEnvCommand);\n\n envCommand\n .command(\"remove\")\n .alias(\"rm\")\n .argument(\"<var-id>\", \"Environment variable UUID\")\n .description(\"Remove an environment variable from a server\")\n .requiredOption(\"--server <id>\", \"Server UUID\")\n .action(removeEnvCommand);\n\n return envCommand;\n}\n","import chalk from \"chalk\";\nimport { McpUseAPI } from \"../utils/api.js\";\nimport { isLoggedIn, readConfig, writeConfig } from \"../utils/config.js\";\nimport { handleCommandError } from \"../utils/errors.js\";\nimport { promptOrgSelection } from \"./auth.js\";\n\nasync function ensureLoggedIn(): Promise<boolean> {\n if (!(await isLoggedIn())) {\n console.log(chalk.yellow(\"⚠️ You are not logged in.\"));\n console.log(\n chalk.gray(\"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\")\n );\n return false;\n }\n return true;\n}\n\n/**\n * List all organizations the user belongs to\n */\nexport async function orgListCommand(): Promise<void> {\n try {\n if (!(await ensureLoggedIn())) return;\n\n const api = await McpUseAPI.create();\n const authInfo = await api.testAuth();\n const config = await readConfig();\n\n const orgs = authInfo.orgs ?? [];\n const activeId = config.orgId || authInfo.default_org_id;\n\n if (orgs.length === 0) {\n console.log(chalk.yellow(\"No organizations found.\"));\n return;\n }\n\n console.log(chalk.cyan.bold(\"🏢 Your organizations:\\n\"));\n\n for (const o of orgs) {\n const isActive = o.id === activeId;\n const marker = isActive ? chalk.green(\" ← active\") : \"\";\n const slug = o.slug ? chalk.gray(` (${o.slug})`) : \"\";\n const role = chalk.gray(` [${o.role}]`);\n const name = isActive ? chalk.cyan.bold(o.name) : chalk.white(o.name);\n console.log(` ${name}${slug}${role}${marker}`);\n }\n\n if (orgs.length > 1) {\n console.log(\n chalk.gray(\"\\nSwitch with \" + chalk.white(\"npx mcp-use org switch\"))\n );\n }\n } catch (error) {\n handleCommandError(error, \"Failed to list organizations\");\n }\n}\n\n/**\n * Switch the active organization\n */\nexport async function orgSwitchCommand(): Promise<void> {\n try {\n if (!(await ensureLoggedIn())) return;\n\n const api = await McpUseAPI.create();\n const authInfo = await api.testAuth();\n const config = await readConfig();\n const orgs = authInfo.orgs ?? [];\n\n if (orgs.length === 0) {\n console.log(chalk.yellow(\"No organizations found.\"));\n return;\n }\n\n if (orgs.length === 1) {\n const o = orgs[0];\n const slug = o.slug ? chalk.gray(` (${o.slug})`) : \"\";\n console.log(\n chalk.yellow(\n `You only have one organization: ${chalk.cyan(o.name)}${slug}`\n )\n );\n return;\n }\n\n const activeId = config.orgId || authInfo.default_org_id;\n const selected = await promptOrgSelection(orgs, activeId);\n\n if (!selected) {\n console.log(chalk.yellow(\"No organization selected.\"));\n return;\n }\n\n await writeConfig({\n ...config,\n orgId: selected.id,\n orgName: selected.name,\n orgSlug: selected.slug ?? undefined,\n });\n\n try {\n await api.setDefaultOrg(selected.id);\n } catch {\n // Non-fatal: the local config is what matters for CLI operations\n }\n\n const slug = selected.slug ? chalk.gray(` (${selected.slug})`) : \"\";\n console.log(\n chalk.green.bold(\"\\n✓ Switched to \") +\n chalk.cyan.bold(selected.name) +\n slug\n );\n } catch (error) {\n handleCommandError(error, \"Failed to switch organization\");\n }\n}\n\n/**\n * Show the currently active organization\n */\nexport async function orgCurrentCommand(): Promise<void> {\n try {\n if (!(await ensureLoggedIn())) return;\n\n const config = await readConfig();\n\n if (!config.orgId) {\n console.log(\n chalk.yellow(\n \"No organization selected. Run \" +\n chalk.white(\"npx mcp-use org switch\") +\n \" to pick one.\"\n )\n );\n return;\n }\n\n const slug = config.orgSlug ? chalk.gray(` (${config.orgSlug})`) : \"\";\n console.log(\n chalk.cyan.bold(\"🏢 Active organization: \") +\n chalk.white(config.orgName || config.orgId) +\n slug\n );\n } catch (error) {\n handleCommandError(error, \"Failed to get organization\");\n }\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { cpSync, existsSync, mkdtempSync, readdirSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { extract } from \"tar\";\n\nconst REPO_OWNER = \"mcp-use\";\nconst REPO_NAME = \"mcp-use\";\nconst REPO_BRANCH = \"main\";\n\nconst TELEMETRY_URL = \"https://add-skill.vercel.sh/t\";\nconst SOURCE_REPO = `${REPO_OWNER}/${REPO_NAME}`;\n\n// Telemetry data defined in https://github.com/vercel-labs/skills/blob/main/src/telemetry.ts\ninterface InstallTelemetryData {\n event: \"install\";\n source: string;\n skills: string;\n agents: string;\n global?: \"1\";\n skillFiles?: string;\n sourceType?: string;\n}\n\n/** Type-safe enum for IDE/agent presets */\ntype AgentPreset = \"cursor\" | \"claude-code\" | \"codex\";\n\nconst AGENT_PRESET_FOLDERS: Record<AgentPreset, string> = {\n cursor: \".cursor\",\n \"claude-code\": \".claude\",\n codex: \".agent\",\n};\n\nconst ALL_PRESETS: AgentPreset[] = [\"cursor\", \"claude-code\", \"codex\"];\n\n/**\n * Send telemetry event for vercel skills.sh.\n * Fire-and-forget -- never throws.\n */\nfunction sendInstallTelemetryEvent(agents: string, skills: string): void {\n const telemetryData: InstallTelemetryData = {\n event: \"install\",\n source: SOURCE_REPO,\n skills,\n agents,\n sourceType: \"github\",\n };\n try {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(telemetryData)) {\n if (value !== undefined && value !== null) {\n params.set(key, String(value));\n }\n }\n fetch(`${TELEMETRY_URL}?${params.toString()}`).catch(() => {});\n } catch {\n // Silently fail - telemetry should never break the CLI\n }\n}\n\n/**\n * Download and extract skills from the mcp-use GitHub repository\n * and install them into the project's agent preset directories\n * (.cursor/skills, .claude/skills, .agent/skills).\n */\nasync function addSkillsToProject(projectPath: string): Promise<void> {\n const tarballUrl = `https://codeload.github.com/${REPO_OWNER}/${REPO_NAME}/tar.gz/${REPO_BRANCH}`;\n const tempDir = mkdtempSync(join(tmpdir(), \"mcp-use-skills-\"));\n\n try {\n const response = await fetch(tarballUrl);\n if (!response.ok) {\n throw new Error(`Failed to download tarball: ${response.statusText}`);\n }\n\n await pipeline(\n Readable.fromWeb(response.body as any),\n extract({\n cwd: tempDir,\n filter: (path) => path.includes(\"/skills/\"),\n strip: 1,\n })\n );\n\n const skillsPath = join(tempDir, \"skills\");\n if (!existsSync(skillsPath)) {\n throw new Error(\"Skills folder not found in repository\");\n }\n\n for (const preset of ALL_PRESETS) {\n const folderName = AGENT_PRESET_FOLDERS[preset];\n const outputPath = join(projectPath, folderName, \"skills\");\n cpSync(skillsPath, outputPath, { recursive: true });\n }\n\n const skillNames = readdirSync(skillsPath, { withFileTypes: true })\n .filter((dirent) => dirent.isDirectory())\n .map((dirent) => dirent.name);\n\n sendInstallTelemetryEvent(ALL_PRESETS.join(\",\"), skillNames.join(\",\"));\n } finally {\n rmSync(tempDir, { recursive: true, force: true });\n }\n}\n\nexport function createSkillsCommand(): Command {\n const skills = new Command(\"skills\")\n .description(\"Manage mcp-use AI agent skills\")\n .showHelpAfterError(\n \"(Run `mcp-use skills --help` to see available commands)\"\n );\n\n const installAction = async (options: { path: string }) => {\n const projectPath = resolve(options.path);\n\n if (!existsSync(projectPath)) {\n console.error(chalk.red(`Directory not found: ${projectPath}`));\n process.exit(1);\n }\n\n console.log(chalk.cyan(\"📚 Installing mcp-use skills...\"));\n console.log(\n chalk.gray(\n \" Downloading from github.com/mcp-use/mcp-use → .cursor/skills, .claude/skills, .agent/skills\"\n )\n );\n\n try {\n await addSkillsToProject(projectPath);\n console.log(chalk.green(\"✅ Skills installed successfully!\"));\n } catch (error) {\n console.error(chalk.red(\"❌ Failed to install skills.\"));\n console.error(\n chalk.yellow(\n ` Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n console.error(\n chalk.yellow(\n \" You can also install manually: npx skills add mcp-use/mcp-use\"\n )\n );\n process.exit(1);\n }\n };\n\n const pathOption = [\n \"-p, --path <path>\",\n \"Path to project directory\",\n process.cwd(),\n ] as const;\n\n skills\n .command(\"add\")\n .description(\n \"Install mcp-use skills for AI agents (Cursor, Claude Code, Codex)\"\n )\n .option(...pathOption)\n .action(installAction);\n\n skills\n .command(\"install\")\n .description(\"Install mcp-use skills for AI agents (alias for 'add')\")\n .option(...pathOption)\n .action(installAction);\n\n return skills;\n}\n","/**\n * Next.js runtime-module shim wiring.\n *\n * When the CLI runs an MCP server that lives inside a Next.js app (the\n * `src/mcp/` drop-in layout), transitive imports from the user's tools\n * almost always pull in Next.js server-runtime modules:\n *\n * - `server-only` — throws on import outside an RSC\n * - `next/cache` — revalidatePath / unstable_cache\n * - `next/headers` — headers() / cookies()\n * - `next/navigation` — redirect() / notFound()\n * - `next/server` — NextResponse / NextRequest\n *\n * These are all meaningful only inside a Next.js request; outside of one\n * (i.e., in our MCP server process) they're either unusable or useless.\n * Rather than asking the developer to write shim files, the CLI detects\n * Next.js and installs an ESM loader hook that resolves these specifiers to\n * no-op / inert implementations.\n *\n * Detection: presence of `next` in the user's package.json dependencies or\n * devDependencies.\n *\n * Registration happens in two places:\n * 1. HMR dev mode — inline, via `module.register()` in the parent process\n * before `tsImport` is called.\n * 2. --no-hmr and build — via `NODE_OPTIONS=--import=<register.mjs>` on the\n * spawned tsx/esbuild process.\n */\n\nimport { existsSync, promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\n/**\n * Returns true when the project has `next` listed in package.json deps.\n *\n * Missing / unreadable package.json returns false silently — the shims are\n * strictly additive, so \"can't decide\" should mean \"don't shim\".\n */\nexport async function detectNextJsProject(\n projectPath: string\n): Promise<boolean> {\n try {\n const pkgPath = path.join(projectPath, \"package.json\");\n const content = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content);\n const deps = pkg.dependencies ?? {};\n const devDeps = pkg.devDependencies ?? {};\n return \"next\" in deps || \"next\" in devDeps;\n } catch {\n return false;\n }\n}\n\n/**\n * Load Next.js's environment-file cascade into `process.env`.\n *\n * Next.js's dev server reads env files in this priority order (highest\n * wins): `.env.development.local` → `.env.local` → `.env.development` →\n * `.env`. Tools imported from a Next.js app usually assume these variables\n * are populated, so the MCP CLI mirrors the same cascade when it runs\n * inside a Next.js project.\n *\n * The values we set here flow to the spawned tsx child through\n * `runCommand`'s `...process.env` merge.\n */\nexport async function loadNextJsEnvFiles(projectPath: string): Promise<void> {\n // Lowest priority first — later loads only fill in missing keys.\n const files = [\n \".env\",\n \".env.development\",\n \".env.local\",\n \".env.development.local\",\n ];\n\n // dotenv is already a dependency of the CLI.\n const dotenv = await import(\"dotenv\");\n for (const file of files) {\n const abs = path.join(projectPath, file);\n try {\n await fs.access(abs);\n } catch {\n continue;\n }\n // `override: true` because we process files in ascending priority order;\n // the more specific file should win over the less specific one.\n dotenv.config({ path: abs, override: true, quiet: true });\n }\n}\n\n/**\n * Dirname of this module at runtime, for both CJS and ESM builds.\n *\n * tsup emits a CJS build that defines `__dirname` natively, plus an ESM\n * build where we have to derive it. The `typeof` guard avoids a ReferenceError\n * when the CJS build is loaded, and the `import.meta.url` branch only\n * executes in the ESM build.\n */\nfunction getThisDir(): string {\n if (typeof __dirname === \"string\") return __dirname;\n const url: string = import.meta.url;\n return path.dirname(fileURLToPath(url));\n}\n\n/**\n * Resolve the absolute path to a shim file shipped with the CLI.\n *\n * Returns the first candidate that actually exists on disk. We search a few\n * locations to cover:\n * - tsup-built dist (`dist/shims/*.mjs` — copied via `publicDir`)\n * - running tests from the repo with TS source (`src/shims/*.mjs`)\n */\nfunction resolveShimPath(filename: string): string | undefined {\n const thisDir = getThisDir();\n const candidates = [\n // Production: `dist/` next to this module\n path.join(thisDir, \"shims\", filename),\n // Test / dev: one level up (e.g., from `dist/utils/` back to `src/shims/`)\n path.join(thisDir, \"..\", \"shims\", filename),\n path.join(thisDir, \"..\", \"..\", \"src\", \"shims\", filename),\n path.join(thisDir, \"..\", \"src\", \"shims\", filename),\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\n/** Absolute path to the `--import=<path>` ESM registration script. */\nfunction getShimRegisterPath(): string | undefined {\n return resolveShimPath(\"next-shims-register.mjs\");\n}\n\n/** Absolute path to the ESM loader module itself. */\nfunction getShimLoaderPath(): string | undefined {\n return resolveShimPath(\"next-shims-loader.mjs\");\n}\n\n/**\n * Absolute path to the CJS-side shim preload. Patches `Module._resolveFilename`\n * so CommonJS `require(\"server-only\")` etc. route to a no-op module instead of\n * throwing. tsx compiles TypeScript to CJS by default, so this covers the\n * path the ESM loader hook cannot reach.\n */\nfunction getShimCjsPreloadPath(): string | undefined {\n return resolveShimPath(\"next-shims-cjs.cjs\");\n}\n\n/**\n * Register the shim loader in the CURRENT Node.js process.\n *\n * Used by the HMR dev path, which imports the user's entry via\n * `tsx/esm/api.tsImport` in-process (no child process). We install both:\n *\n * - The ESM loader hook (handles `import ...` of shimmed specifiers)\n * - The CJS `Module._resolveFilename` patch (handles `require(...)`, which\n * tsx emits when transpiling TypeScript to CommonJS)\n *\n * Returns `true` if at least one half succeeded, `false` only when neither\n * shim file can be located (graceful degradation — dev still works, users\n * just see the raw Next.js error on `server-only` etc.).\n */\nexport async function registerNextShimsInProcess(): Promise<boolean> {\n let anyRegistered = false;\n\n // CJS side first — runs synchronously, patches Module._resolveFilename.\n const cjsPath = getShimCjsPreloadPath();\n if (cjsPath) {\n // createRequire handles .cjs loading from any module context.\n const { createRequire } = await import(\"node:module\");\n const req = createRequire(pathToFileURL(getThisDir() + path.sep).href);\n req(cjsPath);\n anyRegistered = true;\n }\n\n // ESM side — installs a loader hook via module.register.\n const loaderPath = getShimLoaderPath();\n if (loaderPath) {\n const { register } = await import(\"node:module\");\n const loaderUrl = pathToFileURL(loaderPath).href;\n register(loaderUrl, pathToFileURL(getThisDir() + path.sep).href);\n anyRegistered = true;\n }\n\n return anyRegistered;\n}\n\n/**\n * Build a child-process env that adds both the CJS preload (`-r ...`) and the\n * ESM registration (`--import=...`) to NODE_OPTIONS, preserving any value\n * the user already set.\n *\n * Both are needed because tsx loads user TypeScript as CJS by default (goes\n * through `Module._resolveFilename` — covered by `-r`) while some modules are\n * imported via ESM (covered by `--import=...`).\n *\n * If either shim file can't be found on disk, we degrade gracefully — the\n * dev loop still starts, we just don't shim that half.\n */\nexport function withNextShimsEnv(\n baseEnv: NodeJS.ProcessEnv\n): NodeJS.ProcessEnv {\n const additions: string[] = [];\n\n const cjsPath = getShimCjsPreloadPath();\n if (cjsPath) additions.push(`-r ${quoteNodeOption(cjsPath)}`);\n\n const registerPath = getShimRegisterPath();\n if (registerPath)\n additions.push(`--import=${pathToFileURL(registerPath).href}`);\n\n if (additions.length === 0) return baseEnv;\n\n const existing = baseEnv.NODE_OPTIONS ?? \"\";\n const prepended = additions.join(\" \");\n return {\n ...baseEnv,\n NODE_OPTIONS: existing ? `${prepended} ${existing}` : prepended,\n };\n}\n\n/**\n * Quote a path for use inside NODE_OPTIONS. Paths containing spaces need\n * surrounding double quotes; Node's NODE_OPTIONS parser understands them.\n * This is a minimal implementation — we never see quotes in resolved shim\n * paths, so escaping inner quotes isn't worth the complexity.\n */\nfunction quoteNodeOption(value: string): string {\n return /\\s/.test(value) ? `\"${value}\"` : value;\n}\n","import chalk from \"chalk\";\nimport { readFileSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst CACHE_DIR = path.join(os.homedir(), \".mcp-use\");\nconst CACHE_FILE = path.join(CACHE_DIR, \"update-check.json\");\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst FETCH_TIMEOUT_MS = 3000;\nconst PACKAGE_NAME = \"mcp-use\";\n\ninterface UpdateCache {\n lastChecked: string;\n latestVersion: string;\n}\n\n/**\n * Parse a semver string into numeric parts for comparison.\n * Returns null for any string that doesn't look like X.Y.Z.\n */\nfunction parseSemver(version: string): [number, number, number] | null {\n const match = version.match(/^(\\d+)\\.(\\d+)\\.(\\d+)/);\n if (!match) return null;\n return [\n parseInt(match[1], 10),\n parseInt(match[2], 10),\n parseInt(match[3], 10),\n ];\n}\n\n/** Returns true when `candidate` is strictly newer than `current`. */\nfunction isNewer(current: string, candidate: string): boolean {\n const a = parseSemver(current);\n const b = parseSemver(candidate);\n if (!a || !b) return false;\n for (let i = 0; i < 3; i++) {\n if (b[i] > a[i]) return true;\n if (b[i] < a[i]) return false;\n }\n return false;\n}\n\nasync function readCache(): Promise<UpdateCache | null> {\n try {\n const content = await readFile(CACHE_FILE, \"utf-8\");\n return JSON.parse(content) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nasync function writeCache(latestVersion: string): Promise<void> {\n try {\n await mkdir(CACHE_DIR, { recursive: true });\n const cache: UpdateCache = {\n lastChecked: new Date().toISOString(),\n latestVersion,\n };\n await writeFile(CACHE_FILE, JSON.stringify(cache, null, 2), \"utf-8\");\n } catch {\n // Non-fatal — ignore write errors\n }\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(\n `https://registry.npmjs.org/${PACKAGE_NAME}/latest`,\n {\n signal: controller.signal,\n headers: { Accept: \"application/json\" },\n }\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } finally {\n clearTimeout(timer);\n }\n } catch {\n return null;\n }\n}\n\nasync function getLatestVersion(): Promise<string | null> {\n const cache = await readCache();\n if (cache) {\n const age = Date.now() - new Date(cache.lastChecked).getTime();\n if (age < CACHE_TTL_MS) {\n return cache.latestVersion;\n }\n }\n const latest = await fetchLatestVersion();\n if (latest) {\n await writeCache(latest);\n }\n return latest;\n}\n\n/**\n * Resolve the version of `mcp-use` installed in the user's project.\n * Falls back to the CLI's own bundled copy for monorepo / global installs.\n */\nfunction resolveInstalledVersion(\n projectPath: string | undefined\n): string | null {\n const attempts: (() => string)[] = [];\n\n if (projectPath) {\n attempts.push(() => {\n const projectRequire = createRequire(\n path.join(projectPath, \"package.json\")\n );\n return projectRequire.resolve(`${PACKAGE_NAME}/package.json`);\n });\n }\n\n // Monorepo / global fallback: bundled alongside the CLI\n attempts.push(() => path.join(__dirname, \"../../mcp-use/package.json\"));\n\n for (const attempt of attempts) {\n try {\n const pkgPath = attempt();\n const json = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n if (typeof json.version === \"string\") return json.version as string;\n } catch {\n // Try next\n }\n }\n return null;\n}\n\n/**\n * Check npm for a newer version of `mcp-use` and print a notification when\n * one is available. Runs silently on any error so it never interrupts the CLI.\n */\nexport async function notifyIfUpdateAvailable(\n projectPath: string | undefined\n): Promise<void> {\n try {\n const installed = resolveInstalledVersion(projectPath);\n if (!installed) return;\n\n const latest = await getLatestVersion();\n if (!latest) return;\n\n if (isNewer(installed, latest)) {\n console.log(\n chalk.yellow(\n `\\nA new release of ${chalk.bold(PACKAGE_NAME)} is available: ` +\n `${chalk.dim(installed)} → ${chalk.cyan.bold(latest)}`\n )\n );\n console.log(\n chalk.gray(\n `Run ${chalk.white(`npm install ${PACKAGE_NAME}@latest`)} to update\\n`\n )\n );\n }\n } catch {\n // Never surface errors from the update check\n }\n}\n"],"mappings":"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","names":["argv","process","os","tty","styles","chalk","styles","open","import_commander","import_config","import_node_child_process","import_node_fs","import_promises","import_node_module","import_node_path","import_node_url","import_node_process","import_node_child_process","import_promises","import_node_util","import_node_child_process","import_promises","import_node_process","import_node_os","import_node_fs","import_node_fs","fs","fs","process","os","fs","import_node_process","childProcess","process","execFile","childProcess","fs","fsConstants","powerShellPath","path","import_node_util","import_node_process","import_node_child_process","import_node_util","import_node_process","import_node_child_process","process","import_node_process","import_node_util","import_node_child_process","execFileAsync","process","import_node_util","import_node_child_process","execFileAsync","execFileAsync","defaultBrowser","process","import_node_process","process","__dirname","path","process","apps","defaultBrowser","powerShellPath","fs","fsConstants","childProcess","resolve","import_node_fs","import_node_os","import_node_path","path","os","fs","auth","path","resolve","api","authInfo","import_commander","import_client","import_node_readline","resolve","import_node_os","import_node_path","import_promises","import_node_fs","import_client","import_node_child_process","import_node_fs","import_promises","import_node_path","import_node_child_process","import_node_fs","import_node_os","import_node_path","resolve","path","os","WebSocket","import_node_fs","import_node_path","path","path","resolve","tty","prompt","result","import_node_fs","import_node_path","import_node_child_process","import_node_util","execFileAsync","import_node_fs","import_node_path","path","fs","fs","path","resolve","projectName","import_commander","prompt","resolve","import_commander","import_commander","env","prompt","resolve","getStatusColor","slug","import_commander","import_node_fs","import_node_os","import_node_path","import_promises","path","import_node_fs","import_node_path","import_node_url","path","fs","createRequire","import_node_fs","import_promises","import_node_os","import_node_path","path","os","path","resolve","env","fs","createServer","createRequire","cleanup","fileURLToPath","manifestPath","rest"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.9_tsx@4.21.0_typescript@5.9.3_yaml@2.8.3/node_modules/tsup/assets/cjs_shims.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/utilities.js","../../../node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/index.js","../src/index.ts","../../../node_modules/.pnpm/open@11.0.0/node_modules/open/index.js","../../../node_modules/.pnpm/wsl-utils@0.3.1/node_modules/wsl-utils/index.js","../../../node_modules/.pnpm/is-wsl@3.1.0/node_modules/is-wsl/index.js","../../../node_modules/.pnpm/is-inside-container@1.0.0/node_modules/is-inside-container/index.js","../../../node_modules/.pnpm/is-docker@3.0.0/node_modules/is-docker/index.js","../../../node_modules/.pnpm/powershell-utils@0.1.0/node_modules/powershell-utils/index.js","../../../node_modules/.pnpm/wsl-utils@0.3.1/node_modules/wsl-utils/utilities.js","../../../node_modules/.pnpm/define-lazy-prop@3.0.0/node_modules/define-lazy-prop/index.js","../../../node_modules/.pnpm/default-browser@5.5.0/node_modules/default-browser/index.js","../../../node_modules/.pnpm/default-browser-id@5.0.1/node_modules/default-browser-id/index.js","../../../node_modules/.pnpm/run-applescript@7.1.0/node_modules/run-applescript/index.js","../../../node_modules/.pnpm/bundle-name@4.1.0/node_modules/bundle-name/index.js","../../../node_modules/.pnpm/default-browser@5.5.0/node_modules/default-browser/windows.js","../../../node_modules/.pnpm/is-in-ssh@1.0.0/node_modules/is-in-ssh/index.js","../src/utils/config.ts","../src/utils/api.ts","../src/utils/errors.ts","../src/commands/auth.ts","../src/commands/client.ts","../src/utils/format.ts","../src/utils/parse-args.ts","../src/utils/oauth.ts","../src/utils/session-storage.ts","../src/utils/session.ts","../src/commands/client-auth.ts","../src/commands/screenshot.ts","../src/utils/cdp-screenshot.ts","../src/utils/chrome-path.ts","../src/commands/deploy.ts","../src/utils/git.ts","../src/utils/cloud-urls.ts","../src/utils/project-link.ts","../src/commands/deployments.ts","../src/commands/servers.ts","../src/commands/env.ts","../src/commands/org.ts","../src/commands/skills.ts","../src/utils/next-shims.ts","../src/utils/update-check.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","#!/usr/bin/env node\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport \"dotenv/config\";\nimport { spawn } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport open from \"open\";\nimport { viteSingleFile } from \"vite-plugin-singlefile\";\nimport { toJSONSchema } from \"zod\";\nimport { loginCommand, logoutCommand, whoamiCommand } from \"./commands/auth.js\";\nimport {\n PER_CLIENT_SCOPES,\n RESERVED_CLIENT_SUBCOMMANDS,\n createClientCommand,\n createPerClientCommand,\n} from \"./commands/client.js\";\nimport { getSession } from \"./utils/session-storage.js\";\nimport { formatError } from \"./utils/format.js\";\nimport { deployCommand } from \"./commands/deploy.js\";\nimport { createDeploymentsCommand } from \"./commands/deployments.js\";\nimport { createServersCommand } from \"./commands/servers.js\";\nimport {\n orgCurrentCommand,\n orgListCommand,\n orgSwitchCommand,\n} from \"./commands/org.js\";\nimport { createSkillsCommand } from \"./commands/skills.js\";\nimport {\n detectNextJsProject,\n loadNextJsEnvFiles,\n registerNextShimsInProcess,\n withNextShimsEnv,\n} from \"./utils/next-shims.js\";\nimport { notifyIfUpdateAvailable } from \"./utils/update-check.js\";\nconst program = new Command();\n\nconst packageContent = readFileSync(\n path.join(__dirname, \"../package.json\"),\n \"utf-8\"\n);\nconst packageJson = JSON.parse(packageContent);\nconst packageVersion = packageJson.version || \"unknown\";\n\nprogram\n .name(\"mcp-use\")\n .description(\"Create and run MCP servers with ui resources widgets\")\n .version(packageVersion)\n .showHelpAfterError(\"(Run `mcp-use --help` to see available commands)\");\n\n/**\n * Helper to display all package versions\n *\n * @param projectPath - Optional path to user's project directory.\n * When provided, resolves packages from the project's node_modules (standalone installation).\n * When omitted, falls back to relative paths (monorepo development).\n */\nfunction displayPackageVersions(projectPath?: string) {\n const packages = [\n { name: \"@mcp-use/cli\", relativePath: \"../package.json\" },\n {\n name: \"@mcp-use/inspector\",\n relativePath: \"../../inspector/package.json\",\n },\n {\n name: \"create-mcp-use-app\",\n relativePath: \"../../create-mcp-use-app/package.json\",\n },\n {\n name: \"mcp-use\",\n relativePath: \"../../mcp-use/package.json\",\n highlight: true,\n },\n ];\n\n console.log(chalk.gray(\"mcp-use packages:\"));\n\n for (const pkg of packages) {\n const paddedName = pkg.name.padEnd(22);\n\n try {\n let pkgPath: string;\n\n if (projectPath) {\n // Standalone installation: Try to resolve from user's project node_modules\n try {\n const projectRequire = createRequire(\n path.join(projectPath, \"package.json\")\n );\n pkgPath = projectRequire.resolve(`${pkg.name}/package.json`);\n } catch (resolveError) {\n // Package not found in project node_modules, try relative path as fallback\n pkgPath = path.join(__dirname, pkg.relativePath);\n }\n } else {\n // Monorepo development: Use relative paths\n pkgPath = path.join(__dirname, pkg.relativePath);\n }\n\n const pkgContent = readFileSync(pkgPath, \"utf-8\");\n const pkgJson = JSON.parse(pkgContent);\n const version = pkgJson.version || \"unknown\";\n\n if (pkg.highlight) {\n console.log(\n ` ${chalk.cyan.bold(paddedName)} ${chalk.cyan.bold(`v${version}`)}`\n );\n } else {\n console.log(chalk.gray(` ${paddedName} v${version}`));\n }\n } catch (error) {\n // Log debug message when package is not found (aids troubleshooting)\n if (process.env.DEBUG || process.env.VERBOSE) {\n console.log(chalk.dim(` ${paddedName} (not found)`));\n }\n }\n }\n}\n\n// Helper to check if port is available\nasync function isPortAvailable(\n port: number,\n host: string = \"localhost\"\n): Promise<boolean> {\n try {\n await fetch(`http://${host}:${port}`);\n return false; // Port is in use\n } catch {\n return true; // Port is available\n }\n}\n\n// Helper to find an available port\nasync function findAvailablePort(\n startPort: number,\n host: string = \"localhost\"\n): Promise<number> {\n for (let port = startPort; port < startPort + 100; port++) {\n if (await isPortAvailable(port, host)) {\n return port;\n }\n }\n throw new Error(\"No available ports found\");\n}\n\n// Helper to check if server is ready\nasync function waitForServer(\n port: number,\n host: string = \"localhost\",\n maxAttempts = 30\n): Promise<boolean> {\n for (let i = 0; i < maxAttempts; i++) {\n const controller = new AbortController();\n try {\n // Use /inspector/health endpoint for cleaner health checks\n // This avoids 400 errors from the MCP endpoint which requires session headers\n const response = await fetch(`http://${host}:${port}/inspector/health`, {\n signal: controller.signal,\n });\n\n if (response.ok) {\n return true;\n }\n } catch {\n // Server not ready yet\n } finally {\n controller.abort();\n }\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n return false;\n}\n\n// Helper to normalize host for browser connections\n// 0.0.0.0 is valid for server binding but browsers cannot connect to it\nfunction normalizeBrowserHost(host: string): string {\n return host === \"0.0.0.0\" ? \"localhost\" : host;\n}\n\n// Helper to run a command\nfunction runCommand(\n command: string,\n args: string[],\n cwd: string,\n env?: NodeJS.ProcessEnv,\n filterStderr: boolean = false\n): { promise: Promise<void>; process: any } {\n const proc = spawn(command, args, {\n cwd,\n stdio: filterStderr ? ([\"inherit\", \"inherit\", \"pipe\"] as const) : \"inherit\",\n shell: process.platform === \"win32\",\n env: env ? { ...process.env, ...env } : process.env,\n });\n\n // Filter stderr to suppress tsx's \"Force killing\" messages\n if (filterStderr && proc.stderr) {\n proc.stderr.on(\"data\", (data: Buffer) => {\n const text = data.toString();\n // Filter out tsx's force killing message\n if (\n !text.includes(\"Previous process hasn't exited yet\") &&\n !text.includes(\"Force killing\")\n ) {\n process.stderr.write(data);\n }\n });\n }\n\n const promise = new Promise<void>((resolve, reject) => {\n proc.on(\"error\", reject);\n proc.on(\"exit\", (code: number | null) => {\n if (code === 0 || code === 130 || code === 143) {\n // Exit codes: 0 = normal, 130 = SIGINT/SIGTERM, 143 = SIGTERM (alternative)\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n });\n\n return { promise, process: proc };\n}\n\n// Helper to start tunnel and get the URL\nasync function startTunnel(\n port: number,\n subdomain?: string\n): Promise<{ url: string; subdomain: string; process: any }> {\n return new Promise((resolve, reject) => {\n console.log(chalk.gray(`Starting tunnel for port ${port}...`));\n\n const tunnelArgs = [\"--yes\", \"@mcp-use/tunnel\", String(port)];\n\n // Pass subdomain as CLI flag if provided\n if (subdomain) {\n tunnelArgs.push(\"--subdomain\", subdomain);\n }\n\n const proc = spawn(\"npx\", tunnelArgs, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: process.platform === \"win32\",\n });\n\n let resolved = false;\n let isShuttingDown = false;\n\n proc.stdout?.on(\"data\", (data) => {\n const text = data.toString();\n const isShutdownMessage =\n text.includes(\"Shutting down\") || text.includes(\"🛑\");\n const isErrorMessage = text.includes(\"✖\") || text.includes(\"Error:\");\n\n if (!isShuttingDown && !isShutdownMessage && !isErrorMessage) {\n process.stdout.write(text);\n }\n\n // Look for the tunnel URL in the output\n // Expected format: https://subdomain.tunnel-domain.com\n const urlMatch = text.match(/https?:\\/\\/([a-z0-9-]+\\.[a-z0-9.-]+)/i);\n if (urlMatch && !resolved) {\n const url = urlMatch[0];\n // Extract subdomain from URL (e.g., \"happy-cat.local.mcp-use.run\" -> \"happy-cat\")\n const fullDomain = urlMatch[1];\n // Try to extract the subdomain using a case-insensitive regex.\n // If the regex fails, fallback to splitting by '.' and taking the first label.\n // Validate that the extracted subdomain matches the expected format (letters, numbers, hyphens).\n const subdomainMatch = fullDomain.match(/^([a-z0-9-]+)\\./i);\n let extractedSubdomain = subdomainMatch\n ? subdomainMatch[1]\n : fullDomain.split(\".\")[0];\n if (!/^[a-z0-9-]+$/i.test(extractedSubdomain)) {\n console.warn(\n chalk.yellow(\n `Warning: Extracted subdomain \"${extractedSubdomain}\" does not match expected format.`\n )\n );\n extractedSubdomain = \"\";\n }\n resolved = true;\n clearTimeout(setupTimeout);\n console.log(chalk.green.bold(`✓ Tunnel established: ${url}/mcp`));\n resolve({ url, subdomain: extractedSubdomain, process: proc });\n }\n });\n\n proc.stderr?.on(\"data\", (data) => {\n const text = data.toString();\n // Filter out bore debug logs and shutdown messages\n if (\n !isShuttingDown &&\n !text.includes(\"INFO\") &&\n !text.includes(\"bore_cli\") &&\n !text.includes(\"Shutting down\")\n ) {\n process.stderr.write(data);\n }\n });\n\n proc.on(\"error\", (error) => {\n if (!resolved) {\n clearTimeout(setupTimeout);\n reject(new Error(`Failed to start tunnel: ${error.message}`));\n }\n });\n\n proc.on(\"exit\", (code) => {\n if (code !== 0 && !resolved) {\n clearTimeout(setupTimeout);\n reject(new Error(`Tunnel process exited with code ${code}`));\n }\n });\n\n // Add method to mark shutdown state\n (proc as any).markShutdown = () => {\n isShuttingDown = true;\n };\n\n // Timeout after 30 seconds - only for initial setup\n const setupTimeout = setTimeout(() => {\n if (!resolved) {\n proc.kill();\n reject(new Error(\"Tunnel setup timed out\"));\n }\n }, 30000);\n });\n}\n\n/**\n * Resolve the entry file for an MCP server.\n * Priority: --entry flag > <mcpDir>/{index,server}.{ts,tsx} > top-level defaults.\n */\nasync function resolveEntryFile(\n projectPath: string,\n cliEntry?: string,\n mcpDir?: string\n): Promise<string> {\n if (cliEntry) {\n await access(path.join(projectPath, cliEntry)).catch(() => {\n throw new Error(`File not found: ${cliEntry}`);\n });\n return cliEntry;\n }\n\n if (mcpDir) {\n const mcpCandidates = [\n path.join(mcpDir, \"index.ts\"),\n path.join(mcpDir, \"index.tsx\"),\n path.join(mcpDir, \"server.ts\"),\n path.join(mcpDir, \"server.tsx\"),\n ];\n for (const candidate of mcpCandidates) {\n try {\n await access(path.join(projectPath, candidate));\n return candidate;\n } catch {\n continue;\n }\n }\n throw new Error(\n `No entry file found inside ${mcpDir}.\\n\\n` +\n `Expected one of: ${mcpCandidates.map((c) => path.relative(projectPath, path.join(projectPath, c))).join(\", \")}\\n\\n` +\n `Fix this by either:\\n` +\n ` 1. Creating ${path.join(mcpDir, \"index.ts\")}, or\\n` +\n ` 2. Passing --entry <file> on the command line`\n );\n }\n\n const candidates = [\"index.ts\", \"src/index.ts\", \"server.ts\", \"src/server.ts\"];\n for (const candidate of candidates) {\n try {\n await access(path.join(projectPath, candidate));\n return candidate;\n } catch {\n continue;\n }\n }\n\n throw new Error(\n `No entry file found.\\n\\n` +\n `Expected one of: ${candidates.join(\", \")}\\n\\n` +\n `Fix this by either:\\n` +\n ` 1. Creating one of the default entry files above, or\\n` +\n ` 2. Passing --entry <file> or --mcp-dir <dir> on the command line`\n );\n}\n\n/**\n * Resolve the widgets directory.\n * Priority: --widgets-dir flag > <mcpDir>/resources > \"resources\".\n */\nfunction resolveWidgetsDir(cliWidgetsDir?: string, mcpDir?: string): string {\n if (cliWidgetsDir) return cliWidgetsDir;\n if (mcpDir) return path.join(mcpDir, \"resources\");\n return \"resources\";\n}\n\n/**\n * Vite plugin that fails the widget build with a clear, actionable error when\n * a widget transitively imports a Next.js server-runtime module.\n *\n * The MCP server process silently shims these specifiers (see\n * src/shims/next-shims-*) because server-side code is supposed to work\n * there. Widgets run in a browser iframe, so the same import is almost\n * always a mistake — fetch server data through a tool call instead.\n *\n * Keep the rejection list aligned with src/shims/next-shims-registry.json;\n * we duplicate the array here (rather than reading the JSON) so this file\n * stays import-free for the source-mode tests that load it via tsx.\n */\nfunction makeWidgetServerOnlyGuard(widgetName: string) {\n const rejected = new Set([\n \"server-only\",\n \"client-only\",\n \"next/cache\",\n \"next/headers\",\n \"next/navigation\",\n \"next/server\",\n ]);\n return {\n name: \"mcp-use-widget-server-only-guard\",\n enforce: \"pre\" as const,\n resolveId(id: string, importer: string | undefined) {\n if (!rejected.has(id)) return null;\n const from = importer ? ` (imported from ${importer})` : \"\";\n throw new Error(\n `Widget \"${widgetName}\" imports \"${id}\"${from}, which is a Next.js ` +\n `server-only module. Widgets run in a browser iframe and cannot ` +\n `use server APIs.\\n\\n` +\n `To fix:\\n` +\n ` • Remove the import from the widget (or from any module the ` +\n `widget transitively imports)\\n` +\n ` • If the widget needs data from ${id}, read it inside an MCP ` +\n `tool in your server and pass the result through the widget's ` +\n `props`\n );\n },\n };\n}\n\nasync function findServerFile(\n projectPath: string,\n cliEntry?: string,\n cliMcpDir?: string\n): Promise<string> {\n return resolveEntryFile(projectPath, cliEntry, cliMcpDir);\n}\n\nfunction isBunRuntime(): boolean {\n return (\n typeof (globalThis as any).Bun !== \"undefined\" ||\n typeof (process.versions as any).bun === \"string\"\n );\n}\n\nasync function generateToolRegistryTypesForServer(\n projectPath: string,\n serverFileRelative: string\n): Promise<\"ok\" | \"failed\" | \"skipped\"> {\n const serverFile = path.join(projectPath, serverFileRelative);\n const serverFileExists = await access(serverFile)\n .then(() => true)\n .catch(() => false);\n\n if (!serverFileExists) {\n throw new Error(`Server file not found: ${serverFile}`);\n }\n\n // `tsx/esm/api` uses Node's custom loader hooks, which bun doesn't\n // implement. Under bun we can't generate the registry types at build\n // time; skip with a clear note so the build continues.\n if (isBunRuntime()) {\n console.log(\n chalk.yellow(\n \"⚠ Skipping tool registry type generation under bun runtime (requires Node.js loader hooks).\"\n )\n );\n console.log(\n chalk.gray(\n \" Run `mcp-use generate-types` with node to refresh .mcp-use/tool-registry.d.ts.\"\n )\n );\n return \"skipped\";\n }\n\n const previousHmrMode = (globalThis as any).__mcpUseHmrMode;\n\n try {\n // Prevent server startup side effects while importing registrations.\n (globalThis as any).__mcpUseHmrMode = true;\n (globalThis as any).__mcpUseLastServer = undefined;\n\n // Detect Next.js projects and install the server-runtime shim loaders\n // BEFORE tsx registers — otherwise transitive imports of `server-only`,\n // `next/cache`, etc. from the user entry throw during module evaluation.\n if (await detectNextJsProject(projectPath)) {\n await loadNextJsEnvFiles(projectPath);\n await registerNextShimsInProcess();\n }\n\n // Register tsx's loader hooks namespace-less + globally. We deliberately\n // do NOT use `tsImport` here: tsImport wraps tsx in a generated\n // namespace, and tsx's resolver bails via `return nextResolve(...)` for\n // any specifier whose parent URL doesn't carry that namespace — which\n // means transitive `@/lib/...` imports from the user entry never reach\n // tsx's tsconfig-paths resolver and fail with\n // `Cannot find package '@/lib'`. Namespace-less registration makes\n // tsx's resolver run uniformly on every specifier.\n //\n // Paired with tsx/cjs/api.register() because tsx compiles `.ts` to CJS\n // by default in non-`\"type\": \"module\"` packages (i.e. every Next.js\n // app), and the resulting `require()` chain needs the same tsconfig-\n // paths treatment applied on the CJS side.\n const projectTsconfigPath = path.join(projectPath, \"tsconfig.json\");\n const hasTsconfig = await access(projectTsconfigPath)\n .then(() => true)\n .catch(() => false);\n if (hasTsconfig) {\n process.env.TSX_TSCONFIG_PATH = projectTsconfigPath;\n }\n const previousCwd = process.cwd();\n if (previousCwd !== projectPath) process.chdir(projectPath);\n\n try {\n const projectRequire = createRequire(\n path.join(projectPath, \"package.json\")\n );\n\n // ESM side\n const tsxEsmApiPath = projectRequire.resolve(\"tsx/esm/api\");\n const tsxEsmApi = await import(pathToFileURL(tsxEsmApiPath).href);\n if (typeof tsxEsmApi.register === \"function\") {\n tsxEsmApi.register({\n tsconfig: hasTsconfig ? projectTsconfigPath : undefined,\n });\n }\n\n // CJS side (optional — tsx 4.x ships both entry points)\n try {\n const tsxCjsApiPath = projectRequire.resolve(\"tsx/cjs/api\");\n const tsxCjsApi = await import(pathToFileURL(tsxCjsApiPath).href);\n if (typeof tsxCjsApi.register === \"function\") {\n tsxCjsApi.register();\n }\n } catch {\n // tsx/cjs unavailable on this tsx version — ESM-only mode is fine\n // for projects that compile to ESM.\n }\n\n // Native dynamic import with a cache-buster. With tsx registered\n // globally and without a namespace, the whole dependency tree (user\n // entry + transitive `@/lib/...` imports + `mcp-use/server`) resolves\n // through tsx's tsconfig-aware resolver.\n await import(`${pathToFileURL(serverFile).href}?t=${Date.now()}`);\n } finally {\n if (process.cwd() !== previousCwd) process.chdir(previousCwd);\n }\n\n const server = (globalThis as any).__mcpUseLastServer;\n if (!server) {\n throw new Error(\n \"No MCPServer instance found. Make sure your server file creates an MCPServer instance.\"\n );\n }\n\n const mcpUsePath = path.join(projectPath, \"node_modules\", \"mcp-use\");\n const { generateToolRegistryTypes } = await import(\n pathToFileURL(path.join(mcpUsePath, \"dist\", \"src\", \"server\", \"index.js\"))\n .href\n ).then((mod) => mod);\n\n if (!generateToolRegistryTypes) {\n throw new Error(\"generateToolRegistryTypes not found in mcp-use package\");\n }\n\n const success = await generateToolRegistryTypes(\n server.registrations.tools,\n projectPath\n );\n return success ? \"ok\" : \"failed\";\n } finally {\n (globalThis as any).__mcpUseHmrMode = previousHmrMode ?? false;\n }\n}\n\nasync function buildWidgets(\n projectPath: string,\n options: {\n inline?: boolean;\n widgetsDir?: string;\n } = {}\n): Promise<Array<{ name: string; metadata: any }>> {\n const { inline = true } = options; // Default to true for VS Code compatibility\n const { promises: fs } = await import(\"node:fs\");\n const { build } = await import(\"vite\");\n\n // Resolve the widgets directory. Callers pass a relative path via\n // `widgetsDir` (from config / --widgets-dir / --mcp-dir); default is \"resources\".\n const widgetsDirRelative = options.widgetsDir ?? \"resources\";\n const resourcesDir = path.resolve(projectPath, widgetsDirRelative);\n\n // Get base URL from environment or use default\n const mcpUrl = process.env.MCP_URL;\n\n // Check if resources directory exists\n try {\n await access(resourcesDir);\n } catch {\n console.log(\n chalk.gray(\n `No ${widgetsDirRelative}/ directory found - skipping widget build`\n )\n );\n return [];\n }\n\n // Find all TSX widget files and folders with widget.tsx\n const entries: Array<{ name: string; path: string }> = [];\n try {\n const files = await fs.readdir(resourcesDir, { withFileTypes: true });\n for (const dirent of files) {\n // Exclude macOS resource fork files and other hidden/system files\n if (dirent.name.startsWith(\"._\") || dirent.name.startsWith(\".DS_Store\")) {\n continue;\n }\n\n if (\n dirent.isFile() &&\n (dirent.name.endsWith(\".tsx\") || dirent.name.endsWith(\".ts\"))\n ) {\n // Single file widget\n entries.push({\n name: dirent.name.replace(/\\.tsx?$/, \"\"),\n path: path.join(resourcesDir, dirent.name),\n });\n } else if (dirent.isDirectory()) {\n // Check for widget.tsx in folder\n const widgetPath = path.join(resourcesDir, dirent.name, \"widget.tsx\");\n try {\n await fs.access(widgetPath);\n entries.push({\n name: dirent.name,\n path: widgetPath,\n });\n } catch {\n // widget.tsx doesn't exist in this folder, skip it\n }\n }\n }\n } catch (error) {\n console.log(\n chalk.gray(`No widgets found in ${widgetsDirRelative}/ directory`)\n );\n return [];\n }\n\n if (entries.length === 0) {\n console.log(\n chalk.gray(`No widgets found in ${widgetsDirRelative}/ directory`)\n );\n return [];\n }\n\n console.log(\n chalk.gray(\n `Building ${entries.length} widget(s)${inline ? \" (inline mode for VS Code compatibility)\" : \"\"}...`\n )\n );\n\n const react = (await import(\"@vitejs/plugin-react\")).default;\n // @ts-ignore - @tailwindcss/vite may not have type declarations\n const tailwindcss = (await import(\"@tailwindcss/vite\")).default;\n\n // Check whether the project has a tsconfig.json. When present, we enable\n // Vite's native `resolve.tsconfigPaths` so widgets that `import '@/components/...'`\n // resolve through the project's own path aliases (e.g. a Next.js app where\n // `@/*` → `src/*`). When absent, we fall back to a hardcoded `@` → resourcesDir\n // alias below.\n const projectTsconfigPath = path.join(projectPath, \"tsconfig.json\");\n let hasProjectTsconfig = false;\n try {\n await access(projectTsconfigPath);\n hasProjectTsconfig = true;\n } catch {\n // No tsconfig — fall back to the legacy \"@\" → resourcesDir alias\n }\n\n // Read favicon config from package.json\n const packageJsonPath = path.join(projectPath, \"package.json\");\n let favicon = \"\";\n try {\n const pkgContent = await fs.readFile(packageJsonPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n favicon = pkg.mcpUse?.favicon || \"\";\n } catch {\n // No package.json or no mcpUse config, that's fine\n }\n\n // Helper function to build a single widget\n const buildSingleWidget = async (entry: { name: string; path: string }) => {\n const widgetName = entry.name;\n const entryPath = entry.path.replace(/\\\\/g, \"/\");\n\n console.log(chalk.gray(` - Building ${widgetName}...`));\n\n // Create temp directory for build artifacts\n const tempDir = path.join(projectPath, \".mcp-use\", widgetName);\n await fs.mkdir(tempDir, { recursive: true });\n\n // Create CSS file with Tailwind directives\n const relativeResourcesPath = path\n .relative(tempDir, resourcesDir)\n .replace(/\\\\/g, \"/\");\n\n // Calculate relative path to mcp-use package dynamically\n const mcpUsePath = path.join(projectPath, \"node_modules\", \"mcp-use\");\n const relativeMcpUsePath = path\n .relative(tempDir, mcpUsePath)\n .replace(/\\\\/g, \"/\");\n\n // When the project has a `src/` tree (typical for Next.js apps), tell\n // Tailwind to scan it too — otherwise classes used inside shared\n // components imported via `@/components/...` would be missing from the\n // widget bundle.\n const projectSrcDir = path.join(projectPath, \"src\");\n let projectSrcSourceLine = \"\";\n try {\n await access(projectSrcDir);\n const relativeProjectSrcPath = path\n .relative(tempDir, projectSrcDir)\n .replace(/\\\\/g, \"/\");\n projectSrcSourceLine = `@source \"${relativeProjectSrcPath}\";\\n`;\n } catch {\n // No src/ directory at the project root, skip\n }\n\n const cssContent = `@import \"tailwindcss\";\\n\\n/* Configure Tailwind to scan the resources directory and mcp-use package */\\n@source \"${relativeResourcesPath}\";\\n@source \"${relativeMcpUsePath}/**/*.{ts,tsx,js,jsx}\";\\n${projectSrcSourceLine}`;\n await fs.writeFile(path.join(tempDir, \"styles.css\"), cssContent, \"utf8\");\n\n // Create entry file\n const entryContent = `import React from 'react'\nimport { createRoot } from 'react-dom/client'\nimport './styles.css'\nimport Component from '${entryPath}'\n\nconst container = document.getElementById('widget-root')\nif (container && Component) {\n const root = createRoot(container)\n root.render(<Component />)\n}\n`;\n\n // Create HTML template\n const htmlContent = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n <title>${widgetName} Widget</title>${\n favicon\n ? `\n <link rel=\"icon\" href=\"/mcp-use/public/${favicon}\" />`\n : \"\"\n }\n </head>\n <body>\n <div id=\"widget-root\"></div>\n <script type=\"module\" src=\"/entry.tsx\"></script>\n </body>\n</html>`;\n\n await fs.writeFile(path.join(tempDir, \"entry.tsx\"), entryContent, \"utf8\");\n await fs.writeFile(path.join(tempDir, \"index.html\"), htmlContent, \"utf8\");\n\n // Build with Vite\n const outDir = path.join(\n projectPath,\n \"dist\",\n \"resources\",\n \"widgets\",\n widgetName\n );\n\n // Set base URL: use MCP_URL if set, otherwise relative path\n const baseUrl = mcpUrl\n ? `${mcpUrl}/${widgetName}/`\n : `/mcp-use/widgets/${widgetName}/`;\n\n // Extract metadata from widget before building\n let widgetMetadata: any = {};\n try {\n // Use a completely isolated temp directory for metadata extraction to avoid conflicts\n const metadataTempDir = path.join(\n projectPath,\n \".mcp-use\",\n `${widgetName}-metadata`\n );\n await fs.mkdir(metadataTempDir, { recursive: true });\n\n const { createServer } = await import(\"vite\");\n\n // Plugin to provide browser stubs for Node.js-only packages\n const nodeStubsPlugin = {\n name: \"node-stubs\",\n enforce: \"pre\" as const,\n resolveId(id: string) {\n if (id === \"posthog-node\" || id.startsWith(\"posthog-node/\")) {\n return \"\\0virtual:posthog-node-stub\";\n }\n return null;\n },\n load(id: string) {\n if (id === \"\\0virtual:posthog-node-stub\") {\n return `\nexport class PostHog {\n constructor() {}\n capture() {}\n identify() {}\n alias() {}\n flush() { return Promise.resolve(); }\n shutdown() { return Promise.resolve(); }\n}\nexport default PostHog;\n`;\n }\n return null;\n },\n };\n\n const serverOnlyGuard = makeWidgetServerOnlyGuard(widgetName);\n\n const metadataServer = await createServer({\n root: metadataTempDir,\n cacheDir: path.join(metadataTempDir, \".vite-cache\"),\n plugins: [serverOnlyGuard, nodeStubsPlugin, tailwindcss(), react()],\n // When the project has a tsconfig, enable Vite's native tsconfig-paths\n // resolver so `@/*` (or any custom alias) resolves through the\n // project's own paths config. Without a tsconfig, fall back to the\n // legacy hardcoded alias.\n resolve: hasProjectTsconfig\n ? { tsconfigPaths: true }\n : { alias: { \"@\": resourcesDir } },\n server: {\n middlewareMode: true,\n },\n optimizeDeps: {\n // Exclude Node.js-only packages from browser bundling\n exclude: [\"posthog-node\"],\n },\n ssr: {\n // Force Vite to transform these packages in SSR instead of using external requires\n noExternal: [\"@openai/apps-sdk-ui\", \"react-router\"],\n // Mark Node.js-only packages as external in SSR mode\n external: [\"posthog-node\"],\n },\n define: {\n // Define process.env for SSR context\n \"process.env.NODE_ENV\": JSON.stringify(\n process.env.NODE_ENV || \"development\"\n ),\n \"import.meta.env.DEV\": true,\n \"import.meta.env.PROD\": false,\n \"import.meta.env.MODE\": JSON.stringify(\"development\"),\n \"import.meta.env.SSR\": true,\n },\n clearScreen: false,\n logLevel: \"silent\",\n customLogger: {\n info: () => {},\n warn: () => {},\n error: () => {},\n clearScreen: () => {},\n hasErrorLogged: () => false,\n hasWarned: false,\n warnOnce: () => {},\n },\n });\n\n try {\n const mod = await metadataServer.ssrLoadModule(entryPath);\n if (mod.widgetMetadata) {\n // Handle props (preferred) or inputs (deprecated) field\n const schemaField =\n mod.widgetMetadata.props || mod.widgetMetadata.inputs;\n\n // Check if schemaField is a Zod v4 schema (has ~standard property from Standard Schema)\n // and convert to JSON Schema for serialization using Zod v4's built-in toJsonSchema\n let inputsValue = schemaField || {};\n if (\n schemaField &&\n typeof schemaField === \"object\" &&\n \"~standard\" in schemaField\n ) {\n // Convert Zod schema to JSON Schema for manifest serialization\n try {\n inputsValue = toJSONSchema(schemaField);\n } catch (conversionError) {\n console.warn(\n chalk.yellow(\n ` ⚠ Could not convert schema for ${widgetName}, using raw schema`\n )\n );\n }\n }\n\n // Destructure to exclude props (raw Zod schema) from being serialized\n const {\n props: _rawProps,\n inputs: _rawInputs,\n ...restMetadata\n } = mod.widgetMetadata;\n\n widgetMetadata = {\n ...restMetadata,\n title: mod.widgetMetadata.title || widgetName,\n description: mod.widgetMetadata.description,\n // Store the converted JSON Schema (props field is used by production mount)\n props: inputsValue,\n inputs: inputsValue,\n };\n }\n // Give a moment for any background esbuild operations to complete\n await new Promise((resolve) => setTimeout(resolve, 50));\n } catch (error) {\n console.warn(\n chalk.yellow(` ⚠ Could not extract metadata for ${widgetName}`)\n );\n } finally {\n await metadataServer.close();\n // Clean up metadata temp directory\n try {\n await fs.rm(metadataTempDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n } catch (error) {\n // Silently skip metadata extraction if it fails\n }\n\n try {\n // Enhanced plugin to stub Node.js-only packages and built-ins\n const buildNodeStubsPlugin = {\n name: \"node-stubs-build\",\n enforce: \"pre\" as const,\n resolveId(id: string) {\n // Stub posthog-node\n if (id === \"posthog-node\" || id.startsWith(\"posthog-node/\")) {\n return \"\\0virtual:posthog-node-stub\";\n }\n // Stub path module for browser builds\n if (id === \"path\" || id === \"node:path\") {\n return \"\\0virtual:path-stub\";\n }\n return null;\n },\n load(id: string) {\n if (id === \"\\0virtual:posthog-node-stub\") {\n return `\nexport class PostHog {\n constructor() {}\n capture() {}\n identify() {}\n alias() {}\n flush() { return Promise.resolve(); }\n shutdown() { return Promise.resolve(); }\n}\nexport default PostHog;\n`;\n }\n if (id === \"\\0virtual:path-stub\") {\n return `\nexport function join(...paths) {\n return paths.filter(Boolean).join(\"/\").replace(/\\\\/\\\\//g, \"/\").replace(/\\\\/$/, \"\");\n}\nexport function resolve(...paths) {\n return join(...paths);\n}\nexport function dirname(filepath) {\n const parts = filepath.split(\"/\");\n parts.pop();\n return parts.join(\"/\") || \"/\";\n}\nexport function basename(filepath, ext) {\n const parts = filepath.split(\"/\");\n let name = parts[parts.length - 1] || \"\";\n if (ext && name.endsWith(ext)) {\n name = name.slice(0, -ext.length);\n }\n return name;\n}\nexport function extname(filepath) {\n const name = basename(filepath);\n const index = name.lastIndexOf(\".\");\n return index > 0 ? name.slice(index) : \"\";\n}\nexport function normalize(filepath) {\n return filepath.replace(/\\\\/\\\\//g, \"/\");\n}\nexport function isAbsolute(filepath) {\n return filepath.startsWith(\"/\");\n}\nexport const sep = \"/\";\nexport const delimiter = \":\";\nexport const posix = {\n join,\n resolve,\n dirname,\n basename,\n extname,\n normalize,\n isAbsolute,\n sep,\n delimiter,\n};\nexport default {\n join,\n resolve,\n dirname,\n basename,\n extname,\n normalize,\n isAbsolute,\n sep,\n delimiter,\n posix,\n};\n`;\n }\n return null;\n },\n };\n\n // Build plugins array - add viteSingleFile when inlining for VS Code compatibility.\n // `@/*` aliases are resolved via Vite's native `resolve.tsconfigPaths`\n // below (when the project has a tsconfig.json at the root); this is what\n // lets a widget inside a Next.js app `import '@/components/ui/card'`\n // and resolve it through the app's own paths config.\n const buildServerOnlyGuard = makeWidgetServerOnlyGuard(widgetName);\n const buildPlugins = inline\n ? [\n buildServerOnlyGuard,\n buildNodeStubsPlugin,\n tailwindcss(),\n react(),\n viteSingleFile({ removeViteModuleLoader: true }),\n ]\n : [buildServerOnlyGuard, buildNodeStubsPlugin, tailwindcss(), react()];\n\n await build({\n root: tempDir,\n base: baseUrl,\n plugins: buildPlugins,\n // Only use renderBuiltUrl for non-inline builds (external assets need runtime URL resolution)\n ...(inline\n ? {}\n : {\n experimental: {\n renderBuiltUrl: (\n filename: string,\n { hostType }: { hostType: string }\n ) => {\n if ([\"js\", \"css\"].includes(hostType)) {\n return {\n runtime: `window.__getFile(${JSON.stringify(filename)})`,\n };\n } else {\n return { relative: true };\n }\n },\n },\n }),\n // When a tsconfig exists, enable Vite's native `resolve.tsconfigPaths`\n // so the project's path aliases resolve naturally. Otherwise fall\n // back to the legacy `@` → resourcesDir alias.\n resolve: hasProjectTsconfig\n ? { tsconfigPaths: true }\n : { alias: { \"@\": resourcesDir } },\n optimizeDeps: {\n // Exclude Node.js-only packages from browser bundling\n exclude: [\"posthog-node\"],\n },\n build: {\n outDir,\n emptyOutDir: true,\n // Disable source maps to avoid CSP eval violations\n // Source maps can use eval-based mappings which break strict CSP policies\n sourcemap: false,\n // Minify for smaller bundle size\n minify: true,\n // Widgets bundle React+Zod; suppress expected chunk size warning\n chunkSizeWarningLimit: 1024,\n // For inline builds, disable CSS code splitting and inline all assets\n ...(inline\n ? {\n cssCodeSplit: false,\n assetsInlineLimit: 100000000, // Inline all assets under 100MB (effectively all)\n }\n : {}),\n rolldownOptions: {\n input: path.join(tempDir, \"index.html\"),\n external: (id) => {\n return false;\n },\n },\n },\n });\n\n // Post-process JS bundles to patch Zod's JIT compilation\n // This prevents CSP eval violations in sandboxed iframes (MCP Apps hosts)\n // See: https://github.com/colinhacks/zod/issues/4461\n try {\n const assetsDir = path.join(outDir, \"assets\");\n const assetFiles = await fs.readdir(assetsDir);\n const jsFiles = assetFiles.filter((f) => f.endsWith(\".js\"));\n\n for (const jsFile of jsFiles) {\n const jsPath = path.join(assetsDir, jsFile);\n let content = await fs.readFile(jsPath, \"utf8\");\n\n // Patch Zod's globalConfig to disable JIT compilation\n // Zod 4.x uses: const globalConfig={};function config(o){return globalConfig}\n // After minification: const X={};function Y(o){return X}\n // We match the pattern where an empty object const is followed by a function returning it\n const zodConfigPatterns = [\n // Non-minified: export const globalConfig = {}\n /export\\s+const\\s+globalConfig\\s*=\\s*\\{\\s*\\}/g,\n // Minified pattern: ZodEncodeError\"}}const X={};function followed by return X\n // This is the unique signature of Zod's globalConfig\n /ZodEncodeError[^}]*\\}\\}const\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*=\\s*\\{\\s*\\}/g,\n ];\n\n let patched = false;\n for (const pattern of zodConfigPatterns) {\n if (pattern.test(content)) {\n // Reset lastIndex for global regex\n pattern.lastIndex = 0;\n content = content.replace(pattern, (match) => {\n return match.replace(/=\\s*\\{\\s*\\}/, \"={jitless:true}\");\n });\n patched = true;\n }\n }\n\n if (patched) {\n await fs.writeFile(jsPath, content, \"utf8\");\n console.log(chalk.gray(` → Patched Zod JIT in ${jsFile}`));\n }\n }\n } catch (error) {\n // Assets directory might not exist for some builds, that's okay\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n console.warn(chalk.yellow(` ⚠ Failed to patch Zod JIT: ${error}`));\n }\n }\n\n // Post-process HTML for static deployments (e.g., Supabase)\n // If MCP_SERVER_URL is set, inject window globals at build time\n const mcpServerUrl = process.env.MCP_SERVER_URL;\n if (mcpServerUrl) {\n try {\n const htmlPath = path.join(outDir, \"index.html\");\n let html = await fs.readFile(htmlPath, \"utf8\");\n\n // Inject window.__mcpPublicUrl and window.__getFile into <head>\n // Note: __mcpPublicUrl uses standard format for useWidget to derive mcp_url\n // __mcpPublicAssetsUrl points to where public files are actually stored\n const injectionScript = `<script>window.__getFile = (filename) => { return \"${mcpUrl}/${widgetName}/\"+filename }; window.__mcpPublicUrl = \"${mcpServerUrl}/mcp-use/public\"; window.__mcpPublicAssetsUrl = \"${mcpUrl}/public\";</script>`;\n\n // Check if script tag already exists in head\n if (!html.includes(\"window.__mcpPublicUrl\")) {\n html = html.replace(\n /<head[^>]*>/i,\n `<head>\\n ${injectionScript}`\n );\n }\n\n // Update base href if it exists, or inject it\n if (/<base\\s+[^>]*\\/?>/i.test(html)) {\n // Replace existing base tag\n html = html.replace(\n /<base\\s+[^>]*\\/?>/i,\n `<base href=\"${mcpServerUrl}\">`\n );\n } else {\n // Inject base tag after the injection script\n html = html.replace(\n injectionScript,\n `${injectionScript}\\n <base href=\"${mcpServerUrl}\">`\n );\n }\n\n await fs.writeFile(htmlPath, html, \"utf8\");\n console.log(\n chalk.gray(` → Injected MCP_SERVER_URL into ${widgetName}`)\n );\n } catch (error) {\n console.warn(\n chalk.yellow(\n ` ⚠ Failed to post-process HTML for ${widgetName}:`,\n error\n )\n );\n }\n }\n\n console.log(chalk.green(` ✓ Built ${widgetName}`));\n return {\n status: \"built\" as const,\n name: widgetName,\n metadata: widgetMetadata,\n };\n } catch (error) {\n console.error(chalk.red(` ✗ Failed to build ${widgetName}:`), error);\n return { status: \"failed\" as const, name: widgetName };\n }\n };\n\n // Build all widgets in parallel\n const buildResults = await Promise.all(\n entries.map((entry) => buildSingleWidget(entry))\n );\n\n const failed = buildResults.filter((r) => r.status === \"failed\");\n if (failed.length > 0) {\n // A failed widget build must fail the whole `mcp-use build`. Silently\n // dropping failures produced a manifest that looked healthy but shipped\n // zero widgets at runtime — indistinguishable from a project that\n // intentionally has none. Throw so the outer try/catch exits non-zero.\n const names = failed.map((f) => f.name).join(\", \");\n throw new Error(\n `${failed.length} widget(s) failed to build: ${names}. See errors above.`\n );\n }\n\n return buildResults.flatMap((r) =>\n r.status === \"built\" ? [{ name: r.name, metadata: r.metadata }] : []\n );\n}\n\n/**\n * Collect TypeScript files from tsconfig include/exclude patterns using only\n * Node.js built-ins (no globby/fast-glob, which break in ESM bundles).\n */\nasync function collectTsFiles(\n projectPath: string,\n includePatterns: string[],\n excludePatterns: string[]\n): Promise<string[]> {\n const { promises: fs } = await import(\"node:fs\");\n\n // Separate literal files from directory globs\n const literalFiles: string[] = [];\n const dirPrefixes: string[] = [];\n\n for (const pattern of includePatterns) {\n if (pattern.includes(\"*\")) {\n // Extract directory prefix before the first wildcard\n const prefix = pattern.split(\"*\")[0].replace(/\\/+$/, \"\") || \".\";\n dirPrefixes.push(prefix);\n } else {\n literalFiles.push(pattern);\n }\n }\n\n const files: string[] = [];\n\n // Add literal files that exist and are .ts/.tsx (not .d.ts)\n for (const file of literalFiles) {\n if (/\\.tsx?$/.test(file) && !file.endsWith(\".d.ts\")) {\n try {\n await access(path.join(projectPath, file));\n files.push(file);\n } catch {\n // File doesn't exist, skip\n }\n }\n }\n\n // Recursively scan directories\n const excludeSet = new Set(excludePatterns.map((e) => e.replace(/\\*+/g, \"\")));\n for (const prefix of dirPrefixes) {\n const dirPath = path.join(projectPath, prefix);\n try {\n const entries = await fs.readdir(dirPath, { recursive: true });\n for (const entry of entries) {\n const entryStr = String(entry);\n const rel = path.join(prefix, entryStr);\n if (\n /\\.tsx?$/.test(entryStr) &&\n !entryStr.endsWith(\".d.ts\") &&\n !excludeSet.has(rel.split(path.sep)[0])\n ) {\n files.push(rel);\n }\n }\n } catch {\n // Directory doesn't exist, skip\n }\n }\n\n return files;\n}\n\n/**\n * Transpile TypeScript files using esbuild instead of tsc.\n * esbuild strips types without analyzing them, so it cannot OOM on complex types.\n * Reads the project's tsconfig.json to determine source files, outDir, and compiler options.\n */\nasync function transpileWithEsbuild(projectPath: string): Promise<void> {\n const esbuild = await import(\"esbuild\");\n const { promises: fs } = await import(\"node:fs\");\n\n const tsconfigPath = path.join(projectPath, \"tsconfig.json\");\n let tsconfig: any = {};\n try {\n const raw = await fs.readFile(tsconfigPath, \"utf-8\");\n tsconfig = JSON.parse(raw);\n } catch {\n // No tsconfig — use defaults\n }\n\n const compilerOptions = tsconfig.compilerOptions || {};\n const outDir = compilerOptions.outDir || \"./dist\";\n const includePatterns = tsconfig.include || [\"**/*.ts\", \"**/*.tsx\"];\n const excludePatterns = tsconfig.exclude || [\"node_modules\", \"dist\"];\n\n const files = await collectTsFiles(\n projectPath,\n includePatterns,\n excludePatterns\n );\n\n if (files.length === 0) {\n console.log(chalk.yellow(\" No TypeScript files found to transpile.\"));\n return;\n }\n\n // Map tsconfig jsx setting to esbuild equivalent\n const jsxMap: Record<string, \"automatic\" | \"transform\" | \"preserve\"> = {\n \"react-jsx\": \"automatic\",\n \"react-jsxdev\": \"automatic\",\n react: \"transform\",\n preserve: \"preserve\",\n };\n const jsx = jsxMap[compilerOptions.jsx] || undefined;\n\n const target = (compilerOptions.target || \"ES2022\").toLowerCase();\n\n const moduleStr = (compilerOptions.module || \"ESNext\").toLowerCase();\n const format: \"esm\" | \"cjs\" = moduleStr.includes(\"commonjs\") ? \"cjs\" : \"esm\";\n\n // Match tsc's rootDir behavior: when set, esbuild's outbase should map to it\n // so that `src/index.ts` → `dist/index.js` (not `dist/src/index.js`).\n const outbase = compilerOptions.rootDir\n ? path.resolve(projectPath, compilerOptions.rootDir)\n : projectPath;\n\n await esbuild.build({\n entryPoints: files.map((f) => path.join(projectPath, f)),\n outdir: path.join(projectPath, outDir),\n outbase,\n bundle: true,\n packages: \"external\",\n format,\n target,\n jsx,\n sourcemap: compilerOptions.sourceMap ?? true,\n tsconfig: tsconfigPath,\n platform: \"node\",\n logLevel: \"warning\",\n });\n}\n\nprogram\n .command(\"build\")\n .description(\"Build TypeScript and MCP UI widgets\")\n .option(\"-p, --path <path>\", \"Path to project directory\", process.cwd())\n .option(\n \"--entry <file>\",\n \"Path to MCP server entry file (relative to project)\"\n )\n .option(\n \"--widgets-dir <dir>\",\n \"Path to widgets directory (relative to project)\"\n )\n .option(\n \"--mcp-dir <dir>\",\n \"Folder holding the MCP entry + resources (e.g. 'src/mcp' for Next.js apps)\"\n )\n .option(\"--with-inspector\", \"Include inspector in production build\")\n .option(\n \"--inline\",\n \"Inline all JS/CSS into HTML (required for VS Code MCP Apps)\"\n )\n .option(\"--no-inline\", \"Keep JS/CSS as separate files (default)\")\n .option(\"--no-typecheck\", \"Skip TypeScript type checking (faster builds)\")\n .action(async (options) => {\n try {\n const projectPath = path.resolve(options.path);\n const { promises: fs } = await import(\"node:fs\");\n\n displayPackageVersions(projectPath);\n\n // Resolve mcpDir for widgets + server entry\n const mcpDir = options.mcpDir as string | undefined;\n const widgetsDir = resolveWidgetsDir(options.widgetsDir, mcpDir);\n\n // Build widgets first (this generates schemas)\n // Use --inline flag for VS Code compatibility (VS Code's CSP blocks external scripts)\n const builtWidgets = await buildWidgets(projectPath, {\n inline: options.inline ?? false,\n widgetsDir,\n });\n\n // Find the source server file before building\n let sourceServerFile: string | undefined;\n try {\n sourceServerFile = await findServerFile(\n projectPath,\n options.entry,\n options.mcpDir\n );\n } catch (err) {\n // No server file found. Widget-only projects hit this on purpose,\n // but a misconfigured --mcp-dir is a user error worth surfacing so\n // it doesn't cascade into a manifest without an entryPoint and an\n // unclear start-time failure.\n console.log(\n chalk.yellow(\n `⚠ Could not locate a server entry file: ${err instanceof Error ? err.message : String(err)}`\n )\n );\n }\n\n if (sourceServerFile) {\n console.log(chalk.gray(\"Generating tool registry types...\"));\n // Type generation is a dev convenience (regenerates\n // .mcp-use/tool-registry.d.ts). Keep it non-fatal during build so\n // a runtime without the right loader hooks (e.g. bun alpine) or\n // an unrelated import-time error in the server file can't block\n // the Docker build.\n try {\n const typeGenResult = await generateToolRegistryTypesForServer(\n projectPath,\n sourceServerFile\n );\n if (typeGenResult === \"ok\") {\n console.log(chalk.green(\"✓ Tool registry types generated\"));\n } else if (typeGenResult === \"failed\") {\n console.log(\n chalk.yellow(\n \"⚠ Tool registry type generation had errors (non-blocking)\"\n )\n );\n }\n // \"skipped\" already logged its own warning inside the function.\n } catch (err) {\n console.log(\n chalk.yellow(\n \"⚠ Tool registry type generation failed (non-blocking): \" +\n (err instanceof Error ? err.message : String(err))\n )\n );\n }\n }\n\n // Transpile TypeScript with esbuild (fast, no OOM on complex types).\n // Type checking is a separate step via tsc --noEmit (skippable with --no-typecheck).\n //\n // SKIPPED when --mcp-dir is set (drop-in Next.js layout). The host app\n // (Next.js) owns its own build; trying to transpile every .ts/.tsx in\n // a Next.js project chokes on files like `tailwind.config.ts` that are\n // never meant to be runtime-compiled and on RSC-only files that\n // esbuild doesn't understand. In --mcp-dir mode, `mcp-use start` runs\n // the TypeScript source directly via tsx (same setup as `mcp-use dev`,\n // minus HMR), so there's nothing to transpile ahead of time. The\n // manifest written below still records the .ts source as the entry.\n if (!mcpDir) {\n console.log(chalk.gray(\"Building TypeScript...\"));\n await transpileWithEsbuild(projectPath);\n console.log(chalk.green(\"✓ TypeScript build complete!\"));\n } else {\n console.log(\n chalk.gray(\n \"Skipping TypeScript transpile (--mcp-dir mode runs source via tsx at start time)\"\n )\n );\n }\n\n // Type-check with tsc --noEmit (separate from transpilation).\n // Uses the locally installed typescript binary directly rather than npx to\n // prevent npx from auto-installing the unrelated `tsc@2.0.4` package.\n // Also skipped in --mcp-dir mode — the host Next.js app is responsible\n // for type-checking its own tree during `next build`.\n if (options.typecheck !== false && !mcpDir) {\n console.log(chalk.gray(\"Type checking...\"));\n // Use the current runtime binary (`process.execPath`) rather than\n // hardcoding \"node\". Alpine images built on `oven/bun:alpine`\n // don't ship a `node` binary, and bun runs tsc fine.\n const tscBin = path.join(\n projectPath,\n \"node_modules\",\n \"typescript\",\n \"bin\",\n \"tsc\"\n );\n const tscArgs = isBunRuntime()\n ? [tscBin, \"--noEmit\"]\n : [\"--max-old-space-size=4096\", tscBin, \"--noEmit\"];\n try {\n await runCommand(process.execPath, tscArgs, projectPath).promise;\n console.log(chalk.green(\"✓ Type check passed!\"));\n } catch {\n console.error(\n chalk.red(\"✗ Type check failed.\") +\n chalk.gray(\" Use --no-typecheck to skip.\")\n );\n process.exit(1);\n }\n }\n\n // Determine the entry point `mcp-use start` should run.\n // - Legacy layout: the file was transpiled to dist/ above; record\n // the compiled .js path.\n // - --mcp-dir layout: no transpile step ran, so point the manifest\n // at the .ts source. `mcp-use start` loads it via tsx (same setup\n // as `mcp-use dev`, minus HMR).\n let entryPoint: string | undefined;\n if (sourceServerFile) {\n if (mcpDir) {\n entryPoint = sourceServerFile;\n } else {\n // Check possible output locations based on common tsconfig patterns\n // tsc may or may not preserve the src/ prefix depending on rootDir setting\n const baseName = path.basename(sourceServerFile, \".ts\") + \".js\";\n const possibleOutputs = [\n `dist/${baseName}`, // rootDir set to project root or src\n `dist/src/${baseName}`, // no rootDir, source in src/\n `dist/${sourceServerFile.replace(/\\.ts$/, \".js\")}`, // exact path preserved\n ];\n for (const candidate of possibleOutputs) {\n try {\n await access(path.join(projectPath, candidate));\n entryPoint = candidate;\n break;\n } catch {\n continue;\n }\n }\n }\n }\n\n // Copy public folder if it exists\n const publicDir = path.join(projectPath, \"public\");\n try {\n await fs.access(publicDir);\n console.log(chalk.gray(\"Copying public assets...\"));\n await fs.cp(publicDir, path.join(projectPath, \"dist\", \"public\"), {\n recursive: true,\n });\n console.log(chalk.green(\"✓ Public assets copied\"));\n } catch {\n // Public folder doesn't exist, skip\n }\n\n // Create build manifest\n const manifestPath = path.join(projectPath, \"dist\", \"mcp-use.json\");\n\n // Read existing manifest to preserve tunnel subdomain and other fields\n let existingManifest: any = {};\n try {\n const existingContent = await fs.readFile(manifestPath, \"utf-8\");\n existingManifest = JSON.parse(existingContent);\n } catch {\n // File doesn't exist, that's okay\n }\n\n // Transform builtWidgets array into widgets object with metadata\n const widgetsData: Record<string, any> = {};\n for (const widget of builtWidgets) {\n widgetsData[widget.name] = widget.metadata;\n }\n\n // Convert to boolean: true if flag is present, false otherwise\n const includeInspector = !!options.withInspector;\n\n // Generate a build ID (hash of build time + random component for uniqueness)\n const buildTime = new Date().toISOString();\n const { createHash } = await import(\"node:crypto\");\n const buildId = createHash(\"sha256\")\n .update(buildTime + Math.random().toString())\n .digest(\"hex\")\n .substring(0, 16); // Use first 16 chars for shorter IDs\n\n // Merge with existing manifest, preserving tunnel and other fields\n const manifest = {\n ...existingManifest, // Preserve existing fields like tunnel\n includeInspector,\n buildTime,\n buildId,\n entryPoint, // Server entry point for `mcp-use start`\n widgets: widgetsData,\n };\n\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(\n manifestPath,\n JSON.stringify(manifest, null, 2),\n \"utf8\"\n );\n console.log(chalk.green(\"✓ Build manifest created\"));\n\n console.log(chalk.green.bold(`\\n✓ Build complete!`));\n if (builtWidgets.length > 0) {\n console.log(chalk.gray(` ${builtWidgets.length} widget(s) built`));\n }\n if (options.withInspector) {\n console.log(chalk.gray(\" Inspector included\"));\n }\n process.exit(0);\n } catch (error) {\n console.error(chalk.red(\"Build failed:\"), error);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"dev\")\n .description(\"Run development server with auto-reload and inspector\")\n .option(\"-p, --path <path>\", \"Path to project directory\", process.cwd())\n .option(\n \"--entry <file>\",\n \"Path to MCP server entry file (relative to project)\"\n )\n .option(\n \"--widgets-dir <dir>\",\n \"Path to widgets directory (relative to project)\"\n )\n .option(\n \"--mcp-dir <dir>\",\n \"Folder holding the MCP entry + resources (e.g. 'src/mcp' for Next.js apps)\"\n )\n .option(\"--port <port>\", \"Server port\", \"3000\")\n .option(\n \"--host <host>\",\n \"Server host (use 0.0.0.0 to listen on all interfaces)\",\n \"0.0.0.0\"\n )\n .option(\"--no-open\", \"Do not auto-open inspector\")\n .option(\"--no-hmr\", \"Disable hot module reloading (use tsx watch instead)\")\n .option(\"--tunnel\", \"Expose server through a tunnel\")\n .action(async (options) => {\n try {\n process.env.MCP_USE_CLI_DEV = \"1\";\n const projectPath = path.resolve(options.path);\n let port = parseInt(options.port, 10);\n const host = options.host;\n const useHmr = options.hmr !== false;\n\n displayPackageVersions(projectPath);\n\n // Check if port is available, find alternative if needed\n if (!(await isPortAvailable(port, host))) {\n console.log(chalk.yellow.bold(`⚠️ Port ${port} is already in use`));\n const availablePort = await findAvailablePort(port, host);\n console.log(chalk.green.bold(`✓ Using port ${availablePort} instead`));\n port = availablePort;\n }\n\n // Find the main source file (honors --entry / --mcp-dir flags and mcp-use.config.json)\n const serverFile = await findServerFile(\n projectPath,\n options.entry,\n options.mcpDir\n );\n\n // Resolve the widgets directory and expose it via an env var so the\n // running MCPServer (which picks `resources/` by default) discovers\n // widgets at `<mcpDir>/resources` when the developer used --mcp-dir.\n // The env var is the contract: mcp-use/server reads it when no\n // explicit `resourcesDir` is passed to mountWidgets.\n {\n const devMcpDir = options.mcpDir as string | undefined;\n const devWidgetsDir = resolveWidgetsDir(options.widgetsDir, devMcpDir);\n if (devWidgetsDir !== \"resources\") {\n process.env.MCP_USE_WIDGETS_DIR = devWidgetsDir;\n }\n }\n\n // Start tunnel if requested\n let tunnelProcess: any = undefined;\n let tunnelSubdomain: string | undefined = undefined;\n let tunnelUrl: string | undefined = undefined;\n\n if (options.tunnel) {\n try {\n const manifestPath = path.join(projectPath, \"dist\", \"mcp-use.json\");\n let existingSubdomain: string | undefined;\n\n try {\n const manifestContent = await readFile(manifestPath, \"utf-8\");\n const manifest = JSON.parse(manifestContent);\n existingSubdomain = manifest.tunnel?.subdomain;\n if (existingSubdomain) {\n console.log(\n chalk.gray(`Found existing subdomain: ${existingSubdomain}`)\n );\n const apiBase =\n process.env.MCP_USE_TUNNEL_API || \"https://local.mcp-use.run\";\n try {\n await fetch(`${apiBase}/api/tunnels/${existingSubdomain}`, {\n method: \"DELETE\",\n });\n } catch {\n // Best-effort cleanup; ignore DELETE failures\n }\n }\n } catch {\n // Manifest doesn't exist or is invalid, that's okay\n }\n\n let tunnelInfo: Awaited<ReturnType<typeof startTunnel>>;\n try {\n tunnelInfo = await startTunnel(port, existingSubdomain);\n } catch (e) {\n if (existingSubdomain) {\n console.log(\n chalk.yellow(\n `Subdomain \"${existingSubdomain}\" unavailable, requesting a new one…`\n )\n );\n tunnelInfo = await startTunnel(port);\n } else {\n throw e;\n }\n }\n tunnelUrl = tunnelInfo.url;\n tunnelProcess = tunnelInfo.process;\n tunnelSubdomain = tunnelInfo.subdomain;\n\n // Persist subdomain for reuse across restarts\n try {\n let manifest: any = {};\n try {\n const manifestContent = await readFile(manifestPath, \"utf-8\");\n manifest = JSON.parse(manifestContent);\n } catch {\n // File doesn't exist, create new manifest\n }\n\n if (!manifest.tunnel) {\n manifest.tunnel = {};\n }\n manifest.tunnel.subdomain = tunnelSubdomain;\n\n await mkdir(path.dirname(manifestPath), { recursive: true });\n await writeFile(\n manifestPath,\n JSON.stringify(manifest, null, 2),\n \"utf-8\"\n );\n } catch (error) {\n console.warn(\n chalk.yellow(\n `⚠️ Failed to save subdomain to mcp-use.json: ${error instanceof Error ? error.message : \"Unknown error\"}`\n )\n );\n }\n } catch (error) {\n console.error(chalk.red(\"Failed to start tunnel:\"), error);\n process.exit(1);\n }\n }\n\n // Set environment variables for the server\n const mcpUrl = `http://${host}:${port}`;\n process.env.PORT = String(port);\n process.env.HOST = host;\n process.env.NODE_ENV = \"development\";\n // Tunnel URL takes priority; otherwise preserve user-provided MCP_URL (e.g., for reverse proxy setups)\n if (tunnelUrl) {\n process.env.MCP_URL = tunnelUrl;\n } else if (!process.env.MCP_URL) {\n process.env.MCP_URL = mcpUrl;\n }\n // Detect Next.js projects so we can install shims for server-only /\n // next/cache / next/headers / next/navigation / next/server — all of\n // which throw or misbehave outside a Next.js request context. We also\n // mirror Next.js's .env cascade so tools imported from the app find\n // the variables they expect (DB URLs, feature-flag keys, etc.).\n const isNextJsProject = await detectNextJsProject(projectPath);\n if (isNextJsProject) {\n console.log(\n chalk.gray(\n \"Next.js detected — installing server-runtime shims (server-only, next/cache, next/headers, next/navigation, next/server)\"\n )\n );\n await loadNextJsEnvFiles(projectPath);\n }\n\n if (!useHmr) {\n // Fallback: Use tsx watch (restarts process on changes)\n console.log(chalk.gray(\"HMR disabled, using tsx watch (full restart)\"));\n\n const processes: any[] = [];\n const baseEnv: NodeJS.ProcessEnv = {\n // Inherit parent env (PATH, HOME, etc.) — without it, tsx can't\n // resolve its own tooling in some setups.\n ...process.env,\n PORT: String(port),\n HOST: host,\n NODE_ENV: \"development\",\n // Preserve user-provided MCP_URL (e.g., for reverse proxy setups)\n MCP_URL: process.env.MCP_URL || mcpUrl,\n };\n const env = isNextJsProject ? withNextShimsEnv(baseEnv) : baseEnv;\n\n // Use local tsx if available, otherwise fall back to npx\n const { createRequire } = await import(\"node:module\");\n let cmd: string;\n let args: string[];\n try {\n const projectRequire = createRequire(\n path.join(projectPath, \"package.json\")\n );\n // Resolve tsx bin from package.json instead of hardcoding internal path\n const tsxPkgPath = projectRequire.resolve(\"tsx/package.json\");\n const tsxPkg = JSON.parse(await readFile(tsxPkgPath, \"utf-8\"));\n // Handle both string and object forms of the bin field\n let binPath: string;\n if (typeof tsxPkg.bin === \"string\") {\n binPath = tsxPkg.bin;\n } else if (tsxPkg.bin && typeof tsxPkg.bin === \"object\") {\n // Use 'tsx' entry or the first entry\n binPath = tsxPkg.bin.tsx || Object.values(tsxPkg.bin)[0];\n } else {\n throw new Error(\"No bin field found in tsx package.json\");\n }\n const tsxBin = path.resolve(path.dirname(tsxPkgPath), binPath);\n cmd = \"node\";\n args = [tsxBin, \"watch\", serverFile];\n } catch (error) {\n // tsx not found locally or bin resolution failed, use npx\n console.log(\n chalk.yellow(\n `Could not resolve local tsx: ${error instanceof Error ? error.message : \"unknown error\"}`\n )\n );\n cmd = \"npx\";\n args = [\"tsx\", \"watch\", serverFile];\n }\n\n const serverCommand = runCommand(cmd, args, projectPath, env, true);\n processes.push(serverCommand.process);\n\n // Auto-open inspector if enabled\n if (options.open !== false) {\n const startTime = Date.now();\n const browserHost = normalizeBrowserHost(host);\n const ready = await waitForServer(port, browserHost);\n if (ready) {\n const mcpEndpoint = `http://${browserHost}:${port}/mcp`;\n const autoConnectEndpoint = tunnelUrl\n ? `${tunnelUrl}/mcp`\n : mcpEndpoint;\n const inspectorUrl = `http://${browserHost}:${port}/inspector?autoConnect=${encodeURIComponent(autoConnectEndpoint)}`;\n\n const readyTime = Date.now() - startTime;\n console.log(chalk.green.bold(`✓ Ready in ${readyTime}ms`));\n console.log(\n chalk.whiteBright(`Local: http://${browserHost}:${port}`)\n );\n console.log(chalk.whiteBright(`Network: http://${host}:${port}`));\n console.log(chalk.whiteBright(`MCP: ${mcpEndpoint}`));\n if (tunnelUrl) {\n console.log(chalk.whiteBright(`Tunnel: ${tunnelUrl}/mcp`));\n }\n console.log(chalk.whiteBright(`Inspector: ${inspectorUrl}\\n`));\n await open(inspectorUrl);\n }\n }\n\n // Handle cleanup\n let noHmrCleanupInProgress = false;\n const cleanup = async () => {\n if (noHmrCleanupInProgress) return;\n noHmrCleanupInProgress = true;\n\n console.log(chalk.gray(\"\\n\\nShutting down...\"));\n\n if (\n tunnelProcess &&\n typeof (tunnelProcess as any).markShutdown === \"function\"\n ) {\n (tunnelProcess as any).markShutdown();\n }\n\n if (tunnelSubdomain) {\n try {\n const apiBase =\n process.env.MCP_USE_API || \"https://local.mcp-use.run\";\n await fetch(`${apiBase}/api/tunnels/${tunnelSubdomain}`, {\n method: \"DELETE\",\n });\n } catch {\n // Ignore cleanup errors\n }\n }\n\n processes.forEach((proc) => {\n if (proc && typeof proc.kill === \"function\") {\n proc.kill(\"SIGINT\");\n }\n });\n\n if (tunnelProcess && typeof tunnelProcess.kill === \"function\") {\n tunnelProcess.kill(\"SIGINT\");\n }\n\n setTimeout(() => process.exit(0), 2000);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n await new Promise(() => {});\n return;\n }\n\n // HMR mode: Use chokidar to watch files and sync registrations\n console.log(\n chalk.gray(\n \"HMR enabled - changes will hot reload without dropping connections\"\n )\n );\n\n // Register Next.js server-runtime shims in-process. The HMR path calls\n // `tsImport` in this process (no child) so the loader has to be\n // registered here, before the first import of the user's server entry.\n if (isNextJsProject) {\n const registered = await registerNextShimsInProcess();\n if (!registered) {\n console.warn(\n chalk.yellow(\n \"[HMR] Warning: Next.js shim loader could not be found on disk. \" +\n \"Importing server-only / next/cache / etc. will throw. \" +\n \"Reinstall @mcp-use/cli to fix.\"\n )\n );\n }\n }\n\n const chokidarModule = await import(\"chokidar\");\n const chokidar = (chokidarModule as any).default || chokidarModule;\n const { fileURLToPath } = await import(\"node:url\");\n const { createRequire } = await import(\"node:module\");\n\n // Resolve the user's tsconfig up front — the server load path below\n // depends on tsx picking it up so `@/*` aliases resolve.\n const projectTsconfigPath = path.join(projectPath, \"tsconfig.json\");\n let tsconfigAvailable = false;\n try {\n await access(projectTsconfigPath);\n tsconfigAvailable = true;\n // Belt-and-braces: tsx also consults TSX_TSCONFIG_PATH and walks up\n // from cwd for auto-discovery. Setting both covers every tsx code\n // path (initialize hook, globalPreload hook, CJS require path).\n process.env.TSX_TSCONFIG_PATH = projectTsconfigPath;\n if (process.cwd() !== projectPath) process.chdir(projectPath);\n } catch {\n // No tsconfig at the project root — path aliases won't resolve.\n }\n\n // Install tsx's loader hooks globally (no namespace). We deliberately\n // do NOT use tsx's `tsImport` here: tsImport registers tsx with a\n // generated namespace, which causes tsx's resolver to bail for any\n // specifier whose URL doesn't carry that namespace — including all\n // transitive imports like `@/lib/...`. Registering without a namespace\n // means tsx's resolver runs for every specifier and always consults\n // the tsconfig paths matcher.\n //\n // We also need tsx's CJS register: a Next.js app's package.json has no\n // `\"type\": \"module\"`, so tsx compiles .ts to CJS, and the user entry's\n // `require()` chain needs tsx's CJS `.ts` compilation + tsconfig-paths\n // rewriting. Without tsx/cjs, require(\"@/lib/...\") throws.\n //\n // After register, we use native dynamic `import()` with a ?t= cache\n // buster on each reload (same technique tsImport uses internally).\n let tsxLoaderActive = false;\n try {\n const projectRequire = createRequire(\n path.join(projectPath, \"package.json\")\n );\n\n // ESM side — tsx/esm/api.register()\n const tsxEsmApiPath = projectRequire.resolve(\"tsx/esm/api\");\n const tsxEsmApi = await import(pathToFileURL(tsxEsmApiPath).href);\n if (typeof tsxEsmApi.register === \"function\") {\n tsxEsmApi.register({\n tsconfig: tsconfigAvailable ? projectTsconfigPath : undefined,\n onImport: (url: string) => {\n // `fileURLToPath` is in scope from the outer destructure above.\n const filePath = url.startsWith(\"file://\")\n ? fileURLToPath(url)\n : url;\n if (\n !filePath.includes(\"node_modules\") &&\n filePath.startsWith(projectPath)\n ) {\n console.debug(`[HMR] Loaded: ${url}`);\n }\n },\n });\n tsxLoaderActive = true;\n }\n\n // CJS side — tsx/cjs/api.register(). Handles require() of .ts files\n // and tsconfig-paths rewriting inside CJS-compiled modules.\n try {\n const tsxCjsApiPath = projectRequire.resolve(\"tsx/cjs/api\");\n const tsxCjsApi = await import(pathToFileURL(tsxCjsApiPath).href);\n if (typeof tsxCjsApi.register === \"function\") {\n tsxCjsApi.register();\n }\n } catch {\n // tsx/cjs isn't exposed in some tsx minor versions; skipping is OK\n // as long as the ESM side is up. In practice tsx 4.x ships both.\n }\n } catch {\n console.log(\n chalk.yellow(\n \"Warning: tsx not found in project dependencies. TypeScript HMR may not work.\\n\" +\n \"Add tsx to your devDependencies: npm install -D tsx\"\n )\n );\n }\n\n const serverFilePath = path.join(projectPath, serverFile);\n const serverFileUrl = pathToFileURL(serverFilePath).href;\n\n // Set HMR mode flag - this tells MCPServer.listen() to skip during imports\n // CLI manages the server lifecycle instead\n (globalThis as any).__mcpUseHmrMode = true;\n\n // Helper to import server module with cache busting\n const importServerModule = async () => {\n // Clear the global reference so we can detect if a new instance was created\n const previousServer = (globalThis as any).__mcpUseLastServer;\n (globalThis as any).__mcpUseLastServer = null;\n\n // Native dynamic import is the reload mechanism. tsx's resolver/\n // loader is registered globally above (no namespace), so TS files\n // and tsconfig `@/*` paths resolve automatically. The ?t= query\n // busts Node's module cache on every reload; transitive modules\n // also re-evaluate because their specifiers include the cache-busted\n // parent URL in the resolve chain.\n //\n // When tsx isn't available we still do native import — it'll only\n // work for JS files, which matches the old fallback behavior.\n if (!tsxLoaderActive) {\n // Unused: log already printed during register. Kept as a guard\n // so type-checkers can see the branch is intentional.\n }\n await import(`${serverFileUrl}?t=${Date.now()}`);\n\n // Get the server instance from the global registry\n // No export required - MCPServer tracks itself when created via globalThis\n const instance = (globalThis as any).__mcpUseLastServer;\n\n if (!instance) {\n // No new instance was created - restore the previous one\n (globalThis as any).__mcpUseLastServer = previousServer;\n console.warn(\n chalk.yellow(\n \"[HMR] Warning: Module re-import did not create a new MCPServer instance. \" +\n \"The module may be cached. Check that your server file creates an MCPServer.\"\n )\n );\n return null;\n }\n\n if (instance === previousServer) {\n // Same instance reference - the module was cached and not re-evaluated\n console.warn(\n chalk.yellow(\n \"[HMR] Warning: Module re-import returned the same server instance. \" +\n \"The module may not have been re-evaluated. \" +\n (!tsxLoaderActive\n ? \"Install tsx as a devDependency for reliable TypeScript HMR.\"\n : \"This may be a module cache issue.\")\n )\n );\n return null;\n }\n\n return instance;\n };\n\n // Initial import\n console.log(chalk.gray(`Loading server from ${serverFile}...`));\n let runningServer: any;\n\n try {\n runningServer = await importServerModule();\n\n if (!runningServer) {\n console.error(\n chalk.red(\n \"Error: Could not find MCPServer instance.\\n\" +\n \"Make sure your server file creates an MCPServer:\\n\" +\n \" const server = new MCPServer({ name: 'my-server', version: '1.0.0' });\"\n )\n );\n process.exit(1);\n }\n\n // Check if it has the required methods\n if (typeof runningServer.listen !== \"function\") {\n console.error(\n chalk.red(\"Error: MCPServer instance must have a listen() method\")\n );\n process.exit(1);\n }\n\n // Start the server - temporarily disable HMR flag so listen() works\n const startTime = Date.now();\n (globalThis as any).__mcpUseHmrMode = false;\n await runningServer.listen(port);\n (globalThis as any).__mcpUseHmrMode = true;\n\n // Auto-open inspector if enabled\n if (options.open !== false) {\n const browserHost = normalizeBrowserHost(host);\n const ready = await waitForServer(port, browserHost);\n if (ready) {\n const mcpEndpoint = `http://${browserHost}:${port}/mcp`;\n const autoConnectEndpoint = tunnelUrl\n ? `${tunnelUrl}/mcp`\n : mcpEndpoint;\n const inspectorUrl = `http://${browserHost}:${port}/inspector?autoConnect=${encodeURIComponent(autoConnectEndpoint)}`;\n\n const readyTime = Date.now() - startTime;\n console.log(chalk.green.bold(`✓ Ready in ${readyTime}ms`));\n console.log(\n chalk.whiteBright(`Local: http://${browserHost}:${port}`)\n );\n console.log(chalk.whiteBright(`Network: http://${host}:${port}`));\n console.log(chalk.whiteBright(`MCP: ${mcpEndpoint}`));\n if (tunnelUrl) {\n console.log(chalk.whiteBright(`Tunnel: ${tunnelUrl}/mcp`));\n }\n console.log(chalk.whiteBright(`Inspector: ${inspectorUrl}`));\n console.log(chalk.gray(`Watching for changes...\\n`));\n await open(inspectorUrl);\n }\n }\n } catch (error: any) {\n console.error(\n chalk.red(\"Failed to start server:\"),\n error?.message || error\n );\n if (error?.stack) {\n console.error(chalk.gray(error.stack));\n }\n process.exit(1);\n }\n\n // Log success when --no-open is used\n if (options.open === false) {\n const mcpEndpoint = `http://${host}:${port}/mcp`;\n console.log(chalk.green.bold(`✓ Server ready`));\n console.log(chalk.whiteBright(`Local: http://${host}:${port}`));\n console.log(chalk.whiteBright(`MCP: ${mcpEndpoint}`));\n if (tunnelUrl) {\n console.log(chalk.whiteBright(`Tunnel: ${tunnelUrl}/mcp`));\n }\n console.log(chalk.gray(`Watching for changes...\\n`));\n }\n\n // Watch for file changes - watch .ts/.tsx files in project directory\n let watcher = chokidar.watch(\".\", {\n cwd: projectPath,\n ignored: (path: string, stats?: any) => {\n // Normalize path separators for cross-platform compatibility\n const normalizedPath = path.replace(/\\\\/g, \"/\");\n\n // Ignore dotfiles and dot directories (hidden files)\n if (/(^|\\/)\\.[^/]/.test(normalizedPath)) {\n return true;\n }\n\n // Ignore node_modules directory and all its contents\n if (\n normalizedPath.includes(\"/node_modules/\") ||\n normalizedPath.endsWith(\"/node_modules\")\n ) {\n return true;\n }\n\n // Ignore dist directory and all its contents\n if (\n normalizedPath.includes(\"/dist/\") ||\n normalizedPath.endsWith(\"/dist\")\n ) {\n return true;\n }\n\n // Ignore resources directory (widgets watched separately by vite)\n if (\n normalizedPath.includes(\"/resources/\") ||\n normalizedPath.endsWith(\"/resources\")\n ) {\n return true;\n }\n\n // Ignore .d.ts files (TypeScript declaration files)\n if (stats?.isFile() && normalizedPath.endsWith(\".d.ts\")) {\n return true;\n }\n\n return false;\n },\n persistent: true,\n ignoreInitial: true,\n depth: 3, // Limit depth to avoid watching too many files\n });\n\n watcher\n .on(\"ready\", () => {\n const watched = watcher.getWatched();\n const dirs = Object.keys(watched);\n console.log(\n chalk.gray(`[HMR] Watcher ready, watching ${dirs.length} paths`)\n );\n })\n .on(\"error\", (error: unknown) => {\n console.error(\n chalk.red(\n `[HMR] Watcher error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n });\n\n // Debounce rapid changes\n let reloadTimeout: NodeJS.Timeout | null = null;\n let isReloading = false;\n\n const hmrOnChange = async (filePath: string) => {\n // Only handle .ts and .tsx files (not .d.ts)\n if (\n (!filePath.endsWith(\".ts\") && !filePath.endsWith(\".tsx\")) ||\n filePath.endsWith(\".d.ts\")\n ) {\n return;\n }\n if (isReloading) return;\n\n // Debounce multiple rapid changes\n if (reloadTimeout) {\n clearTimeout(reloadTimeout);\n }\n\n reloadTimeout = setTimeout(async () => {\n isReloading = true;\n // filePath is already relative due to cwd option\n console.log(chalk.yellow(`\\n[HMR] File changed: ${filePath}`));\n\n try {\n // Re-import the server module (this creates a new MCPServer instance)\n const newServer = await importServerModule();\n\n if (!newServer) {\n console.warn(\n chalk.yellow(\n \"[HMR] Warning: No MCPServer instance found after reload, skipping\"\n )\n );\n isReloading = false;\n return;\n }\n\n // Check if the running server has syncRegistrationsFrom\n if (typeof runningServer.syncRegistrationsFrom !== \"function\") {\n console.warn(\n chalk.yellow(\n \"[HMR] Warning: Server does not support hot reload (missing syncRegistrationsFrom)\"\n )\n );\n isReloading = false;\n return;\n }\n\n // Sync registrations from the new server to the running server\n const syncResult = runningServer.syncRegistrationsFrom(newServer);\n\n if (syncResult && syncResult.totalChanges > 0) {\n const parts: string[] = [];\n if (\n syncResult.tools.updated > 0 ||\n syncResult.tools.added > 0 ||\n syncResult.tools.removed > 0\n ) {\n const details: string[] = [];\n if (syncResult.tools.updated > 0)\n details.push(`${syncResult.tools.updated} updated`);\n if (syncResult.tools.added > 0)\n details.push(`${syncResult.tools.added} added`);\n if (syncResult.tools.removed > 0)\n details.push(`${syncResult.tools.removed} removed`);\n parts.push(`tools (${details.join(\", \")})`);\n }\n if (\n syncResult.prompts.updated > 0 ||\n syncResult.prompts.added > 0 ||\n syncResult.prompts.removed > 0\n ) {\n const details: string[] = [];\n if (syncResult.prompts.updated > 0)\n details.push(`${syncResult.prompts.updated} updated`);\n if (syncResult.prompts.added > 0)\n details.push(`${syncResult.prompts.added} added`);\n if (syncResult.prompts.removed > 0)\n details.push(`${syncResult.prompts.removed} removed`);\n parts.push(`prompts (${details.join(\", \")})`);\n }\n if (\n syncResult.resources.updated > 0 ||\n syncResult.resources.added > 0 ||\n syncResult.resources.removed > 0\n ) {\n const details: string[] = [];\n if (syncResult.resources.updated > 0)\n details.push(`${syncResult.resources.updated} updated`);\n if (syncResult.resources.added > 0)\n details.push(`${syncResult.resources.added} added`);\n if (syncResult.resources.removed > 0)\n details.push(`${syncResult.resources.removed} removed`);\n parts.push(`resources (${details.join(\", \")})`);\n }\n console.log(chalk.green(`[HMR] ✓ Reloaded: ${parts.join(\", \")}`));\n } else {\n console.log(\n chalk.gray(\n `[HMR] No changes detected (${runningServer.registeredTools?.length || 0} tools, ` +\n `${runningServer.registeredPrompts?.length || 0} prompts, ` +\n `${runningServer.registeredResources?.length || 0} resources registered)`\n )\n );\n }\n } catch (error: any) {\n console.error(chalk.red(`[HMR] Reload failed: ${error.message}`));\n // Keep running with old registrations\n }\n\n isReloading = false;\n }, 100);\n };\n watcher.on(\"change\", hmrOnChange);\n\n // Expose project path so tunnel.ts can read the manifest for subdomain reuse\n process.env.MCP_USE_PROJECT_PATH = projectPath;\n\n // Expose in-process restart hook for the inspector tunnel toggle.\n // Tears down the running server and re-sets up everything as if\n // `mcp-use dev` was called with or without --tunnel.\n (globalThis as any).__mcpUseDevRestart = async (withTunnel: boolean) => {\n console.log(\n chalk.yellow(\n `\\n[DEV] Restarting ${withTunnel ? \"with\" : \"without\"} tunnel…`\n )\n );\n\n // Suppress noise from in-flight requests terminated during teardown\n const origStderrWrite = process.stderr.write.bind(process.stderr);\n const stderrFilter = (chunk: any, ...args: any[]) => {\n const str =\n typeof chunk === \"string\" ? chunk : (chunk?.toString?.() ?? \"\");\n if (\n str.includes(\"TypeError: terminated\") ||\n str.includes(\"SocketError\") ||\n str.includes(\"UND_ERR_SOCKET\")\n ) {\n return true;\n }\n return origStderrWrite(chunk, ...args);\n };\n process.stderr.write = stderrFilter as typeof process.stderr.write;\n\n // 1. Tear down\n watcher.close();\n if (tunnelProcess && typeof tunnelProcess.kill === \"function\") {\n if (typeof (tunnelProcess as any).markShutdown === \"function\") {\n (tunnelProcess as any).markShutdown();\n }\n const dyingProc = tunnelProcess;\n tunnelProcess = undefined;\n dyingProc.kill(\"SIGINT\");\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n try {\n dyingProc.kill(\"SIGKILL\");\n } catch {\n /* ignore */\n }\n resolve();\n }, 5000);\n dyingProc.on(\"exit\", () => {\n clearTimeout(timeout);\n resolve();\n });\n });\n }\n if (tunnelSubdomain) {\n const apiBase =\n process.env.MCP_USE_API || \"https://local.mcp-use.run\";\n try {\n await fetch(`${apiBase}/api/tunnels/${tunnelSubdomain}`, {\n method: \"DELETE\",\n });\n } catch {\n /* ignore */\n }\n tunnelSubdomain = undefined;\n }\n if (runningServer && typeof runningServer.forceClose === \"function\") {\n await runningServer.forceClose();\n } else if (runningServer && typeof runningServer.close === \"function\") {\n await runningServer.close();\n }\n\n // 2. Start tunnel if requested\n tunnelUrl = undefined;\n if (withTunnel) {\n const manifestPath = path.join(projectPath, \"dist\", \"mcp-use.json\");\n let existingSubdomain: string | undefined;\n try {\n const manifestContent = await readFile(manifestPath, \"utf-8\");\n const manifest = JSON.parse(manifestContent);\n existingSubdomain = manifest.tunnel?.subdomain;\n if (existingSubdomain) {\n const apiBase =\n process.env.MCP_USE_API || \"https://local.mcp-use.run\";\n try {\n await fetch(`${apiBase}/api/tunnels/${existingSubdomain}`, {\n method: \"DELETE\",\n });\n } catch {\n /* ignore */\n }\n }\n } catch {\n /* ignore */\n }\n let tunnelInfo: Awaited<ReturnType<typeof startTunnel>>;\n try {\n tunnelInfo = await startTunnel(port, existingSubdomain);\n } catch {\n if (existingSubdomain) {\n console.log(\n chalk.yellow(\n `Subdomain \"${existingSubdomain}\" unavailable, requesting a new one…`\n )\n );\n tunnelInfo = await startTunnel(port);\n } else {\n throw new Error(\"Failed to start tunnel\");\n }\n }\n tunnelUrl = tunnelInfo.url;\n tunnelProcess = tunnelInfo.process;\n tunnelSubdomain = tunnelInfo.subdomain;\n process.env.MCP_URL = tunnelUrl;\n\n // Persist subdomain\n try {\n const mPath = path.join(projectPath, \"dist\", \"mcp-use.json\");\n let manifest: any = {};\n try {\n manifest = JSON.parse(await readFile(mPath, \"utf-8\"));\n } catch {\n /* ignore */\n }\n if (!manifest.tunnel) manifest.tunnel = {};\n manifest.tunnel.subdomain = tunnelSubdomain;\n await mkdir(path.dirname(mPath), { recursive: true });\n await writeFile(mPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n } catch {\n /* ignore */\n }\n } else {\n process.env.MCP_URL = `http://${host}:${port}`;\n }\n\n // 3. Re-import server module (HMR mode stays true so user's listen() is a no-op)\n console.log(chalk.gray(`Loading server from ${serverFile}...`));\n runningServer = await importServerModule();\n if (!runningServer) {\n console.error(\n chalk.red(\"Error: Could not find MCPServer instance after restart.\")\n );\n return;\n }\n // Temporarily disable HMR flag so our listen() actually starts the server\n (globalThis as any).__mcpUseHmrMode = false;\n await runningServer.listen(port);\n (globalThis as any).__mcpUseHmrMode = true;\n\n const browserHost = normalizeBrowserHost(host);\n const mcpEndpoint = `http://${browserHost}:${port}/mcp`;\n const autoConnectEndpoint = tunnelUrl\n ? `${tunnelUrl}/mcp`\n : mcpEndpoint;\n console.log(chalk.green.bold(`✓ Restarted`));\n console.log(chalk.whiteBright(`MCP: ${mcpEndpoint}`));\n if (tunnelUrl) {\n console.log(chalk.whiteBright(`Tunnel: ${tunnelUrl}/mcp`));\n }\n console.log(\n chalk.whiteBright(\n `Inspector: http://${browserHost}:${port}/inspector?autoConnect=${encodeURIComponent(autoConnectEndpoint)}`\n )\n );\n console.log(chalk.gray(`Watching for changes...\\n`));\n\n // 4. Re-create watcher (reuses same config)\n watcher = chokidar.watch(\".\", {\n cwd: projectPath,\n ignored: (p: string, stats?: any) => {\n const np = p.replace(/\\\\/g, \"/\");\n if (/(^|\\/)\\.[^/]/.test(np)) return true;\n if (np.includes(\"/node_modules/\") || np.endsWith(\"/node_modules\"))\n return true;\n if (np.includes(\"/dist/\") || np.endsWith(\"/dist\")) return true;\n if (np.includes(\"/resources/\") || np.endsWith(\"/resources\"))\n return true;\n if (stats?.isFile() && np.endsWith(\".d.ts\")) return true;\n return false;\n },\n persistent: true,\n ignoreInitial: true,\n depth: 3,\n });\n watcher\n .on(\"ready\", () => console.log(chalk.gray(`[HMR] Watcher ready`)))\n .on(\"error\", (err: unknown) =>\n console.error(\n chalk.red(\n `[HMR] Watcher error: ${err instanceof Error ? err.message : String(err)}`\n )\n )\n )\n .on(\"change\", hmrOnChange);\n\n // Restore stderr once the new server is stable\n setTimeout(() => {\n process.stderr.write = origStderrWrite;\n }, 2000);\n };\n\n // Handle cleanup\n let hmrCleanupInProgress = false;\n const cleanup = async () => {\n if (hmrCleanupInProgress) return;\n hmrCleanupInProgress = true;\n\n console.log(chalk.gray(\"\\n\\nShutting down...\"));\n watcher.close();\n\n if (\n tunnelProcess &&\n typeof (tunnelProcess as any).markShutdown === \"function\"\n ) {\n (tunnelProcess as any).markShutdown();\n }\n\n if (tunnelSubdomain) {\n try {\n const apiBase =\n process.env.MCP_USE_API || \"https://local.mcp-use.run\";\n await fetch(`${apiBase}/api/tunnels/${tunnelSubdomain}`, {\n method: \"DELETE\",\n });\n } catch {\n // Ignore cleanup errors\n }\n }\n\n if (tunnelProcess && typeof tunnelProcess.kill === \"function\") {\n tunnelProcess.kill(\"SIGINT\");\n setTimeout(() => process.exit(0), 2000);\n } else {\n process.exit(0);\n }\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n // Keep the process running\n await new Promise(() => {});\n } catch (error) {\n console.error(chalk.red(\"Dev mode failed:\"), error);\n process.exit(1);\n }\n });\n\nprogram\n .command(\"start\")\n .description(\"Start production server\")\n .option(\"-p, --path <path>\", \"Path to project directory\", process.cwd())\n .option(\n \"--entry <file>\",\n \"Path to MCP server entry file (relative to project)\"\n )\n .option(\n \"--mcp-dir <dir>\",\n \"Folder holding the MCP entry + resources (e.g. 'src/mcp' for Next.js apps)\"\n )\n .option(\"--port <port>\", \"Server port\", \"3000\")\n .option(\"--tunnel\", \"Expose server through a tunnel\")\n .action(async (options) => {\n try {\n const projectPath = path.resolve(options.path);\n // Priority: --port flag > process.env.PORT > default\n // Check if --port or -p was explicitly provided in command line\n const portFlagProvided =\n process.argv.includes(\"--port\") ||\n process.argv.includes(\"-p\") ||\n process.argv.some((arg) => arg.startsWith(\"--port=\")) ||\n process.argv.some((arg) => arg.startsWith(\"-p=\"));\n\n let port = portFlagProvided\n ? parseInt(options.port, 10) // Flag explicitly provided, use it\n : parseInt(process.env.PORT || options.port || \"3000\", 10); // Check env, then default\n\n // Check if port is available, find alternative if needed\n if (!(await isPortAvailable(port))) {\n console.log(chalk.yellow.bold(`⚠️ Port ${port} is already in use`));\n const availablePort = await findAvailablePort(port);\n console.log(chalk.green.bold(`✓ Using port ${availablePort} instead`));\n port = availablePort;\n }\n\n console.log(\n `\\x1b[36m\\x1b[1mmcp-use\\x1b[0m \\x1b[90mVersion: ${packageJson.version}\\x1b[0m\\n`\n );\n\n // Start tunnel if requested\n let mcpUrl: string | undefined;\n let tunnelProcess: any = undefined;\n let tunnelSubdomain: string | undefined = undefined;\n if (options.tunnel) {\n try {\n // Read existing subdomain from mcp-use.json if available\n const manifestPath = path.join(projectPath, \"dist\", \"mcp-use.json\");\n let existingSubdomain: string | undefined;\n\n try {\n const manifestContent = await readFile(manifestPath, \"utf-8\");\n const manifest = JSON.parse(manifestContent);\n existingSubdomain = manifest.tunnel?.subdomain;\n if (existingSubdomain) {\n console.log(\n chalk.gray(`Found existing subdomain: ${existingSubdomain}`)\n );\n // Release the stale subdomain so the first attempt can reclaim it\n const apiBase =\n process.env.MCP_USE_API || \"https://local.mcp-use.run\";\n try {\n await fetch(`${apiBase}/api/tunnels/${existingSubdomain}`, {\n method: \"DELETE\",\n });\n } catch {\n // Best-effort cleanup; ignore DELETE failures\n }\n }\n } catch (error) {\n // Manifest doesn't exist or is invalid, that's okay\n console.debug(\n chalk.gray(\n `Debug: Failed to read or parse mcp-use.json: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n\n let tunnelInfo: Awaited<ReturnType<typeof startTunnel>>;\n try {\n tunnelInfo = await startTunnel(port, existingSubdomain);\n } catch (e) {\n if (existingSubdomain) {\n console.log(\n chalk.yellow(\n `Subdomain \"${existingSubdomain}\" unavailable, requesting a new one…`\n )\n );\n tunnelInfo = await startTunnel(port);\n } else {\n throw e;\n }\n }\n mcpUrl = tunnelInfo.url;\n tunnelProcess = tunnelInfo.process;\n const subdomain = tunnelInfo.subdomain;\n tunnelSubdomain = subdomain;\n\n // Update mcp-use.json with the subdomain\n try {\n let manifest: any = {};\n try {\n const manifestContent = await readFile(manifestPath, \"utf-8\");\n manifest = JSON.parse(manifestContent);\n } catch {\n // File doesn't exist, create new manifest\n }\n\n // Update or add tunnel subdomain\n if (!manifest.tunnel) {\n manifest.tunnel = {};\n }\n manifest.tunnel.subdomain = subdomain;\n\n // Ensure dist directory exists\n await mkdir(path.dirname(manifestPath), { recursive: true });\n\n // Write updated manifest\n await writeFile(\n manifestPath,\n JSON.stringify(manifest, null, 2),\n \"utf-8\"\n );\n } catch (error) {\n console.warn(\n chalk.yellow(\n `⚠️ Failed to save subdomain to mcp-use.json: ${error instanceof Error ? error.message : \"Unknown error\"}`\n )\n );\n }\n } catch (error) {\n console.error(chalk.red(\"Failed to start tunnel:\"), error);\n process.exit(1);\n }\n }\n\n // Find the built server file\n // First try to read from manifest (set during build)\n let serverFile: string | undefined;\n const manifestPath = path.join(projectPath, \"dist\", \"mcp-use.json\");\n\n try {\n const manifestContent = await readFile(manifestPath, \"utf-8\");\n const manifest = JSON.parse(manifestContent);\n if (manifest.entryPoint) {\n // Verify the entry point exists\n await access(path.join(projectPath, manifest.entryPoint));\n serverFile = manifest.entryPoint;\n }\n } catch {\n // Manifest doesn't exist or entryPoint not set, fall back to searching\n }\n\n // Fall back to checking common locations if manifest didn't help\n if (!serverFile) {\n // Resolve mcpDir from CLI flag so `--mcp-dir src/mcp` finds the\n // entry at dist/src/mcp/index.js (legacy transpile mode) or the TS\n // source at src/mcp/index.ts (drop-in mode — `build` skips transpile\n // and `start` runs the source via tsx).\n const startMcpDir = options.mcpDir as string | undefined;\n\n const serverCandidates = [\n ...(startMcpDir\n ? [\n `${startMcpDir}/index.ts`,\n `${startMcpDir}/index.tsx`,\n `dist/${startMcpDir}/index.js`,\n `dist/${startMcpDir}/server.js`,\n ]\n : []),\n \"dist/index.js\",\n \"dist/server.js\",\n \"dist/src/index.js\",\n \"dist/src/server.js\",\n ];\n\n for (const candidate of serverCandidates) {\n try {\n await access(path.join(projectPath, candidate));\n serverFile = candidate;\n break;\n } catch {\n continue;\n }\n }\n }\n\n if (!serverFile) {\n console.error(\n chalk.red(\n `No built server file found. Run 'mcp-use build' first.\\n\\nLooked for:\\n - dist/mcp-use.json (manifest with entryPoint)\\n - dist/index.js\\n - dist/server.js\\n - dist/src/index.js\\n - dist/src/server.js`\n )\n );\n process.exit(1);\n }\n\n console.log(\"Starting production server...\");\n\n // Detect Next.js projects the same way `dev` does: when `next` is in\n // the user's package.json, install the server-runtime shims so any\n // transitive `server-only` / `next/cache` / `next/headers` imports\n // resolve to inert stubs instead of throwing, and load the Next.js\n // env-file cascade so tools find the env vars they expect.\n const isNextJsProject = await detectNextJsProject(projectPath);\n if (isNextJsProject) {\n console.log(\n chalk.gray(\n \"Next.js detected — installing server-runtime shims for the production server\"\n )\n );\n await loadNextJsEnvFiles(projectPath);\n }\n\n const baseEnv: NodeJS.ProcessEnv = {\n ...process.env,\n PORT: String(port),\n NODE_ENV: \"production\",\n };\n\n if (mcpUrl) {\n baseEnv.MCP_URL = mcpUrl;\n console.log(chalk.whiteBright(`Tunnel: ${mcpUrl}/mcp`));\n } else if (!baseEnv.MCP_URL) {\n baseEnv.MCP_URL = `http://localhost:${port}`;\n }\n const env = isNextJsProject ? withNextShimsEnv(baseEnv) : baseEnv;\n\n // If the recorded entry is a TypeScript source (the --mcp-dir mode,\n // where `build` deliberately skips full-project transpilation), run\n // it through tsx. Otherwise the legacy path of `node dist/index.js`.\n const isTsEntry = /\\.(ts|tsx|mts|cts)$/.test(serverFile);\n let spawnCmd = \"node\";\n let spawnArgs: string[] = [serverFile];\n if (isTsEntry) {\n try {\n const projectRequire = createRequire(\n path.join(projectPath, \"package.json\")\n );\n const tsxPkgPath = projectRequire.resolve(\"tsx/package.json\");\n const tsxPkg = JSON.parse(await readFile(tsxPkgPath, \"utf-8\"));\n const binField =\n typeof tsxPkg.bin === \"string\"\n ? tsxPkg.bin\n : (tsxPkg.bin?.tsx ?? Object.values(tsxPkg.bin ?? {})[0]);\n if (!binField) throw new Error(\"tsx bin entry not found\");\n const tsxBin = path.resolve(path.dirname(tsxPkgPath), binField);\n spawnCmd = \"node\";\n spawnArgs = [tsxBin, serverFile];\n } catch (error) {\n console.log(\n chalk.yellow(\n `Could not resolve local tsx (${error instanceof Error ? error.message : String(error)}); falling back to npx`\n )\n );\n spawnCmd = \"npx\";\n spawnArgs = [\"tsx\", serverFile];\n }\n }\n\n const serverProc = spawn(spawnCmd, spawnArgs, {\n cwd: projectPath,\n stdio: \"inherit\",\n env,\n });\n\n // Handle cleanup\n let cleanupInProgress = false;\n const cleanup = async () => {\n if (cleanupInProgress) {\n return; // Prevent double cleanup\n }\n cleanupInProgress = true;\n\n console.log(chalk.gray(\"\\n\\nShutting down...\"));\n\n // Mark tunnel as shutting down to suppress output\n if (\n tunnelProcess &&\n typeof (tunnelProcess as any).markShutdown === \"function\"\n ) {\n (tunnelProcess as any).markShutdown();\n }\n\n // Clean up tunnel via API if subdomain is available\n if (tunnelSubdomain) {\n try {\n const apiBase =\n process.env.MCP_USE_API || \"https://local.mcp-use.run\";\n await fetch(`${apiBase}/api/tunnels/${tunnelSubdomain}`, {\n method: \"DELETE\",\n });\n } catch (err) {\n // Ignore cleanup errors\n }\n }\n\n const processesToKill = 1 + (tunnelProcess ? 1 : 0);\n let killedCount = 0;\n\n const checkAndExit = () => {\n killedCount++;\n if (killedCount >= processesToKill) {\n process.exit(0);\n }\n };\n\n // Handle server process\n serverProc.on(\"exit\", checkAndExit);\n serverProc.kill(\"SIGTERM\");\n\n // Handle tunnel process if it exists\n if (tunnelProcess && typeof tunnelProcess.kill === \"function\") {\n tunnelProcess.on(\"exit\", checkAndExit);\n // Use SIGINT for better cleanup of npx/node processes\n tunnelProcess.kill(\"SIGINT\");\n } else {\n checkAndExit();\n }\n\n // Fallback timeout in case processes don't exit\n setTimeout(() => {\n if (serverProc.exitCode === null) {\n serverProc.kill(\"SIGKILL\");\n }\n if (tunnelProcess && tunnelProcess.exitCode === null) {\n tunnelProcess.kill(\"SIGKILL\");\n }\n process.exit(0);\n }, 2000); // Increase timeout to 2 seconds to allow graceful shutdown\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n serverProc.on(\"exit\", async (code) => {\n // Server exited - cleanup tunnel before exiting CLI\n if (!cleanupInProgress) {\n await cleanup();\n }\n process.exit(code || 0);\n });\n } catch (error) {\n console.error(\"Start failed:\", error);\n process.exit(1);\n }\n });\n\n// Authentication commands\nprogram\n .command(\"login\")\n .description(\"Login to Manufact cloud\")\n .option(\n \"--api-key <key>\",\n \"Login with an API key directly (non-interactive, for CI/CD)\"\n )\n .option(\"--org <slug|id|name>\", \"Select an organization non-interactively\")\n .action(async (opts: { apiKey?: string; org?: string }) => {\n try {\n await loginCommand({ apiKey: opts.apiKey, org: opts.org });\n process.exit(0);\n } catch (error) {\n console.error(\n chalk.red.bold(\"\\n✗ Login failed:\"),\n chalk.red(error instanceof Error ? error.message : \"Unknown error\")\n );\n process.exit(1);\n }\n });\n\nprogram\n .command(\"logout\")\n .description(\"Logout from Manufact cloud\")\n .action(async () => {\n await logoutCommand();\n });\n\nprogram\n .command(\"whoami\")\n .description(\"Show current user information\")\n .action(async () => {\n await whoamiCommand();\n });\n\n// Organization commands\nconst orgCommand = program.command(\"org\").description(\"Manage organizations\");\n\norgCommand\n .command(\"list\")\n .description(\"List your organizations\")\n .action(async () => {\n await orgListCommand();\n });\n\norgCommand\n .command(\"switch\")\n .description(\"Switch the active organization\")\n .action(async () => {\n await orgSwitchCommand();\n });\n\norgCommand\n .command(\"current\")\n .description(\"Show the currently active organization\")\n .action(async () => {\n await orgCurrentCommand();\n });\n\n// Deployment command\nprogram\n .command(\"deploy\")\n .description(\"Deploy MCP server from GitHub to Manufact cloud\")\n .option(\"--open\", \"Open deployment in browser after successful deploy\")\n .option(\"--name <name>\", \"Custom deployment name\")\n .option(\"--port <port>\", \"Server port\", \"3000\")\n .option(\"--runtime <runtime>\", \"Runtime (node or python)\")\n .option(\n \"--new\",\n \"Force creation of new deployment instead of reusing linked deployment\"\n )\n .option(\n \"--env <key=value...>\",\n \"Environment variables (can be used multiple times)\"\n )\n .option(\"--env-file <path>\", \"Path to .env file with environment variables\")\n .option(\n \"--root-dir <path>\",\n \"Root directory within repo to deploy from (for monorepos)\"\n )\n .option(\n \"--org <slug-or-id>\",\n \"Deploy to a specific organization (by slug or ID)\"\n )\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"--region <region>\", \"Deploy region: US, EU, or APAC (default: US)\")\n .option(\n \"--build-command <cmd>\",\n \"Custom build command (overrides auto-detection)\"\n )\n .option(\n \"--start-command <cmd>\",\n \"Custom start command (overrides auto-detection)\"\n )\n .action(async (options) => {\n await deployCommand({\n open: options.open,\n name: options.name,\n port: options.port ? parseInt(options.port, 10) : undefined,\n runtime: options.runtime,\n new: options.new,\n env: options.env,\n envFile: options.envFile,\n rootDir: options.rootDir,\n org: options.org,\n yes: options.yes,\n region: options.region,\n buildCommand: options.buildCommand,\n startCommand: options.startCommand,\n });\n });\n\n// Client command. The screenshot subcommand lives under `client`:\n// - `mcp-use client screenshot --mcp <url>` for ad-hoc/programmatic use\n// - `mcp-use client <name> screenshot` for saved servers (uses their auth)\nprogram.addCommand(createClientCommand());\n\n// Deployments command\nprogram.addCommand(createDeploymentsCommand());\n\n// Servers command\nprogram.addCommand(createServersCommand());\n\n// Skills command\nprogram.addCommand(createSkillsCommand());\n\n// Generate types command\nprogram\n .command(\"generate-types\")\n .description(\n \"Generate TypeScript type definitions for tools (writes .mcp-use/tool-registry.d.ts)\"\n )\n .option(\"-p, --path <path>\", \"Path to project directory\", process.cwd())\n .option(\"--server <file>\", \"Server entry file\", \"index.ts\")\n .action(async (options) => {\n const projectPath = path.resolve(options.path);\n\n try {\n console.log(chalk.blue(\"Generating tool registry types...\"));\n const result = await generateToolRegistryTypesForServer(\n projectPath,\n options.server\n );\n if (result === \"ok\") {\n console.log(\n chalk.green(\"✓ Tool registry types generated successfully\")\n );\n } else if (result === \"failed\") {\n console.log(chalk.yellow(\"⚠ Tool registry type generation had errors\"));\n }\n // \"skipped\" already logged its own warning inside the function.\n process.exit(0);\n } catch (error) {\n console.error(\n chalk.red(\"Failed to generate types:\"),\n error instanceof Error ? error.message : String(error)\n );\n if (error instanceof Error && error.stack) {\n console.error(chalk.gray(error.stack));\n }\n process.exit(1);\n }\n });\n\nprogram.hook(\"preAction\", async (_thisCommand, actionCommand) => {\n const projectPath = actionCommand.opts().path as string | undefined;\n await notifyIfUpdateAvailable(projectPath);\n});\n\n/**\n * Per-server routing for `mcp-use client <name> ...`.\n *\n * Commander doesn't natively dispatch on a dynamic positional that precedes a\n * subcommand group. So we intercept here: if the token after `client` isn't a\n * reserved subcommand (`connect`, `list`, `help`) or a flag, treat it as a\n * saved-server name and parse the remainder against a per-server command tree.\n */\nconst argv = process.argv;\n// `client` is only valid as a subcommand at argv[2] (node + script + first\n// user token). Don't use `indexOf`, since the literal string \"client\" can\n// also appear later in argv as someone's argument value.\nconst clientIdx = argv[2] === \"client\" ? 2 : -1;\nconst perClientName =\n clientIdx !== -1 &&\n argv.length > clientIdx + 1 &&\n !argv[clientIdx + 1].startsWith(\"-\") &&\n !RESERVED_CLIENT_SUBCOMMANDS.has(argv[clientIdx + 1])\n ? argv[clientIdx + 1]\n : null;\n\nif (perClientName) {\n // Catch a common mistake: user typed `mcp-use client tools call X` and\n // forgot the server name. Commander would otherwise route this as if\n // \"tools\" were the server name and complain about an unknown command.\n if (PER_CLIENT_SCOPES.has(perClientName)) {\n const rest = argv.slice(clientIdx + 1).join(\" \");\n console.error(formatError(\"Missing server name.\"));\n console.error(\"\");\n console.error(\n `'${perClientName}' is a per-server subcommand, not a server name. ` +\n `Address it through a saved server:`\n );\n console.error(\"\");\n console.error(` mcp-use client <name> ${rest}`);\n console.error(\"\");\n console.error(\"See your saved servers with:\");\n console.error(\" mcp-use client list\");\n process.exit(1);\n }\n\n const rest = argv.slice(clientIdx + 2);\n // Bare `mcp-use client <name>` (or with `--help`/`-h`) defaults to\n // commander's help for the per-server tree. That help is only useful when\n // the server actually exists — for an unknown name it leaks the subcommand\n // surface instead of telling the user how to save the server. Intercept\n // the no-subcommand path and check existence first.\n const isHelpOnly =\n rest.length === 0 ||\n (rest.length === 1 && (rest[0] === \"--help\" || rest[0] === \"-h\"));\n\n (async () => {\n if (isHelpOnly) {\n const config = await getSession(perClientName);\n if (!config) {\n console.error(formatError(`Server '${perClientName}' not found.`));\n console.error(\"\");\n console.error(\"Connect to an MCP server and save it under this name:\");\n console.error(` mcp-use client connect ${perClientName} <url>`);\n console.error(\"\");\n console.error(\"See your saved servers with:\");\n console.error(\" mcp-use client list\");\n process.exit(1);\n }\n }\n await createPerClientCommand(perClientName).parseAsync(rest, {\n from: \"user\",\n });\n })().catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n console.error(formatError(message));\n process.exit(1);\n });\n} else {\n program.parse();\n}\n","import process from 'node:process';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport childProcess from 'node:child_process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport {\n\tisWsl,\n\tpowerShellPath,\n\tconvertWslPathToWindows,\n\tcanAccessPowerShell,\n\twslDefaultBrowser,\n} from 'wsl-utils';\nimport {executePowerShell} from 'powershell-utils';\nimport defineLazyProperty from 'define-lazy-prop';\nimport defaultBrowser, {_windowsBrowserProgIdMap} from 'default-browser';\nimport isInsideContainer from 'is-inside-container';\nimport isInSsh from 'is-in-ssh';\n\nconst fallbackAttemptSymbol = Symbol('fallbackAttempt');\n\n// Path to included `xdg-open`.\nconst __dirname = import.meta.url ? path.dirname(fileURLToPath(import.meta.url)) : '';\nconst localXdgOpenPath = path.join(__dirname, 'xdg-open');\n\nconst {platform, arch} = process;\n\nconst tryEachApp = async (apps, opener) => {\n\tif (apps.length === 0) {\n\t\t// No app was provided\n\t\treturn;\n\t}\n\n\tconst errors = [];\n\n\tfor (const app of apps) {\n\t\ttry {\n\t\t\treturn await opener(app); // eslint-disable-line no-await-in-loop\n\t\t} catch (error) {\n\t\t\terrors.push(error);\n\t\t}\n\t}\n\n\tthrow new AggregateError(errors, 'Failed to open in all supported apps');\n};\n\n// eslint-disable-next-line complexity\nconst baseOpen = async options => {\n\toptions = {\n\t\twait: false,\n\t\tbackground: false,\n\t\tnewInstance: false,\n\t\tallowNonzeroExitCode: false,\n\t\t...options,\n\t};\n\n\tconst isFallbackAttempt = options[fallbackAttemptSymbol] === true;\n\tdelete options[fallbackAttemptSymbol];\n\n\tif (Array.isArray(options.app)) {\n\t\treturn tryEachApp(options.app, singleApp => baseOpen({\n\t\t\t...options,\n\t\t\tapp: singleApp,\n\t\t\t[fallbackAttemptSymbol]: true,\n\t\t}));\n\t}\n\n\tlet {name: app, arguments: appArguments = []} = options.app ?? {};\n\tappArguments = [...appArguments];\n\n\tif (Array.isArray(app)) {\n\t\treturn tryEachApp(app, appName => baseOpen({\n\t\t\t...options,\n\t\t\tapp: {\n\t\t\t\tname: appName,\n\t\t\t\targuments: appArguments,\n\t\t\t},\n\t\t\t[fallbackAttemptSymbol]: true,\n\t\t}));\n\t}\n\n\tif (app === 'browser' || app === 'browserPrivate') {\n\t\t// IDs from default-browser for macOS and windows are the same.\n\t\t// IDs are lowercased to increase chances of a match.\n\t\tconst ids = {\n\t\t\t'com.google.chrome': 'chrome',\n\t\t\t'google-chrome.desktop': 'chrome',\n\t\t\t'com.brave.browser': 'brave',\n\t\t\t'org.mozilla.firefox': 'firefox',\n\t\t\t'firefox.desktop': 'firefox',\n\t\t\t'com.microsoft.msedge': 'edge',\n\t\t\t'com.microsoft.edge': 'edge',\n\t\t\t'com.microsoft.edgemac': 'edge',\n\t\t\t'microsoft-edge.desktop': 'edge',\n\t\t\t'com.apple.safari': 'safari',\n\t\t};\n\n\t\t// Incognito flags for each browser in `apps`.\n\t\tconst flags = {\n\t\t\tchrome: '--incognito',\n\t\t\tbrave: '--incognito',\n\t\t\tfirefox: '--private-window',\n\t\t\tedge: '--inPrivate',\n\t\t\t// Safari doesn't support private mode via command line\n\t\t};\n\n\t\tlet browser;\n\t\tif (isWsl) {\n\t\t\tconst progId = await wslDefaultBrowser();\n\t\t\tconst browserInfo = _windowsBrowserProgIdMap.get(progId);\n\t\t\tbrowser = browserInfo ?? {};\n\t\t} else {\n\t\t\tbrowser = await defaultBrowser();\n\t\t}\n\n\t\tif (browser.id in ids) {\n\t\t\tconst browserName = ids[browser.id.toLowerCase()];\n\n\t\t\tif (app === 'browserPrivate') {\n\t\t\t\t// Safari doesn't support private mode via command line\n\t\t\t\tif (browserName === 'safari') {\n\t\t\t\t\tthrow new Error('Safari doesn\\'t support opening in private mode via command line');\n\t\t\t\t}\n\n\t\t\t\tappArguments.push(flags[browserName]);\n\t\t\t}\n\n\t\t\treturn baseOpen({\n\t\t\t\t...options,\n\t\t\t\tapp: {\n\t\t\t\t\tname: apps[browserName],\n\t\t\t\t\targuments: appArguments,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tthrow new Error(`${browser.name} is not supported as a default browser`);\n\t}\n\n\tlet command;\n\tconst cliArguments = [];\n\tconst childProcessOptions = {};\n\n\t// Determine if we should use Windows/PowerShell behavior in WSL.\n\t// We only use Windows integration if PowerShell is actually accessible.\n\t// This allows the package to work in sandboxed WSL environments where Windows access is restricted.\n\tlet shouldUseWindowsInWsl = false;\n\tif (isWsl && !isInsideContainer() && !isInSsh && !app) {\n\t\tshouldUseWindowsInWsl = await canAccessPowerShell();\n\t}\n\n\tif (platform === 'darwin') {\n\t\tcommand = 'open';\n\n\t\tif (options.wait) {\n\t\t\tcliArguments.push('--wait-apps');\n\t\t}\n\n\t\tif (options.background) {\n\t\t\tcliArguments.push('--background');\n\t\t}\n\n\t\tif (options.newInstance) {\n\t\t\tcliArguments.push('--new');\n\t\t}\n\n\t\tif (app) {\n\t\t\tcliArguments.push('-a', app);\n\t\t}\n\t} else if (platform === 'win32' || shouldUseWindowsInWsl) {\n\t\tcommand = await powerShellPath();\n\n\t\tcliArguments.push(...executePowerShell.argumentsPrefix);\n\n\t\tif (!isWsl) {\n\t\t\tchildProcessOptions.windowsVerbatimArguments = true;\n\t\t}\n\n\t\t// Convert WSL Linux paths to Windows paths\n\t\tif (isWsl && options.target) {\n\t\t\toptions.target = await convertWslPathToWindows(options.target);\n\t\t}\n\n\t\t// Suppress PowerShell progress messages that are written to stderr\n\t\tconst encodedArguments = ['$ProgressPreference = \\'SilentlyContinue\\';', 'Start'];\n\n\t\tif (options.wait) {\n\t\t\tencodedArguments.push('-Wait');\n\t\t}\n\n\t\tif (app) {\n\t\t\tencodedArguments.push(executePowerShell.escapeArgument(app));\n\t\t\tif (options.target) {\n\t\t\t\tappArguments.push(options.target);\n\t\t\t}\n\t\t} else if (options.target) {\n\t\t\tencodedArguments.push(executePowerShell.escapeArgument(options.target));\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tappArguments = appArguments.map(argument => executePowerShell.escapeArgument(argument));\n\t\t\tencodedArguments.push('-ArgumentList', appArguments.join(','));\n\t\t}\n\n\t\t// Using Base64-encoded command, accepted by PowerShell, to allow special characters.\n\t\toptions.target = executePowerShell.encodeCommand(encodedArguments.join(' '));\n\n\t\tif (!options.wait) {\n\t\t\t// PowerShell will keep the parent process alive unless stdio is ignored.\n\t\t\tchildProcessOptions.stdio = 'ignore';\n\t\t}\n\t} else {\n\t\tif (app) {\n\t\t\tcommand = app;\n\t\t} else {\n\t\t\t// When bundled by Webpack, there's no actual package file path and no local `xdg-open`.\n\t\t\tconst isBundled = !__dirname || __dirname === '/';\n\n\t\t\t// Check if local `xdg-open` exists and is executable.\n\t\t\tlet exeLocalXdgOpen = false;\n\t\t\ttry {\n\t\t\t\tawait fs.access(localXdgOpenPath, fsConstants.X_OK);\n\t\t\t\texeLocalXdgOpen = true;\n\t\t\t} catch {}\n\n\t\t\tconst useSystemXdgOpen = process.versions.electron\n\t\t\t\t?? (platform === 'android' || isBundled || !exeLocalXdgOpen);\n\t\t\tcommand = useSystemXdgOpen ? 'xdg-open' : localXdgOpenPath;\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tcliArguments.push(...appArguments);\n\t\t}\n\n\t\tif (!options.wait) {\n\t\t\t// `xdg-open` will block the process unless stdio is ignored\n\t\t\t// and it's detached from the parent even if it's unref'd.\n\t\t\tchildProcessOptions.stdio = 'ignore';\n\t\t\tchildProcessOptions.detached = true;\n\t\t}\n\t}\n\n\tif (platform === 'darwin' && appArguments.length > 0) {\n\t\tcliArguments.push('--args', ...appArguments);\n\t}\n\n\t// IMPORTANT: On macOS, the target MUST come AFTER '--args'.\n\t// When using --args, ALL following arguments are passed to the app.\n\t// Example: open -a \"chrome\" --args --incognito https://site.com\n\t// This passes BOTH --incognito AND https://site.com to Chrome.\n\t// Without this order, Chrome won't open in incognito. See #332.\n\tif (options.target) {\n\t\tcliArguments.push(options.target);\n\t}\n\n\tconst subprocess = childProcess.spawn(command, cliArguments, childProcessOptions);\n\n\tif (options.wait) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsubprocess.once('error', reject);\n\n\t\t\tsubprocess.once('close', exitCode => {\n\t\t\t\tif (!options.allowNonzeroExitCode && exitCode !== 0) {\n\t\t\t\t\treject(new Error(`Exited with code ${exitCode}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresolve(subprocess);\n\t\t\t});\n\t\t});\n\t}\n\n\t// When we're in a fallback attempt, we need to detect launch failures before trying the next app.\n\t// Wait for the close event to check the exit code before unreffing.\n\t// The launcher (open/xdg-open/PowerShell) exits quickly (~10-30ms) even on success.\n\tif (isFallbackAttempt) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsubprocess.once('error', reject);\n\n\t\t\tsubprocess.once('spawn', () => {\n\t\t\t\t// Keep error handler active for post-spawn errors\n\t\t\t\tsubprocess.once('close', exitCode => {\n\t\t\t\t\tsubprocess.off('error', reject);\n\n\t\t\t\t\tif (exitCode !== 0) {\n\t\t\t\t\t\treject(new Error(`Exited with code ${exitCode}`));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tsubprocess.unref();\n\t\t\t\t\tresolve(subprocess);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tsubprocess.unref();\n\n\t// Handle spawn errors before the caller can attach listeners.\n\t// This prevents unhandled error events from crashing the process.\n\treturn new Promise((resolve, reject) => {\n\t\tsubprocess.once('error', reject);\n\n\t\t// Wait for the subprocess to spawn before resolving.\n\t\t// This ensures the process is established before the caller continues,\n\t\t// preventing issues when process.exit() is called immediately after.\n\t\tsubprocess.once('spawn', () => {\n\t\t\tsubprocess.off('error', reject);\n\t\t\tresolve(subprocess);\n\t\t});\n\t});\n};\n\nconst open = (target, options) => {\n\tif (typeof target !== 'string') {\n\t\tthrow new TypeError('Expected a `target`');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\ttarget,\n\t});\n};\n\nexport const openApp = (name, options) => {\n\tif (typeof name !== 'string' && !Array.isArray(name)) {\n\t\tthrow new TypeError('Expected a valid `name`');\n\t}\n\n\tconst {arguments: appArguments = []} = options ?? {};\n\tif (appArguments !== undefined && appArguments !== null && !Array.isArray(appArguments)) {\n\t\tthrow new TypeError('Expected `appArguments` as Array type');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\tapp: {\n\t\t\tname,\n\t\t\targuments: appArguments,\n\t\t},\n\t});\n};\n\nfunction detectArchBinary(binary) {\n\tif (typeof binary === 'string' || Array.isArray(binary)) {\n\t\treturn binary;\n\t}\n\n\tconst {[arch]: archBinary} = binary;\n\n\tif (!archBinary) {\n\t\tthrow new Error(`${arch} is not supported`);\n\t}\n\n\treturn archBinary;\n}\n\nfunction detectPlatformBinary({[platform]: platformBinary}, {wsl} = {}) {\n\tif (wsl && isWsl) {\n\t\treturn detectArchBinary(wsl);\n\t}\n\n\tif (!platformBinary) {\n\t\tthrow new Error(`${platform} is not supported`);\n\t}\n\n\treturn detectArchBinary(platformBinary);\n}\n\nexport const apps = {\n\tbrowser: 'browser',\n\tbrowserPrivate: 'browserPrivate',\n};\n\ndefineLazyProperty(apps, 'chrome', () => detectPlatformBinary({\n\tdarwin: 'google chrome',\n\twin32: 'chrome',\n\t// `chromium-browser` is the older deb package name used by Ubuntu/Debian before snap.\n\tlinux: ['google-chrome', 'google-chrome-stable', 'chromium', 'chromium-browser'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe',\n\t\tx64: ['/mnt/c/Program Files/Google/Chrome/Application/chrome.exe', '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'brave', () => detectPlatformBinary({\n\tdarwin: 'brave browser',\n\twin32: 'brave',\n\tlinux: ['brave-browser', 'brave'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe',\n\t\tx64: ['/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe', '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'firefox', () => detectPlatformBinary({\n\tdarwin: 'firefox',\n\twin32: String.raw`C:\\Program Files\\Mozilla Firefox\\firefox.exe`,\n\tlinux: 'firefox',\n}, {\n\twsl: '/mnt/c/Program Files/Mozilla Firefox/firefox.exe',\n}));\n\ndefineLazyProperty(apps, 'edge', () => detectPlatformBinary({\n\tdarwin: 'microsoft edge',\n\twin32: 'msedge',\n\tlinux: ['microsoft-edge', 'microsoft-edge-dev'],\n}, {\n\twsl: '/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe',\n}));\n\ndefineLazyProperty(apps, 'safari', () => detectPlatformBinary({\n\tdarwin: 'Safari',\n}));\n\nexport default open;\n","import {promisify} from 'node:util';\nimport childProcess from 'node:child_process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport isWsl from 'is-wsl';\nimport {powerShellPath as windowsPowerShellPath, executePowerShell} from 'powershell-utils';\nimport {parseMountPointFromConfig} from './utilities.js';\n\nconst execFile = promisify(childProcess.execFile);\n\nexport const wslDrivesMountPoint = (() => {\n\t// Default value for \"root\" param\n\t// according to https://docs.microsoft.com/en-us/windows/wsl/wsl-config\n\tconst defaultMountPoint = '/mnt/';\n\n\tlet mountPoint;\n\n\treturn async function () {\n\t\tif (mountPoint) {\n\t\t\t// Return memoized mount point value\n\t\t\treturn mountPoint;\n\t\t}\n\n\t\tconst configFilePath = '/etc/wsl.conf';\n\n\t\tlet isConfigFileExists = false;\n\t\ttry {\n\t\t\tawait fs.access(configFilePath, fsConstants.F_OK);\n\t\t\tisConfigFileExists = true;\n\t\t} catch {}\n\n\t\tif (!isConfigFileExists) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tconst configContent = await fs.readFile(configFilePath, {encoding: 'utf8'});\n\t\tconst parsedMountPoint = parseMountPointFromConfig(configContent);\n\n\t\tif (parsedMountPoint === undefined) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tmountPoint = parsedMountPoint;\n\t\tmountPoint = mountPoint.endsWith('/') ? mountPoint : `${mountPoint}/`;\n\n\t\treturn mountPoint;\n\t};\n})();\n\nexport const powerShellPathFromWsl = async () => {\n\tconst mountPoint = await wslDrivesMountPoint();\n\treturn `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`;\n};\n\nexport const powerShellPath = isWsl ? powerShellPathFromWsl : windowsPowerShellPath;\n\n// Cache for PowerShell accessibility check\nlet canAccessPowerShellPromise;\n\nexport const canAccessPowerShell = async () => {\n\tcanAccessPowerShellPromise ??= (async () => {\n\t\ttry {\n\t\t\tconst psPath = await powerShellPath();\n\t\t\tawait fs.access(psPath, fsConstants.X_OK);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\t// PowerShell is not accessible (either doesn't exist, no execute permission, or other error)\n\t\t\treturn false;\n\t\t}\n\t})();\n\n\treturn canAccessPowerShellPromise;\n};\n\nexport const wslDefaultBrowser = async () => {\n\tconst psPath = await powerShellPath();\n\tconst command = String.raw`(Get-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice\").ProgId`;\n\n\tconst {stdout} = await executePowerShell(command, {powerShellPath: psPath});\n\n\treturn stdout.trim();\n};\n\nexport const convertWslPathToWindows = async path => {\n\t// Don't convert URLs\n\tif (/^[a-z]+:\\/\\//i.test(path)) {\n\t\treturn path;\n\t}\n\n\ttry {\n\t\tconst {stdout} = await execFile('wslpath', ['-aw', path], {encoding: 'utf8'});\n\t\treturn stdout.trim();\n\t} catch {\n\t\t// If wslpath fails, return the original path\n\t\treturn path;\n\t}\n};\n\nexport {default as isWsl} from 'is-wsl';\n","import process from 'node:process';\nimport os from 'node:os';\nimport fs from 'node:fs';\nimport isInsideContainer from 'is-inside-container';\n\nconst isWsl = () => {\n\tif (process.platform !== 'linux') {\n\t\treturn false;\n\t}\n\n\tif (os.release().toLowerCase().includes('microsoft')) {\n\t\tif (isInsideContainer()) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ttry {\n\t\treturn fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft')\n\t\t\t? !isInsideContainer() : false;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport default process.env.__IS_WSL_TEST__ ? isWsl : isWsl();\n","import fs from 'node:fs';\nimport isDocker from 'is-docker';\n\nlet cachedResult;\n\n// Podman detection\nconst hasContainerEnv = () => {\n\ttry {\n\t\tfs.statSync('/run/.containerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport default function isInsideContainer() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (cachedResult === undefined) {\n\t\tcachedResult = hasContainerEnv() || isDocker();\n\t}\n\n\treturn cachedResult;\n}\n","import fs from 'node:fs';\n\nlet isDockerCached;\n\nfunction hasDockerEnv() {\n\ttry {\n\t\tfs.statSync('/.dockerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasDockerCGroup() {\n\ttry {\n\t\treturn fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker');\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport default function isDocker() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (isDockerCached === undefined) {\n\t\tisDockerCached = hasDockerEnv() || hasDockerCGroup();\n\t}\n\n\treturn isDockerCached;\n}\n","import process from 'node:process';\nimport {Buffer} from 'node:buffer';\nimport {promisify} from 'node:util';\nimport childProcess from 'node:child_process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\n\nconst execFile = promisify(childProcess.execFile);\n\nexport const powerShellPath = () => `${process.env.SYSTEMROOT || process.env.windir || String.raw`C:\\Windows`}\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe`;\n\n// Cache for PowerShell accessibility check\nlet canAccessCache;\n\nexport const canAccessPowerShell = async () => {\n\tcanAccessCache ??= (async () => {\n\t\ttry {\n\t\t\tawait fs.access(powerShellPath(), fsConstants.X_OK);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t})();\n\n\treturn canAccessCache;\n};\n\nexport const executePowerShell = async (command, options = {}) => {\n\tconst {\n\t\tpowerShellPath: psPath,\n\t\t...execFileOptions\n\t} = options;\n\n\tconst encodedCommand = executePowerShell.encodeCommand(command);\n\n\treturn execFile(\n\t\tpsPath ?? powerShellPath(),\n\t\t[\n\t\t\t...executePowerShell.argumentsPrefix,\n\t\t\tencodedCommand,\n\t\t],\n\t\t{\n\t\t\tencoding: 'utf8',\n\t\t\t...execFileOptions,\n\t\t},\n\t);\n};\n\nexecutePowerShell.argumentsPrefix = [\n\t'-NoProfile',\n\t'-NonInteractive',\n\t'-ExecutionPolicy',\n\t'Bypass',\n\t'-EncodedCommand',\n];\n\nexecutePowerShell.encodeCommand = command => Buffer.from(command, 'utf16le').toString('base64');\n\nexecutePowerShell.escapeArgument = value => `'${String(value).replaceAll('\\'', '\\'\\'')}'`;\n","export function parseMountPointFromConfig(content) {\n\tfor (const line of content.split('\\n')) {\n\t\t// Skip comment lines\n\t\tif (/^\\s*#/.test(line)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Match root at start of line (after optional whitespace)\n\t\tconst match = /^\\s*root\\s*=\\s*(?<mountPoint>\"[^\"]*\"|'[^']*'|[^#]*)/.exec(line);\n\t\tif (!match) {\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn match.groups.mountPoint\n\t\t\t.trim()\n\t\t\t// Strip surrounding quotes\n\t\t\t.replaceAll(/^[\"']|[\"']$/g, '');\n\t}\n}\n","export default function defineLazyProperty(object, propertyName, valueGetter) {\n\tconst define = value => Object.defineProperty(object, propertyName, {value, enumerable: true, writable: true});\n\n\tObject.defineProperty(object, propertyName, {\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t\tget() {\n\t\t\tconst result = valueGetter();\n\t\t\tdefine(result);\n\t\t\treturn result;\n\t\t},\n\t\tset(value) {\n\t\t\tdefine(value);\n\t\t}\n\t});\n\n\treturn object;\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\nimport defaultBrowserId from 'default-browser-id';\nimport bundleName from 'bundle-name';\nimport windows from './windows.js';\n\nexport {_windowsBrowserProgIdMap} from './windows.js';\n\nconst execFileAsync = promisify(execFile);\n\n// Inlined: https://github.com/sindresorhus/titleize/blob/main/index.js\nconst titleize = string => string.toLowerCase().replaceAll(/(?:^|\\s|-)\\S/g, x => x.toUpperCase());\n\nexport default async function defaultBrowser() {\n\tif (process.platform === 'darwin') {\n\t\tconst id = await defaultBrowserId();\n\t\tconst name = await bundleName(id);\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'linux') {\n\t\tconst {stdout} = await execFileAsync('xdg-mime', ['query', 'default', 'x-scheme-handler/http']);\n\t\tconst id = stdout.trim();\n\t\tconst name = titleize(id.replace(/.desktop$/, '').replace('-', ' '));\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn windows();\n\t}\n\n\tthrow new Error('Only macOS, Linux, and Windows are supported');\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport default async function defaultBrowserId() {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst {stdout} = await execFileAsync('defaults', ['read', 'com.apple.LaunchServices/com.apple.launchservices.secure', 'LSHandlers']);\n\n\t// `(?!-)` is to prevent matching `LSHandlerRoleAll = \"-\";`.\n\tconst match = /LSHandlerRoleAll = \"(?!-)(?<id>[^\"]+?)\";\\s+?LSHandlerURLScheme = (?:http|https);/.exec(stdout);\n\n\tconst browserId = match?.groups.id ?? 'com.apple.Safari';\n\n\t// Correct the case for Safari's bundle identifier\n\tif (browserId === 'com.apple.safari') {\n\t\treturn 'com.apple.Safari';\n\t}\n\n\treturn browserId;\n}\n","import process from 'node:process';\nimport {promisify} from 'node:util';\nimport {execFile, execFileSync} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport async function runAppleScript(script, {humanReadableOutput = true, signal} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst execOptions = {};\n\tif (signal) {\n\t\texecOptions.signal = signal;\n\t}\n\n\tconst {stdout} = await execFileAsync('osascript', ['-e', script, outputArguments], execOptions);\n\treturn stdout.trim();\n}\n\nexport function runAppleScriptSync(script, {humanReadableOutput = true} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst stdout = execFileSync('osascript', ['-e', script, ...outputArguments], {\n\t\tencoding: 'utf8',\n\t\tstdio: ['ignore', 'pipe', 'ignore'],\n\t\ttimeout: 500,\n\t});\n\n\treturn stdout.trim();\n}\n","import {runAppleScript} from 'run-applescript';\n\nexport default async function bundleName(bundleId) {\n\treturn runAppleScript(`tell application \"Finder\" to set app_path to application file id \"${bundleId}\" as string\\ntell application \"System Events\" to get value of property list item \"CFBundleName\" of property list file (app_path & \":Contents:Info.plist\")`);\n}\n","import {promisify} from 'node:util';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\n// TODO: Fix the casing of bundle identifiers in the next major version.\n\n// Windows doesn't have browser IDs in the same way macOS/Linux does so we give fake\n// ones that look real and match the macOS/Linux versions for cross-platform apps.\nconst windowsBrowserProgIds = {\n\tMSEdgeHTM: {name: 'Edge', id: 'com.microsoft.edge'}, // The missing `L` is correct.\n\tMSEdgeBHTML: {name: 'Edge Beta', id: 'com.microsoft.edge.beta'},\n\tMSEdgeDHTML: {name: 'Edge Dev', id: 'com.microsoft.edge.dev'},\n\tAppXq0fevzme2pys62n3e0fbqa7peapykr8v: {name: 'Edge', id: 'com.microsoft.edge.old'},\n\tChromeHTML: {name: 'Chrome', id: 'com.google.chrome'},\n\tChromeBHTML: {name: 'Chrome Beta', id: 'com.google.chrome.beta'},\n\tChromeDHTML: {name: 'Chrome Dev', id: 'com.google.chrome.dev'},\n\tChromiumHTM: {name: 'Chromium', id: 'org.chromium.Chromium'},\n\tBraveHTML: {name: 'Brave', id: 'com.brave.Browser'},\n\tBraveBHTML: {name: 'Brave Beta', id: 'com.brave.Browser.beta'},\n\tBraveDHTML: {name: 'Brave Dev', id: 'com.brave.Browser.dev'},\n\tBraveSSHTM: {name: 'Brave Nightly', id: 'com.brave.Browser.nightly'},\n\tFirefoxURL: {name: 'Firefox', id: 'org.mozilla.firefox'},\n\tOperaStable: {name: 'Opera', id: 'com.operasoftware.Opera'},\n\tVivaldiHTM: {name: 'Vivaldi', id: 'com.vivaldi.Vivaldi'},\n\t'IE.HTTP': {name: 'Internet Explorer', id: 'com.microsoft.ie'},\n};\n\nexport const _windowsBrowserProgIdMap = new Map(Object.entries(windowsBrowserProgIds));\n\nexport class UnknownBrowserError extends Error {}\n\nexport default async function defaultBrowser(_execFileAsync = execFileAsync) {\n\tconst {stdout} = await _execFileAsync('reg', [\n\t\t'QUERY',\n\t\t' HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Associations\\\\UrlAssociations\\\\http\\\\UserChoice',\n\t\t'/v',\n\t\t'ProgId',\n\t]);\n\n\tconst match = /ProgId\\s*REG_SZ\\s*(?<id>\\S+)/.exec(stdout);\n\tif (!match) {\n\t\tthrow new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`);\n\t}\n\n\tconst {id} = match.groups;\n\n\t// Windows can append a hash suffix to ProgIds using a dot or hyphen\n\t// (e.g., `ChromeHTML.ABC123`, `FirefoxURL-6F193CCC56814779`).\n\t// Try exact match first, then try without the suffix.\n\tconst dotIndex = id.lastIndexOf('.');\n\tconst hyphenIndex = id.lastIndexOf('-');\n\tconst baseIdByDot = dotIndex === -1 ? undefined : id.slice(0, dotIndex);\n\tconst baseIdByHyphen = hyphenIndex === -1 ? undefined : id.slice(0, hyphenIndex);\n\n\treturn windowsBrowserProgIds[id] ?? windowsBrowserProgIds[baseIdByDot] ?? windowsBrowserProgIds[baseIdByHyphen] ?? {name: id, id};\n}\n","import process from 'node:process';\n\nconst isInSsh = Boolean(process.env.SSH_CONNECTION\n\t|| process.env.SSH_CLIENT\n\t|| process.env.SSH_TTY);\n\nexport default isInSsh;\n","import { promises as fs } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\ninterface McpConfig {\n apiKey?: string;\n apiUrl?: string;\n orgId?: string;\n orgName?: string;\n orgSlug?: string;\n /** @deprecated Use orgId. Read for backward compat with old config files. */\n profileId?: string;\n /** @deprecated Use orgName. */\n profileName?: string;\n /** @deprecated Use orgSlug. */\n profileSlug?: string;\n}\n\nconst CONFIG_DIR = path.join(os.homedir(), \".mcp-use\");\nconst CONFIG_FILE = path.join(CONFIG_DIR, \"config.json\");\n\n// Backend API URL (where /api/v1 endpoints are)\nconst DEFAULT_API_URL = process.env.MCP_API_URL\n ? process.env.MCP_API_URL.replace(/\\/api\\/v1$/, \"\") + \"/api/v1\" // Ensure /api/v1 suffix\n : \"https://cloud.mcp-use.com/api/v1\";\n\n// Frontend/Web URL (where /auth/cli page is)\nconst DEFAULT_WEB_URL = process.env.MCP_WEB_URL\n ? process.env.MCP_WEB_URL\n : \"https://manufact.com\";\n\n/**\n * Ensure config directory exists\n */\nasync function ensureConfigDir(): Promise<void> {\n try {\n await fs.mkdir(CONFIG_DIR, { recursive: true });\n } catch (error) {\n // Ignore error if directory already exists\n }\n}\n\n/**\n * Read config from disk, migrating legacy `profile*` keys to `org*`.\n */\nexport async function readConfig(): Promise<McpConfig> {\n try {\n const content = await fs.readFile(CONFIG_FILE, \"utf-8\");\n const raw = JSON.parse(content) as McpConfig;\n return {\n ...raw,\n orgId: raw.orgId ?? raw.profileId,\n orgName: raw.orgName ?? raw.profileName,\n orgSlug: raw.orgSlug ?? raw.profileSlug,\n };\n } catch (error) {\n return {};\n }\n}\n\n/**\n * Write config to disk. Persists only the new `org*` keys and removes legacy `profile*` keys.\n */\nexport async function writeConfig(config: McpConfig): Promise<void> {\n await ensureConfigDir();\n const { profileId: _a, profileName: _b, profileSlug: _c, ...clean } = config;\n await fs.writeFile(CONFIG_FILE, JSON.stringify(clean, null, 2), \"utf-8\");\n}\n\n/**\n * Delete config file\n */\nexport async function deleteConfig(): Promise<void> {\n try {\n await fs.unlink(CONFIG_FILE);\n } catch (error) {\n // Ignore error if file doesn't exist\n }\n}\n\n/**\n * Get API URL from config or use default\n */\nexport async function getApiUrl(): Promise<string> {\n const config = await readConfig();\n return config.apiUrl || DEFAULT_API_URL;\n}\n\n/**\n * Get API key from config\n */\nexport async function getApiKey(): Promise<string | null> {\n const config = await readConfig();\n return config.apiKey || null;\n}\n\n/**\n * Check if user is logged in\n */\nexport async function isLoggedIn(): Promise<boolean> {\n const apiKey = await getApiKey();\n return !!apiKey;\n}\n\n/**\n * Get the stored organization ID from config\n */\nexport async function getOrgId(): Promise<string | null> {\n const config = await readConfig();\n return config.orgId || null;\n}\n\n/**\n * Get web URL (for browser-based auth)\n * This is the frontend URL where /device verification page lives\n */\nexport async function getWebUrl(): Promise<string> {\n return DEFAULT_WEB_URL;\n}\n\n/**\n * Derive the auth base URL from the API URL.\n * Better Auth endpoints live at /api/auth/*, not under /api/v1/.\n * e.g. \"http://localhost:8000/api/v1\" -> \"http://localhost:8000\"\n */\nexport async function getAuthBaseUrl(): Promise<string> {\n const apiUrl = await getApiUrl();\n return apiUrl.replace(/\\/api\\/v1$/, \"\");\n}\n","import { getApiKey, getApiUrl, getAuthBaseUrl, getOrgId } from \"./config.js\";\n\nexport class GitHubAuthRequiredError extends Error {\n readonly authorizeUrl: string;\n constructor(message: string, authorizeUrl: string) {\n super(message);\n this.name = \"GitHubAuthRequiredError\";\n this.authorizeUrl = authorizeUrl;\n }\n}\n\n/** Thrown when the API returns 401 (invalid or expired API key for this backend). */\nexport class ApiUnauthorizedError extends Error {\n readonly status = 401 as const;\n constructor(\n message = \"Your session has expired or your API key is invalid.\"\n ) {\n super(message);\n this.name = \"ApiUnauthorizedError\";\n }\n}\n\nexport interface OrgInfo {\n id: string;\n name: string;\n slug: string | null;\n role: string;\n}\n\nexport interface AuthTestResponse {\n message: string;\n user_id: string;\n email: string;\n orgs: OrgInfo[];\n default_org_id: string | null;\n}\n\n/** Wire format returned by GET /test-auth (cli-compat route). */\ninterface AuthTestWireResponse {\n message: string;\n user_id: string;\n email: string;\n profiles: Array<{\n id: string;\n profile_name: string;\n slug: string | null;\n role: string;\n }>;\n default_profile_id: string | null;\n}\n\n// ── Server creation ────────────────────────────────────────────────\n\ninterface CreateServerBody {\n type: \"github\";\n organizationId: string;\n installationId: string;\n name: string;\n repoFullName: string;\n branch?: string;\n rootDir?: string;\n port?: number;\n buildCommand?: string;\n startCommand?: string;\n env?: Record<string, string>;\n description?: string;\n tags?: string[];\n region?: string;\n}\n\ninterface CreateServerResponse {\n server: { id: string; slug: string | null };\n deploymentId: string | null;\n}\n\n/** Connected GitHub repository (subset of OpenAPI server payload). */\ninterface CloudServerConnectedRepository {\n id: string;\n repoFullName: string;\n productionBranch: string;\n isActive: boolean;\n userId: string;\n githubInstallationId: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/** Server record from `GET /servers` or `GET /servers/{id}` (fields used by CLI). */\ninterface CloudServer {\n id: string;\n slug: string | null;\n organizationId: string;\n userId: string | null;\n connectedRepositoryId: string;\n connectedRepository?: CloudServerConnectedRepository;\n name: string | null;\n description: string | null;\n tags?: string[];\n config?: unknown;\n createdAt: string;\n updatedAt: string;\n displayPreferences?: { icon?: string; color?: string };\n status: string;\n latestDeploymentStatus: string | null;\n activeDeploymentId: string | null;\n previousDeploymentId: string | null;\n region: string;\n providerRegion?: string;\n runProvider?: string;\n buildProvider?: string;\n /** Public MCP endpoint when provisioned (preferred over synthesizing from id/slug). */\n mcpUrl?: string | null;\n domains?: unknown[];\n deployments?: unknown[];\n _count?: { deployments?: number };\n}\n\n// ── Deployments ────────────────────────────────────────────────────\n\ninterface CreateDeploymentInput {\n serverId: string;\n name?: string;\n branch?: string;\n commitSha?: string;\n commitMessage?: string;\n trigger?: \"manual\" | \"webhook\" | \"redeploy\" | \"rollback\";\n prNumber?: number;\n}\n\ninterface CreateDeploymentResponse {\n id: string;\n}\n\nexport interface Deployment {\n id: string;\n userId: string;\n name: string;\n source: unknown;\n status: \"pending\" | \"building\" | \"running\" | \"stopped\" | \"failed\";\n port: number | null;\n healthCheckPath: string | null;\n provider: string;\n appName: string;\n error: string | null;\n gitCommitSha: string | null;\n gitBranch: string | null;\n gitCommitMessage: string | null;\n isProductionDeployment: boolean | null;\n deploymentTrigger: string | null;\n serverId: string | null;\n createdAt: string;\n updatedAt: string;\n buildStartedAt: string | null;\n buildCompletedAt: string | null;\n archivedAt: string | null;\n mcpUrl?: string;\n}\n\ninterface BuildLogsResponse {\n logs: string;\n offset: number;\n totalLength: number;\n status: string;\n}\n\n// ── GitHub ──────────────────────────────────────────────────────────\n\nexport interface GitHubInstallation {\n id: string;\n installation_id: string;\n account_login: string;\n account_type: string;\n}\n\nexport interface GitHubConnectionStatus {\n is_connected: boolean;\n installations?: GitHubInstallation[];\n}\n\ninterface GitHubRepo {\n id: number;\n name: string;\n full_name: string;\n private: boolean;\n owner: {\n login: string;\n };\n}\n\ninterface GitHubReposResponse {\n user: {\n login: string;\n id: number;\n avatar_url: string;\n };\n repos: GitHubRepo[];\n}\n\n// ── Env Variables ───────────────────────────────────────────────────\n\nexport type EnvEnvironment = \"production\" | \"preview\" | \"development\";\n\nexport interface EnvVariable {\n id: string;\n serverId: string;\n key: string;\n value: string;\n environments: EnvEnvironment[];\n sensitive: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface CreateEnvVariableBody {\n key: string;\n value: string;\n environments?: EnvEnvironment[];\n sensitive?: boolean;\n}\n\ninterface UpdateEnvVariableBody {\n value?: string;\n environments?: EnvEnvironment[];\n sensitive?: boolean;\n}\n\n// ── API client ─────────────────────────────────────────────────────\n\nexport class McpUseAPI {\n private baseUrl: string;\n private apiKey: string | undefined;\n private orgId: string | undefined;\n\n constructor(baseUrl?: string, apiKey?: string, orgId?: string) {\n this.baseUrl = baseUrl || \"\";\n this.apiKey = apiKey;\n this.orgId = orgId;\n }\n\n static async create(): Promise<McpUseAPI> {\n const baseUrl = await getApiUrl();\n const apiKey = await getApiKey();\n const orgId = await getOrgId();\n return new McpUseAPI(baseUrl, apiKey ?? undefined, orgId ?? undefined);\n }\n\n setOrgId(orgId: string): void {\n this.orgId = orgId;\n }\n\n private async request<T>(\n endpoint: string,\n options: {\n method?: string;\n headers?: Record<string, string>;\n body?: string;\n timeout?: number;\n } = {}\n ): Promise<T> {\n const url = `${this.baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...((options.headers as Record<string, string>) || {}),\n };\n\n if (this.apiKey) {\n headers[\"x-api-key\"] = this.apiKey;\n }\n\n if (this.orgId) {\n headers[\"x-profile-id\"] = this.orgId;\n }\n\n const timeout = options.timeout || 30000;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status === 401) {\n throw new ApiUnauthorizedError();\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n try {\n const parsed = JSON.parse(errorText);\n if (parsed.code === \"GITHUB_AUTH_REQUIRED\" && parsed.authorizeUrl) {\n throw new GitHubAuthRequiredError(\n parsed.error || \"GitHub authorization required\",\n parsed.authorizeUrl\n );\n }\n } catch (e) {\n if (e instanceof GitHubAuthRequiredError) throw e;\n }\n throw new Error(`API request failed: ${response.status} ${errorText}`);\n }\n\n return response.json() as Promise<T>;\n } catch (error: any) {\n clearTimeout(timeoutId);\n if (error.name === \"AbortError\") {\n throw new Error(`Request timeout after ${timeout / 1000}s.`);\n }\n throw error;\n }\n }\n\n /**\n * Create a persistent API key using a Better Auth access token.\n */\n async createApiKeyWithAccessToken(\n accessToken: string,\n name: string = \"CLI\"\n ): Promise<{ key: string }> {\n const authBase = await getAuthBaseUrl();\n const url = `${authBase}/api/auth/api-key/create`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify({ name, prefix: \"mcp_\" }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to create API key: ${response.status} ${error}`);\n }\n\n return response.json() as Promise<{ key: string }>;\n }\n\n // ── Auth ────────────────────────────────────────────────────────\n\n async testAuth(): Promise<AuthTestResponse> {\n const wire = await this.request<AuthTestWireResponse>(\"/test-auth\");\n return {\n message: wire.message,\n user_id: wire.user_id,\n email: wire.email,\n default_org_id: wire.default_profile_id,\n orgs: (wire.profiles ?? []).map((p) => ({\n id: p.id,\n name: p.profile_name,\n slug: p.slug,\n role: p.role,\n })),\n };\n }\n\n async setDefaultOrg(orgId: string): Promise<void> {\n await this.request(`/organizations/${orgId}/set-default`, {\n method: \"POST\",\n });\n }\n\n // ── Organization ID resolution ──────────────────────────────────\n\n async resolveOrganizationId(): Promise<string> {\n if (this.orgId) return this.orgId;\n const auth = await this.testAuth();\n const id = auth.default_org_id;\n if (!id) {\n throw new Error(\n \"No organization set. Run `mcp-use org switch` or use --org to specify one.\"\n );\n }\n return id;\n }\n\n // ── Servers ─────────────────────────────────────────────────────\n\n async createServer(body: CreateServerBody): Promise<CreateServerResponse> {\n return this.request<CreateServerResponse>(\"/servers\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n\n async listServers(params?: {\n organizationId?: string;\n limit?: number;\n skip?: number;\n sort?: string;\n }): Promise<CloudServer[]> {\n const search = new URLSearchParams();\n if (params?.organizationId) {\n search.set(\"organizationId\", params.organizationId);\n }\n if (params?.limit != null) {\n search.set(\"limit\", String(params.limit));\n }\n if (params?.skip != null) {\n search.set(\"skip\", String(params.skip));\n }\n if (params?.sort) {\n search.set(\"sort\", params.sort);\n }\n const q = search.toString();\n return this.request<CloudServer[]>(`/servers${q ? `?${q}` : \"\"}`);\n }\n\n async getServer(idOrSlug: string): Promise<CloudServer> {\n const path = encodeURIComponent(idOrSlug);\n return this.request<CloudServer>(`/servers/${path}`);\n }\n\n async deleteServer(id: string): Promise<void> {\n await this.request<{ success: boolean }>(\n `/servers/${encodeURIComponent(id)}`,\n {\n method: \"DELETE\",\n }\n );\n }\n\n // ── Env Variables ────────────────────────────────────────────────\n\n async listEnvVariables(serverId: string): Promise<EnvVariable[]> {\n return this.request<EnvVariable[]>(\n `/servers/${encodeURIComponent(serverId)}/env-variables`\n );\n }\n\n async createEnvVariable(\n serverId: string,\n body: CreateEnvVariableBody\n ): Promise<EnvVariable> {\n return this.request<EnvVariable>(\n `/servers/${encodeURIComponent(serverId)}/env-variables`,\n {\n method: \"POST\",\n body: JSON.stringify(body),\n }\n );\n }\n\n async updateEnvVariable(\n serverId: string,\n varId: string,\n body: UpdateEnvVariableBody\n ): Promise<EnvVariable> {\n return this.request<EnvVariable>(\n `/servers/${encodeURIComponent(serverId)}/env-variables/${encodeURIComponent(varId)}`,\n {\n method: \"PATCH\",\n body: JSON.stringify(body),\n }\n );\n }\n\n async deleteEnvVariable(serverId: string, varId: string): Promise<void> {\n await this.request<{ success: boolean }>(\n `/servers/${encodeURIComponent(serverId)}/env-variables/${encodeURIComponent(varId)}`,\n { method: \"DELETE\" }\n );\n }\n\n // ── Deployments ─────────────────────────────────────────────────\n\n async createDeployment(\n input: CreateDeploymentInput\n ): Promise<CreateDeploymentResponse> {\n return this.request<CreateDeploymentResponse>(\"/deployments\", {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n }\n\n async getDeployment(deploymentId: string): Promise<Deployment> {\n return this.request<Deployment>(`/deployments/${deploymentId}`);\n }\n\n async listDeployments(): Promise<Deployment[]> {\n return this.request<Deployment[]>(\"/deployments\");\n }\n\n async deleteDeployment(deploymentId: string): Promise<void> {\n await this.request(`/deployments/${deploymentId}`, {\n method: \"DELETE\",\n });\n }\n\n async stopDeployment(deploymentId: string): Promise<void> {\n await this.request(`/deployments/${deploymentId}/stop`, {\n method: \"POST\",\n });\n }\n\n async getDeploymentLogs(\n deploymentId: string,\n lines: number = 500\n ): Promise<string> {\n const resp = await this.request<{ logs: string }>(\n `/deployments/${deploymentId}/logs?lines=${lines}`,\n { timeout: 60000 }\n );\n return resp.logs;\n }\n\n async getDeploymentBuildLogs(\n deploymentId: string,\n offset: number = 0\n ): Promise<BuildLogsResponse> {\n return this.request<BuildLogsResponse>(\n `/deployments/${deploymentId}/build-logs?offset=${offset}`,\n { timeout: 60000 }\n );\n }\n\n // ── GitHub ──────────────────────────────────────────────────────\n\n async getGitHubConnectionStatus(): Promise<GitHubConnectionStatus> {\n const orgId = await this.resolveOrganizationId();\n const resp = await this.request<{\n installations: Array<{\n id: string;\n installationId: string;\n account: {\n login: string;\n avatar_url: string | null;\n type: string;\n } | null;\n }>;\n }>(`/github/installations?organizationId=${orgId}`);\n return {\n is_connected: resp.installations.length > 0,\n installations: resp.installations.map((i) => ({\n id: i.id,\n installation_id: i.installationId,\n account_login: i.account?.login ?? \"\",\n account_type: i.account?.type ?? \"User\",\n })),\n };\n }\n\n async getGitHubRepos(_refresh?: boolean): Promise<GitHubReposResponse> {\n const orgId = await this.resolveOrganizationId();\n const installResp = await this.request<{\n installations: Array<{\n id: string;\n installationId: string;\n account: {\n login: string;\n avatar_url: string | null;\n type: string;\n } | null;\n }>;\n }>(`/github/installations?organizationId=${orgId}`);\n\n if (installResp.installations.length === 0) {\n return { user: { login: \"\", id: 0, avatar_url: \"\" }, repos: [] };\n }\n\n const inst = installResp.installations[0];\n const reposResp = await this.request<{\n repos: Array<{\n id: number;\n name: string;\n fullName: string;\n private: boolean;\n ownerAvatarUrl: string | null;\n }>;\n }>(`/github/installations/${inst.installationId}/repos`);\n\n return {\n user: {\n login: inst.account?.login ?? \"\",\n id: 0,\n avatar_url: inst.account?.avatar_url ?? \"\",\n },\n repos: reposResp.repos.map((r) => ({\n id: r.id,\n name: r.name,\n full_name: r.fullName,\n private: r.private,\n owner: { login: r.fullName.split(\"/\")[0] ?? \"\" },\n })),\n };\n }\n\n async getGitHubAppName(): Promise<string> {\n if (process.env.MCP_GITHUB_APP_NAME) return process.env.MCP_GITHUB_APP_NAME;\n if (this.baseUrl.includes(\"localhost\")) return \"mcp-use-local\";\n if (this.baseUrl.includes(\".dev.\")) return \"mcp-use-dev\";\n return \"mcp-use\";\n }\n\n /**\n * Returns the GitHub numeric installation ID (not the DB UUID) for the org.\n * Used for building direct installation settings URLs.\n */\n async getGitHubInstallationId(): Promise<string | null> {\n const status = await this.getGitHubConnectionStatus();\n return status.installations?.[0]?.installation_id ?? null;\n }\n\n async createGitHubRepo(opts: {\n installationId: string;\n name: string;\n private?: boolean;\n org?: string;\n }): Promise<{ fullName: string; cloneUrl: string; htmlUrl: string }> {\n return this.request<{\n fullName: string;\n cloneUrl: string;\n htmlUrl: string;\n }>(`/github/installations/${opts.installationId}/repos`, {\n method: \"POST\",\n body: JSON.stringify({\n name: opts.name,\n private: opts.private ?? true,\n org: opts.org,\n }),\n });\n }\n\n async getGitHubOAuthUrl(): Promise<{ url: string; state: string }> {\n return this.request<{ url: string; state: string }>(\n \"/github/oauth/authorize\"\n );\n }\n\n async exchangeGitHubOAuthToken(\n code: string\n ): Promise<{ success: boolean; installationsUpdated: number }> {\n return this.request<{ success: boolean; installationsUpdated: number }>(\n \"/github/oauth/token\",\n {\n method: \"POST\",\n body: JSON.stringify({ code }),\n }\n );\n }\n}\n","import chalk from \"chalk\";\nimport { ApiUnauthorizedError } from \"./api.js\";\n\n/**\n * Treats `ApiUnauthorizedError` (401) as a \"please re-authenticate\" hint\n * instead of surfacing the raw API response.\n */\nexport function handleCommandError(error: unknown, context: string): never {\n if (error instanceof ApiUnauthorizedError) {\n console.error(\n chalk.red(\"\\n✗ Your session has expired or your API key is invalid.\")\n );\n console.error(\n chalk.gray(\n `Run ${chalk.white(\"npx mcp-use login\")} to re-authenticate.\\n`\n )\n );\n process.exit(1);\n }\n console.error(\n chalk.red.bold(`\\n✗ ${context}:`),\n chalk.red(error instanceof Error ? error.message : \"Unknown error\")\n );\n process.exit(1);\n}\n","import chalk from \"chalk\";\nimport open from \"open\";\nimport { ApiUnauthorizedError, McpUseAPI } from \"../utils/api.js\";\nimport {\n deleteConfig,\n getApiKey,\n getAuthBaseUrl,\n isLoggedIn,\n readConfig,\n writeConfig,\n} from \"../utils/config.js\";\nimport { handleCommandError } from \"../utils/errors.js\";\nimport type { AuthTestResponse, OrgInfo } from \"../utils/api.js\";\n\nconst DEVICE_CLIENT_ID = \"mcp-use-cli\";\nconst DEVICE_POLL_TIMEOUT = 1800000; // 30 minutes\n\ninterface DeviceCodeResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete?: string;\n expires_in: number;\n interval: number;\n}\n\ninterface DeviceTokenResponse {\n access_token?: string;\n error?: string;\n error_description?: string;\n}\n\nasync function requestDeviceCode(\n authBaseUrl: string\n): Promise<DeviceCodeResponse> {\n const url = `${authBaseUrl}/api/auth/device/code`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n client_id: DEVICE_CLIENT_ID,\n scope: \"openid profile email\",\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(\n `Failed to request device code: ${response.status} ${error}`\n );\n }\n\n return response.json() as Promise<DeviceCodeResponse>;\n}\n\nasync function pollForDeviceToken(\n authBaseUrl: string,\n deviceCode: string,\n intervalSeconds: number\n): Promise<string> {\n let pollingInterval = intervalSeconds;\n const deadline = Date.now() + DEVICE_POLL_TIMEOUT;\n\n while (Date.now() < deadline) {\n const delayMs = pollingInterval * 1000;\n await new Promise((r) => setTimeout(r, delayMs));\n\n const url = `${authBaseUrl}/api/auth/device/token`;\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceCode,\n client_id: DEVICE_CLIENT_ID,\n }),\n });\n\n const data = (await response.json()) as DeviceTokenResponse;\n\n if (data.access_token) {\n return data.access_token;\n }\n\n if (data.error) {\n switch (data.error) {\n case \"authorization_pending\":\n break;\n case \"slow_down\":\n pollingInterval += 5;\n break;\n case \"access_denied\":\n throw new Error(\"Authorization was denied by the user.\");\n case \"expired_token\":\n throw new Error(\"The device code has expired. Please try again.\");\n default:\n throw new Error(\n data.error_description || `Device auth error: ${data.error}`\n );\n }\n }\n }\n\n throw new Error(\"Login timed out. Please try again.\");\n}\n\n/**\n * Resolve an org identifier (slug, id, or case-insensitive name) against a list.\n * Returns null if no match.\n */\nexport function resolveOrgFromOption(\n orgs: OrgInfo[],\n identifier: string\n): OrgInfo | null {\n const needle = identifier.trim();\n if (!needle) return null;\n const lower = needle.toLowerCase();\n return (\n orgs.find(\n (o) =>\n o.slug === needle || o.id === needle || o.name.toLowerCase() === lower\n ) ?? null\n );\n}\n\n/**\n * Prompt user to pick an organization from a numbered list.\n */\nexport async function promptOrgSelection(\n orgs: OrgInfo[],\n defaultOrgId?: string | null\n): Promise<OrgInfo | null> {\n if (orgs.length === 0) return null;\n\n if (orgs.length === 1) {\n return orgs[0];\n }\n\n console.log(chalk.cyan.bold(\"\\n🏢 Select an organization:\\n\"));\n\n for (let i = 0; i < orgs.length; i++) {\n const o = orgs[i];\n const marker = o.id === defaultOrgId ? chalk.green(\" (current)\") : \"\";\n const slug = o.slug ? chalk.gray(` (${o.slug})`) : \"\";\n console.log(` ${chalk.white(`${i + 1}.`)} ${o.name}${slug}${marker}`);\n }\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n const defaultIdx = defaultOrgId\n ? orgs.findIndex((o) => o.id === defaultOrgId)\n : 0;\n const defaultDisplay = defaultIdx >= 0 ? defaultIdx + 1 : 1;\n\n rl.question(\n chalk.gray(`\\nEnter number [${defaultDisplay}]: `),\n (answer) => {\n rl.close();\n const trimmed = answer.trim();\n const idx = trimmed === \"\" ? defaultIdx : parseInt(trimmed, 10) - 1;\n if (idx >= 0 && idx < orgs.length) {\n resolve(orgs[idx]);\n } else {\n console.log(chalk.yellow(\"Invalid selection, using default.\"));\n resolve(orgs[defaultIdx >= 0 ? defaultIdx : 0]);\n }\n }\n );\n });\n}\n\n/**\n * Login command using OAuth 2.0 Device Authorization Grant (RFC 8628).\n */\nexport async function loginCommand(options?: {\n silent?: boolean;\n apiKey?: string;\n org?: string;\n}): Promise<void> {\n try {\n const directKey = options?.apiKey || process.env.MCP_USE_API_KEY;\n if (directKey) {\n await writeConfig({ apiKey: directKey });\n if (!options?.silent) {\n console.log(chalk.green.bold(\"✓ API key saved.\"));\n try {\n const api = await McpUseAPI.create();\n const authInfo = await api.testAuth();\n console.log(chalk.gray(` Authenticated as ${authInfo.email}`));\n } catch {\n console.log(\n chalk.gray(\n \" (could not verify key — will be checked on next command)\"\n )\n );\n }\n }\n return;\n }\n\n if (await isLoggedIn()) {\n let needsReauth = false;\n try {\n await (await McpUseAPI.create()).testAuth();\n } catch (e) {\n // Only a 401 means the stored key is actually bad. Network/disk\n // errors get the benefit of the doubt so offline users aren't\n // bounced into re-auth when we can't verify.\n if (e instanceof ApiUnauthorizedError) {\n needsReauth = true;\n }\n }\n\n if (!needsReauth) {\n if (!options?.silent) {\n console.log(\n chalk.yellow(\n \"You are already logged in. Run 'npx mcp-use logout' first if you want to login with a different account.\"\n )\n );\n }\n return;\n }\n\n if (!options?.silent) {\n console.log(\n chalk.yellow(\n \"⚠️ Stored credentials are invalid or expired. Re-authenticating...\"\n )\n );\n }\n await deleteConfig();\n }\n\n console.log(chalk.cyan.bold(\"Logging in to Manufact cloud...\\n\"));\n\n const authBaseUrl = await getAuthBaseUrl();\n\n const deviceResp = await requestDeviceCode(authBaseUrl);\n const {\n device_code,\n user_code,\n verification_uri,\n verification_uri_complete,\n interval,\n } = deviceResp;\n\n const displayCode =\n user_code.length === 8\n ? `${user_code.slice(0, 4)}-${user_code.slice(4)}`\n : user_code;\n\n console.log(chalk.white(\" Visit: \") + chalk.cyan(verification_uri));\n console.log(chalk.white(\" Code: \") + chalk.bold.white(displayCode));\n console.log();\n\n const urlToOpen = verification_uri_complete || verification_uri;\n try {\n await open(urlToOpen);\n console.log(chalk.gray(\" Browser opened. Waiting for approval...\"));\n } catch {\n console.log(chalk.gray(\" Open the URL above in your browser.\"));\n }\n\n const accessToken = await pollForDeviceToken(\n authBaseUrl,\n device_code,\n interval || 5\n );\n\n console.log(chalk.gray(\"\\n Creating persistent API key...\"));\n\n const api = await McpUseAPI.create();\n const keyResp = await api.createApiKeyWithAccessToken(accessToken, \"CLI\");\n\n await writeConfig({ apiKey: keyResp.key });\n\n console.log(chalk.green.bold(\"\\n✓ Successfully logged in!\"));\n\n let authInfo: AuthTestResponse | null = null;\n try {\n const freshApi = await McpUseAPI.create();\n authInfo = await freshApi.testAuth();\n } catch {\n console.log(\n chalk.gray(\n `\\n Your API key has been saved to ${chalk.white(\"~/.mcp-use/config.json\")}`\n )\n );\n }\n\n if (authInfo) {\n console.log(chalk.cyan.bold(\"\\nCurrent user:\\n\"));\n console.log(chalk.white(\" Email: \") + chalk.cyan(authInfo.email));\n console.log(chalk.white(\" User ID: \") + chalk.gray(authInfo.user_id));\n\n const storedKey = await getApiKey();\n if (storedKey) {\n const masked = storedKey.substring(0, 8) + \"...\";\n console.log(chalk.white(\" API Key: \") + chalk.gray(masked));\n }\n\n const orgs = authInfo.orgs ?? [];\n if (orgs.length > 0) {\n let selectedOrg: OrgInfo | null = null;\n\n if (options?.org) {\n selectedOrg = resolveOrgFromOption(orgs, options.org);\n if (!selectedOrg) {\n throw new Error(\n `Organization \"${options.org}\" not found. Run 'npx mcp-use org list' after logging in to see available organizations.`\n );\n }\n } else if (orgs.length === 1) {\n selectedOrg = orgs[0];\n } else if (!process.stdin.isTTY) {\n throw new Error(\n \"Multiple organizations available and no TTY for interactive selection. Re-run with --org <slug|id|name> to pick one non-interactively.\"\n );\n } else {\n selectedOrg = await promptOrgSelection(orgs, authInfo.default_org_id);\n }\n\n if (selectedOrg) {\n const config = await readConfig();\n await writeConfig({\n ...config,\n orgId: selectedOrg.id,\n orgName: selectedOrg.name,\n orgSlug: selectedOrg.slug ?? undefined,\n });\n\n const slug = selectedOrg.slug\n ? chalk.gray(` (${selectedOrg.slug})`)\n : \"\";\n console.log(\n chalk.white(\" Org: \") + chalk.cyan(selectedOrg.name) + slug\n );\n }\n }\n }\n\n console.log(\n chalk.gray(\n \"\\n Deploy your MCP servers with \" + chalk.white(\"npx mcp-use deploy\")\n )\n );\n console.log(\n chalk.gray(\" To logout, run \" + chalk.white(\"npx mcp-use logout\"))\n );\n } catch (error) {\n throw new Error(\n `Login failed: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\n/**\n * Logout command - revokes API key and deletes config\n */\nexport async function logoutCommand(): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.yellow(\"⚠️ You are not logged in.\"));\n return;\n }\n\n console.log(chalk.cyan.bold(\"🔓 Logging out...\\n\"));\n\n await deleteConfig();\n\n console.log(chalk.green.bold(\"✓ Successfully logged out!\"));\n console.log(\n chalk.gray(\n \"\\nYour local config has been deleted. The API key will remain active until revoked from the web interface.\"\n )\n );\n } catch (error) {\n console.error(\n chalk.red.bold(\"\\n✗ Logout failed:\"),\n chalk.red(error instanceof Error ? error.message : \"Unknown error\")\n );\n process.exit(1);\n }\n}\n\n/**\n * Whoami command - shows current user info\n */\nexport async function whoamiCommand(): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.yellow(\"⚠️ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n return;\n }\n\n console.log(chalk.cyan.bold(\"👤 Current user:\\n\"));\n\n const api = await McpUseAPI.create();\n const authInfo = await api.testAuth();\n\n console.log(chalk.white(\"Email: \") + chalk.cyan(authInfo.email));\n console.log(chalk.white(\"User ID: \") + chalk.gray(authInfo.user_id));\n\n const apiKey = await getApiKey();\n if (apiKey) {\n const masked = apiKey.substring(0, 6) + \"...\";\n console.log(chalk.white(\"API Key: \") + chalk.gray(masked));\n }\n\n const config = await readConfig();\n const orgs = authInfo.orgs ?? [];\n if (orgs.length > 0) {\n const activeOrg = orgs.find(\n (o) => o.id === (config.orgId || authInfo.default_org_id)\n );\n\n if (activeOrg) {\n const slug = activeOrg.slug ? chalk.gray(` (${activeOrg.slug})`) : \"\";\n console.log(\n chalk.white(\"Org: \") + chalk.cyan(activeOrg.name) + slug\n );\n }\n\n if (orgs.length > 1) {\n console.log(\n chalk.gray(\n `\\n ${orgs.length} organizations available. Use ` +\n chalk.white(\"npx mcp-use org list\") +\n \" to see all.\"\n )\n );\n }\n }\n } catch (error) {\n handleCommandError(error, \"Failed to get user info\");\n }\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { MCPSession } from \"mcp-use/client\";\nimport { MCPClient } from \"mcp-use/client\";\nimport type { NodeOAuthClientProvider } from \"mcp-use/auth/node\";\nimport { createInterface } from \"node:readline\";\nimport {\n formatError,\n formatHeader,\n formatInfo,\n formatJson,\n formatKeyValue,\n formatPromptMessages,\n formatResourceContent,\n formatSchema,\n formatSuccess,\n formatTable,\n formatToolCall,\n formatToolMode,\n formatWarning,\n isStdoutTty,\n} from \"../utils/format.js\";\nimport { parsePromptArgs, parseToolArgs } from \"../utils/parse-args.js\";\nimport {\n buildOAuthProvider,\n isUnauthorized,\n runOAuthFlow,\n} from \"../utils/oauth.js\";\nimport {\n getSession,\n listAllSessions,\n removeSession,\n saveSession,\n updateSessionInfo,\n} from \"../utils/session-storage.js\";\nimport {\n activeSessions,\n cleanupAndExit,\n getCliClientInfo,\n getOrRestoreSession,\n} from \"../utils/session.js\";\nimport {\n authStatusCommand,\n authRefreshCommand,\n authLogoutCommand,\n} from \"./client-auth.js\";\nimport {\n captureToolScreenshot,\n createClientScreenshotCommand,\n createPerClientScreenshotCommand,\n detectToolResourceUri,\n parseDeviceScaleFactor,\n} from \"./screenshot.js\";\n\n/**\n * Reserved top-level subcommands under `mcp-use client`. Any other token in\n * that position is treated as a client name and routed via\n * `createPerClientCommand`. Keep this in sync with the subcommands registered\n * in `createClientCommand` below, plus commander's built-in help tokens.\n */\nexport const RESERVED_CLIENT_SUBCOMMANDS = new Set([\n \"connect\",\n \"list\",\n \"remove\",\n \"screenshot\",\n \"help\",\n]);\n\n/**\n * Per-client scope tokens that live under `mcp-use client <name> ...`. When a\n * user types one of these in the client-name slot (e.g.\n * `mcp-use client tools call foo`), they almost certainly forgot the client\n * name — route to a tailored error instead of \"unknown command\".\n */\nexport const PER_CLIENT_SCOPES = new Set([\n \"tools\",\n \"resources\",\n \"prompts\",\n \"auth\",\n \"disconnect\",\n \"interactive\",\n \"screenshot\",\n]);\n\nasync function connectCommand(\n name: string | undefined,\n urlOrCommand: string | undefined,\n options: {\n stdio?: boolean;\n auth?: string;\n oauth?: boolean;\n authTimeout?: string;\n }\n): Promise<void> {\n // `connect` requires both <name> and <url>. Commander's default missing-arg\n // error (\"missing required argument 'url'\") is confusing when users pass a\n // URL as the only positional — they don't realize the server needs a name.\n // Catch the common shapes here and give a tailored fix-it message.\n if (!name || !urlOrCommand) {\n const looksLikeUrl = !!name && /^https?:\\/\\//i.test(name);\n\n if (looksLikeUrl && !urlOrCommand && !options.stdio) {\n console.error(formatError(\"Missing server name.\"));\n console.error(\"\");\n console.error(\n formatInfo(\n \"Each saved server needs a short name you'll use to address it later.\"\n )\n );\n console.error(\"\");\n console.error(\"Try:\");\n console.error(` mcp-use client connect <name> ${name}`);\n console.error(\"\");\n console.error(\"Example:\");\n console.error(` mcp-use client connect my-server ${name}`);\n console.error(\" mcp-use client my-server tools list\");\n } else if (name && !urlOrCommand) {\n console.error(\n formatError(options.stdio ? \"Missing <command>.\" : \"Missing <url>.\")\n );\n console.error(\"\");\n console.error(formatInfo(\"Usage:\"));\n console.error(\n options.stdio\n ? ` mcp-use client connect ${name} \"<command>\" --stdio`\n : ` mcp-use client connect ${name} <url>`\n );\n } else {\n console.error(formatError(\"Missing required arguments: <name> <url>.\"));\n console.error(\"\");\n console.error(formatInfo(\"Usage:\"));\n console.error(\" mcp-use client connect <name> <url>\");\n console.error(\"\");\n console.error(\"Example:\");\n console.error(\n \" mcp-use client connect manufact https://mcp.manufact.com/mcp\"\n );\n }\n await cleanupAndExit(1);\n }\n\n // Narrow for TS: the validation block above exits on missing args. The\n // `await cleanupAndExit` doesn't propagate `never` through control flow,\n // so assert here once instead of sprinkling `!` everywhere.\n const sessionName: string = name as string;\n const target: string = urlOrCommand as string;\n\n // Reject names that collide with per-server scope tokens. If someone saved a\n // server as `tools`, every `mcp-use client tools ...` invocation would be\n // intercepted by the \"missing server name\" routing in index.ts and the\n // saved entry would be unreachable. Fail fast at save time instead.\n if (PER_CLIENT_SCOPES.has(sessionName)) {\n console.error(\n formatError(\n `'${sessionName}' is a reserved name and can't be used for a saved server.`\n )\n );\n console.error(\"\");\n console.error(\n `Reserved names: ${Array.from(PER_CLIENT_SCOPES).sort().join(\", \")}`\n );\n console.error(\"\");\n console.error(\"Pick a different name, e.g.:\");\n console.error(` mcp-use client connect my-${sessionName} ${target}`);\n await cleanupAndExit(1);\n }\n\n try {\n const client = new MCPClient();\n let session: MCPSession;\n const cliClientInfo = getCliClientInfo();\n\n if (options.stdio) {\n const parts = target.split(\" \");\n const command = parts[0];\n const args = parts.slice(1);\n\n console.error(\n formatInfo(`Connecting to stdio server: ${command} ${args.join(\" \")}`)\n );\n\n client.addServer(sessionName, {\n command,\n args,\n clientInfo: cliClientInfo,\n });\n\n session = await client.createSession(sessionName);\n\n await saveSession(sessionName, {\n type: \"stdio\",\n command,\n args,\n lastUsed: new Date().toISOString(),\n });\n } else {\n console.error(formatInfo(`Connecting to ${target}...`));\n\n // Static --auth bypasses OAuth entirely. `--no-oauth` disables auto-OAuth\n // on 401 (commander maps `--no-oauth` to options.oauth === false).\n const wantOAuth = !options.auth && options.oauth !== false;\n let authProvider: NodeOAuthClientProvider | undefined;\n if (wantOAuth) {\n const authTimeoutMs = options.authTimeout\n ? Number.parseInt(options.authTimeout, 10)\n : undefined;\n authProvider = await buildOAuthProvider(target, {\n ...(authTimeoutMs ? { authTimeoutMs } : {}),\n });\n }\n\n client.addServer(sessionName, {\n url: target,\n ...(authProvider\n ? { authProvider }\n : options.auth\n ? { headers: { Authorization: `Bearer ${options.auth}` } }\n : {}),\n clientInfo: cliClientInfo,\n });\n\n try {\n session = await client.createSession(sessionName);\n } catch (err) {\n if (authProvider && isUnauthorized(err)) {\n console.error(\n formatWarning(\n \"Server requires authentication. Starting OAuth flow.\"\n )\n );\n await runOAuthFlow(authProvider, target);\n console.error(formatSuccess(\"Authentication successful\"));\n session = await client.createSession(sessionName);\n } else {\n throw err;\n }\n }\n\n await saveSession(sessionName, {\n type: \"http\",\n url: target,\n authMode: authProvider ? \"oauth\" : options.auth ? \"bearer\" : undefined,\n authToken: authProvider ? undefined : options.auth,\n lastUsed: new Date().toISOString(),\n });\n }\n\n activeSessions.set(sessionName, { client, session });\n\n const serverInfo = session.serverInfo;\n const capabilities = session.serverCapabilities;\n\n if (serverInfo) {\n await updateSessionInfo(sessionName, serverInfo, capabilities);\n }\n\n console.log(formatSuccess(`Connected as '${sessionName}'`));\n\n if (serverInfo) {\n console.log(\"\");\n console.log(formatHeader(\"Server Information:\"));\n console.log(\n formatKeyValue({\n Name: serverInfo.name,\n Version: serverInfo.version || \"unknown\",\n })\n );\n }\n\n if (capabilities) {\n console.log(\"\");\n console.log(formatHeader(\"Capabilities:\"));\n const caps = Object.keys(capabilities).join(\", \");\n console.log(` ${caps || \"none\"}`);\n }\n\n const tools = session.tools;\n console.log(\"\");\n console.log(\n formatInfo(\n `Available: ${tools.length} tool${tools.length !== 1 ? \"s\" : \"\"}`\n )\n );\n } catch (error: any) {\n console.error(formatError(`Connection failed: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nasync function disconnectCommand(name: string): Promise<void> {\n try {\n const sessionData = activeSessions.get(name);\n if (sessionData) {\n await sessionData.client.closeAllSessions();\n activeSessions.delete(name);\n console.log(formatSuccess(`Disconnected from ${name}`));\n } else {\n console.log(formatInfo(`Server '${name}' is not connected`));\n }\n } catch (error: any) {\n console.error(formatError(`Failed to disconnect: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nasync function removeClientCommand(name: string): Promise<void> {\n try {\n const config = await getSession(name);\n if (!config) {\n console.error(formatError(`Server '${name}' not found`));\n console.error(\"\");\n console.error(\"See your saved servers with:\");\n console.error(\" mcp-use client list\");\n await cleanupAndExit(1);\n }\n\n const sessionData = activeSessions.get(name);\n if (sessionData) {\n await sessionData.client.closeAllSessions();\n activeSessions.delete(name);\n }\n\n // OAuth tokens are keyed by URL hash, not by saved-server name, so two\n // saved entries pointing at the same URL share one token store. Only\n // wipe the tokens when this entry is the last one using the URL.\n const isOAuthHttp =\n config!.type === \"http\" &&\n config!.authMode === \"oauth\" &&\n typeof config!.url === \"string\";\n const sharedUrlSibling = isOAuthHttp\n ? (await listAllSessions()).find(\n (s) =>\n s.name !== name &&\n s.config.type === \"http\" &&\n s.config.url === config!.url\n )\n : undefined;\n\n await removeSession(name);\n console.log(formatSuccess(`Removed saved server '${name}'`));\n\n if (isOAuthHttp) {\n if (sharedUrlSibling) {\n console.log(\n formatInfo(\n `OAuth tokens for ${config!.url} were kept because saved server '${sharedUrlSibling.name}' still uses that URL.`\n )\n );\n } else {\n try {\n const provider = await buildOAuthProvider(config!.url!);\n await provider.invalidateCredentials(\"all\");\n console.log(formatInfo(`Removed OAuth tokens for ${config!.url}`));\n } catch (error: any) {\n console.error(\n formatWarning(\n `Saved entry removed, but failed to clear OAuth tokens for ${config!.url}: ${error.message}`\n )\n );\n }\n }\n }\n } catch (error: any) {\n console.error(formatError(`Failed to remove server: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nasync function listClientsCommand(): Promise<void> {\n try {\n const sessions = await listAllSessions();\n\n if (sessions.length === 0) {\n if (isStdoutTty()) {\n console.log(formatInfo(\"No saved servers\"));\n console.log(\n formatInfo(\n \"Connect to a server with: npx mcp-use client connect <name> <url>\"\n )\n );\n }\n return;\n }\n\n const tty = isStdoutTty();\n if (tty) {\n console.log(formatHeader(\"Saved Servers:\"));\n console.log(\"\");\n }\n\n const tableData = sessions.map((s) => ({\n name: s.name,\n type: s.config.type,\n target:\n s.config.type === \"http\"\n ? s.config.url || \"\"\n : `${s.config.command} ${(s.config.args || []).join(\" \")}`,\n server: s.config.serverInfo?.name || \"unknown\",\n }));\n\n console.log(\n formatTable(tableData, [\n { key: \"name\", header: \"Name\" },\n { key: \"type\", header: \"Type\" },\n { key: \"target\", header: \"Target\", truncate: true },\n { key: \"server\", header: \"Server\" },\n ])\n );\n } catch (error: any) {\n console.error(formatError(`Failed to list servers: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nasync function listToolsCommand(\n name: string,\n options: { json?: boolean }\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n const tools = await session.listTools();\n\n if (options.json) {\n console.log(formatJson(tools));\n } else if (tools.length === 0) {\n if (isStdoutTty()) console.log(formatInfo(\"No tools available\"));\n } else {\n const tty = isStdoutTty();\n if (tty) {\n console.log(formatHeader(`Available Tools (${tools.length}):`));\n console.log(\"\");\n }\n\n const tableData = tools.map((tool) => {\n const props = (tool.inputSchema as any)?.properties ?? {};\n const required = (tool.inputSchema as any)?.required ?? [];\n const total = Object.keys(props).length;\n const reqCount = Array.isArray(required) ? required.length : 0;\n const argsCell = total === 0 ? chalk.gray(\"—\") : `${reqCount}/${total}`;\n return {\n name: chalk.bold(tool.name),\n mode: formatToolMode((tool as any).annotations),\n args: argsCell,\n description: tool.description || chalk.gray(\"(no description)\"),\n };\n });\n\n console.log(\n formatTable(tableData, [\n { key: \"name\", header: \"Tool\" },\n { key: \"mode\", header: \"Mode\" },\n { key: \"args\", header: \"Args\" },\n { key: \"description\", header: \"Description\", truncate: true },\n ])\n );\n\n if (tty) {\n console.log(\"\");\n console.log(\n chalk.gray(\n \"ARGS shows required/total. Modes: read-only · write · destructive.\"\n )\n );\n }\n }\n } catch (error: any) {\n console.error(formatError(`Failed to list tools: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nasync function describeToolCommand(\n name: string,\n toolName: string\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n const tools = session.tools;\n const tool = tools.find((t) => t.name === toolName);\n\n if (!tool) {\n console.error(formatError(`Tool '${toolName}' not found`));\n console.log(\"\");\n console.log(formatInfo(\"Available tools:\"));\n tools.forEach((t) => console.log(` • ${t.name}`));\n await cleanupAndExit(1);\n }\n\n console.log(formatHeader(`Tool: ${tool!.name}`));\n console.log(\"\");\n\n if (tool!.description) {\n console.log(tool!.description);\n console.log(\"\");\n }\n\n if (tool!.inputSchema) {\n console.log(formatHeader(\"Input Schema:\"));\n console.log(formatSchema(tool!.inputSchema));\n }\n } catch (error: any) {\n console.error(formatError(`Failed to describe tool: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nasync function callToolCommand(\n name: string,\n toolName: string,\n argsList?: string[],\n options?: {\n timeout?: number;\n json?: boolean;\n screenshot?: boolean;\n screenshotOutput?: string;\n screenshotDeviceScaleFactor?: string;\n }\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n\n const tools = session.tools;\n const tool = tools.find((t) => t.name === toolName);\n\n let args: Record<string, unknown> = {};\n if (argsList && argsList.length > 0) {\n try {\n args = parseToolArgs(argsList, tool?.inputSchema as any);\n } catch (error: any) {\n console.error(formatError(error.message));\n console.log(\"\");\n console.log(formatInfo(\"Usage:\"));\n console.log(\n ` npx mcp-use client ${name} tools call ${toolName} key=value [key2=value2 ...]`\n );\n console.log(\n ` npx mcp-use client ${name} tools call ${toolName} nested:='{\"a\":1}' # JSON value`\n );\n console.log(\n ` npx mcp-use client ${name} tools call ${toolName} '{\"key\":\"value\"}' # full JSON object`\n );\n if (tool?.inputSchema) {\n console.log(\"\");\n console.log(formatInfo(\"Tool schema:\"));\n console.log(formatSchema(tool.inputSchema));\n }\n await cleanupAndExit(1);\n }\n } else if (\n tool?.inputSchema?.required &&\n tool.inputSchema.required.length > 0\n ) {\n console.error(formatError(\"This tool requires arguments.\"));\n console.log(\"\");\n console.log(formatInfo(\"Provide arguments as key=value pairs:\"));\n console.log(\n ` npx mcp-use client ${name} tools call ${toolName} key=value [key2=value2 ...]`\n );\n console.log(\"\");\n console.log(formatInfo(\"Tool schema:\"));\n console.log(formatSchema(tool.inputSchema));\n await cleanupAndExit(1);\n }\n\n console.error(formatInfo(`Calling tool '${toolName}'...`));\n const callResult = await session.callTool(toolName, args, {\n timeout: options?.timeout,\n });\n\n // Screenshot is opt-in via --screenshot. Any of the screenshot-related\n // flags also implies opt-in so users don't have to pass `--screenshot`\n // alongside `--screenshot-output`. Capture before printing so the path is\n // part of the printed result — agents reading `--json` output get it\n // inside the JSON. Failures don't fail the tool call.\n const toolWithMeta = session.tools.find((t) => t.name === toolName);\n const resourceUri = detectToolResourceUri(toolWithMeta);\n const wantsScreenshot =\n options?.screenshot === true ||\n options?.screenshotOutput !== undefined ||\n options?.screenshotDeviceScaleFactor !== undefined;\n\n let screenshot: {\n path: string;\n width: number;\n height: number;\n view: string;\n } | null = null;\n let screenshotError: string | null = null;\n let widgetHintUri: string | null = null;\n if (resourceUri) {\n if (wantsScreenshot) {\n console.error(\n formatInfo(`Capturing widget screenshot (${resourceUri})...`)\n );\n try {\n const screenshotOpts: {\n output?: string;\n deviceScaleFactor?: number;\n } = {};\n if (options?.screenshotOutput) {\n screenshotOpts.output = options.screenshotOutput;\n }\n if (options?.screenshotDeviceScaleFactor) {\n screenshotOpts.deviceScaleFactor = parseDeviceScaleFactor(\n options.screenshotDeviceScaleFactor\n );\n }\n const shot = await captureToolScreenshot(\n {\n session,\n toolName,\n toolArgs: args,\n toolOutput: callResult,\n resourceUri,\n },\n screenshotOpts\n );\n screenshot = {\n path: shot.outputPath,\n width: shot.width,\n height: shot.height,\n view: shot.view,\n };\n } catch (err: any) {\n screenshotError = err?.message ?? String(err);\n }\n } else {\n widgetHintUri = resourceUri;\n }\n }\n\n if (options?.json) {\n console.log(formatJson(callResult));\n } else {\n console.log(formatToolCall(callResult));\n }\n\n if (screenshot) {\n // Always announce the screenshot on stderr so `--json` stdout stays a\n // clean CallToolResult — agents piping JSON shouldn't have to filter\n // status lines out of their parse target.\n console.error(\n formatSuccess(\n `Saved widget screenshot: ${screenshot.path} (${screenshot.width}×${screenshot.height})`\n )\n );\n }\n if (screenshotError) {\n console.error(\n formatWarning(`Skipped widget screenshot: ${screenshotError}`)\n );\n }\n if (widgetHintUri) {\n console.error(\n formatInfo(\n `This tool renders a widget (${widgetHintUri}). Re-run with --screenshot to save a PNG of it.`\n )\n );\n }\n\n if (callResult.isError) {\n await cleanupAndExit(1);\n }\n } catch (error: any) {\n console.error(formatError(`Failed to call tool: ${error.message}`));\n if (error?.data !== undefined) {\n console.error(\n chalk.gray(\n typeof error.data === \"string\" ? error.data : formatJson(error.data)\n )\n );\n }\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nasync function listResourcesCommand(\n name: string,\n options: { json?: boolean }\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n const resourcesResult = await session.listAllResources();\n const resources = resourcesResult.resources;\n\n if (options.json) {\n console.log(formatJson(resources));\n } else if (resources.length === 0) {\n if (isStdoutTty()) console.log(formatInfo(\"No resources available\"));\n } else {\n const tty = isStdoutTty();\n if (tty) {\n console.log(formatHeader(`Available Resources (${resources.length}):`));\n console.log(\"\");\n }\n\n const tableData = resources.map((resource) => ({\n name: chalk.bold(resource.name || \"(no name)\"),\n type: resource.mimeType || chalk.gray(\"unknown\"),\n uri: resource.uri,\n }));\n\n console.log(\n formatTable(tableData, [\n { key: \"name\", header: \"Name\" },\n { key: \"type\", header: \"Type\" },\n { key: \"uri\", header: \"URI\", truncate: true },\n ])\n );\n }\n } catch (error: any) {\n console.error(formatError(`Failed to list resources: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nasync function readResourceCommand(\n name: string,\n uri: string,\n options: { json?: boolean }\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n\n console.error(formatInfo(`Reading resource: ${uri}`));\n const resource = await session.readResource(uri);\n\n if (options.json) {\n console.log(formatJson(resource));\n } else {\n console.log(formatResourceContent(resource));\n }\n } catch (error: any) {\n console.error(formatError(`Failed to read resource: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nasync function subscribeResourceCommand(\n name: string,\n uri: string\n): Promise<void> {\n // Subscribe is intentionally long-lived: it keeps the process alive to\n // receive notifications until Ctrl+C. Don't run cleanupAndExit on the\n // success path — only on error.\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n\n await session.subscribeToResource(uri);\n console.log(formatSuccess(`Subscribed to resource: ${uri}`));\n\n session.on(\"notification\", async (notification) => {\n if (notification.method === \"notifications/resources/updated\") {\n console.log(\"\");\n console.log(formatInfo(\"Resource updated:\"));\n console.log(formatJson(notification.params));\n }\n });\n\n console.log(formatInfo(\"Listening for updates... (Press Ctrl+C to stop)\"));\n\n await new Promise(() => {});\n } catch (error: any) {\n console.error(\n formatError(`Failed to subscribe to resource: ${error.message}`)\n );\n await cleanupAndExit(1);\n }\n}\n\nasync function unsubscribeResourceCommand(\n name: string,\n uri: string\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n\n await session.unsubscribeFromResource(uri);\n console.log(formatSuccess(`Unsubscribed from resource: ${uri}`));\n } catch (error: any) {\n console.error(\n formatError(`Failed to unsubscribe from resource: ${error.message}`)\n );\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nasync function listPromptsCommand(\n name: string,\n options: { json?: boolean }\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n const promptsResult = await session.listPrompts();\n const prompts = promptsResult.prompts;\n\n if (options.json) {\n console.log(formatJson(prompts));\n } else if (prompts.length === 0) {\n if (isStdoutTty()) console.log(formatInfo(\"No prompts available\"));\n } else {\n const tty = isStdoutTty();\n if (tty) {\n console.log(formatHeader(`Available Prompts (${prompts.length}):`));\n console.log(\"\");\n }\n\n const tableData = prompts.map((prompt) => {\n const args = (prompt as any).arguments ?? [];\n const reqCount = Array.isArray(args)\n ? args.filter((a: any) => a?.required).length\n : 0;\n const total = Array.isArray(args) ? args.length : 0;\n const argsCell = total === 0 ? chalk.gray(\"—\") : `${reqCount}/${total}`;\n return {\n name: chalk.bold(prompt.name),\n args: argsCell,\n description: prompt.description || chalk.gray(\"(no description)\"),\n };\n });\n\n console.log(\n formatTable(tableData, [\n { key: \"name\", header: \"Prompt\" },\n { key: \"args\", header: \"Args\" },\n { key: \"description\", header: \"Description\", truncate: true },\n ])\n );\n }\n } catch (error: any) {\n console.error(formatError(`Failed to list prompts: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nasync function getPromptCommand(\n name: string,\n promptName: string,\n argsList?: string[],\n options?: { json?: boolean }\n): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) {\n await cleanupAndExit(1);\n }\n\n const { session } = result!;\n\n let args: Record<string, string> = {};\n if (argsList && argsList.length > 0) {\n try {\n args = parsePromptArgs(argsList);\n } catch (error: any) {\n console.error(formatError(error.message));\n console.log(\"\");\n console.log(formatInfo(\"Usage:\"));\n console.log(\n ` npx mcp-use client ${name} prompts get ${promptName} key=value [key2=value2 ...]`\n );\n console.log(\n ` npx mcp-use client ${name} prompts get ${promptName} '{\"key\":\"value\"}' # full JSON object`\n );\n await cleanupAndExit(1);\n }\n }\n\n console.error(formatInfo(`Getting prompt '${promptName}'...`));\n const prompt = await session.getPrompt(promptName, args);\n\n if (options?.json) {\n console.log(formatJson(prompt));\n } else {\n console.log(formatHeader(`Prompt: ${promptName}`));\n console.log(\"\");\n\n if (prompt.description) {\n console.log(prompt.description);\n console.log(\"\");\n }\n\n if (prompt.messages) {\n console.log(formatHeader(\"Messages:\"));\n console.log(\"\");\n console.log(formatPromptMessages(prompt.messages));\n }\n }\n } catch (error: any) {\n console.error(formatError(`Failed to get prompt: ${error.message}`));\n await cleanupAndExit(1);\n }\n await cleanupAndExit(0);\n}\n\nasync function interactiveCommand(name: string): Promise<void> {\n try {\n const result = await getOrRestoreSession(name);\n if (!result) return;\n\n const { name: sessionName, session } = result;\n\n console.log(formatHeader(\"MCP Interactive Mode\"));\n console.log(\"\");\n console.log(formatInfo(`Connected to: ${sessionName}`));\n console.log(\"\");\n console.log(chalk.gray(\"Commands:\"));\n console.log(chalk.gray(\" tools list - List available tools\"));\n console.log(\n chalk.gray(\n \" tools call <name> - Call a tool (will prompt for args)\"\n )\n );\n console.log(chalk.gray(\" tools describe <name> - Show tool details\"));\n console.log(\n chalk.gray(\" resources list - List available resources\")\n );\n console.log(chalk.gray(\" resources read <uri> - Read a resource\"));\n console.log(\n chalk.gray(\" prompts list - List available prompts\")\n );\n console.log(chalk.gray(\" prompts get <name> - Get a prompt\"));\n console.log(\n chalk.gray(\" exit, quit - Exit interactive mode\")\n );\n console.log(\"\");\n\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: chalk.cyan(\"mcp> \"),\n });\n\n rl.prompt();\n\n rl.on(\"line\", async (line) => {\n const trimmed = line.trim();\n\n if (!trimmed) {\n rl.prompt();\n return;\n }\n\n if (trimmed === \"exit\" || trimmed === \"quit\") {\n console.log(formatInfo(\"Goodbye!\"));\n rl.close();\n await cleanupAndExit(0);\n }\n\n const parts = trimmed.split(\" \");\n const scope = parts[0];\n const command = parts[1];\n const arg = parts[2];\n\n try {\n if (scope === \"tools\") {\n if (command === \"list\") {\n const tools = await session.listTools();\n console.log(\n formatInfo(\n `Available tools: ${tools.map((t) => t.name).join(\", \")}`\n )\n );\n } else if (command === \"call\" && arg) {\n // TODO(mcp-1566): mirror the auto widget-screenshot flow from\n // `client tools call` here. Skipped for now to keep the REPL terse.\n rl.question(\n \"Arguments (JSON, or press Enter for none): \",\n async (argsInput) => {\n try {\n const args = argsInput.trim() ? JSON.parse(argsInput) : {};\n const result = await session.callTool(arg, args);\n console.log(formatToolCall(result));\n } catch (error: any) {\n console.error(formatError(error.message));\n }\n rl.prompt();\n }\n );\n return;\n } else if (command === \"describe\" && arg) {\n const tools = session.tools;\n const tool = tools.find((t) => t.name === arg);\n if (tool) {\n console.log(formatHeader(`Tool: ${tool.name}`));\n if (tool.description) console.log(tool.description);\n if (tool.inputSchema) {\n console.log(\"\");\n console.log(formatSchema(tool.inputSchema));\n }\n } else {\n console.error(formatError(`Tool '${arg}' not found`));\n }\n } else {\n console.error(\n formatError(\n \"Invalid command. Try: tools list, tools call <name>, tools describe <name>\"\n )\n );\n }\n } else if (scope === \"resources\") {\n if (command === \"list\") {\n const result = await session.listAllResources();\n const resources = result.resources;\n console.log(\n formatInfo(\n `Available resources: ${resources.map((r) => r.uri).join(\", \")}`\n )\n );\n } else if (command === \"read\" && arg) {\n const resource = await session.readResource(arg);\n console.log(formatResourceContent(resource));\n } else {\n console.error(\n formatError(\n \"Invalid command. Try: resources list, resources read <uri>\"\n )\n );\n }\n } else if (scope === \"prompts\") {\n if (command === \"list\") {\n const result = await session.listPrompts();\n const prompts = result.prompts;\n console.log(\n formatInfo(\n `Available prompts: ${prompts.map((p) => p.name).join(\", \")}`\n )\n );\n } else if (command === \"get\" && arg) {\n rl.question(\n \"Arguments (JSON, or press Enter for none): \",\n async (argsInput) => {\n try {\n const args = argsInput.trim() ? JSON.parse(argsInput) : {};\n const prompt = await session.getPrompt(arg, args);\n console.log(formatPromptMessages(prompt.messages));\n } catch (error: any) {\n console.error(formatError(error.message));\n }\n rl.prompt();\n }\n );\n return;\n } else {\n console.error(\n formatError(\n \"Invalid command. Try: prompts list, prompts get <name>\"\n )\n );\n }\n } else {\n console.error(\n formatError(\n \"Unknown command. Type a valid scope: tools, resources, prompts\"\n )\n );\n }\n } catch (error: any) {\n console.error(formatError(error.message));\n }\n\n rl.prompt();\n });\n\n rl.on(\"close\", async () => {\n console.log(\"\");\n console.log(formatInfo(\"Goodbye!\"));\n await cleanupAndExit(0);\n });\n } catch (error: any) {\n console.error(\n formatError(`Failed to start interactive mode: ${error.message}`)\n );\n await cleanupAndExit(1);\n }\n}\n\n/**\n * Top-level `client` command. Exposes only commands that do not target an\n * existing saved server: `connect` (which creates one) and `list`. Per-server\n * operations live under `createPerClientCommand(<name>)` and are routed by\n * `index.ts` based on the positional after `client`.\n */\nexport function createClientCommand(): Command {\n const clientCommand = new Command(\"client\")\n .description(\n \"Interactive MCP client for terminal usage. Use `mcp-use client <name> ...` to run commands against a saved server.\"\n )\n .showHelpAfterError(\n \"(Run `mcp-use client --help` to see available commands)\"\n );\n\n clientCommand\n .command(\"connect [name] [url]\")\n .description(\n \"Connect to an MCP server and save it under a short name. Use the name to address it in later commands (e.g. `mcp-use client <name> tools list`).\"\n )\n .option(\"--stdio\", \"Use stdio connector instead of HTTP\")\n .option(\"--auth <token>\", \"Static Bearer token (skips OAuth)\")\n .option(\n \"--no-oauth\",\n \"Don't auto-trigger OAuth on 401; fail with the 401 instead\"\n )\n .option(\n \"--auth-timeout <ms>\",\n \"OAuth loopback wait timeout in ms (default 300000)\"\n )\n .action(connectCommand);\n\n clientCommand\n .command(\"list\")\n .description(\"List saved servers\")\n .action(listClientsCommand);\n\n clientCommand\n .command(\"remove <name>\")\n .description(\n \"Remove a saved server. Also clears any OAuth tokens for that URL, unless another saved server still uses it.\"\n )\n .action(removeClientCommand);\n\n clientCommand.addCommand(createClientScreenshotCommand());\n\n return clientCommand;\n}\n\n/**\n * Build the per-server command subtree for a given saved-server name. The\n * name is captured in each action closure so subcommand definitions stay\n * free of an extra positional argument.\n */\nexport function createPerClientCommand(name: string): Command {\n const cmd = new Command(`mcp-use client ${name}`)\n .description(`Commands for server '${name}'`)\n .showHelpAfterError(\n `(Run \\`mcp-use client ${name} --help\\` to see available commands)`\n );\n\n cmd\n .command(\"disconnect\")\n .description(\"Disconnect from this server\")\n .action(() => disconnectCommand(name));\n\n cmd\n .command(\"interactive\")\n .description(\"Start interactive REPL mode for this server\")\n .action(() => interactiveCommand(name));\n\n const toolsCommand = new Command(\"tools\")\n .description(\"Interact with MCP tools\")\n .showHelpAfterError(\n `(Run \\`mcp-use client ${name} tools --help\\` to see available actions)`\n );\n toolsCommand\n .command(\"list\")\n .description(\"List available tools\")\n .option(\"--json\", \"Output as JSON\")\n .action((options) => listToolsCommand(name, options));\n toolsCommand\n .command(\"call <tool> [args...]\")\n .description(\n \"Call a tool. Args as key=value pairs (use key:=<json> for nested values, or pass a JSON object)\"\n )\n .option(\"--timeout <ms>\", \"Request timeout in milliseconds\", parseInt)\n .option(\"--json\", \"Output as JSON\")\n .option(\n \"--screenshot\",\n \"Capture a PNG screenshot of the rendered widget for tools that declare a UI resource\"\n )\n .option(\n \"--screenshot-output <path>\",\n \"Output PNG path for the widget screenshot (implies --screenshot; defaults to ./<view>-<timestamp>.png)\"\n )\n .option(\n \"--screenshot-device-scale-factor <n>\",\n \"Device pixel ratio for the widget screenshot (implies --screenshot; e.g. 2 for Retina). Defaults to 1.\"\n )\n .action((tool, args, options) =>\n callToolCommand(name, tool, args, options)\n );\n toolsCommand\n .command(\"describe <tool>\")\n .description(\"Show tool details and schema\")\n .action((tool) => describeToolCommand(name, tool));\n cmd.addCommand(toolsCommand);\n\n const resourcesCommand = new Command(\"resources\")\n .description(\"Interact with MCP resources\")\n .showHelpAfterError(\n `(Run \\`mcp-use client ${name} resources --help\\` to see available actions)`\n );\n resourcesCommand\n .command(\"list\")\n .description(\"List available resources\")\n .option(\"--json\", \"Output as JSON\")\n .action((options) => listResourcesCommand(name, options));\n resourcesCommand\n .command(\"read <uri>\")\n .description(\"Read a resource by URI\")\n .option(\"--json\", \"Output as JSON\")\n .action((uri, options) => readResourceCommand(name, uri, options));\n resourcesCommand\n .command(\"subscribe <uri>\")\n .description(\"Subscribe to resource updates\")\n .action((uri) => subscribeResourceCommand(name, uri));\n resourcesCommand\n .command(\"unsubscribe <uri>\")\n .description(\"Unsubscribe from resource updates\")\n .action((uri) => unsubscribeResourceCommand(name, uri));\n cmd.addCommand(resourcesCommand);\n\n const promptsCommand = new Command(\"prompts\")\n .description(\"Interact with MCP prompts\")\n .showHelpAfterError(\n `(Run \\`mcp-use client ${name} prompts --help\\` to see available actions)`\n );\n promptsCommand\n .command(\"list\")\n .description(\"List available prompts\")\n .option(\"--json\", \"Output as JSON\")\n .action((options) => listPromptsCommand(name, options));\n promptsCommand\n .command(\"get <prompt> [args...]\")\n .description(\n \"Get a prompt. Args as key=value pairs (or pass a JSON object)\"\n )\n .option(\"--json\", \"Output as JSON\")\n .action((prompt, args, options) =>\n getPromptCommand(name, prompt, args, options)\n );\n cmd.addCommand(promptsCommand);\n\n const authCommand = new Command(\"auth\")\n .description(\"Manage OAuth tokens for HTTP servers\")\n .showHelpAfterError(\n `(Run \\`mcp-use client ${name} auth --help\\` to see available actions)`\n );\n authCommand\n .command(\"status\")\n .description(\"Show OAuth token status for this server\")\n .action(() => authStatusCommand(name));\n authCommand\n .command(\"refresh\")\n .description(\"Force-refresh the OAuth access token\")\n .action(() => authRefreshCommand(name));\n authCommand\n .command(\"logout\")\n .description(\"Remove stored OAuth tokens for this server's URL\")\n .action(() => authLogoutCommand(name));\n cmd.addCommand(authCommand);\n\n cmd.addCommand(createPerClientScreenshotCommand(name));\n\n return cmd;\n}\n","import chalk from \"chalk\";\nimport type { CallToolResult } from \"mcp-use/client\";\n\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g;\nconst GUTTER = \" \";\nconst MIN_TRUNCATABLE_WIDTH = 8;\nconst DEFAULT_MAX_WIDTH = 100;\n\nfunction stripAnsi(s: string): string {\n return s.replace(ANSI_RE, \"\");\n}\n\nfunction visibleWidth(s: string): number {\n return stripAnsi(s).length;\n}\n\nfunction padCell(s: string, width: number): string {\n const w = visibleWidth(s);\n if (w >= width) return s;\n return s + \" \".repeat(width - w);\n}\n\nfunction truncateCell(s: string, width: number): string {\n if (width <= 0) return \"\";\n const plain = stripAnsi(s);\n if (plain.length <= width) return s;\n if (width === 1) return \"…\";\n return plain.slice(0, width - 1) + \"…\";\n}\n\ninterface TableColumn {\n key: string;\n header: string;\n width?: number;\n truncate?: boolean;\n}\n\ninterface FormatTableOptions {\n /**\n * Force TSV output regardless of TTY detection. When undefined, auto-detects:\n * non-TTY stdout (pipes, agents, CI) gets TSV; TTY gets the borderless table.\n */\n tsv?: boolean;\n /**\n * Maximum total line width for the table. Defaults to the terminal width\n * (process.stdout.columns) or 100 when unavailable.\n */\n maxWidth?: number;\n}\n\n/**\n * Render rows as either a borderless aligned-columns table (TTY, gh-style)\n * or tab-separated values (non-TTY, machine-readable). Width math strips\n * ANSI escape sequences so colored cells align correctly.\n */\nexport function formatTable(\n data: Array<Record<string, any>>,\n columns: TableColumn[],\n options: FormatTableOptions = {}\n): string {\n const tsv = options.tsv ?? !process.stdout.isTTY;\n\n if (tsv) {\n return data\n .map((row) =>\n columns\n .map((c) =>\n stripAnsi(String(row[c.key] ?? \"\")).replace(/[\\t\\r\\n]+/g, \" \")\n )\n .join(\"\\t\")\n )\n .join(\"\\n\");\n }\n\n if (data.length === 0) {\n return chalk.gray(\"No items found\");\n }\n\n const maxWidth =\n options.maxWidth ?? process.stdout.columns ?? DEFAULT_MAX_WIDTH;\n\n // Natural width = max(header width, widest cell), per column.\n const natural = columns.map((col) => {\n const headerW = col.header.length;\n const dataW = data.reduce((m, row) => {\n return Math.max(m, visibleWidth(String(row[col.key] ?? \"\")));\n }, 0);\n return Math.max(headerW, dataW);\n });\n\n const widths = columns.map((c, i) => c.width ?? natural[i]);\n const overhead = GUTTER.length * (columns.length - 1);\n const totalWidth = () => widths.reduce((s, w) => s + w, 0) + overhead;\n\n // If the natural layout overflows, squeeze truncatable columns proportionally\n // to their natural size. Non-truncatable columns keep their full width.\n if (totalWidth() > maxWidth) {\n const truncIdxs = columns\n .map((c, i) => (c.truncate ? i : -1))\n .filter((i) => i >= 0);\n if (truncIdxs.length > 0) {\n const fixedSum = columns.reduce(\n (s, c, i) => s + (c.truncate ? 0 : widths[i]),\n 0\n );\n const remaining = Math.max(\n truncIdxs.length * MIN_TRUNCATABLE_WIDTH,\n maxWidth - fixedSum - overhead\n );\n const truncSum = truncIdxs.reduce((s, i) => s + widths[i], 0) || 1;\n let used = 0;\n truncIdxs.forEach((i, idx) => {\n if (idx === truncIdxs.length - 1) {\n widths[i] = Math.max(MIN_TRUNCATABLE_WIDTH, remaining - used);\n } else {\n const share = Math.max(\n MIN_TRUNCATABLE_WIDTH,\n Math.floor((widths[i] / truncSum) * remaining)\n );\n widths[i] = share;\n used += share;\n }\n });\n }\n }\n\n const lines: string[] = [];\n\n // Header: UPPERCASE, bold. Pad all but the last cell.\n const headerCells = columns.map((c, i) => {\n const text = c.header.toUpperCase();\n const cell = i === columns.length - 1 ? text : padCell(text, widths[i]);\n return chalk.bold(cell);\n });\n lines.push(headerCells.join(GUTTER).trimEnd());\n\n for (const row of data) {\n const cells = columns.map((c, i) => {\n let v = String(row[c.key] ?? \"\");\n if (visibleWidth(v) > widths[i]) {\n v = truncateCell(v, widths[i]);\n }\n return i === columns.length - 1 ? v : padCell(v, widths[i]);\n });\n lines.push(cells.join(GUTTER).trimEnd());\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Whether stdout is piped/redirected. Callers use this to suppress decorative\n * headers (\"Available Tools (N):\") in non-TTY mode so output stays parseable.\n */\nexport function isStdoutTty(): boolean {\n return Boolean(process.stdout.isTTY);\n}\n\n/**\n * One-word tool mode badge derived from MCP tool annotations.\n * `readOnlyHint` wins; explicit `destructiveHint` is shown red; everything\n * else is \"write\" (yellow), the safer-than-destructive default for the many\n * tools that simply don't annotate.\n */\nexport function formatToolMode(annotations?: {\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n}): string {\n if (annotations?.readOnlyHint === true) return chalk.green(\"read-only\");\n if (annotations?.destructiveHint === true) return chalk.red(\"destructive\");\n return chalk.yellow(\"write\");\n}\n\n/**\n * Format data as JSON\n */\nexport function formatJson(data: any, pretty = true): string {\n if (pretty) {\n return JSON.stringify(data, null, 2);\n }\n return JSON.stringify(data);\n}\n\n/**\n * Format a tool call result\n */\nexport function formatToolCall(result: CallToolResult): string {\n const lines: string[] = [];\n const { isError, structuredContent } = result;\n const hasStructured =\n structuredContent !== undefined && structuredContent !== null;\n // Per MCP spec, when a tool returns structuredContent it SHOULD also\n // serialize the same JSON into a TextContent block for backwards\n // compatibility. Treat structuredContent as canonical and drop the text\n // duplicate. Non-text blocks (image/resource markers) are kept — they carry\n // information the structured payload doesn't, even though the terminal can\n // only render them as placeholders.\n const visibleContent = (result.content ?? []).filter(\n (item) => !hasStructured || item.type !== \"text\"\n );\n const hasVisibleContent = visibleContent.length > 0;\n\n if (isError) {\n lines.push(chalk.red(\"✗ Tool execution failed\"));\n lines.push(\"\");\n } else {\n lines.push(chalk.green(\"✓ Tool executed successfully\"));\n lines.push(\"\");\n }\n\n if (hasVisibleContent) {\n if (isError) {\n lines.push(chalk.red.bold(\"Error details:\"));\n }\n visibleContent.forEach((item, index) => {\n if (visibleContent.length > 1) {\n lines.push(chalk.bold(`Content ${index + 1}:`));\n }\n\n if (item.type === \"text\") {\n lines.push(isError ? chalk.red(item.text) : item.text);\n } else if (item.type === \"image\") {\n lines.push(chalk.cyan(`[Image: ${item.mimeType || \"unknown type\"}]`));\n if (item.data) {\n lines.push(chalk.gray(`Data: ${item.data.substring(0, 50)}...`));\n }\n } else if (item.type === \"resource\") {\n lines.push(chalk.cyan(`[Resource]`));\n if (item.resource?.uri) {\n lines.push(chalk.gray(`URI: ${item.resource.uri}`));\n }\n if (item.resource && \"text\" in item.resource && item.resource.text) {\n lines.push(item.resource.text);\n }\n } else {\n lines.push(chalk.gray(`[Unknown content type: ${item.type}]`));\n }\n\n if (index < visibleContent.length - 1) {\n lines.push(\"\");\n }\n });\n }\n\n if (hasStructured) {\n if (isError) {\n lines.push(chalk.bold(\"Structured error data:\"));\n }\n lines.push(formatJson(structuredContent));\n }\n\n if (isError && !hasVisibleContent && !hasStructured) {\n lines.push(chalk.gray(\"(no error details provided by server)\"));\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format resource content\n */\nexport function formatResourceContent(content: any): string {\n if (!content || !content.contents) {\n return chalk.gray(\"No content\");\n }\n\n const lines: string[] = [];\n\n content.contents.forEach((item: any, index: number) => {\n if (content.contents.length > 1) {\n lines.push(chalk.bold(`Content ${index + 1}:`));\n }\n\n if (item.uri) {\n lines.push(chalk.gray(`URI: ${item.uri}`));\n }\n\n if (item.mimeType) {\n lines.push(chalk.gray(`Type: ${item.mimeType}`));\n }\n\n if (\"text\" in item && item.text) {\n lines.push(\"\");\n lines.push(item.text);\n } else if (\"blob\" in item && item.blob) {\n lines.push(\"\");\n lines.push(chalk.cyan(`[Binary data: ${item.blob.length} bytes]`));\n }\n\n if (index < content.contents.length - 1) {\n lines.push(\"\");\n lines.push(chalk.gray(\"─\".repeat(50)));\n lines.push(\"\");\n }\n });\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a JSON schema in a readable way\n */\nexport function formatSchema(schema: any, indent = 0): string {\n if (!schema) {\n return chalk.gray(\"No schema\");\n }\n\n const lines: string[] = [];\n const pad = \" \".repeat(indent);\n\n if (schema.type === \"object\" && schema.properties) {\n Object.entries(schema.properties).forEach(([key, value]: [string, any]) => {\n const required = schema.required?.includes(key);\n const type = value.type || \"any\";\n const desc = value.description || \"\";\n\n const keyStr = required ? chalk.bold(key) : key;\n const typeStr = chalk.cyan(`(${type})`);\n const requiredStr = required ? chalk.red(\" *required\") : \"\";\n\n lines.push(`${pad}${keyStr} ${typeStr}${requiredStr}`);\n\n if (desc) {\n lines.push(`${pad} ${chalk.gray(desc)}`);\n }\n\n // Handle nested objects\n if (value.type === \"object\" && value.properties) {\n lines.push(formatSchema(value, indent + 1));\n }\n\n // Handle arrays\n if (value.type === \"array\" && value.items) {\n lines.push(`${pad} ${chalk.gray(\"Items:\")}`);\n if (value.items.type === \"object\") {\n lines.push(formatSchema(value.items, indent + 2));\n } else {\n lines.push(\n `${pad} ${chalk.cyan(`(${value.items.type || \"any\"})`)}`\n );\n }\n }\n });\n } else {\n lines.push(`${pad}${chalk.cyan(`Type: ${schema.type || \"any\"}`)}`);\n if (schema.description) {\n lines.push(`${pad}${chalk.gray(schema.description)}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a list of items with bullets\n */\nexport function formatList(items: string[], bullet = \"•\"): string {\n return items.map((item) => ` ${bullet} ${item}`).join(\"\\n\");\n}\n\n/**\n * Format an error message\n */\nexport function formatError(error: Error | string): string {\n const message = typeof error === \"string\" ? error : error.message;\n return chalk.red(`✗ Error: ${message}`);\n}\n\n/**\n * Format a success message\n */\nexport function formatSuccess(message: string): string {\n return chalk.green(`✓ ${message}`);\n}\n\n/**\n * Format an info message\n */\nexport function formatInfo(message: string): string {\n return chalk.cyan(message);\n}\n\n/**\n * Format a warning message\n */\nexport function formatWarning(message: string): string {\n return chalk.yellow(`⚠ ${message}`);\n}\n\n/**\n * Create a section header\n */\nexport function formatHeader(text: string): string {\n return chalk.bold.white(text);\n}\n\n/**\n * Format key-value pairs\n */\nexport function formatKeyValue(\n pairs: Record<string, string | number | boolean>\n): string {\n const maxKeyLength = Math.max(...Object.keys(pairs).map((k) => k.length), 0);\n\n return Object.entries(pairs)\n .map(([key, value]) => {\n const paddedKey = key.padEnd(maxKeyLength);\n return ` ${chalk.gray(paddedKey)}: ${value}`;\n })\n .join(\"\\n\");\n}\n\n/**\n * Format prompt messages\n */\n/**\n * Format a date string as relative time (e.g., \"2 hours ago\", \"3 days ago\")\n */\nexport function formatRelativeTime(dateString: string): string {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSecs = Math.floor(diffMs / 1000);\n const diffMins = Math.floor(diffSecs / 60);\n const diffHours = Math.floor(diffMins / 60);\n const diffDays = Math.floor(diffHours / 24);\n const diffWeeks = Math.floor(diffDays / 7);\n const diffMonths = Math.floor(diffDays / 30);\n const diffYears = Math.floor(diffDays / 365);\n\n if (diffYears > 0) {\n return `${diffYears} year${diffYears > 1 ? \"s\" : \"\"} ago`;\n } else if (diffMonths > 0) {\n return `${diffMonths} month${diffMonths > 1 ? \"s\" : \"\"} ago`;\n } else if (diffWeeks > 0) {\n return `${diffWeeks} week${diffWeeks > 1 ? \"s\" : \"\"} ago`;\n } else if (diffDays > 0) {\n return `${diffDays} day${diffDays > 1 ? \"s\" : \"\"} ago`;\n } else if (diffHours > 0) {\n return `${diffHours} hour${diffHours > 1 ? \"s\" : \"\"} ago`;\n } else if (diffMins > 0) {\n return `${diffMins} minute${diffMins > 1 ? \"s\" : \"\"} ago`;\n } else {\n return \"just now\";\n }\n}\n\nexport function formatPromptMessages(messages: any[]): string {\n if (!messages || messages.length === 0) {\n return chalk.gray(\"No messages\");\n }\n\n const lines: string[] = [];\n\n messages.forEach((msg, index) => {\n const role = msg.role || \"unknown\";\n const roleStr =\n role === \"user\"\n ? chalk.blue(\"[User]\")\n : role === \"assistant\"\n ? chalk.green(\"[Assistant]\")\n : chalk.gray(`[${role}]`);\n\n lines.push(`${roleStr}`);\n\n if (msg.content) {\n if (typeof msg.content === \"string\") {\n lines.push(msg.content);\n } else if (msg.content.type === \"text\") {\n lines.push(msg.content.text);\n } else if (msg.content.type === \"image\") {\n lines.push(chalk.cyan(`[Image: ${msg.content.mimeType}]`));\n } else if (msg.content.type === \"resource\") {\n lines.push(chalk.cyan(`[Resource: ${msg.content.resource?.uri}]`));\n if (msg.content.resource?.text) {\n lines.push(msg.content.resource.text);\n }\n }\n }\n\n if (index < messages.length - 1) {\n lines.push(\"\");\n }\n });\n\n return lines.join(\"\\n\");\n}\n","/**\n * Parse positional `key=value` arguments for `tools call` and `prompts get`.\n *\n * Forms accepted (per token):\n * key=value → string by default; coerced using the tool's input schema\n * (number/integer/boolean/array/object) when available\n * key:=jsonvalue → value is parsed as JSON (httpie convention); use this for\n * nested objects/arrays or to force a non-string scalar\n * --key=value → leading `--` is accepted and stripped (forgiving for users\n * who reach for a flag-style habit)\n *\n * Backward-compatible fallback: a single token that starts with `{` is parsed\n * as a JSON object covering all arguments at once.\n */\n\ntype JsonSchemaLike = {\n type?: string | string[];\n properties?: Record<string, JsonSchemaLike>;\n required?: string[];\n};\n\nexport function parseToolArgs(\n rawArgs: string[] | undefined,\n inputSchema?: JsonSchemaLike\n): Record<string, unknown> {\n if (!rawArgs || rawArgs.length === 0) return {};\n\n // Backward-compat: single JSON object argument\n if (rawArgs.length === 1) {\n const trimmed = rawArgs[0].trim();\n if (trimmed.startsWith(\"{\")) {\n try {\n const parsed = JSON.parse(trimmed);\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n throw new Error(\"expected a JSON object\");\n }\n return parsed as Record<string, unknown>;\n } catch (err) {\n throw new Error(`Invalid JSON arguments: ${(err as Error).message}`);\n }\n }\n }\n\n const props = inputSchema?.properties ?? {};\n const result: Record<string, unknown> = {};\n\n for (const raw of rawArgs) {\n // Strip optional leading `--` to be forgiving for flag-style habits.\n const token = raw.startsWith(\"--\") ? raw.slice(2) : raw;\n\n const jsonIdx = token.indexOf(\":=\");\n const eqIdx = token.indexOf(\"=\");\n\n let key: string;\n let rawValue: string;\n let forceJson = false;\n\n if (jsonIdx !== -1 && (eqIdx === -1 || jsonIdx < eqIdx)) {\n key = token.slice(0, jsonIdx);\n rawValue = token.slice(jsonIdx + 2);\n forceJson = true;\n } else if (eqIdx !== -1) {\n key = token.slice(0, eqIdx);\n rawValue = token.slice(eqIdx + 1);\n } else {\n throw new Error(\n `Invalid argument '${raw}'. Use key=value or key:=jsonvalue.`\n );\n }\n\n if (!key) {\n throw new Error(`Empty key in argument '${raw}'`);\n }\n\n result[key] = coerceArgValue(rawValue, props[key], forceJson, key);\n }\n\n return result;\n}\n\nfunction coerceArgValue(\n value: string,\n propSchema: JsonSchemaLike | undefined,\n forceJson: boolean,\n key: string\n): unknown {\n if (forceJson) {\n try {\n return JSON.parse(value);\n } catch (err) {\n throw new Error(\n `Invalid JSON value for '${key}': ${(err as Error).message}`\n );\n }\n }\n\n const types = Array.isArray(propSchema?.type)\n ? propSchema!.type\n : propSchema?.type\n ? [propSchema.type as string]\n : [];\n\n if (types.includes(\"null\") && (value === \"null\" || value === \"\")) {\n return null;\n }\n\n if (types.includes(\"integer\")) {\n const n = Number(value);\n if (!Number.isFinite(n) || !Number.isInteger(n)) {\n throw new Error(`Expected integer for '${key}', got '${value}'`);\n }\n return n;\n }\n\n if (types.includes(\"number\")) {\n const n = Number(value);\n if (!Number.isFinite(n)) {\n throw new Error(`Expected number for '${key}', got '${value}'`);\n }\n return n;\n }\n\n if (types.includes(\"boolean\")) {\n if (value === \"true\" || value === \"1\") return true;\n if (value === \"false\" || value === \"0\") return false;\n throw new Error(\n `Expected boolean (true/false) for '${key}', got '${value}'`\n );\n }\n\n if (types.includes(\"array\") || types.includes(\"object\")) {\n try {\n return JSON.parse(value);\n } catch (err) {\n const wanted = types.includes(\"array\") ? \"array\" : \"object\";\n throw new Error(\n `Expected JSON ${wanted} for '${key}'. Tip: use ${key}:=<json>. ${(err as Error).message}`\n );\n }\n }\n\n return value;\n}\n\n/**\n * Parse positional `key=value` arguments for prompts. Prompt arguments are\n * always strings per the MCP spec, so we skip type coercion entirely.\n */\nexport function parsePromptArgs(\n rawArgs: string[] | undefined\n): Record<string, string> {\n if (!rawArgs || rawArgs.length === 0) return {};\n\n if (rawArgs.length === 1) {\n const trimmed = rawArgs[0].trim();\n if (trimmed.startsWith(\"{\")) {\n try {\n const parsed = JSON.parse(trimmed);\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n throw new Error(\"expected a JSON object\");\n }\n // Coerce all values to strings for prompt args.\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(parsed)) {\n out[k] = typeof v === \"string\" ? v : JSON.stringify(v);\n }\n return out;\n } catch (err) {\n throw new Error(`Invalid JSON arguments: ${(err as Error).message}`);\n }\n }\n }\n\n const result: Record<string, string> = {};\n for (const raw of rawArgs) {\n const token = raw.startsWith(\"--\") ? raw.slice(2) : raw;\n const eqIdx = token.indexOf(\"=\");\n if (eqIdx === -1) {\n throw new Error(`Invalid argument '${raw}'. Use key=value.`);\n }\n const key = token.slice(0, eqIdx);\n const value = token.slice(eqIdx + 1);\n if (!key) {\n throw new Error(`Empty key in argument '${raw}'`);\n }\n result[key] = value;\n }\n return result;\n}\n","import {\n auth,\n NodeOAuthClientProvider,\n OAuthFlowError,\n UnauthorizedError,\n type NodeOAuthOptions,\n} from \"mcp-use/auth/node\";\nimport { createInterface } from \"node:readline\";\n\n/**\n * Build a NodeOAuthClientProvider that prints the authorization URL for the\n * user to open themselves. We never auto-launch a browser from the CLI — a\n * surprise window when an agent or script invokes `mcp-use` is worse than the\n * extra click for an interactive user.\n */\nexport async function buildOAuthProvider(\n serverUrl: string,\n options: Omit<NodeOAuthOptions, \"openBrowser\"> = {}\n): Promise<NodeOAuthClientProvider> {\n return NodeOAuthClientProvider.create(serverUrl, {\n clientName: \"mcp-use CLI\",\n clientUri: \"https://mcp-use.com\",\n storageKeyPrefix: \"mcp:auth\",\n ...options,\n openBrowser: async (url) => {\n console.error(`\\n Open this URL in a browser to authenticate:`);\n console.error(` ${url}\\n`);\n },\n });\n}\n\n/**\n * Run the full two-call OAuth dance:\n * 1. auth() → triggers redirectToAuthorization (prints URL, binds loopback)\n * 2. await provider.getAuthorizationCode()\n * 3. auth() with the code → exchanges for tokens, persists via FileKVStore\n *\n * Mirrors the orchestrator pattern in `useMcp.ts:1121-1145`.\n */\nexport async function runOAuthFlow(\n provider: NodeOAuthClientProvider,\n serverUrl: string,\n print: (line: string) => void = console.error.bind(console)\n): Promise<void> {\n print(`→ OAuth authentication required.`);\n print(\n ` Listening on http://127.0.0.1:${provider.callbackPort}/callback (waiting up to 5m)`\n );\n\n // SDK transports (e.g. StreamableHTTPClientTransport) auto-call auth() on a\n // 401, which already invokes redirectToAuthorization (loopback bound, browser\n // opened). In that case skip the first auth() call — calling it again would\n // throw \"an authorization is already in progress\".\n if (!provider.hasPendingFlow) {\n const result = await auth(provider, { serverUrl });\n if (result === \"AUTHORIZED\") {\n // Pre-existing valid tokens; nothing to do.\n return;\n }\n if (result !== \"REDIRECT\") {\n throw new OAuthFlowError(\n \"unexpected_auth_result\",\n `auth() returned ${result}`\n );\n }\n }\n\n const code = await provider.getAuthorizationCode();\n await auth(provider, { serverUrl, authorizationCode: code });\n}\n\n/** True if the unwrapped error is an SDK 401 we should respond to with OAuth. */\nexport function isUnauthorized(err: unknown): boolean {\n if (err instanceof UnauthorizedError) return true;\n // Some transports rewrap; check by name + message as a fallback.\n if (err instanceof Error && err.name === \"UnauthorizedError\") return true;\n // mcp-use's HttpConnector rewraps SDK 401s as a plain Error with `code = 401`\n // (see packages/mcp-use/src/connectors/http.ts:228, :255).\n if (err instanceof Error && (err as { code?: unknown }).code === 401) {\n return true;\n }\n return false;\n}\n\n/** Minimal yes/no prompt. Returns true on Y/y/yes/<enter>, false otherwise. */\nexport async function promptYesNo(\n question: string,\n defaultYes = true\n): Promise<boolean> {\n if (!process.stdin.isTTY) return false;\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const answer = await new Promise<string>((resolve) => {\n rl.question(`${question} ${defaultYes ? \"[Y/n] \" : \"[y/N] \"}`, resolve);\n });\n const trimmed = answer.trim().toLowerCase();\n if (!trimmed) return defaultYes;\n return trimmed === \"y\" || trimmed === \"yes\";\n } finally {\n rl.close();\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\n\nexport interface SessionConfig {\n type: \"http\" | \"stdio\";\n url?: string;\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n /** Static Bearer token. Used when authMode is undefined or \"bearer\". */\n authToken?: string;\n /**\n * How this session authenticates to the server.\n * - \"bearer\": static token in `authToken`.\n * - \"oauth\": tokens live in `~/.mcp-use/oauth/<urlHash>/`, managed by NodeOAuthClientProvider.\n * Undefined = legacy bearer (back-compat with sessions saved before OAuth shipped).\n */\n authMode?: \"bearer\" | \"oauth\";\n lastUsed: string;\n serverInfo?: {\n name: string;\n version?: string;\n };\n capabilities?: Record<string, unknown>;\n}\n\ninterface SessionStorage {\n sessions: Record<string, SessionConfig>;\n}\n\nconst SESSION_FILE_PATH = join(homedir(), \".mcp-use\", \"cli-sessions.json\");\n\nlet _dirEnsured = false;\nasync function ensureSessionDir(): Promise<void> {\n if (_dirEnsured) return;\n // `mkdir({ recursive: true })` is a no-op when the dir already exists, so\n // we don't need a separate `existsSync` check.\n await mkdir(join(homedir(), \".mcp-use\"), { recursive: true });\n _dirEnsured = true;\n}\n\n/**\n * Load persisted servers from disk.\n *\n * Tolerates older files that include an `activeSession` field — the field is\n * silently dropped. The CLI no longer tracks an active server; every command\n * names its target explicitly.\n */\nexport async function loadSessions(): Promise<SessionStorage> {\n try {\n await ensureSessionDir();\n\n if (!existsSync(SESSION_FILE_PATH)) {\n return { sessions: {} };\n }\n\n const content = await readFile(SESSION_FILE_PATH, \"utf-8\");\n const parsed = JSON.parse(content);\n return { sessions: parsed?.sessions ?? {} };\n } catch {\n return { sessions: {} };\n }\n}\n\nasync function saveSessions(storage: SessionStorage): Promise<void> {\n await ensureSessionDir();\n await writeFile(SESSION_FILE_PATH, JSON.stringify(storage, null, 2), \"utf-8\");\n}\n\nexport async function saveSession(\n name: string,\n config: SessionConfig\n): Promise<void> {\n const storage = await loadSessions();\n storage.sessions[name] = {\n ...config,\n lastUsed: new Date().toISOString(),\n };\n await saveSessions(storage);\n}\n\nexport async function removeSession(name: string): Promise<void> {\n const storage = await loadSessions();\n delete storage.sessions[name];\n await saveSessions(storage);\n}\n\nexport async function getSession(name: string): Promise<SessionConfig | null> {\n const storage = await loadSessions();\n return storage.sessions[name] || null;\n}\n\nexport async function listAllSessions(): Promise<\n Array<{ name: string; config: SessionConfig }>\n> {\n const storage = await loadSessions();\n return Object.entries(storage.sessions).map(([name, config]) => ({\n name,\n config,\n }));\n}\n\nexport async function updateSessionInfo(\n name: string,\n serverInfo: { name: string; version?: string },\n capabilities?: Record<string, unknown>\n): Promise<void> {\n const storage = await loadSessions();\n\n if (storage.sessions[name]) {\n storage.sessions[name].serverInfo = serverInfo;\n storage.sessions[name].capabilities = capabilities;\n storage.sessions[name].lastUsed = new Date().toISOString();\n await saveSessions(storage);\n }\n}\n","import type { MCPSession } from \"mcp-use/client\";\nimport { MCPClient } from \"mcp-use/client\";\nimport type { NodeOAuthClientProvider } from \"mcp-use/auth/node\";\nimport { getPackageVersion } from \"mcp-use/server\";\nimport { formatError, formatInfo } from \"./format.js\";\nimport {\n buildOAuthProvider,\n isUnauthorized,\n promptYesNo,\n runOAuthFlow,\n} from \"./oauth.js\";\nimport { getSession } from \"./session-storage.js\";\n\nexport const activeSessions = new Map<\n string,\n { client: MCPClient; session: MCPSession }\n>();\n\n/**\n * Default clientInfo for mcp-use CLI.\n */\nexport function getCliClientInfo() {\n return {\n name: \"mcp-use CLI\",\n title: \"mcp-use CLI\",\n version: getPackageVersion(),\n description: \"mcp-use CLI - Command-line interface for MCP servers\",\n icons: [\n {\n src: \"https://manufact.com/logo.png\",\n },\n ],\n websiteUrl: \"https://manufact.com\",\n };\n}\n\n/**\n * Close every in-memory session and exit with `code`.\n *\n * Each `client` subcommand opens a fresh transport per process invocation,\n * which keeps an HTTP/SSE socket alive after the command returns. Without\n * this, the Node event loop never goes idle and headless agents hang.\n */\nexport async function cleanupAndExit(code: number): Promise<never> {\n for (const [name, { client }] of activeSessions) {\n try {\n await client.closeAllSessions();\n } catch {\n // best-effort: we're exiting anyway\n }\n activeSessions.delete(name);\n }\n process.exit(code);\n}\n\n/**\n * Get or restore a session by name. For OAuth-mode sessions whose tokens\n * have expired and can't be refreshed, prompts to re-auth on TTY or prints\n * a clear `connect` command to re-run on non-TTY.\n *\n * `sessionName` is required — there is no implicit \"active\" server.\n */\nexport async function getOrRestoreSession(\n sessionName: string\n): Promise<{ name: string; session: MCPSession } | null> {\n if (activeSessions.has(sessionName)) {\n const { session } = activeSessions.get(sessionName)!;\n return { name: sessionName, session };\n }\n\n const config = await getSession(sessionName);\n if (!config) {\n console.error(formatError(`Server '${sessionName}' not found`));\n console.error(\n formatInfo(\n `Connect with: npx mcp-use client connect ${sessionName} <url>`\n )\n );\n return null;\n }\n\n try {\n const client = new MCPClient();\n const cliClientInfo = getCliClientInfo();\n let authProvider: NodeOAuthClientProvider | undefined;\n\n if (config.type === \"http\") {\n if (config.authMode === \"oauth\") {\n authProvider = await buildOAuthProvider(config.url!);\n client.addServer(sessionName, {\n url: config.url!,\n authProvider,\n clientInfo: cliClientInfo,\n });\n } else {\n client.addServer(sessionName, {\n url: config.url!,\n headers: config.authToken\n ? { Authorization: `Bearer ${config.authToken}` }\n : undefined,\n clientInfo: cliClientInfo,\n });\n }\n } else if (config.type === \"stdio\") {\n client.addServer(sessionName, {\n command: config.command!,\n args: config.args || [],\n env: config.env,\n clientInfo: cliClientInfo,\n });\n } else {\n console.error(formatError(`Unknown session type: ${config.type}`));\n return null;\n }\n\n let session: MCPSession;\n try {\n session = await client.createSession(sessionName);\n } catch (err) {\n // OAuth-only fallback: tokens expired and refresh failed → re-auth.\n if (\n config.type === \"http\" &&\n config.authMode === \"oauth\" &&\n authProvider &&\n isUnauthorized(err)\n ) {\n const reAuth = await promptYesNo(\n `! Tokens for server '${sessionName}' expired and could not refresh. Re-authenticate now?`,\n true\n );\n if (!reAuth) {\n console.error(formatError(`Tokens expired and could not refresh.`));\n console.error(\n formatInfo(\n `Run: mcp-use client connect ${sessionName} ${config.url}`\n )\n );\n return null;\n }\n await runOAuthFlow(authProvider, config.url!);\n session = await client.createSession(sessionName);\n } else {\n throw err;\n }\n }\n\n activeSessions.set(sessionName, { client, session });\n return { name: sessionName, session };\n } catch (error: any) {\n console.error(formatError(`Failed to restore server: ${error.message}`));\n return null;\n }\n}\n","import {\n formatError,\n formatInfo,\n formatKeyValue,\n formatSuccess,\n} from \"../utils/format.js\";\nimport { buildOAuthProvider } from \"../utils/oauth.js\";\nimport { getSession } from \"../utils/session-storage.js\";\n\nasync function resolveSession(\n name: string\n): Promise<{ name: string; url: string } | null> {\n const config = await getSession(name);\n if (!config) {\n console.error(formatError(`Server '${name}' not found`));\n return null;\n }\n if (config.type !== \"http\") {\n console.error(formatError(\"Auth commands only apply to HTTP servers\"));\n return null;\n }\n if (config.authMode !== \"oauth\") {\n console.error(\n formatError(\n `Server '${name}' was not authenticated via OAuth (authMode=${config.authMode ?? \"bearer\"})`\n )\n );\n return null;\n }\n return { name, url: config.url! };\n}\n\nfunction formatExpiresIn(expSec: number): string {\n const ms = expSec * 1000 - Date.now();\n if (ms <= 0) return \"expired\";\n const mins = Math.round(ms / 60_000);\n if (mins < 60) return `${mins}m`;\n const hours = Math.floor(mins / 60);\n const rem = mins % 60;\n return rem ? `${hours}h${rem}m` : `${hours}h`;\n}\n\nfunction decodeJwtExp(token: string): number | null {\n try {\n const parts = token.split(\".\");\n if (parts.length < 2) return null;\n const payload = JSON.parse(\n Buffer.from(parts[1], \"base64url\").toString(\"utf-8\")\n );\n return typeof payload.exp === \"number\" ? payload.exp : null;\n } catch {\n return null;\n }\n}\n\nexport async function authStatusCommand(name: string): Promise<void> {\n const target = await resolveSession(name);\n if (!target) {\n process.exit(1);\n }\n const { name: serverName, url } = target;\n const provider = await buildOAuthProvider(url);\n const tokens = await provider.tokens();\n\n const fields: Record<string, string> = {\n server: serverName,\n url,\n tokens: tokens?.access_token ? \"present\" : \"missing\",\n };\n if (tokens?.scope) fields.scope = tokens.scope;\n if (tokens?.access_token) {\n const exp = decodeJwtExp(tokens.access_token);\n fields.expires_in = exp ? formatExpiresIn(exp) : \"unknown (opaque token)\";\n }\n fields.refresh = tokens?.refresh_token ? \"available\" : \"missing\";\n\n console.log(formatKeyValue(fields));\n\n if (!tokens?.access_token) process.exit(1);\n}\n\nexport async function authRefreshCommand(name: string): Promise<void> {\n const target = await resolveSession(name);\n if (!target) {\n process.exit(1);\n }\n const { name: serverName, url } = target;\n const provider = await buildOAuthProvider(url);\n const refreshed = await provider.forceRefresh();\n if (!refreshed) {\n console.error(\n formatError(\n \"Refresh failed (no refresh_token, or server rejected). Re-connect to re-authenticate.\"\n )\n );\n console.error(\n formatInfo(`Run: mcp-use client connect ${serverName} ${url}`)\n );\n process.exit(1);\n }\n const exp = refreshed.access_token\n ? decodeJwtExp(refreshed.access_token)\n : null;\n console.log(\n formatSuccess(\n `Refreshed access token${exp ? ` (expires in ${formatExpiresIn(exp)})` : \"\"}`\n )\n );\n}\n\nexport async function authLogoutCommand(name: string): Promise<void> {\n const target = await resolveSession(name);\n if (!target) {\n process.exit(1);\n }\n const { name: serverName, url } = target;\n const provider = await buildOAuthProvider(url);\n await provider.invalidateCredentials(\"all\");\n console.log(formatSuccess(`Removed tokens for ${url}`));\n console.log(\n formatInfo(\n `Server '${serverName}' kept; reconnect with \\`mcp-use client connect\\`.`\n )\n );\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { MCPSession } from \"mcp-use/client\";\nimport { MCPClient } from \"mcp-use/client\";\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir } from \"node:fs/promises\";\nimport { createServer } from \"node:net\";\nimport path from \"node:path\";\nimport { captureScreenshot } from \"../utils/cdp-screenshot.js\";\nimport { resolveChromePath } from \"../utils/chrome-path.js\";\nimport { formatError, formatInfo, formatSchema } from \"../utils/format.js\";\nimport { parseToolArgs } from \"../utils/parse-args.js\";\nimport {\n activeSessions,\n cleanupAndExit,\n getCliClientInfo,\n getOrRestoreSession,\n} from \"../utils/session.js\";\n\ninterface ScreenshotOptions {\n tool?: string;\n width: string;\n height: string;\n inspector?: string;\n mcp?: string;\n theme: \"light\" | \"dark\";\n output?: string;\n waitFor?: string;\n delay?: string;\n quiet?: boolean;\n timeout: string;\n cdpUrl?: string;\n header?: string[];\n deviceScaleFactor?: string;\n}\n\ninterface ScreenshotContext {\n sessionName?: string;\n usagePrefix: string;\n}\n\n/**\n * Curl-style `Key: Value` parser. Splits on the first `:` so values may\n * contain colons, and trims both sides so `Authorization:Bearer xyz` and\n * `Authorization: Bearer xyz` are equivalent.\n */\nexport function parseHeaderArg(raw: string): [string, string] {\n const idx = raw.indexOf(\":\");\n if (idx === -1) {\n throw new Error(\n `Invalid --header value \"${raw}\". Expected \"Key: Value\" (e.g. \"Authorization: Bearer xyz\").`\n );\n }\n const key = raw.slice(0, idx).trim();\n const value = raw.slice(idx + 1).trim();\n if (!key) {\n throw new Error(`Invalid --header value \"${raw}\". Header name is empty.`);\n }\n return [key, value];\n}\n\nexport function parseHeaderArgs(args: string[]): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const raw of args) {\n const [key, value] = parseHeaderArg(raw);\n headers[key] = value;\n }\n return headers;\n}\n\nfunction collectHeader(value: string, previous: string[] = []): string[] {\n return previous.concat([value]);\n}\n\ninterface ScreenshotBundle {\n resourceUri: string;\n resourceContents: unknown;\n toolInput?: Record<string, unknown>;\n toolOutput?: unknown;\n}\n\n/**\n * Inspect a tool's `_meta` for the UI resource URI it renders, if any. Falls back\n * to the OpenAI Apps `openai/outputTemplate` key for cross-ecosystem compatibility.\n */\nexport function detectToolResourceUri(\n tool: { _meta?: Record<string, unknown> } | undefined | null\n): string | null {\n if (!tool) return null;\n const meta = tool._meta;\n if (!meta) return null;\n const uiMeta = (meta.ui as { resourceUri?: string } | undefined) ?? undefined;\n return (\n uiMeta?.resourceUri ??\n (meta[\"openai/outputTemplate\"] as string | undefined) ??\n null\n );\n}\n\ninterface CaptureToolScreenshotInputs {\n session: MCPSession;\n toolName: string;\n toolArgs: Record<string, unknown>;\n toolOutput: unknown;\n resourceUri: string;\n}\n\ninterface CaptureToolScreenshotOptions {\n width?: number;\n height?: number;\n theme?: \"light\" | \"dark\";\n output?: string;\n waitFor?: string;\n delayMs?: number;\n timeoutMs?: number;\n inspector?: string;\n quiet?: boolean;\n /**\n * Pre-existing CDP WebSocket URL. When set, the screenshot is captured via\n * the remote browser instead of spawning a local Chrome. The inspector URL\n * must be reachable from that remote browser.\n */\n cdpUrl?: string;\n /**\n * Device pixel ratio for rendering. Defaults to 1. With a value of 2 the\n * resulting PNG is (width × 2) × (height × 2) device pixels (Retina-style\n * capture). Forwarded to `Emulation.setDeviceMetricsOverride`.\n */\n deviceScaleFactor?: number;\n}\n\ninterface CaptureToolScreenshotResult {\n outputPath: string;\n width: number;\n height: number;\n view: string;\n}\n\n/**\n * End-to-end screenshot pipeline for a tool whose UI resource has already been\n * resolved. Reuses the caller's existing tool result so we don't re-invoke the\n * tool, ensures a dev server is running (spawning one if needed), reads the UI\n * resource, and captures via CDP. Cleans up any spawned dev server before\n * returning, even on failure.\n */\nexport async function captureToolScreenshot(\n inputs: CaptureToolScreenshotInputs,\n options: CaptureToolScreenshotOptions = {}\n): Promise<CaptureToolScreenshotResult> {\n const width = options.width ?? 800;\n const height = options.height ?? 600;\n const theme: \"light\" | \"dark\" = options.theme ?? \"light\";\n const timeoutMs = options.timeoutMs ?? 30000;\n const delayMs = options.delayMs ?? 0;\n\n const chromePath = options.cdpUrl ? undefined : resolveChromePath();\n const view = extractViewName(inputs.resourceUri);\n\n const devOptions: ScreenshotOptions = {\n width: String(width),\n height: String(height),\n theme,\n timeout: String(timeoutMs),\n inspector: options.inspector,\n quiet: options.quiet,\n };\n\n let devHandle: DevServerHandle | undefined;\n try {\n devHandle = await ensureDevServer(devOptions);\n\n const resourceContents = await inputs.session.readResource(\n inputs.resourceUri\n );\n const bundle: ScreenshotBundle = {\n resourceUri: inputs.resourceUri,\n resourceContents,\n toolInput: inputs.toolArgs,\n toolOutput: inputs.toolOutput,\n };\n\n const previewUrl = new URL(`/inspector/preview/${view}`, devHandle.url);\n previewUrl.searchParams.set(\"theme\", theme);\n\n const ts = timestampSuffix();\n const outputPath = path.resolve(options.output ?? `./${view}-${ts}.png`);\n await mkdir(path.dirname(outputPath), { recursive: true });\n\n await captureScreenshot({\n url: previewUrl.toString(),\n width,\n height,\n theme,\n waitForSelector: options.waitFor ?? 'body[data-view-ready=\"true\"]',\n timeoutMs,\n outputPath,\n chromePath,\n cdpUrl: options.cdpUrl,\n delayMs: Number.isFinite(delayMs) && delayMs > 0 ? delayMs : 0,\n bundle,\n deviceScaleFactor: options.deviceScaleFactor,\n });\n\n return { outputPath, width, height, view };\n } finally {\n killChild(devHandle?.child);\n }\n}\n\n/**\n * Allocate a free TCP port by binding to 0 and reading back what the OS chose.\n */\nfunction getFreePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const srv = createServer();\n srv.unref();\n srv.on(\"error\", reject);\n srv.listen(0, () => {\n const addr = srv.address();\n if (typeof addr === \"object\" && addr) {\n const port = addr.port;\n srv.close(() => resolve(port));\n } else {\n srv.close(() => reject(new Error(\"Failed to allocate free port\")));\n }\n });\n });\n}\n\n/**\n * Probe a server's `/inspector/health` endpoint. Returns true only if it\n * responds with the inspector's JSON payload (`{ status: \"ok\" }`).\n *\n * A bare `res.ok` check is not enough: a Vite/SPA dev server happily returns\n * 200 + HTML for any unknown path (SPA fallback), which would be misidentified\n * as a valid inspector and later cause a silent timeout when the preview\n * route is missing.\n */\nasync function probeServer(url: string, timeoutMs = 1500): Promise<boolean> {\n const controller = new AbortController();\n const t = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const u = new URL(\"/inspector/health\", url);\n const res = await fetch(u, { signal: controller.signal });\n if (!res.ok) return false;\n const ct = res.headers.get(\"content-type\") ?? \"\";\n if (!ct.includes(\"application/json\")) return false;\n const body = (await res.json()) as { status?: string };\n return body?.status === \"ok\";\n } catch {\n return false;\n } finally {\n clearTimeout(t);\n }\n}\n\n/**\n * Wait until `/inspector/health` reports ready, polling every 200ms.\n */\nasync function waitForHealth(url: string, timeoutMs = 15000): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (await probeServer(url)) return true;\n await new Promise((r) => setTimeout(r, 200));\n }\n return false;\n}\n\ninterface DevServerHandle {\n url: string;\n child?: ChildProcess;\n}\n\n/**\n * Resolve the path to `@mcp-use/inspector`'s standalone CLI entry. Throws\n * with a clear message when the inspector package can't be located — that\n * usually means the workspace hasn't been installed/built.\n *\n * We can't use `require.resolve('@mcp-use/inspector')` because the inspector\n * package's `exports` field only declares an `import` condition, so CJS\n * resolution fails. Subpath resolution (`/dist/cli.js`, `/package.json`)\n * also fails because neither is listed in `exports`. So we walk up from\n * both the current module and the CWD looking for the installed package.\n */\nfunction resolveInspectorCli(): string {\n const candidateRoots = new Set<string>();\n // CJS: __dirname is defined; ESM: derive from import.meta.url.\n const moduleDir =\n typeof __dirname !== \"undefined\"\n ? __dirname\n : path.dirname(new URL(import.meta.url).pathname);\n candidateRoots.add(moduleDir);\n candidateRoots.add(process.cwd());\n\n for (const start of candidateRoots) {\n let dir = start;\n while (true) {\n const candidate = path.join(\n dir,\n \"node_modules\",\n \"@mcp-use\",\n \"inspector\",\n \"dist\",\n \"cli.js\"\n );\n if (existsSync(candidate)) return candidate;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n }\n throw new Error(\n \"Could not locate `@mcp-use/inspector` in node_modules. Install the inspector package or pass --inspector <url> to use an existing instance.\"\n );\n}\n\n/**\n * Resolve a usable inspector host:\n *\n * - When `--inspector <url>` is given, probe it (strict: must return the\n * inspector's JSON health payload) and use it.\n * - Otherwise, always spawn a fresh `@mcp-use/inspector` on a free port.\n *\n * Note: we no longer try to reuse a server on `localhost:3000`. A Vite-only\n * dev server (or any unrelated 200-returning service) would otherwise be\n * misidentified and cause silent rendering failures. Always-spawn keeps\n * behavior predictable and decoupled from whatever else is running locally.\n */\nasync function ensureDevServer(\n options: ScreenshotOptions\n): Promise<DevServerHandle> {\n if (options.inspector) {\n const ok = await probeServer(options.inspector);\n if (!ok) {\n throw new Error(\n `Inspector at ${options.inspector} did not respond on /inspector/health with status:\"ok\"`\n );\n }\n return { url: options.inspector };\n }\n\n const port = await getFreePort();\n const url = `http://localhost:${port}`;\n if (!options.quiet) {\n console.error(formatInfo(`Starting inspector on port ${port}…`));\n }\n\n const inspectorCli = resolveInspectorCli();\n const child = spawn(\n process.execPath,\n [inspectorCli, \"--port\", String(port), \"--no-open\"],\n {\n cwd: process.cwd(),\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env, MCP_INSPECTOR_MODE: \"standalone\" },\n }\n );\n\n const prefix = chalk.gray(\"[inspector]\");\n if (!options.quiet) {\n child.stdout?.on(\"data\", (d: Buffer) => {\n process.stderr.write(`${prefix} ${d}`);\n });\n child.stderr?.on(\"data\", (d: Buffer) => {\n process.stderr.write(`${prefix} ${d}`);\n });\n } else {\n child.stdout?.resume();\n child.stderr?.resume();\n }\n\n const ready = await waitForHealth(url);\n if (!ready) {\n child.kill(\"SIGTERM\");\n throw new Error(`Inspector failed to come up on ${url} within 15s.`);\n }\n return { url, child };\n}\n\nfunction killChild(child: ChildProcess | undefined) {\n if (!child || child.killed) return;\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // Ignore.\n }\n}\n\n/**\n * Returns a filesystem-safe timestamp string: YYYY-MM-DD_HH-mm-ss\n */\nexport function timestampSuffix(date = new Date()): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const datePart = `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;\n const timePart = `${pad(date.getHours())}-${pad(date.getMinutes())}-${pad(date.getSeconds())}`;\n return `${datePart}_${timePart}`;\n}\n\nexport function extractViewName(resourceUri: string): string {\n const m = resourceUri.match(/^ui:\\/\\/widget\\/(.+)$/);\n if (!m) return resourceUri;\n // Strip trailing .html and any .<buildId> segment before it.\n return m[1].replace(/\\.html$/, \"\").replace(/\\.[0-9a-f]+$/i, \"\");\n}\n\nexport function parseDimension(raw: string, name: string): number {\n const n = parseInt(raw, 10);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(`--${name} must be a positive integer (got \"${raw}\")`);\n }\n return n;\n}\n\n/**\n * Parse `--device-scale-factor <n>`. Allows fractional values (e.g. 1.5) and\n * caps at 4 to avoid accidental 16x-pixel screenshots (memory + disk).\n */\nexport function parseDeviceScaleFactor(raw: string): number {\n const n = parseFloat(raw);\n if (!Number.isFinite(n) || n <= 0) {\n throw new Error(\n `--device-scale-factor must be a positive number (got \"${raw}\")`\n );\n }\n if (n > 4) {\n throw new Error(\n `--device-scale-factor must be <= 4 to avoid excessive pixel counts (got \"${raw}\")`\n );\n }\n return n;\n}\n\nexport function requiresArguments(inputSchema: unknown): boolean {\n if (!inputSchema || typeof inputSchema !== \"object\") return false;\n const required = (inputSchema as { required?: unknown }).required;\n return Array.isArray(required) && required.length > 0;\n}\n\nconst AD_HOC_SESSION_NAME = \"__screenshot_ad_hoc__\";\n\n/**\n * Resolve an authenticated MCPSession for the screenshot run.\n *\n * Resolution order:\n * 1. `sessionName` → restore that saved server (passed in by the per-client\n * subcommand `mcp-use client <name> screenshot`).\n * 2. `--mcp <url>` → open an unauthenticated ad-hoc session at that URL.\n */\nasync function resolveSessionForScreenshot(\n options: ScreenshotOptions,\n sessionName: string | undefined,\n headers: Record<string, string> | undefined\n): Promise<MCPSession | null> {\n if (sessionName) {\n const result = await getOrRestoreSession(sessionName);\n return result?.session ?? null;\n }\n\n if (options.mcp) {\n const client = new MCPClient();\n client.addServer(AD_HOC_SESSION_NAME, {\n url: options.mcp,\n ...(headers ? { headers } : {}),\n clientInfo: getCliClientInfo(),\n });\n try {\n const session = await client.createSession(AD_HOC_SESSION_NAME);\n activeSessions.set(AD_HOC_SESSION_NAME, { client, session });\n return session;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(formatError(`Failed to connect to ${options.mcp}: ${msg}`));\n return null;\n }\n }\n\n console.error(\n formatError(\n \"No MCP target. Pass --mcp <url> for an ad-hoc connection, or use `mcp-use client <name> screenshot` for a saved server.\"\n )\n );\n return null;\n}\n\nasync function screenshotCommand(\n options: ScreenshotOptions,\n argsList: string[] | undefined,\n context: ScreenshotContext\n): Promise<void> {\n let exitCode = 0;\n\n try {\n if (!options.tool) {\n console.error(\n formatError(\n \"--tool <name> is required (optionally with key=value args).\"\n )\n );\n exitCode = 1;\n return;\n }\n\n let headers: Record<string, string> | undefined;\n if (options.header && options.header.length > 0) {\n if (!options.mcp) {\n console.error(\n formatError(\n \"--header is only supported with --mcp <url>. Saved servers carry their own auth from `mcp-use client connect`.\"\n )\n );\n exitCode = 1;\n return;\n }\n try {\n headers = parseHeaderArgs(options.header);\n } catch (err) {\n console.error(\n formatError(err instanceof Error ? err.message : String(err))\n );\n exitCode = 1;\n return;\n }\n }\n\n try {\n resolveChromePath();\n } catch (err) {\n console.error(\n formatError(err instanceof Error ? err.message : String(err))\n );\n exitCode = 1;\n return;\n }\n\n const width = parseDimension(options.width, \"width\");\n const height = parseDimension(options.height, \"height\");\n const navTimeout = parseInt(options.timeout, 10) || 30000;\n const delayMs = options.delay ? parseInt(options.delay, 10) : 0;\n const deviceScaleFactor = options.deviceScaleFactor\n ? parseDeviceScaleFactor(options.deviceScaleFactor)\n : undefined;\n\n // Resolve session before spawning the dev server so auth issues fail fast.\n const session = await resolveSessionForScreenshot(\n options,\n context.sessionName,\n headers\n );\n if (!session) {\n exitCode = 1;\n return;\n }\n\n const tool = session.tools.find((t) => t.name === options.tool);\n if (!tool) {\n throw new Error(\n `Tool \"${options.tool}\" not found. Available: ${session.tools\n .map((t) => t.name)\n .join(\", \")}`\n );\n }\n const resourceUri = detectToolResourceUri(tool);\n if (!resourceUri) {\n throw new Error(\n `Tool \"${options.tool}\" does not declare a UI resource (expected _meta.ui.resourceUri or openai/outputTemplate).`\n );\n }\n\n let toolArgs: Record<string, unknown> = {};\n if (argsList && argsList.length > 0) {\n try {\n toolArgs = parseToolArgs(\n argsList,\n tool.inputSchema as Parameters<typeof parseToolArgs>[1]\n );\n } catch (err) {\n console.error(\n formatError(err instanceof Error ? err.message : String(err))\n );\n console.log(\"\");\n console.log(formatInfo(\"Usage:\"));\n console.log(\n ` npx ${context.usagePrefix} --tool ${options.tool} key=value [key2=value2 ...]`\n );\n console.log(\n ` npx ${context.usagePrefix} --tool ${options.tool} nested:='{\"a\":1}' # JSON value`\n );\n console.log(\n ` npx ${context.usagePrefix} --tool ${options.tool} '{\"key\":\"value\"}' # full JSON object`\n );\n if (tool.inputSchema) {\n console.log(\"\");\n console.log(formatInfo(\"Tool schema:\"));\n console.log(formatSchema(tool.inputSchema));\n }\n exitCode = 1;\n return;\n }\n } else if (requiresArguments(tool.inputSchema)) {\n console.error(formatError(\"This tool requires arguments.\"));\n console.log(\"\");\n console.log(formatInfo(\"Provide arguments as key=value pairs:\"));\n console.log(\n ` npx ${context.usagePrefix} --tool ${options.tool} key=value [key2=value2 ...]`\n );\n console.log(\"\");\n console.log(formatInfo(\"Tool schema:\"));\n console.log(formatSchema(tool.inputSchema));\n exitCode = 1;\n return;\n }\n const toolOutput = await session.callTool(options.tool, toolArgs);\n\n const result = await captureToolScreenshot(\n {\n session,\n toolName: options.tool,\n toolArgs,\n toolOutput,\n resourceUri,\n },\n {\n width,\n height,\n theme: options.theme,\n output: options.output,\n waitFor: options.waitFor,\n delayMs,\n timeoutMs: navTimeout,\n inspector: options.inspector,\n quiet: options.quiet,\n cdpUrl: options.cdpUrl,\n deviceScaleFactor,\n }\n );\n\n console.log(\n `Saved screenshot: ${result.outputPath} (${result.width}×${result.height})`\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(formatError(`Screenshot failed: ${msg}`));\n exitCode = 1;\n } finally {\n await cleanupAndExit(exitCode);\n }\n}\n\n/**\n * Apply the screenshot flags that are common to both the ad-hoc top-level form\n * (`mcp-use client screenshot`) and the per-server form\n * (`mcp-use client <name> screenshot`).\n */\nfunction withCommonScreenshotOptions(cmd: Command): Command {\n return cmd\n .argument(\n \"[args...]\",\n \"Tool args as key=value pairs (use key:=<json> for nested values, or pass a single JSON object).\"\n )\n .option(\n \"--tool <name>\",\n \"Tool to call. Its UI resource is rendered with the result.\"\n )\n .option(\"--width <px>\", \"Browser viewport width in pixels.\", \"800\")\n .option(\"--height <px>\", \"Browser viewport height in pixels.\", \"600\")\n .option(\n \"--device-scale-factor <n>\",\n \"Device pixel ratio for rendering (e.g. 2 for Retina). Output PNG is (width × dsf) × (height × dsf). Must be > 0 and <= 4.\"\n )\n .option(\n \"--inspector <url>\",\n \"Inspector host that serves /inspector/preview/:view. When omitted, auto-spawns `@mcp-use/inspector` on a free port.\"\n )\n .option(\n \"--theme <light|dark>\",\n \"Color scheme to render the view in.\",\n \"light\"\n )\n .option(\n \"--output <path>\",\n \"Output PNG path. Defaults to ./<view>-<timestamp>.png in cwd.\"\n )\n .option(\n \"--wait-for <selector>\",\n 'Override readiness selector (default: body[data-view-ready=\"true\"]).'\n )\n .option(\n \"--delay <ms>\",\n \"Extra wait after readiness, to let chart animations / async layouts settle.\",\n \"0\"\n )\n .option(\"--timeout <ms>\", \"Navigation + readiness timeout in ms.\", \"30000\")\n .option(\n \"--cdp-url <url>\",\n \"Connect to an existing CDP WebSocket (ws:// or wss://) instead of spawning local Chrome. Useful for hosted browsers like Notte.\"\n )\n .option(\"--quiet\", \"Suppress dev-server output.\");\n}\n\n/**\n * Top-level ad-hoc form: `mcp-use client screenshot --mcp <url> --tool <name>`.\n *\n * Doesn't take a saved-server positional. The MCP server is supplied inline\n * via `--mcp`, and authenticated servers can be reached with repeatable\n * `-H, --header` flags. This is the programmatic entry point for one-off or\n * automated screenshot runs that don't want to first `mcp-use client connect`.\n */\nexport function createClientScreenshotCommand(): Command {\n const cmd = withCommonScreenshotOptions(\n new Command(\"screenshot\").description(\n \"Render an MCP Apps view headlessly and save a PNG. Connects to an MCP server inline via --mcp; for a saved server, use `mcp-use client <name> screenshot`.\"\n )\n )\n .option(\n \"--mcp <url>\",\n \"Ad-hoc MCP server URL. Required for the top-level form. No authentication unless --header is supplied.\"\n )\n .option(\n \"-H, --header <header>\",\n 'HTTP header to send to the --mcp <url> server, formatted \"Key: Value\". Repeatable. Use to pass an Authorization bearer token or other auth headers when screenshotting an authenticated MCP server.',\n collectHeader,\n [] as string[]\n );\n\n cmd.action(async (args: string[], opts: ScreenshotOptions) => {\n await screenshotCommand(opts, args, {\n usagePrefix: \"mcp-use client screenshot\",\n });\n });\n\n return cmd;\n}\n\n/**\n * Per-server form: `mcp-use client <name> screenshot --tool <name>`. The saved\n * server's auth (OAuth or bearer) is reused — no `--mcp`/`--header` flags.\n */\nexport function createPerClientScreenshotCommand(name: string): Command {\n const cmd = withCommonScreenshotOptions(\n new Command(\"screenshot\").description(\n `Render an MCP Apps view headlessly using the saved server '${name}'.`\n )\n );\n\n cmd.action(async (args: string[], opts: ScreenshotOptions) => {\n await screenshotCommand(opts, args, {\n sessionName: name,\n usagePrefix: `mcp-use client ${name} screenshot`,\n });\n });\n\n return cmd;\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport WebSocket from \"ws\";\n\ninterface CaptureScreenshotOptions {\n url: string;\n width: number;\n height: number;\n theme: \"light\" | \"dark\";\n waitForSelector: string;\n timeoutMs: number;\n outputPath: string;\n /** Path to local Chrome. Required unless `cdpUrl` is supplied. */\n chromePath?: string;\n /**\n * Pre-existing CDP WebSocket URL (ws:// or wss://). When set, no local\n * Chrome is spawned — we connect directly to this endpoint. Useful for\n * driving a hosted Chromium (e.g. Notte) in sandboxed environments.\n */\n cdpUrl?: string;\n /** Extra wait after the readiness selector matches, to let animations settle. */\n delayMs?: number;\n /**\n * Device pixel ratio applied via `Emulation.setDeviceMetricsOverride`. The\n * viewport stays `width × height` in CSS pixels but the resulting PNG is\n * `(width × dsf) × (height × dsf)` device pixels — same convention as\n * Playwright/Puppeteer. Defaults to 1.\n */\n deviceScaleFactor?: number;\n /**\n * Optional pre-render bundle. When provided, it is JSON-serialized and\n * assigned to `globalThis.__mcpUsePreviewBundle` before any document\n * scripts run. The inspector preview route reads this global and renders\n * inline data instead of opening a live MCP connection from the browser.\n */\n bundle?: unknown;\n}\n\ninterface PendingCall {\n resolve: (result: unknown) => void;\n reject: (err: Error) => void;\n}\n\ninterface CdpMessage {\n id?: number;\n method?: string;\n result?: Record<string, unknown>;\n error?: { message?: string };\n}\n\n/**\n * Tiny CDP RPC client over a single WebSocket. Handles flat-mode session\n * routing — every call may carry a sessionId.\n */\nclass CdpClient {\n private nextId = 0;\n private readonly pending = new Map<number, PendingCall>();\n\n constructor(private readonly ws: WebSocket) {\n ws.on(\"message\", (data) => {\n let msg: CdpMessage;\n try {\n msg = JSON.parse(data.toString()) as CdpMessage;\n } catch {\n return;\n }\n if (typeof msg.id !== \"number\") return;\n const cb = this.pending.get(msg.id);\n if (!cb) return;\n this.pending.delete(msg.id);\n if (msg.error) {\n cb.reject(new Error(msg.error.message ?? \"CDP error\"));\n } else {\n cb.resolve(msg.result ?? {});\n }\n });\n ws.on(\"close\", () => {\n for (const cb of this.pending.values()) {\n cb.reject(new Error(\"CDP WebSocket closed\"));\n }\n this.pending.clear();\n });\n ws.on(\"error\", (err) => {\n for (const cb of this.pending.values()) {\n cb.reject(err);\n }\n this.pending.clear();\n });\n }\n\n send<T = Record<string, unknown>>(\n method: string,\n params: Record<string, unknown> = {},\n sessionId?: string\n ): Promise<T> {\n const id = ++this.nextId;\n const payload: Record<string, unknown> = { id, method, params };\n if (sessionId) payload.sessionId = sessionId;\n return new Promise<T>((resolve, reject) => {\n this.pending.set(id, {\n resolve: (r) => resolve(r as T),\n reject,\n });\n this.ws.send(JSON.stringify(payload));\n });\n }\n\n close(): void {\n try {\n this.ws.close();\n } catch {\n // Ignore.\n }\n }\n}\n\n/**\n * Watch Chrome's stderr for the `DevTools listening on ws://...` line that\n * Chrome prints once the debug port is bound. Rejects on timeout or premature\n * exit.\n */\nfunction waitForDevToolsUrl(\n child: ChildProcess,\n timeoutMs = 5000\n): Promise<string> {\n return new Promise((resolve, reject) => {\n let buf = \"\";\n const onData = (d: Buffer) => {\n buf += d.toString();\n const m = buf.match(/DevTools listening on (ws:\\/\\/\\S+)/);\n if (m) {\n cleanup();\n resolve(m[1]);\n }\n };\n const onExit = (code: number | null) => {\n cleanup();\n reject(\n new Error(\n `Chrome exited (code ${code}) before exposing a DevTools port. ` +\n `Last stderr: ${buf.slice(-500)}`\n )\n );\n };\n const cleanup = () => {\n child.stderr?.off(\"data\", onData);\n child.off(\"exit\", onExit);\n clearTimeout(timer);\n };\n const timer = setTimeout(() => {\n cleanup();\n reject(\n new Error(`Chrome did not expose a DevTools port within ${timeoutMs}ms`)\n );\n }, timeoutMs);\n child.stderr?.on(\"data\", onData);\n child.on(\"exit\", onExit);\n });\n}\n\n/**\n * Headlessly render `url` and write a PNG to disk.\n *\n * Two modes, selected by whether `opts.cdpUrl` is provided:\n * - **Remote** (`cdpUrl` set): connect directly to an existing CDP\n * WebSocket. No Chrome process is spawned.\n * - **Local** (`chromePath` set): spawn Chrome with\n * `--headless=new --remote-debugging-port=0` + throwaway user-data-dir\n * and parse the WebSocket URL from stderr.\n *\n * After the WebSocket is connected, the flow is identical:\n * - Open a tab via Target.createTarget, attach in flat mode.\n * - Apply viewport + prefers-color-scheme via Emulation.* commands.\n * - Page.navigate, then poll Runtime.evaluate for `waitForSelector`.\n * - Page.captureScreenshot, write PNG, clean up.\n */\nexport async function captureScreenshot(\n opts: CaptureScreenshotOptions\n): Promise<void> {\n let userDataDir: string | undefined;\n let child: ChildProcess | undefined;\n let cdp: CdpClient | undefined;\n let cleanedUp = false;\n const cleanup = () => {\n if (cleanedUp) return;\n cleanedUp = true;\n cdp?.close();\n if (child && !child.killed) {\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // Ignore.\n }\n const localChild = child;\n const killTimer = setTimeout(() => {\n if (!localChild.killed) {\n try {\n localChild.kill(\"SIGKILL\");\n } catch {\n // Ignore.\n }\n }\n }, 2000);\n killTimer.unref();\n }\n if (userDataDir) {\n try {\n rmSync(userDataDir, { recursive: true, force: true });\n } catch {\n // Ignore.\n }\n }\n };\n\n try {\n let wsUrl: string;\n if (opts.cdpUrl) {\n wsUrl = opts.cdpUrl;\n } else {\n if (!opts.chromePath) {\n throw new Error(\n \"captureScreenshot requires either `cdpUrl` or `chromePath`\"\n );\n }\n userDataDir = mkdtempSync(path.join(os.tmpdir(), \"mcp-use-chrome-\"));\n const chromeArgs = [\n \"--headless=new\",\n \"--remote-debugging-port=0\",\n `--user-data-dir=${userDataDir}`,\n \"--no-first-run\",\n \"--no-default-browser-check\",\n \"--disable-extensions\",\n \"--disable-gpu\",\n \"--hide-scrollbars\",\n \"--mute-audio\",\n `--window-size=${opts.width},${opts.height}`,\n \"about:blank\",\n ];\n child = spawn(opts.chromePath, chromeArgs, {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n // Drain stdout so Chrome doesn't block on a full pipe.\n child.stdout?.resume();\n wsUrl = await waitForDevToolsUrl(child);\n }\n\n const ws = new WebSocket(wsUrl);\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n ws.off(\"error\", onError);\n resolve();\n };\n const onError = (err: Error) => {\n ws.off(\"open\", onOpen);\n reject(err);\n };\n ws.once(\"open\", onOpen);\n ws.once(\"error\", onError);\n });\n\n cdp = new CdpClient(ws);\n\n // We need a flat-mode sessionId attached to a page target. The two CDP\n // endpoints we support reach this differently:\n //\n // Local Chrome: we create a fresh target and attach to it explicitly.\n //\n // Remote endpoint (e.g. Notte): the endpoint is a browser-level WS\n // with a pre-existing page, and explicit Target.attachToTarget is\n // refused for security. Instead we ask for auto-attach in flat mode\n // and pick up the sessionId from the resulting Target.attachedToTarget\n // event. We attach the event listener BEFORE sending setAutoAttach so\n // we don't race the event for already-existing targets.\n let sessionId: string;\n if (opts.cdpUrl) {\n const attachPromise = new Promise<string>((resolve, reject) => {\n const timer = setTimeout(\n () =>\n reject(\n new Error(\n \"Timed out waiting for Target.attachedToTarget event from remote CDP\"\n )\n ),\n 10_000\n );\n const onMessage = (data: WebSocket.RawData) => {\n try {\n const msg = JSON.parse(data.toString()) as {\n method?: string;\n params?: {\n sessionId?: string;\n targetInfo?: { type?: string };\n };\n };\n if (\n msg.method === \"Target.attachedToTarget\" &&\n msg.params?.targetInfo?.type === \"page\" &&\n typeof msg.params.sessionId === \"string\"\n ) {\n clearTimeout(timer);\n ws.off(\"message\", onMessage);\n resolve(msg.params.sessionId);\n }\n } catch {\n // Ignore non-JSON or unrelated messages.\n }\n };\n ws.on(\"message\", onMessage);\n });\n await cdp.send(\"Target.setAutoAttach\", {\n autoAttach: true,\n waitForDebuggerOnStart: false,\n flatten: true,\n });\n sessionId = await attachPromise;\n } else {\n const { targetId } = await cdp.send<{ targetId: string }>(\n \"Target.createTarget\",\n { url: \"about:blank\" }\n );\n const attach = await cdp.send<{ sessionId: string }>(\n \"Target.attachToTarget\",\n { targetId, flatten: true }\n );\n sessionId = attach.sessionId;\n }\n\n await cdp.send(\"Page.enable\", {}, sessionId);\n await cdp.send(\n \"Emulation.setDeviceMetricsOverride\",\n {\n width: opts.width,\n height: opts.height,\n deviceScaleFactor: opts.deviceScaleFactor ?? 1,\n mobile: false,\n },\n sessionId\n );\n await cdp.send(\n \"Emulation.setEmulatedMedia\",\n {\n features: [\n { name: \"prefers-color-scheme\", value: opts.theme },\n { name: \"prefers-reduced-motion\", value: \"reduce\" },\n ],\n },\n sessionId\n );\n\n if (opts.bundle !== undefined) {\n // Inject the bundle as a global before any document scripts run.\n // JSON.stringify-of-JSON.stringify wraps the JSON literal as a string\n // expression so we can JSON.parse it inside the page — this avoids\n // having to escape `</script>` and other characters in the source.\n const payload = JSON.stringify(JSON.stringify(opts.bundle));\n await cdp.send(\n \"Page.addScriptToEvaluateOnNewDocument\",\n {\n source: `globalThis.__mcpUsePreviewBundle = JSON.parse(${payload});`,\n runImmediately: true,\n },\n sessionId\n );\n }\n\n await cdp.send(\"Page.navigate\", { url: opts.url }, sessionId);\n\n const start = Date.now();\n const exprSelector = JSON.stringify(opts.waitForSelector);\n while (true) {\n const r = await cdp.send<{\n result?: { value?: unknown };\n exceptionDetails?: unknown;\n }>(\n \"Runtime.evaluate\",\n {\n expression: `!!document.querySelector(${exprSelector})`,\n returnByValue: true,\n },\n sessionId\n );\n if (r.result?.value === true) break;\n if (Date.now() - start > opts.timeoutMs) {\n throw new Error(\n `Timed out after ${opts.timeoutMs}ms waiting for selector \"${opts.waitForSelector}\"`\n );\n }\n await new Promise((res) => setTimeout(res, 100));\n }\n\n if (opts.delayMs && opts.delayMs > 0) {\n await new Promise((res) => setTimeout(res, opts.delayMs));\n }\n\n const shot = await cdp.send<{ data: string }>(\n \"Page.captureScreenshot\",\n {\n format: \"png\",\n clip: {\n x: 0,\n y: 0,\n width: opts.width,\n height: opts.height,\n scale: 1,\n },\n },\n sessionId\n );\n\n writeFileSync(opts.outputPath, Buffer.from(shot.data, \"base64\"));\n } finally {\n cleanup();\n }\n}\n","import { accessSync, constants } from \"node:fs\";\nimport path from \"node:path\";\n\nconst ENV_VAR_NAMES = [\n \"MCP_USE_CHROME_PATH\",\n \"PUPPETEER_EXECUTABLE_PATH\",\n \"CHROME_PATH\",\n] as const;\n\nconst DARWIN_PATHS = [\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n \"/Applications/Chromium.app/Contents/MacOS/Chromium\",\n \"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\",\n \"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser\",\n];\n\nconst LINUX_BINARIES = [\n \"google-chrome-stable\",\n \"google-chrome\",\n \"chromium\",\n \"chromium-browser\",\n \"microsoft-edge\",\n \"microsoft-edge-stable\",\n \"brave-browser\",\n];\n\nconst WIN_SUBPATHS = [\n \"Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n \"Microsoft\\\\Edge\\\\Application\\\\msedge.exe\",\n \"BraveSoftware\\\\Brave-Browser\\\\Application\\\\brave.exe\",\n \"Chromium\\\\Application\\\\chrome.exe\",\n];\n\nfunction isAccessible(p: string): boolean {\n try {\n accessSync(p, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction findOnPath(binary: string): string | null {\n const PATH = process.env.PATH ?? \"\";\n for (const dir of PATH.split(\":\")) {\n if (!dir) continue;\n const candidate = path.posix.join(dir, binary);\n if (isAccessible(candidate)) return candidate;\n }\n return null;\n}\n\n/**\n * Locate a Chrome-family browser executable.\n *\n * Priority: MCP_USE_CHROME_PATH → PUPPETEER_EXECUTABLE_PATH → CHROME_PATH →\n * platform-specific install paths (Chrome → Canary → Chromium → Edge → Brave).\n *\n * Returns the absolute path to the executable, or null if none was found.\n */\nexport function findChrome(): string | null {\n for (const name of ENV_VAR_NAMES) {\n const v = process.env[name];\n if (v && isAccessible(v)) return v;\n }\n\n if (process.platform === \"darwin\") {\n for (const p of DARWIN_PATHS) {\n if (isAccessible(p)) return p;\n }\n return null;\n }\n\n if (process.platform === \"linux\") {\n for (const bin of LINUX_BINARIES) {\n const p = findOnPath(bin);\n if (p) return p;\n }\n return null;\n }\n\n if (process.platform === \"win32\") {\n const dirs = [\n process.env[\"ProgramFiles\"],\n process.env[\"ProgramFiles(x86)\"],\n process.env[\"LocalAppData\"],\n ].filter((d): d is string => Boolean(d));\n\n for (const dir of dirs) {\n for (const sub of WIN_SUBPATHS) {\n const candidate = path.join(dir, sub);\n if (isAccessible(candidate)) return candidate;\n }\n }\n return null;\n }\n\n return null;\n}\n\n/**\n * Like findChrome, but throws a user-facing error with install hints.\n */\nexport function resolveChromePath(): string {\n const found = findChrome();\n if (found) return found;\n throw new Error(\n \"Could not find Chrome, Chromium, Edge, or Brave on this system. \" +\n \"Install Chrome from https://google.com/chrome, or set MCP_USE_CHROME_PATH \" +\n \"(or PUPPETEER_EXECUTABLE_PATH / CHROME_PATH) to a browser executable.\"\n );\n}\n","import chalk from \"chalk\";\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport open from \"open\";\nimport type { GitHubConnectionStatus, OrgInfo } from \"../utils/api.js\";\nimport {\n ApiUnauthorizedError,\n GitHubAuthRequiredError,\n McpUseAPI,\n} from \"../utils/api.js\";\nimport {\n getWebUrl,\n isLoggedIn,\n readConfig,\n writeConfig,\n} from \"../utils/config.js\";\nimport {\n getGitInfo,\n gitInit,\n gitAddRemoteAndPush,\n gitCommitAndPush,\n GitCommandError,\n hasUncommittedChanges,\n isGitHubUrl,\n} from \"../utils/git.js\";\nimport { getMcpServerUrl } from \"../utils/cloud-urls.js\";\nimport { getProjectLink, saveProjectLink } from \"../utils/project-link.js\";\nimport {\n loginCommand,\n promptOrgSelection,\n resolveOrgFromOption,\n} from \"./auth.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nasync function parseEnvFile(filePath: string): Promise<Record<string, string>> {\n try {\n const content = await fs.readFile(filePath, \"utf-8\");\n const envVars: Record<string, string> = {};\n const lines = content.split(\"\\n\");\n let currentKey: string | null = null;\n let currentValue = \"\";\n\n for (let line of lines) {\n line = line.trim();\n if (!line || line.startsWith(\"#\")) continue;\n if (currentKey && !line.includes(\"=\")) {\n currentValue += \"\\n\" + line;\n continue;\n }\n if (currentKey) {\n envVars[currentKey] = currentValue.replace(/^[\"']|[\"']$/g, \"\");\n currentKey = null;\n currentValue = \"\";\n }\n const equalIndex = line.indexOf(\"=\");\n if (equalIndex === -1) continue;\n const key = line.substring(0, equalIndex).trim();\n const value = line.substring(equalIndex + 1).trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n console.log(chalk.yellow(`⚠️ Skipping invalid env key: ${key}`));\n continue;\n }\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n envVars[key] = value.slice(1, -1);\n } else if (value.startsWith('\"') || value.startsWith(\"'\")) {\n currentKey = key;\n currentValue = value.slice(1);\n } else {\n envVars[key] = value;\n }\n }\n if (currentKey) {\n envVars[currentKey] = currentValue.replace(/^[\"']|[\"']$/g, \"\");\n }\n return envVars;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`Environment file not found: ${filePath}`);\n }\n throw new Error(\n `Failed to parse environment file: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n}\n\nfunction parseEnvVar(envStr: string): { key: string; value: string } {\n const equalIndex = envStr.indexOf(\"=\");\n if (equalIndex === -1) {\n throw new Error(`Invalid env format: \"${envStr}\". Expected KEY=VALUE`);\n }\n const key = envStr.substring(0, equalIndex).trim();\n const value = envStr.substring(equalIndex + 1);\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n throw new Error(`Invalid env key: \"${key}\".`);\n }\n return { key, value };\n}\n\n/**\n * Upsert env vars onto an existing server via the env-variables API.\n *\n * The `--env`/`--env-file` flags are only honored on initial server creation\n * (where `env` rides on the createServer body). On redeploys we have to call\n * the dedicated env-variables endpoints, otherwise the values are silently\n * dropped. Existing keys are updated; new keys are created. Keys not in the\n * supplied set are left alone — clearing requires `mcp-use servers env rm`.\n */\nexport async function syncEnvVarsToServer(\n api: McpUseAPI,\n serverId: string,\n envVars: Record<string, string>\n): Promise<{ created: number; updated: number }> {\n const entries = Object.entries(envVars);\n if (entries.length === 0) return { created: 0, updated: 0 };\n\n const existing = await api.listEnvVariables(serverId);\n const byKey = new Map(existing.map((v) => [v.key, v]));\n\n const results = await Promise.all(\n entries.map(async ([key, value]) => {\n const found = byKey.get(key);\n if (found) {\n await api.updateEnvVariable(serverId, found.id, { value });\n return \"updated\" as const;\n }\n await api.createEnvVariable(serverId, { key, value });\n return \"created\" as const;\n })\n );\n\n return {\n created: results.filter((r) => r === \"created\").length,\n updated: results.filter((r) => r === \"updated\").length,\n };\n}\n\nasync function buildEnvVars(\n options: DeployOptions\n): Promise<Record<string, string>> {\n const envVars: Record<string, string> = {};\n if (options.envFile) {\n try {\n const fileEnv = await parseEnvFile(options.envFile);\n Object.assign(envVars, fileEnv);\n console.log(\n chalk.gray(\n `Loaded ${Object.keys(fileEnv).length} variable(s) from ${options.envFile}`\n )\n );\n } catch (error) {\n console.log(\n chalk.red(\n `✗ ${error instanceof Error ? error.message : \"Failed to load env file\"}`\n )\n );\n process.exit(1);\n }\n }\n if (options.env && options.env.length > 0) {\n for (const envStr of options.env) {\n try {\n const { key, value } = parseEnvVar(envStr);\n envVars[key] = value;\n } catch (error) {\n console.log(\n chalk.red(\n `✗ ${error instanceof Error ? error.message : \"Invalid env variable\"}`\n )\n );\n process.exit(1);\n }\n }\n }\n return envVars;\n}\n\ninterface DeployOptions {\n open?: boolean;\n name?: string;\n port?: number;\n runtime?: \"node\" | \"python\";\n new?: boolean;\n env?: string[];\n envFile?: string;\n rootDir?: string;\n org?: string;\n yes?: boolean;\n region?: \"US\" | \"EU\" | \"APAC\";\n buildCommand?: string;\n startCommand?: string;\n}\n\nasync function isMcpProject(cwd: string = process.cwd()): Promise<boolean> {\n try {\n const content = await fs.readFile(path.join(cwd, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(content);\n return !!(\n pkg.dependencies?.[\"mcp-use\"] ||\n pkg.dependencies?.[\"@modelcontextprotocol/sdk\"] ||\n pkg.devDependencies?.[\"mcp-use\"] ||\n pkg.devDependencies?.[\"@modelcontextprotocol/sdk\"]\n );\n } catch {\n return false;\n }\n}\n\nasync function getProjectName(cwd: string = process.cwd()): Promise<string> {\n try {\n const content = await fs.readFile(path.join(cwd, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(content);\n if (pkg.name) return pkg.name;\n } catch {\n // fall through\n }\n return path.basename(cwd);\n}\n\nasync function detectBuildCommand(cwd: string): Promise<string | undefined> {\n try {\n const content = await fs.readFile(path.join(cwd, \"package.json\"), \"utf-8\");\n if (JSON.parse(content).scripts?.build) return \"npm run build\";\n } catch {\n // noop\n }\n return undefined;\n}\n\nasync function detectStartCommand(cwd: string): Promise<string | undefined> {\n try {\n const content = await fs.readFile(path.join(cwd, \"package.json\"), \"utf-8\");\n const pkg = JSON.parse(content);\n if (pkg.scripts?.start) return \"npm start\";\n if (pkg.main) return `node ${pkg.main}`;\n } catch {\n // noop\n }\n return undefined;\n}\n\nasync function detectRuntime(cwd: string): Promise<\"node\" | \"python\"> {\n for (const f of [\"requirements.txt\", \"pyproject.toml\", \"setup.py\"]) {\n try {\n await fs.access(path.join(cwd, f));\n return \"python\";\n } catch {\n continue;\n }\n }\n return \"node\";\n}\n\nasync function prompt(\n question: string,\n defaultValue: \"y\" | \"n\" = \"n\"\n): Promise<boolean> {\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n const indicator = defaultValue === \"y\" ? \"Y/n\" : \"y/N\";\n const q = question.replace(/(\\(y\\/n\\):)/, `(${indicator}):`);\n return new Promise((resolve) => {\n rl.question(q, (answer) => {\n rl.close();\n const a = answer.trim().toLowerCase();\n if (a === \"\") resolve(defaultValue === \"y\");\n else resolve(a === \"y\" || a === \"yes\");\n });\n });\n}\n\nasync function promptText(\n question: string,\n defaultValue?: string\n): Promise<string> {\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n const suffix = defaultValue ? chalk.gray(` [${defaultValue}]`) : \"\";\n return new Promise((resolve) => {\n rl.question(question + suffix + \" \", (answer) => {\n rl.close();\n resolve(answer.trim() || defaultValue || \"\");\n });\n });\n}\n\n// ---------------------------------------------------------------------------\n// .gitignore management\n// ---------------------------------------------------------------------------\n\nconst REQUIRED_IGNORES = [\n \"node_modules\",\n \"dist\",\n \".env\",\n \".env.local\",\n \".mcp-use\",\n];\n\nasync function ensureGitignore(cwd: string): Promise<void> {\n const gitignorePath = path.join(cwd, \".gitignore\");\n let content = \"\";\n try {\n content = await fs.readFile(gitignorePath, \"utf-8\");\n } catch {\n // file doesn't exist yet\n }\n const missing = REQUIRED_IGNORES.filter((entry) => !content.includes(entry));\n if (missing.length > 0) {\n const additions = missing.join(\"\\n\");\n const newContent =\n content + (content.endsWith(\"\\n\") ? \"\" : \"\\n\") + additions + \"\\n\";\n await fs.writeFile(gitignorePath, newContent, \"utf-8\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// Deployment progress (poll build-logs)\n// ---------------------------------------------------------------------------\n\nasync function displayDeploymentProgress(\n api: McpUseAPI,\n deploymentId: string,\n progressOptions?: { yes?: boolean }\n): Promise<void> {\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let frameIndex = 0;\n let spinnerInterval: NodeJS.Timeout | null = null;\n\n const startSpinner = (message: string) => {\n if (spinnerInterval) clearInterval(spinnerInterval);\n process.stdout.write(\"\\r\\x1b[K\");\n spinnerInterval = setInterval(() => {\n process.stdout.write(\n \"\\r\" + chalk.cyan(frames[frameIndex]) + \" \" + chalk.gray(message)\n );\n frameIndex = (frameIndex + 1) % frames.length;\n }, 80);\n };\n\n const stopSpinner = () => {\n if (spinnerInterval) {\n clearInterval(spinnerInterval);\n spinnerInterval = null;\n process.stdout.write(\"\\r\\x1b[K\");\n }\n };\n\n console.log();\n startSpinner(\"Deploying...\");\n\n let checkCount = 0;\n const maxChecks = 120;\n let delay = 2000;\n const maxDelay = 10000;\n let buildLogOffset = 0;\n\n while (checkCount < maxChecks) {\n const waitMs = delay;\n await new Promise<void>((r) => setTimeout(r, waitMs));\n checkCount++;\n\n try {\n const resp = await api.getDeploymentBuildLogs(\n deploymentId,\n buildLogOffset\n );\n if (resp.logs.length > 0) {\n for (const line of resp.logs.split(\"\\n\").filter((l) => l.trim())) {\n try {\n const d = JSON.parse(line);\n if (d.line) {\n stopSpinner();\n const color =\n d.level === \"error\"\n ? chalk.red\n : d.level === \"warn\"\n ? chalk.yellow\n : chalk.gray;\n const prefix = d.step ? chalk.cyan(`[${d.step}]`) + \" \" : \"\";\n console.log(prefix + color(d.line));\n }\n } catch {\n stopSpinner();\n console.log(chalk.gray(line));\n }\n }\n buildLogOffset = resp.offset;\n }\n } catch {\n // not ready yet\n }\n\n const dep = await api.getDeployment(deploymentId);\n\n if (dep.status === \"running\") {\n stopSpinner();\n const mcpUrl = getMcpServerUrl(dep);\n const webUrl = (await getWebUrl()).replace(/\\/$/, \"\");\n const config = await readConfig();\n let dashboardUrl: string | null = null;\n if (dep.serverId) {\n dashboardUrl = config.orgSlug\n ? `${webUrl}/cloud/${config.orgSlug}/servers/${dep.serverId}`\n : `${webUrl}/cloud/servers/${dep.serverId}`;\n }\n const inspectorUrl = `https://inspector.manufact.com/inspector?autoConnect=${encodeURIComponent(mcpUrl)}`;\n\n console.log(chalk.green.bold(\"✓ Deployment successful!\\n\"));\n if (mcpUrl) {\n console.log(chalk.white(\"🌐 MCP Server URL:\"));\n console.log(chalk.cyan.bold(` ${mcpUrl}\\n`));\n }\n if (dashboardUrl) {\n console.log(chalk.white(\"📊 Dashboard:\"));\n console.log(chalk.cyan.bold(` ${dashboardUrl}\\n`));\n }\n console.log(chalk.white(\"🔍 Inspector URL:\"));\n console.log(chalk.cyan.bold(` ${inspectorUrl}\\n`));\n console.log(chalk.gray(\"Deployment ID: \") + chalk.white(dep.id));\n return;\n } else if (dep.status === \"failed\") {\n stopSpinner();\n console.log(chalk.red.bold(\"✗ Deployment failed\\n\"));\n if (dep.error) {\n const internalPatterns = [\n \"GraphQL\",\n \"authenticated\",\n \"INTERNAL\",\n \"Fly API\",\n \"token validation\",\n \"context deadline\",\n \"Bad gateway\",\n \"502\",\n \"503\",\n ];\n const isInternalError = internalPatterns.some((p) =>\n dep.error!.includes(p)\n );\n if (isInternalError) {\n console.log(\n chalk.red(\"Error: \") +\n \"An internal infrastructure error occurred. Please try again.\"\n );\n console.log(chalk.gray(\" Details: \" + dep.error));\n } else {\n console.log(chalk.red(\"Error: \") + dep.error);\n }\n }\n process.exit(1);\n } else if (dep.status === \"building\" || dep.status === \"pending\") {\n startSpinner(\"Building and deploying...\");\n delay = Math.min(delay * 1.2, maxDelay);\n } else {\n stopSpinner();\n console.log(chalk.yellow(\"⚠️ Deployment status: \") + dep.status);\n return;\n }\n }\n\n stopSpinner();\n console.log(chalk.yellow(\"⚠️ Deployment is taking longer than expected.\"));\n console.log(\n chalk.gray(\"Check status with: \") +\n chalk.white(`mcp-use deployments get ${deploymentId}`)\n );\n}\n\n// ---------------------------------------------------------------------------\n// GitHub helpers\n// ---------------------------------------------------------------------------\n\nasync function promptReauthenticateOn401(\n options: DeployOptions,\n orgIdToRestore: string | undefined\n): Promise<McpUseAPI> {\n console.log(chalk.red(\"\\n✗ Session expired or API key invalid.\"));\n if (options.yes) {\n console.log(\n chalk.gray(\" Run mcp-use login to re-authenticate, then retry.\")\n );\n process.exit(1);\n }\n const should = await prompt(chalk.white(\"Log in again? (Y/n): \"), \"y\");\n if (!should) {\n process.exit(1);\n }\n await loginCommand({ silent: false });\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ Login failed. Please try again.\"));\n process.exit(1);\n }\n const fresh = await McpUseAPI.create();\n if (orgIdToRestore) {\n fresh.setOrgId(orgIdToRestore);\n }\n return fresh;\n}\n\nasync function ensureApiSessionForDeploy(\n api: McpUseAPI,\n options: DeployOptions,\n orgIdToRestore: string | undefined\n): Promise<McpUseAPI> {\n let client = api;\n for (;;) {\n try {\n await client.testAuth();\n return client;\n } catch (e) {\n if (!(e instanceof ApiUnauthorizedError)) throw e;\n client = await promptReauthenticateOn401(options, orgIdToRestore);\n }\n }\n}\n\nasync function getGitHubConnectionStatusWith401Retry(\n api: McpUseAPI,\n options: DeployOptions,\n orgIdToRestore: string | undefined\n): Promise<{ api: McpUseAPI; status: GitHubConnectionStatus }> {\n let client = api;\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n const status = await client.getGitHubConnectionStatus();\n return { api: client, status };\n } catch (e) {\n if (e instanceof ApiUnauthorizedError && attempt === 0) {\n client = await promptReauthenticateOn401(options, orgIdToRestore);\n await client.testAuth();\n continue;\n }\n throw e;\n }\n }\n throw new Error(\"Unreachable\");\n}\n\nasync function checkRepoAccess(\n api: McpUseAPI,\n owner: string,\n repo: string\n): Promise<boolean> {\n try {\n const resp = await api.getGitHubRepos(true);\n return resp.repos.some((r) => r.full_name === `${owner}/${repo}`);\n } catch {\n return false;\n }\n}\n\nasync function promptGitHubInstallation(\n api: McpUseAPI,\n reason: \"not_connected\" | \"no_access\",\n repoName?: string,\n opts?: {\n yes?: boolean;\n installationId?: string;\n reauth: () => Promise<McpUseAPI>;\n }\n): Promise<{ ok: boolean; api: McpUseAPI }> {\n const yes = !!opts?.yes;\n const reauth = opts?.reauth;\n console.log();\n\n if (reason === \"not_connected\") {\n console.log(chalk.yellow(\"⚠️ GitHub account not connected\"));\n console.log(\n chalk.white(\"Deployments require a connected GitHub account.\\n\")\n );\n } else {\n console.log(\n chalk.yellow(\"⚠️ GitHub App doesn't have access to this repository\")\n );\n console.log(\n chalk.white(\n `The GitHub App needs permission to access ${chalk.cyan(repoName || \"this repository\")}.\\n`\n )\n );\n }\n\n const shouldInstall = yes\n ? true\n : await prompt(\n chalk.white(\n `Would you like to ${reason === \"not_connected\" ? \"connect\" : \"configure\"} GitHub now? (Y/n): `\n ),\n \"y\"\n );\n if (!shouldInstall) return { ok: false, api };\n\n let client = api;\n\n try {\n let appName: string;\n for (;;) {\n try {\n appName = await client.getGitHubAppName();\n break;\n } catch (e) {\n if (e instanceof ApiUnauthorizedError && reauth) {\n client = await reauth();\n await client.testAuth();\n continue;\n }\n throw e;\n }\n }\n\n const installUrl = `https://github.com/apps/${appName}/installations/new`;\n\n console.log(chalk.cyan(`\\nOpening browser...`));\n console.log(chalk.gray(`URL: ${installUrl}\\n`));\n\n if (reason === \"no_access\") {\n console.log(\n chalk.white(\"Please add \") +\n chalk.cyan.bold(repoName || \"your repository\") +\n chalk.white(\" to the app's repository access, then return here.\\n\")\n );\n } else {\n console.log(\n chalk.white(\"Complete the GitHub App installation, then return here.\\n\")\n );\n }\n\n await open(installUrl);\n\n if (!yes) {\n await prompt(chalk.white(\"Press Enter when done...\"), \"y\");\n } else {\n console.log(chalk.gray(\"Waiting for GitHub configuration (polling)...\"));\n const deadline = Date.now() + 120_000;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 2000));\n try {\n const status = await client.getGitHubConnectionStatus();\n if (status.is_connected) {\n if (!repoName) return { ok: true, api: client };\n const [o, r] = repoName.split(\"/\");\n if (o && r && (await checkRepoAccess(client, o, r))) {\n return { ok: true, api: client };\n }\n }\n } catch (e) {\n if (e instanceof ApiUnauthorizedError && reauth) {\n client = await reauth();\n await client.testAuth();\n continue;\n }\n }\n }\n }\n\n return { ok: true, api: client };\n } catch (e) {\n if (e instanceof ApiUnauthorizedError) {\n console.log(chalk.red(\"\\n✗ Session expired or API key invalid.\"));\n process.exit(1);\n }\n console.log(chalk.yellow(\"\\n⚠️ Unable to open browser automatically\"));\n console.log(\n chalk.white(\"Please visit: \") +\n chalk.cyan(\"https://manufact.com/cloud/settings\")\n );\n return { ok: false, api: client };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main deploy command\n// ---------------------------------------------------------------------------\n\nexport async function deployCommand(options: DeployOptions): Promise<void> {\n try {\n const cwd = process.cwd();\n\n // ── Step 1: Auth ──────────────────────────────────────────────\n if (!(await isLoggedIn())) {\n console.log(chalk.cyan.bold(\"Welcome to Manufact Cloud!\\n\"));\n if (options.yes) {\n console.log(\n chalk.red(\n \"✗ Not logged in. Run \" +\n chalk.white(\"npx mcp-use login\") +\n \" first.\"\n )\n );\n process.exit(1);\n }\n\n const shouldLogin = await prompt(\n chalk.white(\"You need to log in to deploy. Log in now? (Y/n): \"),\n \"y\"\n );\n if (!shouldLogin) {\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(0);\n }\n\n try {\n await loginCommand({ silent: false });\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ Login failed. Please try again.\"));\n process.exit(1);\n }\n console.log(chalk.gray(\"\\nContinuing with deployment...\\n\"));\n } catch (error) {\n console.error(\n chalk.red.bold(\"✗ Login failed:\"),\n chalk.red(error instanceof Error ? error.message : \"Unknown error\")\n );\n process.exit(1);\n }\n }\n\n let api = await McpUseAPI.create();\n\n // ── Step 2: Org resolution ────────────────────────────────────\n let resolvedOrgId: string | undefined;\n let resolvedOrgName: string | undefined;\n let resolvedOrgSlug: string | undefined;\n\n if (options.org) {\n const authInfo = await api.testAuth();\n const match = resolveOrgFromOption(authInfo.orgs ?? [], options.org);\n if (match) {\n api.setOrgId(match.id);\n resolvedOrgId = match.id;\n resolvedOrgName = match.name;\n resolvedOrgSlug = match.slug ?? undefined;\n const slug = match.slug ? chalk.gray(` (${match.slug})`) : \"\";\n console.log(\n chalk.gray(\"Organization: \") + chalk.cyan(match.name) + slug\n );\n } else {\n console.error(\n chalk.red(\n `✗ Organization \"${options.org}\" not found. Run ${chalk.white(\"npx mcp-use org list\")} to see available organizations.`\n )\n );\n process.exit(1);\n }\n } else {\n const config = await readConfig();\n if (!config.orgId) {\n const authInfo = await api.testAuth();\n if (authInfo.orgs.length === 0) {\n console.log(\n chalk.red(\n \"✗ No organizations found. Please create one at manufact.com/cloud.\"\n )\n );\n process.exit(1);\n }\n let selectedOrg: OrgInfo | null;\n if (authInfo.orgs.length === 1) {\n selectedOrg = authInfo.orgs[0];\n } else {\n selectedOrg = await promptOrgSelection(\n authInfo.orgs,\n authInfo.default_org_id\n );\n }\n if (!selectedOrg) {\n console.log(chalk.red(\"✗ No organization selected.\"));\n process.exit(1);\n }\n api.setOrgId(selectedOrg.id);\n resolvedOrgId = selectedOrg.id;\n resolvedOrgName = selectedOrg.name;\n resolvedOrgSlug = selectedOrg.slug ?? undefined;\n await writeConfig({\n ...config,\n orgId: selectedOrg.id,\n orgName: selectedOrg.name,\n orgSlug: selectedOrg.slug ?? undefined,\n });\n console.log(\n chalk.gray(\"Organization: \") + chalk.cyan(selectedOrg.name)\n );\n } else {\n resolvedOrgId = config.orgId;\n resolvedOrgName = config.orgName;\n resolvedOrgSlug = config.orgSlug;\n api.setOrgId(config.orgId);\n if (config.orgName) {\n const slug = config.orgSlug ? chalk.gray(` (${config.orgSlug})`) : \"\";\n console.log(\n chalk.gray(\"Organization: \") + chalk.cyan(config.orgName) + slug\n );\n }\n }\n }\n\n api = await ensureApiSessionForDeploy(api, options, resolvedOrgId);\n\n console.log(chalk.cyan.bold(\"\\n🚀 Deploying to Manufact cloud...\\n\"));\n\n // ── Step 3: GitHub connection ─────────────────────────────────\n const reauth = () => promptReauthenticateOn401(options, resolvedOrgId);\n\n let ghConn = await getGitHubConnectionStatusWith401Retry(\n api,\n options,\n resolvedOrgId\n );\n api = ghConn.api;\n let connectionStatus = ghConn.status;\n\n if (!connectionStatus.is_connected) {\n const installed = await promptGitHubInstallation(\n api,\n \"not_connected\",\n undefined,\n {\n yes: options.yes,\n reauth,\n }\n );\n if (!installed.ok) {\n console.log(chalk.gray(\"Deployment cancelled.\"));\n process.exit(0);\n }\n api = installed.api;\n ghConn = await getGitHubConnectionStatusWith401Retry(\n api,\n options,\n resolvedOrgId\n );\n api = ghConn.api;\n connectionStatus = ghConn.status;\n if (!connectionStatus.is_connected) {\n console.log(chalk.red(\"\\n✗ GitHub connection could not be verified.\"));\n console.log(\n chalk.cyan(\n \" Visit https://manufact.com/cloud/settings to connect GitHub.\\n\"\n )\n );\n process.exit(1);\n }\n }\n\n const installations = connectionStatus.installations ?? [];\n if (installations.length === 0) {\n console.log(chalk.red(\"✗ No GitHub installations found.\"));\n process.exit(1);\n }\n\n console.log(chalk.green(\"✓ GitHub connected\\n\"));\n\n // Resolved later based on user selection or repo ownership.\n let installationDbId: string | undefined;\n let githubInstallationId: string | undefined;\n\n // ── Step 4: Project & Git ─────────────────────────────────────\n const projectDir = options.rootDir\n ? path.resolve(cwd, options.rootDir)\n : cwd;\n\n if (options.rootDir) {\n try {\n await fs.access(projectDir);\n } catch {\n console.log(\n chalk.red(`✗ Root directory not found: ${options.rootDir}`)\n );\n process.exit(1);\n }\n }\n\n const isMcp = await isMcpProject(projectDir);\n if (!isMcp && !options.yes) {\n console.log(\n chalk.yellow(\"⚠️ This doesn't look like an MCP server project.\")\n );\n const shouldContinue = await prompt(\n chalk.white(\"Continue anyway? (y/n): \")\n );\n if (!shouldContinue) {\n process.exit(0);\n }\n console.log();\n }\n\n let gitInfo = await getGitInfo(cwd);\n let repoFullName: string | undefined;\n let branch: string = \"main\";\n\n if (!gitInfo.isGitRepo || !gitInfo.remoteUrl) {\n // No git repo or no remote — offer to create one\n const projectName = options.name || (await getProjectName(projectDir));\n\n console.log(chalk.yellow(\"⚠️ No GitHub remote found.\\n\"));\n if (options.yes) {\n console.log(chalk.gray(\"Creating GitHub repository automatically...\"));\n } else {\n const shouldCreate = await prompt(\n chalk.white(\"Create a GitHub repository and push your code? (Y/n): \"),\n \"y\"\n );\n if (!shouldCreate) {\n console.log(\n chalk.gray(\n \"Deployment cancelled. Set up a GitHub remote and try again.\"\n )\n );\n process.exit(0);\n }\n }\n\n // Let the user pick which GitHub account to create the repo under.\n // Default to the first org-type installation (org accounts support auto-create).\n const defaultIdx = installations.findIndex(\n (i) => i.account_type === \"Organization\"\n );\n let selectedIdx = defaultIdx >= 0 ? defaultIdx : 0;\n\n if (installations.length > 1 && !options.yes) {\n console.log(\n chalk.cyan.bold(\"🐙 Select a GitHub account for the repository:\\n\")\n );\n for (let i = 0; i < installations.length; i++) {\n const inst = installations[i];\n const typeLabel =\n inst.account_type === \"Organization\"\n ? chalk.gray(\" (org)\")\n : chalk.gray(\" (personal)\");\n const marker = i === selectedIdx ? chalk.green(\" ← default\") : \"\";\n console.log(\n ` ${chalk.white(`${i + 1}.`)} ${inst.account_login}${typeLabel}${marker}`\n );\n }\n console.log();\n\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n const answer = await new Promise<string>((resolve) => {\n rl.question(\n chalk.gray(`Enter number [${selectedIdx + 1}]: `),\n (a) => {\n rl.close();\n resolve(a.trim());\n }\n );\n });\n const parsed = answer === \"\" ? selectedIdx : parseInt(answer, 10) - 1;\n if (parsed >= 0 && parsed < installations.length) {\n selectedIdx = parsed;\n }\n }\n\n const repoInstallation = installations[selectedIdx];\n installationDbId = repoInstallation.id;\n githubInstallationId = repoInstallation.installation_id;\n\n const repoName = options.yes\n ? projectName\n : await promptText(chalk.gray(\"Repository name:\"), projectName);\n\n await ensureGitignore(cwd);\n\n console.log(\n chalk.gray(\n `Creating repository on ${repoInstallation.account_login}...`\n )\n );\n\n let repoResult: { fullName: string; cloneUrl: string; htmlUrl: string };\n try {\n repoResult = await api.createGitHubRepo({\n installationId: repoInstallation.installation_id,\n name: repoName,\n private: true,\n org: repoInstallation.account_login,\n });\n } catch (err) {\n if (err instanceof GitHubAuthRequiredError) {\n console.log(\n chalk.yellow(\n `\\n Personal accounts require a one-time GitHub authorization.\\n`\n )\n );\n try {\n await open(err.authorizeUrl);\n console.log(\n chalk.gray(\" Browser opened. Authorize and return here.\\n\")\n );\n } catch {\n console.log(\n chalk.gray(\n ` Open this URL in your browser:\\n ${err.authorizeUrl}\\n`\n )\n );\n }\n const readline = await import(\"node:readline\");\n await new Promise<void>((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(\n chalk.gray(\" Press Enter after authorizing...\"),\n () => {\n rl.close();\n resolve();\n }\n );\n });\n console.log(chalk.gray(\"Retrying repository creation...\"));\n repoResult = await api.createGitHubRepo({\n installationId: repoInstallation.installation_id,\n name: repoName,\n private: true,\n org: repoInstallation.account_login,\n });\n } else {\n throw err;\n }\n }\n console.log(chalk.green(`✓ Created ${chalk.cyan(repoResult.fullName)}`));\n\n try {\n if (!gitInfo.isGitRepo) {\n await ensureGitignore(cwd);\n console.log(chalk.gray(\"Initializing git...\"));\n await gitInit(cwd, \"Initial commit\");\n console.log(chalk.gray(\"Pushing to GitHub...\"));\n await gitAddRemoteAndPush(cwd, repoResult.cloneUrl, \"main\");\n } else {\n if (await hasUncommittedChanges(cwd)) {\n console.log(\n chalk.red(\n \"✗ You have uncommitted changes. Commit and push before deploying.\"\n )\n );\n process.exit(1);\n }\n console.log(chalk.gray(\"Adding remote and pushing...\"));\n await gitAddRemoteAndPush(\n cwd,\n repoResult.cloneUrl,\n gitInfo.branch || \"main\"\n );\n }\n } catch (err) {\n if (err instanceof GitCommandError) {\n console.log(chalk.red(`\\n✗ Git step failed: \\`${err.command}\\``));\n const stderrTrimmed = (err.stderr || err.stdout).trim();\n if (stderrTrimmed) {\n console.log(chalk.gray(stderrTrimmed));\n }\n // Actionable hint for the most common failure: missing identity.\n if (/tell me who you are|user\\.email|user\\.name/i.test(err.stderr)) {\n console.log(\n chalk.yellow(\n \"\\n Set your git identity for this project and retry:\\n\" +\n ` git -C ${JSON.stringify(cwd)} config user.email \"you@example.com\"\\n` +\n ` git -C ${JSON.stringify(cwd)} config user.name \"Your Name\"`\n )\n );\n } else if (\n /non-fast-forward|rejected|unrelated histories/i.test(err.stderr)\n ) {\n console.log(\n chalk.yellow(\n \"\\n The remote branch already has commits. Either delete the empty GitHub repo and retry, \" +\n \"or reconcile manually:\\n\" +\n \" git pull --rebase origin main --allow-unrelated-histories\\n\" +\n \" git push -u origin main\"\n )\n );\n }\n process.exit(1);\n }\n throw err;\n }\n\n console.log(chalk.green(\"✓ Code pushed to GitHub\\n\"));\n\n gitInfo = await getGitInfo(cwd);\n repoFullName = repoResult.fullName;\n branch = gitInfo.branch || \"main\";\n } else if (!isGitHubUrl(gitInfo.remoteUrl!)) {\n console.log(chalk.red(\"✗ Remote is not a GitHub repository\"));\n console.log(chalk.yellow(` Current remote: ${gitInfo.remoteUrl}\\n`));\n process.exit(1);\n } else if (!gitInfo.owner || !gitInfo.repo) {\n console.log(chalk.red(\"✗ Could not parse GitHub repository information\"));\n process.exit(1);\n } else {\n repoFullName = `${gitInfo.owner}/${gitInfo.repo}`;\n branch = gitInfo.branch || \"main\";\n\n // Resolve installation matching the repo owner\n const ownerLower = gitInfo.owner!.toLowerCase();\n const matchingInst =\n installations.find(\n (i) => i.account_login.toLowerCase() === ownerLower\n ) ??\n installations.find((i) => i.account_type === \"Organization\") ??\n installations[0];\n installationDbId = matchingInst.id;\n githubInstallationId = matchingInst.installation_id;\n\n // Check for uncommitted changes\n if (gitInfo.hasUncommittedChanges) {\n if (options.yes) {\n console.log(\n chalk.red(\n \"✗ You have uncommitted changes. Commit and push before deploying.\"\n )\n );\n process.exit(1);\n }\n console.log(chalk.yellow(\"⚠️ You have uncommitted changes.\\n\"));\n const shouldCommit = await prompt(\n chalk.white(\"Commit and push changes before deploying? (Y/n): \"),\n \"y\"\n );\n if (shouldCommit) {\n await ensureGitignore(cwd);\n console.log(chalk.gray(\"Committing and pushing...\"));\n await gitCommitAndPush(cwd, \"Deploy changes\", branch);\n gitInfo = await getGitInfo(cwd);\n console.log(chalk.green(\"✓ Changes pushed\\n\"));\n } else {\n console.log(chalk.gray(\"Deploying from last pushed commit.\\n\"));\n }\n }\n\n // Check repo access\n console.log(chalk.gray(\"Checking repository access...\"));\n const hasAccess = await checkRepoAccess(\n api,\n gitInfo.owner!,\n gitInfo.repo!\n );\n if (!hasAccess) {\n console.log(\n chalk.yellow(\n `⚠️ GitHub App doesn't have access to ${chalk.cyan(repoFullName)}`\n )\n );\n const configured = await promptGitHubInstallation(\n api,\n \"no_access\",\n repoFullName,\n {\n yes: options.yes,\n installationId: githubInstallationId,\n reauth: () => promptReauthenticateOn401(options, resolvedOrgId),\n }\n );\n if (!configured.ok) {\n process.exit(0);\n }\n api = configured.api;\n const retry = await checkRepoAccess(api, gitInfo.owner!, gitInfo.repo!);\n if (!retry) {\n const appName = await api.getGitHubAppName();\n console.log(\n chalk.red(\n `\\n✗ Repository ${chalk.cyan(repoFullName)} is still not accessible.`\n )\n );\n console.log(\n chalk.cyan(\n ` https://github.com/apps/${appName}/installations/new\\n`\n )\n );\n process.exit(1);\n }\n }\n console.log(chalk.green(\"✓ Repository access confirmed\"));\n }\n\n // ── Step 5: Display config ────────────────────────────────────\n const projectName = options.name || (await getProjectName(projectDir));\n const port = options.port || 3000;\n const buildCommand = await detectBuildCommand(projectDir);\n const startCommand = await detectStartCommand(projectDir);\n const runtime = options.runtime || (await detectRuntime(projectDir));\n const envVars = await buildEnvVars(options);\n\n console.log();\n console.log(chalk.white(\"Deployment configuration:\"));\n console.log(chalk.gray(` Repository: `) + chalk.cyan(repoFullName));\n console.log(chalk.gray(` Branch: `) + chalk.cyan(branch));\n console.log(chalk.gray(` Name: `) + chalk.cyan(projectName));\n console.log(chalk.gray(` Runtime: `) + chalk.cyan(runtime));\n console.log(chalk.gray(` Port: `) + chalk.cyan(port));\n if (options.region)\n console.log(chalk.gray(` Region: `) + chalk.cyan(options.region));\n if (options.buildCommand)\n console.log(\n chalk.gray(` Build command: `) + chalk.cyan(options.buildCommand)\n );\n else if (buildCommand)\n console.log(\n chalk.gray(` Build command: `) +\n chalk.gray(buildCommand + \" (auto-detected)\")\n );\n if (options.startCommand)\n console.log(\n chalk.gray(` Start command: `) + chalk.cyan(options.startCommand)\n );\n else if (startCommand)\n console.log(\n chalk.gray(` Start command: `) +\n chalk.gray(startCommand + \" (auto-detected)\")\n );\n if (Object.keys(envVars).length > 0) {\n console.log(\n chalk.gray(` Environment: `) +\n chalk.cyan(`${Object.keys(envVars).length} variable(s)`)\n );\n }\n console.log();\n\n if (!options.yes) {\n const shouldDeploy = await prompt(chalk.white(`Deploy? (Y/n): `), \"y\");\n if (!shouldDeploy) {\n console.log(chalk.gray(\"Deployment cancelled.\"));\n process.exit(0);\n }\n }\n\n // ── Step 6: Deploy ────────────────────────────────────────────\n const existingLink = !options.new ? await getProjectLink(cwd) : null;\n let serverId = existingLink?.serverId;\n\n // When --org is specified, verify the linked server belongs to that org.\n // If not, ignore the link and create a new server in the specified org.\n if (serverId && resolvedOrgId) {\n try {\n const linkedServer = await api.getServer(serverId);\n if (linkedServer.organizationId !== resolvedOrgId) {\n const target = resolvedOrgName\n ? `${resolvedOrgName}${resolvedOrgSlug ? ` (${resolvedOrgSlug})` : \"\"}`\n : resolvedOrgId;\n console.log(\n chalk.yellow(\n `⚠️ Linked server belongs to a different organization. Creating a new server in ${target}...\\n`\n )\n );\n serverId = undefined;\n }\n } catch {\n // If we can't fetch the server, let the existing flow handle it\n }\n }\n\n if (existingLink && serverId) {\n try {\n const existingDep = await api.getDeployment(existingLink.deploymentId);\n if (existingDep && existingDep.status !== \"failed\") {\n console.log(chalk.green(`✓ Found linked server`));\n console.log(chalk.gray(` Redeploying to maintain the same URL...`));\n console.log(chalk.cyan(` URL: ${getMcpServerUrl(existingDep)}\\n`));\n\n if (Object.keys(envVars).length > 0) {\n const synced = await syncEnvVarsToServer(api, serverId, envVars);\n console.log(\n chalk.green(\n `✓ Synced ${synced.created + synced.updated} environment variable(s)` +\n (synced.created || synced.updated\n ? chalk.gray(\n ` (${synced.created} created, ${synced.updated} updated)`\n )\n : \"\")\n )\n );\n }\n\n const newDep = await api.createDeployment({\n serverId,\n branch,\n trigger: \"redeploy\",\n });\n\n await saveProjectLink(cwd, {\n ...existingLink,\n linkedAt: new Date().toISOString(),\n deploymentId: newDep.id,\n });\n\n console.log(\n chalk.green(\"✓ Deployment created: \") + chalk.gray(newDep.id)\n );\n await displayDeploymentProgress(api, newDep.id, { yes: options.yes });\n return;\n }\n } catch (err: any) {\n const is404 =\n err?.status === 404 || (err?.message ?? \"\").includes(\"404\");\n if (is404) {\n console.log(\n chalk.yellow(\"⚠️ Previously linked server no longer exists.\\n\")\n );\n if (!options.yes) {\n const shouldRecreate = await prompt(\n chalk.white(\"Create a new server and deploy? (Y/n): \"),\n \"y\"\n );\n if (!shouldRecreate) {\n console.log(chalk.gray(\"Deployment cancelled.\"));\n process.exit(0);\n }\n }\n serverId = undefined;\n }\n }\n }\n\n let deploymentId: string | undefined;\n\n if (serverId) {\n if (Object.keys(envVars).length > 0) {\n const synced = await syncEnvVarsToServer(api, serverId, envVars);\n console.log(\n chalk.green(\n `✓ Synced ${synced.created + synced.updated} environment variable(s)` +\n (synced.created || synced.updated\n ? chalk.gray(\n ` (${synced.created} created, ${synced.updated} updated)`\n )\n : \"\")\n )\n );\n }\n console.log(chalk.gray(\"Creating deployment...\"));\n try {\n const result = await api.createDeployment({\n serverId,\n branch,\n trigger: \"manual\",\n });\n deploymentId = result.id;\n } catch (err: any) {\n const is404 =\n err?.status === 404 || (err?.message ?? \"\").includes(\"404\");\n if (is404) {\n console.log(\n chalk.yellow(\n \"⚠️ Linked server no longer exists. Creating a new one...\\n\"\n )\n );\n serverId = undefined;\n } else {\n throw err;\n }\n }\n }\n\n if (!serverId) {\n const orgId = await api.resolveOrganizationId();\n\n if (!installationDbId) {\n console.log(\n chalk.red(\n \"✗ Could not determine GitHub installation for this repository.\"\n )\n );\n process.exit(1);\n }\n\n console.log(chalk.gray(\"Creating server and deployment...\"));\n const serverResult = await api.createServer({\n type: \"github\",\n organizationId: orgId,\n installationId: installationDbId,\n name: projectName,\n repoFullName: repoFullName!,\n branch,\n rootDir: options.rootDir,\n port,\n env: Object.keys(envVars).length > 0 ? envVars : undefined,\n region: options.region,\n buildCommand: options.buildCommand,\n startCommand: options.startCommand,\n });\n\n deploymentId = serverResult.deploymentId ?? \"\";\n if (!deploymentId) {\n console.log(\n chalk.green(\"✓ Server created: \") + chalk.gray(serverResult.server.id)\n );\n console.log(chalk.yellow(\"⚠️ No deployment was triggered.\"));\n return;\n }\n\n await saveProjectLink(cwd, {\n deploymentId,\n deploymentName: projectName,\n linkedAt: new Date().toISOString(),\n serverId: serverResult.server.id,\n });\n console.log(\n chalk.gray(` Linked to this project (stored in .mcp-use/project.json)`)\n );\n console.log(chalk.gray(` Future deploys will reuse the same URL\\n`));\n }\n\n if (!deploymentId) {\n console.log(chalk.red(\"✗ No deployment was created.\"));\n process.exit(1);\n }\n\n console.log(\n chalk.green(\"✓ Deployment created: \") + chalk.gray(deploymentId)\n );\n await displayDeploymentProgress(api, deploymentId, { yes: options.yes });\n\n if (options.open) {\n const dep = await api.getDeployment(deploymentId);\n const url = getMcpServerUrl(dep);\n if (url) {\n console.log(chalk.gray(\"\\nOpening in browser...\"));\n await open(url);\n }\n }\n } catch (error) {\n console.error(\n chalk.red.bold(\"\\n✗ Deployment failed:\"),\n chalk.red(error instanceof Error ? error.message : \"Unknown error\")\n );\n process.exit(1);\n }\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\ninterface GitInfo {\n isGitRepo: boolean;\n remoteUrl?: string;\n owner?: string;\n repo?: string;\n branch?: string;\n commitSha?: string;\n commitMessage?: string;\n hasUncommittedChanges?: boolean;\n}\n\n/**\n * Read-only git probe. Swallows errors and returns `null` so callers can treat\n * \"command failed\" identically to \"empty output\" (e.g. not a repo, no remote).\n *\n * DO NOT use this for state-mutating commands (init/add/commit/push/remote add).\n * Use `gitCommandOrThrow` instead so failures surface to the user.\n */\nasync function gitCommand(\n args: string[],\n cwd: string = process.cwd()\n): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(\"git\", args, { cwd });\n return stdout.trim();\n } catch (error) {\n return null;\n }\n}\n\n/**\n * Error thrown by `gitCommandOrThrow` when a git command exits non-zero.\n * Carries the command string plus captured stderr/stdout for actionable errors.\n */\nexport class GitCommandError extends Error {\n readonly command: string;\n readonly stderr: string;\n readonly stdout: string;\n readonly exitCode: number | null;\n\n constructor(opts: {\n command: string;\n stderr: string;\n stdout: string;\n exitCode: number | null;\n }) {\n const trimmed = opts.stderr.trim() || opts.stdout.trim() || \"unknown error\";\n super(`git command failed: \\`${opts.command}\\`\\n${trimmed}`);\n this.name = \"GitCommandError\";\n this.command = opts.command;\n this.stderr = opts.stderr;\n this.stdout = opts.stdout;\n this.exitCode = opts.exitCode;\n }\n}\n\n/**\n * Execute a git command that MUST succeed. On non-zero exit, throws\n * `GitCommandError` with captured stderr so the caller can show actionable\n * errors instead of silently continuing.\n */\nasync function gitCommandOrThrow(\n args: string[],\n cwd: string = process.cwd()\n): Promise<string> {\n const command = `git ${args.join(\" \")}`;\n try {\n const { stdout } = await execFileAsync(\"git\", args, { cwd });\n return stdout.trim();\n } catch (error) {\n const e = error as {\n stderr?: string;\n stdout?: string;\n code?: number | null;\n message?: string;\n };\n throw new GitCommandError({\n command,\n stderr: (e.stderr ?? \"\").toString(),\n stdout: (e.stdout ?? \"\").toString(),\n exitCode: typeof e.code === \"number\" ? e.code : null,\n });\n }\n}\n\n/**\n * Check if directory is a git repository\n */\nasync function isGitRepo(cwd: string = process.cwd()): Promise<boolean> {\n const result = await gitCommand([\"rev-parse\", \"--is-inside-work-tree\"], cwd);\n return result === \"true\";\n}\n\n/**\n * Get git remote URL\n */\nasync function getRemoteUrl(\n cwd: string = process.cwd()\n): Promise<string | null> {\n return gitCommand([\"config\", \"--get\", \"remote.origin.url\"], cwd);\n}\n\n/**\n * Parse GitHub owner and repo from remote URL\n */\nfunction parseGitHubUrl(url: string): { owner: string; repo: string } | null {\n // Handle both SSH and HTTPS URLs\n // SSH: git@github.com:owner/repo.git\n // HTTPS: https://github.com/owner/repo.git\n const sshMatch = url.match(/git@github\\.com:([^/]+)\\/(.+?)(?:\\.git)?$/);\n const httpsMatch = url.match(\n /https:\\/\\/github\\.com\\/([^/]+)\\/(.+?)(?:\\.git)?$/\n );\n\n const match = sshMatch || httpsMatch;\n if (!match) return null;\n\n return {\n owner: match[1],\n repo: match[2],\n };\n}\n\n/**\n * Get current branch\n */\nasync function getCurrentBranch(\n cwd: string = process.cwd()\n): Promise<string | null> {\n return gitCommand([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], cwd);\n}\n\n/**\n * Get current commit SHA\n */\nasync function getCommitSha(\n cwd: string = process.cwd()\n): Promise<string | null> {\n return gitCommand([\"rev-parse\", \"HEAD\"], cwd);\n}\n\n/**\n * Get current commit message\n */\nasync function getCommitMessage(\n cwd: string = process.cwd()\n): Promise<string | null> {\n return gitCommand([\"log\", \"-1\", \"--pretty=%B\"], cwd);\n}\n\n/**\n * Check if there are uncommitted changes\n */\nexport async function hasUncommittedChanges(\n cwd: string = process.cwd()\n): Promise<boolean> {\n const result = await gitCommand([\"status\", \"--porcelain\"], cwd);\n return result !== null && result.length > 0;\n}\n\n/**\n * Get all git info for current directory\n */\nexport async function getGitInfo(\n cwd: string = process.cwd()\n): Promise<GitInfo> {\n const isRepo = await isGitRepo(cwd);\n\n if (!isRepo) {\n return { isGitRepo: false };\n }\n\n const remoteUrl = await getRemoteUrl(cwd);\n const branch = await getCurrentBranch(cwd);\n const commitSha = await getCommitSha(cwd);\n const commitMessage = await getCommitMessage(cwd);\n const uncommittedChanges = await hasUncommittedChanges(cwd);\n\n let owner: string | undefined;\n let repo: string | undefined;\n\n if (remoteUrl) {\n const parsed = parseGitHubUrl(remoteUrl);\n if (parsed) {\n owner = parsed.owner;\n repo = parsed.repo;\n }\n }\n\n return {\n isGitRepo: true,\n remoteUrl: remoteUrl || undefined,\n owner,\n repo,\n branch: branch || undefined,\n commitSha: commitSha || undefined,\n commitMessage: commitMessage || undefined,\n hasUncommittedChanges: uncommittedChanges,\n };\n}\n\n/**\n * Initialize a git repo, add all files, commit, and normalize branch to `main`.\n *\n * Throws `GitCommandError` (typed Error) on any failure so callers can surface\n * the real stderr instead of silently continuing (previous behavior left the\n * repo in a half-baked state and the CLI still printed \"Code pushed\").\n */\nexport async function gitInit(\n cwd: string,\n message: string = \"Initial commit\"\n): Promise<void> {\n await gitCommandOrThrow([\"init\"], cwd);\n await gitCommandOrThrow([\"add\", \".\"], cwd);\n await gitCommandOrThrow([\"commit\", \"-m\", message], cwd);\n // Normalize branch name so a subsequent `git push -u origin main` always\n // matches, regardless of the user's `init.defaultBranch` config.\n await gitCommandOrThrow([\"branch\", \"-M\", \"main\"], cwd);\n // Guard: commit must exist before we try to push.\n await gitCommandOrThrow([\"rev-parse\", \"HEAD\"], cwd);\n}\n\n/**\n * Add a remote and push to it. Throws `GitCommandError` on failure.\n */\nexport async function gitAddRemoteAndPush(\n cwd: string,\n cloneUrl: string,\n branch: string = \"main\"\n): Promise<void> {\n await gitCommandOrThrow([\"remote\", \"add\", \"origin\", cloneUrl], cwd);\n await gitCommandOrThrow([\"push\", \"-u\", \"origin\", branch], cwd);\n}\n\n/**\n * Commit all changes and push. Throws `GitCommandError` on failure.\n */\nexport async function gitCommitAndPush(\n cwd: string,\n message: string,\n branch: string = \"main\"\n): Promise<void> {\n await gitCommandOrThrow([\"add\", \".\"], cwd);\n await gitCommandOrThrow([\"commit\", \"-m\", message], cwd);\n await gitCommandOrThrow([\"push\", \"origin\", branch], cwd);\n}\n\n/**\n * Check if remote is a GitHub URL\n */\nexport function isGitHubUrl(url: string): boolean {\n try {\n // Handle HTTP(S) URLs\n const parsedUrl = new URL(url);\n return (\n parsedUrl.hostname === \"github.com\" ||\n parsedUrl.hostname === \"www.github.com\"\n );\n } catch {\n // Handle SSH/shortened git URLs: git@github.com:user/repo.git\n // Extract the host before the \":\" or \"/\" (if git@host:repo or git@host/repo)\n const sshMatch = url.match(/^git@([^:/]+)[:/]/);\n if (sshMatch) {\n const host = sshMatch[1];\n return host === \"github.com\" || host === \"www.github.com\";\n }\n }\n return false;\n}\n","import type { Deployment } from \"./api.js\";\n\nconst GATEWAY_DOMAIN = \"run.mcp-use.com\";\n\nfunction buildGatewayUrl(slugOrId: string): string {\n return `https://${slugOrId}.${GATEWAY_DOMAIN}/mcp`;\n}\n\n/** MCP URL for a deployment: explicit `mcpUrl`, else gateway URL from `serverId`. */\nexport function getMcpServerUrl(deployment: Deployment): string {\n if (deployment.mcpUrl) return deployment.mcpUrl;\n if (deployment.serverId) return buildGatewayUrl(deployment.serverId);\n return \"\";\n}\n\n/**\n * MCP URL for a cloud server row/detail: use API `mcpUrl` when set; otherwise\n * gateway host uses **slug** when present (matches production hostnames), else `id`.\n */\nexport function getMcpServerUrlForCloudServer(server: {\n mcpUrl?: string | null;\n slug?: string | null;\n id: string;\n}): string {\n if (server.mcpUrl) return server.mcpUrl;\n const hostKey = (server.slug && server.slug.trim()) || server.id;\n return buildGatewayUrl(hostKey);\n}\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nconst MCP_USE_DIR = \".mcp-use\";\nconst MCP_USE_DIR_PROJECT = \"project.json\";\n\ninterface ProjectLink {\n deploymentId: string;\n deploymentName: string;\n deploymentUrl?: string;\n linkedAt: string;\n serverId?: string;\n}\n\n// Get .mcp-use directory path\nfunction getMcpUseDirectory(cwd: string): string {\n return path.join(cwd, MCP_USE_DIR);\n}\n\n// Read project link\nexport async function getProjectLink(cwd: string): Promise<ProjectLink | null> {\n try {\n const linkPath = path.join(getMcpUseDirectory(cwd), MCP_USE_DIR_PROJECT);\n const content = await fs.readFile(linkPath, \"utf-8\");\n return JSON.parse(content);\n } catch (err: any) {\n if (err.code === \"ENOENT\") return null;\n throw err;\n }\n}\n\n// Write project link\nexport async function saveProjectLink(\n cwd: string,\n link: ProjectLink\n): Promise<void> {\n const mcpUseDir = getMcpUseDirectory(cwd);\n await fs.mkdir(mcpUseDir, { recursive: true });\n\n const linkPath = path.join(mcpUseDir, MCP_USE_DIR_PROJECT);\n await fs.writeFile(linkPath, JSON.stringify(link, null, 2), \"utf-8\");\n\n // Add to .gitignore\n await addToGitIgnore(cwd);\n}\n\n// Add .mcp-use to .gitignore\nasync function addToGitIgnore(cwd: string): Promise<void> {\n const gitignorePath = path.join(cwd, \".gitignore\");\n try {\n let content = \"\";\n try {\n content = await fs.readFile(gitignorePath, \"utf-8\");\n } catch (err: any) {\n if (err.code !== \"ENOENT\") throw err;\n }\n\n if (!content.includes(MCP_USE_DIR)) {\n const newContent =\n content +\n (content.endsWith(\"\\n\") ? \"\" : \"\\n\") +\n `\\n# mcp-use deployment\\n${MCP_USE_DIR}\\n`;\n await fs.writeFile(gitignorePath, newContent, \"utf-8\");\n }\n } catch (err) {\n // Ignore gitignore errors\n }\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { McpUseAPI } from \"../utils/api.js\";\nimport { getMcpServerUrl } from \"../utils/cloud-urls.js\";\nimport { isLoggedIn } from \"../utils/config.js\";\nimport { handleCommandError } from \"../utils/errors.js\";\nimport { formatRelativeTime } from \"../utils/format.js\";\n\nasync function prompt(question: string): Promise<boolean> {\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n const trimmedAnswer = answer.trim().toLowerCase();\n resolve(trimmedAnswer === \"y\" || trimmedAnswer === \"yes\");\n });\n });\n}\n\nfunction getStatusColor(status: string): (text: string) => string {\n switch (status) {\n case \"running\":\n return chalk.green;\n case \"building\":\n case \"pending\":\n return chalk.yellow;\n case \"failed\":\n case \"stopped\":\n return chalk.red;\n default:\n return chalk.gray;\n }\n}\n\nfunction formatId(id: string): string {\n return id;\n}\n\nasync function listDeploymentsCommand(): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n const [deployments, authResult] = await Promise.all([\n api.listDeployments(),\n api.testAuth(),\n ]);\n\n const orgMap = new Map(authResult.orgs.map((o) => [o.id, o.name]));\n\n const uniqueServerIds = [\n ...new Set(\n deployments\n .map((d) => d.serverId)\n .filter((id): id is string => id != null)\n ),\n ];\n\n const serverResults = await Promise.allSettled(\n uniqueServerIds.map((id) => api.getServer(id))\n );\n\n const serverOrgMap = new Map<string, string>();\n for (let i = 0; i < uniqueServerIds.length; i++) {\n const result = serverResults[i];\n if (result.status === \"fulfilled\") {\n const orgName =\n orgMap.get(result.value.organizationId) ??\n result.value.organizationId.substring(0, 19);\n serverOrgMap.set(uniqueServerIds[i], orgName);\n }\n }\n\n const sortedDeployments = [...deployments].sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()\n );\n\n if (sortedDeployments.length === 0) {\n console.log(chalk.yellow(\"No deployments found.\"));\n console.log(\n chalk.gray(\n \"\\nDeploy your first MCP server with \" + chalk.white(\"mcp-use deploy\")\n )\n );\n return;\n }\n\n console.log(\n chalk.cyan.bold(`\\n📦 Deployments (${sortedDeployments.length})\\n`)\n );\n\n console.log(\n chalk.white.bold(\n `${\"ID\".padEnd(40)} ${\"NAME\".padEnd(25)} ${\"ORG\".padEnd(20)} ${\"STATUS\".padEnd(12)} ${\"MCP URL\".padEnd(45)} ${\"CREATED\"}`\n )\n );\n console.log(chalk.gray(\"─\".repeat(155)));\n\n for (const deployment of sortedDeployments) {\n const id = formatId(deployment.id).padEnd(40);\n const name = deployment.name.substring(0, 24).padEnd(25);\n const orgName = deployment.serverId\n ? (serverOrgMap.get(deployment.serverId) ?? \"-\")\n : \"-\";\n const org = orgName.substring(0, 19).padEnd(20);\n const statusColor = getStatusColor(deployment.status);\n const status = statusColor(deployment.status.padEnd(12));\n const mcpUrl = (deployment.mcpUrl || \"-\").substring(0, 44).padEnd(45);\n const created = formatRelativeTime(deployment.createdAt);\n\n console.log(\n `${chalk.gray(id)} ${name} ${chalk.magenta(org)} ${status} ${chalk.cyan(mcpUrl)} ${chalk.gray(created)}`\n );\n }\n\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to list deployments\");\n }\n}\n\nasync function getDeploymentCommand(deploymentId: string): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n const deployment = await api.getDeployment(deploymentId);\n\n console.log(chalk.cyan.bold(\"\\n📦 Deployment Details\\n\"));\n\n console.log(chalk.white(\"ID: \") + chalk.gray(deployment.id));\n console.log(chalk.white(\"Name: \") + chalk.cyan(deployment.name));\n\n const statusColor = getStatusColor(deployment.status);\n console.log(\n chalk.white(\"Status: \") + statusColor(deployment.status)\n );\n\n if (deployment.serverId) {\n console.log(\n chalk.white(\"Server ID: \") + chalk.gray(deployment.serverId)\n );\n }\n\n const mcpUrl = getMcpServerUrl(deployment);\n if (mcpUrl) {\n console.log(chalk.white(\"MCP URL: \") + chalk.cyan(mcpUrl));\n }\n\n if (deployment.gitBranch) {\n console.log(\n chalk.white(\"Branch: \") + chalk.gray(deployment.gitBranch)\n );\n }\n if (deployment.gitCommitSha) {\n console.log(\n chalk.white(\"Commit: \") +\n chalk.gray(deployment.gitCommitSha.substring(0, 7))\n );\n }\n\n if (deployment.port) {\n console.log(chalk.white(\"Port: \") + chalk.gray(deployment.port));\n }\n\n if (deployment.provider) {\n console.log(\n chalk.white(\"Provider: \") + chalk.gray(deployment.provider)\n );\n }\n\n console.log(\n chalk.white(\"Created: \") +\n chalk.gray(formatRelativeTime(deployment.createdAt))\n );\n console.log(\n chalk.white(\"Updated: \") +\n chalk.gray(formatRelativeTime(deployment.updatedAt))\n );\n\n if (deployment.status === \"failed\" && deployment.error) {\n console.log(chalk.red(\"\\nError:\"));\n console.log(chalk.red(` ${deployment.error}`));\n }\n\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to get deployment\");\n }\n}\n\nasync function restartDeploymentCommand(\n deploymentId: string,\n options: { follow?: boolean }\n): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n const deployment = await api.getDeployment(deploymentId);\n\n if (!deployment.serverId) {\n console.log(\n chalk.red(\"✗ Cannot restart: deployment has no linked server.\")\n );\n process.exit(1);\n }\n\n console.log(\n chalk.cyan.bold(`\\n🔄 Restarting deployment: ${deployment.name}\\n`)\n );\n\n const newDep = await api.createDeployment({\n serverId: deployment.serverId,\n trigger: \"redeploy\",\n });\n\n console.log(chalk.green(\"✓ Restart initiated: \") + chalk.gray(newDep.id));\n\n if (options.follow) {\n console.log(chalk.gray(\"\\nFollowing build logs...\\n\"));\n\n let offset = 0;\n let terminal = false;\n while (!terminal) {\n await new Promise((r) => setTimeout(r, 2000));\n try {\n const resp = await api.getDeploymentBuildLogs(newDep.id, offset);\n if (resp.logs.length > 0) {\n const lines = resp.logs.split(\"\\n\").filter((l) => l.trim());\n for (const line of lines) {\n try {\n const logData = JSON.parse(line);\n if (logData.line) {\n const levelColor =\n logData.level === \"error\"\n ? chalk.red\n : logData.level === \"warn\"\n ? chalk.yellow\n : chalk.gray;\n const stepPrefix = logData.step\n ? chalk.cyan(`[${logData.step}]`) + \" \"\n : \"\";\n console.log(stepPrefix + levelColor(logData.line));\n }\n } catch {\n console.log(chalk.gray(line));\n }\n }\n offset = resp.offset;\n }\n if (\n resp.status === \"running\" ||\n resp.status === \"failed\" ||\n resp.status === \"stopped\"\n ) {\n terminal = true;\n }\n } catch {\n // Build logs not ready yet\n }\n }\n } else {\n console.log(\n chalk.gray(\n \"\\nCheck status with: \" +\n chalk.white(`mcp-use deployments get ${newDep.id}`)\n )\n );\n }\n\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to restart deployment\");\n }\n}\n\nasync function deleteDeploymentCommand(\n deploymentId: string,\n options: { yes?: boolean }\n): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n const deployment = await api.getDeployment(deploymentId);\n\n if (!options.yes) {\n console.log(\n chalk.yellow(\n `\\n⚠️ You are about to delete deployment: ${chalk.white(deployment.name)}`\n )\n );\n console.log(chalk.gray(` ID: ${deployment.id}`));\n if (deployment.mcpUrl) {\n console.log(chalk.gray(` URL: ${deployment.mcpUrl}\\n`));\n }\n\n const confirmed = await prompt(\n chalk.white(\"Are you sure you want to delete this deployment? (y/N): \")\n );\n\n if (!confirmed) {\n console.log(chalk.gray(\"Deletion cancelled.\"));\n return;\n }\n }\n\n await api.deleteDeployment(deploymentId);\n console.log(\n chalk.green.bold(`\\n✓ Deployment deleted: ${deployment.name}\\n`)\n );\n } catch (error) {\n handleCommandError(error, \"Failed to delete deployment\");\n }\n}\n\nasync function logsCommand(\n deploymentId: string,\n options: { build?: boolean; follow?: boolean }\n): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n\n if (options.follow) {\n console.log(chalk.gray(\"Following build logs...\\n\"));\n\n let offset = 0;\n let terminal = false;\n while (!terminal) {\n await new Promise((r) => setTimeout(r, 2000));\n try {\n const resp = await api.getDeploymentBuildLogs(deploymentId, offset);\n if (resp.logs.length > 0) {\n const lines = resp.logs.split(\"\\n\").filter((l) => l.trim());\n for (const line of lines) {\n try {\n const logData = JSON.parse(line);\n if (logData.line) {\n const levelColor =\n logData.level === \"error\"\n ? chalk.red\n : logData.level === \"warn\"\n ? chalk.yellow\n : chalk.gray;\n const stepPrefix = logData.step\n ? chalk.cyan(`[${logData.step}]`) + \" \"\n : \"\";\n console.log(stepPrefix + levelColor(logData.line));\n }\n } catch {\n console.log(chalk.gray(line));\n }\n }\n offset = resp.offset;\n }\n if (\n resp.status === \"running\" ||\n resp.status === \"failed\" ||\n resp.status === \"stopped\"\n ) {\n terminal = true;\n }\n } catch {\n // Build logs not ready yet\n }\n }\n } else if (options.build) {\n const resp = await api.getDeploymentBuildLogs(deploymentId);\n const logs = resp.logs;\n\n if (!logs || logs.trim() === \"\") {\n console.log(\n chalk.yellow(\"No build logs available for this deployment.\")\n );\n return;\n }\n\n const logLines = logs.split(\"\\n\").filter((l) => l.trim());\n for (const line of logLines) {\n try {\n const logData = JSON.parse(line);\n if (logData.line) {\n const levelColor =\n logData.level === \"error\"\n ? chalk.red\n : logData.level === \"warn\"\n ? chalk.yellow\n : chalk.gray;\n const stepPrefix = logData.step\n ? chalk.cyan(`[${logData.step}]`) + \" \"\n : \"\";\n console.log(stepPrefix + levelColor(logData.line));\n }\n } catch {\n console.log(chalk.gray(line));\n }\n }\n } else {\n const logs = await api.getDeploymentLogs(deploymentId);\n\n if (!logs || logs.trim() === \"\") {\n console.log(chalk.yellow(\"No logs available for this deployment.\"));\n return;\n }\n\n const logLines = logs.split(\"\\n\").filter((l) => l.trim());\n for (const line of logLines) {\n try {\n const logData = JSON.parse(line);\n if (logData.line) {\n const levelColor =\n logData.level === \"error\"\n ? chalk.red\n : logData.level === \"warn\"\n ? chalk.yellow\n : chalk.gray;\n const stepPrefix = logData.step\n ? chalk.cyan(`[${logData.step}]`) + \" \"\n : \"\";\n console.log(stepPrefix + levelColor(logData.line));\n }\n } catch {\n console.log(chalk.gray(line));\n }\n }\n }\n\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to get logs\");\n }\n}\n\nasync function stopDeploymentCommand(deploymentId: string): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n await api.stopDeployment(deploymentId);\n\n console.log(chalk.green.bold(`\\n✓ Deployment stopped\\n`));\n } catch (error) {\n handleCommandError(error, \"Failed to stop deployment\");\n }\n}\n\nasync function startDeploymentCommand(deploymentId: string): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n console.log(\n chalk.yellow(\n \"⚠️ Start is not supported in this version. Use `mcp-use deployments restart` to redeploy.\"\n )\n );\n } catch (error) {\n handleCommandError(error, \"Failed to start deployment\");\n }\n}\n\nexport function createDeploymentsCommand(): Command {\n const deploymentsCommand = new Command(\"deployments\")\n .description(\"Manage cloud deployments\")\n .showHelpAfterError(\n \"(Run `mcp-use deployments --help` to see available commands)\"\n );\n\n deploymentsCommand\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List all deployments\")\n .action(listDeploymentsCommand);\n\n deploymentsCommand\n .command(\"get\")\n .argument(\"<deployment-id>\", \"Deployment ID\")\n .description(\"Get deployment details\")\n .action(getDeploymentCommand);\n\n deploymentsCommand\n .command(\"restart\")\n .argument(\"<deployment-id>\", \"Deployment ID\")\n .option(\"-f, --follow\", \"Follow build logs\")\n .description(\n \"Restart a deployment (triggers a new deployment on the same server)\"\n )\n .action(restartDeploymentCommand);\n\n deploymentsCommand\n .command(\"delete\")\n .alias(\"rm\")\n .argument(\"<deployment-id>\", \"Deployment ID\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .description(\"Delete a deployment\")\n .action(deleteDeploymentCommand);\n\n deploymentsCommand\n .command(\"logs\")\n .argument(\"<deployment-id>\", \"Deployment ID\")\n .option(\"-b, --build\", \"Show build logs instead of runtime logs\")\n .option(\"-f, --follow\", \"Follow build logs in real-time\")\n .description(\"View deployment logs\")\n .action(logsCommand);\n\n deploymentsCommand\n .command(\"stop\")\n .argument(\"<deployment-id>\", \"Deployment ID\")\n .description(\"Stop a deployment\")\n .action(stopDeploymentCommand);\n\n deploymentsCommand\n .command(\"start\")\n .argument(\"<deployment-id>\", \"Deployment ID\")\n .description(\"Start a stopped deployment\")\n .action(startDeploymentCommand);\n\n return deploymentsCommand;\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { McpUseAPI } from \"../utils/api.js\";\nimport { getMcpServerUrlForCloudServer } from \"../utils/cloud-urls.js\";\nimport { getWebUrl, isLoggedIn, readConfig } from \"../utils/config.js\";\nimport { handleCommandError } from \"../utils/errors.js\";\nimport { formatRelativeTime } from \"../utils/format.js\";\nimport { resolveOrgFromOption } from \"./auth.js\";\nimport { createEnvCommand } from \"./env.js\";\n\nasync function prompt(question: string): Promise<boolean> {\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n const trimmedAnswer = answer.trim().toLowerCase();\n resolve(trimmedAnswer === \"y\" || trimmedAnswer === \"yes\");\n });\n });\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null;\n}\n\nfunction pickStr(obj: unknown, key: string): string {\n if (!isRecord(obj)) return \"-\";\n const v = obj[key];\n if (typeof v === \"string\") return v;\n if (v != null && typeof v !== \"object\") return String(v);\n return \"-\";\n}\n\nasync function applyOrgOption(api: McpUseAPI, org?: string): Promise<void> {\n if (!org) return;\n const authInfo = await api.testAuth();\n const match = resolveOrgFromOption(authInfo.orgs ?? [], org);\n if (!match) {\n console.error(\n chalk.red(\n `✗ Organization \"${org}\" not found. Run ${chalk.white(\"npx mcp-use org list\")} to see available organizations.`\n )\n );\n process.exit(1);\n }\n api.setOrgId(match.id);\n const slug = match.slug ? chalk.gray(` (${match.slug})`) : \"\";\n console.log(chalk.gray(\"Organization: \") + chalk.cyan(match.name) + slug);\n}\n\nfunction getStatusColor(status: string): (text: string) => string {\n const s = status.toLowerCase();\n if (s.includes(\"run\") || s === \"active\") return chalk.green;\n if (s.includes(\"fail\") || s.includes(\"error\")) return chalk.red;\n if (s.includes(\"build\") || s.includes(\"pend\")) return chalk.yellow;\n return chalk.gray;\n}\n\nasync function listServersCommand(options: {\n org?: string;\n limit?: string;\n skip?: string;\n sort?: string;\n}): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n await applyOrgOption(api, options.org);\n if (options.org) console.log();\n\n const limit = options.limit ? parseInt(options.limit, 10) : undefined;\n const skip = options.skip ? parseInt(options.skip, 10) : undefined;\n if (limit !== undefined && (Number.isNaN(limit) || limit < 1)) {\n console.log(chalk.red(\"✗ Invalid --limit\"));\n process.exit(1);\n }\n if (skip !== undefined && (Number.isNaN(skip) || skip < 0)) {\n console.log(chalk.red(\"✗ Invalid --skip\"));\n process.exit(1);\n }\n\n const servers = await api.listServers({\n limit,\n skip,\n sort: options.sort,\n });\n\n if (servers.length === 0) {\n console.log(chalk.yellow(\"No servers found.\"));\n console.log(\n chalk.gray(\n \"\\nCreate one by deploying with \" + chalk.white(\"mcp-use deploy\")\n )\n );\n return;\n }\n\n console.log(chalk.cyan.bold(`\\n🖥 Servers (${servers.length})\\n`));\n\n console.log(\n chalk.white.bold(\n `${\"ID\".padEnd(38)} ${\"NAME\".padEnd(22)} ${\"STATUS\".padEnd(14)} ${\"REPO\".padEnd(32)} ${\"MCP URL\".padEnd(52)}`\n )\n );\n console.log(chalk.gray(\"─\".repeat(165)));\n\n for (const s of servers) {\n const id = s.id.substring(0, 37).padEnd(38);\n const name = (s.name || s.slug || \"-\").substring(0, 21).padEnd(22);\n const statusColor = getStatusColor(s.status);\n const status = statusColor(s.status.substring(0, 13).padEnd(14));\n const repo = (s.connectedRepository?.repoFullName ?? \"-\")\n .substring(0, 31)\n .padEnd(32);\n const mcp = getMcpServerUrlForCloudServer(s).substring(0, 51).padEnd(52);\n console.log(\n `${chalk.gray(id)} ${name} ${status} ${chalk.gray(repo)} ${chalk.cyan(mcp)}`\n );\n }\n\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to list servers\");\n }\n}\n\nasync function getServerCommand(idOrSlug: string, options: { org?: string }) {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n await applyOrgOption(api, options.org);\n if (options.org) console.log();\n\n const server = await api.getServer(idOrSlug);\n\n console.log(chalk.cyan.bold(\"\\n🖥 Server Details\\n\"));\n\n console.log(chalk.white(\"ID: \") + chalk.gray(server.id));\n if (server.slug) {\n console.log(chalk.white(\"Slug: \") + chalk.cyan(server.slug));\n }\n console.log(\n chalk.white(\"Name: \") + chalk.cyan(server.name ?? \"-\")\n );\n const statusColor = getStatusColor(server.status);\n console.log(chalk.white(\"Status: \") + statusColor(server.status));\n if (server.latestDeploymentStatus) {\n console.log(\n chalk.white(\"Last deploy: \") +\n chalk.gray(server.latestDeploymentStatus)\n );\n }\n console.log(chalk.white(\"Region: \") + chalk.gray(server.region));\n console.log(\n chalk.white(\"MCP URL: \") +\n chalk.cyan(getMcpServerUrlForCloudServer(server))\n );\n\n if (server.connectedRepository) {\n const cr = server.connectedRepository;\n console.log(chalk.white(\"\\nRepository\"));\n console.log(chalk.white(\" Full name: \") + chalk.gray(cr.repoFullName));\n console.log(\n chalk.white(\" Prod branch: \") + chalk.gray(cr.productionBranch)\n );\n }\n\n if (server.activeDeploymentId) {\n console.log(\n chalk.white(\"\\nActive deployment: \") +\n chalk.cyan(server.activeDeploymentId)\n );\n }\n if (server.previousDeploymentId) {\n console.log(\n chalk.white(\"Previous deployment: \") +\n chalk.gray(server.previousDeploymentId)\n );\n }\n\n const depCount = server._count?.deployments;\n if (depCount != null) {\n console.log(\n chalk.white(\"Deployment count: \") + chalk.gray(String(depCount))\n );\n }\n\n console.log(\n chalk.white(\"Created: \") +\n chalk.gray(formatRelativeTime(server.createdAt))\n );\n console.log(\n chalk.white(\"Updated: \") +\n chalk.gray(formatRelativeTime(server.updatedAt))\n );\n\n const config = await readConfig();\n const base = (await getWebUrl()).replace(/\\/$/, \"\");\n if (config.orgSlug) {\n console.log(\n chalk.white(\"\\nDashboard: \") +\n chalk.cyan(`${base}/cloud/${config.orgSlug}/servers/${server.id}`)\n );\n } else {\n console.log(\n chalk.white(\"\\nDashboard: \") +\n chalk.cyan(`${base}/cloud/servers/${server.id}`)\n );\n }\n\n if (Array.isArray(server.deployments) && server.deployments.length > 0) {\n console.log(chalk.cyan.bold(\"\\nRecent deployments\\n\"));\n console.log(\n chalk.white.bold(\n `${\"ID\".padEnd(40)} ${\"NAME\".padEnd(24)} ${\"STATUS\".padEnd(12)} ${\"UPDATED\"}`\n )\n );\n console.log(chalk.gray(\"─\".repeat(100)));\n for (const d of server.deployments) {\n const did = pickStr(d, \"id\").padEnd(40);\n const dname = pickStr(d, \"name\").substring(0, 23).padEnd(24);\n const dst = pickStr(d, \"status\").padEnd(12);\n const du = pickStr(d, \"updatedAt\");\n const updated = du !== \"-\" ? formatRelativeTime(du) : chalk.gray(\"-\");\n const sc = getStatusColor(dst.trim());\n console.log(\n `${chalk.gray(did)} ${dname} ${sc(dst)} ${chalk.gray(updated)}`\n );\n }\n }\n\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to get server\");\n }\n}\n\nasync function deleteServerCommand(\n serverId: string,\n options: { yes?: boolean; org?: string }\n): Promise<void> {\n try {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\n \"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\"\n )\n );\n process.exit(1);\n }\n\n const api = await McpUseAPI.create();\n await applyOrgOption(api, options.org);\n if (options.org) console.log();\n\n const server = await api.getServer(serverId);\n\n if (!options.yes) {\n console.log(\n chalk.yellow(\n `\\n⚠️ You are about to delete server: ${chalk.white(server.name || server.slug || server.id)}`\n )\n );\n console.log(chalk.gray(` ID: ${server.id}`));\n if (server.connectedRepository?.repoFullName) {\n console.log(\n chalk.gray(` Repo: ${server.connectedRepository.repoFullName}\\n`)\n );\n } else {\n console.log();\n }\n\n const confirmed = await prompt(\n chalk.white(\n \"This deletes the server and all its deployments. Continue? (y/N): \"\n )\n );\n\n if (!confirmed) {\n console.log(chalk.gray(\"Deletion cancelled.\"));\n return;\n }\n }\n\n await api.deleteServer(server.id);\n console.log(\n chalk.green.bold(\n `\\n✓ Server deleted: ${server.name || server.slug || server.id}\\n`\n )\n );\n } catch (error) {\n handleCommandError(error, \"Failed to delete server\");\n }\n}\n\nexport function createServersCommand(): Command {\n const serversCommand = new Command(\"servers\")\n .description(\"Manage cloud servers (Git-backed deploy targets)\")\n .showHelpAfterError(\n \"(Run `mcp-use servers --help` to see available commands)\"\n );\n\n serversCommand\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List servers for the current organization\")\n .option(\"--org <slug-or-id>\", \"Target organization (slug, id, or name)\")\n .option(\"--limit <n>\", \"Page size (1–100, default 50)\")\n .option(\"--skip <n>\", \"Offset for pagination\")\n .option(\"--sort <field:asc|desc>\", \"Sort (e.g. updatedAt:desc)\")\n .action(listServersCommand);\n\n serversCommand\n .command(\"get\")\n .argument(\"<id-or-slug>\", \"Server UUID or slug\")\n .option(\"--org <slug-or-id>\", \"Resolve org context before fetch\")\n .description(\"Show server details and recent deployments\")\n .action(getServerCommand);\n\n serversCommand\n .command(\"delete\")\n .alias(\"rm\")\n .argument(\"<server-id>\", \"Server UUID (or slug if API accepts it)\")\n .option(\"-y, --yes\", \"Skip confirmation prompt\")\n .option(\"--org <slug-or-id>\", \"Target organization\")\n .description(\"Delete a server and all its deployments\")\n .action(deleteServerCommand);\n\n serversCommand.addCommand(createEnvCommand());\n\n return serversCommand;\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport type { EnvEnvironment, EnvVariable } from \"../utils/api.js\";\nimport { McpUseAPI } from \"../utils/api.js\";\nimport { isLoggedIn } from \"../utils/config.js\";\nimport { handleCommandError } from \"../utils/errors.js\";\n\nconst ALL_ENVS: EnvEnvironment[] = [\"production\", \"preview\", \"development\"];\n\nfunction parseEnvironments(raw: string): EnvEnvironment[] {\n const parts = raw\n .split(\",\")\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean);\n\n const valid: EnvEnvironment[] = [];\n for (const p of parts) {\n if (p === \"production\" || p === \"preview\" || p === \"development\") {\n valid.push(p);\n } else {\n console.error(\n chalk.red(\n `✗ Unknown environment \"${p}\". Valid values: production, preview, development`\n )\n );\n process.exit(1);\n }\n }\n\n if (valid.length === 0) {\n console.error(chalk.red(\"✗ At least one environment must be specified.\"));\n process.exit(1);\n }\n\n return valid;\n}\n\nfunction envBadge(env: EnvEnvironment): string {\n if (env === \"production\") return chalk.green(\"prod\");\n if (env === \"preview\") return chalk.yellow(\"prev\");\n return chalk.blue(\"dev\");\n}\n\nfunction printEnvVar(v: EnvVariable, showValue = false): void {\n const envs = v.environments.map(envBadge).join(\" \");\n const val = v.sensitive\n ? chalk.gray(\"<sensitive>\")\n : showValue\n ? chalk.cyan(v.value)\n : chalk.gray(\"(hidden — use --show-values to reveal)\");\n console.log(` ${chalk.white.bold(v.key.padEnd(32))} ${val}`);\n console.log(\n ` ${chalk.gray(\"id:\")} ${chalk.gray(v.id)} ${envs}${v.sensitive ? \" \" + chalk.yellow(\"🔒 sensitive\") : \"\"}`\n );\n}\n\nasync function requireLogin(): Promise<void> {\n if (!(await isLoggedIn())) {\n console.log(chalk.red(\"✗ You are not logged in.\"));\n console.log(\n chalk.gray(\"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\")\n );\n process.exit(1);\n }\n}\n\nasync function listEnvCommand(options: {\n server: string;\n showValues?: boolean;\n}): Promise<void> {\n try {\n await requireLogin();\n\n const api = await McpUseAPI.create();\n const vars = await api.listEnvVariables(options.server);\n\n if (vars.length === 0) {\n console.log(\n chalk.yellow(\"\\nNo environment variables set for this server.\\n\")\n );\n return;\n }\n\n console.log(chalk.cyan.bold(`\\nEnvironment Variables (${vars.length})\\n`));\n for (const v of vars) {\n printEnvVar(v, options.showValues);\n console.log();\n }\n } catch (error) {\n handleCommandError(error, \"Failed to list environment variables\");\n }\n}\n\nasync function addEnvCommand(\n assignment: string,\n options: { server: string; env?: string; sensitive?: boolean }\n): Promise<void> {\n try {\n await requireLogin();\n\n const eqIdx = assignment.indexOf(\"=\");\n if (eqIdx === -1) {\n console.error(\n chalk.red(\n \"✗ Expected KEY=VALUE format, e.g. mcp-use servers env add API_KEY=abc123\"\n )\n );\n process.exit(1);\n }\n\n const key = assignment.substring(0, eqIdx).trim();\n const value = assignment.substring(eqIdx + 1);\n\n if (!key) {\n console.error(chalk.red(\"✗ Key must not be empty.\"));\n process.exit(1);\n }\n\n const environments = options.env\n ? parseEnvironments(options.env)\n : ALL_ENVS;\n\n const api = await McpUseAPI.create();\n const created = await api.createEnvVariable(options.server, {\n key,\n value,\n environments,\n sensitive: options.sensitive ?? false,\n });\n\n console.log(\n chalk.green(`\\n✓ Environment variable \"${created.key}\" added.\\n`)\n );\n printEnvVar(created, true);\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to add environment variable\");\n }\n}\n\nasync function updateEnvCommand(\n varId: string,\n options: { server: string; value?: string; env?: string; sensitive?: boolean }\n): Promise<void> {\n try {\n await requireLogin();\n\n if (!options.value && !options.env && options.sensitive === undefined) {\n console.error(\n chalk.red(\n \"✗ Nothing to update. Provide at least one of --value, --env, --sensitive.\"\n )\n );\n process.exit(1);\n }\n\n const body: {\n value?: string;\n environments?: EnvEnvironment[];\n sensitive?: boolean;\n } = {};\n if (options.value !== undefined) body.value = options.value;\n if (options.env) body.environments = parseEnvironments(options.env);\n if (options.sensitive !== undefined) body.sensitive = options.sensitive;\n\n const api = await McpUseAPI.create();\n const updated = await api.updateEnvVariable(options.server, varId, body);\n\n console.log(\n chalk.green(`\\n✓ Environment variable \"${updated.key}\" updated.\\n`)\n );\n printEnvVar(updated, !!options.value);\n console.log();\n } catch (error) {\n handleCommandError(error, \"Failed to update environment variable\");\n }\n}\n\nasync function removeEnvCommand(\n varId: string,\n options: { server: string }\n): Promise<void> {\n try {\n await requireLogin();\n\n const api = await McpUseAPI.create();\n await api.deleteEnvVariable(options.server, varId);\n\n console.log(chalk.green(`\\n✓ Environment variable ${varId} removed.\\n`));\n } catch (error) {\n handleCommandError(error, \"Failed to remove environment variable\");\n }\n}\n\nexport function createEnvCommand(): Command {\n const envCommand = new Command(\"env\")\n .description(\"Manage environment variables for a server\")\n .showHelpAfterError(\"(Run `mcp-use env --help` to see available commands)\");\n\n envCommand\n .command(\"list\")\n .alias(\"ls\")\n .description(\"List environment variables for a server\")\n .requiredOption(\"--server <id>\", \"Server UUID\")\n .option(\"--show-values\", \"Reveal non-sensitive values in output\")\n .action(listEnvCommand);\n\n envCommand\n .command(\"add\")\n .argument(\"<KEY=VALUE>\", \"Variable assignment, e.g. API_KEY=abc123\")\n .description(\"Add an environment variable to a server\")\n .requiredOption(\"--server <id>\", \"Server UUID\")\n .option(\n \"--env <environments>\",\n \"Comma-separated environments: production,preview,development (default: all)\"\n )\n .option(\n \"--sensitive\",\n \"Mark the variable as sensitive (value masked in UI)\"\n )\n .action(addEnvCommand);\n\n envCommand\n .command(\"update\")\n .argument(\"<var-id>\", \"Environment variable UUID\")\n .description(\"Update an existing environment variable\")\n .requiredOption(\"--server <id>\", \"Server UUID\")\n .option(\"--value <value>\", \"New value\")\n .option(\n \"--env <environments>\",\n \"New environments (comma-separated: production,preview,development)\"\n )\n .option(\"--sensitive\", \"Mark as sensitive\")\n .option(\"--no-sensitive\", \"Unmark as sensitive\")\n .action(updateEnvCommand);\n\n envCommand\n .command(\"remove\")\n .alias(\"rm\")\n .argument(\"<var-id>\", \"Environment variable UUID\")\n .description(\"Remove an environment variable from a server\")\n .requiredOption(\"--server <id>\", \"Server UUID\")\n .action(removeEnvCommand);\n\n return envCommand;\n}\n","import chalk from \"chalk\";\nimport { McpUseAPI } from \"../utils/api.js\";\nimport { isLoggedIn, readConfig, writeConfig } from \"../utils/config.js\";\nimport { handleCommandError } from \"../utils/errors.js\";\nimport { promptOrgSelection } from \"./auth.js\";\n\nasync function ensureLoggedIn(): Promise<boolean> {\n if (!(await isLoggedIn())) {\n console.log(chalk.yellow(\"⚠️ You are not logged in.\"));\n console.log(\n chalk.gray(\"Run \" + chalk.white(\"npx mcp-use login\") + \" to get started.\")\n );\n return false;\n }\n return true;\n}\n\n/**\n * List all organizations the user belongs to\n */\nexport async function orgListCommand(): Promise<void> {\n try {\n if (!(await ensureLoggedIn())) return;\n\n const api = await McpUseAPI.create();\n const authInfo = await api.testAuth();\n const config = await readConfig();\n\n const orgs = authInfo.orgs ?? [];\n const activeId = config.orgId || authInfo.default_org_id;\n\n if (orgs.length === 0) {\n console.log(chalk.yellow(\"No organizations found.\"));\n return;\n }\n\n console.log(chalk.cyan.bold(\"🏢 Your organizations:\\n\"));\n\n for (const o of orgs) {\n const isActive = o.id === activeId;\n const marker = isActive ? chalk.green(\" ← active\") : \"\";\n const slug = o.slug ? chalk.gray(` (${o.slug})`) : \"\";\n const role = chalk.gray(` [${o.role}]`);\n const name = isActive ? chalk.cyan.bold(o.name) : chalk.white(o.name);\n console.log(` ${name}${slug}${role}${marker}`);\n }\n\n if (orgs.length > 1) {\n console.log(\n chalk.gray(\"\\nSwitch with \" + chalk.white(\"npx mcp-use org switch\"))\n );\n }\n } catch (error) {\n handleCommandError(error, \"Failed to list organizations\");\n }\n}\n\n/**\n * Switch the active organization\n */\nexport async function orgSwitchCommand(): Promise<void> {\n try {\n if (!(await ensureLoggedIn())) return;\n\n const api = await McpUseAPI.create();\n const authInfo = await api.testAuth();\n const config = await readConfig();\n const orgs = authInfo.orgs ?? [];\n\n if (orgs.length === 0) {\n console.log(chalk.yellow(\"No organizations found.\"));\n return;\n }\n\n if (orgs.length === 1) {\n const o = orgs[0];\n const slug = o.slug ? chalk.gray(` (${o.slug})`) : \"\";\n console.log(\n chalk.yellow(\n `You only have one organization: ${chalk.cyan(o.name)}${slug}`\n )\n );\n return;\n }\n\n const activeId = config.orgId || authInfo.default_org_id;\n const selected = await promptOrgSelection(orgs, activeId);\n\n if (!selected) {\n console.log(chalk.yellow(\"No organization selected.\"));\n return;\n }\n\n await writeConfig({\n ...config,\n orgId: selected.id,\n orgName: selected.name,\n orgSlug: selected.slug ?? undefined,\n });\n\n try {\n await api.setDefaultOrg(selected.id);\n } catch {\n // Non-fatal: the local config is what matters for CLI operations\n }\n\n const slug = selected.slug ? chalk.gray(` (${selected.slug})`) : \"\";\n console.log(\n chalk.green.bold(\"\\n✓ Switched to \") +\n chalk.cyan.bold(selected.name) +\n slug\n );\n } catch (error) {\n handleCommandError(error, \"Failed to switch organization\");\n }\n}\n\n/**\n * Show the currently active organization\n */\nexport async function orgCurrentCommand(): Promise<void> {\n try {\n if (!(await ensureLoggedIn())) return;\n\n const config = await readConfig();\n\n if (!config.orgId) {\n console.log(\n chalk.yellow(\n \"No organization selected. Run \" +\n chalk.white(\"npx mcp-use org switch\") +\n \" to pick one.\"\n )\n );\n return;\n }\n\n const slug = config.orgSlug ? chalk.gray(` (${config.orgSlug})`) : \"\";\n console.log(\n chalk.cyan.bold(\"🏢 Active organization: \") +\n chalk.white(config.orgName || config.orgId) +\n slug\n );\n } catch (error) {\n handleCommandError(error, \"Failed to get organization\");\n }\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { cpSync, existsSync, mkdtempSync, readdirSync, rmSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { extract } from \"tar\";\n\nconst REPO_OWNER = \"mcp-use\";\nconst REPO_NAME = \"mcp-use\";\nconst REPO_BRANCH = \"main\";\n\nconst TELEMETRY_URL = \"https://add-skill.vercel.sh/t\";\nconst SOURCE_REPO = `${REPO_OWNER}/${REPO_NAME}`;\n\n// Telemetry data defined in https://github.com/vercel-labs/skills/blob/main/src/telemetry.ts\ninterface InstallTelemetryData {\n event: \"install\";\n source: string;\n skills: string;\n agents: string;\n global?: \"1\";\n skillFiles?: string;\n sourceType?: string;\n}\n\n/** Type-safe enum for IDE/agent presets */\ntype AgentPreset = \"cursor\" | \"claude-code\" | \"codex\";\n\nconst AGENT_PRESET_FOLDERS: Record<AgentPreset, string> = {\n cursor: \".cursor\",\n \"claude-code\": \".claude\",\n codex: \".agent\",\n};\n\nconst ALL_PRESETS: AgentPreset[] = [\"cursor\", \"claude-code\", \"codex\"];\n\n/**\n * Send telemetry event for vercel skills.sh.\n * Fire-and-forget -- never throws.\n */\nfunction sendInstallTelemetryEvent(agents: string, skills: string): void {\n const telemetryData: InstallTelemetryData = {\n event: \"install\",\n source: SOURCE_REPO,\n skills,\n agents,\n sourceType: \"github\",\n };\n try {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(telemetryData)) {\n if (value !== undefined && value !== null) {\n params.set(key, String(value));\n }\n }\n fetch(`${TELEMETRY_URL}?${params.toString()}`).catch(() => {});\n } catch {\n // Silently fail - telemetry should never break the CLI\n }\n}\n\n/**\n * Download and extract skills from the mcp-use GitHub repository\n * and install them into the project's agent preset directories\n * (.cursor/skills, .claude/skills, .agent/skills).\n */\nasync function addSkillsToProject(projectPath: string): Promise<void> {\n const tarballUrl = `https://codeload.github.com/${REPO_OWNER}/${REPO_NAME}/tar.gz/${REPO_BRANCH}`;\n const tempDir = mkdtempSync(join(tmpdir(), \"mcp-use-skills-\"));\n\n try {\n const response = await fetch(tarballUrl);\n if (!response.ok) {\n throw new Error(`Failed to download tarball: ${response.statusText}`);\n }\n\n await pipeline(\n Readable.fromWeb(response.body as any),\n extract({\n cwd: tempDir,\n filter: (path) => path.includes(\"/skills/\"),\n strip: 1,\n })\n );\n\n const skillsPath = join(tempDir, \"skills\");\n if (!existsSync(skillsPath)) {\n throw new Error(\"Skills folder not found in repository\");\n }\n\n for (const preset of ALL_PRESETS) {\n const folderName = AGENT_PRESET_FOLDERS[preset];\n const outputPath = join(projectPath, folderName, \"skills\");\n cpSync(skillsPath, outputPath, { recursive: true });\n }\n\n const skillNames = readdirSync(skillsPath, { withFileTypes: true })\n .filter((dirent) => dirent.isDirectory())\n .map((dirent) => dirent.name);\n\n sendInstallTelemetryEvent(ALL_PRESETS.join(\",\"), skillNames.join(\",\"));\n } finally {\n rmSync(tempDir, { recursive: true, force: true });\n }\n}\n\nexport function createSkillsCommand(): Command {\n const skills = new Command(\"skills\")\n .description(\"Manage mcp-use AI agent skills\")\n .showHelpAfterError(\n \"(Run `mcp-use skills --help` to see available commands)\"\n );\n\n const installAction = async (options: { path: string }) => {\n const projectPath = resolve(options.path);\n\n if (!existsSync(projectPath)) {\n console.error(chalk.red(`Directory not found: ${projectPath}`));\n process.exit(1);\n }\n\n console.log(chalk.cyan(\"📚 Installing mcp-use skills...\"));\n console.log(\n chalk.gray(\n \" Downloading from github.com/mcp-use/mcp-use → .cursor/skills, .claude/skills, .agent/skills\"\n )\n );\n\n try {\n await addSkillsToProject(projectPath);\n console.log(chalk.green(\"✅ Skills installed successfully!\"));\n } catch (error) {\n console.error(chalk.red(\"❌ Failed to install skills.\"));\n console.error(\n chalk.yellow(\n ` Error: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n console.error(\n chalk.yellow(\n \" You can also install manually: npx skills add mcp-use/mcp-use\"\n )\n );\n process.exit(1);\n }\n };\n\n const pathOption = [\n \"-p, --path <path>\",\n \"Path to project directory\",\n process.cwd(),\n ] as const;\n\n skills\n .command(\"add\")\n .description(\n \"Install mcp-use skills for AI agents (Cursor, Claude Code, Codex)\"\n )\n .option(...pathOption)\n .action(installAction);\n\n skills\n .command(\"install\")\n .description(\"Install mcp-use skills for AI agents (alias for 'add')\")\n .option(...pathOption)\n .action(installAction);\n\n return skills;\n}\n","/**\n * Next.js runtime-module shim wiring.\n *\n * When the CLI runs an MCP server that lives inside a Next.js app (the\n * `src/mcp/` drop-in layout), transitive imports from the user's tools\n * almost always pull in Next.js server-runtime modules:\n *\n * - `server-only` — throws on import outside an RSC\n * - `next/cache` — revalidatePath / unstable_cache\n * - `next/headers` — headers() / cookies()\n * - `next/navigation` — redirect() / notFound()\n * - `next/server` — NextResponse / NextRequest\n *\n * These are all meaningful only inside a Next.js request; outside of one\n * (i.e., in our MCP server process) they're either unusable or useless.\n * Rather than asking the developer to write shim files, the CLI detects\n * Next.js and installs an ESM loader hook that resolves these specifiers to\n * no-op / inert implementations.\n *\n * Detection: presence of `next` in the user's package.json dependencies or\n * devDependencies.\n *\n * Registration happens in two places:\n * 1. HMR dev mode — inline, via `module.register()` in the parent process\n * before `tsImport` is called.\n * 2. --no-hmr and build — via `NODE_OPTIONS=--import=<register.mjs>` on the\n * spawned tsx/esbuild process.\n */\n\nimport { existsSync, promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\n\n/**\n * Returns true when the project has `next` listed in package.json deps.\n *\n * Missing / unreadable package.json returns false silently — the shims are\n * strictly additive, so \"can't decide\" should mean \"don't shim\".\n */\nexport async function detectNextJsProject(\n projectPath: string\n): Promise<boolean> {\n try {\n const pkgPath = path.join(projectPath, \"package.json\");\n const content = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content);\n const deps = pkg.dependencies ?? {};\n const devDeps = pkg.devDependencies ?? {};\n return \"next\" in deps || \"next\" in devDeps;\n } catch {\n return false;\n }\n}\n\n/**\n * Load Next.js's environment-file cascade into `process.env`.\n *\n * Next.js's dev server reads env files in this priority order (highest\n * wins): `.env.development.local` → `.env.local` → `.env.development` →\n * `.env`. Tools imported from a Next.js app usually assume these variables\n * are populated, so the MCP CLI mirrors the same cascade when it runs\n * inside a Next.js project.\n *\n * The values we set here flow to the spawned tsx child through\n * `runCommand`'s `...process.env` merge.\n */\nexport async function loadNextJsEnvFiles(projectPath: string): Promise<void> {\n // Lowest priority first — later loads only fill in missing keys.\n const files = [\n \".env\",\n \".env.development\",\n \".env.local\",\n \".env.development.local\",\n ];\n\n // dotenv is already a dependency of the CLI.\n const dotenv = await import(\"dotenv\");\n for (const file of files) {\n const abs = path.join(projectPath, file);\n try {\n await fs.access(abs);\n } catch {\n continue;\n }\n // `override: true` because we process files in ascending priority order;\n // the more specific file should win over the less specific one.\n dotenv.config({ path: abs, override: true, quiet: true });\n }\n}\n\n/**\n * Dirname of this module at runtime, for both CJS and ESM builds.\n *\n * tsup emits a CJS build that defines `__dirname` natively, plus an ESM\n * build where we have to derive it. The `typeof` guard avoids a ReferenceError\n * when the CJS build is loaded, and the `import.meta.url` branch only\n * executes in the ESM build.\n */\nfunction getThisDir(): string {\n if (typeof __dirname === \"string\") return __dirname;\n const url: string = import.meta.url;\n return path.dirname(fileURLToPath(url));\n}\n\n/**\n * Resolve the absolute path to a shim file shipped with the CLI.\n *\n * Returns the first candidate that actually exists on disk. We search a few\n * locations to cover:\n * - tsup-built dist (`dist/shims/*.mjs` — copied via `publicDir`)\n * - running tests from the repo with TS source (`src/shims/*.mjs`)\n */\nfunction resolveShimPath(filename: string): string | undefined {\n const thisDir = getThisDir();\n const candidates = [\n // Production: `dist/` next to this module\n path.join(thisDir, \"shims\", filename),\n // Test / dev: one level up (e.g., from `dist/utils/` back to `src/shims/`)\n path.join(thisDir, \"..\", \"shims\", filename),\n path.join(thisDir, \"..\", \"..\", \"src\", \"shims\", filename),\n path.join(thisDir, \"..\", \"src\", \"shims\", filename),\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\n/** Absolute path to the `--import=<path>` ESM registration script. */\nfunction getShimRegisterPath(): string | undefined {\n return resolveShimPath(\"next-shims-register.mjs\");\n}\n\n/** Absolute path to the ESM loader module itself. */\nfunction getShimLoaderPath(): string | undefined {\n return resolveShimPath(\"next-shims-loader.mjs\");\n}\n\n/**\n * Absolute path to the CJS-side shim preload. Patches `Module._resolveFilename`\n * so CommonJS `require(\"server-only\")` etc. route to a no-op module instead of\n * throwing. tsx compiles TypeScript to CJS by default, so this covers the\n * path the ESM loader hook cannot reach.\n */\nfunction getShimCjsPreloadPath(): string | undefined {\n return resolveShimPath(\"next-shims-cjs.cjs\");\n}\n\n/**\n * Register the shim loader in the CURRENT Node.js process.\n *\n * Used by the HMR dev path, which imports the user's entry via\n * `tsx/esm/api.tsImport` in-process (no child process). We install both:\n *\n * - The ESM loader hook (handles `import ...` of shimmed specifiers)\n * - The CJS `Module._resolveFilename` patch (handles `require(...)`, which\n * tsx emits when transpiling TypeScript to CommonJS)\n *\n * Returns `true` if at least one half succeeded, `false` only when neither\n * shim file can be located (graceful degradation — dev still works, users\n * just see the raw Next.js error on `server-only` etc.).\n */\nexport async function registerNextShimsInProcess(): Promise<boolean> {\n let anyRegistered = false;\n\n // CJS side first — runs synchronously, patches Module._resolveFilename.\n const cjsPath = getShimCjsPreloadPath();\n if (cjsPath) {\n // createRequire handles .cjs loading from any module context.\n const { createRequire } = await import(\"node:module\");\n const req = createRequire(pathToFileURL(getThisDir() + path.sep).href);\n req(cjsPath);\n anyRegistered = true;\n }\n\n // ESM side — installs a loader hook via module.register.\n const loaderPath = getShimLoaderPath();\n if (loaderPath) {\n const { register } = await import(\"node:module\");\n const loaderUrl = pathToFileURL(loaderPath).href;\n register(loaderUrl, pathToFileURL(getThisDir() + path.sep).href);\n anyRegistered = true;\n }\n\n return anyRegistered;\n}\n\n/**\n * Build a child-process env that adds both the CJS preload (`-r ...`) and the\n * ESM registration (`--import=...`) to NODE_OPTIONS, preserving any value\n * the user already set.\n *\n * Both are needed because tsx loads user TypeScript as CJS by default (goes\n * through `Module._resolveFilename` — covered by `-r`) while some modules are\n * imported via ESM (covered by `--import=...`).\n *\n * If either shim file can't be found on disk, we degrade gracefully — the\n * dev loop still starts, we just don't shim that half.\n */\nexport function withNextShimsEnv(\n baseEnv: NodeJS.ProcessEnv\n): NodeJS.ProcessEnv {\n const additions: string[] = [];\n\n const cjsPath = getShimCjsPreloadPath();\n if (cjsPath) additions.push(`-r ${quoteNodeOption(cjsPath)}`);\n\n const registerPath = getShimRegisterPath();\n if (registerPath)\n additions.push(`--import=${pathToFileURL(registerPath).href}`);\n\n if (additions.length === 0) return baseEnv;\n\n const existing = baseEnv.NODE_OPTIONS ?? \"\";\n const prepended = additions.join(\" \");\n return {\n ...baseEnv,\n NODE_OPTIONS: existing ? `${prepended} ${existing}` : prepended,\n };\n}\n\n/**\n * Quote a path for use inside NODE_OPTIONS. Paths containing spaces need\n * surrounding double quotes; Node's NODE_OPTIONS parser understands them.\n * This is a minimal implementation — we never see quotes in resolved shim\n * paths, so escaping inner quotes isn't worth the complexity.\n */\nfunction quoteNodeOption(value: string): string {\n return /\\s/.test(value) ? `\"${value}\"` : value;\n}\n","import chalk from \"chalk\";\nimport { readFileSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst CACHE_DIR = path.join(os.homedir(), \".mcp-use\");\nconst CACHE_FILE = path.join(CACHE_DIR, \"update-check.json\");\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst FETCH_TIMEOUT_MS = 3000;\nconst PACKAGE_NAME = \"mcp-use\";\n\ninterface UpdateCache {\n lastChecked: string;\n latestVersion: string;\n}\n\n/**\n * Parse a semver string into numeric parts for comparison.\n * Returns null for any string that doesn't look like X.Y.Z.\n */\nfunction parseSemver(version: string): [number, number, number] | null {\n const match = version.match(/^(\\d+)\\.(\\d+)\\.(\\d+)/);\n if (!match) return null;\n return [\n parseInt(match[1], 10),\n parseInt(match[2], 10),\n parseInt(match[3], 10),\n ];\n}\n\n/** Returns true when `candidate` is strictly newer than `current`. */\nfunction isNewer(current: string, candidate: string): boolean {\n const a = parseSemver(current);\n const b = parseSemver(candidate);\n if (!a || !b) return false;\n for (let i = 0; i < 3; i++) {\n if (b[i] > a[i]) return true;\n if (b[i] < a[i]) return false;\n }\n return false;\n}\n\nasync function readCache(): Promise<UpdateCache | null> {\n try {\n const content = await readFile(CACHE_FILE, \"utf-8\");\n return JSON.parse(content) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nasync function writeCache(latestVersion: string): Promise<void> {\n try {\n await mkdir(CACHE_DIR, { recursive: true });\n const cache: UpdateCache = {\n lastChecked: new Date().toISOString(),\n latestVersion,\n };\n await writeFile(CACHE_FILE, JSON.stringify(cache, null, 2), \"utf-8\");\n } catch {\n // Non-fatal — ignore write errors\n }\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(\n `https://registry.npmjs.org/${PACKAGE_NAME}/latest`,\n {\n signal: controller.signal,\n headers: { Accept: \"application/json\" },\n }\n );\n if (!res.ok) return null;\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } finally {\n clearTimeout(timer);\n }\n } catch {\n return null;\n }\n}\n\nasync function getLatestVersion(): Promise<string | null> {\n const cache = await readCache();\n if (cache) {\n const age = Date.now() - new Date(cache.lastChecked).getTime();\n if (age < CACHE_TTL_MS) {\n return cache.latestVersion;\n }\n }\n const latest = await fetchLatestVersion();\n if (latest) {\n await writeCache(latest);\n }\n return latest;\n}\n\n/**\n * Resolve the version of `mcp-use` installed in the user's project.\n * Falls back to the CLI's own bundled copy for monorepo / global installs.\n */\nfunction resolveInstalledVersion(\n projectPath: string | undefined\n): string | null {\n const attempts: (() => string)[] = [];\n\n if (projectPath) {\n attempts.push(() => {\n const projectRequire = createRequire(\n path.join(projectPath, \"package.json\")\n );\n return projectRequire.resolve(`${PACKAGE_NAME}/package.json`);\n });\n }\n\n // Monorepo / global fallback: bundled alongside the CLI\n attempts.push(() => path.join(__dirname, \"../../mcp-use/package.json\"));\n\n for (const attempt of attempts) {\n try {\n const pkgPath = attempt();\n const json = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n if (typeof json.version === \"string\") return json.version as string;\n } catch {\n // Try next\n }\n }\n return null;\n}\n\n/**\n * Check npm for a newer version of `mcp-use` and print a notification when\n * one is available. Runs silently on any error so it never interrupts the CLI.\n */\nexport async function notifyIfUpdateAvailable(\n projectPath: string | undefined\n): Promise<void> {\n try {\n const installed = resolveInstalledVersion(projectPath);\n if (!installed) return;\n\n const latest = await getLatestVersion();\n if (!latest) return;\n\n if (isNewer(installed, latest)) {\n console.log(\n chalk.yellow(\n `\\nA new release of ${chalk.bold(PACKAGE_NAME)} is available: ` +\n `${chalk.dim(installed)} → ${chalk.cyan.bold(latest)}`\n )\n );\n console.log(\n chalk.gray(\n `Run ${chalk.white(`npm install ${PACKAGE_NAME}@latest`)} to update\\n`\n )\n );\n }\n } catch {\n // Never surface errors from the update check\n }\n}\n"],"mappings":"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","names":["argv","process","os","tty","styles","chalk","styles","open","import_commander","import_config","import_node_child_process","import_node_fs","import_promises","import_node_module","import_node_path","import_node_url","import_node_process","import_node_child_process","import_promises","import_node_util","import_node_child_process","import_promises","import_node_process","import_node_os","import_node_fs","import_node_fs","fs","fs","process","os","fs","import_node_process","childProcess","process","execFile","childProcess","fs","fsConstants","powerShellPath","path","import_node_util","import_node_process","import_node_child_process","import_node_util","import_node_process","import_node_child_process","process","import_node_process","import_node_util","import_node_child_process","execFileAsync","process","import_node_util","import_node_child_process","execFileAsync","execFileAsync","defaultBrowser","process","import_node_process","process","__dirname","path","process","apps","defaultBrowser","powerShellPath","fs","fsConstants","childProcess","resolve","import_node_fs","import_node_os","import_node_path","path","os","fs","auth","path","resolve","api","authInfo","import_commander","import_client","import_node_readline","resolve","import_node_os","import_node_path","import_promises","import_node_fs","import_client","import_node_child_process","import_node_fs","import_promises","import_node_path","import_node_child_process","import_node_fs","import_node_os","import_node_path","resolve","path","os","WebSocket","import_node_fs","import_node_path","path","path","resolve","tty","prompt","result","import_node_fs","import_node_path","import_node_child_process","import_node_util","execFileAsync","import_node_fs","import_node_path","path","fs","fs","path","resolve","projectName","import_commander","prompt","resolve","import_commander","import_commander","env","prompt","resolve","getStatusColor","slug","import_commander","import_node_fs","import_node_os","import_node_path","import_promises","path","import_node_fs","import_node_path","import_node_url","path","fs","createRequire","import_node_fs","import_promises","import_node_os","import_node_path","path","os","path","resolve","env","fs","createServer","createRequire","cleanup","fileURLToPath","manifestPath","rest"]}