Context7
Up-to-date docs for AI agents
제작자가 쓴 설명(영어 원문)
Local-first agent memory: versioned JSON categories, BM25 search, per-device ACL, fleet sync.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
제작자가 레지스트리에 설치 정보를 올리지 않았어요. 아래 제작자의 README를 확인하세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 8일 점검
레지스트리 이름이 GitHub 계정 DioNanos 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.2.1)은 5개월 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요.
같은 카테고리에는: Context7, Codebase Memory, Exa
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
Up-to-date docs for AI agents
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
Connect AI agents to Exa for web search, content fetching, and multi-step research.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
Local-first MCP memory server in pure Rust. Persistent, versioned, queryable memory for AI agents — owned by the user, not by a platform.
State lives on your disk as plain JSON categories backed by SQLite (FTS5). Every write is versioned and backed up. A fleet of devices syncs through an optional HTTP endpoint with merkle manifests and optimistic concurrency. No cloud account, no embedding service, no network dependency in the default mode.
Agent memory tied to a vendor dies with the vendor session. This server keeps the agent's long-lived state — identity, projects, infrastructure notes, per-device workflows — in files you can read, grep, diff, and back up yourself. Any MCP client (Claude Code, Codex, or anything speaking MCP stdio) gets the same memory; swapping the model does not lose the state.
Design choices that follow from that:
memory_history and memory_compact manage the tail.expected_hash turns clobbering races between concurrent agents into explicit conflicts.memory_search_semantic adds an optional TF-IDF hybrid. No model downloads.The pair: for *corpus* recall (chunked documents, BM25 retrieval,
original-text injection) see the companion server
mcp-vl-msa-rs. This server holds
the curated agent state; that one holds the queryable corpus.
flowchart LR
A["AI agent (any MCP client)"] A -->|"curated state read / write / sync"| M["mcp-memory-rs the notebook "] A -->|"corpus recall index / search / fetch"| V["mcp-vl-msa-rs the library "] M --- D1[("JSON categories SQLite FTS5")] V --- D2[("tantivy BM25 collections")]
Prebuilt binary (recommended) — download the archive for your platform from the latest release, extract, and point your MCP client at the binary:
tar xzf mcp-memory-rs-x86_64-unknown-linux-gnu.tar.gz
install -m755 mcp-memory-rs-*/mcp-memory-rs ~/.local/bin/
Prebuilt targets (Linux + Android): x86_64-unknown-linux-gnu, x86_64-unknown-linux-musl, aarch64-unknown-linux-gnu, aarch64-unknown-linux-musl (edge / ARM / Termux), aarch64-linux-android.
macOS: no prebuilt binary is shipped (it would need Apple code-signing). Install from source instead — cargo install compiles it on your Mac in one command, no signing needed:
cargo install --git https://github.com/DioNanos/mcp-memory-rs --locked
--locked uses the committed Cargo.lock (reproducible build).
cargo build --release
./target/release/mcp-memory-rs
Claude Code (~/.claude.json) or any MCP client:
{
"mcpServers": { "memory": { "command": "/path/to/mcp-memory-rs", "env": { "MCP_MEMORY_CONFIG": "/home/me/.config/mcp-memory-rs/config.toml", "MCP_MEMORY_REQUIRE_CONFIG": "1", "MCP_MEMORY_MODE": "offline", "MCP_DEVICE": "my-laptop" } } } }
Codex (~/.codex/config.toml):
[mcp_servers.memory]
command = "/path/to/mcp-memory-rs" env = { MCP_MEMORY_CONFIG = "/home/me/.config/mcp-memory-rs/config.toml", MCP_MEMORY_REQUIRE_CONFIG = "1", MCP_MEMORY_MODE = "offline", MCP_DEVICE = "my-laptop" }
default_tools_approval_mode = "approve"
Configuration is TOML — copy config/example.toml to ~/.config/mcp-memory-rs/config.toml and adjust it. The server auto-discovers that XDG-style path. Environment variables override file values (MCP_DEVICE, MCP_MEMORY_MODE, MCP_MEMORY_DIR, …); managed deployments should set MCP_MEMORY_REQUIRE_CONFIG=1 so a missing config fails closed.
Memory is organized in categories: named JSON documents (base, projects, my-laptop, workflow_my-laptop, …). Reads return the document plus metadata (content hash, size, last writer, timestamp). Writes replace the category or, with merge=true, patch it per top-level key.
Multi-device fleets get a small, explicit ACL ([acl] in the config):
| Rule | Effect |
|---|---|
admin_devices | Listed devices write everything. |
device_categories | Device name writes category name and workflow_name — its own namespace only. |
| agent scope | Device foo-agent writes foo_* categories. |
| everyone | All devices read everything. |
Unknown categories are denied for non-admin writers — fail closed.
Each node runs local-first; one node (or any number) exposes the HTTP API as a sync remote. sync_manifest builds a merkle-rooted fingerprint of all categories; sync_diff compares manifests; memory_sync pushes dirty categories or pulls remote changes. Conflicts between nodes are resolved by the configured conflict_strategy (last-write-wins by default); expected_hash preconditions protect direct writes (MCP and HTTP), not the sync envelope.
The HTTP API is an admin/sync plane: the bearer token grants full access to every category. Per-category ACL applies on the MCP stdio surface, where the device identity is known locally; HTTP callers are identified only by the shared token, so no per-device ACL is enforced there.
The HTTP server requires MCP_MEMORY_TOKEN and refuses to start without it. Bind it to loopback (the default) and tunnel between nodes; do not expose it to the public internet.
MCP_MEMORY_TOKEN=<secret> ./target/release/mcp-memory-rs --http
| Tool | Description |
|---|---|
memory_read | Read a category (optional field filtering). |
memory_write | Replace or merge-patch a category; versioned; expected_hash precondition. |
memory_append | Append a timestamped entry to a bounded append-only log category; auto-prunes by max_entries/max_age_days. For event streams / session journals, so they don't bloat memory categories. |
memory_delete | Delete a category (backup created first). |
memory_list | All categories with hash/size/last-update metadata. |
memory_search | FTS5 full-text search, BM25 ranking, category/date/actor filters, snippets. |
memory_search_semantic | Hybrid TF-IDF + FTS5 search. |
memory_history | Version history of a category. |
memory_delta | Changes since a known hash (cheap polling). |
memory_context | Multi-category warmup read, token-budget oriented. |
memory_compact | Prune old versions and backups. |
memory_status | Local-first status: dirty queue, manifest hash, last sync. |
memory_doctor | Diagnostics: paths, database, categories, sync config. |
sync_manifest | Merkle-rooted manifest of all categories. |
sync_diff | Compare local vs remote manifest: push/pull/conflict sets. |
sync_push / sync_pull | Export/import sync envelopes. |
memory_sync | One sync step against the configured remote (push_dirty / pull_remote). |
The same surface is available over HTTP (/api/v1/*) for non-MCP consumers; /health is unauthenticated, everything else requires the bearer token.
The server is built to be self-explanatory to a weak client model:
initialize it returns an instructions string describing the memory model and the entry-point tools. Some lightweight clients ignore this field; if your client never surfaces it, read the tool descriptions instead — they carry the same guidance (e.g. memory_read takes category, not key).readOnlyHint, so a client such as Codex can auto-approve them. On Codex, an unsupported call / user cancelled result usually means the tool-approval gate fired, not a server fault — set default_tools_approval_mode = "approve" (see the Codex snippet above).initialize and send notifications/initialized like any MCP client.With no config and strict mode disabled, standalone base_dir remains ~/.memory for compatibility. The auto-discovered example config uses ~/.local/state/mcp-memory-rs (XDG-style). Config resolution is: explicit MCP_MEMORY_CONFIG, $XDG_CONFIG_HOME, $HOME/.config, legacy cwd-local memory-config.toml, then standalone defaults. Either way the layout is:
<base_dir>/
├── categories/ # one .json file per category — the source of truth ├── backups/ # automatic pre-delete/pre-overwrite backups ├── memory.db # SQLite: FTS5 index, versions, sync state (rebuildable) └── memory.db-wal # write-ahead log (WAL mode; do not copy or delete by hand)
Every writer — one stdio server per client plus the optional --http instance — opens its own SQLite connection on the same file. Since 0.3.2 each mutation runs inside a BEGIN IMMEDIATE transaction: SQLite is the mutex that serializes writers *across processes*, so an append (read → modify → write) can never lose another process's entry. Lock acquisition is retried with jittered backoff inside one total budget; when it expires the call fails with a clear Store busy … retry later error instead of hanging or corrupting anything.
[storage]
journal_mode = "wal" # "wal" (default) or "delete" synchronous = "full" # "full" (default, durable) or "normal" sqlite_busy_timeout_ms = 200 # per-statement SQLite busy handler lock_deadline_ms = 10000 # total wait for the write lock per mutation
Category JSON files are written crash-safely: the new content is staged next to the file (a name unique to the transaction), the SQLite rows are committed, then the staged file is renamed into place. A process that dies in between leaves a staged file whose fate is decided by its hash under the next write lock (matching the committed hash → promoted; otherwise → discarded). Readers never rename or delete anything: they serve whichever file carries the committed hash. memory_write merge=true, the log/memory kind check and the optional expected_hash compare-and-swap all run inside the same lock.
memory.db alone is not a backup (WAL, JSON files). Use the CLI:
mcp-memory-rs --snapshot /path/to/snap-2026-09-15 --with-backups # db + json + backups + manifest
mcp-memory-rs --restore /path/to/snap-2026-09-15 --stopped mcp-memory-rs --verify-store # read-only: db vs json, pending files
--verify-store never opens a Store (no PRAGMA, schema or reconcile): it is safe on a store another binary still owns. A store written by a version older than 0.3.2 can hold categor
앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요