Skip to main content
Glama

claude-memory

Memory + project tracking for Claude Code. One MCP server.

  • Semantic search over all past Claude Code transcripts — new sessions recall old ones, way past the context window

  • Durable notes (remember) — per-project or global

  • Structured tracking: projects → milestones → epics → tickets → todos, rendered as roadmap

  • Tracking items embedded into same vector space — tickets show up in semantic search

  • Per-project system prompts, stored in DB, injectable at session start

Stack: Voyage AI embeddings + Qdrant vector DB + SQLite + FastMCP. All free: Voyage free tier easily covers personal use, Qdrant Cloud free tier holds 1M vectors (or run local docker). $0 to operate.

Setup

Two keys:

git clone https://github.com/mathis-sperlich/claude-memory
cd claude-memory
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
cp .env.example .env
# fill VOYAGE_API_KEY, QDRANT_URL, QDRANT_API_KEY

Point SCAN_PROJECTS in ingest.py at your transcript dirs (Claude Code writes them to ~/.claude/projects/<encoded-project-dir>/*.jsonl).

Ingest

.venv/bin/python ingest.py --dry-run   # sanity-check chunking
.venv/bin/python ingest.py             # embed + upsert

Idempotent — re-runs only embed new chunks. Safe as cron job. Hourly launchd template: launchd/com.mathis.claude-memory.plist (edit paths, cp to ~/Library/LaunchAgents/, launchctl load).

Test retrieval from CLI:

.venv/bin/python query.py "how did the auth token refresh bug get fixed?"

Bad results? Lower MAX_CHUNK_CHARS in ingest.py, or try bigger EMBED_MODEL in .env and re-ingest with --reset.

Wire into Claude Code

~/.claude/settings.json:

{
  "mcpServers": {
    "claude-memory": {
      "command": "/path/to/claude-memory/.venv/bin/python",
      "args": ["/path/to/claude-memory/mcp_server.py"]
    }
  }
}

Restart Claude Code. Done — Claude now has query_history, remember, tracking tools, system-prompt tools.

Tools

Memory

Tool

Purpose

query_history(question, k=, project=, since=, kind=)

Semantic search over everything. kind: note, transcript, tracking, or subtype

list_recent_sessions(days=, project=)

What was I working on lately

remember(content, title=, tags=, project=)

Save durable note. project scopes it; omit → global (surfaces in every project's search)

list_notes(tag=, limit=) / forget(note_id)

Manage notes

Tracking

Hierarchy: project → milestone (optional) → epic → ticket → todo.

Tool

Purpose

create_project(name, description=)

Top of hierarchy

create_milestone(project, name, body=, target_date=)

What ships together

create_epic(project, title, body=, milestone=, priority=)

Group tickets toward goal

create_ticket(project, title, body=, epic=, priority=)

Unit of work

create_todo(project, title, body=, ticket=, priority=)

Small step

list_items(kind=, project=, status=, parent_id=)

Filtered list

get_item(id)

One item + children

update_item(id, status=, title=, body=, priority=, ...)

Partial update, errors on fields that don't apply

delete_item(id)

Delete. Projects must be empty first

get_roadmap(project)

Markdown roadmap: milestones → epics → tickets + progress

list_projects()

Every project name across all stores

status: open / in_progress / done. priority: P0P3.

System prompts

set_system_prompt(content, project=) / get_system_prompt(project=) / list_system_prompts() / delete_system_prompt(project=). Global + per-project layers, composed on read. Stored in tracking.db. Falls back to docs/usage.md when unset.

Hooks (optional, deterministic)

MCP tools fire when model decides. Hooks fire always. hooks/session_start.py injects current project's open tickets + system prompt at every session start:

{
  "hooks": {
    "SessionStart": [{
      "matcher": "*",
      "hooks": [{
        "type": "command",
        "command": "/path/to/claude-memory/.venv/bin/python /path/to/claude-memory/hooks/session_start.py"
      }]
    }]
  }
}

Remote access (optional)

Default = local stdio, zero network. Want same memory from claude.ai or other machines? HTTP transport + Cloudflare tunnel + GitHub OAuth with login allowlist:

.venv/bin/python mcp_server.py --transport http --port 8765

Full walkthrough incl. launchd services + self-healing watchdog: CLOUD_SETUP.md.

Notes

  • Privacy: Voyage sees text at embed time (no training on customer data per TOS), Qdrant Cloud stores vectors + payloads. Both concern you → local Qdrant + local embedder, same code.

  • Stalled embed requests bounded by VOYAGE_TIMEOUT / VOYAGE_MAX_RETRIES env vars (default 20s / 2).

-
license - not tested
-
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • The project brain for AI coding agents — memory, decisions, sprints, knowledge base via MCP.

  • Hosted MCP memory: save sessions/decisions once, search from Claude, Cursor, ChatGPT. EU-hosted FTS.

  • Shared, governed long-term memory for AI agents across tools and sessions via MCP and REST.

View all MCP Connectors

Latest Blog Posts

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/mathis-sperlich/claude-memory'

If you have feedback or need assistance with the MCP directory API, please join our Discord server