Skip to main content
Glama
RMS Memory MCP

RMS Memory MCP

🧠 RMS Memory MCP

Latest release: see GitHub Releases · rms-memory update installs it · the optional companion GUI is released separately

Persistent, local-first memory for your AI coding agents.

Stop re-explaining your architecture to Cursor, Zed, and Claude Code and other IDEs every single session.

License: MIT Rust Crates.io Release Downloads Build Platform MCP

Features • Download • Install • Quick Start • CLI • MCP Tools • Architecture


🔒 Privacy promise

RMS does not collect your data or usage statistics. RMS Memory MCP has no accounts, license checks or analytics, and your notes, code, queries and settings stay on your machine (local-first). The only requests that reach RMS carry no content and no personal identifier:

  • Update check: rms-memory doctor (and the rms_doctor tool) asks update.rms-ds.com for the newest version, at most once a day: your OS, CPU architecture and the version, no ID. If that server is unreachable it falls back to GitHub*. Turn it off with RMS_MEMORY_NO_UPDATE_CHECK=1.

  • Downloads you ask for: rms-memory update, rms-memory gui and the install scripts fetch signed files from update.rms-ds.com, which counts downloads per release and source; its analytics store no IP addresses or user agents.

  • Embedding model: on first use it is downloaded once from Hugging Face*.

Embeddings are computed on your machine (the bundled model, or a local Ollama), so your notes never leave your computer for any AI service.

If an online service is ever introduced, we will tell you clearly beforehand.



The Problem

You're developing a single project but switching between different agents — Cursor, Zed, Claude Code, OpenCode, etc. Every one of them loses context of architectural decisions, system requirements, and user preferences the moment you close the tab. You end up re-explaining the same things over and over, or copy-pasting a stale CLAUDE.md between tools.

RMS Memory MCP bridges this gap: a single, isolated, centralized Markdown vault — perfectly structured for LLM consumption — that any MCP-compatible IDE can read from and write to.

🖥️ Prefer a GUI over raw Markdown?

RMS Memory GUI turns your vault into a visual workspace — full graph editor, per-project Git & GitHub sync, one-click Doctor repair, and an AI-assisted Wiki generator (bring your own key). One-time desktop app, works on top of everything below. The MCP server stays 100% free and standalone either way.

Related MCP server: io.github.oleksiijko/pmb-ai

✨ Key Features

🗂️ Global Centralized Vaults

Project context lives outside your repo — zero .mcp file pollution.

🔍 Hybrid Retrieval (LanceDB)

Embedded Vector Search + Tantivy Full-Text Search for zero-fail context hits.

🌐 Multilingual Semantic Parsing

fastembed-rs + multilingual-e5-small by default — native Russian & English understanding. Since 1.3.0 rms-memory embedding use switches to another bundled model or a local Ollama model (each keeps its own index), and rms-memory embedding eval measures hit@k / MRR on your own vault.

🌳 AST Markdown Chunker

pulldown-cmark-based chunking keeps code blocks and lists bound to their parent heading.

🧩 Semantic Code Memory

Optional Tree-sitter indexing for Rust, Go, JS/JSX, TS/TSX, Python, C/C++, Java, Ruby, Swift, C#, PHP, Kotlin, SQL, HTML, CSS, and Vue <script> blocks; stable segment identities and repeated preambles preserve context when large implementations split. Opt-in watch mode reindexes only dirty paths (with full-walk fallback).

🕸️ Knowledge Graph (v1.2.0)

Durable Markdown/code relationships via MCP rms_graph (neighbors, path, snapshot, mutations) and optional search include_graph_neighbors. Companion GUI still owns the visual GraphView.

🧹 Safe Project Lifecycle

Unregistering preserves vault/index data; permanent GUI deletion requires the exact project key, is confined to the master vault, and never touches source code.

🔀 Federated Corpus Search

Search vault, code, or all; mixed results use Reciprocal Rank Fusion rather than incompatible raw vector distances.

🎯 Bounded Recall (v1.0.7)

rms_search returns an inject/abstain envelope with max_chars, optional min_score, fail-closed errors, and retrieval_mode (hybrid or short-query fts_prefer).

♻️ Knowledge Lifecycle

Frontmatter status / supersedes / temporal valid_* gate Lance recall; soft supersede via rms_write; Doctor freshness lint (check 7 of 8); rms-memory prune archives aged superseded notes (dry-run default).

📓 Obsidian vaults (v1.3.0)

rms-memory projects attach-obsidian <PATH> indexes an existing Obsidian vault in place, strictly read-only (RMS Memory never creates, edits or deletes files in it); rms-memory import --obsidian <DIR> copies one into a project vault instead. [[wikilinks]], aliases, headings and embeds resolve the way Obsidian does in the graph, index and doctor.

🌍 Local HTTP transport (v1.3.0)

rms-memory serve --http serves MCP Streamable HTTP on 127.0.0.1:7337/mcp with a bearer token from ~/.rms-memory/http-token, loopback Host/Origin checks and per-session state — for clients that cannot spawn a stdio process. See SECURITY.md.

🔐 Credential refusal (v1.3.0)

rms_write and checkpoint tools refuse text containing well-known token formats (AWS AKIA…, GitHub ghp_…/github_pat_…, OpenAI/Anthropic sk-…, Slack, Stripe live, Google, npm, GitLab) or a PEM private key, naming the kind and line but never the value. Doctor check 8 reports such notes already in the vault (report only). Not a guarantee — see SECURITY.md.

⬆️ Updates (v1.4)

rms-memory update installs the newest release from the RMS update server: the signed manifest, size and sha256 are verified, the new binary is smoke-tested, swapped in atomically and the previous one is kept for rms-memory update --rollback. Binaries installed by brew, cargo or a package are left to that tool (--force overrides). doctor also checks for a newer version at most once a day (update server first, GitHub as fallback; RMS_MEMORY_NO_UPDATE_CHECK=1 disables it) and warns when the running server binary was replaced on disk; MCP initialize repeats the cached notice without network access.

🔄 Session Continuity (v1.0.7)

Vault-backed checkpoints (rms_checkpoint_save/done/load/query), rms_overview project orientation (since 1.3.0 with index lag and git branch / changed files), MCP resources rms://<project>/… and prompts (session_start, save_progress, record_decision), rms_hygiene consolidation report, rms_system_instructions self-bootstrap, editor-agnostic rms-memory hook CLI, installer L3 thin adapters, and pinned notes that bypass temporal/min_confidence recall gates.

🧭 Multi-project MCP routing (v1.0.8+)

Explicit project always rebinds the active vault; empty Cursor roots/list falls back to process cwd; injected rules require project: "<key>" on every memory tool call; rms-memory inject-rules [--all] refreshes keys.

🔗 Cross-project federated search (v1.0.9)

Pass projects: [key, …] to rms_search / rms_code_search for read-only RRF federation. Vault/all across multiple projects requires cross_project_vault=true on every listed key (hard fail otherwise).

🧊 Concurrent bind cache (v1.0.9)

Up to 4 warm Store+watcher pairs (LRU); multi-root IDE sessions stop thrashing open/close.

🧱 Cargo workspace (v1.0.9+)

rms-memory-{core,index,vault,cli} path crates under crates/; public umbrella rms-memory-mcp keeps stable module paths for the GUI. cli hosts cycle-free gc/prune (1.1.1). See docs/crate-split.md.

📦 Unified Releases

Public assets use rms_memory_mcp_<version>_<target>.* / rms_memory_gui_<version>_* on the same vX.Y.Z tag (MCP + GUI share numbering). Unversioned names are no longer published.

🪶 Small idle footprint (v1.3.0)

Each serve process loads the embedding model only when it needs to embed and releases it after 5 idle minutes (RMS_MEMORY_MODEL_IDLE_SECS), so many IDEs with an idle server cost about 50 MB each instead of a model copy each. Since 1.4.2 on Linux the freed memory is also handed back to the system (an idle process drops to about 100 MB instead of staying near 700 MB).

⚙️ Dynamic Auto-Installer

rms-memory install scans your system and wires itself into every supported IDE.

📜 Rules-as-Code Patching

Non-destructive AST patching of .cursorrules, .zed/assistant.md, etc. Opt-in by default.

🧪 Durable Vault Writes

rms_write creates rolling .bak backups and atomically replaces create/replace targets after fsync, so interrupted writes never expose a truncated Markdown file. Optional dry_run previews create/update/noop without touching disk or the index (fingerprint ignores volatile audit stamps).

📜 File git history (v1.1.2)

Derived code_path file→commit cache (rms_file_history / rms-memory file-history); agents should not shell git log. Optional search include_file_history attaches the last 3 commits per code hit (not with federated projects).

📚 Canonical Wiki Isolation

Generated <vault>/wiki/** stay Git-synchronized but are excluded from indexes/search/watchers/graph/packs; MCP write and canonical DocumentService also reject wiki paths (wiki-safe writers only).

🛡️ Ten-Point Resiliency

GC, background sync, write-guard snapshots, macOS sandbox bypass, llms.txt export, path traversal + injection protection, zombie prevention, graceful shutdown.

🔒 Security Hardened

Panic-free database layer, symlink traversal blocked, JSON-RPC error responses, request size limits. See SECURITY.md and NOTICE.

🧠 Audit Metadata

Every record auto-receives last_modified_by, timestamp, confidence, source — agents can filter by reliability.

🔀 Multi-Scope

--scope flag supports arbitrary identifiers beyond filesystem paths (thread IDs, lead IDs, etc.).

🖥️ Optional Companion GUI

Paid Tauri desktop app: visual Markdown/graph editor, Git & Vault sync, Doctor dashboard, AI-assisted organizer/Wiki (BYOK), and cross-tool spend tracking — layered on top of the same vault, never required. See GUI-README.md. Install and open it from the terminal with rms-memory gui.

📥 Download

RMS Memory MCP (command-line server, free)

macOS Apple Silicon · .pkg Windows x64 · .msi Linux x64 · .deb Linux ARM64 · .deb

Also as: macOS .tar.gz · Windows .zip · Linux x64 .tar.gz / .rpm · Linux ARM64 .tar.gz / .rpm

The installers put rms-memory on your PATH (/usr/local/bin on macOS, Program Files\RMS Memory MCP on Windows). Always the newest stable release. The macOS installer and binary are signed with an Apple Developer ID and notarized, so macOS opens them without a warning. The Windows installer is not code-signed yet, so SmartScreen may warn before the .msi runs.

Prefer a one-line installer? It picks the right build, verifies the signature and puts the binary on your PATH:

curl -fsSL https://raw.githubusercontent.com/max-ramas/rms-memory-mcp/master/scripts/install.sh | bash
irm https://raw.githubusercontent.com/max-ramas/rms-memory-mcp/master/scripts/install.ps1 | iex

With an archive: unpack, put rms-memory (rms-memory.exe on Windows) on your PATH and run rms-memory install to register it in your IDEs. Already installed? rms-memory update fetches the release from the same server, verifies its signature and checksum, and keeps the previous binary for rms-memory update --rollback. The signed manifest of the latest release is at /v1/rms-memory-mcp/latest. Downloads through this server are counted per release; no IP addresses or user agents are stored.

RMS Memory GUI (optional desktop app, trial included)

GUI macOS .dmg GUI Windows .exe setup GUI Windows .msi GUI Linux .AppImage GUI Linux .deb GUI Linux .rpm

The MCP server never needs the GUI. From a terminal, rms-memory gui installs it for your OS (signature and checksum verified) and opens it.

Homebrew, .deb/.rpm packages of the MCP and older versions: GitHub Releases.

📦 Installation

Option 1: Homebrew (macOS Apple Silicon & Linux)

brew tap max-ramas/tap
brew install rms-memory-mcp

Installs a prebuilt binary — no Rust toolchain required. The formula updates automatically with every release.

Not covered by Homebrew: macOS Intel (dropped as of v1.0.1) and Windows (Homebrew doesn't run there — use Option 2 or the .zip below).

Option 2: GitHub release binary

Prebuilt binaries for aarch64-apple-darwin (Apple Silicon), x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, and x86_64-pc-windows-msvc are published on every release, along with .deb/.rpm packages for Linux. One-line installers auto-detect your architecture:

curl -fsSL https://raw.githubusercontent.com/max-ramas/rms-memory-mcp/master/scripts/install.sh | bash
irm https://raw.githubusercontent.com/max-ramas/rms-memory-mcp/master/scripts/install.ps1 | iex

Option 3: Build from Source

# 1. Clone the repository
git clone https://github.com/max-ramas/rms-memory-mcp.git
cd rms-memory-mcp

# 2. Build the optimized release binary
cargo build --release

# 3. Add the binary to your global PATH
cp target/release/rms-memory ~/.cargo/bin/

crates.io (cargo install)

As of 1.1.0+, tag push publishes only the umbrella crate rms-memory-mcp to crates.io. Internal workspace members (rms-memory-core / index / vault / cli) stay publish = false (path deps for local builds and the companion GUI). Release packaging flattens those crates into a staging tree via scripts/flatten-for-crates-io.py before cargo publish (as of 1.1.1 the staging tree also inlines rms-memory-cli) — see docs/crate-split.md.

cargo install rms-memory-mcp
# Prefer Homebrew or a GitHub release binary if you want a pinned installer.

Optional RMS Memory GUI installers

The companion RMS Memory GUI is a paid, optional Tauri desktop control plane: a visual Markdown/graph editor, per-project and Vault-wide Git/GitHub sync, a Doctor dashboard with one-click repair, an AI-assisted organizer and Wiki generator (bring your own key, proposal-only), and cross-tool spend tracking. The MCP server remains fully standalone: it does not require the GUI, an AI provider, or a GUI license to index, search, sync or serve MCP clients.

See GUI-README.md for the full feature breakdown, supported platforms, installer verification and release-distribution policy.

GUI source is private, but desktop installers are published as binary assets on this repository's GitHub Releases under the matching v<version> tag. macOS builds are signed with Developer ID and notarized; Windows builds are not signed yet — see GUI-README.md. The private GUI workflow transfers only the completed .dmg, .msi/.exe, .AppImage, .deb, and .rpm installer files (plus SHA256SUMS.txt when present). With updater signing enabled, the GUI pipeline mirrors signed latest.json, companion .sig files, and macOS *.app.tar.gz onto this public release (URLs rewritten to rms-memory-mcp; in-app Install reads …/releases/latest/download/latest.json). It never mirrors GUI source, build logs, credentials, or private GUI release archives. The same publication flow runs for a v* GUI tag and for a manually dispatched, version-validated GUI release.

🚀 Quick Start

The fastest way to get every IDE on your machine connected:

rms-memory install

This scans ~/.config/ and ~/Library/Application Support/ and hooks rms-memory directly into Cursor, Zed, Claude Code, OpenCode, and others — no manual JSON editing.

Generated Wiki namespace

The optional desktop GUI writes human-readable Wiki pages to <vault>/wiki/. RMS Memory MCP remains AI-free and treats this directory as generated output rather than canonical memory. A shared case-insensitive path policy (src/path_policy.rs, also reused by the GUI) excludes the entire namespace from Markdown/code indexing, vector and full-text retrieval, watchers, the durable graph and Wiki context packs. Write isolation matches that policy: rms_write requires .md and rejects wiki/**; canonical DocumentService list/read/write APIs exclude or reject wiki; Wiki page mutations use wiki-safe methods that skip memory audit-frontmatter injection. Linked-document link: resolution always re-checks that the canonical target stays inside the vault. Full or incremental sync removes legacy Wiki-derived records by path without deleting the files, and doctor reports the isolation state explicitly.

For virtual projects without a filesystem path (threads, leads, etc.), use --scope:

rms-memory --scope "thread:abc-123" serve

Use multiple isolated scopes

A scope is an isolation boundary for a vault and its index. Without --scope, RMS Memory uses the canonical current working directory; an explicit filesystem path addresses that same kind of project vault. Any other non-empty identifier creates an isolated virtual vault:

rms-memory serve                                      # current project scope
rms-memory --scope "/home/user/my-project" serve     # explicit project scope
rms-memory --scope "thread:abc-123" serve             # virtual thread scope
rms-memory --scope "product:acme" serve                # virtual product scope

For project knowledge plus per-thread history, query each scope explicitly and merge the results in the caller. RMS Memory intentionally does not mix scopes implicitly. Scope IDs may not be empty or exceed 512 characters; absolute and .//../ values are resolved as paths, while all other values are opaque identifiers.

When using min_confidence, start with an unfiltered search. Use 0.3–0.5 for broad refinement and reserve 0.7+ for verified canonical facts; records without a confidence value remain visible.

Configure your vault

The simplest way to configure the server is to run the interactive setup wizard. You don't need to memorize any CLI flags — just run:

rms-memory config

(Alternatively, set the vault root directly with rms-memory config --vault-path ~/MyVaults/, then run rms-memory init in each repository you want to register.)

Register a repository explicitly from its root before connecting IDE agents:

cd /path/to/project
rms-memory init

This creates the project mapping in ~/.rms-memory/registry.toml and provisions its isolated, structured vault. Routine MCP discovery is read-only and fail-closed: it never creates a project from /, never falls back to a shared global vault, and never guesses between multiple registered projects.

~/MyVaults/
  └── <ProjectKey>/
      ├── rules/
      ├── decisions/
      ├── architecture/
      ├── artifacts/
      ├── docs/
      └── api/

Optional semantic code memory

Markdown memory remains the default corpus. Semantic source indexing is separate, supports all bundled language adapters, and never changes source files:

rms-memory reindex --code  # build/update only derived code memory
rms-memory reindex --all   # refresh Markdown vault + code memory

Registered projects support code_index_mode = "off" | "manual" | "watch"; the default is off. Set it from the project root with rms-memory config --code-index-mode watch (or add --scope <project-path>). watch is explicitly opt-in, coalesces supported source saves for three seconds, and reindexes only the dirty paths (try_index_code_paths) with a full-walk fallback when the index is cold, the dirty set is empty/oversized (>200), or the watcher channel overflows. Concurrent IDE processes share a completion marker so an unchanged workspace stays idle. Code search results include their source language.

Perf smoke for large fixtures: ./scripts/bench_large_vault.sh [notes] [code_files].

Language selection is project-scoped and defaults to every bundled adapter:

rms-memory config --code-languages auto
rms-memory config --code-languages go,typescript,tsx,vue

Supported names are rust, go, javascript, jsx, typescript, tsx, python, c, cpp, java, ruby, swift, vue, csharp, php, kotlin, sql, html, and css. Generated paths (node_modules, .next, .nuxt, target, vendor, and coverage) are always excluded. Ambiguous .h files are indexed as C exactly once; use .hpp, .hh, or .hxx for C++ headers. Vue indexes only inline JavaScript/TypeScript <script> contents and maps results back to the .vue host file; templates, styles, script setup macros, and external src scripts remain outside v1.0.5 semantic extraction. HTML files contribute inline JavaScript <script> blocks (mapped back to the .html file) and elements with an id; CSS files contribute rule sets by selector and @keyframes. SQL files contribute CREATE TABLE / VIEW / TYPE / FUNCTION / PROCEDURE / TRIGGER statements.

Use an existing Obsidian vault

rms-memory projects attach-obsidian ~/Obsidian/Notes --key notes   # in place, read-only
rms-memory import --obsidian ~/Obsidian/Notes --dry-run             # or copy into this project's vault

An attached vault is indexed and searchable (pass project: "notes"), but RMS Memory never creates, edits, moves or deletes files in it: rms_write, checkpoints, prune and hooks refuse, and projects remove only drops the registration. The index lives under ~/.rms-memory/dbs/ like any other. Obsidian links ([[Note]], [[Note|label]], [[Note#Heading]], ![[image.png]], frontmatter aliases) resolve in the graph, the index and doctor.

Embedding model and retrieval eval

The default model is multilingual-e5-small (384 dimensions, downloaded once). To compare it with others on your own notes and switch:

rms-memory embedding list
rms-memory embedding eval --models multilingual-e5-small,bge-m3 --show-misses
rms-memory embedding use bge-m3              # or: ollama:nomic-embed-text (local Ollama)

eval turns each note's first heading into a query (or reads --queries file.jsonl with {"query": "...", "expect": ["path.md"]} lines) and reports hit@1, hit@k and MRR for embeddings alone and for hybrid search. Each model keeps its own index under the project's dbs/ folder, so switching back reuses the old one. After use, restart running MCP servers (IDE, GUI); the next sync builds the new index. Ollama URLs must be loopback (http://127.0.0.1:11434 by default).

🛠 CLI Commands

Command

Description

rms-memory serve [--http] [--port 7337]

Starts the JSON-RPC stdio server (auto-triggered by your IDE). --http serves MCP Streamable HTTP on 127.0.0.1 instead, with a bearer token.

rms-memory init

Registers a project into the global registry. --dry-run supported. --full forces creation of all IDE rule templates.

rms-memory inject-rules [--all]

Re-injects managed IDE rule blocks with the concrete registry project key (existing files only, unless --full). Use after template updates. Fail-closed: a single unregistered path is refused rather than injected with a guessed key — run init there first, or use --all to refresh every registered project.

rms-memory import

Scans for existing docs (README.md, docs/, ADR/) and imports them — interactively or via --auto-import. --obsidian <DIR> [--into obsidian] [--dry-run] copies an Obsidian vault (notes, attachments, folders) into the project vault without touching the source or overwriting files.

rms-memory install

Hooks the server into supported IDEs. --dry-run supported.

rms-memory uninstall

Removes the server from all discovered IDE configurations.

rms-memory doctor

Runs 8-point vault health diagnostics (the 8th reports credentials stored in notes, never changing them; a 9th checks patterns/ notes against the code when the vault has them), shows the code-index state and prints update / restart notices. --repair-frontmatter safely repairs duplicate, missing, and known attached frontmatter IDs with backups; arbitrary invalid YAML is reported but never rewritten automatically.

rms-memory config

Without flags: prints global + current-project settings, then offers interactive global editing. Any flag runs non-interactively. Global: --vault-path, --auto-add, --inject-rules, --auto-import skip|link|import_organize|import, --max-backups N. Project (cwd or --scope <path>): --code-index-mode off|manual|watch, --code-languages auto|<comma-list>, --include <globs>, --exclude <globs>, --cross-project-vault true|false.

rms-memory reindex [--vault|--code|--all]

Refreshes Markdown memory (default), derived semantic code memory, or both.

rms-memory sync

Incremental LanceDB delete-then-insert sync (also runs automatically during serve).

rms-memory gc

Prunes orphaned LanceDB indices belonging to deleted vaults.

rms-memory prune [--older-than-days N] [--apply]

Archives superseded notes older than N days (default 30) under artifacts/pruned/YYYY-MM-DD/. Dry-run by default; never deletes. Distinct from gc (orphan DBs) and from supersession (lifecycle marking).

rms-memory file-history catch-up|reindex|query

Derived code_path git file→commit cache (Lance). reindex requires --project. Prefer MCP rms_file_history for agents.

rms-memory update [--check|--yes|--rollback|--force|--json]

Checks the RMS update server and installs a newer binary (signature, size and sha256 verified, atomic swap, --rollback restores the previous one).

rms-memory gui [--download-only|--no-open|--yes|--json]

Installs the optional desktop GUI (14-day trial) from the update server and opens it; opens it when it is already installed. Downloads are labelled src=cli on the update server.

rms-memory stats [--days N] [--json] [--reset]

Local, content-free statistics: how many characters each tool returned to agents (see docs/token-usage.md). Never sent anywhere; RMS_MEMORY_NO_STATS=1 turns the recording off.

rms-memory wiki ...

Generates wiki context packs from the vault and the code index (same data as rms_wiki_pack).

rms-memory features

Live GUI/AI status banner + capability catalog (GUI/AI tags; soft yellow when GUI absent, gray when installed). Informational only — MCP core is never paywalled.

rms-memory graph status|ensure|neighbors|path|snapshot|export-dot|…

Durable knowledge graph (same actions as MCP rms_graph). Mutations require --project.

rms-memory log

Tails the telemetry log (~/.rms-memory/rms.log; moved to rms.log.1 when a process starts and it exceeds 20 MB).

rms-memory export-llms

Compiles the current vault into a single llms.txt payload.

rms-memory projects list

Lists registered project keys and their code/vault paths.

rms-memory projects locate --project <key>

Resolves one registered project key.

rms-memory projects resolve-key --path <dir>

Looks up the registry key for a code path (including post-migrate redirects).

rms-memory projects migrate --project <key> --to <new-path>

Moves/renames a registered project after the repo folder changed. Plans key rename, vault/db moves, and link: repairs; supports --dry-run, --no-repair-links, --strict-git. Prefer this over recreating .git or re-running init.

rms-memory projects remove <key>

Removes an erroneous project registration while preserving its vault files.

rms-memory projects attach-obsidian <PATH> [--key KEY]

Registers an existing Obsidian vault in place, read-only: indexed and searchable, never modified. The read-only flag is kept in ~/.rms-memory (registry.toml and read-only-vaults); if that directory is deleted or recreated, attach the vault again.

rms-memory embedding list|use <id>|eval

Lists the bundled embedding models, switches the model (ollama:<model> for a local Ollama), or scores retrieval quality (hit@1, hit@k, MRR) on the project's vault, for embeddings alone and hybrid search. Restart MCP servers after use; the next sync builds the model's index.

rms-memory dialogs init|mode|collect|index|search|session|status|read|restore|verify

Optional local archive of your AI-assistant dialogs (Claude Code, Codex, Antigravity, OpenCode, Cursor, Zed), read from the files those tools already keep on disk; nothing is intercepted and nothing is sent anywhere. init --encrypt encrypts every file with age (passphrase only needed to read). Modes: off, collect, collect-and-serve. collect --index also builds a full-text index of user and assistant turns (encrypted when the archive is); search and session read it. See docs/dialogs.md.

rms-memory hook --event <e>

Editor-agnostic continuity hook (session_start, pre_compact, session_stop); JSON on stdout. --project <key> or unique cwd resolution (fail-closed); --apply creates/updates or closes a checkpoint.

All commands

Accept --scope <id> to target arbitrary isolated vaults (threads, leads, etc.).

🔌 MCP Tools Exposed

Tool descriptions are written to be action-oriented, so agents use the vault proactively without being asked.

MCP resources (1.3.0): rms://<project>/overview, rms://<project>/instructions, rms://<project>/checkpoint/<name> and rms://<project>/note/<path> are read-only views for clients that attach context by URI. MCP prompts: session_start, save_progress (name) and record_decision (topic).

The server resolves an explicit scope or legacy rootUri, then negotiates MCP roots/list. If a client exposes neither (or opens several registered roots), pass the short registry key in project; injected agent rules contain the correct key for that repository. rms_projects lists valid keys without requiring a bound workspace. An explicit project on any tool call always wins and rebinds the active vault — one long-lived MCP process can serve every registered project. Without project, ambiguity stays fail-closed (no silent pick-first).

To remove an accidental registration without deleting its Markdown vault:

rms-memory projects remove <key>

If the repository folder was moved or renamed, do not recreate .git or re-run init from scratch. Plan and apply a migrate instead:

rms-memory projects migrate --project <key> --to /new/path/to/repo --dry-run
rms-memory projects migrate --project <key> --to /new/path/to/repo
rms-memory projects resolve-key --path /new/path/to/repo

The CLI command projects remove is intentionally non-destructive. The companion GUI exposes a separate Delete project and data action for permanent cleanup of the registration, Markdown vault, and derived index. It requires typing the exact project key and accepts only a dedicated child of the configured master vault; the repository source path is explicitly excluded from deletion.

🏗 Architecture Highlights

Implementation lives in path-only crates under crates/ (rms-memory-core, rms-memory-index, rms-memory-vault, rms-memory-cli for cycle-free gc/prune). The published product remains the root umbrella rms-memory-mcp (binary + MCP server + tools + rules injector + serve), which re-exports every former rms_memory_mcp::<module> path so the companion GUI keeps stable imports. Heavy deps (lancedb, ort, fastembed, tree-sitter) concentrate in rms-memory-index. Details: docs/crate-split.md.

A central ~/.rms-memory/registry.toml routes every project to an isolated vault, computed from a hash of the project path. No .mcp files, no per-repo config — global MCP entries (e.g. Zed's settings.json) can target any workspace automatically.

The transport-neutral ProjectService is the single implementation used by the CLI and companion GUI. Registry mutation remains revisioned through ConfigManager; deletion validates canonical paths before unregistering and returns structured warnings if filesystem cleanup cannot be completed.

Instead of duplicating existing docs into the vault, rms-memory import can create lightweight Link Files — Markdown stubs with a link: <path> frontmatter property. Reads/writes are transparently redirected to the source file, while the vector index still respects the vault's directory structure.

Embedded LanceDB (~/.rms-memory/dbs/) combines vector similarity with full-text search, so a query never comes back empty just because the exact keywords didn't match.

Human-authored Markdown and derived Rust code live in separate tables. Code chunks carry stable symbol identities, line ranges, and preambles; unchanged chunks reuse their vectors. corpus=all fuses independently ranked result sets with Reciprocal Rank Fusion, avoiding any assumption that distances from the two corpora are comparable.

Graph nodes and edges are deliberately independent of retrieval chunk boundaries. Markdown links, Rust imports, trait implementations, and lexical call hints can be reconciled as derived relationships; user-created edges and suppress/restore overrides persist across reindexing. Current Rust call edges are syntax-level hints, not a compiler-accurate call graph.

pulldown-cmark parses the Markdown AST directly. Chunks are built by walking up to the parent heading, with a strict 1500-character boundary and ~200-character overlapping window for oversized code blocks — no mid-sentence truncation.

  1. Path traversal + filter injection prevention

  2. Zombie process prevention (watcher shutdown on EOF + std::process::exit(0))

  3. Graceful shutdown (SIGINT/Ctrl+C handler)

  4. macOS sandbox bypass for fastembed model downloads

  5. rms-memory gc — orphaned vector store pruning

  6. PID-aware per-project writer lock and read-only background synchronization across IDE processes

  7. Markdown watcher plus an explicitly opt-in, 3s-debounced code watcher with path-scoped reindex and shared-generation suppression

  8. Write-guard snapshotting with rolling .bak backups (default: 5)

  9. Isolated telemetry logging (~/.rms-memory/rms.log)

  10. llms.txt export for flat, decoupled LLM ingestion

Live MCP requests have been verified for rms_search(corpus=vault|code|all) and rms_code_search. On this repository, reindex --code indexed 43 Rust files into 298 semantic items and 438 segments with all vectors reused on an unchanged run. An isolated five-server watcher run coalesced rapid saves into one shared completion-marker update; a later real-project stress gate completed concurrent GeoMail, License Server, RMS Monitoring, and GeoTax Site indexing, then seven MCP servers (after four IDE restarts) stayed at 0.0% CPU with no background reindex.

🧩 Supported IDEs

IDE

Auto-Install

Rules Injection

Cursor

✅

.cursorrules

Zed

✅

.zed/assistant.md

Claude Code

✅

.claude/CLAUDE.md

OpenCode

✅

—

Codex

✅

—

VS Code

✅

—

Antigravity

✅

—

📄 License

MIT License — see LICENSE for details.



* Contacted directly by the tool for your convenience (a fallback update lookup on GitHub, the one-time embedding model download from Hugging Face). RMS does not take part in that exchange.

Available Tools

20 tools
rms_checkpoint_doneA

Close a checkpoint: marks it status=done (drops out of recall) and writes a durable session summary note under artifacts/sessions/.

NameRequiredDescriptionDefault
nameYesCheckpoint name to close.
projectNoProject key (when the client sends no workspace root).
summaryYesWhat was accomplished.
rms_checkpoint_loadA

Load one checkpoint with its full body and bounded previews of linked notes. Use rms_checkpoint_query first to find names.

NameRequiredDescriptionDefault
nameYesCheckpoint name to load.
projectNoProject key (when the client sends no workspace root).
rms_checkpoint_queryA

List checkpoints for the current project, newest first, with full pending text. Filter with status=active|done|all (default all).

NameRequiredDescriptionDefault
statusNoStatus filter; default all.
projectNoProject key (when the client sends no workspace root).
rms_checkpoint_saveA

Create or update a session checkpoint (artifacts/checkpoints/.md, status=active). Save before context compaction or a long pause so work can be resumed. Updating preserves id/created_at and keeps omitted fields. The code repository branch and HEAD are recorded automatically.

NameRequiredDescriptionDefault
goalNoWhat this work is trying to achieve.
nameYesCheckpoint name (letters, digits, '-', '_', '.').
linksNoVault-relative paths of related notes.
pendingNoWhat remains to be done.
projectNoProject key (when the client sends no workspace root).
rms_doctorA

Run the vault health diagnostics (structure, IDs, links, LanceDB, wiki isolation, registry, freshness, credentials; plus pattern staleness when the vault has patterns/). Also reports a newer release (checked at most daily; RMS_MEMORY_NO_UPDATE_CHECK=1 disables) or a server binary replaced since start. Returns structured JSON. Set repair_frontmatter=true only with an explicit project (refuses sticky-bind repair).

NameRequiredDescriptionDefault
projectNoRegistered project key. Required when repair_frontmatter=true.
repair_frontmatterNoAttempt frontmatter ID repairs. Requires project. Default false.
rms_file_historyA

Query the derived code_path git file→commit history cache (no shell). Prefer this over git log for when a source file changed. Lazy catch-up on query; use action=reindex after force-push/rebase (requires explicit project). Default response omits commit messages. Catch-up/reindex enforce commit-count budgets.

NameRequiredDescriptionDefault
pathNoPath relative to the project code_path (required for action=query).
limitNoMax commits to return (default 20, max 200).
actionNoquery (default), catch_up, or reindex (full rebuild; requires project).
projectNoRegistered project key. Required for action=reindex; recommended for all actions when the MCP client did not provide a workspace root.
include_messageNoInclude commit subject lines. Default false.
rms_graphA

Query and mutate the durable Markdown/code knowledge graph (MCP-first). Actions: status, ensure (reconcile vault links if empty or force=true), neighbors, path (BFS), snapshot, semantic (ephemeral embedding edges), create_edge / suppress_edge / edge_override (mutations require explicit project), export_dot. Prefer this for dependency traversal instead of guessing from search alone.

NameRequiredDescriptionDefault
toNoPath/node for path search goal.
fromNoPath/node for path search start.
nodeNoNode key (e.g. vault:doc-id) or vault path for neighbors.
pathNoVault-relative path alias for neighbors.
forceNoensure: rebuild vault links even when the graph is non-empty.
limitNoMax neighbors / snapshot / export rows.
actionNoGraph action; default status.
authorNoOptional author for edge overrides.
sourceNoSource node_key for create_edge.
targetNoTarget node_key for create_edge.
projectNoRegistered project key. Required for create_edge / suppress_edge / edge_override.
edge_keyNoEdge key for suppress/restore overrides.
relationNoEdge relation (lowercase + underscores); default links_to.
max_depthNoMax BFS depth for path (default 8).
max_nodesNosemantic: max nodes considered.
override_actionNoOverride action for suppress_edge / edge_override.
expected_revisionNoOptimistic concurrency revision for edge overrides; default 0.
neighbors_per_nodeNosemantic: neighbors per node.
confidence_thresholdNosemantic: minimum similarity confidence.
rms_hygieneA

Read-only memory hygiene report for one project: near-duplicate and identical notes (embedding similarity), active checkpoints untouched for 14+ days, and session notes older than 90 days, with next steps. Never edits the vault; merge duplicates with rms_write + supersedes.

NameRequiredDescriptionDefault
projectNoProject key (when the client sends no workspace root).
min_similarityNoCosine similarity at which two notes count as near duplicate candidates; candidates must also share half of their word 3-grams.
rms_overviewA

Structured orientation summary for exactly one project: document counts by folder and status, recent notes, active checkpoints, index lag, and the code repository's git state (branch, HEAD, ahead/behind, changed file names; never diff contents). Call this at session start. Fail-closed: requires a bound workspace or an explicit project key; never aggregates across projects.

NameRequiredDescriptionDefault
projectNoProject key (when the client sends no workspace root).
recent_limitNoMaximum recent notes to return (default 10, max 50).
rms_projectsB

List registered RMS Memory project keys. This tool works even when the MCP client did not provide a workspace root.

NameRequiredDescriptionDefault

No parameters

rms_pruneA

Find superseded vault notes older than a retention window and optionally archive them under artifacts/pruned/. Defaults to a dry run; set apply=true to archive candidates. Never deletes notes.

NameRequiredDescriptionDefault
applyNoWhen true, archive eligible notes. Defaults to false (dry run).
projectNoProject key (when the client sends no workspace root).
older_than_daysNoMinimum age in days for a superseded note to be eligible.
rms_readA

Read a markdown document from the RMS Memory vault by relative path (e.g. 'rules/api.md'). Whole note by default. For long notes save tokens: outline (headings with sizes), heading (one section), max_chars/offset (window), if_hash (hash from an earlier read; returns a short 'unchanged' stub if the note has not changed).

NameRequiredDescriptionDefault
idNo
pathYesRelative path to the markdown document in the vault.
offsetNoStart at this character offset (with max_chars).
headingNoReturn only the section under this heading (with its sub-sections). Exact title first, then substring.
if_hashNocontent_hash from an earlier read of this note. If unchanged, a short stub is returned instead of the text.
outlineNoReturn only a table of contents (headings with character sizes, frontmatter summary, content hash).
projectNoProject key (when the client sends no workspace root).
max_charsNoReturn at most this many characters; the reply says which offset continues.
noPromoteNoRead without side effects. Vault reads are already side-effect free; accepted for explicit forward-compatible contracts.
rms_reindexA

Full rebuild of vault and/or code indexes. Destructive to derived tables — requires explicit project. Prefer rms_sync for incremental catch-up.

NameRequiredDescriptionDefault
corpusNoWhich corpus to rebuild; default vault.
projectYesRegistered project key (required).
rms_remindA

Personal reminders that you pass on to the user. When the user says e.g. "remind me to call Viktor Petrovich tomorrow at 12", call action=add with text and due_at (RFC3339 WITH the user's UTC offset, e.g. 2026-11-06T12:00:00+03:00; use in_minutes for relative times; if you do not know the date, time or timezone, ask first). Afterwards, tool responses carry a [RMS reminder] block about 30/20/10/5 minutes before the time and once when it is due: relay it to the user in your reply. Other actions: list, done, cancel, snooze (new due_at/in_minutes). Global, not per project.

NameRequiredDescriptionDefault
idNoReminder id (done, cancel, snooze).
textNoWhat to remind about (add).
actionNoDefault list.
due_atNoRFC3339 timestamp with UTC offset.
in_minutesNoRelative alternative to due_at, minutes from now.
rms_syncC

Incremental vault index sync (same as CLI rms-memory sync). Prefer an explicit project when the IDE is multi-root.

NameRequiredDescriptionDefault
projectNoProject key (when the client sends no workspace root).
rms_system_instructionsA

Return the canonical RMS Memory usage protocol (search-first, persist, session continuity). Lets an agent self-bootstrap without injected rule files.

NameRequiredDescriptionDefault
projectNoProject key (when the client sends no workspace root).
rms_wiki_packA

Generate a wiki context pack from the vault and code index. Returns material for an agent to create human-readable wiki documentation from verified sources.

NameRequiredDescriptionDefault
projectNoProject key (when the client sends no workspace root).
manifestNoOptional YAML manifest path for custom sections.
refresh_codeNoForce code reindex before generating.
rms_writeB

Save new architectural decisions, constraints, development rules, or project context to the RMS Memory vault. Use this tool PROACTIVELY at the end of a task if you learned a new user preference, solved a tricky bug, or made a new architectural decision.

NameRequiredDescriptionDefault
idNo
modeYesWrite mode.
pathYesRelative path to save the document (e.g., 'decisions/001-db.md').
pinnedNoWhen true, the note bypasses temporal and min_confidence recall gates (status still applies).
sourceNoOptional free-text citation or source reference for this record.
statusNoOptional lifecycle status: active, draft, or superseded.
contentYesThe markdown content to write.
dry_runNoWhen true, classify create/update/noop and return a JSON preview without writing disk or touching the index. Defaults to false.
projectNoProject key (when the client sends no workspace root).
confidenceNoOptional confidence score (0.0–1.0) indicating reliability of this record.
supersedesNoOptional relative vault path of a prior note to soft-supersede (marks it status=superseded and links both sides).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 15 tool updatesv1.4.3
    • Changedrms_checkpoint_done1 field changed
      • changedInput schema / properties / project / description
        Previous value: -"Registered project key, used when the MCP client did not provide a workspace root."New value: +"Project key (when the client sends no workspace root)."
    • Changedrms_checkpoint_load1 field changed
      • changedInput schema / properties / project / description
        Previous value: -"Registered project key, used when the MCP client did not provide a workspace root."New value: +"Project key (when the client sends no workspace root)."
    • Changedrms_checkpoint_query1 field changed
      • changedInput schema / properties / project / description
        Previous value: -"Registered project key, used when the MCP client did not provide a workspace root."New value: +"Project key (when the client sends no workspace root)."
    • Changedrms_checkpoint_save1 field changed
      • changedInput schema / properties / project / description
        Previous value: -"Registered project key, used when the MCP client did not provide a workspace root."New value: +"Project key (when the client sends no workspace root)."
    • Changedrms_code_search1 field changed
      • addedInput schema / properties / include_notes
        Added value: +{
        +  "description": "Attach vault notes (decisions, patterns) that mention the hit's file or symbol, with `code_changed_since_note` when the code is newer. Default true; not used with projects: […].",
        +  "type": "boolean"
        +}
    • Changedrms_hygiene1 field changed
      • changedInput schema / properties / project / description
        Previous value: -"Registered project key, used when the MCP client did not provide a workspace root."New value: +"Project key (when the client sends no workspace root)."
    • Changedrms_overview1 field changed
      • changedInput schema / properties / project / description
        Previous value: -"Registered project key, used when the MCP client did not provide a workspace root."New value: +"Project key (when the client sends no workspace root)."
    • Changedrms_prune1 field changed
      • changedInput schema / properties / project / description
        Previous value: -"Registered project key, used when the MCP client did not provide a workspace root."New value: +"Project key (when the client sends no workspace root)."
    • Changedrms_read6 fields changed
      • addedInput schema / properties / heading
        Added value: +{
        +  "description": "Return only the section under this heading (with its sub-sections). Exact title first, then substring.",
        +  "type": "string"
        +}
      • addedInput schema / properties / if_hash
        Added value: +{
        +  "description": "content_hash from an earlier read of this note. If unchanged, a short stub is returned instead of the text.",
        +  "type": "string"
        +}
      • addedInput schema / properties / max_chars
        Added value: +{
        +  "description": "Return at most this many characters; the reply says which offset continues.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Start at this character offset (with max_chars).",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / outline
        Added value: +{
        +  "description": "Return only a table of contents (headings with character sizes, frontmatter summary, content hash).",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / project / description
        Previous value: -"Registered project key, used when the MCP client did not provide a workspace root."New value: +"Project key (when the client sends no workspace root)."
    • Addedrms_remind
    • Changedrms_search2 fields changed
      • addedInput schema / properties / pattern_status
        Added value: +{
        +  "description": "Minimum status for hits from patterns/ notes. Default verified-in-runtime: unproven patterns are hidden. `implemented` also returns implemented ones; `proposed`/`all` returns everything (hits carry their pattern_status). Other notes are never filtered.",
        +  "enum": [
        +    "verified-in-runtime",
        +    "implemented",
        +    "proposed",
        +    "all"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / snippet_chars
        Added value: +{
        +  "description": "Cut each result's content to this many characters (token-saving first pass); then rms_read the winners with `heading` or `outline`.",
        +  "maximum": 4000,
        +  "minimum": 40,
        +  "type": "integer"
        +}
    • Changedrms_sync1 field changed
      • changedInput schema / properties / project / description
        Previous value: -"Registered project key, used when the MCP client did not provide a workspace root."New value: +"Project key (when the client sends no workspace root)."
    • Changedrms_system_instructions1 field changed
      • changedInput schema / properties / project / description
        Previous value: -"Registered project key, used when the MCP client did not provide a workspace root."New value: +"Project key (when the client sends no workspace root)."
    • Changedrms_wiki_pack1 field changed
      • changedInput schema / properties / project / description
        Previous value: -"Registered project key, used when the MCP client did not provide a workspace root."New value: +"Project key (when the client sends no workspace root)."
    • Changedrms_write1 field changed
      • changedInput schema / properties / project / description
        Previous value: -"Registered project key, used when the MCP client did not provide a workspace root."New value: +"Project key (when the client sends no workspace root)."
  2. 1 tool updatev1.3.2
    • Addedrms_hygiene
  3. 6 tool updatesv1.2.0
    • Changedrms_code_search1 field changed
      • addedInput schema / properties / include_graph_neighbors
        Added value: +{
        +  "description": "When true, attach durable graph neighbors for each hit path. Not allowed together with projects: […] federation. Default false.",
        +  "type": "boolean"
        +}
    • Addedrms_doctor
    • Addedrms_graph
    • Addedrms_reindex
    • Changedrms_search1 field changed
      • addedInput schema / properties / include_graph_neighbors
        Added value: +{
        +  "description": "When true, attach durable graph neighbors for each hit path. Not allowed together with projects: […] federation. Default false.",
        +  "type": "boolean"
        +}
    • Addedrms_sync
  4. 5 tool updatesv1.1.2
    • Changedrms_code_search1 field changed
      • addedInput schema / properties / include_file_history
        Added value: +{
        +  "description": "When true, attach the last 3 commits from the derived code_path git-history cache to each code hit. Not allowed together with projects: […] federation. Default false.",
        +  "type": "boolean"
        +}
    • Addedrms_file_history
    • Addedrms_prune
    • Changedrms_search1 field changed
      • addedInput schema / properties / include_file_history
        Added value: +{
        +  "description": "When true, attach the last 3 commits from the derived code_path git-history cache to each code hit (lazy catch-up). Not allowed together with projects: […] federation. Default false.",
        +  "type": "boolean"
        +}
    • Changedrms_write1 field changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": false,
        +  "description": "When true, classify create/update/noop and return a JSON preview without writing disk or touching the index. Defaults to false.",
        +  "type": "boolean"
        +}
  5. 12 tool updatesv0.1.0
    • First observedrms_checkpoint_done
    • First observedrms_checkpoint_load
    • First observedrms_checkpoint_query
    • First observedrms_checkpoint_save
    • First observedrms_code_search
    • First observedrms_overview
    • First observedrms_projects
    • First observedrms_read
    • First observedrms_search
    • First observedrms_system_instructions
    • First observedrms_wiki_pack
    • First observedrms_write

TDQS

A3.6/5.0

Scored across 20 tools

Disambiguation4/5

Most tools target clearly distinct operations: search, read/write, checkpoint lifecycle, sync/reindex, diagnostics, graph, history, and reminders. A few pairs need careful reading to distinguish, notably rms_doctor vs rms_hygiene (diagnostics vs duplicate/cleanup reporting), rms_prune vs rms_hygiene, and rms_sync vs rms_reindex, but their descriptions explicitly clarify the boundaries.

Naming Consistency4/5

All tools share a predictable rms_ snake_case prefix, which is consistent throughout. Within that, some names are verb-first (rms_search, rms_read, rms_write) and others are noun-first (rms_checkpoint_query, rms_file_history, rms_wiki_pack), but the style remains readable and mostly grouped by domain.

Tool Count3/5

Twenty tools is on the heavy side for a memory server, though the product genuinely spans search, persistence, checkpoints, indexing, graph, diagnostics, and reminders. Tools like rms_system_instructions and rms_remind feel somewhat peripheral, making the surface borderline heavy rather than tightly scoped.

Completeness5/5

The surface covers search (vault/code/all), read/write, checkpoint create/query/load/close, project discovery, overview, incremental sync and full reindex, graph traversal/mutation, file history, diagnostics, hygiene, pruning, wiki packing, and reminders. Lifecycle coverage is broad and coherent, with only intentionally absent operations like hard deletion, which is explicitly replaced by pruning/archiving.

Maintenance

ActivityActive
ResponsivenessLimited data

Related MCP Connectors

Related MCP Servers