import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { ContentConverter } from "../converter";
import { XiaomiNoteClient } from "../client";
import { NotesCache } from "../cache";
import { buildNotesListItem, deriveNoteTitle } from "../note";
export function registerNoteDetailResource(
server: McpServer,
client: XiaomiNoteClient,
converter: ContentConverter,
cache: NotesCache,
): void {
const template = new ResourceTemplate("minote://notes/{id}", {
list: async () => {
const resources = cache.getNotes().map((note) => {
const item = buildNotesListItem(note, converter);
return {
name: item.id,
title: item.title,
uri: `minote://notes/${item.id}`,
description: `最后修改:${new Date(item.modifyDate).toISOString()}`,
mimeType: "text/markdown",
};
});
return { resources };
},
});
server.registerResource(
"note-detail",
template,
{
title: "笔记详情",
description: "根据 ID 返回笔记 Markdown 内容",
mimeType: "text/markdown",
},
async (_uri: URL, variables: Record<string, string | string[]>) => {
const value = variables.id;
const noteId = Array.isArray(value) ? value[0] : value;
if (!noteId) {
throw new Error("缺少笔记 ID");
}
const response = await client.getNote(noteId);
const note = response.data.entry;
cache.upsertNote(note);
const title = deriveNoteTitle(note, converter);
const markdown = converter.xmlToMarkdown(note.content ?? note.snippet ?? "");
const fullText = title ? `# ${title}\n\n${markdown}` : markdown;
return {
contents: [
{
uri: `minote://notes/${noteId}`,
text: fullText.trim(),
},
],
};
}
);
}