Il server MCP pinky-mcp
pinky-mcp è il modo in cui un agente usa il brain: espone la memoria come tool di MCP su stdio. L'agente cerca e salva conoscenza senza fare grep né leggere file a mano; condivide lo stesso indice (brain.db) del CLI pinky.
- Non è un daemon né ascolta su una porta: è un processo stdio che il client MCP (Claude Code o un altro) avvia e con cui parla via stdin/stdout.
- Protocollo: JSON-RPC 2.0, messaggi JSON delimitati per riga. Versione di protocollo
2024-11-05. Metodi:initialize,tools/list,tools/call,ping. - Tutto il logging va su stderr (
PINKY_LOG/RUST_LOG), mai su stdout, per non sporcare il canale JSON-RPC.
I tre tool
brain_search — cercare conoscenza
Ricerca ibrida (BM25 full-text + vettore semantico, fusione RRF) sul brain. Registra telemetria d'uso (cosa viene recuperato).
| Argomento | Tipo | Req. | Default | Cosa fa |
|---|---|---|---|---|
query | string | ✅ | — | Cosa cercare. Max. 2 000 caratteri. |
limit | integer | 10 | Max. risultati (1–100). | |
scope | string | — | Restringe per scope: global o project:<nome>. | |
project | string | — | Restringe a un progetto (equivale a scope: project:<nome>). | |
type | string | — | Un tipo: gotcha | pattern | decision | diary | guide | note. | |
tags | string[] | — | Solo le voci che hanno tutti questi tag. |
{ "jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "brain_search",
"arguments": { "query": "timeout al cerrar el pool de postgres",
"type": "gotcha", "project": "sgsvp", "limit": 5 } } }
brain_save — salvare nuova conoscenza
Scrive il .md fonte di verità (in PINKY_SAVE_DIR) e lo indicizza al volo. Usalo quando l'agente scopre qualcosa di riutilizzabile che valga la pena ricordare.
| Argomento | Tipo | Req. | Default | Cosa fa |
|---|---|---|---|---|
title | string | ✅ | — | Titolo breve e descrittivo. Max. 300 caratteri. |
body | string | ✅ | — | Contenuto in markdown. Max. 100 000 caratteri. |
type | string | note | gotcha | pattern | decision | diary | guide | note. | |
tags | string[] | — | Etichette per filtrare/recuperare. Max. 32. | |
project | string | — | Progetto (scope) della voce. |
Lo scope della voce salvata deriva dall'argomento project oppure, se omesso, dalla env var PINKY_PROJECT; senza nessuno dei due, resta global.
{ "jsonrpc": "2.0", "id": 2, "method": "tools/call",
"params": { "name": "brain_save",
"arguments": { "type": "gotcha", "title": "El pool de PG se cuelga al apagar",
"body": "Usar pool.close(timeout=…) antes de salir…",
"tags": ["postgres", "pool"] } } }
brain_stats — dimensione dell'indice
Senza argomenti. Restituisce il numero di voci e chunk indicizzati.
{ "jsonrpc": "2.0", "id": 3, "method": "tools/call",
"params": { "name": "brain_stats", "arguments": {} } }
Ogni tool risponde con uncontent: [{ "type": "text", "text": … }]. In caso di errore (input non valido, indice assente) risponde con lo stesso shape e"isError": true— non chiude la connessione.
Configurazione (variabili d'ambiente)
pinky-mcp non accetta flag: si configura tramite l'ambiente. Vedi anche CONFIGURATION.md.
| Variabile | Default | Cosa fa |
|---|---|---|
PINKY_DB | brain.db | Percorso dell'indice SQLite. Impostala uguale a quella del CLI affinché pinky reindex e l'agente vedano la stessa base. |
PINKY_SAVE_DIR | documentation | Cartella dove brain_save scrive i .md. |
PINKY_PROJECT | (global) | Se impostata, le voci salvate restano nello scope project:<valore>. |
PINKY_HASH_EMBED | (non impostata) | Usa l'embedder deterministico (senza scaricare il modello ONNX). Ideale airgapped/CI. |
PINKY_LOG / RUST_LOG | warn | Livello di logging (su stderr). |
Registrarlo in Claude Code
Opzione A — pinky init (raccomandata)
Prepara il progetto e scrive .mcp.json con percorsi relativi (rilocabili tra macchine/cloni), preservando altri server già definiti:
pinky init
Lascia qualcosa del genere:
{
"mcpServers": {
"pinky": {
"command": "pinky-mcp",
"env": {
"PINKY_DB": "brain.db",
"PINKY_SAVE_DIR": "documentation"
}
}
}
}
PINKY_DB=brain.db coincide con il default del CLI (pinky --db brain.db), così pinky reindex documentation e l'agente condividono l'indice. Riapri il progetto in Claude Code e l'MCP pinky diventa disponibile.
Opzione B — claude mcp add (registrazione globale della macchina)
claude mcp add pinky --env PINKY_DB="$PWD/brain.db" -- pinky-mcp
# o, desde el repo de pinky_brain:
make mcp-register
Altri client MCP
Va bene qualsiasi client che parli MCP su stdio: puntalo al binario pinky-mcp (nel PATH) come command, con le env var qui sopra. Il core è agnostico — solo gli hook sono specifici di Claude Code.
Provarlo a mano (debug)
Dato che parla JSON-RPC per righe, si può esercitare senza un client:
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
'{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"brain_stats","arguments":{}}}' \
| PINKY_DB=brain.db pinky-mcp
Dovresti vedere il serverInfo ("name":"pinky-brain"), l'elenco dei tre tool e le stats dell'indice.
I tre pezzi condividono lo stesso indice: MCPpinky-mcp(questo, per l'agente), CLIpinky(CLI.md, per te/gli script) e hookpinky-hooks(Claude Code). Panoramica completa in HOW-IT-WORKS.md.