mori-briefLABSCO SUMMARY
Memory that knows where it applies.
A memory that was true in another repository is worse than no memory — it sends an agent confidently after an API that does not exist here. Scoping retrieval by provenance, and putting a human between a proposal and canon, is what turns a shared store into something you can leave on.
What it is
A self-hosted memory server your coding agents write into and read from. What separates it from a vector store with a retrieval prompt is the gate: curation decides what is kept, and provenance decides where it is valid, so canon bound to one repository is withheld when you are working in another. Session events arrive through agent lifecycle hooks, get distilled into structured memories, and are surfaced at the start of the next session.
What you get
- Session grounding —
/briefloads shared context at session start, and/brief --post-compactis a lightweight delta that surfaces only what changed since your last brief - The dream pipeline —
/dreamdistils session events into structured memories, running at high recall because nothing it produces reaches canon without a human promoting it - Search and browse —
/pensieveover the shared store, with SQLite FTS5 or Postgres full-text behind it, plus a web memory browser at the server root - Ingestion and review —
/ingesttakes PDFs, images, git and transcripts; proposals land in a review queue and/reviewshows source, diff, approve and reject before anything becomes canonical - Governance — capability-scoped API keys with read, write and dreamer roles, versioning, trusted dreamers, rollback and attribution, with every write landing a
write_auditrow in the same transaction - Across machines —
/natsfor real-time cross-device awareness,/msgto send tasks and questions between agents,/updateto push slash commands to every device - Project tracking —
/reqkeeps a lightweight checklist that shows up in the brief;/consultasks for strategic review with your standards injected
Requirements
Your own deployment — Railway, Render, Fly or Cloud Run, or any stateless host with managed Postgres; a container build with podman or docker is one command. MORI_API_KEY holds your model provider key in direct mode, with MORI_MODEL, MORI_DREAM_MODEL and MORI_FAST_MODEL choosing which model does the advising, the distillation and the fast checks. Set MORI_API_KEYS to give each client a named key — without it the server starts in open mode, which is fine on a private network and not otherwise. MORI_BRIEF_SCOPE defaults to safe, which is the provenance-routed brief; all is the legacy behaviour with no scoping. MORI_TRUSTED_DREAMERS names the hostnames allowed to promote memories. In Claude Code the plugin wires the MCP connection, hooks and skills in one step. AGPL-3.0, with commercial licences available.
Setup effort
Build from source — git clone https://github.com/fjwood69/mori.git
USE CASES
Starting a session already knowing what was decided
The brief loads the shared context up front, so nobody re-explains last week's decisions to a fresh agent.
Not losing what a session learned at compaction
The pre-compaction hook fires a synchronous distillation before the window is compressed, and the post-compaction delta re-grounds the session afterwards.
Keeping several agents on one codebase in step
Every instance writes its events to the same server, so each one opens a session seeing what the others changed.
Deciding what is worth remembering
The pipeline over-produces candidates on purpose; the review queue is where a trusted dreamer promotes the load-bearing ones and drops the rest.
Finding the decision behind the code
Search the store for the topic and read the memory with its attribution and version history.
Bringing outside material in
Ingest PDFs, transcripts or git history, and let the proposals go through the same sign-off as everything else.
21 tools
Listed in project docs. Your client may show a different list.
mori-dream_runmori-consult_advisormori-consult_statusmori-memory_searchmori-memory_reqmori-memory_writemori-nats_pubmori-nats_submori-nats_pingmori-msg_sendmori-msg_recvmori-msg_threadmori-ingestmori-ingest_contentmori-ingest_statusmori-ingest_previewmori-key_generatemori-memory_export_allmori-memory_importmori-memory_listBEFORE YOU INSTALL
What to know first
Tools you get
21 tools named in the project's documentation.
Requires
- A model provider key (Novita, DeepInfra, OpenAI or any OpenAI-compatible endpoint), set as MORI_API_KEY in deploy/homelab/.env on your server
- A client key from MORI_API_KEYS on your server, sent by the client as X-Api-Key (not needed if the server runs in open mode)
INSTALLATION
Connect your client
Server setup
git clone https://github.com/fjwood69/mori.git
cd mori
cp deploy/homelab/.env.example deploy/homelab/.envEdit deploy/homelab/.env: set MORI_API_KEY to your model provider's key and MORI_BASE_URL to the provider's OpenAI-compatible endpoint
docker compose -f deploy/homelab/docker-compose.yml up -dMCP Clients
Claude Code
Inside Claude Code, add the Mori marketplace and install the plugin. On enable it asks for your Mori server URL (e.g. http://localhost:8968) and your named API key (name:secret; leave it blank if the server is unauthenticated), then reload:
/plugin marketplace add fjwood69/mori
/plugin install mori@mori
/reload-pluginsAntigravity
{
"mcpServers": {
"mori": {
"type": "http",
"serverUrl": "http://<YOUR_SERVER>:8968/mcp",
"headers": {
"X-Api-Key": "<YOUR_API_KEY>"
}
}
}
}Cursor
From the mori folder you cloned above, run:
./scripts/install-mori-cursor-plugin.sh --url "http://<YOUR_SERVER>:8968" --api-key "<YOUR_API_KEY>" --client "$(hostname)" --forceCline
From the mori folder you cloned above, run:
./scripts/install-mori-cline.sh