The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Outline MCP listing page.
Tree-structured knowledge base as an MCP server.
LLM sessions are ephemeral. outline-mcp gives them a persistent, editable knowledge tree — sections and content nodes that can be browsed (toc), annotated with properties, and evolved across sessions. Nodes with inject=true are automatically included in session context.
~/.claude.json)cargo install)If the path argument is omitted, defaults to outline-book.json in the current directory.
--mcp-http serves the same tools over MCP's streamable HTTP transport, so several devices can share one shelf. A single process owns the directory — book JSON plus the per-slug .events.db — which keeps the single-writer storage model intact, so there is no sync or conflict resolution to configure.
Point clients at /mcp on that address:
Binding beyond loopback requires a token. Startup is refused without one, before any listener is opened:
Every request must then carry Authorization: Bearer <token> — set it wherever your MCP client configures request headers. TLS termination is a reverse-proxy concern. Logs go to stderr in both transports; stdout stays reserved for the stdio protocol channel.
Service templates for running this as a daemon live in contrib/systemd/ and contrib/launchd/. docs/runbooks/ covers moving an existing shelf to a central host (data-migration.md) and verifying a deployment end to end (multi-device-smoke.md).
init — Create a new empty booknode_create — Add sections and content nodes (with optional properties)toc — View the table of contents with numbered IDs (e.g. 1, 2-3). Supports filter by propertiesselect_book — Select a book. Nodes with inject=true property have their body auto-appended (draft nodes excluded)checklist — Export a section (or the whole book) as a Markdown checklist with checkboxesnode_update — Edit title, body, type, placeholder, properties, or status (active/draft) of a nodenode_move — Relocate or delete nodes (with descendants)node_batch_move — Move or delete multiple nodes in a single atomic call (requires UUID or UUID-prefix IDs)node_batch_update — Update title/body/type/properties/status on multiple nodes atomicallynode_query — Search nodes by property values, status (active/draft), or type (section/content); optionally include body in resultsimport — Import a book from a previously exported JSON filegen_routing — Generate a Markdown routing table from nodes with routing property across all bookssnapshot_create / snapshot_list / snapshot_restore — Full book versioning (create, list, restore)node_history — View per-node change log with before/after diffsdump — Export full book as JSON filetoc assigns human-friendly numbered IDs:
These IDs (1, 1-2, 2-1, etc.) work in most tools. Full UUIDs and title substring matching are also supported as fallbacks.
Note:
node_batch_moveandnode_batch_updaterequire UUID or UUID-prefix IDs. Hierarchical toc IDs are intentionally rejected to prevent positional drift when the tree is modified mid-batch.
Nodes can have key-value properties for metadata:
inject=true — Node body is automatically included in select_book output (context injection)routing=<scene> — Marks the node for gen_routing output. Use | to assign multiple scenes (e.g. routing="testing|TDD")routing_ref=<text> — Overrides the default §ID Title reference in the routing table (e.g. routing_ref="select_book で全体参照")"true" appear as tags in toc: 1. My Rule [inject]toc supports filtering: filter={"inject": "true"} shows only matching nodesThe repository is a Cargo workspace with three crates: an rmcp-independent SDK (outline-mcp-core), the MCP protocol layer (outline-mcp-rmcp), and the server binary (outline-mcp).
Downstream applications that want to embed the tree / snapshot / changelog logic without pulling rmcp can depend on outline-mcp-core directly:
Tree-structured format that can be re-imported:
The snapshot subsystem now persists to a per-book SQLite event log ({shelf_dir}/{slug}.events.db) in addition to the existing on-disk .snap.{millis}.json files. Existing installs must run the migrator once to fold pre-existing on-disk snapshots into the event log — until they do, those snapshots stay on disk but are not visible to snapshot_list / snapshot_restore.
1. Back up the shelf directory. The migrator is idempotent and does not delete files, but the shelf directory is the source of truth for your books; a copy is cheap insurance.
2. Run the migrator.
The migrator scans every {slug}.snap.{millis}.json file under <shelf-dir>, imports each into {shelf-dir}/{slug}.events.db with its original timestamp preserved, and leaves the source .json file in place. Output looks like:
Pass --slug <slug> to migrate one book at a time.
3. Verify (optional). Re-running the migrator is a no-op — every file will report as skipped.
.snap.*.json files. Keep them for a while as a second layer of backup.snapshot_create between the upgrade and the migrator run). Run the migrator before doing new writes.tracing::warn! on stderr. MCP clients that swallow server stderr (Claude Code included) will not surface it — treat the migrator command as the canonical way to check.snapshot_tag (as opposed to labeled at snapshot_create time) lose the "time the label was attached" value in their sidecar .meta.json's internal created_at field. The label text itself is preserved, and created_at is never exposed through the MCP surface — this is an internal-metadata drift, not user-visible.Licensed under either of
at your option.