Shared, live team memory for Claude — a remote MCP server on Cloudflare Workers + D1.
Everyone's Claude Code writes what it learns; everyone reads it. One live source, global at the edge. When one teammate figures something out, the whole team's Claude knows it.
A distributed team using Claude Code (or any MCP client) keeps re-learning the same things. Each person's assistant has its own local memory — decisions, gotchas, conventions — and none of it is shared. Memory-MCP is a tiny, self-hostable server that gives the whole team one shared memory their AI assistants can read and write through the Model Context Protocol.
- Index-first / lazy-body — a session starts with lightweight titles only; full bodies are fetched on demand. Token-efficient.
- Verified authorship — the author of every note comes from the token, not the client. It can't be forged.
- Accent/case-insensitive search — full-text search folds diacritics and case (built with Turkish in mind, works for any Latin script).
- History + soft-delete — every change is archived; deletes are reversible.
- Secret guard — key/token/password-shaped content is rejected, so secrets never land in shared memory.
Each teammate's Claude Code ──(.mcp.json, personal Bearer token)──▶ Worker /mcp ──▶ D1 (memories + FTS5 + history)
SessionStart hook (optional) ─(curl)──────────────────────────────▶ Worker /index ──▶ budgeted title list
- Worker — a single Cloudflare Worker.
/mcpspeaks MCP (streamable HTTP, via a Durable Object);/indexis a plain REST endpoint for a lightweight title list. - D1 — SQLite at the edge. One
memoriestable + an FTS5 search index + amemory_historyaudit table.
Prerequisites: a Cloudflare account, Node.js 18+, and Wrangler (npx wrangler login).
# 1. Install
git clone https://github.com/CedraInteractive/Memory-MCP.git
cd Memory-MCP
npm install
# 2. Create the D1 database, then paste the printed database_id into wrangler.jsonc
npx wrangler d1 create memory-mcp
# 3. Apply the schema (remote)
npm run db:init
# 4. Set the team token(s) — see "Identity" below
npx wrangler secret put AUTH_TOKENS # {"tok_alice_...":"alice","tok_bob_...":"bob"}
# 5. Deploy
npm run deployWrangler prints your worker URL, e.g. https://memory-mcp.<your-subdomain>.workers.dev.
Give each teammate their own token. AUTH_TOKENS is a JSON map of token → author:
{ "tok_alice_a1b2c3...": "alice", "tok_bob_d4e5f6...": "bob" }Because the author is resolved server-side from the token, notes are attributed reliably and you can revoke one person by removing their entry and redeploying. (A single shared AUTH_TOKEN is also supported — author becomes shared.)
Generate a token however you like, e.g.:
node -e "console.log('tok_alice_'+require('crypto').randomBytes(16).toString('hex'))"Copy .mcp.example.json to your project's .mcp.json (or your global config), fill in your subdomain, and set the MEMORY_MCP_TOKEN environment variable to your personal token:
{
"mcpServers": {
"memory": {
"type": "http",
"url": "https://memory-mcp.<your-subdomain>.workers.dev/mcp",
"headers": { "Authorization": "Bearer ${MEMORY_MCP_TOKEN}" }
}
}
}Restart Claude Code — the memory_* tools are available. Just talk to it: "search the team memory for the deploy steps", "save this to team memory: …".
To surface memory titles at the start of every session, add a SessionStart hook that curls the index:
curl -s -H "Authorization: Bearer $MEMORY_MCP_TOKEN" \
https://memory-mcp.<your-subdomain>.workers.dev/indexThis returns a lightweight, character-budgeted title list (no bodies) — cheap on tokens.
| Tool | What it does |
|---|---|
memory_search(query, limit?) |
Full-text search (accent/case-insensitive); lightweight rows |
memory_get(name) |
Full body of one note (lazy) |
memory_upsert(name, description, body, type?, status?, project?) |
Write/update; author is automatic; secrets rejected; prior version archived |
memory_delete(name) |
Soft-delete (reversible; archived to history) |
memory_restore(name) |
Restore a soft-deleted note |
memory_history(name, limit?) |
Version history — who changed what, when |
memory_recent(since?, limit?) |
What changed mid-session |
GET /index |
REST title list (for the SessionStart hook) |
Fields. status: preferred (confirmed) · tentative (needs review) · contested (conflicting). type: feedback · reference · project · shared.
npm test # pure-logic tests (fold, secret guard, index budget) — Node's built-in runner
npm run typecheck # tsc --noEmit
npm run dev # wrangler dev (local)The pure logic (src/lib.ts) is worker-independent and unit-tested; the worker/MCP wiring lives in src/index.ts.
- All requests require a Bearer token. For a stricter setup (e.g. a team on a private network), put the worker behind Cloudflare Access so there is no public endpoint.
- The secret guard is defense-in-depth, not a vault — never rely on it to scrub real secrets. Keep credentials out of memory entirely.
- Deletes are soft (recoverable) and every change is auditable via
memory_history.
MIT — see LICENSE.