outline-mcp
Tree-structured knowledge base as an MCP server, giving LLM sessions a persistent, editable knowledge tree with browsing, annotation, and context injection.
README
outline-mcp
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.
Quick Start
cargo install --path .
Claude Code (~/.claude.json)
Native binary (after cargo install)
{
"mcpServers": {
"outline": {
"command": "outline-mcp",
"args": ["/path/to/your-book.json"]
}
}
}
Docker (no Rust toolchain required)
{
"mcpServers": {
"outline": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "/path/to/data:/data",
"ghcr.io/ynishi/outline-mcp:latest",
"/data/your-book.json"
]
}
}
}
If the path argument is omitted, defaults to outline-book.json in the current directory.
Workflow
shelf → select_book → toc → node_create / node_update / node_move
node_batch_move / node_batch_update / node_query
checklist / import / init / gen_routing
snapshot_create / snapshot_list / snapshot_restore
node_history / dump
init— Create a new empty booknode_create— Add sections and content nodes (with optionalproperties)toc— View the table of contents with numbered IDs (e.g.1,2-3). Supportsfilterby propertiesselect_book— Select a book. Nodes withinject=trueproperty 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 withroutingproperty 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 file
Node IDs
toc assigns human-friendly numbered IDs:
1. Coding Standards
1-1. Naming Conventions
1-2. Error Handling
2. Testing
2-1. Unit Tests
2-2. Integration Tests
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.
Node Properties
Nodes can have key-value properties for metadata:
node_create title="My Rule" properties={"inject": "true", "scope": "rust"}
inject=true— Node body is automatically included inselect_bookoutput (context injection)routing=<scene>— Marks the node forgen_routingoutput. Use|to assign multiple scenes (e.g.routing="testing|TDD")routing_ref=<text>— Overrides the default§ID Titlereference in the routing table (e.g.routing_ref="select_book で全体参照")- Properties with value
"true"appear as tags intoc:1. My Rule [inject] tocsupports filtering:filter={"inject": "true"}shows only matching nodes- Properties are preserved in JSON export/import
Architecture
The repository is a Cargo workspace with two crates: an rmcp-independent SDK (outline-mcp-core) and the MCP server binary (outline-mcp).
crates/
├── outline-mcp-core/ # SDK crate (library, no rmcp dependency)
│ └── src/
│ ├── domain/ # Core model (TemplateBook, TemplateNode, NodeId)
│ │ ├── model/ # Aggregate root + value objects
│ │ ├── error.rs # Domain errors
│ │ └── repository.rs # BookRepository trait
│ ├── application/ # Use cases
│ │ ├── service.rs # BookService (CRUD)
│ │ └── eject.rs # EjectService (Markdown/JSON export & import)
│ └── infra/ # Persistence
│ ├── json_store.rs # JSON file repository (atomic write)
│ ├── changelog_store.rs
│ └── snapshot.rs
└── outline-mcp/ # Binary crate (MCP server, depends on outline-mcp-core)
└── src/
├── main.rs # Entry point
└── interface/
└── mcp/ # MCP handlers (rmcp, stdio)
Downstream applications that want to embed the tree / snapshot / changelog logic without pulling rmcp can depend on outline-mcp-core directly:
[dependencies]
outline-mcp-core = "0.7"
Export Formats
Markdown (default)
# My Runbook
## Design
- [ ] Define requirements
> requirements list: ___
- [ ] API design
REST endpoints
JSON
Tree-structured format that can be re-imported:
{
"title": "My Runbook",
"max_depth": 4,
"nodes": [
{
"title": "Design",
"node_type": "section",
"children": [...]
}
]
}
Upgrading
From 0.9.1 or earlier
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.
cp -a <shelf-dir> <shelf-dir>.bak
2. Run the migrator.
outline-mcp migrate-snapshots --shelf <shelf-dir>
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:
== rust ==
scanned: 3
imported: 3
skipped: 0
failed: 0
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.
What the migrator does not do
- It does not delete the source
.snap.*.jsonfiles. Keep them for a while as a second layer of backup. - It will refuse a stream that already carries events from a different clock (e.g. a book that has been actively edited via
snapshot_createbetween the upgrade and the migrator run). Run the migrator before doing new writes. - The startup warning that steers you here is emitted via
tracing::warn!onstderr. MCP clients that swallow server stderr (Claude Code included) will not surface it — treat the migrator command as the canonical way to check.
Known limitations
- Snapshots that were post-hoc labeled via
snapshot_tag(as opposed to labeled atsnapshot_createtime) lose the "time the label was attached" value in their sidecar.meta.json's internalcreated_atfield. The label text itself is preserved, andcreated_atis never exposed through the MCP surface — this is an internal-metadata drift, not user-visible.
License
Licensed under either of
at your option.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.