MCP server for .fafm — the Permanent Memory Layer (PML). Wraps claude-fafm-sdk via fastmcp. IANA-registered, cross-vendor, offline-first.
Project description
faf-memory-mcp
MCP server for .fafm — the Permanent Memory Layer (PML) for Claude Code, Cursor, Grok, and any MCP host.
Cross-vendor persistent memory in a file you can read. Offline-first. Your soul, your bytes.
Wraps claude-fafm-sdk via fastmcp. Receipt: 400+× faster type-filter queries vs grep on a real 492-file AI memory corpus — falsifiable methodology at Wolfe-Jam/faf-memory-proof.
Why
Every AI session, your agent starts blank — no memory of what you decided yesterday, what worked, what was tried. The fix isn't another hosted memory service; it's a file the AI reads at session start and writes back to as it learns. That file is .fafm — IANA-registered, cross-vendor, and 996 KB / 49 ms cold-load for a 492-fact corpus (full numbers: the receipt).
Install
uvx faf-memory-mcp
Use in Claude Code (recommended)
Via the faf-memory plugin (coming to claude-plugins-community):
/plugin install faf-memory
Or wire .mcp.json directly:
{
"faf-memory": {
"command": "uvx",
"args": ["faf-memory-mcp"]
}
}
Tools
| Tool | What it does |
|---|---|
etch(text, id?, type?, priority?, tags?) |
Write a durable fact. O(1) dedup by id. |
recall(query?, type?, tags?, min_priority?, limit?) |
Filter (substring + type + tags + priority floor) → rank by priority then recency. |
list_facts() |
List ALL facts — no filter, no rank. |
save_soul(path?) |
Persist the soul to a .fafm file. |
load_soul(path?) |
Load a .fafm from disk, replacing the in-memory soul. |
Configuration
| Env var | Default | What |
|---|---|---|
FAF_SOUL_NAMEPOINT |
@local |
Initial soul identifier |
FAF_SOUL_PROFILE |
knowledge |
.fafm profile (knowledge or voice) |
FAF_SOUL_PATH |
soul.fafm |
Default save/load path |
Format
.fafm is IANA-registered as application/vnd.fafm+yaml (registered 2026-05-13). Sibling of .faf (application/vnd.faf+yaml, 2025-10-30).
- Spec:
Wolfe-Jam/faf· MEMORY-FORMAT.md - Paper: Zenodo DOI 10.5281/zenodo.20348942
- Reference impls:
claude-fafm-sdk(Python) ·grok-faf-voice(voice profile, Python) - Cross-vendor proof: a
.fafmwritten byclaude-fafm-sdkreads cleanly viagrok-faf-voice, both directions tested.
How to know it's working
- Your agent doesn't ask "what is this project?" twice in the same week.
recall("X")surfaces what you etched last session, not just this one.- The
.fafmfile grows readably — it's plain YAML, diff it like code. - Open the same
.fafmingrok-faf-voice— same facts. Cross-vendor proven.
Tradeoff note
Biases toward deterministic recall (substring + type + tags + priority + recency) over semantic recall. For semantic/ranked recall + LLM smart-merge, see hosted namepoints in claude-fafm-sdk. Offline-first ≠ offline-only.
The FAF Memory cluster
- This repo —
faf-memory-mcp— the MCP server (wraps the SDK) Wolfe-Jam/faf-memory— the Claude Code plugin that installs this MCPWolfe-Jam/faf-memory-proof— the falsifiable receipt (412× methodology + scripts)claude-fafm-sdk— the open Python SDK this server wrapsWolfe-Jam/faf— the format spec + IANA registration
License
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file faf_memory_mcp-0.1.0.tar.gz.
File metadata
- Download URL: faf_memory_mcp-0.1.0.tar.gz
- Upload date:
- Size: 9.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7978aaa4bd949db576451b7469b2665e24b5b446c0a8da8fc9ee9cb9b71d668
|
|
| MD5 |
a7592c6104c2f15fa4b756e5f9c704ae
|
|
| BLAKE2b-256 |
21844e406758f9698984fe9ad76ac1eb36f65b9b23e0771abc515da341a6d617
|
Provenance
The following attestation bundles were made for faf_memory_mcp-0.1.0.tar.gz:
Publisher:
pypi.yml on Wolfe-Jam/faf-memory-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
faf_memory_mcp-0.1.0.tar.gz -
Subject digest:
a7978aaa4bd949db576451b7469b2665e24b5b446c0a8da8fc9ee9cb9b71d668 - Sigstore transparency entry: 1632714363
- Sigstore integration time:
-
Permalink:
Wolfe-Jam/faf-memory-mcp@2cab8d8038a86409c25633a77862205088d8e05a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Wolfe-Jam
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@2cab8d8038a86409c25633a77862205088d8e05a -
Trigger Event:
release
-
Statement type:
File details
Details for the file faf_memory_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: faf_memory_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 6.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d181da2a55364efa5a6f4b0b642521088d3510189089895ca528615658d35e1
|
|
| MD5 |
af455cf65d70565133ae4e6542c69b74
|
|
| BLAKE2b-256 |
0a173242bbc8b136dfc69de35d162f6cb3a0995707c57991a157684924930746
|
Provenance
The following attestation bundles were made for faf_memory_mcp-0.1.0-py3-none-any.whl:
Publisher:
pypi.yml on Wolfe-Jam/faf-memory-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
faf_memory_mcp-0.1.0-py3-none-any.whl -
Subject digest:
4d181da2a55364efa5a6f4b0b642521088d3510189089895ca528615658d35e1 - Sigstore transparency entry: 1632714425
- Sigstore integration time:
-
Permalink:
Wolfe-Jam/faf-memory-mcp@2cab8d8038a86409c25633a77862205088d8e05a -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Wolfe-Jam
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@2cab8d8038a86409c25633a77862205088d8e05a -
Trigger Event:
release
-
Statement type: