No description
Find a file
deprekated f81f745869 list_bins: return the full live index
The mcp-auth-proxy initializes stdio upstreams once at proxy start and
re-serves statelessly, so the index embedded in the MCP instructions is
a snapshot from the last restart. list_bins now returns the full fresh
index (files, dates, one-line summaries) so a current view is always
one cheap call away; instructions text notes the snapshot semantics.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 19:20:45 +02:00
.gitignore claude-memory-mcp: persistent cross-instance memory over MCP 2026-07-13 19:06:18 +02:00
flake.lock claude-memory-mcp: persistent cross-instance memory over MCP 2026-07-13 19:06:18 +02:00
flake.nix claude-memory-mcp: persistent cross-instance memory over MCP 2026-07-13 19:06:18 +02:00
README.md list_bins: return the full live index 2026-07-13 19:20:45 +02:00
server.mjs list_bins: return the full live index 2026-07-13 19:20:45 +02:00

claude-memory-extension

A zero-dependency MCP server that gives Claude instances (Cowork, Claude Code, Claude Desktop, …) persistent, shared, file-based memory across sessions.

Memories are plain markdown files on disk, grouped into bins — one directory per project or topic. The connecting Claude instance chooses its own bin (a short kebab-case slug), so different instances working on the same project converge on the same memory. Each memory file uses the same frontmatter convention as Claude Code's built-in per-project memory:

---
name: short-kebab-slug
description: one-line summary used for recall
metadata:
  type: user | feedback | project | reference
---

The fact itself, with [[links]] to related memories.

The server's MCP instructions are generated at connect time and embed a live index of every bin and memory (filename, last-modified date, one-line summary from the frontmatter description or first line), followed by terse rules: read relevant bins before re-deriving work, capture at the moment of discovery, never store mutable state or secrets, tag provenance, re-verify before high-stakes use, and fix wrong entries immediately. A connecting instance starts every session already seeing what exists, without extra prompting.

Storage

Default root: ~/.claude/cowork-memory/<bin>/<file>.md Override with the CLAUDE_MEMORY_ROOT environment variable.

Everything is plain markdown — inspect, edit, or version it with normal tools.

Tools

Tool Purpose
list_bins Return the current full index (bins, files, dates, summaries)
list_memories List a bin's files with created/updated dates and frontmatter descriptions
read_memory Read one file
search_memory Case-insensitive literal search across all bins (or one), compact bin/file:line output
write_memory Create/overwrite a file; creates the bin if needed
append_memory Append text to a file without resending its content (cheap index updates)
delete_memory Remove an obsolete or wrong memory

Bin and file names are validated against [A-Za-z0-9._-] slugs; path traversal is rejected.

Setup

Requires Node ≥ 18. No install step — the server is a single file.

Claude Code:

claude mcp add --scope user memory -- node /home/deprekated/Projects/home/claude-memory-extension/server.mjs

Cowork / Claude Desktop (or anything using the standard MCP JSON config), add under mcpServers:

{
  "memory": {
    "command": "node",
    "args": ["/home/deprekated/Projects/home/claude-memory-extension/server.mjs"]
  }
}

Smoke test

printf '%s\n' \
  '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"t","version":"0"}}}' \
  '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"list_bins","arguments":{}}}' \
  | node server.mjs