Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

madeleine

by fabianimvversion 0.2.0i★ –iRuns on your computer
Registry nameio.github.fabianimv/madeleine

Install

Overview

Description from the maker (original English)

Involuntary memory for agents: time, place, sound and IoT cues surface memories unasked

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs on your computer
  • Transport: stdio
  • Category: Search & AI memory

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 1 of 1 passed
  • Runs on your computer with your user’s permissions (files, network, apps).
  • You fill in yourself: MADELEINE_DB, MADELEINE_TEXT_BACKEND

You need

  • PyPIPython’s uv installed (for the uvx command)

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "madeleine": {
      "command": "uvx",
      "args": [
        "madeleine-mcp",
        "serve"
      ],
      "env": {
        "MADELEINE_DB": "your-value",
        "MADELEINE_TEXT_BACKEND": "your-value"
      }
    }
  }
}

Run this in your terminal

claude mcp add madeleine --env MADELEINE_DB=your-value --env MADELEINE_TEXT_BACKEND=your-value -- uvx madeleine-mcp serve

Fill in the empty values before running it.

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "madeleine": {
      "command": "uvx",
      "args": [
        "madeleine-mcp",
        "serve"
      ],
      "env": {
        "MADELEINE_DB": "your-value",
        "MADELEINE_TEXT_BACKEND": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "madeleine": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "madeleine-mcp",
        "serve"
      ],
      "env": {
        "MADELEINE_DB": "your-value",
        "MADELEINE_TEXT_BACKEND": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.

Your choice stays on this device in a cookie; no account needed.

Values you fill in

  • MADELEINE_DB env
    SQLite database path (default ~/.madeleine/madeleine.db)
  • MADELEINE_TEXT_BACKEND env
    auto | sentence-transformers | hash (offline lexical)

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Runs on your computer; the tool list appears in your AI app after you install it.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 8, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account fabianimv, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • – Not applicable

    Endpoint responds

    This one runs on your computer; there is no internet endpoint

  • – Not applicable

    Sign-in with OAuth

    Runs on your computer and uses local settings instead

  • … Not checked yet

    No hidden instructions in tool descriptions

    Runs on your computer; we can only read tool lists from internet endpoints

Compared with others in Search & AI memoryi

  • More stars than 0% of the other 5668 servers in this category
  • Published to the registry more recently than 95% of the other 5668 servers in this category
  • Basic checks equal to or better than 100% of the other 5668 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is madeleine safe?

It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

The registry does not list a required key, though some servers ask you to sign in on first use.

Does it run on my computer or in the cloud?

It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.2.0) reached the registry 2 days ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.

What can I use instead?

In the same category: Context7, Codebase Memory, Exa

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Context7

by upstash

Feeds AI the latest docs for libraries and frameworks before it answers, so code it writes does not use outdated, removed functions.

Computer or cloud★ 64,224MITUpdated yesterday
Install

Codebase Memory

by DeusData

Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.

Runs on your computer★ 48,148MITUpdated 21 days ago
Install

Exa

by exa-labs

Connect AI agents to Exa for web search, content fetching, and multi-step research.

Runs in the cloud★ 5,213MITUpdated 2 months ago
Install

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

madeleine

Involuntary memory for AI agents. A place, an hour, a sound, a photo or a sensor reading brings back a related memory on its own, without the agent having to ask. It works the way the taste of a madeleine brought back Proust's childhood.

Local-first (SQLite) · MCP server + Python library · no telemetry

Most agent memory is *voluntary*: the agent decides to search, writes a query, and gets results. madeleine adds the other pathway. Every memory is stored with the sensory fingerprint present when it was encoded: where, when, what was said, seen or heard. Incoming cues from webhooks, phones, smart homes and wearables are matched against those fingerprints all the time. When enough channels line up, the memory is queued as an involuntary recollection, and the agent receives it with its next prompt. This is *encoding specificity* applied to agents (concepts).

60-second quickstart

# 1. See the whole loop, offline (nothing is downloaded, nothing leaves your machine)

uvx madeleine-mcp demo

The demo remembers three moments. Then a cue arrives that carries only a place and a time of day: 30 m from grandmother's house, on a Sunday afternoon. The matching memory surfaces by itself, is delivered through the MCP tool pending_recollections, and does not fire again for a repeated cue:

[madeleine 0.80 via geo+time] Sunday afternoons in grandmother's kitchen: lime-blossom tea and a madeleine (2019-04-14)

channel similarity geo=0.97, time=1.00; salience x1.16, age decay x0.70

# 2. Give Claude Code the tools

claude mcp add madeleine -- uvx madeleine-mcp serve

  1. Let involuntary recollections reach every prompt. Add this to .claude/settings.json:
{"hooks": {"UserPromptSubmit": [{"hooks": [

{"type": "command", "command": "uvx madeleine-mcp hook claude-code", "timeout": 10} ]}]}}

The hook works even if your client ignores MCP notifications. See examples/claude_code for options such as --sense-prompt, which treats what you type as a cue too.

Other MCP clients

The server is a standard stdio MCP server (uvx madeleine-mcp serve), so any MCP client can use the seven tools. Involuntary delivery on every prompt (step 3 above) is built for Claude Code; in other clients the agent receives recollections by calling pending_recollections, which the server's instructions ask it to do at the start of each turn.

Claude Desktop, Cursor, VS Code, OpenCode, Docker

Claude Desktop (claude_desktop_config.json) and Cursor (~/.cursor/mcp.json):

{"mcpServers": {"madeleine": {"command": "uvx", "args": ["madeleine-mcp", "serve"]}}}

VS Code (.vscode/mcp.json):

{"servers": {"madeleine": {"type": "stdio", "command": "uvx", "args": ["madeleine-mcp", "serve"]}}}

OpenCode (opencode.json):

{

"$schema": "https://opencode.ai/config.json", "mcp": {"madeleine": {"type": "local", "command": ["uvx", "madeleine-mcp", "serve"], "enabled": true}} }

Docker (memories persist in the madeleine-data volume):

docker build -t madeleine-mcp https://github.com/fabianimv/madeleine.git

docker run -i --rm -v madeleine-data:/data madeleine-mcp # stdio MCP server

Semantic text needs the `[text]` extra. The base install is small and offline. Without

the extra, text is matched *lexically* by a hashing embedder, so "car" and "automobile"

count as unrelated. For real sentence embeddings (this pulls in PyTorch):

`bash

claude mcp add madeleine -- uvx --from 'madeleine-mcp[text]' madeleine-mcp serve

`

Images ([image], open_clip) and sound ([audio], LAION CLAP) are opt-in the same way.

[all] installs everything. Models download lazily on first use, never at import.

How it works

flowchart LR

subgraph Sources HA[Home Assistant] -->|webhook| HTTP IOS[iOS Shortcuts] -->|webhook| HTTP AG[Agent] -->|MCP tools| MCP end HTTP[HTTP API /cues] --> ENG MCP[MCP server] --> ENG subgraph ENG[engine] direction TB CH["channels adapter → embedder → similarity"] --> FU["fusion base · coverage · salience · decay"] FU --> RF{"push? threshold + refractory"} end ENG <--> DB[(SQLite + sqlite-vec)] RF -->|enqueue| Q[(recollection queue)] Q -->|drain| HOOK[Claude Code hook] Q -->|drain / notify| MCP

  • Channels are pluggable senses. Each one has an *adapter* (raw signal → normalised observation), an *embedder* (observation → vector) and a *similarity function* (→ [0, 1]). Built in: text, time (hour, weekday and season, all cyclical), geo (distance on the sphere), biometric, image, audio. smell is a documented stub for future e-noses.
  • Recall combines per-channel similarity over the channels the cue and the memory share, adjusts for how much of the cue is covered, boosts salient memories, and decays with age down to a floor, so decades-old memories stay reachable. The formula is short and explainable; every result says which channels matched (ADR 0001).
  • Two modes. *Pull*: the agent asks (recall). *Push*: a cue arrives (sense, POST /cues) and memories that clear the threshold are queued without anyone asking.
  • Habituation. A memory that fired stays quiet for a *refractory period* (default 6 h). Walking past the same café all afternoon reminds you of it once.
  • Context alone never fires. "It's 9 am" matches every memory made at 9 am, so time (and biometric) can strengthen a match but never cause one.

Sending cues

madeleine serve --transport http          # REST + MCP (streamable HTTP at /mcp/) on 127.0.0.1:8765

curl -s localhost:8765/cues -H 'content-type: application/json' \ -d '{"lat": 48.30195, "lon": 1.24650, "signals": [{"channel": "text", "value": "smell of lime-blossom tea"}]}'

RoutePurpose
POST /cuesGeneric cue: signals, at, geohash or lat/lon, tags, source
POST /cues/{generic,home_assistant,ios_shortcuts}Payloads straight from those tools (examples)
POST /memories, POST /recall, GET/PATCH/DELETE /memories/{id}Same as the MCP tools
GET /recollections/pending · POST /recollections/drainPeek / take queued involuntary recollections

Ready-made integrations: Home Assistant (arriving home, media starts playing, wearable sensors), iOS Shortcuts ("Arrive at location" personal automation), curl.

MCP surface:

  • Tools: remember, recall, sense, pending_recollections, get_memory, update_memory, forget.
  • Resource: recollections://pending, with resources/updated notifications when something surfaces. These notifications also work across processes that share the database.

Privacy and security defaults

  • Local-first. Everything lives in one SQLite file (~/.madeleine/madeleine.db, owner-only permissions). There is no telemetry and no cloud.
  • Raw media is not kept. Image and audio bytes are embedded and then discarded. Only vectors and metadata are stored, unless you pass store_raw=True (per call or MADELEINE_STORE_RAW=1).
  • No local file access by default. Clients must send media bytes. Allowing file paths takes madeleine serve --allow-file-uris.
  • HTTP binds to 127.0.0.1. Host and Origin checks block DNS rebinding. Set MADELEINE_API_TOKEN to require a bearer token. Binding to another interface without a token is refused unless you pass --insecure-no-auth.
  • `forget` deletes everywhere: memory, vectors, raw bytes, trigger history and queued recollections, with SQLite secure_delete on.
  • Recollections are data, not instructions. The hook wraps them in delimiters and labels them as such. Anyone who can write memories can still put text in your agent's context, so keep write access to yourself. See SECURITY.md.

Benchmark (and where it fails)

madeleine bench runs a synthetic benchmark: 500 memories across 3 cities, 300 cues with known ground truth, distractors and hard negatives. It is reported for both text backends. Full tables, methodology and blind spots are in docs/benchmarks.md.

madeleine bench                                        # offline hash text backend

madeleine bench --text-backend sentence-transformers # semantic, needs the [text] extra

hash (offline, default)semantic ([text], MiniLM)
pull R@1 / R@100.69 / 0.810.74 / 0.82
precision of involuntary fires0.690.70
positive cues that fire their memory0.530.67
false-trigger rate on negatives0.000.00

By cue category (hit rate = how often the right memory surfaced on its own):

cue categoryhash: hit ratesemantic: hit ratesemantic: precision
place + hour0.810.810.56
text paraphrase only0.210.671.00
text + place + hour0.670.760.76
exact same photo / sound1.001.001.00
slightly altered photo / sound0.000.00–
memory several years old0.400.600.64
negatives (distractors, time-only, same place + other topic)0 fires0 fires

Latency with 500 memories, in pure Python: sense p50 11 ms / p95 23 ms with the hash backend, p50 32 ms / p95 63 ms with the semantic one (CPU).

Honest limitations

  • Involuntary recall is tuned to be conservative: no negative cue fired, but a third (semantic) to half (hash) of positive cues still do not fire their memory.
  • Both text backends are calibrated on the benchmark generator (seed 1; results are seed 0, and seeds 2 and 3 agree). Without that, the hash backend under-scored paraphrases and MiniLM over-scored unrelated sentences. The data is synthetic English text, so real-world numbers will differ.
  • Altered media never matches in this benchmark, which uses the hash embedder for images and sound. That needs the CLIP and CLAP extras, whose similarity rescaling has only been calibrated on synthetic inputs.
  • Place + hour cues saturate (3 fires per cue), and only 56 % of those fall in the strict "same place, same hour ±1 h" ground truth.
  • The fusion is a hand-designed formula, not a learned one. There is no multi-user auth and no UI. The olfactory channel is a stub.
  • Hour-of-day uses each timestamp's own UTC offset. Send local offsets (+02:00), or "evening" means UTC evening.

Configuration

Env varDefaultMeaning
MADELEINE_DB~/.madeleine/madeleine.dbSQLite path (:memory: allowed)
MADELEINE_TEXT_BACKENDautoauto (sentence-transformers if installed), sentence-transformers, hash
MADELEINE_CHANNELSall built-insComma-separated enabled channels
MADELEINE_STORE_RAWoffPersist raw media bytes
MADELEINE_ALLOW_LOCAL_FILESoff

Only the beginning is shown; read the rest in the repo

Ask PopNx