mcphosting-cli 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -154
- package/index.js +205 -0
- package/package.json +15 -52
- package/LICENSE +0 -21
- package/dist/index.cjs +0 -2643
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -2
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -2620
- package/dist/index.js.map +0 -1
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/login.ts","../src/lib/config.ts","../src/lib/api.ts","../src/lib/logger.ts","../src/commands/logout.ts","../src/commands/deploy.ts","../src/lib/auth.ts","../src/lib/detector.ts","../src/lib/clients.ts","../src/commands/init.ts","../src/commands/connect.ts","../src/commands/list.ts","../src/commands/status.ts","../src/commands/logs.ts","../src/commands/env.ts","../src/commands/keys.ts","../src/commands/search.ts","../src/commands/import.ts","../src/commands/proxy.ts","../src/commands/whoami.ts","../src/commands/account-status.ts","../src/commands/completions.ts"],"sourcesContent":["import { Command } from 'commander'\nimport chalk from 'chalk'\n\nimport { createLoginCommand } from './commands/login.js'\nimport { createLogoutCommand } from './commands/logout.js'\nimport { createDeployCommand } from './commands/deploy.js'\nimport { createInitCommand } from './commands/init.js'\nimport { createConnectCommand, createDisconnectCommand } from './commands/connect.js'\nimport { createListCommand } from './commands/list.js'\nimport { createStatusCommand } from './commands/status.js'\nimport { createLogsCommand } from './commands/logs.js'\nimport { createEnvCommand } from './commands/env.js'\nimport { createKeysCommand } from './commands/keys.js'\nimport { createSearchCommand, createInfoCommand } from './commands/search.js'\nimport { createImportCommand } from './commands/import.js'\nimport { createProxyCommand } from './commands/proxy.js'\nimport { createWhoamiCommand } from './commands/whoami.js'\nimport { createAccountCommand } from './commands/account-status.js'\nimport { createCompletionsCommand } from './commands/completions.js'\nimport { Logger } from './lib/logger.js'\n\nconst program = new Command()\n\nprogram\n .name('mcphosting')\n .description('Deploy and manage MCP servers from the terminal')\n .version('1.0.0')\n .option('--json', 'Output all results as JSON (agent-friendly)')\n .option('--silent', 'Suppress interactive output and prompts')\n .configureOutput({\n outputError: (str, write) => {\n if (Logger.isJsonMode) {\n write(JSON.stringify({ success: false, error: str.trim() }))\n } else {\n write(chalk.red(str))\n }\n }\n })\n .hook('preAction', (thisCommand) => {\n // Set global flags from root command\n const rootOpts = program.opts()\n if (rootOpts.json) {\n Logger.jsonMode = true\n }\n if (rootOpts.silent) {\n Logger.silent = true\n }\n })\n\n// --- Core Commands ---\nprogram.addCommand(createLoginCommand())\nprogram.addCommand(createLogoutCommand())\nprogram.addCommand(createDeployCommand())\nprogram.addCommand(createInitCommand())\nprogram.addCommand(createConnectCommand())\nprogram.addCommand(createDisconnectCommand())\nprogram.addCommand(createListCommand())\nprogram.addCommand(createStatusCommand())\nprogram.addCommand(createLogsCommand())\nprogram.addCommand(createEnvCommand())\nprogram.addCommand(createKeysCommand())\n\n// --- Marketplace ---\nprogram.addCommand(createSearchCommand())\nprogram.addCommand(createInfoCommand())\n\n// --- Account ---\nprogram.addCommand(createWhoamiCommand())\nprogram.addCommand(createAccountCommand())\n\n// --- Utilities ---\nprogram.addCommand(createImportCommand())\nprogram.addCommand(createProxyCommand())\nprogram.addCommand(createCompletionsCommand())\n\n// Custom help\nprogram.configureHelp({\n subcommandTerm: (cmd) => chalk.cyan(cmd.name()),\n commandUsage: (cmd) => chalk.yellow(cmd.usage()),\n commandDescription: (cmd) => chalk.dim(cmd.description()),\n})\n\nprogram.addHelpText('after', `\n${chalk.bold('Quick Start (one command!):')}\n ${chalk.dim('1.')} ${chalk.cyan('mcphosting login')} ${chalk.dim('Authenticate')}\n ${chalk.dim('2.')} ${chalk.cyan('mcphosting deploy --template weather')} ${chalk.dim('Deploy a template')}\n ${chalk.dim(' ')} ${chalk.dim('Done! URL returned. API key created. Config ready.')}\n\n${chalk.bold('Global Flags:')}\n ${chalk.cyan('--json')} ${chalk.dim('Output as JSON (agent-friendly)')}\n ${chalk.cyan('--silent')} ${chalk.dim('Suppress interactive output')}\n\n${chalk.bold('Environment Variables:')}\n ${chalk.cyan('MCPHOSTING_TOKEN')} ${chalk.dim('Auth token (overrides config)')}\n ${chalk.cyan('MCPHOSTING_API_URL')} ${chalk.dim('API base URL (default: mcphosting.com)')}\n\n${chalk.bold('Deploy Options:')}\n ${chalk.cyan('mcphosting deploy')} ${chalk.dim('Deploy from current directory')}\n ${chalk.cyan('mcphosting deploy --template crypto')} ${chalk.dim('Deploy from template')}\n ${chalk.cyan('mcphosting deploy --github <url>')} ${chalk.dim('Deploy from GitHub repo')}\n ${chalk.cyan('mcphosting deploy --api-url <url>')} ${chalk.dim('Register external server')}\n ${chalk.cyan('mcphosting deploy --configure')} ${chalk.dim('Auto-configure AI clients')}\n\n${chalk.bold('Templates:')}\n ${chalk.cyan('weather')} ${chalk.cyan('crypto')} ${chalk.cyan('notion')} ${chalk.cyan('postgres')} ${chalk.cyan('blank')}\n\n${chalk.bold('Agent Usage:')}\n ${chalk.cyan('mcphosting deploy --template crypto --json')} ${chalk.dim('Deploy + JSON output')}\n ${chalk.cyan('mcphosting whoami --json')} ${chalk.dim('Check auth status')}\n ${chalk.cyan('mcphosting account --json')} ${chalk.dim('Account + servers')}\n ${chalk.cyan('mcphosting list --json')} ${chalk.dim('List all servers')}\n\n${chalk.bold('More Commands:')}\n ${chalk.cyan('mcphosting init')} ${chalk.dim('Create mcphosting.json')}\n ${chalk.cyan('mcphosting connect <slug>')} ${chalk.dim('Connect MCP to AI clients')}\n ${chalk.cyan('mcphosting list')} ${chalk.dim('List all servers')}\n ${chalk.cyan('mcphosting status <server>')} ${chalk.dim('Check server status')}\n ${chalk.cyan('mcphosting keys create \"Key Name\"')} ${chalk.dim('Create API key')}\n ${chalk.cyan('mcphosting search <query>')} ${chalk.dim('Search marketplace')}\n ${chalk.cyan('mcphosting completions --shell=zsh')} ${chalk.dim('Shell completions')}\n\n${chalk.bold('Supported AI Clients:')}\n • ${chalk.green('Claude Desktop')} • ${chalk.green('Cursor')} • ${chalk.green('VS Code')} • ${chalk.green('OpenClaw')} • ${chalk.green('ChatGPT')}\n\n${chalk.yellow('📚 Docs:')} ${chalk.blue('https://mcphosting.com/docs')}\n${chalk.yellow('⭐ GitHub:')} ${chalk.blue('https://github.com/gorlomi-enzo/mcphosting-cli')}\n`)\n\n// Global error handling\nprocess.on('uncaughtException', (error) => {\n if (Logger.isJsonMode) {\n console.error(JSON.stringify({ success: false, error: error.message }))\n } else {\n Logger.error(`Unexpected error: ${error.message}`)\n }\n if (process.env.DEBUG) console.error(error.stack)\n process.exit(1)\n})\n\nprocess.on('unhandledRejection', (reason) => {\n if (Logger.isJsonMode) {\n console.error(JSON.stringify({ success: false, error: String(reason) }))\n } else {\n Logger.error(`Unhandled rejection: ${reason}`)\n }\n if (process.env.DEBUG) console.error(reason)\n process.exit(1)\n})\n\nprocess.on('SIGINT', () => {\n if (!Logger.isSilent && !Logger.isJsonMode) {\n console.log('\\n')\n Logger.info('Goodbye! 👋')\n }\n process.exit(0)\n})\n\nasync function main() {\n try {\n await program.parseAsync()\n } catch (error: any) {\n if (Logger.isJsonMode) {\n console.error(JSON.stringify({ success: false, error: error.message }))\n } else {\n Logger.error(`Command failed: ${error.message}`)\n }\n if (process.env.DEBUG) console.error(error)\n process.exit(1)\n }\n}\n\nmain()\n","import { Command } from 'commander'\nimport { createServer } from 'http'\nimport open from 'open'\nimport { Config } from '../lib/config.js'\nimport { MCPHostingAPI } from '../lib/api.js'\nimport { Logger } from '../lib/logger.js'\nimport chalk from 'chalk'\nimport * as readline from 'readline'\n\nfunction prompt(question: string, hidden: boolean = false): Promise<string> {\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n })\n\n if (hidden) {\n // For password input, mute output\n const originalWrite = process.stdout.write.bind(process.stdout)\n process.stdout.write = ((str: string | Uint8Array) => {\n if (typeof str === 'string' && str !== question && str !== '\\n' && str !== '\\r\\n') {\n return originalWrite('*')\n }\n return originalWrite(str)\n }) as typeof process.stdout.write\n\n rl.question(question, (answer) => {\n process.stdout.write = originalWrite\n console.log() // New line after hidden input\n rl.close()\n resolve(answer)\n })\n } else {\n rl.question(question, (answer) => {\n rl.close()\n resolve(answer)\n })\n }\n })\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nasync function loginWithGitHub(config: Config): Promise<void> {\n const api = new MCPHostingAPI()\n const spinner = Logger.spinner('Starting GitHub login...')\n\n try {\n // Step 1: Start device flow\n const deviceFlow = await api.githubDeviceStart()\n spinner.stop()\n\n // Step 2: Show the code to the user\n console.log('')\n console.log(chalk.bold(' 🔐 GitHub Login'))\n console.log('')\n console.log(` ${chalk.dim('1.')} Open ${chalk.cyan.underline(deviceFlow.verification_uri)}`)\n console.log(` ${chalk.dim('2.')} Enter code: ${chalk.bold.yellow(deviceFlow.user_code)}`)\n console.log('')\n\n // Try to open browser automatically\n try {\n await open(deviceFlow.verification_uri)\n Logger.dim(' Browser opened automatically.')\n } catch {\n Logger.dim(' Open the URL above in your browser.')\n }\n\n console.log('')\n const pollSpinner = Logger.spinner('Waiting for GitHub authorization...')\n\n // Step 3: Poll for completion\n const pollInterval = (deviceFlow.interval || 5) * 1000\n const maxAttempts = Math.ceil((deviceFlow.expires_in || 900) / (deviceFlow.interval || 5))\n let currentInterval = pollInterval\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n await sleep(currentInterval)\n\n const result = await api.githubDevicePoll(deviceFlow.device_code)\n\n if (result.token && result.user) {\n // Success!\n config.token = result.token\n config.refreshToken = result.refresh_token\n config.user = { email: result.user.email, org: result.user.github_username }\n\n pollSpinner.succeed(\n result.is_new_user\n ? `Account created and logged in as ${chalk.bold(result.user.github_username || result.user.email)}`\n : `Logged in as ${chalk.bold(result.user.github_username || result.user.email)}`\n )\n\n console.log('')\n Logger.info(`Token stored in ${chalk.dim('~/.config/mcphosting/')}`)\n Logger.info(`Run ${chalk.cyan('mcphosting deploy')} to deploy your first MCP server!`)\n return\n }\n\n if (result.error === 'authorization_pending') {\n continue // Still waiting\n }\n\n if (result.error === 'slow_down') {\n // GitHub wants us to slow down\n currentInterval = (result.interval || 10) * 1000\n continue\n }\n\n // Any other error\n pollSpinner.fail('GitHub login failed')\n Logger.error(result.error || 'Unknown error during GitHub authorization')\n process.exit(1)\n }\n\n pollSpinner.fail('GitHub login timed out')\n Logger.error('Authorization expired. Please try again.')\n process.exit(1)\n } catch (error: any) {\n spinner.fail('GitHub login failed')\n Logger.error(error.message || 'Failed to start GitHub device flow')\n process.exit(1)\n }\n}\n\nexport function createLoginCommand(): Command {\n return new Command('login')\n .description('Authenticate with MCPHosting')\n .option('--email <email>', 'Email address')\n .option('--token <token>', 'Provide API token directly')\n .option('--github', 'Login with GitHub (recommended)')\n .option('--browser', 'Use browser-based login')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const config = new Config()\n const isJson = options.json || Logger.isJsonMode\n\n // Check env var auth first\n if (process.env.MCPHOSTING_TOKEN && !options.token && !options.github && !options.email) {\n const api = new MCPHostingAPI(process.env.MCPHOSTING_TOKEN)\n const user = await api.whoami()\n if (isJson) {\n console.log(JSON.stringify({\n success: true,\n email: user?.email || 'unknown',\n token_source: 'environment',\n }))\n } else {\n Logger.success(`Authenticated via MCPHOSTING_TOKEN env var`)\n if (user) Logger.info(` User: ${chalk.bold(user.email)}`)\n }\n return\n }\n\n // GitHub OAuth login (recommended)\n if (options.github) {\n await loginWithGitHub(config)\n return\n }\n\n // Direct token auth\n if (options.token) {\n config.token = options.token\n const api = new MCPHostingAPI(options.token)\n const user = await api.whoami()\n\n if (user) {\n config.user = user\n if (isJson) {\n console.log(JSON.stringify({ success: true, email: user.email }))\n } else {\n Logger.success(`Logged in as ${chalk.bold(user.email)}`)\n }\n } else {\n if (isJson) {\n console.log(JSON.stringify({ success: true, warning: 'Token saved but could not verify identity' }))\n } else {\n Logger.warning('Token saved, but could not verify identity.')\n }\n }\n return\n }\n\n // Non-TTY without explicit auth method: error gracefully\n if (!process.stdin.isTTY && !options.email) {\n if (isJson) {\n console.log(JSON.stringify({\n success: false,\n error: 'Interactive login requires a TTY. Use --token or MCPHOSTING_TOKEN env var for scripted usage.',\n }))\n } else {\n Logger.error('Interactive login requires a TTY.')\n Logger.info('Use one of:')\n Logger.dim(` ${chalk.cyan('mcphosting login --token <token>')}`)\n Logger.dim(` ${chalk.cyan('export MCPHOSTING_TOKEN=<token>')}`)\n }\n process.exit(1)\n }\n\n // Email/password login\n if (options.email || !process.stdout.isTTY) {\n const email = options.email || await prompt(chalk.cyan('Email: '))\n const password = await prompt(chalk.cyan('Password: '), true)\n\n if (!email || !password) {\n Logger.error('Email and password are required.')\n process.exit(1)\n }\n\n const spinner = Logger.spinner('Logging in...')\n\n try {\n const api = new MCPHostingAPI()\n const result = await api.login(email, password)\n\n config.token = result.token\n config.refreshToken = result.refresh_token\n config.user = result.user\n\n spinner.succeed(`Logged in as ${chalk.bold(result.user.email)}`)\n console.log('')\n Logger.info(`Token stored in ${chalk.dim('~/.config/mcphosting/')}`)\n Logger.info(`Run ${chalk.cyan('mcphosting deploy')} to deploy your first MCP server!`)\n } catch (error: any) {\n spinner.fail('Login failed')\n Logger.error(error.message || 'Invalid email or password.')\n process.exit(1)\n }\n return\n }\n\n // Interactive: show login options for TTY\n if (process.stdout.isTTY) {\n console.log('')\n console.log(chalk.bold(' 🚀 MCPHosting Login'))\n console.log('')\n console.log(` ${chalk.cyan('mcphosting login --github')} ${chalk.dim('Login with GitHub (recommended)')}`)\n console.log(` ${chalk.cyan('mcphosting login --email')} ${chalk.dim('Login with email/password')}`)\n console.log(` ${chalk.cyan('mcphosting login --browser')} ${chalk.dim('Login via browser')}`)\n console.log(` ${chalk.cyan('mcphosting login --token')} ${chalk.dim('Use existing API token')}`)\n console.log('')\n\n // Default to GitHub login\n Logger.info('Starting GitHub login (use --email for email/password)...')\n console.log('')\n await loginWithGitHub(config)\n return\n }\n\n // Browser-based OAuth flow (fallback)\n const spinner = Logger.spinner('Opening browser for login...')\n let server: any\n\n try {\n const authPromise = new Promise<string>((resolve, reject) => {\n server = createServer((req, res) => {\n if (req.url?.startsWith('/callback')) {\n const url = new URL(req.url, 'http://localhost')\n const token = url.searchParams.get('token')\n\n if (token) {\n res.writeHead(200, { 'Content-Type': 'text/html' })\n res.end(`\n <html>\n <body style=\"font-family: system-ui; text-align: center; padding: 50px; background: #0a0a0a; color: #fff;\">\n <h2>✅ Login Successful!</h2>\n <p style=\"color: #888;\">You can close this window and return to your terminal.</p>\n </body>\n </html>\n `)\n resolve(token)\n } else {\n res.writeHead(400, { 'Content-Type': 'text/html' })\n res.end(`\n <html>\n <body style=\"font-family: system-ui; text-align: center; padding: 50px; background: #0a0a0a; color: #fff;\">\n <h2>❌ Login Failed</h2>\n <p style=\"color: #888;\">No token received. Please try again.</p>\n </body>\n </html>\n `)\n reject(new Error('No token received'))\n }\n } else {\n res.writeHead(404)\n res.end('Not found')\n }\n })\n\n server.listen(0, () => {\n const port = (server.address() as any).port\n const callbackUrl = `http://localhost:${port}/callback`\n const authUrl = `https://mcphosting.com/cli/auth?callback=${encodeURIComponent(callbackUrl)}`\n\n spinner.text = 'Waiting for browser login...'\n\n setTimeout(() => {\n reject(new Error('Login timed out after 2 minutes. Try again.'))\n }, 120000)\n\n open(authUrl).catch(() => {\n spinner.info('Could not open browser automatically.')\n Logger.info(`Open this URL manually: ${chalk.blue(authUrl)}`)\n })\n })\n })\n\n const token = await authPromise\n spinner.succeed('Login successful!')\n\n config.token = token\n const api = new MCPHostingAPI(token)\n const user = await api.whoami()\n\n if (user) {\n config.user = user\n Logger.success(`Logged in as ${chalk.bold(user.email)}`)\n }\n\n console.log('')\n Logger.info(`Run ${chalk.cyan('mcphosting deploy')} to deploy your first MCP server!`)\n\n } catch (error: any) {\n spinner.fail('Login failed')\n Logger.error(error.message)\n\n console.log('')\n Logger.info(`Alternative: ${chalk.cyan('mcphosting login --github')}`)\n process.exit(1)\n } finally {\n if (server) {\n server.close()\n }\n }\n })\n}\n","import Conf from 'conf'\nimport { MCPConfig, MCPConnection } from '../types.js'\n\nexport class Config {\n private conf: Conf<MCPConfig>\n private connectionsConf: Conf<{ connections: MCPConnection[] }>\n\n constructor() {\n this.conf = new Conf<MCPConfig>({\n projectName: 'mcphosting',\n defaults: {}\n })\n\n this.connectionsConf = new Conf<{ connections: MCPConnection[] }>({\n projectName: 'mcphosting',\n configName: 'connections',\n defaults: { connections: [] }\n })\n }\n\n /**\n * Token resolution: env var MCPHOSTING_TOKEN takes priority over config file.\n */\n get token(): string | undefined {\n return process.env.MCPHOSTING_TOKEN || this.conf.get('token')\n }\n\n set token(value: string | undefined) {\n if (value) {\n this.conf.set('token', value)\n } else {\n this.conf.delete('token')\n }\n }\n\n get refreshToken(): string | undefined {\n return this.conf.get('refresh_token' as any)\n }\n\n set refreshToken(value: string | undefined) {\n if (value) {\n this.conf.set('refresh_token' as any, value)\n } else {\n this.conf.delete('refresh_token' as any)\n }\n }\n\n get user() {\n return this.conf.get('user')\n }\n\n set user(value: { email: string; org?: string } | undefined) {\n if (value) {\n this.conf.set('user', value)\n } else {\n this.conf.delete('user')\n }\n }\n\n /**\n * Check if token came from environment variable.\n */\n get isEnvToken(): boolean {\n return !!process.env.MCPHOSTING_TOKEN\n }\n\n get connections(): MCPConnection[] {\n return this.connectionsConf.get('connections', [])\n }\n\n addConnection(connection: Omit<MCPConnection, 'id' | 'addedAt'>): MCPConnection {\n const connections = this.connections\n const newConnection: MCPConnection = {\n ...connection,\n id: Math.random().toString(36).substr(2, 9),\n addedAt: Date.now()\n }\n\n connections.push(newConnection)\n this.connectionsConf.set('connections', connections)\n return newConnection\n }\n\n removeConnection(id: string): boolean {\n const connections = this.connections\n const index = connections.findIndex(c => c.id === id || c.slug === id)\n if (index === -1) return false\n\n connections.splice(index, 1)\n this.connectionsConf.set('connections', connections)\n return true\n }\n\n findConnection(slugOrId: string): MCPConnection | undefined {\n return this.connections.find(c => c.id === slugOrId || c.slug === slugOrId)\n }\n\n updateConnection(id: string, updates: Partial<MCPConnection>): boolean {\n const connections = this.connections\n const index = connections.findIndex(c => c.id === id)\n if (index === -1) return false\n\n connections[index] = { ...connections[index], ...updates }\n this.connectionsConf.set('connections', connections)\n return true\n }\n\n clear(): void {\n this.conf.clear()\n this.connectionsConf.clear()\n }\n}\n","import axios, { AxiosError } from 'axios'\nimport { MCPServer, DeployResult, ServerProject, APIKey, LogEntry } from '../types.js'\n\nconst API_BASE = process.env.MCPHOSTING_API_URL || 'https://mcphosting.com'\n\nexport class MCPHostingAPI {\n private token: string | null = null\n\n constructor(token?: string) {\n this.token = token || null\n }\n\n setToken(token: string) {\n this.token = token\n }\n\n private get headers(): Record<string, string> {\n const h: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': 'mcphosting-cli/1.0.0',\n }\n if (this.token) {\n h['Authorization'] = `Bearer ${this.token}`\n }\n return h\n }\n\n private handleError(error: unknown): never {\n if (error instanceof AxiosError) {\n const status = error.response?.status\n const message = error.response?.data?.error || error.response?.data?.message || error.message\n\n if (status === 401) {\n throw new Error('Authentication required. Run `mcphosting login` first.')\n }\n if (status === 403) {\n throw new Error('Access denied. Check your permissions.')\n }\n if (status === 404) {\n throw new Error('Not found. Check the server slug or ID.')\n }\n if (status === 429) {\n throw new Error('Rate limited. Please wait a moment and try again.')\n }\n throw new Error(`API error (${status}): ${message}`)\n }\n throw error\n }\n\n // --- Auth ---\n\n async login(email: string, password: string): Promise<{ token: string; refresh_token: string; user: { email: string } }> {\n try {\n const { data } = await axios.post(`${API_BASE}/api/auth/cli-login`, { email, password })\n return data\n } catch (error) {\n this.handleError(error)\n }\n }\n\n async refreshToken(refreshToken: string): Promise<{ token: string; refresh_token: string; user: { email: string } }> {\n try {\n const { data } = await axios.post(`${API_BASE}/api/auth/cli-login/refresh`, { refresh_token: refreshToken })\n return data\n } catch (error) {\n this.handleError(error)\n }\n }\n\n async githubDeviceStart(): Promise<{\n device_code: string\n user_code: string\n verification_uri: string\n expires_in: number\n interval: number\n }> {\n try {\n const { data } = await axios.get(`${API_BASE}/api/auth/github/device`)\n return data\n } catch (error) {\n this.handleError(error)\n }\n }\n\n async githubDevicePoll(deviceCode: string): Promise<{\n token?: string\n refresh_token?: string\n user?: { email: string; github_username?: string }\n is_new_user?: boolean\n error?: string\n interval?: number\n }> {\n try {\n const { data } = await axios.post(\n `${API_BASE}/api/auth/github/device`,\n { device_code: deviceCode },\n { validateStatus: (status) => status < 500 } // Don't throw on 202/400\n )\n return data\n } catch (error) {\n this.handleError(error)\n }\n }\n\n async whoami(): Promise<{ email: string; org?: string } | null> {\n if (!this.token) return null\n try {\n const { data } = await axios.get(`${API_BASE}/api/auth/whoami`, { headers: this.headers })\n return data.user || null\n } catch {\n return null\n }\n }\n\n // --- Deploy ---\n\n async deploy(params: {\n name: string\n githubUrl?: string\n baseApiUrl?: string\n authType?: 'none' | 'api_key' | 'oauth'\n envVars?: Record<string, string>\n }): Promise<DeployResult> {\n try {\n // If GitHub URL, use GitHub deploy\n if (params.githubUrl) {\n const { data } = await axios.post(`${API_BASE}/api/cli/github/deploy`, {\n repo_url: params.githubUrl,\n auto_detect: true,\n }, { headers: this.headers })\n return data\n }\n\n // Otherwise use regular deploy\n const { data } = await axios.post(`${API_BASE}/api/cli/deploy`, params, { headers: this.headers })\n return data\n } catch (error) {\n this.handleError(error)\n }\n }\n\n // --- Server Management ---\n\n async listServers(): Promise<ServerProject[]> {\n try {\n const { data } = await axios.get(`${API_BASE}/api/mcp/projects`, { headers: this.headers })\n return data.projects || []\n } catch (error) {\n this.handleError(error)\n }\n }\n\n async getServer(idOrSlug: string): Promise<ServerProject> {\n try {\n const { data } = await axios.get(`${API_BASE}/api/mcp/projects/${idOrSlug}`, { headers: this.headers })\n return data.project || data\n } catch (error) {\n this.handleError(error)\n }\n }\n\n async getServerLogs(idOrSlug: string, lines: number = 50): Promise<LogEntry[]> {\n try {\n const { data } = await axios.get(`${API_BASE}/api/mcp/projects/${idOrSlug}/logs?lines=${lines}`, { headers: this.headers })\n return data.logs || []\n } catch (error) {\n this.handleError(error)\n }\n }\n\n // --- Connection Info ---\n\n async connect(slug: string): Promise<any> {\n try {\n const { data } = await axios.post(`${API_BASE}/api/mcp/connect`, { slug }, { headers: this.headers })\n return data\n } catch (error) {\n this.handleError(error)\n }\n }\n\n async getConnectionInfo(slug: string): Promise<any> {\n try {\n const { data } = await axios.get(`${API_BASE}/api/cli/info/${slug}`, { headers: this.headers })\n return data\n } catch (error) {\n this.handleError(error)\n }\n }\n\n // --- Env Vars ---\n\n async listEnvVars(projectId: string): Promise<{ key: string; masked: boolean }[]> {\n try {\n const { data } = await axios.get(`${API_BASE}/api/mcp/projects/${projectId}/env-vars`, { headers: this.headers })\n return data.envVars || []\n } catch (error) {\n this.handleError(error)\n }\n }\n\n async addEnvVar(projectId: string, key: string, value: string): Promise<void> {\n try {\n await axios.post(\n `${API_BASE}/api/mcp/projects/${projectId}/env-vars`,\n { key, value },\n { headers: this.headers }\n )\n } catch (error) {\n this.handleError(error)\n }\n }\n\n async removeEnvVar(projectId: string, key: string): Promise<void> {\n try {\n await axios.delete(\n `${API_BASE}/api/mcp/projects/${projectId}/env-vars/${key}`,\n { headers: this.headers }\n )\n } catch (error) {\n this.handleError(error)\n }\n }\n\n // --- One-Click Deploy ---\n\n async oneClickDeploy(params: {\n name: string\n slug?: string\n githubUrl?: string\n baseApiUrl?: string\n template?: string\n authType?: 'none' | 'api_key' | 'oauth'\n envVars?: { key: string; value: string }[]\n autoKey?: boolean\n vercelProjectUrl?: string\n }): Promise<OneClickDeployResult> {\n try {\n const { data } = await axios.post(`${API_BASE}/api/cli/deploy/one-click`, params, { headers: this.headers })\n return data\n } catch (error) {\n this.handleError(error)\n }\n }\n\n // --- API Keys ---\n\n async getAPIKeys(): Promise<APIKey[]> {\n try {\n const { data } = await axios.get(`${API_BASE}/api/keys`, { headers: this.headers })\n return data.keys || []\n } catch (error) {\n this.handleError(error)\n }\n }\n\n async createAPIKey(name: string): Promise<APIKey> {\n try {\n const { data } = await axios.post(`${API_BASE}/api/keys`, { name }, { headers: this.headers })\n return data\n } catch (error) {\n this.handleError(error)\n }\n }\n\n async deleteAPIKey(id: string): Promise<void> {\n try {\n await axios.delete(`${API_BASE}/api/keys/${id}`, { headers: this.headers })\n } catch (error) {\n this.handleError(error)\n }\n }\n\n // --- Marketplace (static fallback for MVP) ---\n\n async searchMCPs(query: string): Promise<MCPServer[]> {\n try {\n const { data } = await axios.get(`${API_BASE}/api/marketplace/search?q=${encodeURIComponent(query)}`, { headers: this.headers })\n return data.mcps || []\n } catch {\n // Fallback to static data\n const staticMCPs = this.getStaticMCPs()\n return staticMCPs.filter(mcp =>\n mcp.name.toLowerCase().includes(query.toLowerCase()) ||\n mcp.description.toLowerCase().includes(query.toLowerCase()) ||\n mcp.tools.some(tool => tool.toLowerCase().includes(query.toLowerCase()))\n )\n }\n }\n\n async getMCPInfo(slug: string): Promise<MCPServer | null> {\n try {\n const { data } = await axios.get(`${API_BASE}/api/marketplace/mcp/${slug}`, { headers: this.headers })\n return data.mcp || null\n } catch {\n const staticMCPs = this.getStaticMCPs()\n return staticMCPs.find(mcp => mcp.slug === slug) || null\n }\n }\n\n private getStaticMCPs(): MCPServer[] {\n return [\n {\n slug: 'github',\n name: 'GitHub MCP',\n description: 'Access GitHub repositories, issues, and pull requests',\n url: 'https://github.mcphost.dev',\n tools: ['read_file', 'list_repos', 'create_issue', 'list_issues'],\n installs: 15420,\n author: 'MCPHosting'\n },\n {\n slug: 'slack',\n name: 'Slack MCP',\n description: 'Send messages and manage Slack workspaces',\n url: 'https://slack.mcphost.dev',\n tools: ['send_message', 'list_channels', 'get_history'],\n installs: 8930,\n author: 'MCPHosting'\n },\n {\n slug: 'notion',\n name: 'Notion MCP',\n description: 'Read and write Notion pages and databases',\n url: 'https://notion.mcphost.dev',\n tools: ['read_page', 'create_page', 'query_database'],\n installs: 12450,\n author: 'MCPHosting'\n },\n {\n slug: 'stripe',\n name: 'Stripe MCP',\n description: 'Access Stripe payment and customer data',\n url: 'https://stripe.mcphost.dev',\n tools: ['get_customer', 'list_payments', 'create_invoice'],\n installs: 6720,\n author: 'MCPHosting'\n },\n {\n slug: 'postgres',\n name: 'PostgreSQL MCP',\n description: 'Query PostgreSQL databases safely',\n url: 'https://postgres.mcphost.dev',\n tools: ['query', 'describe_table', 'list_tables'],\n installs: 9180,\n author: 'MCPHosting'\n },\n {\n slug: 'filesystem',\n name: 'Filesystem MCP',\n description: 'Read and write files securely',\n url: 'https://filesystem.mcphost.dev',\n tools: ['read_file', 'write_file', 'list_directory'],\n installs: 18950,\n author: 'MCPHosting'\n }\n ]\n }\n}\n","import chalk from 'chalk';\nimport ora, { Ora } from 'ora';\n\n// Global flags for agent-friendly output\nlet _silent = false;\nlet _jsonMode = false;\n\nexport class Logger {\n static get isSilent(): boolean {\n return _silent;\n }\n\n static set silent(value: boolean) {\n _silent = value;\n }\n\n static get isJsonMode(): boolean {\n return _jsonMode;\n }\n\n static set jsonMode(value: boolean) {\n _jsonMode = value;\n }\n\n static info(message: string): void {\n if (_silent || _jsonMode) return;\n console.log(chalk.blue('ℹ'), message);\n }\n\n static success(message: string): void {\n if (_silent || _jsonMode) return;\n console.log(chalk.green('✓'), message);\n }\n\n static warning(message: string): void {\n if (_silent || _jsonMode) return;\n console.log(chalk.yellow('⚠'), message);\n }\n\n static error(message: string): void {\n if (_jsonMode) {\n console.error(JSON.stringify({ success: false, error: message }));\n return;\n }\n if (_silent) return;\n console.error(chalk.red('✗'), message);\n }\n\n static dim(message: string): void {\n if (_silent || _jsonMode) return;\n console.log(chalk.dim(message));\n }\n\n static bold(message: string): void {\n if (_silent || _jsonMode) return;\n console.log(chalk.bold(message));\n }\n\n static spinner(text: string): Ora {\n if (_silent || _jsonMode || !process.stderr.isTTY) {\n // Return a no-op spinner for non-TTY / silent / JSON modes\n return {\n start: () => ora(text),\n stop: () => {},\n succeed: () => {},\n fail: () => {},\n warn: () => {},\n info: () => {},\n text: '',\n } as unknown as Ora;\n }\n return ora(text).start();\n }\n\n static table(data: Array<Record<string, any>>, headers?: string[]): void {\n if (data.length === 0) {\n Logger.dim('No data to display');\n return;\n }\n\n const keys = headers || Object.keys(data[0]);\n const maxWidths = keys.map(key => \n Math.max(key.length, ...data.map(row => String(row[key] || '').length))\n );\n\n // Header\n const headerRow = keys.map((key, i) => \n chalk.bold(key.padEnd(maxWidths[i]))\n ).join(' | ');\n console.log(headerRow);\n console.log(keys.map((_, i) => '-'.repeat(maxWidths[i])).join('-|-'));\n\n // Data rows\n data.forEach(row => {\n const dataRow = keys.map((key, i) => \n String(row[key] || '').padEnd(maxWidths[i])\n ).join(' | ');\n console.log(dataRow);\n });\n }\n\n static json(data: any): void {\n console.log(JSON.stringify(data, null, 2));\n }\n}","import { Command } from 'commander'\nimport { Config } from '../lib/config.js'\nimport { Logger } from '../lib/logger.js'\n\nexport function createLogoutCommand(): Command {\n return new Command('logout')\n .description('Log out and remove stored credentials')\n .option('--json', 'Output as JSON')\n .action((options) => {\n const config = new Config()\n const isJson = options.json || Logger.isJsonMode\n\n if (!config.token) {\n if (isJson) {\n console.log(JSON.stringify({ success: true, message: 'Already logged out' }))\n } else {\n Logger.info('Already logged out.')\n }\n return\n }\n\n const email = config.user?.email\n config.token = undefined\n config.user = undefined\n\n if (isJson) {\n console.log(JSON.stringify({ success: true, email: email || undefined }))\n } else if (email) {\n Logger.success(`Logged out from ${email}`)\n } else {\n Logger.success('Logged out successfully.')\n }\n })\n}\n","import { Command } from 'commander'\nimport { readFile, writeFile, access } from 'fs/promises'\nimport { join } from 'path'\nimport { getAuthenticatedAPI } from '../lib/auth.js'\nimport { detectMCP } from '../lib/detector.js'\nimport { ClientManager } from '../lib/clients.js'\nimport { Logger } from '../lib/logger.js'\nimport chalk from 'chalk'\n\nconst TEMPLATES = ['weather', 'crypto', 'notion', 'postgres', 'blank']\n\nexport function createDeployCommand(): Command {\n return new Command('deploy')\n .description('Deploy an MCP server to MCPHosting (one command)')\n .option('--github <url>', 'Deploy from a GitHub repository URL')\n .option('--name <name>', 'Server name (auto-detected if not provided)')\n .option('--template <name>', 'Deploy from a template (weather, crypto, notion, postgres, blank)')\n .option('--api-url <url>', 'Your MCP server\\'s API URL (for external servers)')\n .option('--auth <type>', 'Auth type: none, api_key, or oauth', 'none')\n .option('--auto-key', 'Automatically create an API key', true)\n .option('--no-auto-key', 'Skip automatic API key creation')\n .option('--configure', 'Automatically configure detected AI clients', false)\n .option('--json', 'Output result as JSON')\n .option('--silent', 'Suppress interactive output')\n .action(async (options) => {\n const isJson = options.json || Logger.isJsonMode\n const isSilent = options.silent || Logger.isSilent\n\n const { api, config } = getAuthenticatedAPI()\n\n if (!isJson && !isSilent) {\n console.log('')\n console.log(chalk.bold('🚀 MCPHosting Deploy'))\n console.log(chalk.dim(' One command. Your MCP server goes live.'))\n console.log('')\n }\n\n // --- Template Deploy ---\n if (options.template) {\n const template = options.template.toLowerCase()\n if (!TEMPLATES.includes(template)) {\n Logger.error(`Unknown template: ${template}`)\n console.log('')\n Logger.info('Available templates:')\n for (const t of TEMPLATES) {\n console.log(` ${chalk.cyan(t)}`)\n }\n process.exit(1)\n }\n\n const name = options.name || `mcp-${template}`\n const spinner = Logger.spinner(`Deploying template ${chalk.cyan(template)}...`)\n\n try {\n const result = await api.oneClickDeploy({\n name,\n template,\n authType: options.auth,\n autoKey: options.autoKey,\n })\n\n spinner.succeed(`Template ${chalk.cyan(template)} deployed!`)\n\n if (isJson) {\n Logger.json(result)\n } else {\n printOneClickResult(result, options.configure)\n }\n\n if (options.configure && result.connectionUrl) {\n await autoConfigureClients(result.slug, result.connectionUrl)\n }\n } catch (error: any) {\n spinner.fail('Deploy failed')\n Logger.error(error.message)\n process.exit(1)\n }\n return\n }\n\n // --- GitHub Deploy ---\n if (options.github) {\n const githubUrl = options.github\n const name = options.name || extractRepoName(githubUrl)\n const spinner = Logger.spinner(`Deploying from ${chalk.cyan(githubUrl)}...`)\n\n try {\n const result = await api.oneClickDeploy({\n name,\n githubUrl,\n authType: options.auth,\n autoKey: options.autoKey,\n })\n\n spinner.succeed('Deployed from GitHub!')\n\n if (isJson) {\n Logger.json(result)\n } else {\n printOneClickResult(result, options.configure)\n }\n\n if (options.configure && result.connectionUrl) {\n await autoConfigureClients(result.slug, result.connectionUrl)\n }\n } catch (error: any) {\n spinner.fail('Deploy failed')\n Logger.error(error.message)\n process.exit(1)\n }\n return\n }\n\n // --- API URL Deploy (external server registration) ---\n if (options.apiUrl) {\n const name = options.name || new URL(options.apiUrl).hostname\n const spinner = Logger.spinner(`Registering ${chalk.cyan(name)}...`)\n\n try {\n const result = await api.oneClickDeploy({\n name,\n baseApiUrl: options.apiUrl,\n authType: options.auth,\n autoKey: options.autoKey,\n })\n\n spinner.succeed('Registered successfully!')\n\n if (isJson) {\n Logger.json(result)\n } else {\n printOneClickResult(result, options.configure)\n }\n\n if (options.configure && result.connectionUrl) {\n await autoConfigureClients(result.slug, result.connectionUrl)\n }\n } catch (error: any) {\n spinner.fail('Registration failed')\n Logger.error(error.message)\n process.exit(1)\n }\n return\n }\n\n // --- Auto-detect from current directory ---\n const dir = process.cwd()\n\n // Check for mcphosting.json first\n let mcphostingConfig: any = null\n try {\n const configContent = await readFile(join(dir, 'mcphosting.json'), 'utf-8')\n mcphostingConfig = JSON.parse(configContent)\n } catch {\n // No config file\n }\n\n const spinner = Logger.spinner('Detecting MCP server...')\n\n const detected = await detectMCP(dir)\n\n if (!detected && !mcphostingConfig) {\n spinner.fail('No MCP server detected')\n console.log('')\n Logger.info('This directory doesn\\'t look like an MCP server project.')\n console.log('')\n Logger.info(chalk.bold('Quick options:'))\n console.log(` ${chalk.cyan('mcphosting deploy --template weather')} Deploy a template`)\n console.log(` ${chalk.cyan('mcphosting deploy --github <url>')} Deploy from GitHub`)\n console.log(` ${chalk.cyan('mcphosting deploy --api-url <url>')} Register external server`)\n console.log(` ${chalk.cyan('mcphosting init')} Create mcphosting.json`)\n console.log('')\n process.exit(1)\n }\n\n const name = options.name || mcphostingConfig?.name || detected?.name || 'my-mcp-server'\n spinner.succeed(`Detected: ${chalk.bold(name)}`)\n\n if (detected) {\n Logger.info(` SDK: ${detected.hasMcpSdk ? chalk.green('✓') : chalk.yellow('○')} @modelcontextprotocol/sdk`)\n if (detected.runtime !== 'unknown') {\n Logger.info(` Runtime: ${detected.runtime}`)\n }\n }\n\n // Detect GitHub remote\n let githubUrl: string | null = mcphostingConfig?.github || null\n if (!githubUrl) {\n try {\n const { execSync } = await import('child_process')\n const remoteUrl = execSync('git remote get-url origin', { cwd: dir, encoding: 'utf-8' }).trim()\n if (remoteUrl.includes('github.com')) {\n githubUrl = remoteUrl\n .replace(/^git@github\\.com:/, 'https://github.com/')\n .replace(/\\.git$/, '')\n }\n } catch {\n // Not a git repo\n }\n }\n\n if (githubUrl) {\n Logger.info(` GitHub: ${chalk.dim(githubUrl)}`)\n }\n\n console.log('')\n\n const deploySpinner = Logger.spinner(`Deploying ${chalk.bold(name)}...`)\n\n try {\n const result = await api.oneClickDeploy({\n name,\n slug: mcphostingConfig?.slug,\n githubUrl: githubUrl || undefined,\n authType: options.auth,\n autoKey: options.autoKey,\n vercelProjectUrl: mcphostingConfig?.vercelUrl,\n })\n\n deploySpinner.succeed('Deployed successfully!')\n\n // Update mcphosting.json with deploy info\n if (mcphostingConfig) {\n try {\n mcphostingConfig.connectionUrl = result.connectionUrl\n mcphostingConfig.projectId = result.projectId\n mcphostingConfig.slug = result.slug\n await writeFile(join(dir, 'mcphosting.json'), JSON.stringify(mcphostingConfig, null, 2) + '\\n')\n } catch {\n // Non-fatal\n }\n }\n\n if (isJson) {\n Logger.json(result)\n } else {\n printOneClickResult(result, options.configure)\n }\n\n if (options.configure && result.connectionUrl) {\n await autoConfigureClients(result.slug, result.connectionUrl)\n }\n } catch (error: any) {\n deploySpinner.fail('Deploy failed')\n Logger.error(error.message)\n\n if (error.message.includes('Authentication') || error.message.includes('Unauthorized')) {\n Logger.info(`Run ${chalk.cyan('mcphosting login')} first.`)\n }\n process.exit(1)\n }\n })\n}\n\nfunction extractRepoName(url: string): string {\n const parts = url.replace(/\\.git$/, '').split('/')\n return parts[parts.length - 1] || 'mcp-server'\n}\n\nfunction printOneClickResult(result: any, showConfigureHint: boolean = false) {\n console.log('')\n console.log(chalk.green.bold(' ✅ Your MCP server is live!'))\n console.log('')\n\n // Connection URL\n Logger.info(` ${chalk.dim('Endpoint:')} ${chalk.blue(result.connectionUrl)}`)\n if (result.slug) {\n Logger.info(` ${chalk.dim('Slug:')} ${chalk.cyan(result.slug)}`)\n }\n if (result.status) {\n const statusColor = result.status === 'deployed' ? chalk.green : chalk.yellow\n Logger.info(` ${chalk.dim('Status:')} ${statusColor(result.status)}`)\n }\n\n // API Key\n if (result.apiKey?.key) {\n console.log('')\n console.log(chalk.bold(' 🔑 API Key (save this — shown only once):'))\n console.log(` ${chalk.green(result.apiKey.key)}`)\n }\n\n // Deployment URL (if provided by API)\n if (result.vercelDeployUrl) {\n console.log('')\n console.log(chalk.bold(' 🌐 Hosted on mcphosting.com infrastructure'))\n console.log(chalk.dim(' Your server is live and managed by MCPHosting.'))\n }\n\n // Client configs\n if (result.clientConfig) {\n console.log('')\n console.log(chalk.bold(' 📋 Add to your AI client:'))\n console.log('')\n\n // Claude Desktop\n console.log(chalk.dim(' Claude Desktop (claude_desktop_config.json):'))\n console.log(chalk.dim(' ─────────────────────────────────────────────'))\n console.log(chalk.white(` ${JSON.stringify(result.clientConfig.claude, null, 2).split('\\n').join('\\n ')}`))\n console.log('')\n\n // Cursor\n console.log(chalk.dim(' Cursor / VS Code (.cursor/mcp.json):'))\n console.log(chalk.dim(' ─────────────────────────────────────────────'))\n console.log(chalk.white(` ${JSON.stringify(result.clientConfig.cursor, null, 2).split('\\n').join('\\n ')}`))\n }\n\n // Quick connect\n console.log('')\n console.log(chalk.dim(' Quick connect:'))\n console.log(chalk.cyan(` mcphosting connect ${result.slug}`))\n\n if (showConfigureHint) {\n console.log('')\n console.log(chalk.dim(' Auto-configure AI clients:'))\n console.log(chalk.cyan(` mcphosting deploy --configure`))\n }\n\n console.log('')\n Logger.info(`Manage at ${chalk.blue(`https://mcphosting.com/dashboard/servers/${result.projectId || result.slug}`)}`)\n console.log('')\n}\n\nasync function autoConfigureClients(slug: string, url: string) {\n const clients = await ClientManager.detectInstalledClients()\n const installed = clients.filter(c => c.exists)\n\n if (installed.length === 0) {\n Logger.info('No AI clients detected. Add the config manually (shown above).')\n return\n }\n\n for (const client of installed) {\n try {\n const success = await ClientManager.addToClient(client.name as any, slug, url)\n if (success) {\n Logger.success(`Configured ${chalk.bold(client.name)}`)\n }\n } catch (error: any) {\n Logger.warning(`Failed to configure ${client.name}: ${error.message}`)\n }\n }\n}\n","import { Config } from './config.js'\nimport { MCPHostingAPI } from './api.js'\nimport { Logger } from './logger.js'\n\n/**\n * Decode a JWT payload without any library.\n * Returns the parsed payload object, or null on failure.\n */\nfunction decodeJwtPayload(token: string): { exp?: number; [key: string]: any } | null {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return null\n // Base64url → Base64 → Buffer → JSON\n const base64 = parts[1].replace(/-/g, '+').replace(/_/g, '/')\n const json = Buffer.from(base64, 'base64').toString('utf-8')\n return JSON.parse(json)\n } catch {\n return null\n }\n}\n\n/**\n * Check if a JWT token is expiring within the given threshold (seconds).\n */\nfunction isTokenExpiringSoon(token: string, thresholdSeconds: number = 300): boolean {\n const payload = decodeJwtPayload(token)\n if (!payload || !payload.exp) return false\n const nowSeconds = Math.floor(Date.now() / 1000)\n return payload.exp - nowSeconds < thresholdSeconds\n}\n\n/**\n * Get an authenticated API instance.\n * Automatically refreshes the token if it's expiring within 5 minutes.\n * Throws with a helpful message if not logged in.\n */\nexport function getAuthenticatedAPI(): { api: MCPHostingAPI; config: Config } {\n const config = new Config()\n let token = config.token\n\n if (!token) {\n Logger.error('Not logged in.')\n Logger.info('Run `mcphosting login` to authenticate.')\n process.exit(1)\n }\n\n // Warn if token is expiring soon (use getAuthenticatedAPIAsync for auto-refresh)\n if (isTokenExpiringSoon(token) && !config.isEnvToken) {\n if (config.refreshToken) {\n Logger.warning('Token expiring soon. Use async auth for auto-refresh, or run `mcphosting login`.')\n } else {\n Logger.warning('Token is expiring soon. Run `mcphosting login` to re-authenticate.')\n }\n }\n\n const api = new MCPHostingAPI(token)\n return { api, config }\n}\n\n/**\n * Get an authenticated API instance with automatic token refresh.\n * This is the async version that actually performs the refresh.\n */\nexport async function getAuthenticatedAPIAsync(): Promise<{ api: MCPHostingAPI; config: Config }> {\n const config = new Config()\n let token = config.token\n\n if (!token) {\n Logger.error('Not logged in.')\n Logger.info('Run `mcphosting login` to authenticate.')\n process.exit(1)\n }\n\n // Check if token is expiring soon and try to refresh\n if (isTokenExpiringSoon(token) && config.refreshToken && !config.isEnvToken) {\n try {\n const tempApi = new MCPHostingAPI()\n const result = await tempApi.refreshToken(config.refreshToken)\n config.token = result.token\n config.refreshToken = result.refresh_token\n token = result.token\n Logger.dim('Token refreshed automatically.')\n } catch (error: any) {\n Logger.warning('Token refresh failed. Run `mcphosting login` to re-authenticate.')\n // Continue with existing token — it may still be valid for a few more minutes\n }\n } else if (isTokenExpiringSoon(token) && !config.refreshToken && !config.isEnvToken) {\n Logger.warning('Token is expiring soon. Run `mcphosting login` to re-authenticate.')\n }\n\n const api = new MCPHostingAPI(token)\n return { api, config }\n}\n\n/**\n * Check if user is authenticated (non-throwing).\n */\nexport function isAuthenticated(): boolean {\n const config = new Config()\n return !!config.token\n}\n","import { readFile, readdir } from 'fs/promises'\nimport { join, basename } from 'path'\nimport { DetectedMCP } from '../types.js'\n\n/**\n * Auto-detect if a directory contains an MCP server.\n * Checks for @modelcontextprotocol/sdk dependency, mcp config files, and Python MCP packages.\n */\nexport async function detectMCP(dir: string): Promise<DetectedMCP | null> {\n try {\n const files = await readdir(dir)\n\n // Look for MCP config files\n const configFiles = files.filter(f =>\n ['mcp.json', 'mcp.config.json', 'mcp.yaml', '.mcprc', 'mcp.config.ts', 'mcp.config.js'].includes(f)\n )\n\n let packageJson: any = null\n let hasMcpSdk = false\n let runtime: 'node' | 'python' | 'unknown' = 'unknown'\n let entryPoint: string | undefined\n\n // Check Node.js project\n if (files.includes('package.json')) {\n try {\n const content = await readFile(join(dir, 'package.json'), 'utf-8')\n packageJson = JSON.parse(content)\n\n hasMcpSdk = !!(\n packageJson?.dependencies?.['@modelcontextprotocol/sdk'] ||\n packageJson?.devDependencies?.['@modelcontextprotocol/sdk']\n )\n\n if (hasMcpSdk || packageJson?.dependencies?.['@modelcontextprotocol/sdk']) {\n runtime = 'node'\n }\n\n // Try to find entry point\n if (packageJson?.main) {\n entryPoint = packageJson.main\n } else if (packageJson?.bin) {\n const bins = typeof packageJson.bin === 'string' ? packageJson.bin : Object.values(packageJson.bin)[0]\n entryPoint = bins as string\n }\n } catch {\n // Invalid package.json\n }\n }\n\n // Check Python project\n if (files.includes('pyproject.toml') || files.includes('requirements.txt') || files.includes('setup.py')) {\n try {\n let pythonDeps = ''\n if (files.includes('requirements.txt')) {\n pythonDeps = await readFile(join(dir, 'requirements.txt'), 'utf-8')\n } else if (files.includes('pyproject.toml')) {\n pythonDeps = await readFile(join(dir, 'pyproject.toml'), 'utf-8')\n }\n\n if (pythonDeps.includes('mcp') || pythonDeps.includes('modelcontextprotocol')) {\n hasMcpSdk = true\n runtime = 'python'\n }\n } catch {\n // Can't read python files\n }\n\n // Common Python MCP entry points\n if (files.includes('server.py')) entryPoint = 'server.py'\n else if (files.includes('main.py')) entryPoint = 'main.py'\n else if (files.includes('app.py')) entryPoint = 'app.py'\n }\n\n // Check for common MCP server patterns in index/main files\n if (!hasMcpSdk && configFiles.length === 0) {\n // Check if any source file imports MCP SDK\n const sourceFiles = files.filter(f => f.endsWith('.ts') || f.endsWith('.js'))\n for (const sf of sourceFiles.slice(0, 5)) {\n try {\n const content = await readFile(join(dir, sf), 'utf-8')\n if (content.includes('@modelcontextprotocol/sdk') || content.includes('McpServer') || content.includes('mcp.server')) {\n hasMcpSdk = true\n runtime = sf.endsWith('.py') ? 'python' : 'node'\n if (!entryPoint) entryPoint = sf\n break\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n\n if (!hasMcpSdk && configFiles.length === 0) {\n return null // Not an MCP server\n }\n\n // Read MCP config if present\n let mcpConfig: any = null\n if (configFiles.length > 0) {\n try {\n const configContent = await readFile(join(dir, configFiles[0]), 'utf-8')\n mcpConfig = JSON.parse(configContent)\n } catch {\n // Config might be YAML or invalid\n }\n }\n\n const name = packageJson?.name || basename(dir)\n\n return {\n name,\n hasMcpSdk,\n configFiles,\n packageJson,\n mcpConfig,\n runtime,\n entryPoint,\n }\n } catch {\n return null\n }\n}\n","import { readFile, writeFile, access } from 'fs/promises';\nimport { join, dirname } from 'path';\nimport { homedir } from 'os';\nimport { mkdir } from 'fs/promises';\nimport { ClientConfig, ClaudeConfig, CursorConfig, MCPServerEntry, SupportedClient } from '../types.js';\nimport { Logger } from './logger.js';\n\nexport class ClientManager {\n private static getClientPaths(): Record<SupportedClient, string> {\n const home = homedir();\n const platform = process.platform;\n \n const paths: Record<SupportedClient, string> = {\n claude: platform === 'win32' \n ? join(process.env.APPDATA || '', 'Claude', 'claude_desktop_config.json')\n : join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json'),\n cursor: join(home, '.cursor', 'mcp.json'),\n vscode: join(process.cwd(), '.vscode', 'mcp.json'),\n openclaw: join(home, '.openclaw', 'mcp.json'),\n chatgpt: '' // Web-based, no local config\n };\n\n return paths;\n }\n\n static async detectInstalledClients(): Promise<ClientConfig[]> {\n const paths = this.getClientPaths();\n const clients: ClientConfig[] = [];\n\n for (const [name, path] of Object.entries(paths)) {\n if (name === 'chatgpt') continue; // Skip web-based clients\n \n try {\n await access(path);\n clients.push({ name, configPath: path, exists: true });\n } catch {\n clients.push({ name, configPath: path, exists: false });\n }\n }\n\n return clients;\n }\n\n static async addToClient(\n client: SupportedClient,\n slug: string,\n url: string\n ): Promise<boolean> {\n if (client === 'chatgpt') {\n Logger.info('ChatGPT Setup Instructions:');\n console.log(`\n1. Open ChatGPT in your browser\n2. Go to Settings → Apps → Connect an app\n3. Enter this URL: ${url}\n4. Follow the prompts to authorize the MCP server\n `);\n return true;\n }\n\n const paths = this.getClientPaths();\n const configPath = paths[client];\n \n if (!configPath) {\n throw new Error(`Unsupported client: ${client}`);\n }\n\n const serverEntry: MCPServerEntry = {\n command: 'npx',\n args: ['-y', 'mcphosting-cli', 'proxy', url],\n env: {}\n };\n\n try {\n // Ensure directory exists\n await mkdir(dirname(configPath), { recursive: true });\n\n let config: ClaudeConfig | CursorConfig = { mcpServers: {} };\n\n // Read existing config if it exists\n try {\n const configContent = await readFile(configPath, 'utf-8');\n config = JSON.parse(configContent);\n if (!config.mcpServers) {\n config.mcpServers = {};\n }\n } catch {\n // File doesn't exist or is invalid, use default config\n }\n\n // Add the MCP server\n config.mcpServers[slug] = serverEntry;\n\n // Write back to file\n await writeFile(configPath, JSON.stringify(config, null, 2));\n return true;\n } catch (error) {\n Logger.error(`Failed to configure ${client}: ${error}`);\n return false;\n }\n }\n\n static async removeFromClient(\n client: SupportedClient,\n slug: string\n ): Promise<boolean> {\n if (client === 'chatgpt') {\n Logger.info('To remove from ChatGPT:');\n console.log(`\n1. Open ChatGPT in your browser\n2. Go to Settings → Apps\n3. Find and disconnect the MCP server: ${slug}\n `);\n return true;\n }\n\n const paths = this.getClientPaths();\n const configPath = paths[client];\n \n if (!configPath) {\n throw new Error(`Unsupported client: ${client}`);\n }\n\n try {\n const configContent = await readFile(configPath, 'utf-8');\n const config: ClaudeConfig | CursorConfig = JSON.parse(configContent);\n\n if (config.mcpServers && config.mcpServers[slug]) {\n delete config.mcpServers[slug];\n await writeFile(configPath, JSON.stringify(config, null, 2));\n return true;\n }\n\n return false;\n } catch (error) {\n Logger.error(`Failed to remove from ${client}: ${error}`);\n return false;\n }\n }\n\n static async removeFromAllClients(slug: string): Promise<string[]> {\n const clients = await this.detectInstalledClients();\n const removed: string[] = [];\n\n for (const client of clients) {\n if (!client.exists) continue;\n \n try {\n const success = await this.removeFromClient(client.name as SupportedClient, slug);\n if (success) {\n removed.push(client.name);\n }\n } catch (error) {\n Logger.warning(`Failed to remove from ${client.name}: ${error}`);\n }\n }\n\n return removed;\n }\n\n static resolveUrl(urlOrSlug: string): string {\n // If it's already a full URL, return as-is\n if (urlOrSlug.startsWith('http://') || urlOrSlug.startsWith('https://')) {\n return urlOrSlug;\n }\n\n // Otherwise, assume it's a slug and construct the mcphost.dev URL\n return `https://${urlOrSlug}.mcphost.dev`;\n }\n\n static extractSlug(url: string): string {\n // Extract slug from URLs like https://myserver.mcphost.dev\n if (url.includes('.mcphost.dev')) {\n const match = url.match(/https?:\\/\\/([^.]+)\\.mcphost\\.dev/);\n if (match) {\n return match[1];\n }\n }\n\n // For other URLs, use the hostname or a hash of the URL\n try {\n const parsed = new URL(url);\n return parsed.hostname.replace(/\\./g, '-');\n } catch {\n // If URL parsing fails, create a simple hash\n return url.replace(/[^a-zA-Z0-9]/g, '-').slice(0, 20);\n }\n }\n}","import { Command } from 'commander'\nimport { readFile, writeFile, access } from 'fs/promises'\nimport { join, basename } from 'path'\nimport { detectMCP } from '../lib/detector.js'\nimport { Logger } from '../lib/logger.js'\nimport chalk from 'chalk'\n\nconst TEMPLATES = [\n { name: 'weather', description: 'Weather data MCP server', repo: 'gorlomi-enzo/mcp-template-weather' },\n { name: 'crypto', description: 'Crypto prices & portfolio MCP', repo: 'gorlomi-enzo/mcp-template-crypto' },\n { name: 'notion', description: 'Notion integration MCP', repo: 'gorlomi-enzo/mcp-template-notion' },\n { name: 'postgres', description: 'PostgreSQL query MCP', repo: 'gorlomi-enzo/mcp-template-postgres' },\n { name: 'blank', description: 'Minimal MCP server scaffold', repo: 'gorlomi-enzo/mcp-template-blank' },\n]\n\nexport function createInitCommand(): Command {\n return new Command('init')\n .description('Initialize mcphosting.json in the current directory')\n .option('--name <name>', 'Project name')\n .option('--template <template>', 'Initialize from a template')\n .option('--list-templates', 'List available templates')\n .action(async (options) => {\n console.log('')\n console.log(chalk.bold('📦 MCPHosting Init'))\n console.log('')\n\n // List templates\n if (options.listTemplates) {\n console.log(chalk.bold('Available templates:'))\n console.log('')\n for (const t of TEMPLATES) {\n console.log(` ${chalk.cyan(t.name.padEnd(12))} ${chalk.dim(t.description)}`)\n console.log(` ${chalk.dim(` github.com/${t.repo}`)}`)\n console.log('')\n }\n console.log(chalk.dim(`Usage: mcphosting init --template <name>`))\n return\n }\n\n const dir = process.cwd()\n const configPath = join(dir, 'mcphosting.json')\n\n // Check if config already exists\n try {\n await access(configPath)\n Logger.warning('mcphosting.json already exists in this directory.')\n Logger.info(`Edit it manually or delete it and run ${chalk.cyan('mcphosting init')} again.`)\n return\n } catch {\n // File doesn't exist, good\n }\n\n // Detect project info\n const detected = await detectMCP(dir)\n const projectName = options.name || detected?.name || basename(dir)\n const slug = projectName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 60)\n\n // Try to detect GitHub remote\n let githubUrl: string | null = null\n try {\n const { execSync } = await import('child_process')\n const remoteUrl = execSync('git remote get-url origin', { cwd: dir, encoding: 'utf-8' }).trim()\n if (remoteUrl.includes('github.com')) {\n githubUrl = remoteUrl\n .replace(/^git@github\\.com:/, 'https://github.com/')\n .replace(/\\.git$/, '')\n }\n } catch {\n // Not a git repo\n }\n\n const config: Record<string, any> = {\n $schema: 'https://mcphosting.com/schema/mcphosting.json',\n name: projectName,\n slug,\n version: '1.0.0',\n server: {\n transport: 'streamable-http',\n port: 3000,\n path: '/mcp',\n },\n }\n\n if (githubUrl) {\n config.github = githubUrl\n }\n\n if (options.template) {\n config.template = options.template\n }\n\n await writeFile(configPath, JSON.stringify(config, null, 2) + '\\n')\n\n Logger.success(`Created ${chalk.bold('mcphosting.json')}`)\n console.log('')\n console.log(chalk.dim(JSON.stringify(config, null, 2)))\n console.log('')\n\n if (detected?.hasMcpSdk) {\n Logger.info(`Detected MCP SDK (${detected.runtime})`)\n }\n\n if (githubUrl) {\n Logger.info(`GitHub: ${chalk.blue(githubUrl)}`)\n }\n\n console.log('')\n Logger.info(`Next: ${chalk.cyan('mcphosting deploy')} to deploy your MCP server`)\n console.log('')\n })\n}\n","import { Command } from 'commander'\nimport { Config } from '../lib/config.js'\nimport { ClientManager } from '../lib/clients.js'\nimport { Logger } from '../lib/logger.js'\nimport { SupportedClient } from '../types.js'\nimport chalk from 'chalk'\n\nexport function createConnectCommand(): Command {\n return new Command('connect')\n .description('Connect an MCP server to your AI clients')\n .argument('<url-or-slug>', 'MCP server URL or slug (e.g. github, notion, https://my-mcp.com)')\n .option('--client <client>', 'Target specific client: claude, cursor, vscode, openclaw, chatgpt')\n .option('--name <name>', 'Custom name for the connection')\n .action(async (urlOrSlug: string, options) => {\n const config = new Config()\n const spinner = Logger.spinner('Setting up MCP connection...')\n\n try {\n const url = ClientManager.resolveUrl(urlOrSlug)\n const slug = ClientManager.extractSlug(url)\n const name = options.name || slug\n\n // Check if already connected\n const existing = config.findConnection(slug)\n if (existing) {\n spinner.warn(`Already connected to ${chalk.cyan(slug)}`)\n Logger.info(`Use ${chalk.cyan(`mcphosting disconnect ${slug}`)} to remove first`)\n return\n }\n\n const clients: string[] = []\n\n if (options.client) {\n const clientName = options.client as SupportedClient\n const success = await ClientManager.addToClient(clientName, slug, url)\n\n if (success) {\n clients.push(clientName)\n spinner.succeed(`Connected ${chalk.bold(name)} to ${chalk.green(clientName)}`)\n } else {\n spinner.fail(`Failed to connect to ${clientName}`)\n process.exit(1)\n }\n } else {\n // Auto-detect and connect to all available clients\n const detectedClients = await ClientManager.detectInstalledClients()\n const availableClients = detectedClients.filter(c => c.exists)\n\n if (availableClients.length === 0) {\n spinner.warn('No supported AI clients detected')\n Logger.info('Supported: Claude Desktop, Cursor, VS Code, OpenClaw')\n Logger.info(`Use ${chalk.cyan('--client chatgpt')} for web-based setup`)\n return\n }\n\n spinner.text = `Configuring ${availableClients.length} client${availableClients.length > 1 ? 's' : ''}...`\n\n for (const client of availableClients) {\n try {\n const success = await ClientManager.addToClient(\n client.name as SupportedClient,\n slug,\n url\n )\n if (success) {\n clients.push(client.name)\n }\n } catch (error) {\n Logger.warning(`Failed to configure ${client.name}: ${error}`)\n }\n }\n\n spinner.succeed(`Connected ${chalk.bold(name)} to ${clients.length} client${clients.length > 1 ? 's' : ''}`)\n }\n\n // Save connection\n config.addConnection({ slug, url, clients })\n\n console.log('')\n Logger.info(` URL: ${chalk.dim(url)}`)\n Logger.info(` Clients: ${chalk.dim(clients.join(', '))}`)\n console.log('')\n console.log(chalk.green('🎉 Share with your team:'))\n console.log(chalk.cyan(` npx mcphosting-cli connect ${urlOrSlug}`))\n console.log('')\n\n } catch (error: any) {\n spinner.fail('Connection failed')\n Logger.error(error.message)\n process.exit(1)\n }\n })\n}\n\nexport function createDisconnectCommand(): Command {\n return new Command('disconnect')\n .description('Disconnect an MCP server')\n .argument('<slug-or-id>', 'MCP server slug or connection ID')\n .action(async (slugOrId: string) => {\n const config = new Config()\n const connection = config.findConnection(slugOrId)\n\n if (!connection) {\n Logger.error(`Connection not found: ${slugOrId}`)\n Logger.info(`Use ${chalk.cyan('mcphosting list')} to see active connections`)\n return\n }\n\n const spinner = Logger.spinner(`Disconnecting ${connection.slug}...`)\n\n try {\n const removedFrom = await ClientManager.removeFromAllClients(connection.slug)\n config.removeConnection(connection.id)\n\n spinner.succeed(`Disconnected ${chalk.bold(connection.slug)}`)\n\n if (removedFrom.length > 0) {\n Logger.info(`Removed from: ${removedFrom.join(', ')}`)\n }\n } catch (error: any) {\n spinner.fail('Disconnect failed')\n Logger.error(error.message)\n }\n })\n}\n","import { Command } from 'commander'\nimport { Config } from '../lib/config.js'\nimport { getAuthenticatedAPI } from '../lib/auth.js'\nimport { isAuthenticated } from '../lib/auth.js'\nimport { Logger } from '../lib/logger.js'\nimport chalk from 'chalk'\n\nexport function createListCommand(): Command {\n return new Command('list')\n .description('List your MCP servers')\n .option('--local', 'Show locally connected servers only')\n .option('--remote', 'Show deployed servers only (requires login)')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const isJson = options.json || Logger.isJsonMode\n // Default: show both local connections and remote servers\n const showLocal = options.local || (!options.local && !options.remote)\n const showRemote = options.remote || (!options.local && !options.remote)\n\n // --- Local connections ---\n if (showLocal) {\n const config = new Config()\n const connections = config.connections\n\n if (connections.length > 0) {\n if (isJson && !showRemote) {\n Logger.json(connections)\n return\n }\n\n console.log('')\n Logger.bold(`📋 Connected MCP Servers (${connections.length})`)\n console.log('')\n\n const tableData = connections.map(conn => ({\n Slug: conn.slug,\n URL: conn.url.length > 50 ? conn.url.slice(0, 47) + '...' : conn.url,\n Clients: conn.clients.join(', '),\n Added: new Date(conn.addedAt).toLocaleDateString()\n }))\n\n Logger.table(tableData)\n console.log('')\n } else if (!showRemote) {\n Logger.info('No local MCP connections.')\n Logger.dim(`Use ${chalk.cyan('mcphosting connect <slug>')} to connect one.`)\n return\n }\n }\n\n // --- Remote deployed servers ---\n if (showRemote && isAuthenticated()) {\n const { api } = getAuthenticatedAPI()\n const spinner = Logger.spinner('Fetching deployed servers...')\n\n try {\n const servers = await api.listServers()\n spinner.stop()\n\n if (servers.length === 0) {\n if (!showLocal) {\n Logger.info('No deployed servers yet.')\n Logger.dim(`Use ${chalk.cyan('mcphosting deploy')} to deploy your first MCP server.`)\n }\n return\n }\n\n if (isJson) {\n Logger.json(servers)\n return\n }\n\n Logger.bold(`🖥️ Deployed Servers (${servers.length})`)\n console.log('')\n\n const tableData = servers.map((s: any) => ({\n Name: s.name || s.slug,\n Status: s.status === 'active' ? chalk.green('● active') :\n s.status === 'deploying' ? chalk.yellow('◐ deploying') :\n s.status === 'stopped' ? chalk.dim('○ stopped') :\n chalk.red('✗ ' + s.status),\n Slug: s.slug,\n URL: (s.url || '').length > 45 ? (s.url || '').slice(0, 42) + '...' : (s.url || ''),\n }))\n\n Logger.table(tableData)\n console.log('')\n } catch (error: any) {\n spinner.fail('Failed to fetch servers')\n Logger.error(error.message)\n }\n } else if (showRemote && !isAuthenticated()) {\n Logger.dim(`Log in to see deployed servers: ${chalk.cyan('mcphosting login')}`)\n console.log('')\n }\n })\n}\n","import { Command } from 'commander'\nimport { getAuthenticatedAPI } from '../lib/auth.js'\nimport { Logger } from '../lib/logger.js'\nimport chalk from 'chalk'\n\nexport function createStatusCommand(): Command {\n return new Command('status')\n .description('Check the status of a deployed MCP server')\n .argument('<slug-or-id>', 'Server slug or ID')\n .option('--json', 'Output as JSON')\n .action(async (slugOrId: string, options) => {\n const isJson = options.json || Logger.isJsonMode\n const { api } = getAuthenticatedAPI()\n const spinner = Logger.spinner(`Checking status of ${chalk.cyan(slugOrId)}...`)\n\n try {\n const server = await api.getServer(slugOrId)\n spinner.stop()\n\n if (isJson) {\n Logger.json(server)\n return\n }\n\n console.log('')\n console.log(chalk.bold(`📡 ${server.name || server.slug}`))\n console.log('')\n\n const statusIcon = server.status === 'active' ? chalk.green('● Active') :\n server.status === 'deploying' ? chalk.yellow('◐ Deploying') :\n server.status === 'stopped' ? chalk.dim('○ Stopped') :\n chalk.red('✗ ' + server.status)\n\n const info = [\n { Property: 'Status', Value: statusIcon },\n { Property: 'Slug', Value: server.slug },\n { Property: 'URL', Value: server.url || '—' },\n ]\n\n if (server.sseUrl) {\n info.push({ Property: 'SSE URL', Value: server.sseUrl })\n }\n if (server.streamableUrl) {\n info.push({ Property: 'Streamable', Value: server.streamableUrl })\n }\n if (server.githubUrl) {\n info.push({ Property: 'GitHub', Value: server.githubUrl })\n }\n\n info.push(\n { Property: 'Created', Value: server.createdAt ? new Date(server.createdAt).toLocaleString() : '—' },\n { Property: 'Updated', Value: server.updatedAt ? new Date(server.updatedAt).toLocaleString() : '—' },\n )\n\n Logger.table(info)\n\n if (server.tools && server.tools.length > 0) {\n console.log('')\n console.log(chalk.yellow('🔧 Tools:'))\n server.tools.forEach(tool => {\n console.log(` • ${tool}`)\n })\n }\n\n if (server.envVars && server.envVars.length > 0) {\n console.log('')\n console.log(chalk.yellow('🔑 Environment Variables:'))\n server.envVars.forEach(env => {\n console.log(` ${env.key} = ${env.masked ? '••••••••' : '(set)'}`)\n })\n }\n\n console.log('')\n } catch (error: any) {\n spinner.fail('Failed to get status')\n Logger.error(error.message)\n process.exit(1)\n }\n })\n}\n","import { Command } from 'commander'\nimport { getAuthenticatedAPI } from '../lib/auth.js'\nimport { Logger } from '../lib/logger.js'\nimport chalk from 'chalk'\n\nexport function createLogsCommand(): Command {\n return new Command('logs')\n .description('View logs for a deployed MCP server')\n .argument('<slug-or-id>', 'Server slug or ID')\n .option('-n, --lines <number>', 'Number of log lines to show', '50')\n .option('--json', 'Output as JSON')\n .action(async (slugOrId: string, options) => {\n const isJson = options.json || Logger.isJsonMode\n const { api } = getAuthenticatedAPI()\n const lines = parseInt(options.lines)\n const spinner = Logger.spinner(`Fetching logs for ${chalk.cyan(slugOrId)}...`)\n\n try {\n const logs = await api.getServerLogs(slugOrId, lines)\n spinner.stop()\n\n if (logs.length === 0) {\n if (isJson) {\n console.log(JSON.stringify({ success: true, logs: [] }))\n } else {\n Logger.info('No logs available yet.')\n }\n return\n }\n\n if (isJson) {\n Logger.json(logs)\n return\n }\n\n console.log('')\n console.log(chalk.bold(`📜 Logs: ${slugOrId}`))\n console.log(chalk.dim('─'.repeat(60)))\n console.log('')\n\n for (const entry of logs) {\n const time = chalk.dim(new Date(entry.timestamp).toLocaleTimeString())\n const level = entry.level === 'error' ? chalk.red('ERR') :\n entry.level === 'warn' ? chalk.yellow('WRN') :\n entry.level === 'debug' ? chalk.dim('DBG') :\n chalk.blue('INF')\n\n console.log(`${time} ${level} ${entry.message}`)\n }\n\n console.log('')\n console.log(chalk.dim(`Showing last ${logs.length} entries`))\n console.log('')\n\n } catch (error: any) {\n spinner.fail('Failed to fetch logs')\n Logger.error(error.message)\n process.exit(1)\n }\n })\n}\n","import { Command } from 'commander'\nimport { getAuthenticatedAPI } from '../lib/auth.js'\nimport { Logger } from '../lib/logger.js'\nimport chalk from 'chalk'\n\nexport function createEnvCommand(): Command {\n const env = new Command('env')\n .description('Manage environment variables for a deployed MCP server')\n\n env\n .command('list')\n .description('List environment variables')\n .argument('<slug-or-id>', 'Server slug or ID')\n .option('--json', 'Output as JSON')\n .action(async (slugOrId: string, options) => {\n const { api } = getAuthenticatedAPI()\n const spinner = Logger.spinner('Fetching environment variables...')\n\n try {\n const envVars = await api.listEnvVars(slugOrId)\n spinner.stop()\n\n if (envVars.length === 0) {\n Logger.info('No environment variables set.')\n Logger.dim(`Add one: ${chalk.cyan(`mcphosting env set ${slugOrId} KEY=value`)}`)\n return\n }\n\n if (options.json) {\n Logger.json(envVars)\n return\n }\n\n console.log('')\n Logger.bold(`🔑 Environment Variables: ${slugOrId}`)\n console.log('')\n\n envVars.forEach(env => {\n console.log(` ${chalk.cyan(env.key)} = ${env.masked ? chalk.dim('••••••••') : chalk.dim('(set)')}`)\n })\n\n console.log('')\n } catch (error: any) {\n spinner.fail('Failed to fetch environment variables')\n Logger.error(error.message)\n process.exit(1)\n }\n })\n\n env\n .command('set')\n .description('Set an environment variable (KEY=value)')\n .argument('<slug-or-id>', 'Server slug or ID')\n .argument('<key-value>', 'Environment variable in KEY=value format')\n .action(async (slugOrId: string, keyValue: string) => {\n const eqIndex = keyValue.indexOf('=')\n if (eqIndex === -1) {\n Logger.error('Invalid format. Use KEY=value')\n Logger.dim(`Example: ${chalk.cyan(`mcphosting env set ${slugOrId} API_KEY=sk-abc123`)}`)\n process.exit(1)\n }\n\n const key = keyValue.substring(0, eqIndex)\n const value = keyValue.substring(eqIndex + 1)\n\n if (!key) {\n Logger.error('Key cannot be empty.')\n process.exit(1)\n }\n\n const { api } = getAuthenticatedAPI()\n const spinner = Logger.spinner(`Setting ${chalk.cyan(key)}...`)\n\n try {\n await api.addEnvVar(slugOrId, key, value)\n spinner.succeed(`Set ${chalk.bold(key)} on ${chalk.cyan(slugOrId)}`)\n } catch (error: any) {\n spinner.fail(`Failed to set ${key}`)\n Logger.error(error.message)\n process.exit(1)\n }\n })\n\n env\n .command('remove')\n .description('Remove an environment variable')\n .argument('<slug-or-id>', 'Server slug or ID')\n .argument('<key>', 'Environment variable key to remove')\n .action(async (slugOrId: string, key: string) => {\n const { api } = getAuthenticatedAPI()\n const spinner = Logger.spinner(`Removing ${chalk.cyan(key)}...`)\n\n try {\n await api.removeEnvVar(slugOrId, key)\n spinner.succeed(`Removed ${chalk.bold(key)} from ${chalk.cyan(slugOrId)}`)\n } catch (error: any) {\n spinner.fail(`Failed to remove ${key}`)\n Logger.error(error.message)\n process.exit(1)\n }\n })\n\n return env\n}\n","import { Command } from 'commander'\nimport { getAuthenticatedAPI } from '../lib/auth.js'\nimport { Logger } from '../lib/logger.js'\nimport chalk from 'chalk'\n\nexport function createKeysCommand(): Command {\n const keys = new Command('keys')\n .description('Manage API keys')\n\n keys\n .command('list')\n .description('List your API keys')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const { api } = getAuthenticatedAPI()\n const spinner = Logger.spinner('Fetching API keys...')\n\n try {\n const apiKeys = await api.getAPIKeys()\n spinner.stop()\n\n if (apiKeys.length === 0) {\n Logger.info('No API keys found.')\n Logger.dim(`Create one: ${chalk.cyan('mcphosting keys create \"My Key\"')}`)\n return\n }\n\n if (options.json) {\n Logger.json(apiKeys)\n return\n }\n\n console.log('')\n Logger.bold(`🔑 API Keys (${apiKeys.length})`)\n console.log('')\n\n const tableData = apiKeys.map(key => ({\n Name: key.name,\n Prefix: key.prefix + '...',\n Created: new Date(key.createdAt).toLocaleDateString(),\n 'Last Used': key.lastUsedAt ? new Date(key.lastUsedAt).toLocaleDateString() : 'Never',\n }))\n\n Logger.table(tableData)\n console.log('')\n } catch (error: any) {\n spinner.fail('Failed to fetch API keys')\n Logger.error(error.message)\n process.exit(1)\n }\n })\n\n keys\n .command('create')\n .description('Create a new API key')\n .argument('<name>', 'Name for the API key')\n .action(async (name: string) => {\n const { api } = getAuthenticatedAPI()\n const spinner = Logger.spinner('Creating API key...')\n\n try {\n const key = await api.createAPIKey(name)\n spinner.succeed('API key created!')\n\n console.log('')\n Logger.bold('🔑 New API Key')\n console.log('')\n Logger.info(` Name: ${chalk.bold(key.name)}`)\n Logger.info(` Key: ${chalk.green(key.key || key.prefix + '...')}`)\n Logger.info(` ID: ${chalk.dim(key.id)}`)\n console.log('')\n Logger.warning('Save this key now — it won\\'t be shown again!')\n console.log('')\n } catch (error: any) {\n spinner.fail('Failed to create API key')\n Logger.error(error.message)\n process.exit(1)\n }\n })\n\n keys\n .command('delete')\n .description('Delete an API key')\n .argument('<id>', 'API key ID')\n .action(async (id: string) => {\n const { api } = getAuthenticatedAPI()\n const spinner = Logger.spinner('Deleting API key...')\n\n try {\n await api.deleteAPIKey(id)\n spinner.succeed(`API key ${chalk.dim(id)} deleted.`)\n } catch (error: any) {\n spinner.fail('Failed to delete API key')\n Logger.error(error.message)\n process.exit(1)\n }\n })\n\n return keys\n}\n","import { Command } from 'commander'\nimport { MCPHostingAPI } from '../lib/api.js'\nimport { Config } from '../lib/config.js'\nimport { Logger } from '../lib/logger.js'\nimport chalk from 'chalk'\n\nexport function createSearchCommand(): Command {\n return new Command('search')\n .description('Search MCP servers in the marketplace')\n .argument('<query>', 'Search query')\n .option('--limit <number>', 'Maximum number of results', '10')\n .option('--json', 'Output as JSON')\n .action(async (query: string, options) => {\n const config = new Config()\n const api = new MCPHostingAPI(config.token)\n const spinner = Logger.spinner(`Searching for \"${query}\"...`)\n\n try {\n const results = await api.searchMCPs(query)\n spinner.succeed(`Found ${results.length} MCP server(s)`)\n\n if (results.length === 0) {\n Logger.info('No MCP servers found.')\n Logger.dim('Try: github, slack, notion, stripe, postgres, filesystem')\n return\n }\n\n const limit = parseInt(options.limit)\n const limitedResults = results.slice(0, limit)\n\n if (options.json) {\n Logger.json(limitedResults)\n return\n }\n\n console.log('')\n Logger.bold('🔍 Marketplace Results')\n console.log('')\n\n limitedResults.forEach((server, index) => {\n console.log(chalk.cyan(`${index + 1}. ${server.name}`))\n console.log(` ${chalk.dim(server.description)}`)\n console.log(` ${chalk.yellow('Slug:')} ${server.slug} | ${chalk.yellow('Installs:')} ${server.installs.toLocaleString()} | ${chalk.yellow('By:')} ${server.author}`)\n console.log(` ${chalk.green('Tools:')} ${server.tools.join(', ')}`)\n console.log(` ${chalk.blue('Connect:')} ${chalk.dim(`mcphosting connect ${server.slug}`)}`)\n console.log('')\n })\n\n if (results.length > limit) {\n Logger.dim(`Showing ${limit} of ${results.length}. Use --limit for more.`)\n }\n } catch (error: any) {\n spinner.fail('Search failed')\n Logger.error(error.message)\n process.exit(1)\n }\n })\n}\n\nexport function createInfoCommand(): Command {\n return new Command('info')\n .description('Show detailed information about an MCP server')\n .argument('<slug>', 'MCP server slug')\n .option('--json', 'Output as JSON')\n .action(async (slug: string, options) => {\n const config = new Config()\n const api = new MCPHostingAPI(config.token)\n const spinner = Logger.spinner(`Getting info for ${slug}...`)\n\n try {\n const server = await api.getMCPInfo(slug)\n\n if (!server) {\n spinner.fail(`Not found: ${slug}`)\n Logger.info(`Use ${chalk.cyan('mcphosting search <query>')} to find servers`)\n return\n }\n\n spinner.stop()\n\n if (options.json) {\n Logger.json(server)\n return\n }\n\n console.log('')\n console.log(chalk.bold.cyan(`📦 ${server.name}`))\n console.log(chalk.dim(server.description))\n console.log('')\n\n const info = [\n { Property: 'Slug', Value: server.slug },\n { Property: 'Author', Value: server.author },\n { Property: 'Installs', Value: server.installs.toLocaleString() },\n { Property: 'Tools', Value: server.tools.length.toString() },\n ]\n if (server.url) {\n info.push({ Property: 'URL', Value: server.url })\n }\n\n Logger.table(info)\n\n console.log('')\n console.log(chalk.yellow('🔧 Available Tools:'))\n server.tools.forEach(tool => console.log(` • ${tool}`))\n\n console.log('')\n console.log(chalk.green('💡 Quick Start:'))\n console.log(chalk.dim(` mcphosting connect ${server.slug}`))\n\n const connection = config.findConnection(slug)\n if (connection) {\n console.log('')\n console.log(chalk.blue('ℹ️ Already connected to:'), connection.clients.join(', '))\n }\n\n console.log('')\n } catch (error: any) {\n spinner.fail('Failed to get info')\n Logger.error(error.message)\n process.exit(1)\n }\n })\n}\n","import { Command } from 'commander';\nimport { readFile, access } from 'fs/promises';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { Config } from '../lib/config.js';\nimport { ClientManager } from '../lib/clients.js';\nimport { Logger } from '../lib/logger.js';\nimport chalk from 'chalk';\n\ninterface SmitheryConfig {\n servers?: Record<string, {\n url?: string;\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n }>;\n mcpServers?: Record<string, {\n url?: string;\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n }>;\n}\n\nexport function createImportCommand(): Command {\n return new Command('import')\n .description('Import MCP connections from other tools')\n .option('--from <tool>', 'Import from: smithery', 'smithery')\n .option('--dry-run', 'Show what would be imported without actually importing')\n .option('--config-path <path>', 'Custom config file path')\n .action(async (options) => {\n if (options.from !== 'smithery') {\n Logger.error('Only Smithery import is currently supported');\n Logger.info('Usage: mcphost import --from smithery');\n return;\n }\n\n await importFromSmitery(options);\n });\n}\n\nasync function importFromSmitery(options: { dryRun?: boolean; configPath?: string }) {\n const config = new Config();\n const spinner = Logger.spinner('Looking for Smithery config...');\n\n try {\n // Try to find Smithery config\n const smitheryPaths = [\n options.configPath,\n join(homedir(), '.smithery', 'config.json'),\n join(homedir(), '.config', 'smithery', 'config.json'),\n join(homedir(), 'Library', 'Application Support', 'smithery', 'config.json'),\n join(process.cwd(), 'smithery.json'),\n join(process.cwd(), '.smithery.json')\n ].filter(Boolean) as string[];\n\n let smitheryConfigPath: string | null = null;\n for (const path of smitheryPaths) {\n try {\n await access(path);\n smitheryConfigPath = path;\n break;\n } catch {\n // Continue to next path\n }\n }\n\n if (!smitheryConfigPath) {\n spinner.fail('Smithery config not found');\n Logger.warning('Searched locations:');\n smitheryPaths.forEach(path => Logger.dim(` ${path}`));\n Logger.info('\\nIf Smithery is installed, you can specify the config path:');\n Logger.info(' mcphost import --from smithery --config-path /path/to/smithery/config.json');\n return;\n }\n\n spinner.succeed(`Found Smithery config: ${smitheryConfigPath}`);\n\n // Read and parse Smithery config\n const loadSpinner = Logger.spinner('Reading Smithery config...');\n const configContent = await readFile(smitheryConfigPath, 'utf-8');\n const smitheryConfig: SmitheryConfig = JSON.parse(configContent);\n \n // Extract MCP servers from both possible locations\n const servers = {\n ...smitheryConfig.servers,\n ...smitheryConfig.mcpServers\n };\n\n if (!servers || Object.keys(servers).length === 0) {\n loadSpinner.warn('No MCP servers found in Smithery config');\n return;\n }\n\n const serverEntries = Object.entries(servers);\n loadSpinner.succeed(`Found ${serverEntries.length} MCP server(s) in Smithery config`);\n\n if (options.dryRun) {\n console.log('\\n' + chalk.bold('🔍 Preview: Would import the following MCP servers:'));\n console.log('');\n \n serverEntries.forEach(([slug, serverConfig]) => {\n const url = serverConfig.url || `https://${slug}.mcphost.dev`;\n console.log(`• ${chalk.cyan(slug)}`);\n console.log(` URL: ${chalk.dim(url)}`);\n \n if (serverConfig.command) {\n console.log(` Command: ${chalk.dim(serverConfig.command + ' ' + (serverConfig.args?.join(' ') || ''))}`);\n }\n \n console.log('');\n });\n\n Logger.info('Run without --dry-run to perform the import');\n return;\n }\n\n // Actually import the servers\n const importSpinner = Logger.spinner('Importing MCP servers...');\n let imported = 0;\n let skipped = 0;\n\n for (const [slug, serverConfig] of serverEntries) {\n try {\n // Check if already exists\n const existing = config.findConnection(slug);\n if (existing) {\n Logger.warning(`Skipping ${slug} - already connected`);\n skipped++;\n continue;\n }\n\n // Determine URL\n let url = serverConfig.url;\n if (!url) {\n // If no URL but has command, try to extract from args\n if (serverConfig.command === 'npx' && serverConfig.args?.[0] === 'mcphosting-cli') {\n url = serverConfig.args[2]; // Should be the URL after 'proxy'\n } else {\n // Default to mcphost.dev format\n url = `https://${slug}.mcphost.dev`;\n }\n }\n\n if (!url) {\n Logger.warning(`Skipping ${slug} - no URL found`);\n skipped++;\n continue;\n }\n\n // Connect to available clients\n const detectedClients = await ClientManager.detectInstalledClients();\n const availableClients = detectedClients.filter(c => c.exists);\n const connectedClients: string[] = [];\n\n for (const client of availableClients) {\n try {\n const success = await ClientManager.addToClient(\n client.name as any, \n slug, \n url\n );\n \n if (success) {\n connectedClients.push(client.name);\n }\n } catch (error) {\n // Continue with other clients\n }\n }\n\n // Save connection\n config.addConnection({\n slug,\n url,\n clients: connectedClients\n });\n\n imported++;\n\n } catch (error) {\n Logger.warning(`Failed to import ${slug}: ${error}`);\n skipped++;\n }\n }\n\n importSpinner.succeed('Import completed');\n \n Logger.success(`✅ Imported ${imported} MCP server(s)`);\n if (skipped > 0) {\n Logger.warning(`⚠️ Skipped ${skipped} server(s)`);\n }\n\n console.log('');\n Logger.info('Use `mcphost list` to see your imported connections');\n \n // Growth hacking message\n console.log('\\n' + chalk.green('🎉 Welcome to MCPHosting! Share with your team:'));\n console.log(chalk.cyan('npx mcphosting-cli import --from smithery'));\n console.log('\\n' + chalk.yellow('⭐ Star us: ') + chalk.blue('https://github.com/gorlomi-enzo/mcphosting-cli'));\n console.log('');\n\n } catch (error) {\n spinner.fail('Import failed');\n Logger.error(`Error: ${error}`);\n \n if (error instanceof SyntaxError) {\n Logger.warning('Invalid JSON in Smithery config file');\n }\n \n process.exit(1);\n }\n}","import { Command } from 'commander';\nimport { Logger } from '../lib/logger.js';\nimport { createReadStream, createWriteStream } from 'fs';\nimport { Readable, Writable } from 'stream';\n\nexport function createProxyCommand(): Command {\n return new Command('proxy')\n .description('Start a local STDIO MCP proxy to a remote server')\n .argument('<url>', 'Remote MCP server URL')\n .option('--quiet', 'Suppress startup messages')\n .action(async (url: string, options) => {\n if (!options.quiet) {\n // Log to stderr so it doesn't interfere with STDIO MCP protocol\n console.error('🔗 Proxying via mcphosting.com');\n console.error(`📡 Remote server: ${url}`);\n }\n\n try {\n await startProxy(url, options.quiet);\n } catch (error) {\n if (!options.quiet) {\n console.error(`❌ Proxy error: ${error}`);\n }\n process.exit(1);\n }\n });\n}\n\nasync function startProxy(url: string, quiet: boolean = false): Promise<void> {\n // For MVP, implement a simple HTTP proxy that translates STDIO JSON-RPC to HTTP\n // In production, this should use WebSocket or SSE for real-time communication\n \n let buffer = '';\n \n // Set up JSON-RPC message parsing from stdin\n process.stdin.setEncoding('utf8');\n process.stdin.on('data', async (chunk) => {\n buffer += chunk;\n \n // Process complete JSON-RPC messages (newline delimited)\n const lines = buffer.split('\\n');\n buffer = lines.pop() || ''; // Keep incomplete line in buffer\n \n for (const line of lines) {\n if (line.trim()) {\n try {\n await forwardMessage(url, line, quiet);\n } catch (error) {\n if (!quiet) {\n console.error(`Proxy error: ${error}`);\n }\n // Send error response back to client\n const errorResponse = {\n jsonrpc: '2.0',\n id: null,\n error: {\n code: -32603,\n message: 'Proxy error',\n data: error.toString()\n }\n };\n process.stdout.write(JSON.stringify(errorResponse) + '\\n');\n }\n }\n }\n });\n\n process.stdin.on('end', () => {\n if (!quiet) {\n console.error('📴 Proxy connection closed');\n }\n process.exit(0);\n });\n\n process.stdin.on('error', (error) => {\n if (!quiet) {\n console.error(`Stdin error: ${error}`);\n }\n process.exit(1);\n });\n\n // Keep the process alive\n await new Promise(() => {});\n}\n\nasync function forwardMessage(url: string, message: string, quiet: boolean): Promise<void> {\n try {\n const jsonrpcMessage = JSON.parse(message);\n \n // Forward the JSON-RPC message to the remote server via HTTP POST\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'User-Agent': 'mcphosting-cli-proxy'\n },\n body: message\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const responseData = await response.text();\n \n // Forward the response back to stdout\n process.stdout.write(responseData);\n \n // Ensure newline for JSON-RPC protocol\n if (!responseData.endsWith('\\n')) {\n process.stdout.write('\\n');\n }\n \n } catch (error) {\n // If we can't parse the original message, send a generic error\n if (error instanceof SyntaxError) {\n const errorResponse = {\n jsonrpc: '2.0',\n id: null,\n error: {\n code: -32700,\n message: 'Parse error',\n data: 'Invalid JSON-RPC message'\n }\n };\n process.stdout.write(JSON.stringify(errorResponse) + '\\n');\n } else {\n throw error;\n }\n }\n}\n\n// Alternative WebSocket-based proxy for real-time communication\nasync function startWebSocketProxy(url: string, quiet: boolean = false): Promise<void> {\n // This would use WebSocket for bidirectional communication\n // Implementation would depend on the remote server supporting WebSocket\n \n if (!quiet) {\n console.error('WebSocket proxy not yet implemented, using HTTP proxy');\n }\n \n return startProxy(url, quiet);\n}","import { Command } from 'commander'\nimport { Config } from '../lib/config.js'\nimport { MCPHostingAPI } from '../lib/api.js'\nimport { Logger } from '../lib/logger.js'\nimport chalk from 'chalk'\n\nexport function createWhoamiCommand(): Command {\n return new Command('whoami')\n .description('Show current logged-in user')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const config = new Config()\n const token = config.token\n\n if (!token) {\n if (options.json || Logger.isJsonMode) {\n console.log(JSON.stringify({ success: false, logged_in: false, error: 'Not logged in' }))\n } else {\n Logger.info('Not logged in.')\n Logger.dim(`Run ${chalk.cyan('mcphosting login')} to authenticate.`)\n }\n return\n }\n\n // Try to get fresh user info from API\n const api = new MCPHostingAPI(token)\n const user = await api.whoami()\n\n if (!user && token) {\n // Token exists but API call failed — token is likely expired\n if (options.json || Logger.isJsonMode) {\n console.log(JSON.stringify({\n success: false,\n logged_in: false,\n error: 'Token expired',\n cached_email: config.user?.email,\n }))\n } else {\n Logger.warning('Token expired. Run `mcphosting login` to re-authenticate.')\n if (config.user?.email) {\n Logger.dim(` Cached email: ${config.user.email}`)\n }\n }\n return\n }\n\n const result = {\n success: true,\n logged_in: true,\n email: user?.email || config.user?.email || 'unknown',\n org: user?.org || config.user?.org || undefined,\n token_source: config.isEnvToken ? 'environment' : 'config',\n }\n\n if (options.json || Logger.isJsonMode) {\n console.log(JSON.stringify(result))\n } else {\n console.log('')\n Logger.success(`Logged in as ${chalk.bold(result.email)}${result.org ? ` (${result.org})` : ''}`)\n if (config.isEnvToken) {\n Logger.dim(' Token source: MCPHOSTING_TOKEN environment variable')\n }\n console.log('')\n }\n })\n}\n","import { Command } from 'commander'\nimport { Config } from '../lib/config.js'\nimport { getAuthenticatedAPI, isAuthenticated } from '../lib/auth.js'\nimport { Logger } from '../lib/logger.js'\nimport chalk from 'chalk'\n\n/**\n * `mcphosting account` — Show current MCPHosting account status including plan and servers.\n */\nexport function createAccountCommand(): Command {\n return new Command('account')\n .description('Show MCPHosting account status, plan, and servers')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const config = new Config()\n\n if (!isAuthenticated()) {\n if (options.json || Logger.isJsonMode) {\n console.log(JSON.stringify({\n success: false,\n logged_in: false,\n error: 'Not logged in',\n }))\n } else {\n Logger.error('Not logged in.')\n Logger.info(`Run ${chalk.cyan('mcphosting login')} to authenticate.`)\n }\n return\n }\n\n const { api } = getAuthenticatedAPI()\n\n try {\n // Fetch user info and servers in parallel\n const [user, servers] = await Promise.all([\n api.whoami(),\n api.listServers().catch(() => []),\n ])\n\n const result = {\n success: true,\n logged_in: true,\n email: user?.email || config.user?.email || 'unknown',\n org: user?.org || config.user?.org || undefined,\n plan: (user as any)?.plan || 'free',\n token_source: config.isEnvToken ? 'environment' : 'config',\n servers: servers.map((s: any) => ({\n name: s.name || s.slug,\n slug: s.slug,\n url: s.url || '',\n status: s.status || 'unknown',\n })),\n }\n\n if (options.json || Logger.isJsonMode) {\n console.log(JSON.stringify(result))\n return\n }\n\n console.log('')\n Logger.bold('📊 MCPHosting Account')\n console.log('')\n Logger.info(` ${chalk.dim('Email:')} ${chalk.bold(result.email)}`)\n if (result.org) {\n Logger.info(` ${chalk.dim('Org:')} ${result.org}`)\n }\n Logger.info(` ${chalk.dim('Plan:')} ${chalk.cyan(result.plan)}`)\n Logger.info(` ${chalk.dim('Servers:')} ${result.servers.length}`)\n console.log('')\n\n if (result.servers.length > 0) {\n Logger.bold('🖥️ Your MCP Servers')\n console.log('')\n const tableData = result.servers.map((s: any) => ({\n Name: s.name,\n Status: s.status === 'active' ? chalk.green('● active') :\n s.status === 'deploying' ? chalk.yellow('◐ deploying') :\n s.status === 'stopped' ? chalk.dim('○ stopped') :\n chalk.red('✗ ' + s.status),\n URL: s.url.length > 40 ? s.url.slice(0, 37) + '...' : s.url,\n }))\n Logger.table(tableData)\n } else {\n Logger.dim(' No servers deployed yet.')\n Logger.dim(` Run ${chalk.cyan('mcphosting deploy --template weather')} to get started.`)\n }\n console.log('')\n } catch (error: any) {\n if (options.json || Logger.isJsonMode) {\n console.log(JSON.stringify({ success: false, error: error.message }))\n } else {\n Logger.error(error.message)\n }\n }\n })\n}\n","import { Command } from 'commander'\nimport { Logger } from '../lib/logger.js'\nimport chalk from 'chalk'\n\nconst BASH_COMPLETIONS = `\n# mcphosting bash completions\n_mcphosting_completions() {\n local cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n local prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n local commands=\"login logout deploy init connect disconnect list status logs env keys search info import proxy whoami account completions\"\n local templates=\"weather crypto notion postgres blank runescape reminder search\"\n local global_opts=\"--help --version --json --silent\"\n\n case \"\\${prev}\" in\n mcphosting|mcphost)\n COMPREPLY=( $(compgen -W \"\\${commands} \\${global_opts}\" -- \"\\${cur}\") )\n return 0\n ;;\n deploy)\n COMPREPLY=( $(compgen -W \"--template --github --api-url --name --auth --json --silent --configure --no-auto-key\" -- \"\\${cur}\") )\n return 0\n ;;\n --template)\n COMPREPLY=( $(compgen -W \"\\${templates}\" -- \"\\${cur}\") )\n return 0\n ;;\n --auth)\n COMPREPLY=( $(compgen -W \"none api_key oauth\" -- \"\\${cur}\") )\n return 0\n ;;\n --shell)\n COMPREPLY=( $(compgen -W \"bash zsh fish\" -- \"\\${cur}\") )\n return 0\n ;;\n env)\n COMPREPLY=( $(compgen -W \"list set remove\" -- \"\\${cur}\") )\n return 0\n ;;\n keys)\n COMPREPLY=( $(compgen -W \"list create delete\" -- \"\\${cur}\") )\n return 0\n ;;\n login)\n COMPREPLY=( $(compgen -W \"--github --email --token --browser --json\" -- \"\\${cur}\") )\n return 0\n ;;\n list)\n COMPREPLY=( $(compgen -W \"--local --remote --json\" -- \"\\${cur}\") )\n return 0\n ;;\n status|logs)\n COMPREPLY=( $(compgen -W \"--json\" -- \"\\${cur}\") )\n return 0\n ;;\n *)\n COMPREPLY=( $(compgen -W \"\\${global_opts}\" -- \"\\${cur}\") )\n return 0\n ;;\n esac\n}\ncomplete -F _mcphosting_completions mcphosting\ncomplete -F _mcphosting_completions mcphost\n`.trim()\n\nconst ZSH_COMPLETIONS = `\n#compdef mcphosting mcphost\n\n_mcphosting() {\n local -a commands templates global_opts\n\n commands=(\n 'login:Authenticate with MCPHosting'\n 'logout:Log out and remove stored credentials'\n 'deploy:Deploy an MCP server to MCPHosting'\n 'init:Initialize mcphosting.json in the current directory'\n 'connect:Connect an MCP server to your AI clients'\n 'disconnect:Disconnect an MCP server'\n 'list:List your MCP servers'\n 'status:Check the status of a deployed MCP server'\n 'logs:View logs for a deployed MCP server'\n 'env:Manage environment variables'\n 'keys:Manage API keys'\n 'search:Search MCP servers in the marketplace'\n 'info:Show detailed information about an MCP server'\n 'import:Import MCP connections from other tools'\n 'proxy:Start a local STDIO MCP proxy'\n 'whoami:Show current logged-in user'\n 'account:Show MCPHosting account status'\n 'completions:Generate shell completions'\n )\n\n templates=(weather crypto notion postgres blank runescape reminder search)\n global_opts=(--help --version --json --silent)\n\n _arguments -C \\\\\n '1:command:->cmd' \\\\\n '*::arg:->args'\n\n case \"\\$state\" in\n cmd)\n _describe -t commands 'mcphosting commands' commands\n _values 'global options' \\$global_opts\n ;;\n args)\n case \"\\$words[1]\" in\n deploy)\n _arguments \\\\\n '--template[Deploy from template]:template:(weather crypto notion postgres blank runescape reminder search)' \\\\\n '--github[Deploy from GitHub URL]:url:' \\\\\n '--api-url[External server URL]:url:' \\\\\n '--name[Server name]:name:' \\\\\n '--auth[Auth type]:auth:(none api_key oauth)' \\\\\n '--json[Output as JSON]' \\\\\n '--silent[Suppress interactive output]' \\\\\n '--configure[Auto-configure AI clients]' \\\\\n '--no-auto-key[Skip API key creation]'\n ;;\n completions)\n _arguments '--shell[Shell type]:shell:(bash zsh fish)'\n ;;\n login)\n _arguments '--github' '--email:email:' '--token:token:' '--browser' '--json'\n ;;\n *)\n _arguments '--json[Output as JSON]'\n ;;\n esac\n ;;\n esac\n}\n\n_mcphosting \"\\$@\"\n`.trim()\n\nconst FISH_COMPLETIONS = `\n# mcphosting fish completions\nset -l commands login logout deploy init connect disconnect list status logs env keys search info import proxy whoami account completions\nset -l templates weather crypto notion postgres blank runescape reminder search\n\ncomplete -c mcphosting -f\ncomplete -c mcphost -f\n\n# Commands\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a login -d \"Authenticate with MCPHosting\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a logout -d \"Log out\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a deploy -d \"Deploy an MCP server\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a init -d \"Initialize mcphosting.json\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a connect -d \"Connect MCP to AI clients\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a disconnect -d \"Disconnect MCP server\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a list -d \"List servers\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a status -d \"Check server status\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a logs -d \"View logs\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a env -d \"Manage env vars\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a keys -d \"Manage API keys\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a search -d \"Search marketplace\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a info -d \"MCP server info\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a import -d \"Import connections\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a proxy -d \"STDIO proxy\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a whoami -d \"Show current user\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a account -d \"Account status\"\ncomplete -c mcphosting -n \"not __fish_seen_subcommand_from $commands\" -a completions -d \"Generate completions\"\n\n# Global\ncomplete -c mcphosting -l json -d \"Output as JSON\"\ncomplete -c mcphosting -l silent -d \"Suppress interactive output\"\ncomplete -c mcphosting -l help -d \"Show help\"\ncomplete -c mcphosting -l version -d \"Show version\"\n\n# Deploy options\ncomplete -c mcphosting -n \"__fish_seen_subcommand_from deploy\" -l template -xa \"$templates\" -d \"Template name\"\ncomplete -c mcphosting -n \"__fish_seen_subcommand_from deploy\" -l github -d \"GitHub URL\"\ncomplete -c mcphosting -n \"__fish_seen_subcommand_from deploy\" -l api-url -d \"API URL\"\ncomplete -c mcphosting -n \"__fish_seen_subcommand_from deploy\" -l name -d \"Server name\"\ncomplete -c mcphosting -n \"__fish_seen_subcommand_from deploy\" -l auth -xa \"none api_key oauth\" -d \"Auth type\"\ncomplete -c mcphosting -n \"__fish_seen_subcommand_from deploy\" -l configure -d \"Auto-configure clients\"\n\n# Completions options\ncomplete -c mcphosting -n \"__fish_seen_subcommand_from completions\" -l shell -xa \"bash zsh fish\" -d \"Shell type\"\n`.trim()\n\nexport function createCompletionsCommand(): Command {\n return new Command('completions')\n .description('Generate shell completions (bash, zsh, fish)')\n .option('--shell <shell>', 'Shell type: bash, zsh, or fish')\n .action((options) => {\n const shell = options.shell?.toLowerCase() || detectShell()\n\n switch (shell) {\n case 'bash':\n console.log(BASH_COMPLETIONS)\n if (!options.shell) {\n console.error('')\n console.error(chalk.dim('# Add to ~/.bashrc:'))\n console.error(chalk.cyan('# mcphosting completions --shell=bash >> ~/.bashrc'))\n }\n break\n case 'zsh':\n console.log(ZSH_COMPLETIONS)\n if (!options.shell) {\n console.error('')\n console.error(chalk.dim('# Save to a file in your fpath:'))\n console.error(chalk.cyan('# mcphosting completions --shell=zsh > ~/.zfunc/_mcphosting'))\n }\n break\n case 'fish':\n console.log(FISH_COMPLETIONS)\n if (!options.shell) {\n console.error('')\n console.error(chalk.dim('# Save to completions dir:'))\n console.error(chalk.cyan('# mcphosting completions --shell=fish > ~/.config/fish/completions/mcphosting.fish'))\n }\n break\n default:\n Logger.error(`Unknown shell: ${shell}`)\n Logger.info('Supported shells: bash, zsh, fish')\n Logger.info('Usage: mcphosting completions --shell=bash')\n process.exit(1)\n }\n })\n}\n\nfunction detectShell(): string {\n const shell = process.env.SHELL || ''\n if (shell.includes('zsh')) return 'zsh'\n if (shell.includes('fish')) return 'fish'\n return 'bash'\n}\n"],"mappings":"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","names":["Command","chalk","data","chalk","spinner","token","Command","Command","Command","readFile","writeFile","join","readFile","join","join","readFile","chalk","Command","name","spinner","githubUrl","readFile","join","writeFile","Command","writeFile","access","join","basename","chalk","TEMPLATES","Command","join","access","basename","writeFile","Command","chalk","Command","Command","chalk","Command","Command","chalk","Command","Command","chalk","Command","Command","chalk","Command","env","Command","chalk","Command","Command","chalk","Command","Command","readFile","access","join","homedir","chalk","Command","join","homedir","access","readFile","Command","Command","chalk","Command","Command","chalk","Command","Command","chalk","Command","Command","chalk"]}
|