mira-app-server
Version:
Mira Server - standalone server application using mira-app-core
103 lines • 4.35 kB
JavaScript
;
/**
* 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