Mnemolith

io.github.anishchugh05由 GitHub 账号 anishchugh05 发布v0.3.4更新于 Nov 5, 2026

Shared local memory for AI coding tools that stays true to your code.

已验证STDIO仅桌面知识与记忆开发者工具

概览

AI 生成的概览

面向 AI 编程工具的本地共享记忆:保存项目事实、按语义检索,并在相关代码变动后自动将记忆标记为过期。

可以做什么
  • 保存可长期沿用的项目事实,可关联其依赖的文件,并合并近乎重复的内容
  • 按语义检索项目记忆,当前有效的记忆排在前面,已退役的列在其后
  • 查看某条记忆的来源与完整历史,将其标记为过时、替换或确认仍然有效
  • 检查关联文件是否变动,并列出和裁决可能互相矛盾的记忆对
  • 把当前记忆写入 AGENTS.md 或 CLAUDE.md 的托管段落,随代码一起提交
适用场景
适合在同一个代码库中跨多个会话、多种 AI 工具工作时使用,让约定、环境配置坑点和过往决策延续下来且不会悄悄过期。也适合希望这些事实出现在 AGENTS.md 或 CLAUDE.md 中、供未安装该工具的同事和工具查看的团队。
运行要求
以 PyPI 包形式通过 stdio 在本机运行(uvx、pipx 或 pip,需 Python 3.10+)。初始化会在后台启动引擎并占用 7380 端口(可用 MNEMOLITH_PORT 修改),需要 Java 11+,缺失时会下载一份私有副本。还会一次性下载约 90 MB 的嵌入模型,记忆保存在本地目录。未声明需要 API 密钥或账号。
安装前请注意
记忆写入本地存储,并可同步进 AGENTS.md 或 CLAUDE.md,从而改动仓库中的文件。README 的快速开始会把远程安装脚本直接交给 shell 执行,初始化还会修改所检测到的 AI 工具的配置。项目自述为早期 v1,并列出若干引擎限制。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Mnemolith,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[Mnemolith: memory that stays true to your code]

Mnemolith

Shared memory for AI coding tools that stays true to your code.

[Mnemolith demo: a memory goes stale when docker-compose.yml changes, and the user records what is true now]

Mnemolith (NEE-mo-lith): "memory stone." What your AI learns, carved where every tool can read it. (Why the name)

Formerly Aether Cache. If you installed aether-cache, see Moving from Aether Cache: your memories come with you.

Website · PyPI

Claude Code, Cursor, and other AI tools each forget your project between sessions, and when they do remember things, nothing checks whether those memories are still correct. Mnemolith gives every tool one shared, local memory, and keeps it honest:

  • Memories go stale when the code changes. Each memory is linked to the files it's about, with a snapshot of their git content hash. When docker-compose.yml changes, the memory about it is retired automatically instead of being fed to your AI forever.
  • Contradictions get replaced, not hoarded. "We migrated to MySQL" retires "we use Postgres" instead of sitting next to it and confusing the model. Near-identical repeats are merged.
  • Every memory can explain itself. Which tool and session saved it, which file versions it was based on, and every change since: created, seen again, went stale, confirmed, replaced.
  • It works with the files you already use. Current memories sync into a managed section of AGENTS.md and CLAUDE.md, so they're committed, reviewed in PRs, and visible to teammates who don't run Mnemolith.

It runs entirely on your machine, on top of a database engine I wrote from scratch.

Not a Redis clone

Mnemolith started as a from-scratch rebuild of Redis in Java, then kept going. Every layer here is written from scratch, and each one does something the layer beneath it can't:

LayerWhat it adds
MCP serverClaude Code, Cursor, and any MCP tool share one memory
Git awarenessMemories retire themselves when the code they describe changes
Memory layerStatus, provenance, full history, duplicate merging, and conflict review, inside the engine
HNSW vector indexSemantic search: 99.4% recall at 0.84 ms on 100K vectors, 22× faster than exact search
Redis-compatible engineRESP protocol, 50+ commands, replication, transactions, and crash-safe persistence (0 acknowledged writes lost across 1,039,890 writes and 8 kill -9 crashes), at 88–93% of real Redis's throughput

The bottom layer alone is a working Redis: redis-cli, redis-benchmark, and redis-py talk to it unchanged. The memory layer, git awareness, and MCP server are things Redis doesn't do at all.

Claude Code ─┐                       ┌─────────────────────────────────────────────┐Cursor ──────┼─ MCP ─► mnemolith ─┼─ RESP ─► Java engine (Main.java)            │other tools ─┘   (Python: embeddings,│          memories, HNSW vector index,       │                  git hashing, sync) │          history, append-only file on disk  │                                     └─────────────────────────────────────────────┘

Does it help?

We tested it. Claude Code did 7 tasks in a sample codebase, 3 times each, in three setups. Every task needs something only a teammate would know: a past decision, who owns which code, a promise to a partner, a business rule. Two need a fact mentioned in an earlier session. An automatic check grades every run.

SetupTasks done rightAcross sessionsAvg cost per task
No memory43% (9 of 21)3 of 6$0.12
CLAUDE.md notes, same facts90% (19 of 21)4 of 6$0.12
Mnemolith, same facts100% (21 of 21)6 of 6$0.14

Without memory, Claude edited another team's code, changed a frozen partner API and skipped refund approval, every time. A CLAUDE.md file held the same facts but missed a database address mentioned in an earlier session 2 times out of 3; Mnemolith saved it on its own and used it next session. The cost is about 15% more per task than a notes file, at API prices, because recalling and keeping memories up to date takes a few extra turns. 63 runs on Claude Opus 5.5, November 2026. In an earlier round where every fact could also be found in the code, all three setups tied.

Run it yourself (uses your own Claude Code plan; see eval/ for what each task checks):

sh
cd eval && python3 run.py --repeat 3 && python3 report.py

What it looks like

The dashboard (mnemolith ui): memories whose files changed wait for a decision, with the file versions side by side.

[The Mnemolith dashboard showing stale memories and a possible conflict]

And from your AI tool's side, a memory linked to a file, the file changes, and the next lookup catches it:

> remember("The database runs Postgres via docker compose", files=["docker-compose.yml"])Saved as m1.
        ... someone edits docker-compose.yml ...
> recall("database setup")These memories were just retired because files they depend on changed. If one is still true,call confirm_memory; if it's wrong, save the corrected fact with remember:[m1] "The database runs Postgres via docker compose" is now marked outdated: docker-compose.yml changed.
> confirm_memory("m1")        # still true, so re-link it to the new version of the fileConfirmed m1; it's active again and linked to the current file versions.
> explain_memory("m1")m1: "The database runs Postgres via docker compose"status: active, project: demosaved by: claude-code (session eea54b5c)linked files: docker-compose.yml@02ea346...history:  19:16  created: by claude-code (session eea54b5c), linked to docker-compose.yml@87da641...  19:16  active -> stale: docker-compose.yml changed since this was saved  19:16  re-linked: to docker-compose.yml@02ea346... (confirmed still true)  19:16  stale -> active: confirmed still true

A newer fact replacing an older one:

> remember("The API timeout was raised to 60 seconds")Saved as m3.Related existing memories:[m1] (similarity 0.58) The API timeout is 30 secondsIf m3 makes any of these no longer true, call replace_memory(old_id, "m3"). Otherwise do nothing.
> replace_memory("m1", "m3")m1 retired; m3 replaces it.

Quick start

One line installs everything and runs setup. On macOS or Linux:

sh
curl -fsSL https://mnemolith.dev/install.sh | sh

On Windows (PowerShell):

powershell
powershell -ExecutionPolicy ByPass -c "irm https://mnemolith.dev/install.ps1 | iex"

The installer (install.sh, install.ps1) gets uv if you don't have it (uv brings Python), installs Mnemolith, and runs mnemolith setup. Prefer your own tools? Any of these works, followed by mnemolith setup:

sh
uv tool install mnemolithpipx install mnemolithpip install mnemolith        # Python 3.10+

setup starts the engine in the background, downloads the embedding model once (about 90 MB), and connects every supported AI tool it finds on your machine: Claude Code, Claude Desktop, Cursor, and Codex. That's it. Open your AI tool in any git repo and try:

Remember that our tests need DOCKER_HOST set. It depends on docker-compose.yml.

Then start a new session and ask how to run the tests.

Only use Claude Code? You can install Mnemolith as a plugin instead, with no setup step (needs uv):

/plugin marketplace add anishchugh05/mnemolith/plugin install mnemolith@mnemolith

The plugin (plugin/) runs the same server and adds a /mnemolith:dashboard command. Use the plugin or setup, not both, or Claude sees the tools twice.

The engine runs on Java 11+. If you have it, it's used. If you don't, Mnemolith downloads a private copy (about 50 MB) into ~/.mnemolith/java, checks it against its published checksum, and uses it only for Mnemolith; nothing is installed system-wide, and mnemolith uninstall removes it.

Already keep notes for your AI in CLAUDE.md, AGENTS.md, or Cursor rules? Run mnemolith import in the repo (or use Import notes in the dashboard) to turn them into memories, linked to the files they mention.

Memories are kept per project (the git repo's folder name), so projects never mix. Everything stays on your machine: the engine only accepts connections from it, and your memories live in ~/.mnemolith.

CommandWhat it does
mnemolith setupOne-time setup: engine, model, and AI tools
mnemolith addAdds the repo you're in (or a path) so the dashboard can check its files; the dashboard can also find and add repos for you
mnemolith uiOpens the dashboard: see what your AI remembers, and confirm, fix or retire memories whose files changed
mnemolith importTurns the notes in CLAUDE.md, AGENTS.md, and Cursor rules into memories; shows them first and asks
mnemolith removeRemoves a project (default: the one you're in), like Remove project in the dashboard: its memories are retired, not deleted
mnemolith exportSaves memories, with their linked files and history, to a JSON file (-p for one project)
mnemolith statusIs it running, and what's in this project's memory
mnemolith doctorChecks everything and tells you how to fix what's wrong
mnemolith list / recall "query" / explain m1Look at memories from the terminal
mnemolith syncWrites current memories into AGENTS.md / CLAUDE.md
mnemolith mender on / offTurns Mender on or off; mnemolith mend drafts fixes for this repo now
mnemolith connect cursorConnects one tool: claude-code, claude-desktop, cursor or codex (--print shows config for any other MCP tool)
mnemolith start / stopRuns or stops the engine (it also starts on its own when a tool needs it)
mnemolith uninstallDisconnects your AI tools, stops the engine, and asks before deleting memories

If mnemolith isn't found after installing, run uv tool update-shell and open a new terminal. Port 7380 taken? Set MNEMOLITH_PORT and run setup again. To uninstall: mnemolith uninstall, then uv tool uninstall mnemolith.

Mender: drafted fixes for stale memories

Flagging a stale memory is half the job: someone still has to work out what's true now and type it in. Mender, an optional part of Mnemolith, drafts that for you. mnemolith setup asks whether to turn it on; mnemolith mender on (or Settings in the dashboard) changes it later. It needs no API key and installs nothing extra.

  • Simple changes are drafted by plain rules, on your machine. Mender compares the version of each file the memory was saved against (from git) with the file now. image: postgres:16 became image: mysql:8, so "The database is Postgres (postgres:16 image)" becomes "The database is MySQL (mysql:8 image)". It handles version bumps, moved files (the path is updated, not treated as a deletion), and changes that don't touch the memory at all (only a comment, or lines it doesn't mention), which it suggests confirming as still true.
  • Everything else is drafted by the AI tool you already use. With Mender on, Claude Code, Cursor, and Codex get two more tools: list_stale shows each stale memory with what changed in its files, and propose_fix submits a draft. Drafts are checked against the code: quotes in the reason and new numbers or versions must actually be in the files, or the draft is marked Unverified.
  • You approve every change in the dashboard, where each draft sits under the diff it came from, with what it's based on. Approve it, edit it, or dismiss it. Approving is refused if the files changed again after the draft was made (it would be based on old code), and if the memory was already settled some other way.

Changed your mind? Approving shows an Undo, and any fix can be reverted later from the memory's details in the dashboard (Revert this fix) or with mnemolith mender revert m7: the old memory comes back for you to decide, and Mender won't suggest the same fix again unless the files change. mnemolith status and your AI tool tell you when fixes are waiting.

mnemolith mend drafts fixes for the repo you're in and lists them.

Moving from Aether Cache

Mnemolith used to be called Aether Cache. If you installed aether-cache, run the installer above. It installs Mnemolith, removes aether-cache, moves your memories from ~/.aether-cache to ~/.mnemolith, and reconnects your AI tools. Nothing is lost, and memories synced into CLAUDE.md / AGENTS.md are picked up where they are.

Installed some other way? Install mnemolith the same way, run mnemolith setup, then remove aether-cache (uv tool uninstall aether-cache, pipx uninstall aether-cache, or pip uninstall aether-cache).

Tools the AI can call

ToolWhat it does
remember(fact, files?, replaces?)Saves a durable fact, optionally linked to files. Merges near-identical repeats and shows related memories so the AI can decide whether the new fact replaces one; replaces="m42" saves it and retires m42 in one call.
recall(query, limit?)Searches the project's memories by meaning. Checks linked files first, so it never returns a memory whose code changed underneath it.
explain_memory(id)Where a memory came from and its full history.
replace_memory(old, new)Retires an older memory that a newer one makes untrue.
mark_outdated(id, reason)Retires a memory that turned out to be wrong.
confirm_memory(id)Brings back a memory that's still true after its files changed, re-linked to the current versions.
check_stale()Runs the file check on demand.
list_conflicts() / resolve_conflict(...)Reviews pairs of very similar memories that may contradict each other.
sync_to_files()Writes current memories into AGENTS.md / CLAUDE.md (also: mnemolith sync).
list_stale()With Mender on: the stale memories, what changed in their files, and which already have a draft.
propose_fix(id, new_text?, reason?, still_true?, files?)With Mender on: drafts a fix for the user to approve in the dashboard. Checked against the code before it's shown.

Design decisions, and what the measurements said

Similarity can't detect contradictions, so the AI judges

The first version flagged a new memory as a possible contradiction when it was similar to an existing one. Calibrating with real all-MiniLM-L6-v2 embeddings showed that can't work:

PairKindSimilarity
"we use Postgres" / "the database is Postgres"duplicate0.73
"tests need DOCKER_HOST set" / "you have to set DOCKER_HOST before running tests"duplicate0.92
"we use Postgres" / "we migrated to MySQL"contradiction0.30
"API timeout is 30 seconds" / "API timeout is 60 seconds"contradiction0.94
"tests need DOCKER_HOST set" / "integration tests need a running Redis"related, both true0.34

Duplicates scored 0.73 to 0.92 and contradictions 0.30 to 0.94, so no threshold separates them. A threshold low enough to merge real duplicates would silently merge "timeout is 30s" with "timeout is 60s", the worst bug this product could have. So the engine only auto-merges near-identical text (similarity ≥ 0.97). For everything else, embeddings find the related memories and the AI, which already understands the sentences, decides whether one replaces another.

Staleness compares file contents, not commits

Each linked file is stored as path@<git blob hash>, computed with git hash-object. Comparing contents rather than commit ids catches uncommitted edits, ignores commits that didn't touch the file, and needs no git hooks: recall re-hashes the handful of linked files before every search.

Memories never mutate silently

Every change is a logged event with a timestamp and a reason. The engine logs each memory with the id and timestamp it assigned, so replaying the log after a restart rebuilds the exact same memories and histories, down to the millisecond, instead of minting new ones.

The engine underneath

A Redis-compatible server written from scratch in Java. It speaks RESP, so redis-cli, redis-benchmark, and redis-py work with it unchanged. The core was built by completing every stage and extension of the CodeCrafters "Build Your Own Redis" challenge; the vector index, persistence hardening, and the memory layer are my own additions.

[progress-banner]

Throughput vs. official Redis

redis-benchmark -t set,get, 100K requests, 50 parallel clients, 3-byte values, same machine:

MnemolithRedis 8.10.2Mnemolith as % of Redis
SET205.8K ops/sec233.6K ops/sec88%
GET225.7K ops/sec242.7K ops/sec93%
p50 latency0.119 ms0.111 ms
p99 latency (SET / GET)0.375 / 0.231 ms0.359 / 0.159 ms
max latency (SET)19.7 ms1.3 msJVM GC / JIT pauses

Typical latency is on par with Redis. The gap is in worst-case latency, from JVM garbage collection and JIT warm-up, which Redis (written in C) doesn't have.

HNSW vector search vs. exact search

100,000 AG News headlines embedded with all-MiniLM-L6-v2 (384 dimensions, cosine similarity), 500 held-out queries, k = 10. Recall is measured against exact brute-force search on the same data.

ModeRecall@10p50 latencyp99 latency
Exact (brute force)1.00018.58 ms20.52 ms
HNSW, ef=100.9050.49 ms1.38 ms
HNSW, ef=200.9510.52 ms0.73 ms
HNSW, ef=500.9850.66 ms0.89 ms
HNSW, ef=1000.9940.84 ms1.41 ms
HNSW, ef=2000.9981.24 ms2.19 ms

At ef=100, HNSW returns 99.4% of the true top-10 about 22× faster than exact search. Building the index for 100K vectors took 136 seconds (M=16, M0=32, efConstruction=200). Latencies are measured from the Python client, so they include network and client overhead. Full setup and raw numbers: results.json.

How it works: each vector links to its nearest neighbors in a layered graph. A search starts on a sparse top layer of long-range links, hops greedily toward the query, drops down a layer at a time, and finishes with a best-first search on the bottom layer that keeps the ef best candidates. Neighbor selection uses the diversity heuristic from the HNSW paper (prefer neighbors in different directions over near-duplicates), which is what keeps recall high.

Filtered search: HNSW doesn't know about memory status, so searches over-fetch candidates, drop the ones that don't match (stale or superseded), widen the search if too few survive, and fall back to an exact scan if needed. In a test with 2,000 memories where only 2% were active, filtered searches returned exactly the correct top 10 on 30/30 queries. The catch: at that selectivity, the exact fallback runs most of the time, which is the known weak spot of post-filtering on graph indexes.

Crash safety

Every write goes to an append-only file (AOF) that is replayed on startup.

kill -9 crash test (crash_test.py): a client writes as fast as it can, the server is killed at a random moment, restarted, and every write the server acknowledged is checked.

fsync policyCrashesAcknowledged writesLost
everysec5757,2950
always3282,5950

Recovery took 0.6 seconds per restart, replaying up to ~185K writes.

Torn writes: a machine crash can cut the last write off halfway. The first version refused to start on such a file; now replay stops at the last complete command, trims the partial one, and starts normally with all earlier data intact.

Cost of each fsync policy (SET throughput, 50 clients):

PolicyThroughputp50 latency
always (sync every write)42.9K/sec1.159 ms
everysec (sync once a second)113.9K/sec0.103 ms
no (let the OS decide)118.8K/sec0.103 ms

everysec is 2.7× faster than always and within 4% of no, which is why it's the sensible default. On macOS, fsync doesn't force the SSD's own cache to flush, so always looks cheaper here than it would on a Linux server.

Full command list

  • Memory:
    • MEM.ADD, MEM.GET, MEM.SEARCH (with STATUS filter), MEM.STATUS, MEM.WHY, MEM.LIST
    • MEM.FILES, MEM.SEEN, MEM.CONFLICTS, MEM.RESOLVE
  • Vectors: VADD, VSEARCH (HNSW, tunable EF, EXACT mode)
  • Strings: GET, SET (EX / PX), INCR, STRLEN, TYPE, KEYS *
  • Lists: RPUSH, LPUSH, LRANGE, LLEN, LPOP, blocking BLPOP
  • Streams: XADD (explicit, partial, and auto IDs), XRANGE, XREAD (with BLOCK and $)
  • Sorted sets: ZADD, ZRANK, ZRANGE, ZCARD, ZSCORE, ZREM
  • Bitmaps: SETBIT, GETBIT, BITCOUNT, BITOP AND / OR (binary-safe strings)
  • Geospatial: GEOADD, GEOPOS, GEODIST, GEOSEARCH ... FROMLONLAT ... BYRADIUS
  • Transactions: MULTI, EXEC, DISCARD, WATCH, UNWATCH (optimistic locking via per-key write versions)
  • Pub/Sub: SUBSCRIBE, UNSUBSCRIBE, PUBLISH
  • Replication:
    • Master–replica handshake (PING, REPLCONF, PSYNC) and command propagation
    • REPLCONF GETACK offset tracking and WAIT
  • Persistence: RDB loading; AOF with a manifest, appendfsync always / everysec / no, and torn-write recovery
  • Auth: AUTH, ACL WHOAMI / GETUSER / SETUSER (SHA-256 password hashes)

Running the engine on its own

sh
java src/main/java/Main.java                                   # port 6379java src/main/java/Main.java --bind 127.0.0.1                  # accept connections from this machine onlyjava src/main/java/Main.java --port 6380 --replicaof "localhost 6379"java src/main/java/Main.java --dir /tmp/data --appendonly yes --appendfsync everysec

Reproducing the benchmarks

Each benchmark runs against the engine you've started:

sh
redis-benchmark -p 6379 -t set,get                 # throughput; also run against redis-server to comparepython vector_bench.py                             # HNSW recall and latency (start the engine with -Xmx4g)python crash_test.py everysec 5                    # kill -9 crash testpython memory_mcp/calibrate.py                     # embedding similarity calibration

Related work

Mnemolith is an early, open-source project. These are the production systems in the same space:

Status and limitations

Mnemolith is v1 and early. It works end to end in automated tests and is now being tried in real Claude Code sessions.

Not done yet:

  • A with-memory vs. without-memory evaluation on real coding tasks, to measure whether it actually reduces re-explaining.
  • AOF compaction: the log only grows, and every status change adds a line.

Engine limitations:

  • Threading: one OS thread per connection, not an event loop. That's fine for a local tool, but it won't scale to thousands of clients like Redis.
  • Transactions: EXEC isn't isolated, so other clients' commands can interleave with a transaction's commands.
  • Vector index: re-adding a vector updates it without rewiring its graph links, and there's no delete. Retired memories are filtered out, not removed.
  • Replication: full resync only, and a new replica assumes the master's dataset is empty.
  • Smaller gaps:
    • KEYS * lists only string keys.
    • GEOSEARCH scans every member.
    • ACL supports only the default user.
    • HELLO (RESP3) isn't supported, so clients must use RESP2.

Project layout

src/main/java/Main.java      the engine (single file, from the CodeCrafters setup)mnemolith/                   the Python package behind the `mnemolith` command  server.py                  MCP server: embeddings, git staleness, AGENTS.md/CLAUDE.md sync  engine.py                  finds Java, starts and stops the engine in the background  javart.py                  downloads a private copy of Java when the computer has none  connect.py                 registers Mnemolith with Claude Code, Claude Desktop, Cursor, and Codex  cli.py                     the `mnemolith` command  ui.py, ui/index.html       the dashboard (`mnemolith ui`): a local server, its API, and the page  mender.py                  Mender: rule-drafted fixes, drafts from AI tools, and the guarded approve  portability.py             import from notes files, export to JSON  engine/mnemolith-engine.jar the prebuilt engine (rebuild with `python scripts/build_engine.py`)tests/test_mender.py         Mender's rules (`python -m pytest tests`)eval/                        with-vs-without memory evaluation on a sample codebase (`python3 eval/run.py`)plugin/                      the Claude Code plugin (listed through .claude-plugin/marketplace.json)memory_mcp/calibrate.py      similarity calibration for duplicate/contradiction thresholdsvector_bench.py              HNSW benchmark (writes results.json)crash_test.py                kill -9 crash-safety test

Releasing

Bump the version in pyproject.toml, mnemolith/__init__.py, and server.json, commit, then:

sh
git tag v0.3.4 && git push --tags

Once the release is on PyPI, point the Claude Code plugin at it: bump the version in plugin/.claude-plugin/plugin.json and plugin/pyproject.toml, run uv lock in plugin/, then commit and push. The plugin can't move first, because its lockfile needs the new release to exist.

The release workflow checks the versions match, builds and smoke-tests the package, publishes it to PyPI and the MCP Registry, and creates the GitHub Release.

License

MIT. See LICENSE.

来源:README.md,提交 964a516

工具

10

remember

Save a durable fact about this project so future sessions, in any AI tool, know it. Use this, not a built-in memory or notes file, whenever the user asks you to remember something about the project. Good facts: conventions ("we use pnpm, not npm"), setup gotchas ("tests need DOCKER_HOST set"), decisions and their reasons. Not: temporary task details or anything in the code already. files: repo-relative paths this fact depends on (e.g. ["docker-compose.yml"]), so the memory can be flagged when those files change. replaces: the id of a memory this fact makes untrue (e.g. "m42"), to save and retire it in one call.

输入参数fact必填filesreplaces

recall

Search this project's shared memory by meaning. Call it at the start of every task, and whenever project-specific knowledge (setup, conventions, past decisions) might matter. Current (active) memories come first. Related memories that were retired, replaced, or may be outdated are listed after them, labeled, so you know what changed: never rely on those.

输入参数limitquery必填

explain_memory

Show where a memory came from (which tool and session saved it, which files it's linked to) and everything that has happened to it since. Use it when a memory looks wrong or surprising.

输入参数memory_id必填

mark_outdated

Mark a memory as no longer true, with a short reason. It stops counting as current but keeps its history. If you know what's true now, save that with remember(..., replaces=<this id>) instead, so the next session knows the new fact, not just that the old one is wrong.

输入参数reason必填memory_id必填

replace_memory

Retire an older memory because a newer one replaces it (e.g. "we use Postgres" replaced by "we migrated to MySQL"). The old memory stops showing up in recall but keeps its history.

输入参数new_id必填old_id必填

check_stale

Check whether any memory's linked files have changed since it was saved, and retire those memories. recall already does this automatically; call it directly after big changes.

无需输入参数。

confirm_memory

Mark a memory as still true (e.g. after it was retired because a linked file changed, but the fact itself didn't). Re-links it to the current version of its files.

输入参数memory_id必填

sync_to_files

Write this project's current memories into the managed section of AGENTS.md / CLAUDE.md, so they're committed with the code: teammates and tools without Mnemolith see them, and changes show up in reviews. Call it when the user asks, or after a batch of new memories.

无需输入参数。

list_conflicts

List pairs of memories in this project that may contradict each other and need a decision.

无需输入参数。

resolve_conflict

Settle a possible conflict. replaces_old=True: the new memory replaces the old one (the old one is retired). replaces_old=False: both are true, keep both. Ask the user if you're not sure.

输入参数new_id必填old_id必填replaces_old必填

版本历史

6
  1. v0.3.4最新Nov 5, 2026
  2. v0.3.3Nov 5, 2026
  3. v0.3.2Nov 3, 2026
  4. v0.2.2Oct 23, 2026
  5. v0.2.1Oct 21, 2026
  6. v0.2.0Oct 20, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分