UNPKG

answer-book-mcp

Version:

智能问答和决策辅助的 MCP (Model Context Protocol) 服务器

111 lines (94 loc) 3.07 kB
#!/usr/bin/env node /** * 答案之书 MCP 服务器入口文件 * 智能问答和决策辅助的 MCP (Model Context Protocol) 服务器 */ import { Server } from '@modelcontextprotocol/sdk/server/index.js' import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js' import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js' import { AnswerBookServer } from './server.js' import { logger } from './utils/logger.js' import dotenv from 'dotenv' // 加载环境变量 dotenv.config() /** * 主函数 - 启动 MCP 服务器 */ async function main () { try { logger.info('启动答案之书 MCP 服务器...') // 创建 MCP 服务器实例 const server = new Server( { name: 'answer-book-mcp', version: '1.0.0' }, { capabilities: { tools: {} } } ) // 创建答案之书服务器实例 const answerBookServer = new AnswerBookServer() await answerBookServer.initialize() // 注册工具列表处理器 server.setRequestHandler(ListToolsRequestSchema, async () => { logger.debug('收到工具列表请求') return { tools: answerBookServer.getToolDefinitions() } }) // 注册工具调用处理器 server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params logger.info(`调用工具: ${name}`, { args }) try { const result = await answerBookServer.callTool(name, args) logger.debug(`工具 ${name} 执行成功`, { result }) return result } catch (error) { logger.error(`工具 ${name} 执行失败`, { error: error.message, stack: error.stack }) throw error } }) // 创建 stdio 传输层 const transport = new StdioServerTransport() // 连接服务器和传输层 await server.connect(transport) logger.info('答案之书 MCP 服务器启动成功') logger.info('等待客户端连接...') } catch (error) { logger.error('服务器启动失败', { error: error.message, stack: error.stack }) process.exit(1) } } /** * 优雅关闭处理 */ function setupGracefulShutdown () { const shutdown = (signal) => { logger.info(`收到 ${signal} 信号,正在关闭服务器...`) process.exit(0) } process.on('SIGINT', () => shutdown('SIGINT')) process.on('SIGTERM', () => shutdown('SIGTERM')) process.on('uncaughtException', (error) => { logger.error('未捕获的异常', { error: error.message, stack: error.stack }) process.exit(1) }) process.on('unhandledRejection', (reason, promise) => { logger.error('未处理的 Promise 拒绝', { reason, promise }) process.exit(1) }) } // 设置优雅关闭 setupGracefulShutdown() // 启动服务器 if (import.meta.url === `file://${process.argv[1]}`) { main().catch((error) => { logger.error('启动失败', { error: error.message, stack: error.stack }) process.exit(1) }) } export { main }