Skip to content

dlrik/claude-code-memory-transformer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 

Repository files navigation

CCR Memory Transformer

A custom Claude Code Router (CCR) transformer that injects persistent memory context into every Claude Code session.

Universal by design — works with any memory service implementing a simple /context/inject endpoint. Includes setup guide for Mnemi-ai.

What it does

Every time Claude Code makes an API request, this transformer:

  1. Extracts the user's message
  2. Queries your memory service via POST /context/inject
  3. Injects the returned memory context as a system message

This gives the model awareness of facts, entities, and context from previous sessions.

Architecture

Claude Code → CCR → Memory Transformer → OpenRouter → Model
                         ↑
                  Memory Service
                  /context/inject

Requirements

  • Claude Code Router installed
  • A memory service implementing the /context/inject endpoint (see below)
  • Node.js

Quick Start

1. Install CCR Memory Transformer

mkdir -p ~/.claude-code-router/transformers
cp memory-transformer.js ~/.claude-code-router/transformers/

2. Configure CCR

Add to your ~/.claude-code-router/config.json:

{
  "transformers": [
    {
      "path": "/path/to/memory-transformer.js"
    }
  ],
  "Providers": [{
    "name": "openrouter",
    "api_base_url": "https://openrouter.ai/api/v1/chat/completions",
    "api_key": "sk-or-v1-YOUR-KEY",
    "models": ["qwen/qwen3.6-plus:free"],
    "transformer": { "use": ["openrouter", "memory"] }
  }],
  "Router": {
    "default": "openrouter,qwen/qwen3.6-plus:free"
  }
}

3. Start CCR

ccr start
ccr code

Memory Service Contract

The transformer expects any memory service to implement:

POST /context/inject

Request:

{
  "query": "user's current message (for relevance scoring)",
  "entity": "user identifier (e.g., 'doug')",
  "max_tokens": 8000
}

Response:

{
  "context": "--- memory_context\n...\n--- end memory_context ---",
  "overflowed": false
}

That's it. Any service that returns this contract can be used with this transformer.

Configuration

The transformer reads from environment variables:

Variable Default Description
MEMORY_SERVICE_URL http://localhost:8765 Base URL of memory service
MEMORY_SERVICE_ENDPOINT /context/inject Endpoint path
MEMORY_ENTITY doug User/entity identifier
MEMORY_MAX_TOKENS 8000 Max tokens for context

Example:

export MEMORY_SERVICE_URL="http://your-memory-service:8080"
export MEMORY_ENTITY="alice"
export MEMORY_MAX_TOKENS="12000"

Mnemi-ai Setup

Mnemi-ai is a memory system that implements the /context/inject contract.

1. Install Mnemi

git clone https://github.com/yourusername/mnemi.git
cd mnemi
pip install -r requirements.txt
python server.py &

Mnemi runs on http://localhost:8765 by default.

2. Verify Mnemi is running

curl http://localhost:8765/health

3. Configure Transformer

export MEMORY_SERVICE_URL="http://localhost:8765"
export MEMORY_SERVICE_ENDPOINT="/context/inject"
export MEMORY_ENTITY="doug"
export MEMORY_MAX_TOKENS="8000"

4. Restart CCR

ccr restart
ccr code

Mnemi API

Mnemi provides:

  • POST /context/inject — Returns formatted memory context
  • GET /facts?query=&entity=&limit= — Query stored facts
  • GET /graph/neighbors?entity= — Entity relationships
  • GET /vec/search?query=&top_k= — Semantic vector search
  • GET /episodes/recent?limit= — Session summaries

See Mnemi docs for full API.

Memory Context Format

The injected context looks like:

--- memory_context
[entity_graph]
user likes: coffee, coding, memory systems

[facts]
  [8] user is a software engineer
  [7] prefers working in the morning

[episodes]
[2026-04-04] Set up CCR with OpenRouter...

[recent_messages]
  assistant: here's the memory system design
  user: perfect, let's implement it

--- end memory_context ---

You have the above memory context from previous sessions. Use it to inform your responses.

Behavior

  • Non-fatal: If the memory service is unavailable, requests continue without memory context
  • No errors shown: The model simply won't have memory context for that request
  • Token budget: Configurable via MEMORY_MAX_TOKENS

Files

memory-transformer.js   # The CCR transformer (universal)
.env.example            # Environment variable template
README.md              # This file

Create Your Own Memory Service

Implement the contract in any language:

@app.post("/context/inject")
def inject_context(request: ContextInjectRequest):
    # Query your memory store (SQLite, ChromaDB, etc.)
    facts = search_facts(request.query, request.entity)
    graph = get_entity_neighbors(request.entity)
    episodes = get_recent_sessions(request.entity)

    context = format_context(facts, graph, episodes)
    return {"context": context, "overflowed": False}

Return a formatted string under the "context" key.

License

MIT

About

Universal CCR transformer that injects memory context into Claude Code sessions

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors