TL;DR: faf-cli opened the authoring. .FAF Context (faf-mcp) stopped carrying copies. One score, the same files, and the claims on the box are true.

In Plain English

Old state. You had a CLI that authored project.faf, scored it, and exported AGENTS.md / GEMINI.md / .cursorrules / CLAUDE.md. And you had an IDE MCP server that did the same jobs with its own copies. The copies drifted. The README described a hosted door this package does not run. Two authors. Two numbers. A project lying about itself.

Fix. The CLI made that authoring public. The MCP server composes it in-process. Nothing ported. Nothing shelled out to whatever faf happens to be on PATH.

New state. Terminal or editor, same bytes, same number. The CLI is the author. .FAF Context is the door into Cursor, VS Code, Windsurf, Cline — not a second product.

Two packages. One author.

faf-cli is the author. It scores project.faf. It authors the instruction files. That is the tool.

Authoring is more powerful than writing. That's what we call it.

.FAF Context is the door. faf-mcp is how that same context shows up in the editor over MCP. Local stdio. The host already has the slot. We fill it.

The adapter is a door. It does not get a second story.

What we told ourselves

A ported renderer would stay in sync with faf export. A local score would match the CLI. The docs would describe what the binary actually does.

That sentence is the product. It was not what left the function.

What was on disk

Same project. Two authors. Two truths.

CLIMCP, before 3.0
Scorethe CLI scorer, on the bytes on diska local heuristic — 29 points off, on the same file
AGENTS.md · GEMINI.md · .cursorrulesfaf exporta ported copy of the authoring
What the box saidlocal stdioa hosted endpoint this package does not run

The rule

If the terminal and the IDE can disagree about the same project, the project is lying. FAF don't lie has to hold on disk, not in the README.

So the CLI opened, and the door composed

Not a better copy. The same authoring the CLI already uses — public, so a consumer can call it instead of porting it.

  • One score. Whatever path you take, the number is the CLI's number on the file on disk.
  • Same files. The instruction files the editor authors are the files faf export authors.
  • One injector. Re-export is one block, every run. A stacked file is repaired on the next export.

That is the whole lesson. The rest is versions.

WITH, not MORE

This is not a fifth format. The format did not grow. Cursor did not get replaced. VS Code did not get replaced. Complementary — we fill the slot the host already has.

.FAF Context runs locally over stdio. There is no hosted endpoint on this package. A door that pretends to be a product is how the copy starts lying again.

The two ships

The release notes are the versions. This is why they exist.

faf export --agents bunx faf-mcp