chat-recall

Giving Claude Code memory with an MCP server

Claude Code already remembers some things. An MCP memory server covers what it does not, and wiring one in is two files and one shape — plus a trap that reports success and gives you nothing.

What Claude Code remembers without help

Auto memoryNotes it writes to itself under the project, keyed to the git repository. One repo, one machine, one tool. Where it stops.
CLAUDE.mdStanding rules you write deliberately, in version control, read at the start of a session.
claude --continueReopens the last session in the current directory. Resumes; does not search.

None of the three answers a question about work you did last month, in another repository, in another tool. That gap is what a memory server is for, and it is why the assistant needs a tool it can call mid-task rather than a file it reads once at startup.

Where the configuration lives

Claude Code reads MCP servers from two files, both keyed under mcpServers:

~/.mcp.jsonThe file most setup instructions mean. A project can carry its own .mcp.json as well.
~/.claude.jsonUser level, and also where Claude Code keeps its opt-outs, in disabledMcpServers.

The entry

~/.mcp.json
{
  "mcpServers": {
    "chat-recall": {
      "command": "chat-recall-mcp"
    }
  }
}

Four keys are meaningful: command, an optional args array, an optional env object, and alwaysAllow, a list of read-only tools the client may call without asking each time. npx chat-recall init writes this for every AI tool it finds on the machine, merging into the file rather than replacing it, and it preserves an alwaysAllow list you have curated by hand.

When it registers and no tools appear

This is the failure worth knowing about in advance, because every surface reports success.

An entry carrying "disabled": true reads as configured. Sweeping four MCP clients with deliberately broken shapes, all four answered that the server was already configured, and then no tools showed up in the session. Cursor and Antigravity honour that key and skip the server. Claude Code ignores it entirely, because its own opt-outs live in disabledMcpServers in ~/.claude.json — so on Claude Code the key does nothing while still looking like the cause.

If the tools are missing, check three things in this order: the entry has no disabled key, the server name is absent from disabledMcpServers, and the file you edited is one of the two above.

what is actually wired up
$ chat-recall doctor
  login, server, credentials, hooks and the MCP server — per profile

Per profile matters: CLAUDE_CONFIG_DIR relocates the whole config root, so a second profile is a second set of everything.

The other tools do not use this shape

Worth knowing if you are wiring more than one by hand, because copying the Claude entry across does not work:

OpenCodeKeys servers under mcp, takes the command as an argv array, and needs type: local and enabled: true before it will spawn one.
CodexTOML. ~/.codex/config.toml, under [mcp_servers.<name>].
Cursor, AntigravityThe same mcpServers shape, and both honour disabled.

Which server to put there

That is a different question from this one, and the answer depends on whether you want facts you state on purpose or history you recover. The three kinds of MCP memory server is the comparison; the tool list for this one is what the assistant gets to call.

Wire it up with one command View the history you already have

Questions

How do I give Claude Code memory with an MCP server?Add an entry under mcpServers in ~/.mcp.json naming the server command, then restart the session. npx chat-recall init writes that entry for every AI tool it finds on the machine and merges into the existing file.
Which file does Claude Code read MCP servers from?Two: ~/.mcp.json and ~/.claude.json, both under an mcpServers key. A project can also carry its own .mcp.json. Claude Code keeps its opt-outs separately, in disabledMcpServers inside ~/.claude.json.
What does an MCP server entry look like?An object under mcpServers named for the server, with command, an optional args array, an optional env object, and alwaysAllow listing read-only tools the client may call without prompting each time.
My MCP server is configured but no tools appear. Why?Most often a disabled: true key on the entry. Tested across four clients, all four reported the server as already configured and then exposed no tools. Cursor and Antigravity honour that key; Claude Code ignores it and uses disabledMcpServers in ~/.claude.json instead.
Is an MCP memory server the same as a Claude Code plugin?MCP is the mechanism a plugin would use. The server runs as its own process and the assistant calls its tools during a conversation, so it works in any tool that speaks MCP rather than only in Claude Code.
Do I still need CLAUDE.md and auto memory?Yes. CLAUDE.md holds standing rules where your team can review them, auto memory covers preferences within one repository, and a memory server covers what neither does: what you actually did, in other repositories and other tools.
How do I check the server is really wired up?chat-recall doctor reports login, server, credentials, hooks and the MCP server, and it reports them per profile. That last part catches the case where CLAUDE_CONFIG_DIR gave you a second config root you forgot about.

More notes

How to view your Claude Code session historyClaude Code keeps every session as a JSONL file on disk. Two built-in commands show you part of it, the files show you the rest, and neither one searches.
Claude Code session history disappeared: four reasonsFour things make Claude Code sessions vanish from the picker, and only one deletes anything. Check the other three before you conclude the work is gone.
Cursor chat history: where it lives and how to read itCursor keeps chat history in two different SQLite databases depending on whether you used the IDE or the CLI, and it has moved the IDE format three times.