
Locus
io.github.EDKarlssonPublished by GitHub account EDKarlssonv0.6.2Updated Oct 27, 2026
Hierarchical markdown memory palace for AI agents — structured palace navigation via MCP tools.
Overview
Locus is a local MCP server that gives an assistant a hierarchical markdown "memory palace" it can list, read, search and write on demand.
- What you can do
- List the palace index or the files inside a room
- Read any file in the palace, or batch-read up to 20 files in one call
- Run ranked full-text search over a shared SQLite FTS5 index
- Write files atomically, with certain directories blocked from writes
- Optionally verify and sign files with Ed25519 when security mode is enabled
- When to use it
- Useful when you want an agent to keep durable, file-based notes across sessions and load only the relevant part of them instead of a whole memory dump. Suits project conventions, runbooks and session logs kept as plain markdown in a directory you control.
- Requirements
- Runs locally over stdio as a Python package (pip install locus-mcp, or uvx without installing). Needs a palace directory, passed with --palace or the LOCUS_PALACE environment variable; locus init creates one from a template. Optional SSE transport requires FASTMCP_HOST to be set explicitly.
Installation
In SourceWeft
- Open Locus in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Locus
[CI] [PyPI version] [License: MIT] [Python 3.11+]
Hierarchical markdown-based memory system for autonomous AI agents. Each directory is a room (locus) in the palace, containing specific knowledge navigated on demand. Named for the atomic unit of the Method of Loci.
Core idea: Keep context windows small. Load only the room you need, not the whole palace.
How it works
An agent reads INDEX.md, navigates to the relevant room, and reads only that room.
Session logs accumulate until consolidation merges them into canonical files.
See the wiki for full documentation.
Quick start
Installation
MCP server (recommended for MCP-capable clients)
Or run without installing using uvx:
Agent skills
The skill files are the one part of Locus written for a specific runtime. The
palace convention, the MCP server, and the recall / lint / index CLIs are
runtime-neutral and work from anything that can read a file or speak MCP. The
skills in skills/claude/ are written and maintained for Claude Code, and that is
the only set shipped here. They are plain markdown with YAML frontmatter, so
another runtime is welcome to adapt them. Per-runtime copies used to live in
skills/codex/ and skills/gemini/; they were removed because keeping three
variants honest cost more than it returned.
Install them from a clone:
CLAUDE_SKILLS_DIR overrides the destination.
Agent SDK (Python)
MCP Server
The locus-mcp command exposes five tools over the Model Context Protocol.
Use stdio for all local integrations (Claude Desktop, Claude Code, Codex, Gemini — default, no extra flags needed).
SSE transport is available for network deployments (--transport sse) and requires FASTMCP_HOST=0.0.0.0
to be set explicitly — the server binds to loopback by default.
Add --security to enable Ed25519 signature verification on reads and automatic signing on writes.
See Security below.
Claude Desktop (claude_desktop_config.json)
Or using uvx (no install required):
Cursor / Zed
Environment variable
All clients support LOCUS_PALACE as an alternative to --palace:
See MCP Server Configuration
for the full client setup guide and spec/mcp-server.md for architecture details.
Recall
locus recall answers "what do I already know about this?" in one call, fast enough
to run on every prompt from a hook. It keeps a SQLite FTS5 index (standard library only,
no PyYAML) over any number of markdown roots: a palace, an OKF bundle, a Claude Code
memory directory, or all of them at once.
Frontmatter drives the result: title (or name, or the first heading), description,
tags, type (or metadata.type), modified (else generated.at, else file mtime),
status, stale_after, and verified. Ranking is bm25 with title and description
weighted above the body; exact ties go to human-reviewed files, then to the newest
modified. A hit is flagged STALE when its stale_after has passed or its status is
deprecated. Trust tiers follow OKF: unverified, machine-confirmed (only non-human
verified entries), human-reviewed (any verified entry whose by starts with human:).
Roots can live in a .locus.toml in the project or any parent directory:
The index is stored at ${XDG_CACHE_HOME:-~/.cache}/locus/<hash-of-roots>.sqlite, never
inside a root, and is refreshed incrementally (mtime, then content hash) on every call.
With no hits the text output is empty and the exit status is still 0, so a prompt hook can
call it unconditionally:
The MCP server's memory_search uses the same index, so MCP results are ranked the
same way. Full rules in spec/recall.md.
Lint and index
locus lint checks markdown roots for Open Knowledge Format
v0.2 conformance and the Locus palace conventions. locus index generates the
index files those conventions define. Both read the same frontmatter recall
indexes, and neither imports the Agent SDK, so a CI job that only checks
conformance does not install it.
lint
Rules split in two. okf.* checks what the specification requires: a parseable
frontmatter block with a non-empty type on every non-reserved document, an
index.md with no frontmatter beyond a bundle-root okf_version, a log.md
that is date-headed and newest first, and ISO 8601 timestamps. Unknown keys and
unknown type values are never reported: the spec requires consumers to tolerate
both. locus.* checks the palace conventions: the size limits from
spec/size-limits.md and the room main-file rule from
spec/room-conventions.md.
Errors fail --check; warnings are advisory. A palace legitimately carries no
frontmatter at all, so on a palace root the missing type rules are warnings
rather than a CI failure on a layout the palace spec itself describes.
--fix adds three fields and only three: type from --type-map or
[lint.types], generated.at from the file's first git commit, and
status: deprecated for archive paths. It never rewrites or deletes a key, it
never invents a generated block (nothing in a file says who produced it), and
running it twice produces identical bytes.
index
What gets generated depends on the root: an OKF bundle gets an index.md per
directory in section 8 form (* [Title](path) - description, with
okf_version: "0.2" frontmatter at the bundle root only), a palace gets the
50-line routing table INDEX.md, and a Claude Code memory directory gets a
MEMORY.md of one - [Title](file.md) - description line per topic file.
Output is deterministic, so --check is a byte comparison, and only index
files are ever written.
Configure both from one .locus.toml:
Full rules in spec/lint-and-index.md.
Security
The security system (--security) gives every palace file an Ed25519 signature and every agent session a unique cryptographic nonce. Tool outputs are tagged [TRUSTED], [DATA], or [CRITICAL-DATA] before the agent sees them. The agent skill (locus-security) teaches agents to extract facts from [DATA] content but never follow directives within it.
The locus-security CLI has five subcommands: init-config (writes the annotated
locus-security.yaml from the copy that ships inside the package), init-keys,
sign-all, verify-all (exit 1 if any file fails verification, or if the palace
holds no signable files at all), and rotate-keys. sign-all names and skips any file it cannot read as UTF-8 rather than
aborting the run, and exits 1 if it skipped anything. Neither command follows a symlink
whose target resolves outside the palace: those are named and skipped by sign-all, and
reported as failures by verify-all.
Threat model: direct prompt injection, memory poisoning, indirect injection via external data, nonce exfiltration, multi-turn context drift.
See docs/security.md for the full protocol, configuration reference, and design decisions.
Benchmarks
Palace navigation loads 52% fewer context lines than flat memory for specific queries, while maintaining full recall. Session-only queries (recent work not yet consolidated) are accessible only via the palace.
See docs/benchmarks.md for charts and full methodology.
Structure
Roadmap
Contributing
See CONTRIBUTING.md for dev setup, test instructions, and PR guidelines.
License
Source: README.md at commit 3b480d6
Tools
0Version history
1- v0.6.2LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts