@abhishekmcp/notes 0.1.1 → 0.2.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/index.js CHANGED
@@ -1,144 +1,261 @@
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
+ const server = new McpServer({ name: "mcp-notes-server", version: "0.2.0" });
15
+ const text = (value) => ({ content: [{ type: "text", text: value }] });
16
+ const fail = (err) => text(`Error: ${err.message}`);
17
+ // --- Read & discovery tools (always registered) --------------------------
15
18
  server.registerTool("list_notes", {
16
19
  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")}`);
20
+ description: "List notes (newest first) with pagination and an optional tag filter. " +
21
+ "Returns name, title, size, tags, and whether more results remain.",
22
+ inputSchema: {
23
+ offset: z.number().int().min(0).optional().describe("Start index (default 0)"),
24
+ limit: z.number().int().positive().max(500).optional().describe("Max results (default 50)"),
25
+ tag: z.string().optional().describe("Only notes carrying this tag"),
26
+ },
27
+ }, async ({ offset, limit, tag }) => {
28
+ const r = listNotes(offset ?? 0, limit ?? 50, tag);
29
+ if (r.items.length === 0)
30
+ return text(tag ? `No notes tagged "${tag}".` : "No notes found.");
31
+ const lines = r.items.map((n) => `- ${n.name} — ${n.title}${n.tags.length ? ` [${n.tags.join(", ")}]` : ""}`);
32
+ return text(`${r.total} note(s)${r.hasMore ? " (more available)" : ""}:\n${lines.join("\n")}`);
26
33
  });
27
34
  server.registerTool("read_note", {
28
35
  title: "Read a note",
29
- description: "Read the full contents of a note by name (extension optional).",
36
+ description: "Read a note by name. Optionally read just one heading's `section`, or a " +
37
+ "character window via `offset`/`limit` (sets a truncated flag when cut).",
30
38
  inputSchema: {
31
39
  name: z.string().describe("Note name, e.g. 'ideas' or 'projects/mcp'"),
40
+ section: z.string().optional().describe("Read only the content under this heading"),
41
+ offset: z.number().int().min(0).optional().describe("Character offset to start from"),
42
+ limit: z.number().int().positive().optional().describe("Max characters to return"),
32
43
  },
33
- }, async ({ name }) => {
44
+ }, async ({ name, section, offset, limit }) => {
34
45
  try {
35
- return text(await readNote(name));
46
+ const r = await readNote(name, { section, offset, limit });
47
+ return text(r.truncated ? `${r.text}\n\n[truncated]` : r.text);
36
48
  }
37
- catch {
38
- return text(`Could not read note "${name}". Does it exist?`);
49
+ catch (err) {
50
+ return fail(err);
39
51
  }
40
52
  });
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 }) => {
53
+ server.registerTool("get_outline", {
54
+ title: "Get note outline",
55
+ description: "Return just the heading tree of a note grasp a big note in a few tokens.",
56
+ inputSchema: { name: z.string().describe("Note name") },
57
+ }, async ({ name }) => {
53
58
  try {
54
- const file = await createNote(name, content, overwrite ?? false);
55
- return text(`Created note at ${file}`);
59
+ return text(await getOutline(name));
56
60
  }
57
61
  catch (err) {
58
- return text(`Failed to create note: ${err.message}`);
62
+ return fail(err);
59
63
  }
60
64
  });
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.",
65
+ server.registerTool("search_notes", {
66
+ title: "Search notes",
67
+ description: "Ranked full-text search. Supports `fuzzy`, `prefix`, and a `field` filter " +
68
+ "(title/tag/body, or 'path' to match the note name). Returns ranked snippets.",
65
69
  inputSchema: {
66
- name: z.string().describe("Note name"),
67
- content: z.string().describe("Markdown content to append"),
70
+ query: z.string().describe("Search query"),
71
+ fuzzy: z.boolean().optional().describe("Enable fuzzy matching (typo-tolerant)"),
72
+ prefix: z.boolean().optional().describe("Match term prefixes (default true)"),
73
+ field: z.enum(["title", "tag", "body", "path"]).optional().describe("Restrict search to one field"),
74
+ offset: z.number().int().min(0).optional().describe("Start index (default 0)"),
75
+ limit: z.number().int().positive().max(100).optional().describe("Max results (default 10)"),
68
76
  },
69
- }, async ({ name, content }) => {
70
- const file = await appendNote(name, content);
71
- return text(`Appended to ${file}`);
77
+ }, async ({ query, fuzzy, prefix, field, offset, limit }) => {
78
+ const r = await searchNotes(query, { fuzzy, prefix, field, offset, limit });
79
+ if (r.hits.length === 0)
80
+ return text(`No matches for "${query}".`);
81
+ const lines = r.hits.map((h) => `- ${h.name} (score ${h.score.toFixed(2)})${h.snippet ? `\n ${h.snippet}` : ""}`);
82
+ return text(`${r.total} match(es)${r.hasMore ? " (more available)" : ""}:\n${lines.join("\n")}`);
83
+ });
84
+ server.registerTool("list_tags", {
85
+ title: "List tags",
86
+ description: "List every tag across the vault with note counts.",
87
+ inputSchema: {},
88
+ }, async () => {
89
+ const tags = listTags();
90
+ if (tags.length === 0)
91
+ return text("No tags found.");
92
+ return text(tags.map((t) => `- ${t.tag} (${t.count})`).join("\n"));
72
93
  });
73
- server.registerTool("delete_note", {
74
- title: "Delete a note",
75
- description: "Permanently delete a note by name.",
94
+ server.registerTool("list_todos", {
95
+ title: "List todos",
96
+ description: "Aggregate `- [ ]` checkbox todos across all notes. Open items only unless includeDone.",
76
97
  inputSchema: {
77
- name: z.string().describe("Note name to delete"),
98
+ includeDone: z.boolean().optional().describe("Include completed `- [x]` items (default false)"),
78
99
  },
79
- annotations: { destructiveHint: true },
100
+ }, async ({ includeDone }) => {
101
+ const todos = await listTodos(includeDone ?? false);
102
+ if (todos.length === 0)
103
+ return text("No todos found.");
104
+ const lines = todos.map((t) => `- [${t.done ? "x" : " "}] ${t.text} (${t.note}:${t.line})`);
105
+ return text(`${todos.length} todo(s):\n${lines.join("\n")}`);
106
+ });
107
+ server.registerTool("get_backlinks", {
108
+ title: "Get backlinks",
109
+ description: "Find all notes that link to the given note via [[wiki-link]] syntax.",
110
+ inputSchema: { name: z.string().describe("The note to find backlinks for") },
80
111
  }, 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
- }
112
+ const links = getBacklinks(name);
113
+ if (links.length === 0)
114
+ return text(`No notes link to "${name}".`);
115
+ return text(`${links.length} backlink(s):\n${links.map((l) => `- ${l.name} — ${l.title}`).join("\n")}`);
88
116
  });
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.",
117
+ server.registerTool("get_neighbors", {
118
+ title: "Get neighbors",
119
+ description: "Notes within N hops of a note over the (undirected) wiki-link graph, depth/limit capped.",
93
120
  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)"),
121
+ name: z.string().describe("Center note"),
122
+ depth: z.number().int().positive().max(5).optional().describe("Hops to traverse (default 1)"),
123
+ limit: z.number().int().positive().max(200).optional().describe("Max neighbors (default 50)"),
101
124
  },
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")}`);
125
+ }, async ({ name, depth, limit }) => {
126
+ const nb = getNeighbors(name, depth ?? 1, limit ?? 50);
127
+ if (nb.length === 0)
128
+ return text(`"${name}" has no neighbors (or doesn't exist).`);
129
+ return text(nb.map((n) => `- [${n.distance}] ${n.name} ${n.title}`).join("\n"));
108
130
  });
109
- server.registerTool("get_backlinks", {
110
- title: "Get backlinks",
111
- description: "Find all notes that link to the given note using [[wiki-link]] syntax.",
131
+ server.registerTool("find_path", {
132
+ title: "Find path",
133
+ description: "Shortest wiki-link chain between two notes (BFS). Reports if none exists.",
112
134
  inputSchema: {
113
- name: z.string().describe("The note to find backlinks for"),
135
+ from: z.string().describe("Start note"),
136
+ to: z.string().describe("End note"),
114
137
  },
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")}`);
138
+ }, async ({ from, to }) => {
139
+ const path = findPath(from, to);
140
+ if (!path)
141
+ return text(`No path between "${from}" and "${to}".`);
142
+ return text(path.map((n) => n.name).join(" → "));
121
143
  });
144
+ server.registerTool("related_notes", {
145
+ title: "Related notes",
146
+ description: "Rank other notes by shared wiki-links and shared tags with the given note.",
147
+ inputSchema: {
148
+ name: z.string().describe("Note to find relations for"),
149
+ limit: z.number().int().positive().max(50).optional().describe("Max results (default 10)"),
150
+ },
151
+ }, async ({ name, limit }) => {
152
+ const rel = relatedNotes(name, limit ?? 10);
153
+ if (rel.length === 0)
154
+ return text(`No related notes for "${name}".`);
155
+ return text(rel
156
+ .map((r) => `- ${r.name} — ${r.title} (score ${r.score}: ${r.sharedLinks} links, ${r.sharedTags} tags)`)
157
+ .join("\n"));
158
+ });
159
+ server.registerTool("graph_overview", {
160
+ title: "Graph overview",
161
+ description: "Aggregate graph health: note/link/tag counts, top hubs, orphans, broken-link count.",
162
+ inputSchema: {},
163
+ }, async () => {
164
+ const g = graphOverview();
165
+ const hubs = g.hubs.map((h) => `${h.name} (${h.degree})`).join(", ") || "none";
166
+ const orphans = g.orphans.map((o) => o.name).join(", ") || "none";
167
+ return text(`Notes: ${g.notes}\nLinks: ${g.links}\nTags: ${g.tags}\nBroken links: ${g.brokenLinks}\n` +
168
+ `Hubs: ${hubs}\nOrphans: ${orphans}`);
169
+ });
170
+ server.registerTool("broken_links", {
171
+ title: "Broken links",
172
+ description: "List wiki-links that point at notes which don't exist.",
173
+ inputSchema: {},
174
+ }, async () => {
175
+ const broken = brokenLinks();
176
+ if (broken.length === 0)
177
+ return text("No broken links. 🎉");
178
+ return text(`${broken.length} broken link(s):\n${broken.map((b) => `- ${b.from} → [[${b.target}]]`).join("\n")}`);
179
+ });
180
+ // --- Mutating tools (omitted entirely when NOTES_READONLY=1) --------------
181
+ if (!isReadOnly()) {
182
+ server.registerTool("create_note", {
183
+ title: "Create a note",
184
+ description: "Create a new markdown note. Fails if it exists unless overwrite is true.",
185
+ inputSchema: {
186
+ name: z.string().describe("Note name, e.g. 'ideas' or 'projects/mcp'"),
187
+ content: z.string().describe("Markdown content"),
188
+ overwrite: z.boolean().optional().describe("Overwrite if it already exists (default false)"),
189
+ },
190
+ }, async ({ name, content, overwrite }) => {
191
+ try {
192
+ const n = await createNote(name, content, overwrite ?? false);
193
+ return text(`Created note "${n}".`);
194
+ }
195
+ catch (err) {
196
+ return fail(err);
197
+ }
198
+ });
199
+ server.registerTool("append_note", {
200
+ title: "Append to a note",
201
+ description: "Append content to a note (creating it if missing). Good for journals and logs.",
202
+ inputSchema: {
203
+ name: z.string().describe("Note name"),
204
+ content: z.string().describe("Markdown content to append"),
205
+ },
206
+ }, async ({ name, content }) => {
207
+ try {
208
+ const n = await appendNote(name, content);
209
+ return text(`Appended to "${n}".`);
210
+ }
211
+ catch (err) {
212
+ return fail(err);
213
+ }
214
+ });
215
+ server.registerTool("delete_note", {
216
+ title: "Delete a note",
217
+ description: "Permanently delete a note by name.",
218
+ inputSchema: { name: z.string().describe("Note name to delete") },
219
+ annotations: { destructiveHint: true },
220
+ }, async ({ name }) => {
221
+ try {
222
+ await deleteNote(name);
223
+ return text(`Deleted note "${name}".`);
224
+ }
225
+ catch (err) {
226
+ return fail(err);
227
+ }
228
+ });
229
+ server.registerTool("move_note", {
230
+ title: "Move/rename a note",
231
+ description: "Rename or move a note and rewrite every [[wiki-link]] pointing at it across the vault.",
232
+ inputSchema: {
233
+ from: z.string().describe("Current note name"),
234
+ to: z.string().describe("New note name/path"),
235
+ },
236
+ }, async ({ from, to }) => {
237
+ try {
238
+ const r = await moveNote(from, to);
239
+ const rw = r.rewritten.length ? ` Rewrote backlinks in: ${r.rewritten.join(", ")}.` : "";
240
+ return text(`Moved "${r.from}" → "${r.to}".${rw}`);
241
+ }
242
+ catch (err) {
243
+ return fail(err);
244
+ }
245
+ });
246
+ }
122
247
  // --- 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) => {
248
+ server.registerResource("note", "notes://{name}", { title: "Note", description: "A markdown note, addressable by name.", mimeType: "text/markdown" }, async (uri) => {
129
249
  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
- };
250
+ const { text: content } = await readNote(name);
251
+ return { contents: [{ uri: uri.href, mimeType: "text/markdown", text: content }] };
134
252
  });
135
253
  // --- Startup -------------------------------------------------------------
136
254
  async function main() {
137
- await ensureNotesDir();
255
+ await buildIndex(); // load/sync the index before serving any request
138
256
  const transport = new StdioServerTransport();
139
257
  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()}`);
258
+ console.error(`mcp-notes-server v0.2.0 running${isReadOnly() ? " (read-only)" : ""}. Notes dir: ${notesDir()}`);
142
259
  }
143
260
  main().catch((err) => {
144
261
  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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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Pure, dependency-free markdown parsing: a tiny YAML-frontmatter reader plus
3
+ * extractors for headings, sections, wiki-links, tags and todos. We deliberately
4
+ * avoid gray-matter / js-yaml (npm-audit noise + native-free goal); the subset of
5
+ * YAML notes actually use in frontmatter is small enough to hand-roll safely.
6
+ */
7
+ export interface Frontmatter {
8
+ title?: string;
9
+ tags?: string[];
10
+ [key: string]: unknown;
11
+ }
12
+ export interface Heading {
13
+ level: number;
14
+ text: string;
15
+ line: number;
16
+ }
17
+ export interface Todo {
18
+ text: string;
19
+ done: boolean;
20
+ line: number;
21
+ }
22
+ export interface ParsedNote {
23
+ frontmatter: Frontmatter;
24
+ body: string;
25
+ title?: string;
26
+ tags: string[];
27
+ links: string[];
28
+ headings: Heading[];
29
+ }
30
+ /** Strip a trailing ".md" and normalize separators so links/names compare equal. */
31
+ export declare function normalizeLinkTarget(raw: string): string;
32
+ /**
33
+ * Split raw note text into a frontmatter object and the remaining body.
34
+ * Recognizes a leading `---` ... `---` fence. Unparseable frontmatter is
35
+ * treated as body (never throws).
36
+ */
37
+ export declare function splitFrontmatter(raw: string): {
38
+ frontmatter: Frontmatter;
39
+ body: string;
40
+ };
41
+ /** Extract ATX headings (`#`..`######`) from body text, ignoring fenced code blocks. */
42
+ export declare function extractHeadings(body: string): Heading[];
43
+ /**
44
+ * Return the text under a heading (case-insensitive match on heading text),
45
+ * up to the next heading of the same or higher level. Returns null if not found.
46
+ */
47
+ export declare function extractSection(body: string, heading: string): string | null;
48
+ /** Extract wiki-link targets (`[[name]]` / `[[name|alias]]`), normalized + deduped. */
49
+ export declare function extractWikiLinks(body: string): string[];
50
+ /** Collect tags from frontmatter plus inline #hashtags in the body, deduped. */
51
+ export declare function extractTags(frontmatter: Frontmatter, body: string): string[];
52
+ /** Extract checkbox todos (`- [ ]` / `- [x]`) from body text. */
53
+ export declare function extractTodos(body: string): Todo[];
54
+ /** Full parse of a raw note into structured pieces used by the index and graph. */
55
+ export declare function parseNote(raw: string): ParsedNote;