MCP server wrapping SQLite FTS5 wiki index. Exposes fast BM25 search, note retrieval, backlinks, tag listing, and schema-enforced note writing for markdown vaults.
wiki-mcp demonstrates solid tool design with 14 well-named, verb-prefixed tools (search, get_note, write_note, etc.). All tools have descriptions (avg ~180 chars, within 10-1024 baseline). Input schemas are present and typed for all tools. However, output schemas are undocumented, responses are inferred from code inspection, not declared in tool definitions. Error handling is minimal: most tools return {'error': str(e)} without recovery guidance. Parameter descriptions are present but sometimes generic (e.g., 'relative path' lacks format/constraint detail). Write operations (write_note, update_note, append_section) lack confirmation/dry-run patterns. Tool composition is strong: search→get_note→backlinks forms a natural chain with proper ID threading.
Append a new `## section` to an existing note. Bumps `updated:`.
Notes that link to the given note (via [[wikilink]] syntax).
Get a starter frontmatter blob + skeleton body for a given note type. Use this BEFORE drafting a note — gives you the shape, suggested folder, suggested tags (filtered to taxonomy), and skeleton sections. Avoids write_note rejections from missing frontmatter.
Fetch full body of a note by relative path (e.g. 'Bug-Bounty/_Index.md').
Validate a markdown body against the wiki schema WITHOUT writing. Returns errors list (empty = passes). Use this BEFORE write_note when drafting — cheaper than write+rollback. Checks: • required frontmatter (title, created, updated, type, tags) • type ∈ {entity, concept, comparison, query, runbook, decision, journal} • tags ∈ taxonomy (auto-loaded from SCHEMA.md) • date format YYYY-MM-DD • ≥1 [[wikilink]] outbound • body ≤ 150 lines • H1 present
All #tags in the vault w/ usage counts.
Output schemas undocumented. Tool responses are inferred from code (e.g., search returns {query, count, hits[{path, title, snippet, rank}]}) but not declared in tool definitions. LLMs cannot plan downstream calls or extract fields reliably without explicit response schemas.
Write operations (write_note, update_note, append_section) lack dry-run or confirmation patterns. Agents can accidentally create/modify notes without preview. No idempotency guarantees documented.
Error handling is minimal. Most tools return {'error': str(e)} without recovery guidance. E.g., get_note returns 'not found: path' but does not suggest search() or list available paths. Agents cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Notes modified in the last N days, newest first. Use for standup reviews, change tracking, and team activity feeds.
Rebuild the FTS index. Set full=true to drop+rebuild from scratch.
Fast ranked search across the wiki. Returns top-N matches w/ BM25 score and 24-word highlighted snippet. Use this BEFORE reading full files.
Index health: note count, db size, last reindex time.
Find [[wikilinks]] pointing to non-existent notes — knowledge gaps. High reference counts = important missing knowledge. Create these notes to fill gaps. Great for team sprint planning: "what do we need to document?"
Return the current tag taxonomy (parsed from SCHEMA.md) plus valid types. Use this BEFORE picking tags for a new note — only listed tags will pass lint. Adding a new tag requires editing SCHEMA.md first.
Patch an existing note. Lints before write. Bumps `updated:` field.
Create a new wiki note with enforced schema. Filename is auto-slugified from title. Frontmatter is auto-built. Lints before write — raises if schema fails.
Parameter descriptions lack format/constraint detail. E.g., 'path' is described as 'relative path under vault' but does not specify allowed characters, max length, or whether it must exist. 'type' in write_note lists valid values in description text, not as enum constraint.
No pagination support. search() caps at limit=20, but list_tags() and stubs() return all results without offset/cursor. Large vaults risk context window exhaustion.