> Font: https://www.esfis.com/documentacio · esfis, memòria local per a qualsevol assistent. Actualitzat el 12 de setembre del 2026.

# Documentació

Com es connecta esfis als teus assistents i què hi pots fer. Això descriu el que fa l'app avui, no el que farà.

## Accés

esfis encara no és públic. És una app de macOS: `./build-app.sh` genera `Esfis.app` i deixa el binari a `~/.esfis/bin/esfis`, que és el que criden els assistents.

[Demana-hi accés](https://www.esfis.com/contacte?topic=acces) i digues quins assistents fas servir. T'escriurem quan et toqui.

## Connectar-hi per MCP

Qualsevol client MCP pot llegir i escriure a la memòria. A Claude Code:

```
claude mcp add --scope user esfis -- ~/.esfis/bin/esfis --mcp
```

A Claude Desktop, Cursor i companyia, que demanen un fitxer de configuració:

```
{
  "mcpServers": {
    "esfis": { "command": "/Users/<tu>/.esfis/bin/esfis", "args": ["--mcp"] }
  }
}
```

El servidor parla JSON-RPC per l'entrada estàndard. No obre cap port, no fa cap petició a la xarxa i no demana cap clau.

A l'`initialize`, esfis retorna les teves instruccions permanents al camp `instructions`, que és el que els clients posen al context tots sols. És el que fa que l'assistent hi llegeixi i hi escrigui sense que li ho demanis.

## Les quatre eines

Qui decideix què val la pena desar és l'assistent que ja tens obert. La política d'extracció viu a la descripció de `remember`, que és el que es llegeix abans de cridar-la; esfis només desa i recupera.

| Eina | Què fa |
| --- | --- |
| recall | query . Retorna primer les instruccions permanents i després, com a molt, vuit fets rellevants, cadascun amb l'id i la data en què es va actualitzar. |
| remember | text , kind ( fact o instruction ) i supersedes opcional. Una frase curta, en tercera persona, en la teva llengua. |
| forget | id . Desactiva un record. Es queda al magatzem com a història. |
| memories | Tots els records actius, els nous primer. Per a la resta, recall . |

`remember` fa dues coses pel seu compte. Si la frase ja hi és gairebé igual, no la desa i respon quin id ja la conté. I si en desa una amb `supersedes`, desactiva la vella i l'hi apunta. Els records semblants tornen amb cada resposta, perquè l'assistent pugui substituir en comptes d'acumular contradiccions.

Un fet només surt quan la pregunta el toca. Una instrucció viatja sempre, perquè és l'encàrrec que s'ha de seguir tant si la pregunta hi té a veure com si no.

## Línia d'ordres

El mateix magatzem, des del terminal:

```
esfis --recall "on viu l'Alex"     # els fets rellevants, amb puntuació i data
esfis --add "..."                  # desa un record a mà
esfis --import [carpeta...]        # els .md de memòria dels assistents
esfis --list                       # tot, actius i desactivats
esfis --mcp                        # el servidor, per l'entrada estàndard
```

## Importar memòria que ja tens

Els assistents ja desen fets en fitxers: un `.md` per fet, amb frontmatter, dins de `~/.claude/projects//memory/`. Són bons records, però cadascun només es veu des del projecte on es va escriure.

```
esfis --import                      # ~/.claude/projects
esfis --import ~/notes ~/altra/mem  # o les carpetes que diguis
```

Recorre les carpetes, agafa tot `.md` que tingui `description:` al frontmatter i el desa. Un `type: feedback` entra com a instrucció; la resta, com a fets.

El `.md` continua sent el teu: llegible, editable a mà, i la font. Es pot tornar a passar sempre que vulguis, perquè cada record recorda de quin fitxer ve: la segona passada no duplica res, i un fitxer que hagis editat substitueix la versió vella en comptes d'afegir-se-li.

## On viu tot

```
~/.esfis/
  memory.db     el magatzem (SQLite, una taula)
  log.jsonl     una línia per canvi: add · supersede · forget · delete
  bin/esfis     el binari que criden els assistents
```

Un record és una fila. Sense subject/predicate/object, sense entitats, sense graf: el model entén la frase.

```
{ "id": 184,
  "text": "En Francesc prefereix TypeScript per al projecte esfis.",
  "created_at": "2026-09-10", "updated_at": "2026-09-10",
  "active": true, "kind": "fact", "source": "mcp" }
```

El `log.jsonl` és afegir i prou, una línia per canvi, al costat de la base de dades: es pot fer `grep`, es pot comparar, i és teu si algun dia la base de dades se'n va.

## Observa

L'altre camí: enganxar una conversa a la pestanya **Observa** de l'app i que el model en tregui els records. Amb l'MCP connectat no et cal, i aquest sí que gasta: són dues crides a l'API d'Anthropic amb la teva clau, que es desa al clauer.

La primera crida n'extreu entre zero i cinc frases; zero és una resposta bona i freqüent. La segona, per a cada candidata, recupera els records actius més semblants i decideix `ADD`, `SUPERSEDE` o `IGNORE`.

## Si alguna cosa no va

**L'assistent no recupera res**

Comprova amb `claude mcp get esfis` que el servidor hi és i que diu «Connected». Si l'acabes d'afegir, reinicia el client: la llista d'eines es llegeix un sol cop, quan arrenca.

**Recupera menys del que esperava**

És a posta: si la pregunta no toca res del que sap, no retorna res. El rànquing surt de dos senyals i es queda entre tres i vuit records; el mig fet que hi té a veure de lluny es queda fora perquè no valia el context.

**Una memòria ha quedat malament**

Digues-li a l'assistent que ho oblidi i cridarà `forget` amb l'id. El record es desactiva, però no s'esborra: continua al magatzem i al `log.jsonl`.

**Vull veure-ho tot de cop**

`esfis --list` ho treu tot, actius i desactivats, amb l'id. La pestanya **Recorda** de l'app fa el mateix amb la finestra oberta.
