mnemon
Click on "Install 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., "@mnemonremember that I have a dentist appointment tomorrow"
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.
mnemon
One memory vault. Every MCP client. Self-hosted.
Status: alpha — interfaces may change. Issues and PRs welcome.
Claude Code, Cursor, claude.ai web/mobile/desktop, Claude Desktop, Gemini CLI — one vault shared across all of them.
mnemon is a Model Context Protocol server with hybrid BM25 + vector search. Your data stays on your machine or your own Fly app.
Platforms: Tested on macOS 14+. Linux should work. Windows untested.
Two product lanes: local and web
Capability | mnemon local | mnemon web |
Claude Code (CLI) | ✅ | ✅ |
Claude Desktop (Mac/Win app) | ✅ | ✅ |
Cursor | ✅ | ✅ |
Gemini CLI | ✅ | ✅ |
Any local MCP client | ✅ | ✅ |
claude.ai (web) | ❌ | ✅ |
Claude mobile app | ❌ | ✅ |
Memory shared across laptop + desktop | ❌ | ✅ |
Durable off-machine backup | ❌ (manual file copy) | ✅ (S3) |
External accounts required | none | Fly.io + AWS |
Credit card required | no | yes (both free tiers) |
First-install setup time | ~2 min | ~15 min |
Ongoing cost | $0 | ~$0 on free tiers |
Cold-start latency after idle | none | 2–5s |
mnemon local — one machine, one or more MCP clients. Zero external accounts.
pip install mnemon-memory && mnemon setup.mnemon web — memory across devices + claude.ai + mobile. Requires Fly.io + AWS.
mnemon upgrade web --app-name my-mnemon.
Start local, upgrade later — your vault rides along. mnemon downgrade local reverts. Comfortable up to ~50k memories.
Related MCP server: Recall
Install
pip install mnemon-memoryOptional: pip install "mnemon-memory[ui]" for the Streamlit dashboard, or [llm] for the on-device 1.7B model.
From source (e.g. to try unreleased fixes on main):
git clone https://github.com/nousergon/mnemon.git
cd mnemon
pip install -e .For contributors (adds pytest, ruff, and other test/lint tooling):
pip install -e ".[dev]"Quick Start
mnemon's whole point is one memory vault across every client — Claude Code, claude.ai web, Claude Desktop, the mobile app, Cursor. That's the default setup below. It's a deploy of your own Fly.io app (on your keys, your data), and upgrade web makes it turnkey — including auth for both headless and browser clients.
Cross-device (the default)
Prereqs: flyctl authenticated, aws CLI configured, an S3 bucket.
pip install "mnemon-memory[server]"
export MNEMON_S3_BUCKET=my-mnemon-vault
mnemon upgrade web --app-name my-mnemonThis deploys your own mnemon to Fly, seeds the vault, and provisions auth for both client kinds:
Headless clients (Claude Code, Cursor) — reconfigured automatically with a bearer token.
Browser clients (claude.ai web, Claude Desktop, mobile) — a self-hosted OAuth Authorization Server is enabled for you (keypair persists on the Fly volume). In the app's Settings → Connectors, add a custom connector with a name + the URL
https://my-mnemon.fly.dev/mcp— leave Client ID / Client Secret blank (the AS self-registers via Dynamic Client Registration). When you click Connect it redirects to a login page; enter the passphrase printed at the end of the deploy there (also saved to~/.mnemon/as_passphrase). The passphrase is the OAuth login, not a connector field.
No third-party auth vendor, no manual secret-wrangling. mnemon doctor runs at the end to verify the deployment.
Local-only (quick demo)
Just trying it on one machine, with no Fly/AWS accounts? You can elect the local-only path instead — but note it's single-machine, no cross-device sharing (that's the whole feature you'd be skipping):
pip install mnemon-memory
mnemon setupAuto-detects Claude Code, Claude Desktop, Cursor, Gemini CLI — configures each, then runs mnemon doctor. First memory_search takes ~10–20s (one-time FastEmbed model download). Move up to the full cross-device setup anytime with mnemon upgrade web.
Upgrade to a newer version (already on web)
Rerun the same command after pip install -U mnemon-memory — upgrade web is idempotent. If the Fly app already exists, it skips the first-time steps (S3 push, volume create, client reconfigure) and just redeploys with the new version pinned. Clients keep their URL and token; the new image is picked up on the next request.
pip install -U 'mnemon-memory[server]'
mnemon upgrade web --app-name my-mnemonUpgrading from a pre-0.7.0rc10 deployment? Re-auth your browser connectors once. Apps deployed before the OAuth Authorization Server was auto-provisioned only ever had the headless bearer token. The first
upgrade webon such an app provisions a brand-new OAuth passphrase (and enables the AS) — so your existing claude.ai / Desktop / mobile connector login stops working until you re-authenticate. Grab the new passphrase from the deploy summary or~/.mnemon/as_passphraseand re-enter it on the connector's login page. This is a one-time transition: once the passphrase exists, every later redeploy leaves it untouched (it is never rotated). Headless clients (Claude Code, Cursor) are unaffected — they keep their bearer token.
Optional: deploy from CI
The commands above are the supported, fully-capable way to deploy — for self-hosting and for testing a change before trusting automation. The repo also ships an optional Deploy to Fly GitHub Actions workflow (.github/workflows/deploy-fly.yml) so you can roll merged changes without running flyctl locally. It only wraps the same flyctl deploy — it can't do anything you can't do by hand.
It's keyed to your deployment, so it's inert in a fresh fork until you wire two things:
FLY_API_TOKENrepo secret —fly tokens create deploy -a <your-app>(Settings → Secrets and variables → Actions → Secrets).FLY_APPrepo variable — your Fly app name (same page → Variables). Or pass it as theappinput on a manual run.
Once wired, it runs two ways:
Automatically on every push to
main(e.g. a merged PR) — zero clicks. This auto-deploy fires only on the canonical, non-forked repo, so forking the project never gives you red CI on merges.Manually — from the Actions tab, or
gh workflow run "Deploy to Fly"(this path works on forks too).
Either way it renders fly.toml from fly.toml.example for your app, runs flyctl deploy --remote-only (builds on Fly's builders), and fails the run unless /health reports status=ok afterward. A redeploy preserves your vault volume and secrets (including the OAuth passphrase, never rotated) — same as upgrade web's redeploy path. Don't want auto-deploy? Remove the push: trigger from the workflow and it reverts to manual-only.
Downgrade back to local
mnemon downgrade local --destroy-fly-appPulls the Fly vault back via S3, reconfigures clients to stdio, optionally destroys the Fly app. No memories lost.
Visualize your vault
pip install "mnemon-memory[ui]"
mnemon dashboardStreamlit UI at http://localhost:8503 — vault health, search, timeline, an interactive graph view, and your profile. Works against both local and remote vaults.

The graph view projects your embedding space to 2-D — UMAP for local vaults, and PCA computed server-side for remote vaults so it scales to thousands of memories without shipping every vector over the wire.

Use it
Once configured, mnemon works automatically — memories save and surface during your sessions. You can also interact directly:
mnemon search "deployment architecture"
mnemon save "DB migration plan" "Migrate from PostgreSQL to DynamoDB in Q3"
mnemon forget 42
mnemon statusVerify it's working
mnemon doctor # health + auth + a real save→search→forget round-trip
mnemon verify-sharing # prove multiple clients share one vault (web mode)doctor auto-detects local vs web and runs the right checks (in web mode it also warns if a stale local vault is shadowing the remote). verify-sharing writes a sentinel to the remote and prints a search term to run in another client (e.g. Claude Desktop) — if it shows up there, that client is wired to the same vault. Clean up with mnemon verify-sharing --cleanup.
MCP Tools
Retrieval
Tool | Description |
| Hybrid BM25 + vector search with composite scoring (relevance + recency + confidence) |
| Fetch a specific memory by ID with full content |
| Recent memories in reverse chronological order |
| Find memories related to a given memory via the relationship graph |
Mutation
Tool | Description |
| Store a new memory with content type classification and auto-embedding |
| Pin a memory to boost confidence and prevent archival |
| Soft-delete a memory (marked as invalidated, not physically removed) |
Standing tier (salience)
Tool | Description |
| Promote a memory to the standing tier — always-on context, injected regardless of query |
| Demote a standing memory back to situational (relevance-ranked) recall |
| List the current standing-tier memories |
Lifecycle
Tool | Description |
| Vault health stats — counts by type, vectors, pinned/invalidated |
| Archive stale memories past their half-life (dry-run by default) |
| Re-embed all documents (use after upgrading embedding model) |
| Export stored embeddings (e.g. for analysis or visualization) |
| Export a 2-D PCA projection of the vault's embeddings — the dashboard Graph page's scalable path for large remote vaults |
| Export every relation edge between live documents in one call, for the Graph page's edge overlay |
Intelligence
Tool | Description |
| Check a memory for conflicts using vector similarity + NLI classification ( |
| Synthesized user profile from stored preferences and decisions |
| Manually add a fact to the user profile |
Memory Types
Each memory has a content type that determines its default confidence and decay half-life:
Type | Default Confidence | Half-Life | Use for |
| 0.85 | Never | Architectural choices, design decisions |
| 0.80 | Never | User workflow habits, style preferences |
| 0.80 | Never | Things that failed, approaches to avoid |
| 0.70 | 90 days | Learned facts, discovered behaviors |
| 0.70 | 90 days | Investigation results, findings |
| 0.65 | 120 days | Project status, goals, context |
| 0.60 | 30 days | Session summaries for continuity |
| 0.50 | 60 days | General notes, default type |
Memories with access activity decay slower — each access extends the effective half-life by 10%, up to 3x the base value.
Claude Code Hooks
When configured via mnemon setup, the following hooks are installed on Claude Code:
Hook | Event | Timeout | Mode | Description |
Health warm-keeper |
| 40s | remote only |
|
Context surfacing |
| 8s | both | Searches vault and injects relevant memories as context |
Session pre-warm |
| 90s | remote only | Polls |
Session extractor |
| 30s | both | Extracts decisions, preferences, and observations from the transcript |
Handoff generator |
| 30s | both | Creates a session summary for the next session |
The extractor and handoff generator use LLM-based extraction when mnemon[llm] is installed, with regex/heuristic fallback otherwise.
Why a warm-keeper if Fly auto-stops?
A self-hosted mnemon Fly app with autostop enabled (fly.toml.example defaults to auto_stop_machines = "suspend" — RAM-snapshot/resume in ~1s, so the OAuth token refresh on wake stays under the connector timeout) will idle the machine after a few minutes. The warm-keeper resets Fly's idle timer on every prompt, so the machine stays warm during an active Claude Code session and only autostops once you've been idle for a while. Cost stays the same — Fly bills only running time — but you get reliable mid-session access without paying for an always-on machine. The || true ensures a slow Fly cold-start never blocks your prompt.
What if a cold-stop happens anyway?
The server persists every issued MCP session ID to <vault_dir>/mcp_sessions.sqlite (7-day TTL). When a request bearing a known-but-not-in-memory session ID arrives at a fresh process — typical after a cold-stop or redeploy — the session is transparently resumed: a new transport is spawned with the same ID, and the underlying ServerSession is born already-initialized so tool calls succeed without a re-handshake. The MCP client sees no break in continuity. This is the safety net under the warm-keeper, not a replacement for it.
Claude Desktop and other MCP clients
The Claude Code hooks above give unconditional pre-LLM retrieval — every prompt triggers a memory_search before the model sees the question, and the results are injected into context — and unconditional session capture: the Stop-event hooks (session_extractor, handoff_generator) write observations and a session handoff to the vault without the model having to decide anything. No other MCP client supports either flow today, including Claude Desktop, claude.ai web, the Claude mobile app, Cursor, and Gemini CLI. The write gap is easy to miss: on every non-Code client, a substantive session produces zero saved memories unless the model chooses to call memory_save or you ask it to.
Why: the hooks work because Claude Code exposes lifecycle events (UserPromptSubmit, Stop) that run a subprocess around the model invocation. Desktop and the other clients only expose the standard MCP surfaces — tools (model-decided), prompts (user-invoked via slash menu), and resources (client-pulled). None of these fire automatically on every prompt or at session end, so there is no architectural place for an MCP server to insert "always-on" recall or capture. Aggressively rewriting the memory_search/memory_save tool descriptions to coerce the model into calling them is rejected by design — it pollutes the tool surface for every other consumer and is still model-decided.
Closest practical workaround
Same snippet for every non-Code client — paste it into whichever custom-instructions / rules / memory surface that client exposes:
Before responding to any of my prompts, call the
memory_searchtool from the mnemon MCP server using relevant terms from my question. Use the returned memories to inform your response. Ifmemory_searchreturns nothing useful, proceed without it.When a conversation reaches a durable outcome — a decision made, a diagnosis reached, a purchase, a preference stated, or any result I'd want a future session to know — call the
memory_savetool from the mnemon MCP server with a concise title and content,content_typeset todecision,preference, orhandoffas appropriate, andsource_clientset to the name of this client (e.g."claude-ai"). Do not save small talk or ephemeral Q&A.
Client | Need custom instructions? | Where to paste |
Claude Code | No — the | — |
Claude Desktop | Yes | Settings → Profile → "What personal preferences should Claude consider in responses?" |
claude.ai (web) | Yes | Same Profile field as Desktop — it's shared across your Anthropic account. Per-Project instructions also work and override the Profile within that Project. |
Claude mobile app | Yes | Inherits from the same Profile field — set it once on Desktop or claude.ai and mobile picks it up. |
Cursor | Yes | Settings → Rules → User Rules (global) or a |
Gemini CLI | Yes |
|
In every non-Code client both calls are still model-decided — it will skip the search on short prompts or follow-ups, and it will sometimes end a session without saving anything. Not a substitute for real lifecycle hooks; it converts "never" into "usually," which is the best any MCP-only client can offer today.
When the true fix lands
Anthropic would need to add pre-prompt and session-end lifecycle hooks to Claude Desktop — the Desktop-side equivalents of Claude Code's UserPromptSubmit and Stop. Once those surfaces exist, mnemon's existing context_surfacing, session_extractor, and handoff_generator hooks can be wired to them directly. Until then, Claude Code is the only client with guaranteed pre-LLM injection and guaranteed session capture; everywhere else, both retrieval and saving are model-decided.
Uninstall
Remove mnemon state from this machine. Nothing user-owned in the cloud is touched.
mnemon uninstall [--yes] [--keep-vault]What mnemon uninstall removes
~/.mnemon/— vault (SQLite + vectors), archive/, remote_url, local_token, models cache. With--keep-vault, this directory is preserved.Claude Code MCP registration (
claude mcp remove --scope user mnemon).mnemon hook + mcpServers entries in
~/.claude/settings.json.mnemon entry in
~/.cursor/mcp.json.mnemon entry in Claude Desktop's config.
What mnemon uninstall does NOT touch
The
mnemon-memoryPython package. Usepip uninstall mnemon-memoryseparately.Your Fly.io app. Destroy it first with
mnemon downgrade local --destroy-fly-appif you want the app gone — that pulls the remote vault back to local so no memories are lost.Your S3 bucket contents. mnemon has no
sync delete.claude.ai + Claude mobile MCP entries. These live in your Anthropic account.
claude mcp listshows them with aclaude.aiprefix. Remove via Settings → Connectors in the claude.ai web UI. Ifmnemon uninstalldetects one, it surfaces a⚠ REQUIREDbullet pointing you there.
Memory retention matrix
Command | Local | Fly volume | S3 bucket contents |
| deleted (unless | untouched | untouched |
| untouched | untouched | untouched |
| replaced with Fly state (via S3 pull) | untouched (keeps running) | untouched |
| replaced with Fly state | destroyed (after data was pulled to local) | untouched |
| archived to | newly created, seeded from S3 | written to (push) |
| read/write local | — | read/write |
Memories are always recoverable as long as at least one of {S3 backup, Fly volume, local vault, local archive} exists.
Common flows
Test from scratch on one machine:
mnemon uninstall --yes
pip install -e . # or: pip install mnemon-memory
mnemon setupStop using mnemon entirely:
mnemon downgrade local --destroy-fly-app # tears down Fly, preserves vault via S3 pull
mnemon uninstall --yes # removes local state
pip uninstall mnemon-memory # removes the package
# Then remove mnemon entries in claude.ai and the Claude mobile app manually.
# Delete your S3 bucket contents if you want no residual memory data.Move to a new machine (preserve all memories):
# Old machine:
mnemon sync push
mnemon uninstall --yes
# New machine:
pip install mnemon-memory
mnemon setup claude-code --remote-url https://<your-app>.fly.dev/mcpInstall troubleshooting
Intel Mac + Python 3.12: pip install "mnemon-memory[ui]" fails building llvmlite / numba
The [ui] extra pulls in umap-learn, which requires numba + llvmlite. Starting with numba 0.63, those packages only ship macOS wheels for Apple Silicon (arm64). On an Intel Mac (x86_64), pip falls back to a source build and fails with llvmlite needs CMake tools to build.
Pin to the last versions that ship x86_64 macOS wheels:
pip install 'numba==0.62.1' 'llvmlite==0.45.1' 'mnemon-memory[ui]'If pip then complains about NumPy, add 'numpy<2.3' to the same command.
Apple Silicon, Linux, and Windows are unaffected — prebuilt wheels exist on those platforms.
Development
pip install -e ".[dev]"
pytestLicense
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityBmaintenanceA self-hosted MCP memory server that gives AI assistants persistent, semantic memory by storing facts as vector embeddings locally, supporting semantic search and swappable embedding models.Last updated161MIT
- Alicense-qualityBmaintenanceA self-hosted MCP memory server with hybrid semantic and keyword search, providing persistent memory for AI coding assistants like Claude Code, Cursor, and Windsurf.Last updated263MIT
- Alicense-qualityBmaintenanceA local-first memory MCP server that enables storing, searching, and managing personal memories with hybrid keyword and semantic recall, all on-device.Last updated50MIT
- Alicense-qualityBmaintenanceA self-hosted MCP server that provides a personal semantic memory layer for AI tools. It enables storing, searching, and managing memories using hybrid vector and keyword search, allowing AI assistants to recall information by meaning.Last updatedMIT
Related MCP Connectors
Cloud-hosted MCP server for durable AI memory
User-owned memory for AI agents, Copilot, Claude, IDEs, CLIs, and chat apps over remote MCP.
Token-efficient MCP memory for Markdown vaults. Tiered search, GraphRAG, AI memories.
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/nousergon/mnemon'
If you have feedback or need assistance with the MCP directory API, please join our Discord server