Vestige
Vestige is a local memory and safety-gate server for AI coding agents, exposing tools to store, search, manage, and reason over memories plus project context.
Search memories with hybrid retrieval, filters, detail/token budgets, and retrieval modes.
Ingest and manage memories: create/batch ingest, get/edit, promote/demote, purge, suppress, and track timeline/changelog.
Score importance, find duplicates, preview/apply merges or supersedes, undo operations, protect memories, and set merge policy.
Store and retrieve codebase patterns and architectural decisions.
Set, check, update, and list intentions triggered by time, context, or events.
Sync GitHub or Redmine issues into an offline, searchable index.
Run maintenance: consolidate, garbage collect, backup, export, restore, and check system/memory health.
Explore memory graphs, connections, predictions, dream insights, deep reference reasoning, and contradictions.
Per the README, act as a safety gate that checks tool calls against 102 fixed rules and blocks dangerous actions.
Allows syncing memory archives via Dropbox for portable memory transfer between machines.
Allows syncing memory archives via Git repositories for portable memory transfer between machines.
Allows syncing memory archives via iCloud for portable memory transfer between machines.
Provides memory integration for JetBrains MCP clients, enabling agents to use local cognitive memory.
Supports using OpenAI-compatible endpoints for the Sanhedrin verification hook (optional post-response verifier).
Allows syncing memory archives via Syncthing for portable memory transfer between machines.
Provides memory integration for Xcode MCP clients, enabling agents to use local cognitive memory.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Vestige remember that I prefer dark mode in all my tools"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Vestige
Memory and a safety gate for AI coding agents.
What it does
Remembers. Agents keep what happened in earlier sessions and can trace a failure back to the change that caused it.
Stops bad tool calls. 102 fixed rules check every tool call before it runs and block things like recursive deletes and credential dumps.
Asks again. An earlier yes is not a yes now. A one-time owner permit lasts 15 minutes and then the agent has to ask again.
Proves it. Every write is signed and hash chained, so anyone can check the log offline.
It runs on your machine on a plain CPU. No LLM, no GPU, no cloud calls.
Related MCP server: Agent Memory
Quick start
npx @vestige/init --guard
vestige serveBenchmarks
These measure retrieval, meaning whether the right memory came back in the top 5. They do not measure answer accuracy. Every number is evaluated on 100% of the benchmark questions with zero embeddings, zero vectors, and zero cloud LLM calls ($0.00 spend).
Benchmark | Scale & Setting | Vestige v6.2.1 | Plain BM25 |
LongMemEval_S | Official all gold sessions in top 5 (470 non-abs) | 91.28% | 82.98% |
LongMemEval_S | Any gold session in top 5 (all 500 questions) | 98.60% | 97.00% |
LongMemEval_M | Scaled haystack (~476 sessions, ~4,894 turns/Q; 470 non-abs) | 91.70% Any@5 / 76.38% All@5 | — |
LoCoMo-10 | Full conversational dialogues, right session in top 5 (1,536 CORE Qs) | 92.25% | 87.24% |
LoCoMo-10 | Conversational turn-level soft recall in top 5 (1,536 CORE Qs) | 78.13% | 69.99% |
MemoryAgentBench | Multi-hop reasoning, 421K distractor context ( | 98.00% Any@5 / 93.00% All@10 | — |
MemoryAgentBench | Needle retrieval in 197K context ( | 95.00% R@5 / 99.00% R@10 | — |
MemoryAgentBench | Merged 400K scenarios ( | 94.08% Any@5 / 85.02% All@5 | — |
BEAM 100K | 20 conversations, 2,127 sub-sessions, right session in top 5 (355 Qs) | 66.20% Any@5 / 74.93% Any@10 | — |
BEAM 100K | Turn exact ID recall in top 5 (355 scored questions) | 45.92% Any@5 / 55.77% Any@10 | — |
This is the top retrieval result without embeddings we know of on LongMemEval_S. Settings were tuned on these datasets. As a blind split check, LoCoMo held-out conversations 6 to 10 score 91.75% session recall at 5 and 76.03% turn soft recall at 5.
On a plain CPU with 8 GB of RAM, a LongMemEval question takes ~500 ms, a LoCoMo question ~7 ms, and a 5,000-turn LongMemEval_M haystack ~5 seconds, with peak RSS under 350 MB.
Full tables, category breakdowns, and zero-leak disclosures are in benchmarks/README.md.
bash benchmarks/fetch_data.sh && bash benchmarks/run_all.shLearn more
Built in Rust by Sam Valladares. Licensed under AGPL-3.0.
Available Tools
34 toolsapply_planA
Execute a previously-generated merge/supersede plan by id. Recorded as a reversible operation. Old memories are invalidated (never deleted). 'possible'/'non_match' plans require confirm=true.
Inputs: plan_id (required), confirm.
backupB
Create a SQLite database backup. Returns the backup file path.
Inputs: no named parameters.
codebaseC
Unified codebase tool. Actions: 'remember_pattern' (store code pattern), 'remember_decision' (store architectural decision), 'get_context' (retrieve patterns and decisions).
Inputs: action (required), name, files, limit, +5 more.
composed_graphB
ComposedGraph memory topology. Reads durable composition events, members, and outcome labels; returns recent/already-composed lanes, neighbors, never-composed pairs, bounty-mode lanes, and lets users label outcomes such as helpful, submitted, accepted, rejected, duplicate_risk, needs_poc, or dead_end.
Inputs: action (required), tags, limit, notes, +5 more.
consolidateA
Run FSRS-6 memory consolidation cycle. Applies decay, generates embeddings, and performs maintenance. Use when memories seem stale.
Inputs: no named parameters.
contradictionsA
Inspect memory disagreements directly. Scans a topic or recent memories for trust-weighted contradiction pairs using the same local logic as deep_reference.
Inputs: limit, since, topic, min_trust.
cross_referenceC
Alias for deep_reference. Connect the dots across memories with cognitive reasoning.
Inputs: query (required), depth.
deep_referenceA
Deep cognitive reasoning across memories. Combines FSRS-6 trust scoring, spreading activation, temporal supersession, dream insights, and contradiction analysis to build a complete understanding of a topic. Returns trust-scored evidence, fact evolution timeline, and a recommended answer. Use this when accuracy matters.
Inputs: query (required), depth.
dreamB
Trigger memory dreaming — replays recent memories to discover hidden connections, synthesize insights, and strengthen important patterns. Returns insights, connections, and dream stats.
Inputs: memory_count, min_similarity.
explore_connectionsB
Graph exploration tool for memory connections. Actions: 'chain' (build reasoning path between memories), 'associations' (find related memories via spreading activation + hippocampal index), 'bridges' (find connecting memories between two nodes).
Inputs: from (required), action (required), to, limit.
exportC
Export memories as JSON or JSONL. Supports tag and date filters.
Inputs: path, tags, since, format.
find_duplicatesA
Find duplicate and near-duplicate memory clusters using cosine similarity on embeddings. Returns clusters with suggested actions (merge/review). Use to clean up redundant memories.
Inputs: tags, limit, similarity_threshold.
gcA
Garbage collect stale memories below retention threshold. Defaults to dry_run=true for safety.
Inputs: dry_run, max_age_days, min_retention.
importance_scoreA
Score content importance using 4-channel neuroscience model (novelty/arousal/reward/attention). Returns composite score, channel breakdown, encoding boost, and explanations.
Inputs: content (required), project, context_topics.
intentionC
Unified intention management tool. Actions: 'set' (create), 'check' (find triggered), 'update' (complete/snooze/cancel), 'list' (show intentions).
Inputs: action (required), id, limit, status, +8 more.
memoryA
Unified memory management tool. Actions: 'get' (retrieve full node), 'purge' (irreversibly remove content/embeddings with confirm=true), 'delete' (legacy alias for purge), 'state' (get accessibility state), 'promote' (thumbs up — increases retrieval strength), 'demote' (thumbs down — decreases retrieval strength, does NOT delete), 'edit' (update content in-place, preserves FSRS state).
Inputs: action (required), id, ids, reason, +2 more.
memory_changelogA
View audit trail of memory changes. Per-memory: state transitions. System-wide: consolidations + recent state changes.
Inputs: end, limit, start, memory_id.
memory_graphA
Subgraph export for visualization. Input: center_id or query, depth (1-3), max_nodes. Returns nodes with force-directed layout positions and edges with weights. Powers memory graph visualization.
Inputs: depth, query, center_id, max_nodes.
memory_healthA
Retention dashboard. Returns avg retention, retention distribution (buckets: 0-20%, 20-40%, etc.), trend (improving/declining/stable), and recommendation. Lightweight alternative to full system_status focused on memory quality.
Inputs: no named parameters.
memory_timelineA
Browse memories chronologically. Returns memories in a time range, grouped by day. Defaults to last 7 days.
Inputs: end, tags, limit, start, +2 more.
merge_candidatesA
Surface likely duplicate/overlapping memory clusters with confidence scores and the signals behind each (Fellegi-Sunter match/possible/non-match). Read-only — nothing is changed.
Inputs: tags, limit.
merge_policyA
Get or set the per-project merge policy: the two Fellegi-Sunter thresholds (match_threshold, possible_threshold) and auto_apply. No args returns the current policy.
Inputs: auto_apply, match_threshold, possible_threshold.
merge_undoA
Reverse a prior merge/supersede operation (the 'git reflog for your agent's memory'). With no operation_id, lists the reversible operation log so you can pick one.
Inputs: operation_id.
plan_mergeA
Produce a previewable MERGE plan (a diff: combined content/tags/provenance) for 2+ memories WITHOUT applying it. Returns a plan_id for apply_plan. Protected members block the merge.
Inputs: member_ids (required), survivor_id.
plan_supersedeA
Preview superseding memory A with B — bitemporal invalidation (stamps valid_until, keeps A queryable for audit) WITHOUT applying. Returns a plan_id for apply_plan.
Inputs: new_id (required), old_id (required).
predictB
Proactive memory prediction — predicts what memories you'll need next based on context, recent activity, and learned patterns. Returns predictions, suggestions, and speculative retrievals.
Inputs: context.
protectA
Pin a memory so it can never be auto-merged, superseded, or garbage-collected. Pass protected=false to unpin.
Inputs: id (required), protected.
restoreA
Restore memories from a JSON backup file. Supports MCP wrapper format, RecallResult format, and direct memory array format.
Inputs: path (required), merge, allowAnyPath.
searchB
Unified search tool. Uses hybrid search (keyword + semantic + convex combination fusion) internally. Auto-strengthens memories on access (Testing Effect).
Inputs: query (required), limit, concrete, source_id, +16 more.
session_contextA
One-call session initialization. Combines search, intentions, status, predictions, and codebase context into a single token-budgeted response. Replaces 5 separate calls at session start.
Inputs: context, queries, token_budget, include_status, +2 more.
smart_ingestA
INTELLIGENT memory ingestion with Prediction Error Gating. Single mode: provide 'content' to auto-decide CREATE/UPDATE/SUPERSEDE. Batch mode: provide 'items' array (max 20) for session-end saves — each item runs the full cognitive pipeline (importance scoring, intent detection, synaptic tagging).
Inputs: tags, items, source, content, +3 more.
source_syncA
Index an external system into Vestige as a durable, offline, semantically-searchable index that cites back to the canonical record. GitHub: source='github', repo='owner/name' (auth via GITHUB_TOKEN env). Redmine: source='redmine', project='' (host via REDMINE_URL, auth via REDMINE_API_KEY env). Idempotent: re-running updates changed issues without duplicating; set reconcile=true to tombstone issues removed upstream.
Inputs: repo, source, project, max_pages, +1 more.
suppressA
Actively suppress a memory via top-down inhibitory control (Anderson 2025 SIF + Davis Rac1). Distinct from delete: the memory persists but is inhibited from retrieval and actively decays. Each call compounds. A background Rac1 worker cascades decay to co-activated neighbors. Reversible within 24 hours via reverse=true.
Inputs: id (required), reason, reverse.
system_statusA
Combined system health and statistics. Returns status (healthy/degraded/critical/empty), full stats, FSRS preview, cognitive module health, state distribution, warnings, and recommendations.
Inputs: schema_introspection.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 34 tools
Most tools have distinct purposes: search, memory, codebase, intention, and various merge/explore steps are clearly separated. However, cross_reference is an explicit alias for deep_reference, creating redundancy, and the cluster of merge-related tools (find_duplicates, merge_candidates, plan_merge, apply_plan, merge_undo) could be confused despite having distinct stages.
Naming is mixed: many tools follow a verb_noun pattern (smart_ingest, find_duplicates, plan_merge, apply_plan, explore_connections, suppress), but others are noun_verb (memory_timeline, system_status, importance_score, merge_candidates, memory_health). A few are single-word nouns (search, memory, backup, export, gc, dream). This inconsistency in convention makes the set less predictable.
With 34 tools, this server far exceeds the 25-tool heavy threshold. While the domain is broad (memory management, codebase, intentions, ingestion, merging, health), many tools could be consolidated — e.g., five separate merge-related tools (find_duplicates, merge_candidates, plan_merge, apply_plan, merge_undo) and multiple health/status tools. The count feels bloated for agents to navigate efficiently.
The tool set covers the full memory lifecycle: creation (smart_ingest, memory set), retrieval (search, get, memory_timeline), update (edit, promote/demote), deletion (purge, gc, suppress), plus backup/export/restore and exploratory analysis. Minor gaps exist, such as a dedicated bulk delete (though gc covers it) and no explicit 'list all memories' without time constraints, but these are workable.
Maintenance
Related MCP Connectors
Correction-first memory for AI agents. Run it locally or connect any MCP agent to the hosted server.
Cloud-hosted MCP server for durable AI memory
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Persistent memory, knowledge graph, task management and more for AI agents via MCP.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA Rust-based MCP server that provides long-term memory capabilities for AI agents using keyword-based storage and retrieval. It supports isolated namespaces for different users or projects, allowing LLMs to remember and recall information across sessions.-
- AlicenseAqualityBmaintenanceMCP server that exposes agent-memory-daemon to any MCP-compatible client — Kiro (CLI & IDE), Claude Desktop, Cursor, and others. The daemon does the thinking (consolidation + extraction); this server is a thin filesystem bridge so agents can read, append, and search memory through the Model Context Protocol.440 npm6MIT

dakera-mcpofficial
AlicenseAqualityCmaintenanceSelf-hosted MCP-native agent memory server. Gives AI agents persistent, decay-weighted memory via 83 MCP tools — no cloud, full control. RocksDB+HNSW backend. Works with Claude Code, Cursor, and any MCP-compatible agent.149MIT- AlicenseAqualityCmaintenanceA different approach from typical persistent-memory MCPs. Instead of a local SQLite + embeddings store, the memory lives as plain files in a .ai-memory/ directory you commit to your repo (facts.jsonl, decisions/\*.md, gotchas.md). Git is the sync layer — what one Claude/Cursor/Cline learns about a repo, the next session (or a teammate's agent) picks up automatically. 5 MCP tools: get_rep535 PyPI1MIT