@abhishekmcp/notes 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/graph.js ADDED
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Knowledge-graph queries over the wiki-link + tag structure captured in the
3
+ * store's per-note metadata. Everything here is read-only and returns compact
4
+ * node references (name + title), never full note bodies, to stay token-cheap.
5
+ */
6
+ import { normalizeLinkTarget } from "./parse.js";
7
+ import { getAllMeta, getMeta, noteExists } from "./store.js";
8
+ const ref = (name, meta) => ({ name, title: meta?.title ?? name });
9
+ /** out: name -> existing targets it links to; in: name -> notes linking to it. */
10
+ function adjacency() {
11
+ const out = new Map();
12
+ const inc = new Map();
13
+ const meta = getAllMeta();
14
+ for (const name of meta.keys()) {
15
+ out.set(name, new Set());
16
+ inc.set(name, new Set());
17
+ }
18
+ for (const [name, m] of meta) {
19
+ for (const link of m.outLinks) {
20
+ const target = normalizeLinkTarget(link);
21
+ if (!meta.has(target) || target === name)
22
+ continue; // skip broken + self
23
+ out.get(name).add(target);
24
+ inc.get(target).add(name);
25
+ }
26
+ }
27
+ return { out, inc };
28
+ }
29
+ /** Notes that link to `name` via [[wiki-link]]. */
30
+ export function getBacklinks(name) {
31
+ const target = normalizeLinkTarget(name);
32
+ const out = [];
33
+ for (const [n, m] of getAllMeta()) {
34
+ if (n === target)
35
+ continue;
36
+ if (m.outLinks.some((l) => normalizeLinkTarget(l) === target))
37
+ out.push(ref(n, m));
38
+ }
39
+ return out.sort((a, b) => a.name.localeCompare(b.name));
40
+ }
41
+ /** BFS over the undirected link graph up to `depth`, capped at `limit` nodes. */
42
+ export function getNeighbors(name, depth = 1, limit = 50) {
43
+ const start = normalizeLinkTarget(name);
44
+ if (!noteExists(start))
45
+ return [];
46
+ const { out, inc } = adjacency();
47
+ const seen = new Set([start]);
48
+ const result = [];
49
+ let frontier = [start];
50
+ for (let d = 1; d <= depth && frontier.length; d++) {
51
+ const next = [];
52
+ for (const node of frontier) {
53
+ const around = new Set([...(out.get(node) ?? []), ...(inc.get(node) ?? [])]);
54
+ for (const nb of around) {
55
+ if (seen.has(nb))
56
+ continue;
57
+ seen.add(nb);
58
+ result.push({ ...ref(nb, getMeta(nb)), distance: d });
59
+ next.push(nb);
60
+ if (result.length >= limit)
61
+ return result;
62
+ }
63
+ }
64
+ frontier = next;
65
+ }
66
+ return result;
67
+ }
68
+ /** Shortest wiki-link chain between two notes (BFS, undirected). Null if none. */
69
+ export function findPath(a, b) {
70
+ const from = normalizeLinkTarget(a);
71
+ const to = normalizeLinkTarget(b);
72
+ if (!noteExists(from) || !noteExists(to))
73
+ return null;
74
+ if (from === to)
75
+ return [ref(from, getMeta(from))];
76
+ const { out, inc } = adjacency();
77
+ const prev = new Map();
78
+ const seen = new Set([from]);
79
+ const queue = [from];
80
+ while (queue.length) {
81
+ const node = queue.shift();
82
+ const around = new Set([...(out.get(node) ?? []), ...(inc.get(node) ?? [])]);
83
+ for (const nb of around) {
84
+ if (seen.has(nb))
85
+ continue;
86
+ seen.add(nb);
87
+ prev.set(nb, node);
88
+ if (nb === to) {
89
+ const chain = [to];
90
+ let cur = to;
91
+ while (cur !== from) {
92
+ cur = prev.get(cur);
93
+ chain.unshift(cur);
94
+ }
95
+ return chain.map((n) => ref(n, getMeta(n)));
96
+ }
97
+ queue.push(nb);
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+ /** Rank other notes by shared out-links + shared tags with `name`. */
103
+ export function relatedNotes(name, limit = 10) {
104
+ const target = normalizeLinkTarget(name);
105
+ const self = getMeta(target);
106
+ if (!self)
107
+ return [];
108
+ const myLinks = new Set(self.outLinks.map(normalizeLinkTarget));
109
+ const myTags = new Set(self.tags.map((t) => t.toLowerCase()));
110
+ const scored = [];
111
+ for (const [n, m] of getAllMeta()) {
112
+ if (n === target)
113
+ continue;
114
+ const sharedLinks = m.outLinks.filter((l) => myLinks.has(normalizeLinkTarget(l))).length;
115
+ const sharedTags = m.tags.filter((t) => myTags.has(t.toLowerCase())).length;
116
+ const score = sharedLinks + sharedTags;
117
+ if (score > 0)
118
+ scored.push({ ...ref(n, m), score, sharedLinks, sharedTags });
119
+ }
120
+ return scored.sort((a, b) => b.score - a.score || a.name.localeCompare(b.name)).slice(0, limit);
121
+ }
122
+ /** Aggregate graph health: counts, top hubs, orphans. */
123
+ export function graphOverview(hubLimit = 10, orphanLimit = 25) {
124
+ const { out, inc } = adjacency();
125
+ const meta = getAllMeta();
126
+ let links = 0;
127
+ const tags = new Set();
128
+ const hubs = [];
129
+ const orphans = [];
130
+ for (const [name, m] of meta) {
131
+ for (const t of m.tags)
132
+ tags.add(t.toLowerCase());
133
+ const degree = (out.get(name)?.size ?? 0) + (inc.get(name)?.size ?? 0);
134
+ links += out.get(name)?.size ?? 0;
135
+ if (degree === 0)
136
+ orphans.push(ref(name, m));
137
+ hubs.push({ ...ref(name, m), degree });
138
+ }
139
+ return {
140
+ notes: meta.size,
141
+ links,
142
+ tags: tags.size,
143
+ brokenLinks: brokenLinks().length,
144
+ orphans: orphans.slice(0, orphanLimit),
145
+ hubs: hubs.filter((h) => h.degree > 0).sort((a, b) => b.degree - a.degree).slice(0, hubLimit),
146
+ };
147
+ }
148
+ /** Wiki-links that point at notes which don't exist. */
149
+ export function brokenLinks() {
150
+ const out = [];
151
+ for (const [name, m] of getAllMeta()) {
152
+ for (const link of m.outLinks) {
153
+ const target = normalizeLinkTarget(link);
154
+ if (target && !noteExists(target))
155
+ out.push({ from: name, target });
156
+ }
157
+ }
158
+ return out.sort((a, b) => a.from.localeCompare(b.from) || a.target.localeCompare(b.target));
159
+ }
160
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,144 +1,284 @@
1
1
  #!/usr/bin/env node
2
+ /**
3
+ * @abhishekmcp/notes — MCP server for local markdown notes.
4
+ * v0.2: ranked full-text search (MiniSearch), tags + todos, a wiki-link
5
+ * knowledge graph, a persisted index with incremental sync, and FS hardening.
6
+ * Tool registration only — all logic lives in store.ts / graph.ts.
7
+ */
2
8
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
9
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
10
  import { z } from "zod";
5
- import { appendNote, createNote, deleteNote, ensureNotesDir, getBacklinks, getNotesDir, listNotes, readNote, searchNotes, } from "./notes.js";
6
- const server = new McpServer({
7
- name: "mcp-notes-server",
8
- version: "0.1.0",
9
- });
10
- // A small helper to wrap a string into the MCP text-content shape.
11
- const text = (value) => ({
12
- content: [{ type: "text", text: value }],
13
- });
14
- // --- Tools ---------------------------------------------------------------
11
+ import { isReadOnly } from "./config.js";
12
+ import { appendNote, buildIndex, createNote, deleteNote, getOutline, listNotes, listTags, listTodos, moveNote, notesDir, readNote, searchNotes, } from "./store.js";
13
+ import { brokenLinks, findPath, getBacklinks, getNeighbors, graphOverview, relatedNotes, } from "./graph.js";
14
+ import { semanticSearch } from "./semantic.js";
15
+ const server = new McpServer({ name: "mcp-notes-server", version: "0.3.0" });
16
+ const text = (value) => ({ content: [{ type: "text", text: value }] });
17
+ const fail = (err) => text(`Error: ${err.message}`);
18
+ // --- Read & discovery tools (always registered) --------------------------
15
19
  server.registerTool("list_notes", {
16
20
  title: "List notes",
17
- description: "List all markdown notes in the notes directory, newest first. " +
18
- "Returns each note's name, size, and last-modified time.",
19
- inputSchema: {},
20
- }, async () => {
21
- const notes = await listNotes();
22
- if (notes.length === 0)
23
- return text("No notes found.");
24
- const lines = notes.map((n) => `- ${n.name} (${n.size} bytes, modified ${n.modified})`);
25
- return text(`Found ${notes.length} note(s):\n${lines.join("\n")}`);
21
+ description: "List notes (newest first) with pagination and an optional tag filter. " +
22
+ "Returns name, title, size, tags, and whether more results remain.",
23
+ inputSchema: {
24
+ offset: z.number().int().min(0).optional().describe("Start index (default 0)"),
25
+ limit: z.number().int().positive().max(500).optional().describe("Max results (default 50)"),
26
+ tag: z.string().optional().describe("Only notes carrying this tag"),
27
+ },
28
+ }, async ({ offset, limit, tag }) => {
29
+ const r = listNotes(offset ?? 0, limit ?? 50, tag);
30
+ if (r.items.length === 0)
31
+ return text(tag ? `No notes tagged "${tag}".` : "No notes found.");
32
+ const lines = r.items.map((n) => `- ${n.name} — ${n.title}${n.tags.length ? ` [${n.tags.join(", ")}]` : ""}`);
33
+ return text(`${r.total} note(s)${r.hasMore ? " (more available)" : ""}:\n${lines.join("\n")}`);
26
34
  });
27
35
  server.registerTool("read_note", {
28
36
  title: "Read a note",
29
- description: "Read the full contents of a note by name (extension optional).",
37
+ description: "Read a note by name. Optionally read just one heading's `section`, or a " +
38
+ "character window via `offset`/`limit` (sets a truncated flag when cut).",
30
39
  inputSchema: {
31
40
  name: z.string().describe("Note name, e.g. 'ideas' or 'projects/mcp'"),
41
+ section: z.string().optional().describe("Read only the content under this heading"),
42
+ offset: z.number().int().min(0).optional().describe("Character offset to start from"),
43
+ limit: z.number().int().positive().optional().describe("Max characters to return"),
32
44
  },
33
- }, async ({ name }) => {
45
+ }, async ({ name, section, offset, limit }) => {
34
46
  try {
35
- return text(await readNote(name));
47
+ const r = await readNote(name, { section, offset, limit });
48
+ return text(r.truncated ? `${r.text}\n\n[truncated]` : r.text);
36
49
  }
37
- catch {
38
- return text(`Could not read note "${name}". Does it exist?`);
50
+ catch (err) {
51
+ return fail(err);
39
52
  }
40
53
  });
41
- server.registerTool("create_note", {
42
- title: "Create a note",
43
- description: "Create a new markdown note. Fails if it already exists unless overwrite is true.",
44
- inputSchema: {
45
- name: z.string().describe("Note name, e.g. 'ideas' or 'projects/mcp'"),
46
- content: z.string().describe("Markdown content of the note"),
47
- overwrite: z
48
- .boolean()
49
- .optional()
50
- .describe("Overwrite an existing note (default false)"),
51
- },
52
- }, async ({ name, content, overwrite }) => {
54
+ server.registerTool("get_outline", {
55
+ title: "Get note outline",
56
+ description: "Return just the heading tree of a note grasp a big note in a few tokens.",
57
+ inputSchema: { name: z.string().describe("Note name") },
58
+ }, async ({ name }) => {
53
59
  try {
54
- const file = await createNote(name, content, overwrite ?? false);
55
- return text(`Created note at ${file}`);
60
+ return text(await getOutline(name));
56
61
  }
57
62
  catch (err) {
58
- return text(`Failed to create note: ${err.message}`);
63
+ return fail(err);
59
64
  }
60
65
  });
61
- server.registerTool("append_note", {
62
- title: "Append to a note",
63
- description: "Append content to an existing note (creates it if missing). " +
64
- "Useful for journals, logs, and running lists.",
66
+ server.registerTool("search_notes", {
67
+ title: "Search notes",
68
+ description: "Ranked full-text search. Supports `fuzzy`, `prefix`, and a `field` filter " +
69
+ "(title/tag/body, or 'path' to match the note name). Returns ranked snippets.",
65
70
  inputSchema: {
66
- name: z.string().describe("Note name"),
67
- content: z.string().describe("Markdown content to append"),
71
+ query: z.string().describe("Search query"),
72
+ fuzzy: z.boolean().optional().describe("Enable fuzzy matching (typo-tolerant)"),
73
+ prefix: z.boolean().optional().describe("Match term prefixes (default true)"),
74
+ field: z.enum(["title", "tag", "body", "path"]).optional().describe("Restrict search to one field"),
75
+ offset: z.number().int().min(0).optional().describe("Start index (default 0)"),
76
+ limit: z.number().int().positive().max(100).optional().describe("Max results (default 10)"),
68
77
  },
69
- }, async ({ name, content }) => {
70
- const file = await appendNote(name, content);
71
- return text(`Appended to ${file}`);
78
+ }, async ({ query, fuzzy, prefix, field, offset, limit }) => {
79
+ const r = await searchNotes(query, { fuzzy, prefix, field, offset, limit });
80
+ if (r.hits.length === 0)
81
+ return text(`No matches for "${query}".`);
82
+ const lines = r.hits.map((h) => `- ${h.name} (score ${h.score.toFixed(2)})${h.snippet ? `\n ${h.snippet}` : ""}`);
83
+ return text(`${r.total} match(es)${r.hasMore ? " (more available)" : ""}:\n${lines.join("\n")}`);
84
+ });
85
+ server.registerTool("list_tags", {
86
+ title: "List tags",
87
+ description: "List every tag across the vault with note counts.",
88
+ inputSchema: {},
89
+ }, async () => {
90
+ const tags = listTags();
91
+ if (tags.length === 0)
92
+ return text("No tags found.");
93
+ return text(tags.map((t) => `- ${t.tag} (${t.count})`).join("\n"));
72
94
  });
73
- server.registerTool("delete_note", {
74
- title: "Delete a note",
75
- description: "Permanently delete a note by name.",
95
+ server.registerTool("list_todos", {
96
+ title: "List todos",
97
+ description: "Aggregate `- [ ]` checkbox todos across all notes. Open items only unless includeDone.",
76
98
  inputSchema: {
77
- name: z.string().describe("Note name to delete"),
99
+ includeDone: z.boolean().optional().describe("Include completed `- [x]` items (default false)"),
78
100
  },
79
- annotations: { destructiveHint: true },
101
+ }, async ({ includeDone }) => {
102
+ const todos = await listTodos(includeDone ?? false);
103
+ if (todos.length === 0)
104
+ return text("No todos found.");
105
+ const lines = todos.map((t) => `- [${t.done ? "x" : " "}] ${t.text} (${t.note}:${t.line})`);
106
+ return text(`${todos.length} todo(s):\n${lines.join("\n")}`);
107
+ });
108
+ server.registerTool("get_backlinks", {
109
+ title: "Get backlinks",
110
+ description: "Find all notes that link to the given note via [[wiki-link]] syntax.",
111
+ inputSchema: { name: z.string().describe("The note to find backlinks for") },
80
112
  }, async ({ name }) => {
81
- try {
82
- await deleteNote(name);
83
- return text(`Deleted note "${name}".`);
84
- }
85
- catch {
86
- return text(`Could not delete note "${name}". Does it exist?`);
87
- }
113
+ const links = getBacklinks(name);
114
+ if (links.length === 0)
115
+ return text(`No notes link to "${name}".`);
116
+ return text(`${links.length} backlink(s):\n${links.map((l) => `- ${l.name} — ${l.title}`).join("\n")}`);
88
117
  });
89
- server.registerTool("search_notes", {
90
- title: "Search notes",
91
- description: "Case-insensitive full-text search across all notes. " +
92
- "Returns matching lines with their note name and line number.",
118
+ server.registerTool("get_neighbors", {
119
+ title: "Get neighbors",
120
+ description: "Notes within N hops of a note over the (undirected) wiki-link graph, depth/limit capped.",
93
121
  inputSchema: {
94
- query: z.string().describe("Text to search for"),
95
- limit: z
96
- .number()
97
- .int()
98
- .positive()
99
- .optional()
100
- .describe("Max number of matches (default 50)"),
122
+ name: z.string().describe("Center note"),
123
+ depth: z.number().int().positive().max(5).optional().describe("Hops to traverse (default 1)"),
124
+ limit: z.number().int().positive().max(200).optional().describe("Max neighbors (default 50)"),
101
125
  },
102
- }, async ({ query, limit }) => {
103
- const hits = await searchNotes(query, limit ?? 50);
104
- if (hits.length === 0)
105
- return text(`No matches for "${query}".`);
106
- const lines = hits.map((h) => `${h.name}:${h.line}: ${h.text}`);
107
- return text(`${hits.length} match(es):\n${lines.join("\n")}`);
126
+ }, async ({ name, depth, limit }) => {
127
+ const nb = getNeighbors(name, depth ?? 1, limit ?? 50);
128
+ if (nb.length === 0)
129
+ return text(`"${name}" has no neighbors (or doesn't exist).`);
130
+ return text(nb.map((n) => `- [${n.distance}] ${n.name} ${n.title}`).join("\n"));
108
131
  });
109
- server.registerTool("get_backlinks", {
110
- title: "Get backlinks",
111
- description: "Find all notes that link to the given note using [[wiki-link]] syntax.",
132
+ server.registerTool("find_path", {
133
+ title: "Find path",
134
+ description: "Shortest wiki-link chain between two notes (BFS). Reports if none exists.",
112
135
  inputSchema: {
113
- name: z.string().describe("The note to find backlinks for"),
136
+ from: z.string().describe("Start note"),
137
+ to: z.string().describe("End note"),
114
138
  },
115
- }, async ({ name }) => {
116
- const hits = await getBacklinks(name);
117
- if (hits.length === 0)
118
- return text(`No notes link to "${name}".`);
119
- const lines = hits.map((h) => `${h.name}:${h.line}: ${h.text}`);
120
- return text(`${hits.length} backlink(s) to "${name}":\n${lines.join("\n")}`);
139
+ }, async ({ from, to }) => {
140
+ const path = findPath(from, to);
141
+ if (!path)
142
+ return text(`No path between "${from}" and "${to}".`);
143
+ return text(path.map((n) => n.name).join(" → "));
144
+ });
145
+ server.registerTool("related_notes", {
146
+ title: "Related notes",
147
+ description: "Rank other notes by shared wiki-links and shared tags with the given note.",
148
+ inputSchema: {
149
+ name: z.string().describe("Note to find relations for"),
150
+ limit: z.number().int().positive().max(50).optional().describe("Max results (default 10)"),
151
+ },
152
+ }, async ({ name, limit }) => {
153
+ const rel = relatedNotes(name, limit ?? 10);
154
+ if (rel.length === 0)
155
+ return text(`No related notes for "${name}".`);
156
+ return text(rel
157
+ .map((r) => `- ${r.name} — ${r.title} (score ${r.score}: ${r.sharedLinks} links, ${r.sharedTags} tags)`)
158
+ .join("\n"));
159
+ });
160
+ server.registerTool("graph_overview", {
161
+ title: "Graph overview",
162
+ description: "Aggregate graph health: note/link/tag counts, top hubs, orphans, broken-link count.",
163
+ inputSchema: {},
164
+ }, async () => {
165
+ const g = graphOverview();
166
+ const hubs = g.hubs.map((h) => `${h.name} (${h.degree})`).join(", ") || "none";
167
+ const orphans = g.orphans.map((o) => o.name).join(", ") || "none";
168
+ return text(`Notes: ${g.notes}\nLinks: ${g.links}\nTags: ${g.tags}\nBroken links: ${g.brokenLinks}\n` +
169
+ `Hubs: ${hubs}\nOrphans: ${orphans}`);
170
+ });
171
+ server.registerTool("broken_links", {
172
+ title: "Broken links",
173
+ description: "List wiki-links that point at notes which don't exist.",
174
+ inputSchema: {},
175
+ }, async () => {
176
+ const broken = brokenLinks();
177
+ if (broken.length === 0)
178
+ return text("No broken links. 🎉");
179
+ return text(`${broken.length} broken link(s):\n${broken.map((b) => `- ${b.from} → [[${b.target}]]`).join("\n")}`);
180
+ });
181
+ server.registerTool("semantic_search", {
182
+ title: "Semantic search",
183
+ description: "Search notes by meaning using local embeddings (all-MiniLM-L6-v2, runs " +
184
+ "offline after a one-time model download). Finds related notes even with no " +
185
+ "shared keywords. `hybrid` fuses this with keyword search for best results.",
186
+ inputSchema: {
187
+ query: z.string().describe("Natural-language query"),
188
+ limit: z.number().int().positive().max(100).optional().describe("Max results (default 10)"),
189
+ hybrid: z.boolean().optional().describe("Fuse semantic + keyword ranking (default false)"),
190
+ },
191
+ }, async ({ query, limit, hybrid }) => {
192
+ try {
193
+ const r = await semanticSearch(query, { limit, hybrid });
194
+ if (r.hits.length === 0)
195
+ return text(`No semantic matches for "${query}".`);
196
+ const lines = r.hits.map((h) => `- ${h.name} (score ${h.score.toFixed(3)})${h.snippet ? `\n ${h.snippet}` : ""}`);
197
+ return text(`${r.total} result(s)${r.hasMore ? " (more available)" : ""}:\n${lines.join("\n")}`);
198
+ }
199
+ catch (err) {
200
+ return fail(err);
201
+ }
121
202
  });
203
+ // --- Mutating tools (omitted entirely when NOTES_READONLY=1) --------------
204
+ if (!isReadOnly()) {
205
+ server.registerTool("create_note", {
206
+ title: "Create a note",
207
+ description: "Create a new markdown note. Fails if it exists unless overwrite is true.",
208
+ inputSchema: {
209
+ name: z.string().describe("Note name, e.g. 'ideas' or 'projects/mcp'"),
210
+ content: z.string().describe("Markdown content"),
211
+ overwrite: z.boolean().optional().describe("Overwrite if it already exists (default false)"),
212
+ },
213
+ }, async ({ name, content, overwrite }) => {
214
+ try {
215
+ const n = await createNote(name, content, overwrite ?? false);
216
+ return text(`Created note "${n}".`);
217
+ }
218
+ catch (err) {
219
+ return fail(err);
220
+ }
221
+ });
222
+ server.registerTool("append_note", {
223
+ title: "Append to a note",
224
+ description: "Append content to a note (creating it if missing). Good for journals and logs.",
225
+ inputSchema: {
226
+ name: z.string().describe("Note name"),
227
+ content: z.string().describe("Markdown content to append"),
228
+ },
229
+ }, async ({ name, content }) => {
230
+ try {
231
+ const n = await appendNote(name, content);
232
+ return text(`Appended to "${n}".`);
233
+ }
234
+ catch (err) {
235
+ return fail(err);
236
+ }
237
+ });
238
+ server.registerTool("delete_note", {
239
+ title: "Delete a note",
240
+ description: "Permanently delete a note by name.",
241
+ inputSchema: { name: z.string().describe("Note name to delete") },
242
+ annotations: { destructiveHint: true },
243
+ }, async ({ name }) => {
244
+ try {
245
+ await deleteNote(name);
246
+ return text(`Deleted note "${name}".`);
247
+ }
248
+ catch (err) {
249
+ return fail(err);
250
+ }
251
+ });
252
+ server.registerTool("move_note", {
253
+ title: "Move/rename a note",
254
+ description: "Rename or move a note and rewrite every [[wiki-link]] pointing at it across the vault.",
255
+ inputSchema: {
256
+ from: z.string().describe("Current note name"),
257
+ to: z.string().describe("New note name/path"),
258
+ },
259
+ }, async ({ from, to }) => {
260
+ try {
261
+ const r = await moveNote(from, to);
262
+ const rw = r.rewritten.length ? ` Rewrote backlinks in: ${r.rewritten.join(", ")}.` : "";
263
+ return text(`Moved "${r.from}" → "${r.to}".${rw}`);
264
+ }
265
+ catch (err) {
266
+ return fail(err);
267
+ }
268
+ });
269
+ }
122
270
  // --- Resources -----------------------------------------------------------
123
- // Expose every note as a readable resource via a notes:// URI scheme.
124
- server.registerResource("note", "notes://{name}", {
125
- title: "Note",
126
- description: "A markdown note, addressable by name.",
127
- mimeType: "text/markdown",
128
- }, async (uri) => {
271
+ server.registerResource("note", "notes://{name}", { title: "Note", description: "A markdown note, addressable by name.", mimeType: "text/markdown" }, async (uri) => {
129
272
  const name = decodeURIComponent(uri.pathname.replace(/^\/+/, "") || uri.href.replace("notes://", ""));
130
- const content = await readNote(name);
131
- return {
132
- contents: [{ uri: uri.href, mimeType: "text/markdown", text: content }],
133
- };
273
+ const { text: content } = await readNote(name);
274
+ return { contents: [{ uri: uri.href, mimeType: "text/markdown", text: content }] };
134
275
  });
135
276
  // --- Startup -------------------------------------------------------------
136
277
  async function main() {
137
- await ensureNotesDir();
278
+ await buildIndex(); // load/sync the index before serving any request
138
279
  const transport = new StdioServerTransport();
139
280
  await server.connect(transport);
140
- // Log to stderr stdout is reserved for the MCP protocol.
141
- console.error(`mcp-notes-server running. Notes dir: ${getNotesDir()}`);
281
+ console.error(`mcp-notes-server v0.3.0 running${isReadOnly() ? " (read-only)" : ""}. Notes dir: ${notesDir()}`);
142
282
  }
143
283
  main().catch((err) => {
144
284
  console.error("Fatal error starting mcp-notes-server:", err);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}