@oomkapwn/enquire-mcp 0.7.4
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/CHANGELOG.md +334 -0
- package/LICENSE +21 -0
- package/README.md +358 -0
- package/SECURITY.md +49 -0
- package/assets/social-preview.png +0 -0
- package/dist/dql.d.ts +37 -0
- package/dist/dql.d.ts.map +1 -0
- package/dist/dql.js +342 -0
- package/dist/dql.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +470 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.d.ts +21 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +107 -0
- package/dist/parser.js.map +1 -0
- package/dist/tools.d.ts +143 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +445 -0
- package/dist/tools.js.map +1 -0
- package/dist/vault.d.ts +72 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +424 -0
- package/dist/vault.js.map +1 -0
- package/docs/api.md +262 -0
- package/package.json +82 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
|
+
import { Command } from "commander";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { appendToNote, createNote, dataviewQuery, getBacklinks, getOutboundLinks, getRecentEdits, getUnresolvedWikilinks, listNotes, listTags, readNote, resolveWikilink, searchText } from "./tools.js";
|
|
9
|
+
import { Vault } from "./vault.js";
|
|
10
|
+
const VERSION = "0.7.4";
|
|
11
|
+
async function main() {
|
|
12
|
+
const program = new Command();
|
|
13
|
+
program
|
|
14
|
+
.name("enquire-mcp")
|
|
15
|
+
.description("enquire — MCP server for Obsidian vaults. Named after Tim Berners-Lee's 1980 prototype of the WWW.")
|
|
16
|
+
.version(VERSION);
|
|
17
|
+
program
|
|
18
|
+
.command("serve", { isDefault: true })
|
|
19
|
+
.description("Start the MCP server over stdio")
|
|
20
|
+
.requiredOption("--vault <path>", "Path to the Obsidian vault root")
|
|
21
|
+
.option("--enable-write", "Enable write tools (create_note, append_to_note). Off by default.")
|
|
22
|
+
.option("--max-file-bytes <n>", "Max bytes for any single file read/write (default 5MB)")
|
|
23
|
+
.option("--cache-size <n>", "Max parsed-note cache entries (default 1024)")
|
|
24
|
+
.option("--persistent-cache", "Persist parsed-note cache to disk so cold starts skip re-parsing")
|
|
25
|
+
.option("--cache-file <path>", "Override the persistent-cache file location")
|
|
26
|
+
.action(async (opts) => {
|
|
27
|
+
await startServer(opts);
|
|
28
|
+
});
|
|
29
|
+
program
|
|
30
|
+
.command("clear-cache")
|
|
31
|
+
.description("Delete the persistent-cache file for a given vault")
|
|
32
|
+
.requiredOption("--vault <path>", "Vault whose cache to delete")
|
|
33
|
+
.option("--cache-file <path>", "Override the persistent-cache file location")
|
|
34
|
+
.action(async (opts) => {
|
|
35
|
+
const vault = new Vault(opts.vault, { persistentCache: true, cacheFile: opts.cacheFile });
|
|
36
|
+
await vault.ensureExists();
|
|
37
|
+
const removed = await vault.clearDiskCache();
|
|
38
|
+
if (removed) {
|
|
39
|
+
process.stdout.write(`enquire: removed cache file ${vault.cacheFile}\n`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
process.stdout.write(`enquire: no cache file at ${vault.cacheFile}\n`);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
await program.parseAsync(process.argv);
|
|
46
|
+
}
|
|
47
|
+
async function startServer(opts) {
|
|
48
|
+
const vault = new Vault(opts.vault, {
|
|
49
|
+
enableWrite: !!opts.enableWrite,
|
|
50
|
+
maxFileBytes: opts.maxFileBytes !== undefined ? parsePositiveInt(opts.maxFileBytes, "--max-file-bytes") : undefined,
|
|
51
|
+
maxCacheEntries: opts.cacheSize !== undefined ? parsePositiveInt(opts.cacheSize, "--cache-size") : undefined,
|
|
52
|
+
persistentCache: !!opts.persistentCache,
|
|
53
|
+
cacheFile: opts.cacheFile
|
|
54
|
+
});
|
|
55
|
+
await vault.ensureExists();
|
|
56
|
+
const server = new McpServer({
|
|
57
|
+
name: "enquire",
|
|
58
|
+
version: VERSION
|
|
59
|
+
});
|
|
60
|
+
registerReadTools(server, vault);
|
|
61
|
+
if (vault.writeEnabled)
|
|
62
|
+
registerWriteTools(server, vault);
|
|
63
|
+
registerResources(server, vault);
|
|
64
|
+
registerPrompts(server);
|
|
65
|
+
const transport = new StdioServerTransport();
|
|
66
|
+
await server.connect(transport);
|
|
67
|
+
if (vault.persistentCacheEnabled) {
|
|
68
|
+
let saving = false;
|
|
69
|
+
let saved = false;
|
|
70
|
+
const flush = async () => {
|
|
71
|
+
if (saving || saved)
|
|
72
|
+
return;
|
|
73
|
+
saving = true;
|
|
74
|
+
try {
|
|
75
|
+
await vault.saveDiskCache();
|
|
76
|
+
saved = true;
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
process.stderr.write(`enquire: cache flush failed — ${err instanceof Error ? err.message : String(err)}\n`);
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
saving = false;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const onSignal = () => {
|
|
86
|
+
flush().finally(() => process.exit(0));
|
|
87
|
+
};
|
|
88
|
+
process.once("SIGINT", onSignal);
|
|
89
|
+
process.once("SIGTERM", onSignal);
|
|
90
|
+
// beforeExit fires when the loop empties; we schedule one async flush.
|
|
91
|
+
// The `saved` guard prevents recursion when flush completes and beforeExit fires again.
|
|
92
|
+
process.on("beforeExit", () => {
|
|
93
|
+
if (!saved && !saving)
|
|
94
|
+
void flush();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const writeMode = vault.writeEnabled ? "WRITE-ENABLED" : "read-only";
|
|
98
|
+
const cacheMode = vault.persistentCacheEnabled ? `, persistent-cache=${vault.cacheFile}` : "";
|
|
99
|
+
process.stderr.write(`enquire ${VERSION} ready (${writeMode}, vault=${vault.root}${cacheMode})\n`);
|
|
100
|
+
}
|
|
101
|
+
function registerReadTools(server, vault) {
|
|
102
|
+
const READ_ONLY = { readOnlyHint: true, idempotentHint: true, openWorldHint: false };
|
|
103
|
+
server.registerTool("obsidian_list_notes", {
|
|
104
|
+
title: "List notes",
|
|
105
|
+
description: "List notes in the vault. Filter by tag, folder, or modified-since date. Returns title, path, frontmatter, tags, and mtime — newest first.",
|
|
106
|
+
annotations: { ...READ_ONLY, title: "List notes" },
|
|
107
|
+
inputSchema: {
|
|
108
|
+
tag: z.string().optional().describe("Filter by tag (with or without leading #)"),
|
|
109
|
+
folder: z.string().optional().describe("Restrict to a subfolder (relative to vault root)"),
|
|
110
|
+
since_date: z.string().optional().describe("ISO 8601 date (YYYY-MM-DD); only notes mtime >= this"),
|
|
111
|
+
limit: z.number().int().positive().max(500).optional().describe("Max results (default 50)")
|
|
112
|
+
}
|
|
113
|
+
}, async (args) => textResult(await listNotes(vault, args)));
|
|
114
|
+
server.registerTool("obsidian_read_note", {
|
|
115
|
+
title: "Read note",
|
|
116
|
+
description: "Read a note by relative path or by title (filename without .md). Returns content, frontmatter, wikilinks, embeds, tags, mtime.",
|
|
117
|
+
annotations: { ...READ_ONLY, title: "Read note" },
|
|
118
|
+
inputSchema: {
|
|
119
|
+
path: z.string().optional().describe("Path relative to vault root, with or without .md"),
|
|
120
|
+
title: z.string().optional().describe("Note title (filename without .md)")
|
|
121
|
+
}
|
|
122
|
+
}, async (args) => textResult(await readNote(vault, args)));
|
|
123
|
+
server.registerTool("obsidian_resolve_wikilink", {
|
|
124
|
+
title: "Resolve wikilink",
|
|
125
|
+
description: "Resolve an Obsidian [[wikilink]] (or ![[embed]]) to a vault file. Handles aliases (Note|alias), sections (Note#Heading), block refs (Note^block), and ../-relative paths.",
|
|
126
|
+
annotations: { ...READ_ONLY, title: "Resolve wikilink" },
|
|
127
|
+
inputSchema: {
|
|
128
|
+
wikilink: z.string().describe("Wikilink target (e.g. 'Note Name', 'Note#Heading', 'Folder/Note|alias')"),
|
|
129
|
+
from_note: z
|
|
130
|
+
.string()
|
|
131
|
+
.optional()
|
|
132
|
+
.describe("Calling note's relative path (used to disambiguate same-name files)"),
|
|
133
|
+
include_content: z.boolean().optional().describe("Include resolved file's body (default true)")
|
|
134
|
+
}
|
|
135
|
+
}, async (args) => textResult(await resolveWikilink(vault, args)));
|
|
136
|
+
server.registerTool("obsidian_search_text", {
|
|
137
|
+
title: "Search text",
|
|
138
|
+
description: "Case-insensitive substring search across all notes. Returns ranked matches with snippets and line numbers.",
|
|
139
|
+
annotations: { ...READ_ONLY, title: "Search text" },
|
|
140
|
+
inputSchema: {
|
|
141
|
+
query: z.string().min(1).describe("Search string (case-insensitive substring)"),
|
|
142
|
+
folder: z.string().optional().describe("Restrict to a subfolder"),
|
|
143
|
+
limit: z.number().int().positive().max(200).optional().describe("Max results (default 25)")
|
|
144
|
+
}
|
|
145
|
+
}, async (args) => textResult(await searchText(vault, args)));
|
|
146
|
+
server.registerTool("obsidian_get_recent_edits", {
|
|
147
|
+
title: "Get recent edits",
|
|
148
|
+
description: "List notes ordered by most recent modification. Useful for picking up where work was left off.",
|
|
149
|
+
annotations: { ...READ_ONLY, title: "Get recent edits" },
|
|
150
|
+
inputSchema: {
|
|
151
|
+
since_minutes: z.number().int().positive().optional().describe("Only notes edited within this many minutes"),
|
|
152
|
+
folder: z.string().optional().describe("Restrict to a subfolder"),
|
|
153
|
+
limit: z.number().int().positive().max(200).optional().describe("Max results (default 20)")
|
|
154
|
+
}
|
|
155
|
+
}, async (args) => textResult(await getRecentEdits(vault, args)));
|
|
156
|
+
server.registerTool("obsidian_get_backlinks", {
|
|
157
|
+
title: "Get backlinks",
|
|
158
|
+
description: "List every note in the vault that links (or embeds) the target note. Returns ranked hits with snippets and link kind (wikilink/embed/mixed).",
|
|
159
|
+
annotations: { ...READ_ONLY, title: "Get backlinks" },
|
|
160
|
+
inputSchema: {
|
|
161
|
+
path: z.string().optional().describe("Target note path relative to vault root"),
|
|
162
|
+
title: z.string().optional().describe("Target note title (filename without .md)"),
|
|
163
|
+
include_embeds: z.boolean().optional().describe("Include ![[…]] embeds (default true)"),
|
|
164
|
+
limit: z.number().int().positive().max(500).optional().describe("Max results (default 50)")
|
|
165
|
+
}
|
|
166
|
+
}, async (args) => textResult(await getBacklinks(vault, args)));
|
|
167
|
+
server.registerTool("obsidian_list_tags", {
|
|
168
|
+
title: "List tags",
|
|
169
|
+
description: "List every unique tag in the vault with usage counts (frontmatter vs inline). Sorted by count desc.",
|
|
170
|
+
annotations: { ...READ_ONLY, title: "List tags" },
|
|
171
|
+
inputSchema: {
|
|
172
|
+
folder: z.string().optional().describe("Restrict to a subfolder"),
|
|
173
|
+
min_count: z
|
|
174
|
+
.number()
|
|
175
|
+
.int()
|
|
176
|
+
.positive()
|
|
177
|
+
.optional()
|
|
178
|
+
.describe("Drop tags used fewer than this many times (default 1)"),
|
|
179
|
+
limit: z.number().int().positive().max(2000).optional().describe("Max results (default 200)")
|
|
180
|
+
}
|
|
181
|
+
}, async (args) => textResult(await listTags(vault, args)));
|
|
182
|
+
server.registerTool("obsidian_dataview_query", {
|
|
183
|
+
title: "Dataview query (basic)",
|
|
184
|
+
description: 'Run a Dataview-style query. Grammar: (LIST | TABLE col1, col2) FROM ("folder" | #tag) [WHERE pred (AND|OR pred)*] [SORT field [ASC|DESC]] [LIMIT n]. Operators: =, !=, contains, like (SQL-LIKE wildcard with *, escape with \\*). Special fields: file.name, file.path, file.mtime, file.tags. Other identifiers read frontmatter. No expressions, FLATTEN, GROUP BY, or joins — see docs/api.md for the unsupported set.',
|
|
185
|
+
annotations: { ...READ_ONLY, title: "Dataview query" },
|
|
186
|
+
inputSchema: {
|
|
187
|
+
query: z.string().min(1).describe("Dataview-style query string")
|
|
188
|
+
}
|
|
189
|
+
}, async (args) => textResult(await dataviewQuery(vault, args)));
|
|
190
|
+
server.registerTool("obsidian_get_unresolved_wikilinks", {
|
|
191
|
+
title: "Get unresolved wikilinks",
|
|
192
|
+
description: "Find every [[wikilink]] (and ![[embed]]) in the vault whose target does not resolve to a file. Useful as a vault-hygiene utility — broken links, typos, notes you intended to create.",
|
|
193
|
+
annotations: { ...READ_ONLY, title: "Get unresolved wikilinks" },
|
|
194
|
+
inputSchema: {
|
|
195
|
+
folder: z.string().optional().describe("Restrict the scan to a subfolder"),
|
|
196
|
+
include_embeds: z.boolean().optional().describe("Include ![[…]] embeds (default true)"),
|
|
197
|
+
limit: z.number().int().positive().max(2000).optional().describe("Max results (default 200)")
|
|
198
|
+
}
|
|
199
|
+
}, async (args) => textResult(await getUnresolvedWikilinks(vault, args)));
|
|
200
|
+
server.registerTool("obsidian_get_outbound_links", {
|
|
201
|
+
title: "Get outbound links",
|
|
202
|
+
description: "List every link this note points to — wikilinks and (optionally) embeds, with each one's resolution status. Symmetric counterpart to obsidian_get_backlinks.",
|
|
203
|
+
annotations: { ...READ_ONLY, title: "Get outbound links" },
|
|
204
|
+
inputSchema: {
|
|
205
|
+
path: z.string().optional().describe("Source note path relative to vault root"),
|
|
206
|
+
title: z.string().optional().describe("Source note title (filename without .md)"),
|
|
207
|
+
include_embeds: z.boolean().optional().describe("Include ![[…]] embeds (default true)"),
|
|
208
|
+
include_unresolved: z.boolean().optional().describe("Include links that don't resolve (default true)")
|
|
209
|
+
}
|
|
210
|
+
}, async (args) => textResult(await getOutboundLinks(vault, args)));
|
|
211
|
+
}
|
|
212
|
+
function registerWriteTools(server, vault) {
|
|
213
|
+
// destructiveHint=true: `obsidian_create_note` with overwrite=true replaces a
|
|
214
|
+
// file irreversibly; `obsidian_append_to_note` mutates persistent state with
|
|
215
|
+
// no built-in undo. Per MCP spec, both qualify as destructive.
|
|
216
|
+
const WRITE = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false };
|
|
217
|
+
server.registerTool("obsidian_create_note", {
|
|
218
|
+
title: "Create note",
|
|
219
|
+
description: "Create a new note inside the vault. Refuses to overwrite unless overwrite=true. Frontmatter is rendered as YAML when supplied. WRITE TOOL — only available when the server is started with --enable-write.",
|
|
220
|
+
annotations: { ...WRITE, title: "Create note" },
|
|
221
|
+
inputSchema: {
|
|
222
|
+
path: z.string().describe("Vault-relative path (e.g. 'Inbox/My Note' or 'Inbox/My Note.md')"),
|
|
223
|
+
content: z.string().describe("Markdown body (frontmatter is supplied separately)"),
|
|
224
|
+
frontmatter: z
|
|
225
|
+
.record(z.string(), z.unknown())
|
|
226
|
+
.optional()
|
|
227
|
+
.describe("Optional YAML frontmatter as a flat object"),
|
|
228
|
+
overwrite: z.boolean().optional().describe("Allow overwriting an existing note (default false)")
|
|
229
|
+
}
|
|
230
|
+
}, async (args) => textResult(await createNote(vault, args)));
|
|
231
|
+
server.registerTool("obsidian_append_to_note", {
|
|
232
|
+
title: "Append to note",
|
|
233
|
+
description: "Append a block of markdown to the end of an existing note. Provide either path or title. WRITE TOOL — only available when the server is started with --enable-write.",
|
|
234
|
+
annotations: { ...WRITE, title: "Append to note" },
|
|
235
|
+
inputSchema: {
|
|
236
|
+
path: z.string().optional().describe("Vault-relative path of the target note"),
|
|
237
|
+
title: z.string().optional().describe("Target note title (filename without .md)"),
|
|
238
|
+
content: z.string().describe("Markdown to append"),
|
|
239
|
+
separator: z
|
|
240
|
+
.string()
|
|
241
|
+
.optional()
|
|
242
|
+
.describe('String inserted between existing body and the new content (default "\\n\\n")')
|
|
243
|
+
}
|
|
244
|
+
}, async (args) => textResult(await appendToNote(vault, args)));
|
|
245
|
+
}
|
|
246
|
+
function registerResources(server, vault) {
|
|
247
|
+
server.registerResource("vault-info", "obsidian://vault/info", {
|
|
248
|
+
title: "Vault metadata",
|
|
249
|
+
description: "Root path, note count, write-enabled flag, and limits for the connected vault.",
|
|
250
|
+
mimeType: "application/json"
|
|
251
|
+
}, async (uri) => {
|
|
252
|
+
const entries = await vault.listMarkdown();
|
|
253
|
+
const payload = {
|
|
254
|
+
root: vault.root,
|
|
255
|
+
note_count: entries.length,
|
|
256
|
+
write_enabled: vault.writeEnabled,
|
|
257
|
+
max_file_bytes: vault.maxFileBytes,
|
|
258
|
+
max_cache_entries: vault.maxCacheEntries,
|
|
259
|
+
version: VERSION
|
|
260
|
+
};
|
|
261
|
+
return {
|
|
262
|
+
contents: [{ uri: uri.href, mimeType: "application/json", text: JSON.stringify(payload, null, 2) }]
|
|
263
|
+
};
|
|
264
|
+
});
|
|
265
|
+
server.registerResource("vault-note", new ResourceTemplate("obsidian://note/{+notePath}", {
|
|
266
|
+
list: async () => {
|
|
267
|
+
const entries = await vault.listMarkdown();
|
|
268
|
+
return {
|
|
269
|
+
resources: entries.map((e) => ({
|
|
270
|
+
uri: `obsidian://note/${encodeNotePath(e.relPath)}`,
|
|
271
|
+
name: e.basename.replace(/\.md$/i, ""),
|
|
272
|
+
description: e.relPath,
|
|
273
|
+
mimeType: "text/markdown"
|
|
274
|
+
}))
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}), {
|
|
278
|
+
title: "Vault notes",
|
|
279
|
+
description: "Each markdown note in the vault, addressable via `obsidian://note/<relative-path>`.",
|
|
280
|
+
mimeType: "text/markdown"
|
|
281
|
+
}, async (uri, params) => {
|
|
282
|
+
const raw = Array.isArray(params.notePath) ? params.notePath.join("/") : params.notePath;
|
|
283
|
+
const decoded = decodeNotePath(raw);
|
|
284
|
+
const { content } = await vault.readNote(decoded);
|
|
285
|
+
return {
|
|
286
|
+
contents: [{ uri: uri.href, mimeType: "text/markdown", text: content }]
|
|
287
|
+
};
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
function registerPrompts(server) {
|
|
291
|
+
server.registerPrompt("summarize_recent_edits", {
|
|
292
|
+
title: "Summarize recent edits",
|
|
293
|
+
description: "Use obsidian_get_recent_edits + obsidian_read_note to summarize what was worked on recently.",
|
|
294
|
+
argsSchema: {
|
|
295
|
+
since_minutes: z.string().optional().describe("Window in minutes (default 720 — last 12 hours)")
|
|
296
|
+
}
|
|
297
|
+
}, ({ since_minutes }) => ({
|
|
298
|
+
messages: [
|
|
299
|
+
{
|
|
300
|
+
role: "user",
|
|
301
|
+
content: {
|
|
302
|
+
type: "text",
|
|
303
|
+
text: `Summarize what I've been working on in my Obsidian vault.
|
|
304
|
+
|
|
305
|
+
1. Call \`obsidian_get_recent_edits\` with \`since_minutes=${since_minutes ?? 720}\` and \`limit=10\`.
|
|
306
|
+
2. For each top-3 result, call \`obsidian_read_note\` to read the body.
|
|
307
|
+
3. Produce one paragraph per note: what changed, what's open, what's blocked. Quote any TODO/FIXME bullets verbatim.
|
|
308
|
+
4. Finish with a 1-sentence "what to pick up next" suggestion.`
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
]
|
|
312
|
+
}));
|
|
313
|
+
server.registerPrompt("review_tag", {
|
|
314
|
+
title: "Review notes by tag",
|
|
315
|
+
description: "Pull every note with a given tag and surface the open questions / unresolved threads.",
|
|
316
|
+
argsSchema: {
|
|
317
|
+
tag: z.string().describe("The tag to review (with or without leading #)")
|
|
318
|
+
}
|
|
319
|
+
}, ({ tag }) => ({
|
|
320
|
+
messages: [
|
|
321
|
+
{
|
|
322
|
+
role: "user",
|
|
323
|
+
content: {
|
|
324
|
+
type: "text",
|
|
325
|
+
text: `Review every note tagged \`${tag}\` in my vault.
|
|
326
|
+
|
|
327
|
+
1. Call \`obsidian_list_notes\` with \`tag=${tag}\`, \`limit=50\`.
|
|
328
|
+
2. Read each note via \`obsidian_read_note\`.
|
|
329
|
+
3. For each: list its open questions, blocking decisions, and any explicit TODOs.
|
|
330
|
+
4. Group across notes — what themes recur? What's the highest-leverage thing to resolve?`
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
]
|
|
334
|
+
}));
|
|
335
|
+
server.registerPrompt("find_orphans", {
|
|
336
|
+
title: "Find orphan notes",
|
|
337
|
+
description: "Identify notes with no inbound links — candidates for archiving or wiring up.",
|
|
338
|
+
argsSchema: {
|
|
339
|
+
folder: z.string().optional().describe("Restrict the scan to a subfolder")
|
|
340
|
+
}
|
|
341
|
+
}, ({ folder }) => ({
|
|
342
|
+
messages: [
|
|
343
|
+
{
|
|
344
|
+
role: "user",
|
|
345
|
+
content: {
|
|
346
|
+
type: "text",
|
|
347
|
+
text: `Find orphan notes in my Obsidian vault${folder ? ` under \`${folder}\`` : ""}.
|
|
348
|
+
|
|
349
|
+
1. Call \`obsidian_list_notes\`${folder ? ` with \`folder=${folder}\`` : ""} to enumerate.
|
|
350
|
+
2. For each note, call \`obsidian_get_backlinks\` and note the \`count\`.
|
|
351
|
+
3. Output the notes with \`count == 0\`, sorted by mtime ascending (oldest first).
|
|
352
|
+
4. For each orphan, propose one of: archive, link from a hub note, delete. Pick based on its frontmatter and a 1-line skim of its body.`
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
]
|
|
356
|
+
}));
|
|
357
|
+
server.registerPrompt("weekly_review", {
|
|
358
|
+
title: "Weekly review",
|
|
359
|
+
description: "Aggregate the last 7 days of vault edits and surface what shipped, what's open, what's stuck.",
|
|
360
|
+
argsSchema: {
|
|
361
|
+
folder: z.string().optional().describe("Restrict the review to a subfolder")
|
|
362
|
+
}
|
|
363
|
+
}, ({ folder }) => ({
|
|
364
|
+
messages: [
|
|
365
|
+
{
|
|
366
|
+
role: "user",
|
|
367
|
+
content: {
|
|
368
|
+
type: "text",
|
|
369
|
+
text: `Run a weekly review of my Obsidian vault${folder ? ` (folder \`${folder}\`)` : ""}.
|
|
370
|
+
|
|
371
|
+
1. Call \`obsidian_get_recent_edits\` with \`since_minutes=10080\`${folder ? `, \`folder=${folder}\`` : ""}, \`limit=50\` to get the past week's edits.
|
|
372
|
+
2. Group results by top-level frontmatter \`tags\` (or by the most-frequent inline tag if no frontmatter).
|
|
373
|
+
3. For each tag-group, read the top 2 notes via \`obsidian_read_note\` and produce one bullet:
|
|
374
|
+
- "Shipped:" what was completed
|
|
375
|
+
- "Open:" any TODO/FIXME/QUESTION still in the body
|
|
376
|
+
- "Stuck:" anything explicitly blocked
|
|
377
|
+
4. End with a 2-sentence reflection: where did the week's energy actually go vs. where you intended.`
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
]
|
|
381
|
+
}));
|
|
382
|
+
server.registerPrompt("extract_todos", {
|
|
383
|
+
title: "Extract TODOs",
|
|
384
|
+
description: "Surface every TODO / FIXME / QUESTION across the vault, grouped by note.",
|
|
385
|
+
argsSchema: {
|
|
386
|
+
folder: z.string().optional().describe("Restrict the scan to a subfolder"),
|
|
387
|
+
tag: z.string().optional().describe("Restrict to notes carrying a specific tag")
|
|
388
|
+
}
|
|
389
|
+
}, ({ folder, tag }) => ({
|
|
390
|
+
messages: [
|
|
391
|
+
{
|
|
392
|
+
role: "user",
|
|
393
|
+
content: {
|
|
394
|
+
type: "text",
|
|
395
|
+
text: `Extract every actionable item from my Obsidian vault${folder ? ` under \`${folder}\`` : ""}${tag ? ` (tag \`${tag}\`)` : ""}.
|
|
396
|
+
|
|
397
|
+
1. Call \`obsidian_search_text\` three times — once each for "TODO", "FIXME", "QUESTION" — with ${folder ? `\`folder=${folder}\`` : "no folder filter"} and \`limit=200\`.${tag ? `\n2. Cross-filter the hits to only notes from \`obsidian_list_notes({ tag: "${tag}" })\`.` : ""}
|
|
398
|
+
${tag ? "3" : "2"}. For each unique source note, read it via \`obsidian_read_note\` and pull the actual TODO/FIXME/QUESTION lines verbatim.
|
|
399
|
+
${tag ? "4" : "3"}. Output a flat list grouped by note path. Sort within each group by line number.
|
|
400
|
+
${tag ? "5" : "4"}. End with a one-line "highest-leverage next action" pick — the single TODO that, if done today, would unblock the most other items.`
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
]
|
|
404
|
+
}));
|
|
405
|
+
server.registerPrompt("process_inbox", {
|
|
406
|
+
title: "Process inbox",
|
|
407
|
+
description: "For every note in an inbox folder, propose where it should live and which existing notes link to it.",
|
|
408
|
+
argsSchema: {
|
|
409
|
+
folder: z.string().describe("Inbox folder path (e.g. '00_Inbox')")
|
|
410
|
+
}
|
|
411
|
+
}, ({ folder }) => ({
|
|
412
|
+
messages: [
|
|
413
|
+
{
|
|
414
|
+
role: "user",
|
|
415
|
+
content: {
|
|
416
|
+
type: "text",
|
|
417
|
+
text: `Process every note in \`${folder}\`.
|
|
418
|
+
|
|
419
|
+
1. Call \`obsidian_list_notes\` with \`folder=${folder}\`, \`limit=100\`.
|
|
420
|
+
2. For each note:
|
|
421
|
+
a. Read it via \`obsidian_read_note\`.
|
|
422
|
+
b. Check inbound references via \`obsidian_get_backlinks\`.
|
|
423
|
+
c. Skim outbound links via \`obsidian_get_outbound_links\`.
|
|
424
|
+
3. For each note, propose ONE of:
|
|
425
|
+
- **Move to \`<destination>\`** — pick a real existing folder based on the note's tags and content.
|
|
426
|
+
- **Merge into \`<existing-note>\`** — if the content overlaps with an existing note.
|
|
427
|
+
- **Promote to its own hub** — if it spawned 3+ outbound links.
|
|
428
|
+
- **Archive / delete** — if it's stale and unlinked.
|
|
429
|
+
4. Output: one block per note with the proposed action and a one-sentence rationale. Don't actually move anything; just propose.`
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
]
|
|
433
|
+
}));
|
|
434
|
+
}
|
|
435
|
+
function parsePositiveInt(raw, flag) {
|
|
436
|
+
const n = Number(raw);
|
|
437
|
+
if (!Number.isFinite(n) || !Number.isInteger(n) || n <= 0) {
|
|
438
|
+
throw new Error(`${flag} must be a positive integer; got "${raw}"`);
|
|
439
|
+
}
|
|
440
|
+
return n;
|
|
441
|
+
}
|
|
442
|
+
function encodeNotePath(relPath) {
|
|
443
|
+
return relPath.split(path.sep).map(encodeURIComponent).join("/");
|
|
444
|
+
}
|
|
445
|
+
function decodeNotePath(uriPath) {
|
|
446
|
+
return uriPath.split("/").map(decodeURIComponent).join("/");
|
|
447
|
+
}
|
|
448
|
+
function textResult(payload) {
|
|
449
|
+
return {
|
|
450
|
+
content: [{ type: "text", text: JSON.stringify(payload, null, 2) }]
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
const isCliEntry = (() => {
|
|
454
|
+
if (!process.argv[1])
|
|
455
|
+
return false;
|
|
456
|
+
try {
|
|
457
|
+
return fileURLToPath(import.meta.url) === path.resolve(process.argv[1]);
|
|
458
|
+
}
|
|
459
|
+
catch {
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
})();
|
|
463
|
+
if (isCliEntry) {
|
|
464
|
+
main().catch((err) => {
|
|
465
|
+
process.stderr.write(`enquire fatal: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}\n`);
|
|
466
|
+
process.exit(1);
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
export { main, parsePositiveInt, startServer };
|
|
470
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface Wikilink {
|
|
2
|
+
raw: string;
|
|
3
|
+
target: string;
|
|
4
|
+
section?: string;
|
|
5
|
+
block?: string;
|
|
6
|
+
alias?: string;
|
|
7
|
+
}
|
|
8
|
+
export type Embed = Wikilink;
|
|
9
|
+
export interface ParsedNote {
|
|
10
|
+
frontmatter: Record<string, unknown>;
|
|
11
|
+
body: string;
|
|
12
|
+
wikilinks: Wikilink[];
|
|
13
|
+
embeds: Embed[];
|
|
14
|
+
tags: string[];
|
|
15
|
+
}
|
|
16
|
+
export declare function parseNote(source: string): ParsedNote;
|
|
17
|
+
export declare function extractWikilinks(text: string): Wikilink[];
|
|
18
|
+
export declare function extractEmbeds(text: string): Embed[];
|
|
19
|
+
export declare function extractInlineTags(text: string): string[];
|
|
20
|
+
export declare function extractFrontmatterTags(fm: Record<string, unknown>): string[];
|
|
21
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC;AAE7B,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAmBpD;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAEzD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CAEnD;AAuCD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAMxD;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAa5E"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import matter from "gray-matter";
|
|
2
|
+
export function parseNote(source) {
|
|
3
|
+
let frontmatter = {};
|
|
4
|
+
let body = source;
|
|
5
|
+
try {
|
|
6
|
+
const parsed = matter(source);
|
|
7
|
+
frontmatter = (parsed.data ?? {});
|
|
8
|
+
body = parsed.content;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
// Malformed YAML — fall back to treating the whole file as body.
|
|
12
|
+
body = source;
|
|
13
|
+
}
|
|
14
|
+
const sanitized = stripCodeAndInline(body);
|
|
15
|
+
return {
|
|
16
|
+
frontmatter,
|
|
17
|
+
body,
|
|
18
|
+
wikilinks: extractWikilinks(sanitized),
|
|
19
|
+
embeds: extractEmbeds(sanitized),
|
|
20
|
+
tags: collectTags(frontmatter, sanitized)
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const WIKILINK_RE = /(?<!!)\[\[([^\]\n]+?)\]\]/g;
|
|
24
|
+
const EMBED_RE = /!\[\[([^\]\n]+?)\]\]/g;
|
|
25
|
+
export function extractWikilinks(text) {
|
|
26
|
+
return matchLinks(text, WIKILINK_RE);
|
|
27
|
+
}
|
|
28
|
+
export function extractEmbeds(text) {
|
|
29
|
+
return matchLinks(text, EMBED_RE);
|
|
30
|
+
}
|
|
31
|
+
function matchLinks(text, re) {
|
|
32
|
+
const out = [];
|
|
33
|
+
for (const m of text.matchAll(re)) {
|
|
34
|
+
const raw = m[1];
|
|
35
|
+
if (raw === undefined)
|
|
36
|
+
continue;
|
|
37
|
+
let alias;
|
|
38
|
+
let rest = raw;
|
|
39
|
+
const pipe = rest.indexOf("|");
|
|
40
|
+
if (pipe !== -1) {
|
|
41
|
+
alias = rest.slice(pipe + 1).trim();
|
|
42
|
+
rest = rest.slice(0, pipe);
|
|
43
|
+
}
|
|
44
|
+
let block;
|
|
45
|
+
const blockIdx = rest.indexOf("^");
|
|
46
|
+
if (blockIdx !== -1) {
|
|
47
|
+
block = rest.slice(blockIdx + 1).trim();
|
|
48
|
+
rest = rest.slice(0, blockIdx);
|
|
49
|
+
}
|
|
50
|
+
let section;
|
|
51
|
+
const hashIdx = rest.indexOf("#");
|
|
52
|
+
if (hashIdx !== -1) {
|
|
53
|
+
section = rest.slice(hashIdx + 1).trim();
|
|
54
|
+
rest = rest.slice(0, hashIdx);
|
|
55
|
+
}
|
|
56
|
+
out.push({
|
|
57
|
+
raw,
|
|
58
|
+
target: rest.trim(),
|
|
59
|
+
...(section !== undefined ? { section } : {}),
|
|
60
|
+
...(block !== undefined ? { block } : {}),
|
|
61
|
+
...(alias !== undefined ? { alias } : {})
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
const TAG_RE = /(?:^|[\s([{>])#([\p{L}][\p{L}\p{N}_/-]*)/gu;
|
|
67
|
+
export function extractInlineTags(text) {
|
|
68
|
+
const found = new Set();
|
|
69
|
+
for (const m of text.matchAll(TAG_RE)) {
|
|
70
|
+
if (m[1] !== undefined)
|
|
71
|
+
found.add(m[1]);
|
|
72
|
+
}
|
|
73
|
+
return [...found];
|
|
74
|
+
}
|
|
75
|
+
export function extractFrontmatterTags(fm) {
|
|
76
|
+
const raw = fm.tags ?? fm.tag;
|
|
77
|
+
if (!raw)
|
|
78
|
+
return [];
|
|
79
|
+
if (Array.isArray(raw)) {
|
|
80
|
+
return raw.filter((t) => typeof t === "string").map(normalizeTag);
|
|
81
|
+
}
|
|
82
|
+
if (typeof raw === "string") {
|
|
83
|
+
return raw
|
|
84
|
+
.split(/[,\s]+/)
|
|
85
|
+
.filter(Boolean)
|
|
86
|
+
.map(normalizeTag);
|
|
87
|
+
}
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
function normalizeTag(t) {
|
|
91
|
+
return t.replace(/^#+/, "");
|
|
92
|
+
}
|
|
93
|
+
function collectTags(fm, body) {
|
|
94
|
+
const out = new Set();
|
|
95
|
+
for (const t of extractFrontmatterTags(fm))
|
|
96
|
+
out.add(t);
|
|
97
|
+
for (const t of extractInlineTags(body))
|
|
98
|
+
out.add(t);
|
|
99
|
+
return [...out];
|
|
100
|
+
}
|
|
101
|
+
function stripCodeAndInline(text) {
|
|
102
|
+
return text
|
|
103
|
+
.replace(/```[\s\S]*?```/g, "")
|
|
104
|
+
.replace(/~~~[\s\S]*?~~~/g, "")
|
|
105
|
+
.replace(/`[^`\n]*`/g, "");
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|