answer-book-mcp
Version:
智能问答和决策辅助的 MCP (Model Context Protocol) 服务器
111 lines (94 loc) • 3.07 kB
JavaScript
/**
* 答案之书 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 }