UNPKG

mira-app-server

Version:

Mira Server - standalone server application using mira-app-core

103 lines 4.35 kB
"use strict"; /** * Mira MCP Server * * 把 mira-app-core/shared/sdk 的全部能力暴露为 MCP tools,通过 stdio 与 * MCP 客户端(如 Claude / 其它 agent)通信。鉴权复用 CLI 的 profile 体系: * 工具默认使用当前 profile 的 server+token;未登录时返回清晰的错误提示。 * * 启动方式:mira-app-server --mcp [--server <url>] [--token <token>] [--debug] * * 重要:MCP 协议要求 stdout 仅承载 JSON-RPC,所有日志必须走 stderr。 */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.startMcpServer = startMcpServer; const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js"); const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js"); const sdk_1 = require("mira-app-core/shared/sdk"); const client_1 = require("../cli/client"); const auth_1 = require("./tools/auth"); const system_1 = require("./tools/system"); const libraries_1 = require("./tools/libraries"); const files_1 = require("./tools/files"); const tags_1 = require("./tools/tags"); const folders_1 = require("./tools/folders"); const plugins_1 = require("./tools/plugins"); const devices_1 = require("./tools/devices"); const database_1 = require("./tools/database"); /** 读取 package 版本(编译产物位于 dist/,package.json 在其上一级目录) */ function getVersion() { try { // eslint-disable-next-line @typescript-eslint/no-var-requires const pkg = require(path_1.default.resolve(__dirname, '..', 'package.json')); return pkg.version || '0.0.0'; } catch { return '0.0.0'; } } const path_1 = __importDefault(require("path")); /** * 启动 MCP 服务(stdio 传输)。进程会持续运行直到 stdin 关闭或客户端断开。 */ async function startMcpServer(options = {}) { const debug = options.debug || process.env.MIRA_MCP_DEBUG === '1'; const log = (msg) => { if (debug) process.stderr.write(`[mira-mcp] ${msg}\n`); }; // 解析连接:命令行覆盖 > 当前 profile > 默认 const conn = (0, client_1.resolveConnection)({ server: options.server, token: options.token, }); log(`target server=${conn.server} token=${conn.token ? '(set)' : '(none)'}`); // getClient:每次调用都新建一个 MiraClient(轻量),按需注入 token。 // 这样 auth_login 修改 profile 后,后续调用能拿到新 token。 const ctx = { server: conn.server, token: conn.token, debug: log, getClient: (requireAuth = true) => { // 每次都重新解析,以便感知 auth_login 等改动 const c = (0, client_1.resolveConnection)({ server: options.server, token: options.token }); if (requireAuth && !c.token) { throw new Error('未登录:请先调用 auth_login 工具登录,或在启动 MCP 前用 `mira-app-server login` 登录'); } const client = new sdk_1.MiraClient(c.server); if (c.token) client.setToken(c.token); return client; }, }; const mcp = new mcp_js_1.McpServer({ name: 'mira-app-server', version: getVersion() } // 不传 capabilities 选项:工具能力由 registerTool 内部自动声明 ); // 注册各模块工具 const registrars = [ auth_1.registerAuthTools, system_1.registerSystemTools, libraries_1.registerLibraryTools, files_1.registerFileTools, tags_1.registerTagTools, folders_1.registerFolderTools, plugins_1.registerPluginTools, devices_1.registerDeviceTools, database_1.registerDatabaseTools, ]; registrars.forEach(fn => fn(mcp, ctx)); log(`registered tools from ${registrars.length} modules`); // 通过 stdio 传输连接 const transport = new stdio_js_1.StdioServerTransport(); await mcp.connect(transport); log('MCP server connected on stdio'); // transport 关闭(客户端断开 / stdin EOF)时退出进程 transport.onclose = () => { log('transport closed, exiting'); process.exit(0); }; } //# sourceMappingURL=server.js.map