mcphosting-cli 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +5 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -444,7 +444,7 @@ var ClientManager = class {
|
|
|
444
444
|
}
|
|
445
445
|
const serverEntry = {
|
|
446
446
|
command: "npx",
|
|
447
|
-
args: ["-y", "
|
|
447
|
+
args: ["-y", "mcphosting-cli", "proxy", url],
|
|
448
448
|
env: {}
|
|
449
449
|
};
|
|
450
450
|
try {
|
|
@@ -595,7 +595,7 @@ function createConnectCommands() {
|
|
|
595
595
|
Logger.dim(` URL: ${url}`);
|
|
596
596
|
Logger.dim(` Clients: ${clients.join(", ")}`);
|
|
597
597
|
console.log("\n" + import_chalk2.default.green("\u{1F389} Connected! Share with your team:"));
|
|
598
|
-
console.log(import_chalk2.default.cyan(`npx
|
|
598
|
+
console.log(import_chalk2.default.cyan(`npx mcphosting-cli connect ${urlOrSlug}`));
|
|
599
599
|
console.log("\n" + import_chalk2.default.yellow("\u2B50 Star us: ") + import_chalk2.default.blue("https://github.com/gorlomi-enzo/mcphosting-cli"));
|
|
600
600
|
console.log("");
|
|
601
601
|
} catch (error) {
|
|
@@ -743,7 +743,7 @@ async function importFromSmitery(options) {
|
|
|
743
743
|
}
|
|
744
744
|
let url = serverConfig.url;
|
|
745
745
|
if (!url) {
|
|
746
|
-
if (serverConfig.command === "npx" && serverConfig.args?.[0] === "
|
|
746
|
+
if (serverConfig.command === "npx" && serverConfig.args?.[0] === "mcphosting-cli") {
|
|
747
747
|
url = serverConfig.args[2];
|
|
748
748
|
} else {
|
|
749
749
|
url = `https://${slug}.mcphost.dev`;
|
|
@@ -789,7 +789,7 @@ async function importFromSmitery(options) {
|
|
|
789
789
|
console.log("");
|
|
790
790
|
Logger.info("Use `mcphost list` to see your imported connections");
|
|
791
791
|
console.log("\n" + import_chalk3.default.green("\u{1F389} Welcome to MCPHosting! Share with your team:"));
|
|
792
|
-
console.log(import_chalk3.default.cyan("npx
|
|
792
|
+
console.log(import_chalk3.default.cyan("npx mcphosting-cli import --from smithery"));
|
|
793
793
|
console.log("\n" + import_chalk3.default.yellow("\u2B50 Star us: ") + import_chalk3.default.blue("https://github.com/gorlomi-enzo/mcphosting-cli"));
|
|
794
794
|
console.log("");
|
|
795
795
|
} catch (error) {
|
|
@@ -872,7 +872,7 @@ async function forwardMessage(url, message, quiet) {
|
|
|
872
872
|
headers: {
|
|
873
873
|
"Content-Type": "application/json",
|
|
874
874
|
"Accept": "application/json",
|
|
875
|
-
"User-Agent": "
|
|
875
|
+
"User-Agent": "mcphosting-cli-proxy"
|
|
876
876
|
},
|
|
877
877
|
body: message
|
|
878
878
|
});
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/auth.ts","../src/lib/config.ts","../src/lib/api.ts","../src/lib/logger.ts","../src/commands/connect.ts","../src/lib/clients.ts","../src/commands/import.ts","../src/commands/proxy.ts","../src/commands/search.ts","../src/commands/servers.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createAuthCommands, createLegacyAuthCommands } from './commands/auth.js';\nimport { \n createConnectCommands, \n createDisconnectCommand, \n createListCommand \n} from './commands/connect.js';\nimport { createImportCommand } from './commands/import.js';\nimport { createProxyCommand } from './commands/proxy.js';\nimport { createSearchCommand, createInfoCommand } from './commands/search.js';\nimport { \n createServersCommand, \n createKeysCommand, \n createPublishCommand \n} from './commands/servers.js';\nimport { Logger } from './lib/logger.js';\nimport chalk from 'chalk';\n\nconst program = new Command();\n\nprogram\n .name('mcphost')\n .description('Connect AI agents to MCP servers. Browse, install, and manage Model Context Protocol servers.')\n .version('0.1.0')\n .configureOutput({\n outputError: (str, write) => {\n // Ensure errors go to stderr\n write(chalk.red(str));\n }\n });\n\n// Add the main commands\nprogram.addCommand(createConnectCommands());\nprogram.addCommand(createDisconnectCommand());\nprogram.addCommand(createListCommand());\nprogram.addCommand(createImportCommand());\nprogram.addCommand(createProxyCommand());\nprogram.addCommand(createSearchCommand());\nprogram.addCommand(createInfoCommand());\n\n// Add server management commands\nprogram.addCommand(createServersCommand());\nprogram.addCommand(createKeysCommand());\nprogram.addCommand(createPublishCommand());\n\n// Add auth commands both as subcommands and top-level (backwards compatibility)\nprogram.addCommand(createAuthCommands());\nconst [login, logout, whoami] = createLegacyAuthCommands();\nprogram.addCommand(login);\nprogram.addCommand(logout);\nprogram.addCommand(whoami);\n\n// Custom help\nprogram.configureHelp({\n subcommandTerm: (cmd) => chalk.cyan(cmd.name()),\n commandUsage: (cmd) => {\n const usage = cmd.usage();\n return chalk.yellow(usage);\n },\n commandDescription: (cmd) => {\n return chalk.dim(cmd.description());\n }\n});\n\n// Add custom help examples\nprogram.addHelpText('after', `\n${chalk.bold('Examples:')}\n ${chalk.cyan('mcphost connect github')} ${chalk.dim('Connect to GitHub MCP server')}\n ${chalk.cyan('mcphost connect https://my-mcp.example.com')} ${chalk.dim('Connect to custom MCP server')}\n ${chalk.cyan('mcphost connect slack --client claude')} ${chalk.dim('Connect Slack MCP only to Claude')}\n ${chalk.cyan('mcphost list')} ${chalk.dim('List all connected MCP servers')}\n ${chalk.cyan('mcphost search github')} ${chalk.dim('Search marketplace for MCP servers')}\n ${chalk.cyan('mcphost info notion')} ${chalk.dim('Get details about Notion MCP')}\n ${chalk.cyan('mcphost import --from smithery')} ${chalk.dim('Import connections from Smithery')}\n ${chalk.cyan('mcphost disconnect github')} ${chalk.dim('Remove GitHub MCP connection')}\n\n${chalk.bold('Supported AI Clients:')}\n • ${chalk.green('Claude Desktop')} - Auto-configured via claude_desktop_config.json\n • ${chalk.green('Cursor')} - Auto-configured via .cursor/mcp.json \n • ${chalk.green('VS Code')} - Configured via .vscode/mcp.json\n • ${chalk.green('OpenClaw')} - Auto-configured via ~/.openclaw/mcp.json\n • ${chalk.green('ChatGPT')} - Manual setup with web instructions\n\n${chalk.bold('Get Started:')}\n ${chalk.dim('1.')} ${chalk.cyan('mcphost search <topic>')} ${chalk.dim('Find MCP servers')}\n ${chalk.dim('2.')} ${chalk.cyan('mcphost connect <slug>')} ${chalk.dim('Connect to your AI clients')}\n ${chalk.dim('3.')} ${chalk.cyan('mcphost list')} ${chalk.dim('View your connections')}\n\n${chalk.yellow('⭐ Star us:')} ${chalk.blue('https://github.com/gorlomi-enzo/mcphosting-cli')}\n${chalk.yellow('📚 Docs:')} ${chalk.blue('https://mcphosting.com/docs')}\n`);\n\n// Global error handling\nprocess.on('uncaughtException', (error) => {\n Logger.error(`Uncaught error: ${error.message}`);\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (reason) => {\n Logger.error(`Unhandled rejection: ${reason}`);\n if (process.env.DEBUG) {\n console.error(reason);\n }\n process.exit(1);\n});\n\n// Handle Ctrl+C gracefully\nprocess.on('SIGINT', () => {\n console.log('\\n');\n Logger.info('Goodbye! 👋');\n process.exit(0);\n});\n\n// Parse CLI arguments\nasync function main() {\n try {\n await program.parseAsync();\n } catch (error) {\n Logger.error(`Command failed: ${error}`);\n if (process.env.DEBUG) {\n console.error(error);\n }\n process.exit(1);\n }\n}\n\nmain();","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';\n\nexport function createAuthCommands(): Command {\n const auth = new Command('auth');\n\n auth\n .command('login')\n .description('Authenticate with MCPHosting')\n .option('--token <token>', 'Provide API token directly')\n .action(async (options) => {\n const config = new Config();\n \n if (options.token) {\n // Manual token auth\n config.token = options.token;\n \n const api = new MCPHostingAPI(options.token);\n const user = await api.whoami();\n \n if (user) {\n config.user = user;\n Logger.success(`Logged in as ${user.email}${user.org ? ` (${user.org})` : ''}`);\n } else {\n Logger.warning('Token saved, but could not verify user info');\n }\n return;\n }\n\n // Browser OAuth flow\n const spinner = Logger.spinner('Starting login flow...');\n \n let server: any;\n let resolved = false;\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;\">\n <h2>✅ Login Successful!</h2>\n <p>You can now 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;\">\n <h2>❌ Login Failed</h2>\n <p>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 setTimeout(() => {\n if (!resolved) {\n reject(new Error('Login timeout - please try again'));\n }\n }, 120000); // 2 minute timeout\n \n open(authUrl).catch(() => {\n Logger.warning(`Could not open browser automatically. Please visit: ${authUrl}`);\n });\n });\n });\n\n const token = await authPromise;\n resolved = true;\n \n spinner.succeed('Login successful!');\n \n config.token = token;\n \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 ${user.email}${user.org ? ` (${user.org})` : ''}`);\n }\n\n } catch (error) {\n spinner.fail('Login failed');\n Logger.error(`Login error: ${error}`);\n process.exit(1);\n } finally {\n if (server) {\n server.close();\n }\n }\n });\n\n auth\n .command('logout')\n .description('Remove stored authentication')\n .action(() => {\n const config = new Config();\n config.token = undefined;\n config.user = undefined;\n Logger.success('Logged out successfully');\n });\n\n auth\n .command('whoami')\n .description('Show current user information')\n .action(async () => {\n const config = new Config();\n const token = config.token;\n \n if (!token) {\n Logger.warning('Not logged in. Use `mcphost auth login` to authenticate.');\n return;\n }\n\n const user = config.user;\n if (user) {\n Logger.info(`Logged in as: ${user.email}${user.org ? ` (${user.org})` : ''}`);\n } else {\n Logger.warning('User info not available. Try logging in again.');\n }\n });\n\n return auth;\n}\n\n// Legacy commands (backwards compatibility)\nexport function createLegacyAuthCommands(): Command[] {\n const config = new Config();\n \n const login = new Command('login')\n .description('Authenticate with MCPHosting')\n .option('--token <token>', 'Provide API token directly')\n .action(async (options) => {\n const authCmd = createAuthCommands();\n const loginCmd = authCmd.commands.find(cmd => cmd.name() === 'login');\n if (loginCmd) {\n await loginCmd.action(options);\n }\n });\n\n const logout = new Command('logout')\n .description('Remove stored authentication')\n .action(() => {\n config.token = undefined;\n config.user = undefined;\n Logger.success('Logged out successfully');\n });\n\n const whoami = new Command('whoami')\n .description('Show current user information')\n .action(async () => {\n const authCmd = createAuthCommands();\n const whoamiCmd = authCmd.commands.find(cmd => cmd.name() === 'whoami');\n if (whoamiCmd) {\n await whoamiCmd.action();\n }\n });\n\n return [login, logout, whoami];\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 get token(): string | undefined {\n return 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 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 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}","import { MCPServer } from '../types.js';\n\nexport class MCPHostingAPI {\n private baseUrl = 'https://mcphosting.com/api';\n private token?: string;\n\n constructor(token?: string) {\n this.token = token;\n }\n\n private async request(endpoint: string, options: RequestInit = {}): Promise<any> {\n // For MVP, always throw to use static fallback\n // In production, this would make actual HTTP requests\n throw new Error(`API not available - using static fallback`);\n \n // Commented out for MVP - uncomment for production API calls\n /*\n const url = `${this.baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers as Record<string, string>\n };\n\n if (this.token) {\n headers.Authorization = `Bearer ${this.token}`;\n }\n\n const response = await fetch(url, {\n ...options,\n headers\n });\n\n if (!response.ok) {\n throw new Error(`API request failed: ${response.status} ${response.statusText}`);\n }\n\n return await response.json();\n */\n }\n\n async searchMCPs(query: string): Promise<MCPServer[]> {\n try {\n const results = await this.request(`/marketplace/search?q=${encodeURIComponent(query)}`);\n return results.mcps || [];\n } catch (error) {\n // Always fallback to static data for now\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 result = await this.request(`/marketplace/mcp/${slug}`);\n return result.mcp || null;\n } catch {\n // Fallback to static data\n const staticMCPs = this.getStaticMCPs();\n return staticMCPs.find(mcp => mcp.slug === slug) || null;\n }\n }\n\n async whoami(): Promise<{ email: string; org?: string } | null> {\n if (!this.token) return null;\n \n try {\n const result = await this.request('/auth/whoami');\n return result.user;\n } catch {\n return null;\n }\n }\n\n private getStaticMCPs(): MCPServer[] {\n // Curated list of popular MCP servers for fallback\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}","import chalk from 'chalk';\nimport ora, { Ora } from 'ora';\n\nexport class Logger {\n static info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n }\n\n static success(message: string): void {\n console.log(chalk.green('✓'), message);\n }\n\n static warning(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n }\n\n static error(message: string): void {\n console.error(chalk.red('✗'), message);\n }\n\n static dim(message: string): void {\n console.log(chalk.dim(message));\n }\n\n static bold(message: string): void {\n console.log(chalk.bold(message));\n }\n\n static spinner(text: string): Ora {\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 { ClientManager } from '../lib/clients.js';\nimport { Logger } from '../lib/logger.js';\nimport { SupportedClient } from '../types.js';\nimport chalk from 'chalk';\n\nexport function createConnectCommands(): Command {\n const connect = new Command('connect')\n .description('Connect an MCP server to AI clients')\n .argument('<url-or-slug>', 'MCP server URL or slug')\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 ${slug}`);\n Logger.info(`Use \\`mcphost disconnect ${slug}\\` to remove first`);\n return;\n }\n\n const clients: string[] = [];\n\n if (options.client) {\n // Connect to specific 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 to ${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 clients found');\n Logger.info('Supported clients: Claude Desktop, Cursor, VS Code, OpenClaw');\n Logger.info('Install a client and try again, or use --client chatgpt for web 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 \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 to ${clients.length} client${clients.length > 1 ? 's' : ''}`);\n }\n\n // Save connection to config\n config.addConnection({\n slug,\n url,\n clients\n });\n\n Logger.success(`🔗 ${name} connected successfully!`);\n Logger.dim(` URL: ${url}`);\n Logger.dim(` Clients: ${clients.join(', ')}`);\n\n // Growth hacking: show sharing message after successful connection\n console.log('\\n' + chalk.green('🎉 Connected! Share with your team:'));\n console.log(chalk.cyan(`npx @mcphosting/cli connect ${urlOrSlug}`));\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('Connection failed');\n Logger.error(`Error: ${error}`);\n process.exit(1);\n }\n });\n\n return connect;\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 `mcphost 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 ${connection.slug}`);\n \n if (removedFrom.length > 0) {\n Logger.info(`Removed from: ${removedFrom.join(', ')}`);\n }\n \n } catch (error) {\n spinner.fail('Disconnect failed');\n Logger.error(`Error: ${error}`);\n }\n });\n}\n\nexport function createListCommand(): Command {\n return new Command('list')\n .description('List connected MCP servers')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const config = new Config();\n const connections = config.connections;\n \n if (connections.length === 0) {\n Logger.info('No MCP connections found');\n Logger.dim('Use `mcphost connect <url>` to add one');\n return;\n }\n\n if (options.json) {\n Logger.json(connections);\n return;\n }\n\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 \n console.log('');\n Logger.dim('Use `mcphost disconnect <slug>` to remove a connection');\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, 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 { 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 matching your query');\n Logger.dim('Try searching for: 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(`🔍 MCP Marketplace Search 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('Author:')} ${server.author}`);\n console.log(` ${chalk.green('Tools:')} ${server.tools.join(', ')}`);\n \n if (server.url) {\n console.log(` ${chalk.blue('Connect:')} ${chalk.dim(`mcphost connect ${server.slug}`)}`);\n }\n \n console.log('');\n });\n\n if (results.length > limit) {\n Logger.dim(`Showing ${limit} of ${results.length} results. Use --limit to see more.`);\n }\n\n Logger.info('Use `mcphost info <slug>` for detailed information');\n Logger.info('Use `mcphost connect <slug>` to install');\n\n } catch (error) {\n spinner.fail('Search failed');\n Logger.error(`Error: ${error}`);\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(`MCP server not found: ${slug}`);\n Logger.info('Use `mcphost search <query>` to find servers');\n return;\n }\n\n spinner.succeed('Found server info');\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 infoTable = [\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\n if (server.url) {\n infoTable.push({ Property: 'URL', Value: server.url });\n }\n\n Logger.table(infoTable);\n\n console.log('');\n console.log(chalk.yellow('🔧 Available Tools:'));\n server.tools.forEach(tool => {\n console.log(` • ${tool}`);\n });\n\n console.log('');\n console.log(chalk.green('💡 Quick Start:'));\n console.log(chalk.dim(` mcphost connect ${server.slug}`));\n\n // Check if already connected\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 } catch (error) {\n spinner.fail('Failed to get server info');\n Logger.error(`Error: ${error}`);\n process.exit(1);\n }\n });\n}","import { Command } from 'commander';\nimport { Config } from '../lib/config.js';\nimport { Logger } from '../lib/logger.js';\nimport chalk from 'chalk';\n\nexport function createServersCommand(): Command {\n const servers = new Command('servers');\n servers.description('Manage your hosted MCP servers');\n\n servers\n .command('list')\n .description('List your MCP servers')\n .action(async () => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate with MCPHosting');\n return;\n }\n\n Logger.info('🚧 Server management coming soon!');\n console.log('');\n console.log('This feature will let you:');\n console.log('• List your hosted MCP servers');\n console.log('• View usage analytics');\n console.log('• Manage API keys');\n console.log('• Publish to marketplace');\n console.log('');\n Logger.info('Visit https://mcphosting.com to manage servers in the web dashboard');\n });\n\n return servers;\n}\n\nexport function createKeysCommand(): Command {\n const keys = new Command('keys');\n keys.description('Manage API keys for your MCP servers');\n\n keys\n .command('list')\n .argument('[server-id]', 'Server ID')\n .description('List API keys')\n .action(async (serverId?: string) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 API key management coming soon!');\n Logger.info('Visit https://mcphosting.com to manage keys in the web dashboard');\n });\n\n keys\n .command('create')\n .argument('<server-id>', 'Server ID')\n .option('--name <name>', 'Key name', 'CLI Key')\n .description('Create a new API key')\n .action(async (serverId: string, options) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 API key creation coming soon!');\n Logger.info('Visit https://mcphosting.com to create keys in the web dashboard');\n });\n\n keys\n .command('revoke')\n .argument('<key-id>', 'API key ID')\n .description('Revoke an API key')\n .action(async (keyId: string) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 API key revocation coming soon!');\n Logger.info('Visit https://mcphosting.com to revoke keys in the web dashboard');\n });\n\n return keys;\n}\n\nexport function createPublishCommand(): Command {\n return new Command('publish')\n .description('Publish MCP server to marketplace')\n .argument('[server-id]', 'Server ID to publish')\n .option('--private', 'Keep server private')\n .option('--description <desc>', 'Server description')\n .option('--tags <tags>', 'Comma-separated tags')\n .action(async (serverId?: string, options = {}) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 Marketplace publishing coming soon!');\n console.log('');\n console.log('This feature will let you:');\n console.log('• Publish your MCP servers to the marketplace');\n console.log('• Set descriptions and tags');\n console.log('• Configure public/private visibility');\n console.log('• Track usage analytics');\n console.log('');\n Logger.info('Visit https://mcphosting.com to publish servers via the web dashboard');\n \n if (serverId) {\n Logger.dim(`Would publish server: ${serverId}`);\n }\n if (options.description) {\n Logger.dim(`Description: ${options.description}`);\n }\n if (options.tags) {\n Logger.dim(`Tags: ${options.tags}`);\n }\n });\n}"],"mappings":"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","names":["import_commander","Conf","chalk","ora","token","open","login","logout","whoami","import_commander","import_promises","import_chalk","chalk","import_commander","import_promises","import_path","import_os","import_chalk","chalk","import_commander","import_commander","import_chalk","chalk","import_commander","import_chalk","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/auth.ts","../src/lib/config.ts","../src/lib/api.ts","../src/lib/logger.ts","../src/commands/connect.ts","../src/lib/clients.ts","../src/commands/import.ts","../src/commands/proxy.ts","../src/commands/search.ts","../src/commands/servers.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createAuthCommands, createLegacyAuthCommands } from './commands/auth.js';\nimport { \n createConnectCommands, \n createDisconnectCommand, \n createListCommand \n} from './commands/connect.js';\nimport { createImportCommand } from './commands/import.js';\nimport { createProxyCommand } from './commands/proxy.js';\nimport { createSearchCommand, createInfoCommand } from './commands/search.js';\nimport { \n createServersCommand, \n createKeysCommand, \n createPublishCommand \n} from './commands/servers.js';\nimport { Logger } from './lib/logger.js';\nimport chalk from 'chalk';\n\nconst program = new Command();\n\nprogram\n .name('mcphost')\n .description('Connect AI agents to MCP servers. Browse, install, and manage Model Context Protocol servers.')\n .version('0.1.0')\n .configureOutput({\n outputError: (str, write) => {\n // Ensure errors go to stderr\n write(chalk.red(str));\n }\n });\n\n// Add the main commands\nprogram.addCommand(createConnectCommands());\nprogram.addCommand(createDisconnectCommand());\nprogram.addCommand(createListCommand());\nprogram.addCommand(createImportCommand());\nprogram.addCommand(createProxyCommand());\nprogram.addCommand(createSearchCommand());\nprogram.addCommand(createInfoCommand());\n\n// Add server management commands\nprogram.addCommand(createServersCommand());\nprogram.addCommand(createKeysCommand());\nprogram.addCommand(createPublishCommand());\n\n// Add auth commands both as subcommands and top-level (backwards compatibility)\nprogram.addCommand(createAuthCommands());\nconst [login, logout, whoami] = createLegacyAuthCommands();\nprogram.addCommand(login);\nprogram.addCommand(logout);\nprogram.addCommand(whoami);\n\n// Custom help\nprogram.configureHelp({\n subcommandTerm: (cmd) => chalk.cyan(cmd.name()),\n commandUsage: (cmd) => {\n const usage = cmd.usage();\n return chalk.yellow(usage);\n },\n commandDescription: (cmd) => {\n return chalk.dim(cmd.description());\n }\n});\n\n// Add custom help examples\nprogram.addHelpText('after', `\n${chalk.bold('Examples:')}\n ${chalk.cyan('mcphost connect github')} ${chalk.dim('Connect to GitHub MCP server')}\n ${chalk.cyan('mcphost connect https://my-mcp.example.com')} ${chalk.dim('Connect to custom MCP server')}\n ${chalk.cyan('mcphost connect slack --client claude')} ${chalk.dim('Connect Slack MCP only to Claude')}\n ${chalk.cyan('mcphost list')} ${chalk.dim('List all connected MCP servers')}\n ${chalk.cyan('mcphost search github')} ${chalk.dim('Search marketplace for MCP servers')}\n ${chalk.cyan('mcphost info notion')} ${chalk.dim('Get details about Notion MCP')}\n ${chalk.cyan('mcphost import --from smithery')} ${chalk.dim('Import connections from Smithery')}\n ${chalk.cyan('mcphost disconnect github')} ${chalk.dim('Remove GitHub MCP connection')}\n\n${chalk.bold('Supported AI Clients:')}\n • ${chalk.green('Claude Desktop')} - Auto-configured via claude_desktop_config.json\n • ${chalk.green('Cursor')} - Auto-configured via .cursor/mcp.json \n • ${chalk.green('VS Code')} - Configured via .vscode/mcp.json\n • ${chalk.green('OpenClaw')} - Auto-configured via ~/.openclaw/mcp.json\n • ${chalk.green('ChatGPT')} - Manual setup with web instructions\n\n${chalk.bold('Get Started:')}\n ${chalk.dim('1.')} ${chalk.cyan('mcphost search <topic>')} ${chalk.dim('Find MCP servers')}\n ${chalk.dim('2.')} ${chalk.cyan('mcphost connect <slug>')} ${chalk.dim('Connect to your AI clients')}\n ${chalk.dim('3.')} ${chalk.cyan('mcphost list')} ${chalk.dim('View your connections')}\n\n${chalk.yellow('⭐ Star us:')} ${chalk.blue('https://github.com/gorlomi-enzo/mcphosting-cli')}\n${chalk.yellow('📚 Docs:')} ${chalk.blue('https://mcphosting.com/docs')}\n`);\n\n// Global error handling\nprocess.on('uncaughtException', (error) => {\n Logger.error(`Uncaught error: ${error.message}`);\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (reason) => {\n Logger.error(`Unhandled rejection: ${reason}`);\n if (process.env.DEBUG) {\n console.error(reason);\n }\n process.exit(1);\n});\n\n// Handle Ctrl+C gracefully\nprocess.on('SIGINT', () => {\n console.log('\\n');\n Logger.info('Goodbye! 👋');\n process.exit(0);\n});\n\n// Parse CLI arguments\nasync function main() {\n try {\n await program.parseAsync();\n } catch (error) {\n Logger.error(`Command failed: ${error}`);\n if (process.env.DEBUG) {\n console.error(error);\n }\n process.exit(1);\n }\n}\n\nmain();","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';\n\nexport function createAuthCommands(): Command {\n const auth = new Command('auth');\n\n auth\n .command('login')\n .description('Authenticate with MCPHosting')\n .option('--token <token>', 'Provide API token directly')\n .action(async (options) => {\n const config = new Config();\n \n if (options.token) {\n // Manual token auth\n config.token = options.token;\n \n const api = new MCPHostingAPI(options.token);\n const user = await api.whoami();\n \n if (user) {\n config.user = user;\n Logger.success(`Logged in as ${user.email}${user.org ? ` (${user.org})` : ''}`);\n } else {\n Logger.warning('Token saved, but could not verify user info');\n }\n return;\n }\n\n // Browser OAuth flow\n const spinner = Logger.spinner('Starting login flow...');\n \n let server: any;\n let resolved = false;\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;\">\n <h2>✅ Login Successful!</h2>\n <p>You can now 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;\">\n <h2>❌ Login Failed</h2>\n <p>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 setTimeout(() => {\n if (!resolved) {\n reject(new Error('Login timeout - please try again'));\n }\n }, 120000); // 2 minute timeout\n \n open(authUrl).catch(() => {\n Logger.warning(`Could not open browser automatically. Please visit: ${authUrl}`);\n });\n });\n });\n\n const token = await authPromise;\n resolved = true;\n \n spinner.succeed('Login successful!');\n \n config.token = token;\n \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 ${user.email}${user.org ? ` (${user.org})` : ''}`);\n }\n\n } catch (error) {\n spinner.fail('Login failed');\n Logger.error(`Login error: ${error}`);\n process.exit(1);\n } finally {\n if (server) {\n server.close();\n }\n }\n });\n\n auth\n .command('logout')\n .description('Remove stored authentication')\n .action(() => {\n const config = new Config();\n config.token = undefined;\n config.user = undefined;\n Logger.success('Logged out successfully');\n });\n\n auth\n .command('whoami')\n .description('Show current user information')\n .action(async () => {\n const config = new Config();\n const token = config.token;\n \n if (!token) {\n Logger.warning('Not logged in. Use `mcphost auth login` to authenticate.');\n return;\n }\n\n const user = config.user;\n if (user) {\n Logger.info(`Logged in as: ${user.email}${user.org ? ` (${user.org})` : ''}`);\n } else {\n Logger.warning('User info not available. Try logging in again.');\n }\n });\n\n return auth;\n}\n\n// Legacy commands (backwards compatibility)\nexport function createLegacyAuthCommands(): Command[] {\n const config = new Config();\n \n const login = new Command('login')\n .description('Authenticate with MCPHosting')\n .option('--token <token>', 'Provide API token directly')\n .action(async (options) => {\n const authCmd = createAuthCommands();\n const loginCmd = authCmd.commands.find(cmd => cmd.name() === 'login');\n if (loginCmd) {\n await loginCmd.action(options);\n }\n });\n\n const logout = new Command('logout')\n .description('Remove stored authentication')\n .action(() => {\n config.token = undefined;\n config.user = undefined;\n Logger.success('Logged out successfully');\n });\n\n const whoami = new Command('whoami')\n .description('Show current user information')\n .action(async () => {\n const authCmd = createAuthCommands();\n const whoamiCmd = authCmd.commands.find(cmd => cmd.name() === 'whoami');\n if (whoamiCmd) {\n await whoamiCmd.action();\n }\n });\n\n return [login, logout, whoami];\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 get token(): string | undefined {\n return 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 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 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}","import { MCPServer } from '../types.js';\n\nexport class MCPHostingAPI {\n private baseUrl = 'https://mcphosting.com/api';\n private token?: string;\n\n constructor(token?: string) {\n this.token = token;\n }\n\n private async request(endpoint: string, options: RequestInit = {}): Promise<any> {\n // For MVP, always throw to use static fallback\n // In production, this would make actual HTTP requests\n throw new Error(`API not available - using static fallback`);\n \n // Commented out for MVP - uncomment for production API calls\n /*\n const url = `${this.baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers as Record<string, string>\n };\n\n if (this.token) {\n headers.Authorization = `Bearer ${this.token}`;\n }\n\n const response = await fetch(url, {\n ...options,\n headers\n });\n\n if (!response.ok) {\n throw new Error(`API request failed: ${response.status} ${response.statusText}`);\n }\n\n return await response.json();\n */\n }\n\n async searchMCPs(query: string): Promise<MCPServer[]> {\n try {\n const results = await this.request(`/marketplace/search?q=${encodeURIComponent(query)}`);\n return results.mcps || [];\n } catch (error) {\n // Always fallback to static data for now\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 result = await this.request(`/marketplace/mcp/${slug}`);\n return result.mcp || null;\n } catch {\n // Fallback to static data\n const staticMCPs = this.getStaticMCPs();\n return staticMCPs.find(mcp => mcp.slug === slug) || null;\n }\n }\n\n async whoami(): Promise<{ email: string; org?: string } | null> {\n if (!this.token) return null;\n \n try {\n const result = await this.request('/auth/whoami');\n return result.user;\n } catch {\n return null;\n }\n }\n\n private getStaticMCPs(): MCPServer[] {\n // Curated list of popular MCP servers for fallback\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}","import chalk from 'chalk';\nimport ora, { Ora } from 'ora';\n\nexport class Logger {\n static info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n }\n\n static success(message: string): void {\n console.log(chalk.green('✓'), message);\n }\n\n static warning(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n }\n\n static error(message: string): void {\n console.error(chalk.red('✗'), message);\n }\n\n static dim(message: string): void {\n console.log(chalk.dim(message));\n }\n\n static bold(message: string): void {\n console.log(chalk.bold(message));\n }\n\n static spinner(text: string): Ora {\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 { ClientManager } from '../lib/clients.js';\nimport { Logger } from '../lib/logger.js';\nimport { SupportedClient } from '../types.js';\nimport chalk from 'chalk';\n\nexport function createConnectCommands(): Command {\n const connect = new Command('connect')\n .description('Connect an MCP server to AI clients')\n .argument('<url-or-slug>', 'MCP server URL or slug')\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 ${slug}`);\n Logger.info(`Use \\`mcphost disconnect ${slug}\\` to remove first`);\n return;\n }\n\n const clients: string[] = [];\n\n if (options.client) {\n // Connect to specific 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 to ${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 clients found');\n Logger.info('Supported clients: Claude Desktop, Cursor, VS Code, OpenClaw');\n Logger.info('Install a client and try again, or use --client chatgpt for web 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 \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 to ${clients.length} client${clients.length > 1 ? 's' : ''}`);\n }\n\n // Save connection to config\n config.addConnection({\n slug,\n url,\n clients\n });\n\n Logger.success(`🔗 ${name} connected successfully!`);\n Logger.dim(` URL: ${url}`);\n Logger.dim(` Clients: ${clients.join(', ')}`);\n\n // Growth hacking: show sharing message after successful connection\n console.log('\\n' + chalk.green('🎉 Connected! Share with your team:'));\n console.log(chalk.cyan(`npx mcphosting-cli connect ${urlOrSlug}`));\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('Connection failed');\n Logger.error(`Error: ${error}`);\n process.exit(1);\n }\n });\n\n return connect;\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 `mcphost 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 ${connection.slug}`);\n \n if (removedFrom.length > 0) {\n Logger.info(`Removed from: ${removedFrom.join(', ')}`);\n }\n \n } catch (error) {\n spinner.fail('Disconnect failed');\n Logger.error(`Error: ${error}`);\n }\n });\n}\n\nexport function createListCommand(): Command {\n return new Command('list')\n .description('List connected MCP servers')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const config = new Config();\n const connections = config.connections;\n \n if (connections.length === 0) {\n Logger.info('No MCP connections found');\n Logger.dim('Use `mcphost connect <url>` to add one');\n return;\n }\n\n if (options.json) {\n Logger.json(connections);\n return;\n }\n\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 \n console.log('');\n Logger.dim('Use `mcphost disconnect <slug>` to remove a connection');\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, 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 { 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 matching your query');\n Logger.dim('Try searching for: 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(`🔍 MCP Marketplace Search 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('Author:')} ${server.author}`);\n console.log(` ${chalk.green('Tools:')} ${server.tools.join(', ')}`);\n \n if (server.url) {\n console.log(` ${chalk.blue('Connect:')} ${chalk.dim(`mcphost connect ${server.slug}`)}`);\n }\n \n console.log('');\n });\n\n if (results.length > limit) {\n Logger.dim(`Showing ${limit} of ${results.length} results. Use --limit to see more.`);\n }\n\n Logger.info('Use `mcphost info <slug>` for detailed information');\n Logger.info('Use `mcphost connect <slug>` to install');\n\n } catch (error) {\n spinner.fail('Search failed');\n Logger.error(`Error: ${error}`);\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(`MCP server not found: ${slug}`);\n Logger.info('Use `mcphost search <query>` to find servers');\n return;\n }\n\n spinner.succeed('Found server info');\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 infoTable = [\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\n if (server.url) {\n infoTable.push({ Property: 'URL', Value: server.url });\n }\n\n Logger.table(infoTable);\n\n console.log('');\n console.log(chalk.yellow('🔧 Available Tools:'));\n server.tools.forEach(tool => {\n console.log(` • ${tool}`);\n });\n\n console.log('');\n console.log(chalk.green('💡 Quick Start:'));\n console.log(chalk.dim(` mcphost connect ${server.slug}`));\n\n // Check if already connected\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 } catch (error) {\n spinner.fail('Failed to get server info');\n Logger.error(`Error: ${error}`);\n process.exit(1);\n }\n });\n}","import { Command } from 'commander';\nimport { Config } from '../lib/config.js';\nimport { Logger } from '../lib/logger.js';\nimport chalk from 'chalk';\n\nexport function createServersCommand(): Command {\n const servers = new Command('servers');\n servers.description('Manage your hosted MCP servers');\n\n servers\n .command('list')\n .description('List your MCP servers')\n .action(async () => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate with MCPHosting');\n return;\n }\n\n Logger.info('🚧 Server management coming soon!');\n console.log('');\n console.log('This feature will let you:');\n console.log('• List your hosted MCP servers');\n console.log('• View usage analytics');\n console.log('• Manage API keys');\n console.log('• Publish to marketplace');\n console.log('');\n Logger.info('Visit https://mcphosting.com to manage servers in the web dashboard');\n });\n\n return servers;\n}\n\nexport function createKeysCommand(): Command {\n const keys = new Command('keys');\n keys.description('Manage API keys for your MCP servers');\n\n keys\n .command('list')\n .argument('[server-id]', 'Server ID')\n .description('List API keys')\n .action(async (serverId?: string) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 API key management coming soon!');\n Logger.info('Visit https://mcphosting.com to manage keys in the web dashboard');\n });\n\n keys\n .command('create')\n .argument('<server-id>', 'Server ID')\n .option('--name <name>', 'Key name', 'CLI Key')\n .description('Create a new API key')\n .action(async (serverId: string, options) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 API key creation coming soon!');\n Logger.info('Visit https://mcphosting.com to create keys in the web dashboard');\n });\n\n keys\n .command('revoke')\n .argument('<key-id>', 'API key ID')\n .description('Revoke an API key')\n .action(async (keyId: string) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 API key revocation coming soon!');\n Logger.info('Visit https://mcphosting.com to revoke keys in the web dashboard');\n });\n\n return keys;\n}\n\nexport function createPublishCommand(): Command {\n return new Command('publish')\n .description('Publish MCP server to marketplace')\n .argument('[server-id]', 'Server ID to publish')\n .option('--private', 'Keep server private')\n .option('--description <desc>', 'Server description')\n .option('--tags <tags>', 'Comma-separated tags')\n .action(async (serverId?: string, options = {}) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 Marketplace publishing coming soon!');\n console.log('');\n console.log('This feature will let you:');\n console.log('• Publish your MCP servers to the marketplace');\n console.log('• Set descriptions and tags');\n console.log('• Configure public/private visibility');\n console.log('• Track usage analytics');\n console.log('');\n Logger.info('Visit https://mcphosting.com to publish servers via the web dashboard');\n \n if (serverId) {\n Logger.dim(`Would publish server: ${serverId}`);\n }\n if (options.description) {\n Logger.dim(`Description: ${options.description}`);\n }\n if (options.tags) {\n Logger.dim(`Tags: ${options.tags}`);\n }\n });\n}"],"mappings":"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","names":["import_commander","Conf","chalk","ora","token","open","login","logout","whoami","import_commander","import_promises","import_chalk","chalk","import_commander","import_promises","import_path","import_os","import_chalk","chalk","import_commander","import_commander","import_chalk","chalk","import_commander","import_chalk","chalk"]}
|
package/dist/index.js
CHANGED
|
@@ -421,7 +421,7 @@ var ClientManager = class {
|
|
|
421
421
|
}
|
|
422
422
|
const serverEntry = {
|
|
423
423
|
command: "npx",
|
|
424
|
-
args: ["-y", "
|
|
424
|
+
args: ["-y", "mcphosting-cli", "proxy", url],
|
|
425
425
|
env: {}
|
|
426
426
|
};
|
|
427
427
|
try {
|
|
@@ -572,7 +572,7 @@ function createConnectCommands() {
|
|
|
572
572
|
Logger.dim(` URL: ${url}`);
|
|
573
573
|
Logger.dim(` Clients: ${clients.join(", ")}`);
|
|
574
574
|
console.log("\n" + chalk2.green("\u{1F389} Connected! Share with your team:"));
|
|
575
|
-
console.log(chalk2.cyan(`npx
|
|
575
|
+
console.log(chalk2.cyan(`npx mcphosting-cli connect ${urlOrSlug}`));
|
|
576
576
|
console.log("\n" + chalk2.yellow("\u2B50 Star us: ") + chalk2.blue("https://github.com/gorlomi-enzo/mcphosting-cli"));
|
|
577
577
|
console.log("");
|
|
578
578
|
} catch (error) {
|
|
@@ -720,7 +720,7 @@ async function importFromSmitery(options) {
|
|
|
720
720
|
}
|
|
721
721
|
let url = serverConfig.url;
|
|
722
722
|
if (!url) {
|
|
723
|
-
if (serverConfig.command === "npx" && serverConfig.args?.[0] === "
|
|
723
|
+
if (serverConfig.command === "npx" && serverConfig.args?.[0] === "mcphosting-cli") {
|
|
724
724
|
url = serverConfig.args[2];
|
|
725
725
|
} else {
|
|
726
726
|
url = `https://${slug}.mcphost.dev`;
|
|
@@ -766,7 +766,7 @@ async function importFromSmitery(options) {
|
|
|
766
766
|
console.log("");
|
|
767
767
|
Logger.info("Use `mcphost list` to see your imported connections");
|
|
768
768
|
console.log("\n" + chalk3.green("\u{1F389} Welcome to MCPHosting! Share with your team:"));
|
|
769
|
-
console.log(chalk3.cyan("npx
|
|
769
|
+
console.log(chalk3.cyan("npx mcphosting-cli import --from smithery"));
|
|
770
770
|
console.log("\n" + chalk3.yellow("\u2B50 Star us: ") + chalk3.blue("https://github.com/gorlomi-enzo/mcphosting-cli"));
|
|
771
771
|
console.log("");
|
|
772
772
|
} catch (error) {
|
|
@@ -849,7 +849,7 @@ async function forwardMessage(url, message, quiet) {
|
|
|
849
849
|
headers: {
|
|
850
850
|
"Content-Type": "application/json",
|
|
851
851
|
"Accept": "application/json",
|
|
852
|
-
"User-Agent": "
|
|
852
|
+
"User-Agent": "mcphosting-cli-proxy"
|
|
853
853
|
},
|
|
854
854
|
body: message
|
|
855
855
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/auth.ts","../src/lib/config.ts","../src/lib/api.ts","../src/lib/logger.ts","../src/commands/connect.ts","../src/lib/clients.ts","../src/commands/import.ts","../src/commands/proxy.ts","../src/commands/search.ts","../src/commands/servers.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createAuthCommands, createLegacyAuthCommands } from './commands/auth.js';\nimport { \n createConnectCommands, \n createDisconnectCommand, \n createListCommand \n} from './commands/connect.js';\nimport { createImportCommand } from './commands/import.js';\nimport { createProxyCommand } from './commands/proxy.js';\nimport { createSearchCommand, createInfoCommand } from './commands/search.js';\nimport { \n createServersCommand, \n createKeysCommand, \n createPublishCommand \n} from './commands/servers.js';\nimport { Logger } from './lib/logger.js';\nimport chalk from 'chalk';\n\nconst program = new Command();\n\nprogram\n .name('mcphost')\n .description('Connect AI agents to MCP servers. Browse, install, and manage Model Context Protocol servers.')\n .version('0.1.0')\n .configureOutput({\n outputError: (str, write) => {\n // Ensure errors go to stderr\n write(chalk.red(str));\n }\n });\n\n// Add the main commands\nprogram.addCommand(createConnectCommands());\nprogram.addCommand(createDisconnectCommand());\nprogram.addCommand(createListCommand());\nprogram.addCommand(createImportCommand());\nprogram.addCommand(createProxyCommand());\nprogram.addCommand(createSearchCommand());\nprogram.addCommand(createInfoCommand());\n\n// Add server management commands\nprogram.addCommand(createServersCommand());\nprogram.addCommand(createKeysCommand());\nprogram.addCommand(createPublishCommand());\n\n// Add auth commands both as subcommands and top-level (backwards compatibility)\nprogram.addCommand(createAuthCommands());\nconst [login, logout, whoami] = createLegacyAuthCommands();\nprogram.addCommand(login);\nprogram.addCommand(logout);\nprogram.addCommand(whoami);\n\n// Custom help\nprogram.configureHelp({\n subcommandTerm: (cmd) => chalk.cyan(cmd.name()),\n commandUsage: (cmd) => {\n const usage = cmd.usage();\n return chalk.yellow(usage);\n },\n commandDescription: (cmd) => {\n return chalk.dim(cmd.description());\n }\n});\n\n// Add custom help examples\nprogram.addHelpText('after', `\n${chalk.bold('Examples:')}\n ${chalk.cyan('mcphost connect github')} ${chalk.dim('Connect to GitHub MCP server')}\n ${chalk.cyan('mcphost connect https://my-mcp.example.com')} ${chalk.dim('Connect to custom MCP server')}\n ${chalk.cyan('mcphost connect slack --client claude')} ${chalk.dim('Connect Slack MCP only to Claude')}\n ${chalk.cyan('mcphost list')} ${chalk.dim('List all connected MCP servers')}\n ${chalk.cyan('mcphost search github')} ${chalk.dim('Search marketplace for MCP servers')}\n ${chalk.cyan('mcphost info notion')} ${chalk.dim('Get details about Notion MCP')}\n ${chalk.cyan('mcphost import --from smithery')} ${chalk.dim('Import connections from Smithery')}\n ${chalk.cyan('mcphost disconnect github')} ${chalk.dim('Remove GitHub MCP connection')}\n\n${chalk.bold('Supported AI Clients:')}\n • ${chalk.green('Claude Desktop')} - Auto-configured via claude_desktop_config.json\n • ${chalk.green('Cursor')} - Auto-configured via .cursor/mcp.json \n • ${chalk.green('VS Code')} - Configured via .vscode/mcp.json\n • ${chalk.green('OpenClaw')} - Auto-configured via ~/.openclaw/mcp.json\n • ${chalk.green('ChatGPT')} - Manual setup with web instructions\n\n${chalk.bold('Get Started:')}\n ${chalk.dim('1.')} ${chalk.cyan('mcphost search <topic>')} ${chalk.dim('Find MCP servers')}\n ${chalk.dim('2.')} ${chalk.cyan('mcphost connect <slug>')} ${chalk.dim('Connect to your AI clients')}\n ${chalk.dim('3.')} ${chalk.cyan('mcphost list')} ${chalk.dim('View your connections')}\n\n${chalk.yellow('⭐ Star us:')} ${chalk.blue('https://github.com/gorlomi-enzo/mcphosting-cli')}\n${chalk.yellow('📚 Docs:')} ${chalk.blue('https://mcphosting.com/docs')}\n`);\n\n// Global error handling\nprocess.on('uncaughtException', (error) => {\n Logger.error(`Uncaught error: ${error.message}`);\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (reason) => {\n Logger.error(`Unhandled rejection: ${reason}`);\n if (process.env.DEBUG) {\n console.error(reason);\n }\n process.exit(1);\n});\n\n// Handle Ctrl+C gracefully\nprocess.on('SIGINT', () => {\n console.log('\\n');\n Logger.info('Goodbye! 👋');\n process.exit(0);\n});\n\n// Parse CLI arguments\nasync function main() {\n try {\n await program.parseAsync();\n } catch (error) {\n Logger.error(`Command failed: ${error}`);\n if (process.env.DEBUG) {\n console.error(error);\n }\n process.exit(1);\n }\n}\n\nmain();","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';\n\nexport function createAuthCommands(): Command {\n const auth = new Command('auth');\n\n auth\n .command('login')\n .description('Authenticate with MCPHosting')\n .option('--token <token>', 'Provide API token directly')\n .action(async (options) => {\n const config = new Config();\n \n if (options.token) {\n // Manual token auth\n config.token = options.token;\n \n const api = new MCPHostingAPI(options.token);\n const user = await api.whoami();\n \n if (user) {\n config.user = user;\n Logger.success(`Logged in as ${user.email}${user.org ? ` (${user.org})` : ''}`);\n } else {\n Logger.warning('Token saved, but could not verify user info');\n }\n return;\n }\n\n // Browser OAuth flow\n const spinner = Logger.spinner('Starting login flow...');\n \n let server: any;\n let resolved = false;\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;\">\n <h2>✅ Login Successful!</h2>\n <p>You can now 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;\">\n <h2>❌ Login Failed</h2>\n <p>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 setTimeout(() => {\n if (!resolved) {\n reject(new Error('Login timeout - please try again'));\n }\n }, 120000); // 2 minute timeout\n \n open(authUrl).catch(() => {\n Logger.warning(`Could not open browser automatically. Please visit: ${authUrl}`);\n });\n });\n });\n\n const token = await authPromise;\n resolved = true;\n \n spinner.succeed('Login successful!');\n \n config.token = token;\n \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 ${user.email}${user.org ? ` (${user.org})` : ''}`);\n }\n\n } catch (error) {\n spinner.fail('Login failed');\n Logger.error(`Login error: ${error}`);\n process.exit(1);\n } finally {\n if (server) {\n server.close();\n }\n }\n });\n\n auth\n .command('logout')\n .description('Remove stored authentication')\n .action(() => {\n const config = new Config();\n config.token = undefined;\n config.user = undefined;\n Logger.success('Logged out successfully');\n });\n\n auth\n .command('whoami')\n .description('Show current user information')\n .action(async () => {\n const config = new Config();\n const token = config.token;\n \n if (!token) {\n Logger.warning('Not logged in. Use `mcphost auth login` to authenticate.');\n return;\n }\n\n const user = config.user;\n if (user) {\n Logger.info(`Logged in as: ${user.email}${user.org ? ` (${user.org})` : ''}`);\n } else {\n Logger.warning('User info not available. Try logging in again.');\n }\n });\n\n return auth;\n}\n\n// Legacy commands (backwards compatibility)\nexport function createLegacyAuthCommands(): Command[] {\n const config = new Config();\n \n const login = new Command('login')\n .description('Authenticate with MCPHosting')\n .option('--token <token>', 'Provide API token directly')\n .action(async (options) => {\n const authCmd = createAuthCommands();\n const loginCmd = authCmd.commands.find(cmd => cmd.name() === 'login');\n if (loginCmd) {\n await loginCmd.action(options);\n }\n });\n\n const logout = new Command('logout')\n .description('Remove stored authentication')\n .action(() => {\n config.token = undefined;\n config.user = undefined;\n Logger.success('Logged out successfully');\n });\n\n const whoami = new Command('whoami')\n .description('Show current user information')\n .action(async () => {\n const authCmd = createAuthCommands();\n const whoamiCmd = authCmd.commands.find(cmd => cmd.name() === 'whoami');\n if (whoamiCmd) {\n await whoamiCmd.action();\n }\n });\n\n return [login, logout, whoami];\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 get token(): string | undefined {\n return 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 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 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}","import { MCPServer } from '../types.js';\n\nexport class MCPHostingAPI {\n private baseUrl = 'https://mcphosting.com/api';\n private token?: string;\n\n constructor(token?: string) {\n this.token = token;\n }\n\n private async request(endpoint: string, options: RequestInit = {}): Promise<any> {\n // For MVP, always throw to use static fallback\n // In production, this would make actual HTTP requests\n throw new Error(`API not available - using static fallback`);\n \n // Commented out for MVP - uncomment for production API calls\n /*\n const url = `${this.baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers as Record<string, string>\n };\n\n if (this.token) {\n headers.Authorization = `Bearer ${this.token}`;\n }\n\n const response = await fetch(url, {\n ...options,\n headers\n });\n\n if (!response.ok) {\n throw new Error(`API request failed: ${response.status} ${response.statusText}`);\n }\n\n return await response.json();\n */\n }\n\n async searchMCPs(query: string): Promise<MCPServer[]> {\n try {\n const results = await this.request(`/marketplace/search?q=${encodeURIComponent(query)}`);\n return results.mcps || [];\n } catch (error) {\n // Always fallback to static data for now\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 result = await this.request(`/marketplace/mcp/${slug}`);\n return result.mcp || null;\n } catch {\n // Fallback to static data\n const staticMCPs = this.getStaticMCPs();\n return staticMCPs.find(mcp => mcp.slug === slug) || null;\n }\n }\n\n async whoami(): Promise<{ email: string; org?: string } | null> {\n if (!this.token) return null;\n \n try {\n const result = await this.request('/auth/whoami');\n return result.user;\n } catch {\n return null;\n }\n }\n\n private getStaticMCPs(): MCPServer[] {\n // Curated list of popular MCP servers for fallback\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}","import chalk from 'chalk';\nimport ora, { Ora } from 'ora';\n\nexport class Logger {\n static info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n }\n\n static success(message: string): void {\n console.log(chalk.green('✓'), message);\n }\n\n static warning(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n }\n\n static error(message: string): void {\n console.error(chalk.red('✗'), message);\n }\n\n static dim(message: string): void {\n console.log(chalk.dim(message));\n }\n\n static bold(message: string): void {\n console.log(chalk.bold(message));\n }\n\n static spinner(text: string): Ora {\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 { ClientManager } from '../lib/clients.js';\nimport { Logger } from '../lib/logger.js';\nimport { SupportedClient } from '../types.js';\nimport chalk from 'chalk';\n\nexport function createConnectCommands(): Command {\n const connect = new Command('connect')\n .description('Connect an MCP server to AI clients')\n .argument('<url-or-slug>', 'MCP server URL or slug')\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 ${slug}`);\n Logger.info(`Use \\`mcphost disconnect ${slug}\\` to remove first`);\n return;\n }\n\n const clients: string[] = [];\n\n if (options.client) {\n // Connect to specific 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 to ${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 clients found');\n Logger.info('Supported clients: Claude Desktop, Cursor, VS Code, OpenClaw');\n Logger.info('Install a client and try again, or use --client chatgpt for web 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 \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 to ${clients.length} client${clients.length > 1 ? 's' : ''}`);\n }\n\n // Save connection to config\n config.addConnection({\n slug,\n url,\n clients\n });\n\n Logger.success(`🔗 ${name} connected successfully!`);\n Logger.dim(` URL: ${url}`);\n Logger.dim(` Clients: ${clients.join(', ')}`);\n\n // Growth hacking: show sharing message after successful connection\n console.log('\\n' + chalk.green('🎉 Connected! Share with your team:'));\n console.log(chalk.cyan(`npx @mcphosting/cli connect ${urlOrSlug}`));\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('Connection failed');\n Logger.error(`Error: ${error}`);\n process.exit(1);\n }\n });\n\n return connect;\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 `mcphost 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 ${connection.slug}`);\n \n if (removedFrom.length > 0) {\n Logger.info(`Removed from: ${removedFrom.join(', ')}`);\n }\n \n } catch (error) {\n spinner.fail('Disconnect failed');\n Logger.error(`Error: ${error}`);\n }\n });\n}\n\nexport function createListCommand(): Command {\n return new Command('list')\n .description('List connected MCP servers')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const config = new Config();\n const connections = config.connections;\n \n if (connections.length === 0) {\n Logger.info('No MCP connections found');\n Logger.dim('Use `mcphost connect <url>` to add one');\n return;\n }\n\n if (options.json) {\n Logger.json(connections);\n return;\n }\n\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 \n console.log('');\n Logger.dim('Use `mcphost disconnect <slug>` to remove a connection');\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, 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 { 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 matching your query');\n Logger.dim('Try searching for: 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(`🔍 MCP Marketplace Search 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('Author:')} ${server.author}`);\n console.log(` ${chalk.green('Tools:')} ${server.tools.join(', ')}`);\n \n if (server.url) {\n console.log(` ${chalk.blue('Connect:')} ${chalk.dim(`mcphost connect ${server.slug}`)}`);\n }\n \n console.log('');\n });\n\n if (results.length > limit) {\n Logger.dim(`Showing ${limit} of ${results.length} results. Use --limit to see more.`);\n }\n\n Logger.info('Use `mcphost info <slug>` for detailed information');\n Logger.info('Use `mcphost connect <slug>` to install');\n\n } catch (error) {\n spinner.fail('Search failed');\n Logger.error(`Error: ${error}`);\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(`MCP server not found: ${slug}`);\n Logger.info('Use `mcphost search <query>` to find servers');\n return;\n }\n\n spinner.succeed('Found server info');\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 infoTable = [\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\n if (server.url) {\n infoTable.push({ Property: 'URL', Value: server.url });\n }\n\n Logger.table(infoTable);\n\n console.log('');\n console.log(chalk.yellow('🔧 Available Tools:'));\n server.tools.forEach(tool => {\n console.log(` • ${tool}`);\n });\n\n console.log('');\n console.log(chalk.green('💡 Quick Start:'));\n console.log(chalk.dim(` mcphost connect ${server.slug}`));\n\n // Check if already connected\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 } catch (error) {\n spinner.fail('Failed to get server info');\n Logger.error(`Error: ${error}`);\n process.exit(1);\n }\n });\n}","import { Command } from 'commander';\nimport { Config } from '../lib/config.js';\nimport { Logger } from '../lib/logger.js';\nimport chalk from 'chalk';\n\nexport function createServersCommand(): Command {\n const servers = new Command('servers');\n servers.description('Manage your hosted MCP servers');\n\n servers\n .command('list')\n .description('List your MCP servers')\n .action(async () => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate with MCPHosting');\n return;\n }\n\n Logger.info('🚧 Server management coming soon!');\n console.log('');\n console.log('This feature will let you:');\n console.log('• List your hosted MCP servers');\n console.log('• View usage analytics');\n console.log('• Manage API keys');\n console.log('• Publish to marketplace');\n console.log('');\n Logger.info('Visit https://mcphosting.com to manage servers in the web dashboard');\n });\n\n return servers;\n}\n\nexport function createKeysCommand(): Command {\n const keys = new Command('keys');\n keys.description('Manage API keys for your MCP servers');\n\n keys\n .command('list')\n .argument('[server-id]', 'Server ID')\n .description('List API keys')\n .action(async (serverId?: string) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 API key management coming soon!');\n Logger.info('Visit https://mcphosting.com to manage keys in the web dashboard');\n });\n\n keys\n .command('create')\n .argument('<server-id>', 'Server ID')\n .option('--name <name>', 'Key name', 'CLI Key')\n .description('Create a new API key')\n .action(async (serverId: string, options) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 API key creation coming soon!');\n Logger.info('Visit https://mcphosting.com to create keys in the web dashboard');\n });\n\n keys\n .command('revoke')\n .argument('<key-id>', 'API key ID')\n .description('Revoke an API key')\n .action(async (keyId: string) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 API key revocation coming soon!');\n Logger.info('Visit https://mcphosting.com to revoke keys in the web dashboard');\n });\n\n return keys;\n}\n\nexport function createPublishCommand(): Command {\n return new Command('publish')\n .description('Publish MCP server to marketplace')\n .argument('[server-id]', 'Server ID to publish')\n .option('--private', 'Keep server private')\n .option('--description <desc>', 'Server description')\n .option('--tags <tags>', 'Comma-separated tags')\n .action(async (serverId?: string, options = {}) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 Marketplace publishing coming soon!');\n console.log('');\n console.log('This feature will let you:');\n console.log('• Publish your MCP servers to the marketplace');\n console.log('• Set descriptions and tags');\n console.log('• Configure public/private visibility');\n console.log('• Track usage analytics');\n console.log('');\n Logger.info('Visit https://mcphosting.com to publish servers via the web dashboard');\n \n if (serverId) {\n Logger.dim(`Would publish server: ${serverId}`);\n }\n if (options.description) {\n Logger.dim(`Description: ${options.description}`);\n }\n if (options.tags) {\n Logger.dim(`Tags: ${options.tags}`);\n }\n });\n}"],"mappings":"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","names":["Command","token","login","logout","whoami","Command","chalk","Command","Command","readFile","access","join","homedir","chalk","Command","join","homedir","access","readFile","Command","Command","chalk","Command","Command","Command","chalk","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/auth.ts","../src/lib/config.ts","../src/lib/api.ts","../src/lib/logger.ts","../src/commands/connect.ts","../src/lib/clients.ts","../src/commands/import.ts","../src/commands/proxy.ts","../src/commands/search.ts","../src/commands/servers.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createAuthCommands, createLegacyAuthCommands } from './commands/auth.js';\nimport { \n createConnectCommands, \n createDisconnectCommand, \n createListCommand \n} from './commands/connect.js';\nimport { createImportCommand } from './commands/import.js';\nimport { createProxyCommand } from './commands/proxy.js';\nimport { createSearchCommand, createInfoCommand } from './commands/search.js';\nimport { \n createServersCommand, \n createKeysCommand, \n createPublishCommand \n} from './commands/servers.js';\nimport { Logger } from './lib/logger.js';\nimport chalk from 'chalk';\n\nconst program = new Command();\n\nprogram\n .name('mcphost')\n .description('Connect AI agents to MCP servers. Browse, install, and manage Model Context Protocol servers.')\n .version('0.1.0')\n .configureOutput({\n outputError: (str, write) => {\n // Ensure errors go to stderr\n write(chalk.red(str));\n }\n });\n\n// Add the main commands\nprogram.addCommand(createConnectCommands());\nprogram.addCommand(createDisconnectCommand());\nprogram.addCommand(createListCommand());\nprogram.addCommand(createImportCommand());\nprogram.addCommand(createProxyCommand());\nprogram.addCommand(createSearchCommand());\nprogram.addCommand(createInfoCommand());\n\n// Add server management commands\nprogram.addCommand(createServersCommand());\nprogram.addCommand(createKeysCommand());\nprogram.addCommand(createPublishCommand());\n\n// Add auth commands both as subcommands and top-level (backwards compatibility)\nprogram.addCommand(createAuthCommands());\nconst [login, logout, whoami] = createLegacyAuthCommands();\nprogram.addCommand(login);\nprogram.addCommand(logout);\nprogram.addCommand(whoami);\n\n// Custom help\nprogram.configureHelp({\n subcommandTerm: (cmd) => chalk.cyan(cmd.name()),\n commandUsage: (cmd) => {\n const usage = cmd.usage();\n return chalk.yellow(usage);\n },\n commandDescription: (cmd) => {\n return chalk.dim(cmd.description());\n }\n});\n\n// Add custom help examples\nprogram.addHelpText('after', `\n${chalk.bold('Examples:')}\n ${chalk.cyan('mcphost connect github')} ${chalk.dim('Connect to GitHub MCP server')}\n ${chalk.cyan('mcphost connect https://my-mcp.example.com')} ${chalk.dim('Connect to custom MCP server')}\n ${chalk.cyan('mcphost connect slack --client claude')} ${chalk.dim('Connect Slack MCP only to Claude')}\n ${chalk.cyan('mcphost list')} ${chalk.dim('List all connected MCP servers')}\n ${chalk.cyan('mcphost search github')} ${chalk.dim('Search marketplace for MCP servers')}\n ${chalk.cyan('mcphost info notion')} ${chalk.dim('Get details about Notion MCP')}\n ${chalk.cyan('mcphost import --from smithery')} ${chalk.dim('Import connections from Smithery')}\n ${chalk.cyan('mcphost disconnect github')} ${chalk.dim('Remove GitHub MCP connection')}\n\n${chalk.bold('Supported AI Clients:')}\n • ${chalk.green('Claude Desktop')} - Auto-configured via claude_desktop_config.json\n • ${chalk.green('Cursor')} - Auto-configured via .cursor/mcp.json \n • ${chalk.green('VS Code')} - Configured via .vscode/mcp.json\n • ${chalk.green('OpenClaw')} - Auto-configured via ~/.openclaw/mcp.json\n • ${chalk.green('ChatGPT')} - Manual setup with web instructions\n\n${chalk.bold('Get Started:')}\n ${chalk.dim('1.')} ${chalk.cyan('mcphost search <topic>')} ${chalk.dim('Find MCP servers')}\n ${chalk.dim('2.')} ${chalk.cyan('mcphost connect <slug>')} ${chalk.dim('Connect to your AI clients')}\n ${chalk.dim('3.')} ${chalk.cyan('mcphost list')} ${chalk.dim('View your connections')}\n\n${chalk.yellow('⭐ Star us:')} ${chalk.blue('https://github.com/gorlomi-enzo/mcphosting-cli')}\n${chalk.yellow('📚 Docs:')} ${chalk.blue('https://mcphosting.com/docs')}\n`);\n\n// Global error handling\nprocess.on('uncaughtException', (error) => {\n Logger.error(`Uncaught error: ${error.message}`);\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (reason) => {\n Logger.error(`Unhandled rejection: ${reason}`);\n if (process.env.DEBUG) {\n console.error(reason);\n }\n process.exit(1);\n});\n\n// Handle Ctrl+C gracefully\nprocess.on('SIGINT', () => {\n console.log('\\n');\n Logger.info('Goodbye! 👋');\n process.exit(0);\n});\n\n// Parse CLI arguments\nasync function main() {\n try {\n await program.parseAsync();\n } catch (error) {\n Logger.error(`Command failed: ${error}`);\n if (process.env.DEBUG) {\n console.error(error);\n }\n process.exit(1);\n }\n}\n\nmain();","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';\n\nexport function createAuthCommands(): Command {\n const auth = new Command('auth');\n\n auth\n .command('login')\n .description('Authenticate with MCPHosting')\n .option('--token <token>', 'Provide API token directly')\n .action(async (options) => {\n const config = new Config();\n \n if (options.token) {\n // Manual token auth\n config.token = options.token;\n \n const api = new MCPHostingAPI(options.token);\n const user = await api.whoami();\n \n if (user) {\n config.user = user;\n Logger.success(`Logged in as ${user.email}${user.org ? ` (${user.org})` : ''}`);\n } else {\n Logger.warning('Token saved, but could not verify user info');\n }\n return;\n }\n\n // Browser OAuth flow\n const spinner = Logger.spinner('Starting login flow...');\n \n let server: any;\n let resolved = false;\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;\">\n <h2>✅ Login Successful!</h2>\n <p>You can now 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;\">\n <h2>❌ Login Failed</h2>\n <p>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 setTimeout(() => {\n if (!resolved) {\n reject(new Error('Login timeout - please try again'));\n }\n }, 120000); // 2 minute timeout\n \n open(authUrl).catch(() => {\n Logger.warning(`Could not open browser automatically. Please visit: ${authUrl}`);\n });\n });\n });\n\n const token = await authPromise;\n resolved = true;\n \n spinner.succeed('Login successful!');\n \n config.token = token;\n \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 ${user.email}${user.org ? ` (${user.org})` : ''}`);\n }\n\n } catch (error) {\n spinner.fail('Login failed');\n Logger.error(`Login error: ${error}`);\n process.exit(1);\n } finally {\n if (server) {\n server.close();\n }\n }\n });\n\n auth\n .command('logout')\n .description('Remove stored authentication')\n .action(() => {\n const config = new Config();\n config.token = undefined;\n config.user = undefined;\n Logger.success('Logged out successfully');\n });\n\n auth\n .command('whoami')\n .description('Show current user information')\n .action(async () => {\n const config = new Config();\n const token = config.token;\n \n if (!token) {\n Logger.warning('Not logged in. Use `mcphost auth login` to authenticate.');\n return;\n }\n\n const user = config.user;\n if (user) {\n Logger.info(`Logged in as: ${user.email}${user.org ? ` (${user.org})` : ''}`);\n } else {\n Logger.warning('User info not available. Try logging in again.');\n }\n });\n\n return auth;\n}\n\n// Legacy commands (backwards compatibility)\nexport function createLegacyAuthCommands(): Command[] {\n const config = new Config();\n \n const login = new Command('login')\n .description('Authenticate with MCPHosting')\n .option('--token <token>', 'Provide API token directly')\n .action(async (options) => {\n const authCmd = createAuthCommands();\n const loginCmd = authCmd.commands.find(cmd => cmd.name() === 'login');\n if (loginCmd) {\n await loginCmd.action(options);\n }\n });\n\n const logout = new Command('logout')\n .description('Remove stored authentication')\n .action(() => {\n config.token = undefined;\n config.user = undefined;\n Logger.success('Logged out successfully');\n });\n\n const whoami = new Command('whoami')\n .description('Show current user information')\n .action(async () => {\n const authCmd = createAuthCommands();\n const whoamiCmd = authCmd.commands.find(cmd => cmd.name() === 'whoami');\n if (whoamiCmd) {\n await whoamiCmd.action();\n }\n });\n\n return [login, logout, whoami];\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 get token(): string | undefined {\n return 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 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 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}","import { MCPServer } from '../types.js';\n\nexport class MCPHostingAPI {\n private baseUrl = 'https://mcphosting.com/api';\n private token?: string;\n\n constructor(token?: string) {\n this.token = token;\n }\n\n private async request(endpoint: string, options: RequestInit = {}): Promise<any> {\n // For MVP, always throw to use static fallback\n // In production, this would make actual HTTP requests\n throw new Error(`API not available - using static fallback`);\n \n // Commented out for MVP - uncomment for production API calls\n /*\n const url = `${this.baseUrl}${endpoint}`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers as Record<string, string>\n };\n\n if (this.token) {\n headers.Authorization = `Bearer ${this.token}`;\n }\n\n const response = await fetch(url, {\n ...options,\n headers\n });\n\n if (!response.ok) {\n throw new Error(`API request failed: ${response.status} ${response.statusText}`);\n }\n\n return await response.json();\n */\n }\n\n async searchMCPs(query: string): Promise<MCPServer[]> {\n try {\n const results = await this.request(`/marketplace/search?q=${encodeURIComponent(query)}`);\n return results.mcps || [];\n } catch (error) {\n // Always fallback to static data for now\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 result = await this.request(`/marketplace/mcp/${slug}`);\n return result.mcp || null;\n } catch {\n // Fallback to static data\n const staticMCPs = this.getStaticMCPs();\n return staticMCPs.find(mcp => mcp.slug === slug) || null;\n }\n }\n\n async whoami(): Promise<{ email: string; org?: string } | null> {\n if (!this.token) return null;\n \n try {\n const result = await this.request('/auth/whoami');\n return result.user;\n } catch {\n return null;\n }\n }\n\n private getStaticMCPs(): MCPServer[] {\n // Curated list of popular MCP servers for fallback\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}","import chalk from 'chalk';\nimport ora, { Ora } from 'ora';\n\nexport class Logger {\n static info(message: string): void {\n console.log(chalk.blue('ℹ'), message);\n }\n\n static success(message: string): void {\n console.log(chalk.green('✓'), message);\n }\n\n static warning(message: string): void {\n console.log(chalk.yellow('⚠'), message);\n }\n\n static error(message: string): void {\n console.error(chalk.red('✗'), message);\n }\n\n static dim(message: string): void {\n console.log(chalk.dim(message));\n }\n\n static bold(message: string): void {\n console.log(chalk.bold(message));\n }\n\n static spinner(text: string): Ora {\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 { ClientManager } from '../lib/clients.js';\nimport { Logger } from '../lib/logger.js';\nimport { SupportedClient } from '../types.js';\nimport chalk from 'chalk';\n\nexport function createConnectCommands(): Command {\n const connect = new Command('connect')\n .description('Connect an MCP server to AI clients')\n .argument('<url-or-slug>', 'MCP server URL or slug')\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 ${slug}`);\n Logger.info(`Use \\`mcphost disconnect ${slug}\\` to remove first`);\n return;\n }\n\n const clients: string[] = [];\n\n if (options.client) {\n // Connect to specific 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 to ${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 clients found');\n Logger.info('Supported clients: Claude Desktop, Cursor, VS Code, OpenClaw');\n Logger.info('Install a client and try again, or use --client chatgpt for web 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 \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 to ${clients.length} client${clients.length > 1 ? 's' : ''}`);\n }\n\n // Save connection to config\n config.addConnection({\n slug,\n url,\n clients\n });\n\n Logger.success(`🔗 ${name} connected successfully!`);\n Logger.dim(` URL: ${url}`);\n Logger.dim(` Clients: ${clients.join(', ')}`);\n\n // Growth hacking: show sharing message after successful connection\n console.log('\\n' + chalk.green('🎉 Connected! Share with your team:'));\n console.log(chalk.cyan(`npx mcphosting-cli connect ${urlOrSlug}`));\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('Connection failed');\n Logger.error(`Error: ${error}`);\n process.exit(1);\n }\n });\n\n return connect;\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 `mcphost 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 ${connection.slug}`);\n \n if (removedFrom.length > 0) {\n Logger.info(`Removed from: ${removedFrom.join(', ')}`);\n }\n \n } catch (error) {\n spinner.fail('Disconnect failed');\n Logger.error(`Error: ${error}`);\n }\n });\n}\n\nexport function createListCommand(): Command {\n return new Command('list')\n .description('List connected MCP servers')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n const config = new Config();\n const connections = config.connections;\n \n if (connections.length === 0) {\n Logger.info('No MCP connections found');\n Logger.dim('Use `mcphost connect <url>` to add one');\n return;\n }\n\n if (options.json) {\n Logger.json(connections);\n return;\n }\n\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 \n console.log('');\n Logger.dim('Use `mcphost disconnect <slug>` to remove a connection');\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, 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 { 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 matching your query');\n Logger.dim('Try searching for: 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(`🔍 MCP Marketplace Search 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('Author:')} ${server.author}`);\n console.log(` ${chalk.green('Tools:')} ${server.tools.join(', ')}`);\n \n if (server.url) {\n console.log(` ${chalk.blue('Connect:')} ${chalk.dim(`mcphost connect ${server.slug}`)}`);\n }\n \n console.log('');\n });\n\n if (results.length > limit) {\n Logger.dim(`Showing ${limit} of ${results.length} results. Use --limit to see more.`);\n }\n\n Logger.info('Use `mcphost info <slug>` for detailed information');\n Logger.info('Use `mcphost connect <slug>` to install');\n\n } catch (error) {\n spinner.fail('Search failed');\n Logger.error(`Error: ${error}`);\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(`MCP server not found: ${slug}`);\n Logger.info('Use `mcphost search <query>` to find servers');\n return;\n }\n\n spinner.succeed('Found server info');\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 infoTable = [\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\n if (server.url) {\n infoTable.push({ Property: 'URL', Value: server.url });\n }\n\n Logger.table(infoTable);\n\n console.log('');\n console.log(chalk.yellow('🔧 Available Tools:'));\n server.tools.forEach(tool => {\n console.log(` • ${tool}`);\n });\n\n console.log('');\n console.log(chalk.green('💡 Quick Start:'));\n console.log(chalk.dim(` mcphost connect ${server.slug}`));\n\n // Check if already connected\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 } catch (error) {\n spinner.fail('Failed to get server info');\n Logger.error(`Error: ${error}`);\n process.exit(1);\n }\n });\n}","import { Command } from 'commander';\nimport { Config } from '../lib/config.js';\nimport { Logger } from '../lib/logger.js';\nimport chalk from 'chalk';\n\nexport function createServersCommand(): Command {\n const servers = new Command('servers');\n servers.description('Manage your hosted MCP servers');\n\n servers\n .command('list')\n .description('List your MCP servers')\n .action(async () => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate with MCPHosting');\n return;\n }\n\n Logger.info('🚧 Server management coming soon!');\n console.log('');\n console.log('This feature will let you:');\n console.log('• List your hosted MCP servers');\n console.log('• View usage analytics');\n console.log('• Manage API keys');\n console.log('• Publish to marketplace');\n console.log('');\n Logger.info('Visit https://mcphosting.com to manage servers in the web dashboard');\n });\n\n return servers;\n}\n\nexport function createKeysCommand(): Command {\n const keys = new Command('keys');\n keys.description('Manage API keys for your MCP servers');\n\n keys\n .command('list')\n .argument('[server-id]', 'Server ID')\n .description('List API keys')\n .action(async (serverId?: string) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 API key management coming soon!');\n Logger.info('Visit https://mcphosting.com to manage keys in the web dashboard');\n });\n\n keys\n .command('create')\n .argument('<server-id>', 'Server ID')\n .option('--name <name>', 'Key name', 'CLI Key')\n .description('Create a new API key')\n .action(async (serverId: string, options) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 API key creation coming soon!');\n Logger.info('Visit https://mcphosting.com to create keys in the web dashboard');\n });\n\n keys\n .command('revoke')\n .argument('<key-id>', 'API key ID')\n .description('Revoke an API key')\n .action(async (keyId: string) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 API key revocation coming soon!');\n Logger.info('Visit https://mcphosting.com to revoke keys in the web dashboard');\n });\n\n return keys;\n}\n\nexport function createPublishCommand(): Command {\n return new Command('publish')\n .description('Publish MCP server to marketplace')\n .argument('[server-id]', 'Server ID to publish')\n .option('--private', 'Keep server private')\n .option('--description <desc>', 'Server description')\n .option('--tags <tags>', 'Comma-separated tags')\n .action(async (serverId?: string, options = {}) => {\n const config = new Config();\n \n if (!config.token) {\n Logger.warning('Authentication required');\n Logger.info('Use `mcphost login` to authenticate');\n return;\n }\n\n Logger.info('🚧 Marketplace publishing coming soon!');\n console.log('');\n console.log('This feature will let you:');\n console.log('• Publish your MCP servers to the marketplace');\n console.log('• Set descriptions and tags');\n console.log('• Configure public/private visibility');\n console.log('• Track usage analytics');\n console.log('');\n Logger.info('Visit https://mcphosting.com to publish servers via the web dashboard');\n \n if (serverId) {\n Logger.dim(`Would publish server: ${serverId}`);\n }\n if (options.description) {\n Logger.dim(`Description: ${options.description}`);\n }\n if (options.tags) {\n Logger.dim(`Tags: ${options.tags}`);\n }\n });\n}"],"mappings":"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","names":["Command","token","login","logout","whoami","Command","chalk","Command","Command","readFile","access","join","homedir","chalk","Command","join","homedir","access","readFile","Command","Command","chalk","Command","Command","Command","chalk","Command"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcphosting-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Connect AI agents to MCP servers. Browse, install, and manage Model Context Protocol servers.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"mcphost": "dist/index.js"
|
|
@@ -58,4 +58,4 @@
|
|
|
58
58
|
"README.md",
|
|
59
59
|
"LICENSE"
|
|
60
60
|
]
|
|
61
|
-
}
|
|
61
|
+
}
|