RMS Memory MCP
π§ RMS Memory MCP
Version: 1.1.0 (2026-07-27) Β· companion GUI 1.1.0 (unified numbering)
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.
Features β’ Download β’ Install β’ Quick Start β’ CLI β’ MCP Tools β’ Architecture
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.
Related MCP server: Mnemoverse Memory
β¨ Key Features
ποΈ Global Centralized Vaults | Project context lives outside your repo β zero |
π Hybrid Retrieval (LanceDB) | Embedded Vector Search + Tantivy Full-Text Search for zero-fail context hits. |
π Multilingual Semantic Parsing |
|
π³ AST Markdown Chunker |
|
π§© Semantic Code Memory | Optional Tree-sitter indexing for Rust, Go, JS/JSX, TS/TSX, Python, C/C++, Java, Ruby, Swift, and Vue |
πΈοΈ Knowledge Graph Foundation | Derived Markdown/code relationships and durable user overrides are stored separately from retrieval chunks and consumed by the companion GUI graph. |
π§Ή 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 |
π― Bounded Recall (v1.0.7) |
|
β»οΈ Knowledge Lifecycle | Frontmatter |
π Session Continuity (v1.0.7) | Vault-backed checkpoints ( |
π§ Multi-project MCP routing (v1.0.8+) | Explicit |
π Cross-project federated search (v1.0.9) | Pass |
π§ 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) |
|
π¦ Unified Releases | Public assets use |
βοΈ Dynamic Auto-Installer |
|
π Rules-as-Code Patching | Non-destructive AST patching of |
π§ͺ Durable Vault Writes |
|
π Canonical Wiki Isolation | Generated |
π‘οΈ Ten-Point Resiliency | GC, background sync, write-guard snapshots, macOS sandbox bypass, |
π 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 |
π Multi-Scope |
|
π₯οΈ 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. |
π¦ Installation
Option 1: Homebrew (macOS Apple Silicon & Linux)
brew tap max-ramas/tap
brew install rms-memory-mcpInstalls 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
.zipbelow).
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 | bashirm https://raw.githubusercontent.com/max-ramas/rms-memory-mcp/master/scripts/install.ps1 | iexOption 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) β lagging until workspace publish
As of 1.0.9 the library is a Cargo workspace with path-only internal crates
(publish = false). cargo publish of the umbrella is intentionally disabled.
Prefer Homebrew or a GitHub release binary for the current version.
# May install an older crates.io revision until the publish strategy lands
# (see docs/crate-split.md). Not the recommended path for 1.0.9+.
cargo install rms-memory-mcpOptional 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. Until Apple/Windows signing certificates
exist, macOS builds may be unsigned β see GUI-README.md for
Gatekeeper notes. The private GUI workflow transfers only the completed
.dmg, .msi/.exe, .AppImage, .deb, and .rpm installer files (plus
SHA256SUMS.txt when present); it never mirrors GUI source, build logs,
updater metadata, credentials, or other 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 installThis 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" serveUse 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 scopeFor 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 initThis 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 memoryRegistered 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,vueSupported names are rust, go, javascript, jsx, typescript, tsx, python, c, cpp, java, ruby, swift, and vue. 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.
π CLI Commands
Command | Description |
| Starts the JSON-RPC stdio server (auto-triggered by your IDE). |
| Registers a project into the global registry. |
| Re-injects managed IDE rule blocks with the concrete registry |
| Scans for existing docs ( |
| Hooks the server into supported IDEs. |
| Removes the server from all discovered IDE configurations. |
| Runs 5-point vault health diagnostics. |
| Without flags: prints global + current-project settings, then offers interactive global editing. Any flag runs non-interactively. Global: |
| Refreshes Markdown memory (default), derived semantic code memory, or both. |
| Incremental LanceDB delete-then-insert sync (also runs automatically during |
| Prunes orphaned LanceDB indices belonging to deleted vaults. |
| Tails the telemetry log ( |
| Compiles the current vault into a single |
| Lists registered project keys and their code/vault paths. |
| Resolves one registered project key. |
| Removes an erroneous project registration while preserving its vault files. |
| Editor-agnostic continuity hook ( |
All commands | Accept |
π MCP Tools Exposed
Tool descriptions are written to be action-oriented, so agents use the vault proactively without being asked.
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>The CLI command 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 reserved). The published product remains the root umbrella rms-memory-mcp (binary + MCP server + tools + rules injector), 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.
Path traversal + filter injection prevention
Zombie process prevention (watcher shutdown on EOF +
std::process::exit(0))Graceful shutdown (
SIGINT/Ctrl+Chandler)macOS sandbox bypass for
fastembedmodel downloadsrms-memory gcβ orphaned vector store pruningPID-aware per-project writer lock and read-only background synchronization across IDE processes
Markdown watcher plus an explicitly opt-in, 3s-debounced code watcher with path-scoped reindex and shared-generation suppression
Write-guard snapshotting with rolling
.bakbackups (default: 5)Isolated telemetry logging (
~/.rms-memory/rms.log)llms.txtexport 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 | β |
|
Zed | β |
|
Claude Code | β |
|
OpenCode | β | β |
Codex | β | β |
VS Code | β | β |
Antigravity | β | β |
π License
MIT License β see LICENSE for details.
Maintenance
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/max-ramas/rms-memory-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server