Persistent memory for AI thinking partnerships: hybrid search and a temporal knowledge graph.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Persistent memory for AI thinking partnerships. A knowledge graph you can argue with, search that spans every session you have ever had, and a record of not just what you decided but what you rejected.
MCP server for Claude Code. Python, local, no cloud.
Every conversation with an AI starts from nothing. You explain the same context, re-derive the same conclusions, and rediscover decisions you already made β and the reasoning that produced them is gone the moment the window scrolls.
Chat history does not fix this. History is a transcript; what you need is structure: which ideas connect, which beliefs you have since abandoned, which alternatives you considered and dropped, and why.
RAWThink keeps that structure in three layers, in files you own.
Hybrid semantic search across every session and note β BGE-M3 dense embeddings and BM25 sparse vectors, fused with RRF. Ask "what did I think about free will?" and get the passages, not a keyword match.
A temporal knowledge graph where observations carry dates and status. Beliefs can be marked invalidated and linked to what replaced them, so the archive remembers not only what you think but what you used to think.
Session lifecycle β a close command that exports the conversation, extracts entities into the graph, and writes a handoff the next session loads automatically.
Activation decay β unused knowledge fades on a ~23-day half-life, accessed knowledge stays warm. Old material is still there; it just stops crowding out what you are working on now.
QDRANT_PATH for embedded modebge-m3: ollama pull bge-m3rawthink-install writes the vault structure, CLAUDE.md,
THINKING_DIRECTIVES.md, SETUP.md, docker-compose.yml and the /rtclose
command. Use rawthink-install --vault ~/my-vault for a different location.
Nine checks with a fix line for each failure: vault, graph schema, BM25 state format, Qdrant, index coverage, vector dimension, Ollama, MCP registration.
The index coverage check is the one worth knowing about. Indexing can stop partway and leave a collection that looks healthy β it exists, it has points, queries return results. They are results from part of the vault, and nothing else tells you that.
1.5.0 changed the graph schema and 2.0.0 changes the sparse index. Migrate the graph before writing anything:
That is a dry run β it prints what would change and writes nothing. Read the
report, then re-run with --apply. A timestamped backup is taken first.
Then re-encode the search index, because BM25 term IDs changed:
A plain reindex skips unchanged chunks and will leave the old encoding in
place. rawthink-doctor tells you if this is still pending.
See CHANGELOG.md for what changed and why.
Close with /rtclose. It exports the conversation, extracts what is worth
keeping into the graph, and leaves a handoff for next time β which the next
session loads on its own.
This is the part worth understanding, because it is what keeps the graph queryable over years rather than months.
entityType answers what role does this node play. Closed list of ten:
| type | for |
|---|---|
decision | a choice made, with alternatives rejected |
concept | an idea, theory, model, analogy |
finding | something discovered or measured β a bug, a result, an audit |
rule | a durable constraint or pattern to follow |
open-question | unresolved, waiting on evidence |
artifact | a project, tool, document, feature, source |
insight | a realisation that changed how something is seen |
task | a unit of intended work |
event | something that happened at a point in time |
thing | a person, object or substance named directly |
domain answers what subject is it about: software, music, history,
philosophy, health, writing, neuro, finance, personal, galaxy.
Keeping these apart is not tidiness. When one field carries both, the type list
grows by one entry per subject β a real vault reached 46 types this way, with
saglik-bulgusu, teknik-karar and bug-pattern sitting next to karar. At
that point nothing can be filtered, because no two entries agree on what a type
means.
Canonical vocabulary: supports, contradicts, evolved_into, depends_on,
exemplifies, part_of, caused_by, enables, supersedes, related_to,
investigates, informs, uses.
Close synonyms fold automatically β connected_to β related_to, aspect_of β
part_of. Anything else raises.
An earlier version accepted unknown types with a warning. Nothing acted on the warning and 56 one-off types accumulated. A warning that lets the write through is a decision to allow it, written in the voice of disapproval.
assertion, hypothesis, speculation β or unknown when unstated.
unknown is deliberate. If a session did not establish something, recording it
as an assertion promotes a claim nobody made. The migration follows the same
rule: 144 entities with no epistemic field became unknown, not assertion.
The old observation is marked invalidated, dated, and linked to what replaced it. Delete tools exist but sit outside the default agent-facing profiles: an archive that forgets its own reversals cannot answer the question it was kept for.
record_decision stores decided, because, and rejected as separately
queryable observations. The rejected alternatives are the part worth keeping β
what was chosen stays readable in the code forever, what was considered and
dropped exists nowhere else. That is the question that gets asked six months
later.
Tool definitions sit in the context window from the first token of a session, so the surface is a standing cost rather than a per-call one. Profiles load only what a given step needs.
A tool outside the active profile stays an ordinary function β reachable from the CLI and from tests. It simply is not in front of an agent that will not call it.
| tool | what it does |
|---|---|
search_thoughts | Hybrid search. mode="overview" gives one line per session |
get_session | Full content of a session by ID |
store_thought | Save a quick note as a qnote |
reindex | Re-index the vault into Qdrant |
| tool | what it does |
|---|---|
search_nodes | Bounded. Filters by domain and entity_type; reports total_matched and truncated |
open_nodes | Specific entities with their relations |
read_graph | Whole graph, paginated, with a summary mode |
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/rawthink)<a href="https://allmcps.com/mcp/rawthink"><img src="https://allmcps.com/api/badge/rawthink?style=directory" alt="RAWThink on AllMCPs" /></a>