UNPKG

geoapify-mcp-server

Version:

Geoapify API MCP Server for location-based services - 一键部署的地理位置服务

239 lines (200 loc) 6.42 kB
#!/usr/bin/env node /** * Geoapify MCP Server CLI * 支持npx调用的命令行工具 */ const { spawn } = require('child_process'); const path = require('path'); const fs = require('fs'); // 颜色输出 const colors = { green: '\x1b[32m', red: '\x1b[31m', yellow: '\x1b[33m', blue: '\x1b[34m', cyan: '\x1b[36m', reset: '\x1b[0m' }; function log(color, message) { console.log(`${colors[color]}${message}${colors.reset}`); } function showHelp() { console.log(` ${colors.cyan}Geoapify MCP Server CLI${colors.reset} ${colors.yellow}用法:${colors.reset} npx geoapify-mcp-server [命令] [选项] ${colors.yellow}命令:${colors.reset} start 启动服务器 dev 开发模式启动 deploy 部署服务 test 运行测试 docker Docker部署 local 本地部署 status 查看状态 stop 停止服务 help 显示帮助 ${colors.yellow}选项:${colors.reset} --port <port> 指定端口 (默认: 50001) --env <env> 指定环境 (development|production) --api-key <key> 指定API密钥 --verbose 详细输出 --no-redis 不使用Redis缓存 ${colors.yellow}示例:${colors.reset} npx geoapify-mcp-server start npx geoapify-mcp-server deploy --env production npx geoapify-mcp-server docker npx geoapify-mcp-server test --verbose ${colors.yellow}快速开始:${colors.reset} 1. npx geoapify-mcp-server deploy 2. npx geoapify-mcp-server test 3. 访问 http://localhost:50001/health ${colors.yellow}更多信息:${colors.reset} GitHub: https://github.com/your-repo/geoapify-mcp-server 文档: README.md `); } function parseArgs() { const args = process.argv.slice(2); const command = args[0] || 'help'; const options = {}; for (let i = 1; i < args.length; i++) { const arg = args[i]; if (arg.startsWith('--')) { const key = arg.slice(2); const value = args[i + 1] && !args[i + 1].startsWith('--') ? args[++i] : true; options[key] = value; } } return { command, options }; } function runScript(scriptPath, args = [], options = {}) { return new Promise((resolve, reject) => { const child = spawn('node', [scriptPath, ...args], { stdio: 'inherit', cwd: __dirname, env: { ...process.env, ...options.env } }); child.on('close', (code) => { if (code === 0) { resolve(); } else { reject(new Error(`Script exited with code ${code}`)); } }); child.on('error', reject); }); } function runShellScript(scriptPath, args = []) { return new Promise((resolve, reject) => { const child = spawn('bash', [scriptPath, ...args], { stdio: 'inherit', cwd: path.dirname(__dirname) }); child.on('close', (code) => { if (code === 0) { resolve(); } else { reject(new Error(`Script exited with code ${code}`)); } }); child.on('error', reject); }); } async function handleCommand(command, options) { const rootDir = path.dirname(__dirname); try { switch (command) { case 'start': log('blue', '🚀 启动 Geoapify MCP Server...'); await runScript(path.join(rootDir, 'src/server.js'), [], { env: { PORT: options.port || '50001', NODE_ENV: options.env || 'production', GEOAPIFY_API_KEY: options['api-key'] || '3234bd7e35264a8aa29fc15e89f8f76f', LOG_LEVEL: options.verbose ? 'debug' : 'info' } }); break; case 'dev': log('blue', '🔧 开发模式启动...'); await runScript(path.join(rootDir, 'src/server.js'), [], { env: { PORT: options.port || '50001', NODE_ENV: 'development', GEOAPIFY_API_KEY: options['api-key'] || '3234bd7e35264a8aa29fc15e89f8f76f', LOG_LEVEL: 'debug' } }); break; case 'deploy': log('blue', '📦 部署服务...'); if (options.env === 'production') { await runShellScript(path.join(rootDir, 'scripts/local-deploy.sh')); } else { await runShellScript(path.join(rootDir, 'scripts/local-deploy.sh')); } break; case 'docker': log('blue', '🐳 Docker部署...'); await runShellScript(path.join(rootDir, 'scripts/docker-deploy.sh'), ['prod']); break; case 'local': log('blue', '💻 本地部署...'); await runShellScript(path.join(rootDir, 'scripts/local-deploy.sh')); break; case 'test': log('blue', '🧪 运行测试...'); if (fs.existsSync(path.join(rootDir, 'test-quick.js'))) { await runScript(path.join(rootDir, 'test-quick.js')); } else { await runShellScript(path.join(rootDir, 'scripts/docker-test.sh')); } break; case 'status': log('blue', '📊 查看状态...'); await runShellScript(path.join(rootDir, 'scripts/local-deploy.sh'), ['status']); break; case 'stop': log('blue', '⏹️ 停止服务...'); await runShellScript(path.join(rootDir, 'scripts/local-deploy.sh'), ['stop']); break; case 'help': case '--help': case '-h': showHelp(); break; default: log('red', `❌ 未知命令: ${command}`); log('yellow', '使用 "npx geoapify-mcp-server help" 查看帮助'); process.exit(1); } } catch (error) { log('red', `❌ 执行失败: ${error.message}`); process.exit(1); } } // 主函数 async function main() { const { command, options } = parseArgs(); // 显示欢迎信息 if (command !== 'help' && !options.quiet) { log('cyan', '🌍 Geoapify MCP Server CLI'); log('green', `执行命令: ${command}`); console.log(''); } await handleCommand(command, options); } // 错误处理 process.on('uncaughtException', (error) => { log('red', `❌ 未捕获的异常: ${error.message}`); process.exit(1); }); process.on('unhandledRejection', (reason) => { log('red', `❌ 未处理的Promise拒绝: ${reason}`); process.exit(1); }); // 运行主函数 if (require.main === module) { main(); } module.exports = { main, handleCommand, parseArgs };