geoapify-mcp-server
Version:
Geoapify API MCP Server for location-based services - 一键部署的地理位置服务
239 lines (200 loc) • 6.42 kB
JavaScript
/**
* 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 };