hexis
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
CortHeXis
A memory for AI agents that reads itself back.
Your agents forget between sessions, and they do not fail loudly when they do: they just know less, and you blame the model. CortHeXis keeps a folder of short notes — one fact each, plain markdown you own — and puts the right ones in front of the agent at every message, in any language. Then it does the part nobody does: every hour it re-reads the whole memory and tells you what went wrong — a server no session can reach, links to notes that no longer exist, a fact corrected in one place and not the other, a project still "in progress" two months later, a key pasted into a note — and proposes the repair, which is only written once you approve it.
Recall at every turn. A hook adds the relevant notes to each message, and to every sub-agent's prompt (a sub-agent otherwise starts with no memory at all). Over MCP, agents can also search (
memory_search) and read (memory_get) on their own.Hybrid, cross-lingual search. Meaning and keywords together; a French question finds an English note. Every result carries its age and where that date comes from.
A memory that checks itself. Health score, findings with their remedy, history, daily digest to your webhook, repairs with a diff and an approval.
Measured, on your notes. A recall bench built from your own questions and sessions, with every run kept and regressions flagged — and a public bench on the demo corpus that anyone can rerun.
Yours. Apache-2.0, self-hosted, no account. The notes are files; the index is derived from them and can be rebuilt at any time.
Built by Ninabot · corthexis.com · live demo on a fictional corpus: demo.corthexis.com

Quick start
Docker with Compose 2.20 or later, ~2 GB of RAM, 4 cores.
git clone https://github.com/ninabot-ch/corthexis && cd corthexis
./setup.sh # token, your notes folder, the model licence question
docker compose up -d # → http://localhost:8420./setup.sh writes .env (a random CORTHEXIS_TOKEN, the notes folder, your uid), builds
the image and asks which embedding model to use (see Licences). Without an
argument it points at examples/agent-memory; give it your folder:
./setup.sh ~/.claude/projects/<project-slug>/memory (where Claude Code keeps its memory)
or any folder of markdown notes. Unattended: CORTHEXIS_ACCEPT_GEMMA_TERMS=1|0 ./setup.sh DIR.
Open http://localhost:8420 and paste the token (grep CORTHEXIS_TOKEN .env). The first
indexing takes a few seconds per note on a CPU; the graph fills as it goes.
Related MCP server: memory-vault
Connect your agent
MCP (any MCP client; Claude Code shown):
claude mcp add -s user --transport http corthexis http://localhost:8420/mcp \
--header "Authorization: Bearer $(sed -n 's/^CORTHEXIS_TOKEN=//p' .env)"-s user matters: a server declared in one project only is missing from every session
started elsewhere — the most common way a memory silently disappears.
Recall at every message (Claude Code hooks, standard library only, nothing to install):
python3 corthexis/hook.py install # ~/.claude/settings.json — every session
python3 corthexis/hook.py install --scope local --project-dir ~/my-project # one project
python3 corthexis/hook.py uninstall # removes only its own entriesIt installs a UserPromptSubmit hook and a PreToolUse hook on Task|Agent, reads the
token from ./.env and keeps it in ~/.config/corthexis/ (mode 600). The block it adds is
framed as data, not instructions — notes are written by agents, and a note may carry an
order. Notes already given in a session are not given again.
Without HTTP: pip install . then claude mcp add -s user corthexis -- corthexis mcp
with CORTHEXIS_DATABASE_URL and CORTHEXIS_EMBED_URLS in its environment (stdio).
Projects and levels
A memory is one project and every note is at the default level until you say otherwise; nothing above changes a standalone install. When several teams share one memory:
one notes folder = one project (
CORTHEXIS_MEMORY_PROJECT=radioon that folder's indexer); names, links and history are per project, and a project namedsharedis readable next to one's own;a note's frontmatter may carry
classification: confidential— five levels,public<team<project(default) <confidential<restricted; an unknown value isrestricted, an edit of the file never lowers a level;CORTHEXIS_RECALL_PROJECTS=radio,shared@1gives a process (the recall hook, the MCP server, the CLI) its scope: the notes ofradioup toproject, ofsharedup toteam. The scope holds at every stage of the search and for a note quoted by name; every scoped read is in the access log (note_access).
CHANGELOG 2.1.0 has the whole of it; SCHEMA.md the field.
The dashboard
Graph | notes as neurons, |
Recall | the same search as the agents', with scores and excerpts. |
Health | score 0-100 and its history, findings grouped by severity with the remedy and the notes concerned, open problems and mean time to fix. |
Repairs | relink, merge, rename, close a dormant project: each is a proposal with the full diff; approve to write (a copy of what is overwritten is kept, and a note edited in between makes the repair refuse itself). |
Bench | hit@1, hit@5, MRR on your own questions; add questions, run it, see regressions. |
Pulse | freshness, types, families, the model and servers in use, the licence. |
English and French (?lang=fr, CORTHEXIS_UI_LANG). Reading needs the token unless
CORTHEXIS_DASHBOARD_PUBLIC=1; writing always does. The port is bound to loopback: to
share it, put your own access proxy in front.
What the review checks
Each check is a failure that happened in production before it was written down:
Theme | Checks |
chain | the MCP server answers when started the way a session starts it; embedding and reranking servers up; the indexer keeps up; the index is in sync with the files |
structure | unreadable header, no description, no type, file outside the naming convention, very long notes |
graph |
|
dates | notes without a date, reconstructed dates, a whole folder rewritten at once |
drift | dormant projects still open, a description corrected but not the body, near duplicates |
security | key-shaped strings (kind and line only, never the value), text giving orders to the agent |
recall | regressions of the bench |
Notifications: CORTHEXIS_NOTIFY_WEBHOOKS (JSON, or slack+, discord+, ntfy+,
mattermost+, teams+ prefixed URLs) and/or CORTHEXIS_NOTIFY_CMD (a command fed the
message). One digest a day when the findings changed (CORTHEXIS_REVIEW_DIGEST_AT), at once
on a new critical problem. Test: docker compose exec corthexis corthexis notify-test.
From the sessions' side (is the server declared in the agent's configuration, is the hook
installed?) run corthexis review --chain on the agent's machine — systemd/ has a timer.
Profiles
Profile | Embedding | Reranker | For | Query p50 | MRR |
| EmbeddingGemma-300m Q8, CPU | — | 4 cores, 4 GB | 53 ms | 0.82 |
| same, CPU | bge-reranker-v2-m3, background only | ≥ 8 cores, ≥ 16 GB | 35 ms | 0.82 (0.84 reranked) |
| same, GPU | Qwen3-Reranker-0.6B, every search | a GPU with ≥ 4 GB | 13 ms | 0.88 |
Figures: memory bench of 03.10.2026 (300 questions in French, English and German over a real
corpus, hybrid search; GPU pass on an Intel Arc Pro B60). On the same bench the 1.x model,
MiniLM, scored 0.55 and the MIT fallback, multilingual-e5-base, 0.74.
docker compose exec corthexis corthexis profile recommends one for the machine.
# GPU, Intel Arc (SYCL) or NVIDIA (CUDA, needs the NVIDIA Container Toolkit)
echo CORTHEXIS_MEMORY_PROFILE=gpu >> .env
docker compose -f docker-compose.yml -f docker/compose.gpu-intel.yml --profile rerank up -d
docker compose -f docker-compose.yml -f docker/compose.gpu-nvidia.yml --profile rerank up -dApple GPU: Docker has no Metal — run docker/embed/run.sh natively (LLAMA_SERVER=llama-server)
and set CORTHEXIS_EMBED_URLS. Several servers of the same model can be listed (GPU then CPU):
a server that fails is skipped for 30 s, and a server answering another dimension is refused
instead of polluting the index. Changing the embedding model builds a new index generation
next to the active one; searches use the old one (keywords only while the model differs) until
the new one is complete.
Docker hosts whose address pools are exhausted: add -f docker/compose.bridge.yml.
Licences
The code is Apache-2.0 (LICENSE). The dashboard ships d3 (ISC) and marked (MIT), see NOTICE. No model weights are shipped: they are downloaded on first run, pinned to a repository commit and checked against their SHA-256.
The default embedding model, EmbeddingGemma-300m (Google), is distributed under the
Gemma Terms of Use, which are not an open-source licence
(use restrictions apply). ./setup.sh shows their summary and asks; the decision is recorded
with the version of the terms, the date and who answered (licence.json in the models
volume). If you decline, or do not answer, CortHeXis runs multilingual-e5-base (MIT)
instead, with no loss of function — recall is a bit lower. Change your mind later:
docker compose run --rm corthexis-embed-fetch python /opt/corthexis/models.py setup --accept
docker compose restart corthexis-embed corthexis # the index is rebuilt with the new modelA machine without internet access: copy the GGUF file into the models volume (gguf/); it
is used if its hash matches. Mirror: CORTHEXIS_MODEL_BASE_URL.
Upgrading from CortHeXis 1.x
1.x kept a SQLite index next to the notes (MiniLM, CORTHEXIS_NOTES_DIR, CORTHEXIS_DB).
corthexis migrate carries it over without loss — archive first, every note and every date
checked before the switch, the old index left untouched for a rollback. See
docs/MIGRATION.md.
What is where
Everything shown on corthexis.com and on the demo runs from this repository.
This repository | SOKKAN 3.x | |
Engine: store, hybrid search, reranker, dates and provenance | ✓ | ✓ (same code) |
Recall at every turn and in sub-agents (Claude Code hook) | ✓ | ✓ in every session it starts |
MCP | ✓ | ✓ |
Review: score, findings, history, digest, repairs with approval | ✓ | ✓ CortHeXis tab |
Dashboard: graph, recall, health, bench | ✓ | ✓ CortHeXis tab |
Recall bench, gated profile/model switch | ✓ | ✓ + Magnitude memory card |
Migration from 1.x / SOKKAN 2.x | ✓ | ✓ automatic on upgrade |
Projects (one folder = one project, scoped recall) and five classification levels with audited recall | ✓ | ✓ projects, teams and clearances from SSO groups |
Agent cockpit: parallel sessions, approvals, board, terminals | — | ✓ |
CortHeXis alone if you want a memory for the agents you already run (Claude Code or
anything that speaks MCP). SOKKAN if you also want the cockpit that
runs those agents: its memory tab is CortHeXis, installed and wired for you, and its
projects, teams and clearances drive the scope of every recall. The
SOKKAN_* variable names are read as a fallback of the CORTHEXIS_* ones.
What we run ourselves that is not in this repository: our notes (see About the examples) and the 300 questions of the reference bench written on them (see bench/README.md).
Configuration
Every setting is a CORTHEXIS_* variable; .env.example lists the ones of the
Docker install, docs/ENGINE.md all of them (store, search, recall, review
thresholds, profiles, models). The command line (corthexis --help) is in the image:
docker compose exec corthexis corthexis status
docker compose exec corthexis corthexis search "how do we deploy?"
docker compose exec corthexis corthexis get deploy-runbook
docker compose exec corthexis corthexis review | head
docker compose exec corthexis corthexis eval add "how do we deploy?" deploy-runbookAbout the examples
examples/agent-memory/ holds eight engineering notes written for this repository — the
HTTP 202 trap, the browser profile lock, the YAML colon that silently kills recall — useful
to anyone and specific to no one. examples/mirabeau-conseil/ is the corpus of the public
demo: 38 notes of a fictional consulting firm, in French, with one broken link left on
purpose so that the review has something real to find.
Neither is a sample of the corpus CortHeXis was built on. That one is private — months of notes written while actually running a company, infrastructure and commercial detail in nearly every file — and a redacted copy would leak by its shape alone. The engine is real and it is all here; the proof that matters is what it does with your notes.
Development
python3 -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/ruff check corthexis tests && .venv/bin/pytest -q
# the store, recall and dashboard tests need a Postgres with pgvector:
docker run -d --name cx-test-pg -p 127.0.0.1:55432:5432 -e POSTGRES_USER=cx \
-e POSTGRES_PASSWORD=test pgvector/pgvector:pg16
CORTHEXIS_TEST_PG_DSN=postgresql://cx:test@127.0.0.1:55432/postgres .venv/bin/pytest -qSCHEMA.md — the note format · docs/ENGINE.md — the engine · docs/DEMO.md — a public read-only showcase · bench/README.md — the recall benches · CHANGELOG.md
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Hosted MCP memory for coding agents: persistent across sessions, editable markdown, team sharing.
MCP-native notes and memory for ChatGPT, Claude, and other AI tools.
Cross-session memory for AI agents with a Source Receipt for every memory, over MCP.
Team memory for AI coding agents and code reviews, reviewed by humans and served over MCP.
Related MCP Servers
- AlicenseAqualityBmaintenanceMarkdown-first long-term memory for AI coding agents, enabling hybrid search over local files via MCP tools.924Apache 2.0
- AlicenseAqualityBmaintenanceProvides cross-session persistent memory for coding agents via MCP tools to store, retrieve, and manage notes with hybrid keyword/semantic search and automatic deduplication.8298 npmMIT
- AlicenseAqualityBmaintenanceEnables coding agents to store, search, and retrieve long-term memory as plain Markdown files with a disposable SQLite index, including note management, decision/bug tracking, and codebase symbol lookup via MCP.8MIT
- AlicenseNot gradedqualityBmaintenanceGives coding agents a persistent memory by searching a local, read-only index of existing markdown and letting them write findings back as notes that the next session can retrieve. It serves ranked, context-sized results over MCP, injects standing conventions at session start, and keeps data on your machine with secret redaction and archive-only deletion.284 PyPIMIT