Skip to main content
Glama
server.js3.94 kB
/** * SiYuan MCP 服务器核心 */ import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; import { createSiyuanTools } from '../../dist/index.js'; import { DefaultToolRegistry } from './registry.js'; import { ConsoleLogger } from './logger.js'; import { createAllHandlers } from '../handlers/index.js'; /** * SiYuan MCP 服务器 */ export class SiyuanMCPServer { config; mcpServer; registry = new DefaultToolRegistry(); context; logger = new ConsoleLogger(); constructor(config) { this.config = config; // 初始化 SiYuan 工具 const siyuan = createSiyuanTools(config.baseUrl, config.token); // 创建执行上下文 this.context = { siyuan, config, logger: this.logger, }; // 注册所有工具处理器 this.registerHandlers(); // 创建 MCP 服务器实例 this.mcpServer = new Server({ name: config.name || 'siyuan-mcp-server', version: config.version || '0.1.0', }, { capabilities: { tools: {}, }, }); // 设置请求处理器 this.setupRequestHandlers(); } /** * 注册所有工具处理器 */ registerHandlers() { const handlers = createAllHandlers(); for (const handler of handlers) { this.registry.register(handler); this.logger.debug(`Registered tool: ${handler.name}`); } } /** * 设置 MCP 请求处理器 */ setupRequestHandlers() { // 处理工具列表请求 this.mcpServer.setRequestHandler(ListToolsRequestSchema, async () => { const tools = this.registry.getAll().map((handler) => ({ name: handler.name, description: handler.description, inputSchema: handler.inputSchema, })); this.logger.debug(`Listing ${tools.length} tools`); return { tools }; }); // 处理工具调用请求 this.mcpServer.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; this.logger.info(`Tool called: ${name}`); try { const handler = this.registry.get(name); if (!handler) { throw new Error(`Unknown tool: ${name}`); } // 执行工具 const result = await handler.execute(args || {}, this.context); // 格式化返回结果 const response = { content: [ { type: 'text', text: typeof result === 'string' ? result : JSON.stringify(result, null, 2), }, ], }; return response; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); this.logger.error(`Tool execution failed: ${errorMessage}`); return { content: [ { type: 'text', text: `Error: ${errorMessage}`, }, ], isError: true, }; } }); } /** * 获取底层 MCP 服务器实例 */ getMCPServer() { return this.mcpServer; } /** * 获取工具注册表 */ getRegistry() { return this.registry; } /** * 获取日志记录器 */ getLogger() { return this.logger; } } //# sourceMappingURL=server.js.map

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/porkll/siyuan-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server