Skip to main content
Glama
README.md
# ๐Ÿงช Distill

[![CI](https://github.com/5queezer/distill/actions/workflows/ci.yml/badge.svg)](https://github.com/5queezer/distill/actions/workflows/ci.yml)
![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue)
[![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE)

An MCP server that gives Claude Code a shared team knowledge base โ€” a local LLM transforms your raw input into anonymous, factual knowledge *before* anything leaves your device.

No author. No frustration. No names. Just a clean, reusable fact.

![Distill demo โ€” raw thought to clean team fact](https://raw.githubusercontent.com/5queezer/distill/main/docs/demo.gif)

![Raw input โ†’ local Ollama โ†’ review โ†’ team DB or discard](https://raw.githubusercontent.com/5queezer/distill/main/docs/flow.svg)

## Quick Start

```bash
pip install distill-mcp
ollama pull gemma3:4b && ollama pull nomic-embed-text
claude mcp add distill -- python -m distill_mcp
```

Then in Claude Code:

```
You:    "No, we don't use REST here. We switched to gRPC last month."

Claude: [saves to distill]
        Got it. I've noted that the team uses gRPC, not REST.

        ... next session, different repo ...

You:    "Set up the API for this new service."

Claude: [searches distill โ†’ finds gRPC decision]
        Based on your team's knowledge, I'll set up a gRPC
        service since the team switched from REST last month.
```

Distill saves when you correct a mistake or make a decision, and searches before proposing architecture โ€” no prompting needed.

## What makes this different

Every "memory MCP" stores your raw text in a database. Distill doesn't. The local LLM is a mandatory privacy gateway that transforms personal thoughts into impersonal team knowledge.

|  | Raw stays local | LLM distills | Team sync | Platform agnostic |
|--|----------------|-------------|-----------|-------------------|
| Claude-Mem | Partial (`<private>` opt-out) | Cloud API compresses | Single-user | Claude Code only |
| Cipher | No | No | Yes | No |
| Supermemory | No | No | Yes | No |
| Mem0 | Yes | No | No | Yes |
| Memctl | Yes | No | Yes | Yes |
| **Distill** | **Yes** | **Yes** | **Yes** | **Yes** |

Based on public documentation as of March 2026.

## Documentation

- [Getting Started](https://5queezer.github.io/distill/tutorials/getting-started/) โ€” full tutorial
- [Installation](https://5queezer.github.io/distill/how-to/installation/) โ€” all setup options
- [GCP Backend](https://5queezer.github.io/distill/how-to/gcp-backend/) โ€” team-shared database
- [MCP Tools](https://5queezer.github.io/distill/reference/tools/) โ€” all 8 tools
- [Configuration](https://5queezer.github.io/distill/reference/configuration/) โ€” environment variables
- [Architecture](https://5queezer.github.io/distill/explanation/architecture/) โ€” Clean Architecture design
- [Privacy Model](https://5queezer.github.io/distill/explanation/privacy-model/) โ€” how your data stays private

## Development

```bash
git clone https://github.com/5queezer/distill.git
cd distill
uv sync
uv run pytest tests/ -x -v
```

## License

[MIT](LICENSE)

TDQS

A4.2/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct aspect of memory management: search, retrieval by ID or batch, listing recent or stale, forgetting, updating with lineage, and tracing lineage. There is no ambiguity between tools.

Naming Consistency5/5

Tool names follow a consistent verb_noun pattern in snake_case (search_memory, get_memories, list_recent, update_memory, etc.), with 'list_' and 'get_' prefixes clearly indicating the action.

Tool Count5/5

Eight tools cover the core memory operations without being excessive or insufficient. Each tool serves a clear purpose in the memory lifecycle.

Completeness4/5

The surface covers most operations (search, retrieve, list, forget, update, lineage). The only noticeable gap is the lack of a dedicated create_memory tool, though update_memory might double as creation in some contexts.

Maintenance

ActivityInactive
ResponsivenessResponsive