import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { loadConfig } from "./config";
import { XiaomiNoteClient } from "./client";
import { ContentConverter } from "./converter";
import { NotesCache } from "./cache";
import { registerListNotesTool } from "./tools/list-notes";
import { registerGetNoteTool } from "./tools/get-note";
import { registerCreateNoteTool } from "./tools/create-note";
import { registerUpdateNoteTool } from "./tools/update-note";
import { registerDeleteNoteTool } from "./tools/delete-note";
import { registerSearchNotesTool } from "./tools/search-notes";
import { registerUploadImageTool } from "./tools/upload-image";
import { registerListFoldersTool } from "./tools/list-folders";
import { registerCreateFolderTool } from "./tools/create-folder";
import { registerUpdateFolderTool } from "./tools/update-folder";
import { registerDeleteFolderTool } from "./tools/delete-folder";
import { registerMoveNoteTool } from "./tools/move-note";
import { registerNotesListResource } from "./resources/notes-list";
import { registerNoteDetailResource } from "./resources/note-detail";
import { registerFoldersListResource } from "./resources/folders-list";
import { registerFolderNotesResource } from "./resources/folder-notes";
async function bootstrap(): Promise<void> {
const { config, save } = await loadConfig();
const server = new McpServer({
name: "mi-note-mcp",
version: "0.1.0",
websiteUrl: "https://i.mi.com/note/h5",
});
const client = new XiaomiNoteClient(config, {
onConfigUpdated: async (updated) => {
try {
await save(updated);
} catch (error) {
console.error(`保存配置失败:${(error as Error).message}`);
}
},
});
const converter = new ContentConverter();
const cache = new NotesCache(client, converter, {
syncInterval: config.syncInterval,
});
await cache.init();
registerListNotesTool(server, cache);
registerGetNoteTool(server, client, converter, cache);
registerCreateNoteTool(server, client, converter, cache);
registerUpdateNoteTool(server, client, converter, cache);
registerDeleteNoteTool(server, client, cache);
registerSearchNotesTool(server, cache);
registerUploadImageTool(server, client);
registerListFoldersTool(server, cache);
registerCreateFolderTool(server, client, cache);
registerUpdateFolderTool(server, client, cache);
registerDeleteFolderTool(server, client, cache);
registerMoveNoteTool(server, client, cache);
registerNotesListResource(server, cache);
registerNoteDetailResource(server, client, converter, cache);
registerFoldersListResource(server, cache);
registerFolderNotesResource(server, cache, converter);
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("mi-note-mcp server started");
const cleanup = () => cache.dispose();
process.once("SIGINT", cleanup);
process.once("SIGTERM", cleanup);
}
bootstrap().catch((error) => {
console.error("mi-note-mcp 启动失败:", error);
process.exitCode = 1;
});