AI Memory Hub
This server gives AI tools a shared, governed persistent memory over MCP, backed by Markdown files in an Obsidian vault.
memory_search(query, limit)— search persistent memory before answering.memory_read(path)— read one vault memory Markdown file.memory_propose(...)— validate a durable memory candidate; auto mode writes it, review mode queues it.memory_supersede(...)— replace an old memory with a new fact (queued in review mode).memory_forget(memory_id)— delete a stored memory by ID.memory_audit()— check file/index integrity without modifying memory.memory_reindex()— rebuild the SQLite search index from the Markdown vault.memory_policy()— retrieve the retention policy and current write mode.
Registers the shared memory server with Hermes Agent and installs a behavioral skill that lets the agent read and write memories.
Supports JetBrains AI as a memory client, allowing it to search and contribute to the shared vault.
Enables the ChatGPT desktop app to use the same shared memory vault through OpenAI's Secure MCP Tunnel.
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., "@AI Memory HubSave that I prefer concise code examples in Python to my memory."
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.
AI Memory Hub
One shared, persistent memory for every AI tool you use — Claude, ChatGPT, Gemini, Qwen, Kimi, Codex, Cursor, and anything else that speaks MCP.
Stop re-explaining who you are to every AI assistant. AI Memory Hub gives them one governed, human-readable memory store that lives in a plain Obsidian vault on your own machine — no cloud account, no vendor lock-in, nothing leaves your computer unless you connect a remote model yourself.
Supported AI tools at a glance
Tool | Transport | Connected by | Notes |
Claude Code | stdio | ||
Codex CLI | stdio | ||
Qwen Code | stdio | ||
Gemini CLI | stdio | if installed | |
Kimi Code | stdio | edits | |
Hermes Agent | stdio | registers the MCP server and installs the behavioral skill | |
ChatGPT (desktop app) | Streamable HTTP, via OpenAI's Secure MCP Tunnel | needs a one-time OpenAI account setup first | |
Cursor, Windsurf, JetBrains AI, or anything else MCP-capable | stdio | ||
ChatGPT, or any tool without MCP access at all | — | fully local fallback, works with any tool |
Related MCP server: second-brain-mcp
Contents
Why this exists
Every AI tool you use today remembers you differently — or not at all. Tell Claude you're a Python developer on Windows, and ChatGPT still asks the next day. AI Memory Hub fixes that by giving every MCP-capable AI tool read/write access to one shared memory, governed by a single set of rules:
You own the data. It's plain Markdown in a folder you control — open it in Obsidian, edit it in Notepad, back it up however you like.
No AI gets unrestricted write access. Every proposed memory passes through validation, secret-rejection, and deduplication before it touches disk.
You decide how automatic it is. Start in
reviewmode and approve everything by hand; graduate toautoonce you trust it.
How it works
flowchart TD
subgraph Clients["Your AI tools"]
direction LR
C1["Claude Code"]
C2["Codex"]
C3["Gemini / Qwen CLI"]
C4["Kimi Code"]
C5["ChatGPT / Cursor / other"]
end
Clients -->|MCP over stdio| Hub
subgraph Hub["AI Memory Hub"]
direction TB
V["validation"] --> S["secret rejection"]
S --> D["deduplication"]
D --> L["per-file locking"]
L --> I["SQLite search index"]
end
Hub --> Vault[("Obsidian Vault<br/>plain Markdown, fully yours")]
style Vault fill:#2e7d32,color:#fff,stroke:#1b5e20
style Hub fill:#1565c0,color:#fff,stroke:#0d47a1The Obsidian vault is always the source of truth. The SQLite index is disposable — delete .memory_index.sqlite3 any time and rebuild it from the Markdown with one command.
A typical turn — an AI checking memory before answering, then proposing a new fact afterward — looks like this:
sequenceDiagram
actor U as You
participant AI as AI Tool
participant Hub as AI Memory Hub
participant Vault as Obsidian Vault
U->>AI: Ask a question
AI->>Hub: memory_search(query)
Hub->>Vault: read matching files
Vault-->>Hub: relevant facts
Hub-->>AI: search results
AI-->>U: Answer, informed by memory
Note over AI,Hub: Later in the conversation
AI->>Hub: memory_propose(fact)
Hub->>Hub: validate + reject secrets + dedupe
alt write mode = auto
Hub->>Vault: write immediately
else write mode = review
Hub->>Hub: queue for your approval
U->>Hub: approve in dashboard
Hub->>Vault: write on approval
endFeatures
🔌 MCP server —
memory_search,memory_read,memory_propose,memory_supersede,memory_forget,session_write,propose_pattern_match,memory_audit,memory_reindex,memory_policy📥 Review history — review queue shows open, rejected, and approved proposals, with filters for those three statuses
🐛 Issue tracking — GitHub issues #2–#12 track bug fixes, with #12 covering session-write validation; planned improvements are tracked in roadmap #13 and issues #14–#18
🗂️ Obsidian vault as the canonical, human-readable store
🛡️ Secret rejection — blocks probable passwords, API keys, private keys, seed phrases, card numbers
🔁 Deduplication & conflict review — duplicate text is rejected across the vault; conflict candidates are limited to singleton facts (
profile,preference) with the same subject, while log-like kinds can accumulate distinct facts🗃️ Fragmentation-resistant project routing — a new subject that's a hyphen-prefixed variant of an existing project file (e.g.
widget-app-ui→widget-app.md) is folded into it instead of forking a new file🕐 Full local timestamps on every entry's create/edit, not just the date (old date-only entries stay valid and parseable)
🖥️ Redesigned local dashboard (
127.0.0.1only) — sidebar navigation with live counts, in-page modals, toast feedback, kind filters, subject-grouped lists with the newest entry first in each group and one most-recent marker per group, and a readable audit view🔒 Origin-protected dashboard API — every state-changing request is checked against the
Host/Originheaders and a random per-launch token, so binding to localhost isn't the only thing standing between the vault and a rogue page in your browser🧰 System-tray launcher for Windows
🤖 One script to connect every AI tool you have installed, including Codex as a recognized writer identity
📜 Optional transcript ingestion for clients that can't call MCP tools directly, via any local server that exposes a standard chat-completions API — Ollama, LM Studio, llama.cpp, vLLM, and similar (nothing has to leave your machine)
✅ 37 unit tests covering the manager, dashboard workflows, session summaries, pattern-linked memories, conflict resolution, secret detection, and file-locking edge cases, run on every push/PR via GitHub Actions (Windows + Ubuntu, Python 3.10-3.12)
Requirements
Windows 10/11 (macOS/Linux work via
setup.sh, but the automation scripts here target Windows)Python 3.10+ (3.12 recommended)
PowerShell — either the Windows PowerShell 5.1 that ships with Windows, or PowerShell 7+; every
.ps1script here is written to run on bothAn Obsidian vault, or any plain folder you're willing to treat as one
The official Python MCP SDK v2 (
mcp>=2,<3, installed automatically)For ChatGPT specifically:
tunnel-clientand an OpenAI account with API access — optional, only needed for a live connection
Quick start
One line, if you don't have a copy of the repo yet — downloads it (via git clone if you have git, otherwise a plain zip, no dependencies either way), then runs setup and connects every AI CLI it finds, using the default paths (%USERPROFILE%\ai-memory-hub and %USERPROFILE%\Documents\Obsidian\AI-Memory):
irm https://raw.githubusercontent.com/vib28/ai-memory-hub/master/install.ps1 | iexWant a custom install/vault path instead of the defaults? | iex alone can't take parameters — build a scriptblock from the downloaded script and invoke that instead:
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/vib28/ai-memory-hub/master/install.ps1))) `
-InstallPath "C:\Tools\ai-memory-hub" -VaultPath "C:\Users\YOU\Documents\Obsidian\AI-Memory"Or clone it yourself and run each step by hand:
# 1. Clone
git clone https://github.com/vib28/ai-memory-hub.git
cd ai-memory-hub
# 2. Install — creates a virtual environment and initializes your vault
.\setup.ps1 -VaultPath "C:\Users\YOU\Documents\Obsidian\AI-Memory"
# 3. Connect every AI tool this machine has installed
.\connect-ai-tools.ps1 -VaultPath "C:\Users\YOU\Documents\Obsidian\AI-Memory"
# 4. Open the dashboard
.\start-dashboard.ps1 -VaultPath "C:\Users\YOU\Documents\Obsidian\AI-Memory"Either way, that's it — start a new conversation in Claude Code, Codex, Qwen Code, or Kimi Code and mention a durable fact about yourself. It'll show up in the dashboard's review queue.
Already have a copy and just want the latest version? Re-run the one-liner (or & ([scriptblock]::Create(...)) form) with the same -InstallPath — it updates a git-based install in place instead of re-downloading.
Want the click-by-click version, including installing Python and Obsidian from scratch? See INSTALLATION_GUIDE.md or the 5-minute QUICK_START.md.
Connect your AI tools
Overview
connect-ai-tools.ps1 is the one-shot setup script. Run it after setup.ps1 and it will:
Detect which supported AI CLIs are installed on the machine.
Register
ai-memory-hubas an MCP server for each one it finds (user/global scope — works from any project directory).Install the matching behavioral prompt from
client-prompts/into that tool's global instructions file, so it knows to search and propose memories on its own.
.\connect-ai-tools.ps1 -VaultPath "C:\Users\YOU\Documents\Obsidian\AI-Memory"
# Or start in fully automatic mode instead of review:
.\connect-ai-tools.ps1 -VaultPath "C:\Users\YOU\Documents\Obsidian\AI-Memory" -WriteMode autoThe script is idempotent — re-running it never double-registers, and an already-registered server is reported as [connected], not an error. Every supported tool is attempted independently, so one failure never blocks the rest.
Tool | Auto-connected by the script? | Instructions file written |
Claude Code | ✅ |
|
Codex CLI | ✅ |
|
Qwen Code | ✅ |
|
Gemini CLI | ✅ (if installed) |
|
Kimi Code | ✅ |
|
Hermes Agent | ✅ (if installed) — also installs a skill |
|
Most of these launch the server themselves as a local stdio subprocess — the script just tells each one what command to run. Their installs differ in a few small but real ways; the per-tool sections below call out what's unique to each. ChatGPT's desktop app is the one that works fundamentally differently (a network tunnel rather than a local subprocess); see ChatGPT (desktop app).
Claude Code
The standard stdio case. The script runs Claude Code's own mcp add with -s user (global scope) so the server is available from any directory, then appends the claude.md instructions block to ~/.claude/CLAUDE.md under a managed AI_MEMORY_HUB_PROMPT marker. Writer identity is claude.
If Claude Code is already registered, its CLI exits non-zero with "already exists" — the script recognizes that and reports [connected] rather than a failure. Nothing to do on your end beyond running the script and starting a new session.
Gemini CLI
Gemini is wired up the same way as Claude Code — its mcp add is invoked and gemini.md is written to ~/.gemini/GEMINI.md, writer identity gemini. One difference matters in practice:
Workspace trust. Gemini disables all MCP servers — including user-level ones like this one — in any folder it doesn't yet trust, to prevent an untrusted project from silently running tools. The first time you launch
geminiin a given folder, answer its workspace-trust prompt (or pass--skip-trustfor a one-off session). Rungemini mcp listany time to check whetherai-memory-hubshows as enabled or disabled for the folder you're in.
Qwen Code
Also the standard stdio path — qwen mcp add plus qwen.md written to ~/.qwen/QWEN.md, writer identity qwen. No tool-specific quirks.
Codex CLI
Codex accepts its environment differently from the other CLIs, so the script invokes it with repeated --env KEY=VALUE flags rather than -e, and it locates the codex.exe binary explicitly (the bare codex command on Windows is a .ps1 wrapper that mangles a literal --). codex.md is written to ~/.codex/AGENTS.md, writer identity codex.
Kimi Code
Kimi is the outlier: it has no mcp add CLI command yet, so the script edits ~/.kimi-code/mcp.json directly — inserting an ai-memory-hub entry with the Python command, args, and env. Because it edits a config file rather than calling a command, re-running simply overwrites that one entry. kimi.md is written to ~/.kimi-code/AGENTS.md, writer identity kimi. If an existing mcp.json isn't valid JSON, the script backs it up to a timestamped .bak before rebuilding, rather than crashing.
Hermes Agent
Hermes Agent (Nous Research's agent — CLI, desktop app, or messaging gateway) joins the same shared memory through its native MCP client. It's wired up by the same connect-ai-tools.ps1 as the other CLIs — when the hermes CLI is on PATH, the script does two things for it:
Registers
ai-memory-hubas an MCP server in Hermes' config, pointing at this repo's.venvand your vault. On Hermes' next session the tools appear asmcp_ai_memory_hub_memory_search,mcp_ai_memory_hub_memory_propose, etc.Installs a behavioral skill — Hermes does not read
client-prompts/; the equivalent mechanism is a skill (aSKILL.mdunder Hermes'skills/directory) that auto-loads into a session whenever the task involves durable user context. The skill encodes the same search/propose rules asclient-prompts/hermes.md, so Hermes searches the vault and proposes durable memories without being told "remember this" — matching the other clients.
So there's no separate command — just run the normal one, and Hermes is picked up alongside everything else if it's installed:
.\connect-ai-tools.ps1 -VaultPath "C:\Users\YOU\Documents\Memory"
# Or fully automatic mode instead of review:
.\connect-ai-tools.ps1 -VaultPath "C:\Users\YOU\Documents\Memory" -WriteMode autoPrerequisites: this repo's .venv (run .\setup.ps1 first) and the hermes CLI on PATH. The script is idempotent — re-running it leaves an already-registered server alone and simply refreshes the installed skill to this repo's copy.
How it works, concretely:
The MCP server is launched as a local stdio subprocess. Hermes deliberately filters the subprocess environment, so the script passes the vault path, writer identity, and write mode explicitly via
--env(which must appear before--args, or the flags are swallowed into the args list and the server silently loses its vault).Hermes prefixes MCP tools
mcp_{server}_{tool}, so it's registered under the distinct server nameai_memory_hub(underscore) rather than theai-memory-hubthe other CLIs use — avoiding a hyphen-to-underscore collision in tool names.The skill is copied to
<Hermes-home>/skills/productivity/ai-memory-hub/SKILL.md, where<Hermes-home>is resolved fromhermes config path. Hermes discovers skills by scanning that directory; a new session auto-loadsai-memory-hubwhen relevant.Writer identity is
hermes— a first-classALLOWED_WRITERSvalue — so entries you approve carry ahermessource tag, exactly likeclaude,codex, etc.
Verify any time:
hermes mcp list
hermes mcp test ai_memory_hubImportant: Hermes reads its MCP server list once, at session start. If you have a Hermes session already open, close it and start a new one — it won't see
ai-memory-hubuntil it does. Sessions started after the script pick it up automatically, and the skill auto-loads on its own.
Already have a session open?
Every tool above reads its MCP server list once, when that session starts — none of them watch their config file for changes mid-session. So after running connect-ai-tools.ps1 (or connect-chatgpt-tunnel.ps1), any Claude Code, Gemini CLI, Qwen Code, Codex CLI, Kimi Code, or Hermes Agent session you already had open needs a new session before it can see ai-memory-hub — close that chat and run the same command again to start a fresh one. This isn't reinstalling or restarting an application, just starting a new conversation; a session you open after running the script picks it up immediately, no action needed. ChatGPT is the exception — there's no "session" to restart, just enable the connector once in Settings as described above and the running tunnel stays connected.
Refresh revised instructions
After updating this project, rerun connect-ai-tools.ps1 — it replaces the managed AI Memory Hub instruction block in each detected CLI's global instructions file and refreshes Hermes' installed skill. Then start a new session in Claude Code, Codex, Qwen, Gemini, Kimi Code, or Hermes Agent. For ChatGPT, paste the current client-prompts/chatgpt.md into Custom Instructions and begin a new conversation. Manually configured MCP hosts likewise need their updated prompt saved and a new session or reload.
vault_template/ is used only when a vault is initialized; it never overwrites existing vault files. To adopt a revised AI_INSTRUCTIONS.md in an existing vault, review the template and merge its guidance into your vault's copy without replacing your memory content.
ChatGPT (desktop app)
ChatGPT's connector protocol itself only speaks Streamable HTTP — but OpenAI now ships an official, first-party bridge called Secure MCP Tunnel that connects Developer Mode directly to a local stdio server like this one, outbound-only, with nothing exposed to the public internet. That's the supported way to get ChatGPT calling memory_search/memory_propose live, and connect-ai-tools.ps1 can't set it up on its own because the last mile — creating a tunnel ID and an API key — happens in your browser, against your OpenAI account.
flowchart LR
G["ChatGPT Developer Mode"] -->|Streamable HTTP| OA["OpenAI's tunnel endpoint"]
OA -.->|outbound-only,<br/>no inbound exposure| TC["tunnel-client<br/>(runs on your machine)"]
TC -->|stdio| Local["memory_hub.mcp_server"]One-time account setup (do this in your browser)
Create a Runtime API key — platform.openai.com/settings/organization/api-keys, with the Tunnels Read + Use permissions.
Create a tunnel ID — platform.openai.com/settings/organization/tunnels. It looks like
tunnel_followed by 32 lowercase letters/digits — copy it exactly.Install
tunnel-clientfor Windows from the openai/tunnel-client releases page (grabtunnel-client-<version>-windows-amd64.zip, or-arm64on ARM) and add its folder toPATH.
Connect it
.\connect-chatgpt-tunnel.ps1 -VaultPath "C:\Users\YOU\Documents\Obsidian\AI-Memory" `
-TunnelId "tunnel_0123456789abcdef0123456789abcd12" `
-ApiKey (Read-Host "Runtime API key")This configures a tunnel-client profile that launches memory_hub.mcp_server as a stdio subprocess (the same way the other tools do it), runs doctor to validate it, and starts the tunnel. Leave the window open — closing it disconnects ChatGPT. Re-running the script updates the same profile (--force), so it's safe to use again after changing your vault path or write mode. Then in ChatGPT: Settings → Connectors → Advanced → Developer mode → + → Connection: Tunnel → select ai-memory-hub.
Give it the behavior prompt the same way as any other tool: client-prompts/chatgpt.md, pasted into ChatGPT's custom instructions. Start a new ChatGPT conversation afterward so the revised instructions are in its context.
Verified against
tunnel-clientv0.0.14 on Windows. If OpenAI changes the CLI, re-check the flags withtunnel-client init --help/doctor --help/run --help.
No account access, or don't want a live connection? See Transcript ingestion below — it needs zero extra setup and stays fully local.
Connect any other MCP tool
Anything that can launch an MCP server over stdio can join the same shared memory. There's no CLI automation for these (each has its own settings UI/file), but the setup is always the same three steps:
Point it at the server. Copy
examples/mcp-host-config.example.json, then set only your Python path, vault path, writer identity, and write mode in the host's MCP settings. The configuration contains no credentials.Give it the behavior prompt. Paste
client-prompts/generic.mdinto that tool's system/custom-instructions field, and swap theMEMORY_WRITERvalue at the bottom to match what you set above. If the tool is one already listed inclient-prompts/(Claude, Codex, Qwen, Gemini, Kimi, Hermes), use its dedicated file instead — it's identical except for the writer identity.Restart the tool so it picks up the new MCP server, then ask it something a durable memory would help with.
Transcript ingestion (no live MCP connection needed)
For any tool that can't call MCP directly — ChatGPT without the tunnel set up, a chat UI you only ever copy/paste from, an old export you're archiving — transcript ingestion gets memories out of a conversation with zero extra setup. It's already built into the CLI and stays fully local.
python -m memory_hub.cli --vault "<vault>" ingest .\conversation.txt --writer chatgptCopy a conversation into conversation.txt, point MEMORY_LLM_BASE_URL at a local model (see Connect Ollama or LM Studio below), and candidates get extracted and validated exactly like anything proposed over MCP — nothing leaves your machine.
--writer preserves the built-in client identities (chatgpt, claude, codex, gemini, kimi, qwen, cursor, hermes, user, or other) in the stored source: tag. Unknown values are recorded as other.
Connect Ollama or LM Studio
Ollama and LM Studio aren't AI agents — they're local model servers, so they don't call MCP tools on their own. What they're for here is powering the optional transcript extractor, which lets a tool that can't call MCP directly (a chat UI you just copy/paste from, for example) still get memories out of a conversation — entirely on your machine, with nothing sent anywhere.
The extractor is platform-agnostic: it just sends a POST request to /chat/completions with a messages array and reads back a choices[0].message.content reply — the same request/response shape used by Ollama, LM Studio, llama.cpp's server, vLLM, LocalAI, and most other local model runners. Point it at any server that speaks that shape:
flowchart LR
T["conversation.txt<br/>(any saved transcript)"] --> CLI["memory_hub.cli ingest"]
CLI -->|"chat/completions"| Local["Local model server<br/>(Ollama or LM Studio)"]
Local -->|"durable memory candidates"| CLI
CLI --> V["validate + reject secrets<br/>+ dedupe (same as MCP path)"]
V --> Vault[("Obsidian Vault")]Ollama:
$env:MEMORY_LLM_BASE_URL = "http://localhost:11434/v1"
$env:MEMORY_LLM_MODEL = "llama3.1" # any model you've pulled with `ollama pull`
python -m memory_hub.cli --vault "<vault>" ingest .\conversation.txt --writer chatgptLM Studio:
$env:MEMORY_LLM_BASE_URL = "http://localhost:1234/v1"
$env:MEMORY_LLM_MODEL = "<the model name shown in LM Studio's local server tab>"
python -m memory_hub.cli --vault "<vault>" ingest .\conversation.txt --writer chatgptMake sure the server is actually running first — Ollama via ollama serve (or it's already running if you've used ollama run), LM Studio via its "Local Server" tab. The extractor asks the model to return only durable-memory candidates; those still pass through the same validation, secret-rejection, and deduplication as anything proposed over MCP — a local model gets no more trust than a remote one.
Local models are recommended here specifically when privacy matters — the transcript never leaves your machine.
Write modes: review vs. auto
review (recommended to start): AI-proposed memories wait in the dashboard's review queue. You approve or reject with one click. Nothing reaches your vault without your say-so.
auto: valid proposals are written to the vault immediately.
flowchart LR
P["memory_propose(...)"] --> OK{"passes validation,<br/>secret check, dedupe?"}
OK -- no --> R["rejected, nothing written"]
OK -- yes --> Mode{"MEMORY_WRITE_MODE"}
Mode -- auto --> W["written to vault immediately"]
Mode -- review --> Q["queued in dashboard"]
Q --> A{"you approve?"}
A -- yes --> W
A -- no --> X["discarded"]Run with review for a week or two, watch what each AI actually tries to remember, then flip to auto once you trust the pattern:
.\connect-ai-tools.ps1 -VaultPath "<vault>" -WriteMode autoSession summaries
Clients can write a four-section session summary with session_write: Investigated, Learned, Completed, and Next Steps. Empty individual sections are allowed; a summary is rejected only when all four sections are empty.
Session summaries are stored in a running file per writer, such as /sessions/codex.md, and are searchable through the same SQLite-backed memory_search index. If a project is supplied, the summary also creates a linked project entry.
Session writes follow the global write mode. In review mode, session_write returns status: queued and the summary must be approved in the dashboard before it appears in the vault. In auto mode, it returns status: stored and writes immediately. Always inspect the application-level status; a successful MCP transport call alone does not mean that memory was persisted. Rejected writes now surface their reason as an MCP tool error.
Roadmap and planning
The approved improvement roadmap is tracked in GitHub:
Use an issue for each independently testable improvement, and update the roadmap issue when implementation, tests, documentation, and a pull request are complete. The source planning documents currently live outside the repository on the maintainer's workstation; copy stable versions into docs/plans/ when they should be reviewed by collaborators.
The dashboard
.\start-dashboard.ps1 -VaultPath "C:\Users\YOU\Documents\Obsidian\AI-Memory"Opens http://127.0.0.1:8765 — bound to localhost only, never exposed to your network. Every state-changing request also carries a random token generated at launch and is checked against the Host/Origin headers, so a malicious page you have open in another tab can't silently approve/reject/forget/edit entries just because the dashboard happens to be running. It's organized as a sidebar with live counts per section, and from there you can:
browse everything stored, grouped by subject with the newest entry listed first within each group, and the clock marker only on that group's newest entry
search across the vault
edit a stored fact in place, via an in-page modal (no browser
prompt()/confirm()popups)forget an entry after a confirmation, with toast feedback on success/failure
filter by kind using the filter chips
review and approve/reject queued proposals
see likely conflicts (same subject, competing facts, flagged only for singleton-fact kinds like
profile/preference) with a "🕐 Most recent" badge, and resolve them by choosing the current versionrun a vault/index audit, shown as a readable summary instead of raw JSON
Run a reindex through memory_reindex() or python -m memory_hub.cli --vault "<vault>" reindex.
-VaultPath is optional — omit it and the script defaults to %USERPROFILE%\OneDrive\Documents\Memory.
Prefer a system-tray icon instead of a browser tab left open?
.\start-tray.ps1 -VaultPath "C:\Users\YOU\Documents\Obsidian\AI-Memory"(Same default applies here if -VaultPath is omitted.)
MCP tools exposed
Tool | Purpose |
| Search the vault without reading everything |
| Read one indexed memory file |
| Propose a durable memory; written immediately or queued, depending on write mode |
| Write a four-section session summary; stored immediately or queued, depending on write mode |
| Propose a linked project fact and global preference rule for a configured pattern |
| Delete a specific memory by its stable ID |
| Mark an old memory superseded and record the new fact |
| Check for duplicate IDs, missing index entries, malformed entries, index drift |
| Rebuild the disposable SQLite index from Markdown |
| Return the automatic-retention rules to the host model |
Every write acquires a per-file lock, re-reads the current file, applies a surgical line-level change, atomically replaces the file, and refreshes the index — so multiple AI tools can share the vault without stepping on each other. If a writer is killed mid-write, the lock it left behind is detected as stale (its PID is no longer running) and stolen by the next writer instead of blocking every future write on that file forever.
Memory format & routing
Each stored fact carries a stable ID and provenance so any tool can later update or forget the exact entry without relying on fuzzy text matching:
- [preference] Prefers detailed financial analysis with explicit valuation comparisons. <!-- mem:9f831ab2c7e1 source:chatgpt subject:financial-analysis date:2026-09-04T14:30:00 -->Facts are routed to one canonical home by kind:
Kind | File |
profile |
|
preference |
|
person |
|
project |
|
topic |
|
decision |
|
session |
|
New and edited entries receive local timestamps with second precision; date-only legacy entries remain readable. A project first uses an exact matching file. Otherwise, a hyphen-segment prefix match routes to the shortest existing project file (widget-app-ui routes to widget-app.md); unrelated shared-prefix projects stay separate. A caller may explicitly set target_path, which is validated to stay inside the vault and bypasses automatic routing. Existing fragmented files are not merged automatically.
Safety
The manager rejects probable:
passwords
API keys / tokens
private keys
seed phrases
card numbers (require card-shaped formatting and a Luhn checksum, so ordinary long IDs/number ranges aren't flagged)
government/account identifiers, when obvious
AI_INSTRUCTIONS.md and MEMORY.md are reserved: no target_path can point a proposed memory at either, so no connected client can plant persistent instructions into the files every other tool reads as canon.
This is defense-in-depth, not a certified DLP system. Don't use the vault as a secret manager.
CLI reference
# Activate the environment first
.\.venv\Scripts\Activate.ps1
# Initialize a vault
python -m memory_hub.cli --vault "<vault>" init
# Add a fact by hand
python -m memory_hub.cli --vault "<vault>" propose `
--writer chatgpt --kind preference --tag preference `
--subject response-style `
--text "Prefers concise answers first, followed by optional technical detail."
# Search
python -m memory_hub.cli --vault "<vault>" search "response style"
# Audit / reindex
python -m memory_hub.cli --vault "<vault>" audit
python -m memory_hub.cli --vault "<vault>" reindex
# Optional: extract memories from a saved transcript via a local chat-completions server
$env:MEMORY_LLM_BASE_URL = "http://localhost:11434/v1"
$env:MEMORY_LLM_MODEL = "your-model-name"
python -m memory_hub.cli --vault "<vault>" ingest .\conversation.txt --writer chatgptRun the MCP server directly (normally your AI host launches this for you):
$env:AI_MEMORY_VAULT = "<vault>"
$env:MEMORY_WRITER = "claude"
python -m memory_hub.mcp_serverProject layout
ai-memory-hub/
├─ memory_hub/ # manager, vault, index, security, MCP server, dashboard, tray, CLI
├─ vault_template/ # the Markdown skeleton a fresh vault is seeded with
├─ client-prompts/ # per-tool behavioral instructions (claude, codex, qwen, gemini, kimi, hermes, chatgpt, generic)
├─ hermes/ # Hermes Agent skill source (skills/ai-memory-hub/SKILL.md), installed by connect-ai-tools.ps1
├─ examples/ # sample transcript + generic MCP host config
├─ tests/ # unit tests (unittest)
├─ .github/workflows/ci.yml # GitHub Actions: runs the test suite on push/PR (Windows + Ubuntu, Python 3.10-3.12)
├─ install.ps1 # one-line irm | iex bootstrap: download + setup + connect
├─ setup.ps1 / setup.sh # create venv, install deps, initialize the vault
├─ connect-ai-tools.ps1 # detect installed AI CLIs and wire them all up at once
├─ connect-chatgpt-tunnel.ps1 # bridge to ChatGPT via OpenAI's Secure MCP Tunnel
├─ start-dashboard.ps1 # launch the local review dashboard
├─ start-tray.ps1 # launch the Windows system-tray version
├─ INSTALLATION_GUIDE.md # full guided walkthrough
├─ QUICK_START.md # 5-minute version
└─ FIXLOG.md # dated log of bug/security fixes, most-to-least importantReliability: what happens when something goes wrong
The setup scripts are written so a failure is loud and specific, never silent — and so one tool's problem doesn't take the rest of the run down with it.
flowchart TD
Start(["connect-ai-tools.ps1"]) --> Claude["Try: Claude Code"]
Start --> Gemini["Try: Gemini CLI"]
Start --> Qwen["Try: Qwen Code"]
Start --> Codex["Try: Codex CLI"]
Start --> Kimi["Try: Kimi Code"]
Start --> Hermes["Try: Hermes Agent"]
Claude -->|"exit code checked"| R1{"ok?"}
R1 -- yes --> C1["[connected]"]
R1 -- no --> F1["[failed] — reason captured, others unaffected"]
Kimi --> K1{"mcp.json valid?"}
K1 -- yes --> C2["[connected]"]
K1 -- no --> K2["back up the bad file,<br/>rebuild fresh, continue"]
K2 --> C2
Hermes --> H1{"already registered?"}
H1 -- no --> H2["hermes mcp add + install skill"]
H1 -- yes --> H2
H2 --> C3["[connected] + [skill]"]
C1 --> Summary["Summary printed for every tool"]
F1 --> Summary
C2 --> Summary
C3 --> Summary
Summary --> Exit{"any [failed]?"}
Exit -- yes --> E1["exit code 1"]
Exit -- no --> E0["exit code 0"]What that means in practice:
A failed native command is never mistaken for success.
$ErrorActionPreference = "Stop"only catches PowerShell's own errors — it does nothing for a.exe/.cmdthat exits non-zero. Every script checks the actual exit code after calling Python, pip, or an AI tool's CLI, rather than assuming the next line means everything worked.One tool's failure doesn't block the rest.
connect-ai-tools.ps1tries Claude, Gemini, Qwen, Codex, Kimi, and Hermes independently. If one genuinely fails, it's reported as[failed]with the reason, and the others still get attempted."Already connected" isn't treated as an error. Some CLIs (Claude Code, for one) exit non-zero when the server is already registered. That's recognized and reported as
[connected], not[failed].A corrupted config gets backed up, not blown away. If Kimi's
mcp.jsonisn't valid JSON (hand-edited and broken, for instance), the script copies it to a timestamped.bakfile next to it and rebuilds a fresh config, rather than crashing or silently overwriting something you might have wanted to recover.Scripts are safe to run again. Re-running
connect-ai-tools.ps1after changing your vault path or write mode just re-registers everything.connect-chatgpt-tunnel.ps1passes--forcetotunnel-client initfor the same reason — without it, a second run fails outright with "profile already exists".connect-ai-tools.ps1exits with code1if anything failed,0if everything succeeded — safe to check in a script or CI job, not just by reading the summary.Every fix here was verified against the real thing, not just written to look right — including deliberately corrupting a config file to confirm the recovery path actually recovers, and running the ChatGPT tunnel script against the real
tunnel-clientbinary, which caught a genuine bug: it parses--mcp-commandwith shell-word rules where\is an escape character, silently eating a Windows-style path. Fixed by passing that path with forward slashes instead, which Windows accepts natively.
Troubleshooting
"running scripts is disabled on this system" — allow locally created scripts for your account:
Set-ExecutionPolicy -Scope CurrentUser RemoteSignedA CLI wasn't picked up by connect-ai-tools.ps1 — the script only wires up a tool it can find on PATH. Install/open a fresh terminal so PATH refreshes, then re-run the script — it's safe to run repeatedly.
Index looks wrong / out of sync — delete .memory_index.sqlite3 inside your vault and run:
python -m memory_hub.cli --vault "<vault>" reindexWant to verify the install — run the test suite:
.\.venv\Scripts\Activate.ps1
python -m unittest discover -s tests -vContributing
Issues and pull requests are welcome. Please don't include real personal data, credentials, or vault contents in any issue, PR, or test fixture — use the placeholder conventions already in examples/ and client-prompts/.
License
Available Tools
8 toolsmemory_auditA
Check file/index integrity without modifying memory.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden of disclosing behavioral traits. It explicitly discloses non-modification and specifies the scope as file/index integrity, which is valuable safety-relevant context. It does not describe output format or error behavior, but for a zero-parameter audit the core behavioral trait is adequately disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence that front-loads the action and includes the key non-modification caveat. Every word earns its place, with no filler, redundancy, or unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no parameters, the description is nearly complete for invocation: it states what the tool checks and its side-effect profile. The main gap is the lack of detail about return values or behavior when integrity issues are found, but that is not essential for an agent to select and invoke a zero-argument audit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero properties, so there are no parameter semantics to document. Per the zero-parameter baseline, the description need not add parameter detail, and the schema description coverage is effectively complete. The description also confirms the tool requires no configuration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Check') and resource ('file/index integrity'), and explicitly frames the operation as non-modifying. This clearly distinguishes it from sibling tools that mutate memory, such as memory_forget and memory_supersede, and from memory_read which would retrieve content rather than audit integrity. The purpose is immediately apparent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when a read-only integrity check is needed and the 'without modifying memory' qualifier suggests it is safe to run. However, it does not explicitly state when not to use it or name alternatives such as memory_reindex for repairing integrity issues or memory_read for retrieving memory content. Usage routing is left mostly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_forgetA
Delete one persistent memory by its stable memory ID.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It clearly states the destructive action and the target ('one persistent memory'), which is essential. But it does not disclose whether the deletion is permanent/irreversible, whether related references are affected, or any confirmation/auth requirements for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. Every word earns its place: verb, resource, scope, and identifier type are all present and immediately readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter, no output schema, no annotations) and the description covers the essential call. However, it leaves gaps around the outcome/return value, irreversibility, and how this deletion relates to sibling operations like memory_supersede or memory_policy. A brief note on permanence would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only provides the parameter name and type for memory_id with 0% description coverage. The description adds meaningful semantics by specifying it is a 'stable memory ID' for a persistent memory, helping the agent understand what value to supply. It omits format/examples, but for a single string parameter this is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Delete'), names the resource ('persistent memory'), and identifies the exact selection criterion ('stable memory ID'). This makes the tool's purpose unmistakable and distinguishes it from sibling tools like memory_search, memory_read, and memory_supersede, which are not destructive deletion operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage context is implied: call this tool when you have a stable memory ID and want to delete that memory. However, the description does not explicitly say when not to use it or provide alternatives, such as memory_supersede for updating/replacing a memory rather than deleting it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_policyA
Return the automatic persistent-memory retention policy and active write mode.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral transparency burden. It clearly signals a read-only introspection operation via 'Return' rather than 'set', 'update', or 'create', and it specifies the two pieces of state returned: retention policy and active write mode. This is sufficient for a zero-parameter getter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence contains exactly the necessary information: the action and the returned data. There is no filler, no redundancy, and no buried context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-argument, read-only policy tool with an output schema, the description is nearly complete. It could briefly explain what 'active write mode' means or note when to prefer this over memory_audit, but nothing required to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters and schema coverage is trivially complete, so there are no argument semantics for the description to add. The baseline of 4 for a zero-parameter tool applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Return') and names a precise resource: the automatic persistent-memory retention policy and active write mode. This is distinct from the sibling memory_read, memory_search, memory_propose, and memory_audit tools, so an agent can identify what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to call this tool instead of memory_read, memory_search, or memory_audit. There are no exclusions, prerequisites, or routing hints, so the intended usage context must be inferred from the tool name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_proposeC
Validate a durable memory candidate. Auto mode stores it; review mode queues it.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | ||
| kind | Yes | ||
| text | Yes | ||
| subject | No | general | |
| target_path | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden. It does disclose the important side effects: auto mode persists the memory, review mode queues it. However, it omits details such as what validation means, what happens on invalid input, and whether the operation is idempotent or reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short and front-loaded, with both sentences contributing unique information. It is concise, though the extreme brevity comes at the cost of necessary behavioral and parameter context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with five parameters, no output schema, and no annotations, this description is not complete enough. It leaves mode selection, parameter meaning, validation behavior, and return values entirely unaddressed, requiring the agent to rely on guesses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description itself does not explain any of the five parameters. The agent is left to guess what 'text', 'kind', 'tag', 'subject', and 'target_path' represent, with no schema descriptions to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Validate') with a clear resource ('durable memory candidate') and adds tangible behavior: auto mode stores, review mode queues. This makes the tool's core function clear even though it does not directly contrast with sibling tools like memory_policy or memory_supersede.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions two modes but does not explain when either mode applies, how mode is chosen, or when an agent should use this tool instead of siblings like memory_read, memory_forget, or memory_supersede. There is no when-to-use guidance or exclusionary context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_readA
Read exactly one memory Markdown file. Path must be inside the vault.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral transparency burden. 'Read' clearly communicates a non-mutating operation, 'exactly one ... Markdown file' scopes the side-effect surface, and 'Path must be inside the vault' adds an important security boundary. It does not detail error behavior for missing or out-of-vault paths, but the output schema covers the return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences carry the entire definition with no filler. The main action is front-loaded, and the critical constraint follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with an output schema, the description covers the purpose, the target resource, and the critical path-boundary rule. The only visible gap is explicit sibling differentiation, which is more of a usage-guidelines issue than a completeness failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only provides a 'path' string with no description, so the description supplies the key semantic constraint: the path must be inside the vault and point to a memory Markdown file. It does not specify relative versus absolute path format or explicitly require a .md extension, but for a single simple parameter this is adequate compensation for the 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Read exactly one memory Markdown file.' It also adds a clear scope qualifier ('exactly one') and a boundary ('Path must be inside the vault'), which distinguishes it from broader search or batch operations among the sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: when you know a path and need to read a single memory file, use this tool. However, it does not explicitly mention alternatives such as memory_search for finding memories when the path is unknown, so the routing guidance is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_reindexA
Rebuild the disposable SQLite search index from the Markdown vault.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. 'Disposable' and 'from the Markdown vault' add useful context that the index is derived and reconstructable. However, it does not disclose whether the rebuild is destructive to the current index, whether it blocks, or any time/resource implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the action ('Rebuild') and includes the key object and source. There is no wasted wording; every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter maintenance tool, the description states the core purpose and data source, which is likely sufficient for selection. It omits explicit when-to-use guidance and side-effect details, though the 'disposable' qualifier partially compensates. The lack of an output schema means return values need not be described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description is not required to explain parameter behavior. It does add context about the index being disposable and derived from the vault, which helps an agent understand what the tool affects. This meets the baseline for a zero-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Rebuild') acting on a well-defined resource ('disposable SQLite search index') with a clear source ('from the Markdown vault'). It is clearly distinct from sibling tools like memory_search or memory_read, though it does not explicitly name any alternative or differentiator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for rebuilding the search index, but does not explicitly state when to use it (e.g., when the index is stale or after vault changes) or when to prefer an alternative. No exclusions or alternative tool references are given, leaving the 'when' to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_searchB
Search persistent memory. Prefer this before opening files.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only says 'Search persistent memory' and gives a usage preference; it does not state whether the operation is read-only, how results are ranked, how limit is applied, or what happens on no matches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded, and free of filler. Both sentences earn their place, though the content is too sparse in behavioral and parameter detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With two parameters, no annotations, and minimal description, the tool definition is incomplete. The output schema may cover return values, but an agent still lacks guidance on how queries are matched, how limit affects results, and when to choose memory_search over sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description mentions no parameters. Query and limit are left entirely to schema names and types, with no guidance on query construction, matching behavior, or limit semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Search') and resource ('persistent memory'), and the instruction to prefer it before opening files gives concrete context. It does not explicitly differentiate from sibling memory_read, but the search action is distinct enough to understand basic purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Prefer this before opening files' provides explicit when-to-use guidance. However, it does not mention when not to use the tool or compare it with sibling memory tools like memory_read, so it lacks full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_supersedeB
Supersede an old memory. In review mode the replacement is queued for approval.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | ||
| kind | Yes | ||
| text | Yes | ||
| subject | No | general | |
| target_path | No | ||
| old_memory_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses an important behavioral trait: in review mode the replacement is queued for approval. With no annotations, this is valuable. However, it does not explain what happens outside review mode, whether the old memory is deleted or archived, or any permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. The key behavioral note about review mode is included without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a mutation tool with no annotations, no output schema, and six parameters at zero schema coverage. The description is too sparse to guide correct invocation, especially regarding what the parameters mean and what happens outside review mode.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not compensate. It hints that old_memory_id refers to an old memory and text is the replacement content, but it leaves kind, tag, subject, and target_path semantically undefined. Required parameters are not explained beyond the overall operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'supersede an old memory'. This clearly indicates a replacement operation, which is semantically distinct from siblings like memory_forget or memory_propose. However, it does not explicitly name or contrast the sibling tools, so it lacks some differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to choose this tool over the other memory tools. It mentions review-mode behavior but does not state when superseding is appropriate versus proposing or forgetting. No alternatives or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
8 tool updates
v0.2.0- First observed
memory_audit - First observed
memory_forget - First observed
memory_policy - First observed
memory_propose - First observed
memory_read - First observed
memory_reindex - First observed
memory_search - First observed
memory_supersede
TDQS
Each tool targets a distinct operation: policy introspection, search, file read, write/propose, update/supersede, delete, integrity audit, and index rebuild. Memory_search vs memory_read and propose vs supersede are related but clearly separated by descriptions.
All tools share a consistent memory_ prefix and use clear snake_case action suffixes such as search, read, propose, supersede, forget, audit, and reindex. The pattern is predictable and uniform.
Eight tools is well within the ideal range and appropriate for a persistent memory hub. Each tool covers a distinct lifecycle or maintenance need without unnecessary bloat.
The core memory lifecycle is well covered: policy, search, read, create/propose, update/supersede, delete, audit, and reindex. The only minor gap is that review-mode approvals/rejections have no dedicated tool, though this is likely handled outside the agent workflow.
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 Connectors
- JustOnceOAuthai.justonce
Persistent memory for AI assistants — one shared, OAuth-secured vault for every MCP client.
Persistent memory for AI agents across Claude, ChatGPT and any MCP client.
- mcpOAuthai.butlerbrain
Persistent memory for AI assistants. Save once; recall from Claude, ChatGPT, or any MCP client.
- HeirmosOAuthcom.heirmos
Persistent memory shared across Claude, ChatGPT, Grok and other MCP clients.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search, read, and append content to notes in an Obsidian vault via the MCP protocol.5,784BSD Zero Clause
- AlicenseNot gradedqualityCmaintenanceTurns an Obsidian vault into semantic memory for coding agents, providing read-only semantic search and a human-approved write workflow via MCP.6MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that provides controlled read/write tools for managing local-first research memory in an Obsidian vault, enabling AI agents to maintain project context across sessions.111MIT
- FlicenseNot gradedqualityCmaintenanceEnables reading, writing, searching, and managing Obsidian vault notes through MCP tools and prompts, allowing AI agents to interact with local knowledge bases.-
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/vib28/ai-memory-hub'
If you have feedback or need assistance with the MCP directory API, please join our Discord server