.FAF Context
faf-mcp is a Model Context Protocol server that manages persistent project context for AI assistants, using a single .faf file as the source of truth and syncing it across multiple AI platform formats (CLAUDE.md, AGENTS.md, .cursorrules, GEMINI.md, etc.).
Context Initialization & File Management
faf_init/faf_quick— Create a.faffile for a projectfaf_read/faf_write— Read and write files with path-safetyfaf_list— List directories and discover projects with.faffilesfaf_context— Set or view active project path for subsequent callsfaf_clear— Clear caches and reset FAF state
Sync & Interop
faf_sync— Sync.faftoCLAUDE.mdfaf_bi_sync— Bi-directional sync across ALL formats at once, with optional real-time watchingfaf_agents— Import/Export/SyncAGENTS.md(OpenAI/Codex)faf_cursor— Import/Export/Sync.cursorrules(Cursor IDE)faf_gemini— Import/Export/SyncGEMINI.md(Google Gemini)faf_conductor— Import/Export withconductor/directory (Google Conductor)
Project Health & Scoring
faf_score— Calculate AI-readiness score (0–100%) with detailed breakdownfaf_status— Check if a project has.fafand its AI-readability statusfaf_check— Quality inspection ofhuman_contextfieldsfaf_trust— Validate.fafintegrityfaf_doctor— Diagnose and fix common setup issues
Context Enhancement & Guided Setup
faf_enhance— Enhance.fafwith AI optimization (completeness, human context, AI instructions)faf_go— Guided interview to reach 100% scorefaf_auto— One-command setup: init + sync + formats + bi-sync + scorefaf_readme— Extract 6 Ws (Who/What/Why/Where/When/How) from README intohuman_contextfaf_human_add— Add or update individualhuman_contextfieldsfaf_formats— Discover all tech formats (154+ validated types) to fill stack slotsfaf_dna— View project DNA evolution journey
GitHub & Cloud
faf_git— Generate.faffrom any GitHub repository URL without cloningfaf_cloud_publish/faf_cloud_fetch/faf_cloud_list/faf_cloud_search/faf_cloud_share— Upload, fetch, list, search, and share project context via mcpaas.live
Utility & Meta
faf_about/faf_what— Learn about the.fafformatfaf_guide— Usage guide for MCP host patternsfaf_debug— Debug environment info (working directory, permissions, FAF CLI status)faf_friday— Fun FAF facts and fuzzy matching with typo tolerance
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@.FAF Contextsync .faf to all AI formats"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Home: wolfe-jam.github.io/faf-mcp
.FAF Context is the MCP server for the IDE side of FAF. One project.faf in your repo, and every AI tool's context file is authored from it — AGENTS.md, .cursorrules, GEMINI.md, CLAUDE.md — and scored, so you know exactly where to focus. It runs locally over stdio on the same faf-cli the terminal uses. The FAF ecosystem it belongs to has comfortably passed 100k downloads across npm and PyPI (live count).
⭐ Bookmarks it for you, helps other devs find it too.
What's New in 3.0.2 — The Compose Edition
Tools that say what they do: faf_git scores with faf-cli and asks before overwriting, faf_sync previews each change, and imports say when nothing was written.
faf_githas one scorer. It reports faf-cli's score of the file it authored, writes the slots faf-cli scores, and asks before replacing an existingproject.faf.faf_syncpreviews each change. The dry run lists every field it would update and namesapply: true.Imports say when nothing was written, and
merge: truewith noproject.faffails clearly.Descriptions, annotations and errors match the code. No CLI commands or terminal colour codes in tool output.
3.0.1 renamed faf_bi_sync to faf_claude and made faf_init write what faf init writes. The full history is in the CHANGELOG.
Related MCP server: gemini-faf-mcp
The Compose Edition (3.0)
Compose, don't port: faf-mcp 3.0 runs on faf-cli 7.12 in-process — one scorer, one set of renderers, one injector — and every number, file and claim this package makes is true. Local stdio, 29 tools, Node 22+.
Composes faf-cli 7.12. AGENTS.md, GEMINI.md, .cursorrules and CLAUDE.md are written by faf-cli's own renderers, repo enrichment and block injector — the same bytes
faf exportandfaf syncwrite.faf_autoruns faf-cli's own update chain. The hand-ported renderers, the pre-v3 CLAUDE.md template and the local injector are gone.One score function.
faf_auto,faf_go,faf_dna,faf_doctorandfaf_claudeall report faf-cli's scorer on the bytes on disk — no local heuristics, no frozen birth score, no "0%".Nothing shells out. The
which fafdetector, the exec fallback and the "install faf-cli first" banner are gone; nothing undersrc/importschild_process. A machine with an unrelatedfafon PATH is no longer a problem.Every tool contract matches its handler. Descriptions say what the tools do, schemas declare only flags that are read, failures carry their reason.
The Mk3 engine is deleted. 44 unreachable modules, ~15,900 lines; the tarball halves.
prebuildclearsdist/so nothing deleted ever ships again.Resource URIs are
faf://contextandfaf://status;claude-faf://remains readable as an alias for this release.Node 22 or newer. 18 and 20 are end of life; the CI matrix runs 22 and 24 and a guard keeps the floor honest.
Define once. Sync everywhere.
You maintain .cursorrules. Your teammate uses AGENTS.md. Someone on the team just switched to Gemini. Every AI tool wants its own context file — and they all say the same thing in different formats.
faf-mcp is the dedicated MCP server for Cursor, Windsurf, Cline, VS Code, and every non-Claude platform. One .faf file in your repo, synced to every format your team needs.
Context for Cursor & IDE agents: faf-cli (v7.12) authors the files this server syncs — bunx faf export --agents, zero-install and git-native. See FAF-CLI for Cursor & IDE agents 👀.
project.faf
│
┌────────┬───────┴───────┬────────────┐
▼ ▼ ▼ ▼
CLAUDE.md AGENTS.md .cursorrules GEMINI.md
(Claude) (Codex) (Cursor) (Gemini)Quick Start
Cursor — one click:
Everywhere else:
bunx faf-mcpAdd to your MCP config:
{"mcpServers": {"faf": {"command": "bunx", "args": ["faf-mcp"]}}}Platform | Config File |
Cursor |
|
Windsurf |
|
Cline | Cline MCP settings |
VS Code | MCP extension config |
Claude Desktop | Use claude-faf-mcp |
Run It
faf-mcp runs locally over stdio. Point your IDE at one of these commands.
Method | Command |
npm |
|
Bun |
|
Interop Tools
Tool | Platform | Action |
| OpenAI Codex | Import/export/sync AGENTS.md |
| Cursor IDE | Import/export/sync .cursorrules |
| Google Gemini | Import/export/sync GEMINI.md |
| Conductor | Import/export directory structure |
| GitHub | Author .faf from any repo URL |
# MCP tool calls — ask your IDE's AI
# Write all four formats from project.faf
faf_claude { all: true }
# Author .faf from any GitHub repo
faf_git { url: "https://github.com/facebook/react" }Core tier: 15 essential tools shown by default; set FAF_TOOLS=all for the full 29 (every tool stays callable by name either way) · 25 test suites · 7 bundled parsers
Eternal Sync
project.faf is the source. faf-mcp writes every tool's context file from it in milliseconds.
project.faf ──── 8ms ───→ CLAUDE.md / AGENTS.md / .cursorrules / GEMINI.md
Single source of truthfaf_claude { all: true }writes all four formats at oncefaf_agents,faf_cursorandfaf_geminican also import an existing file:merge: truemerges it intoproject.fafContent outside the faf-managed block is preserved, byte for byte
Works across teams, branches, sessions
AI assistants forget. They drift. Every new session, AI starts guessing again. One source means context never goes stale.
Tier System: From Blind to Optimized
Tier | Score | Status |
✪ TROPHY | 100% | AI never has to guess |
★ GOLD | 99%+ | 1 slot from Trophy |
◆ SILVER | 95%+ | Close — keep going |
◇ BRONZE | 85%+ | Interim — keep going |
● GREEN | 70%+ | Interim — keep going |
● YELLOW | 55%+ | AI flipping coins |
○ RED | <55% | AI working blind |
♡ WHITE | 0% | No context at all |
At 55%, AI is guessing half the time. At 100%, AI is optimized.
use>faf | Prompt Pattern
Start every prompt with "Use FAF" to invoke MCP tools:
Use FAF to initialize my project
Use FAF to score my AI-readiness
Use FAF to sync my context
Use FAF to enhance my projectWorks on all platforms — stops web search, forces tool usage.
29 MCP Tools
The 15 Core tools, shown by default:
Tool | Purpose |
| Create a new |
| One-call setup: init or merge, stack detection, CLAUDE.md, score |
| Guided interview that fills the missing human-context and goal fields toward 100% |
| AI-readiness score (0-100%) and tier; |
| Diagnose a low score: missing files, slot counts, config issues, each with a fix |
| Rate each |
| Validate the required fields and |
| Reconcile |
| Set or show the active project path |
| What the IANA-registered |
Interop Tools | |
| Write CLAUDE.md from |
| Import AGENTS.md into |
| Import .cursorrules into |
| Import GEMINI.md into |
| Author a |
+14 more with FAF_TOOLS=all: faf_status · faf_what · faf_guide · faf_debug · faf_clear · faf_list · faf_read (read a file within the allowed roots: cwd, the OS temp dir, or FAF_ALLOWED_ROOTS) · faf_write (write a file within the same roots) · faf_readme · faf_human_add · faf_quick · faf_formats · faf_dna · faf_conductor
Built on faf-cli. Every tool composes the bundled faf-cli in-process — the same scorer, the same renderers, the same block injector the CLI uses. Nothing shells out to a faf on your PATH.
Ecosystem
claude-faf-mcp — Claude Desktop
faf-cli — Terminal CLI
faf-wasm — WASM SDK (<5ms scoring)
faf-wasm-gen — Rust→WASM
project.fafauthoring engine, browser/edge (faf-wasm's authoring sibling)faf-trinity — reference MCP server exposing all three IANA FAF formats (context/memory/agent) together
faf.one — Official website
docs/SKILLS-OVER-MCP.md — J1 Agent Skill
faf-ide(stdio · skills/list · digests)
If faf-mcp has been useful, consider starring the repo — it helps others find it.
Citation
If you use faf-mcp or the .faf / .fafa formats in research or production, please cite the format papers:
Wolfe, J. (2025). Format-Driven AI Context Architecture: The .faf Standard for Persistent Project Understanding. Zenodo. https://doi.org/10.5281/zenodo.18251362
Wolfe, J. (2026). Why Agents Need a Passport: .fafa — Portable Identity for the Agentic Era. Zenodo. https://doi.org/10.5281/zenodo.21951641
BibTeX
@article{wolfe2025faf,
title = {Format-Driven AI Context Architecture: The .faf Standard for Persistent Project Understanding},
author = {Wolfe, James},
year = {2025},
month = {nov},
publisher = {Zenodo},
doi = {10.5281/zenodo.18251362},
url = {https://doi.org/10.5281/zenodo.18251362}
}
@article{wolfe2026fafa,
title = {Why Agents Need a Passport: .fafa — Portable Identity for the Agentic Era},
author = {Wolfe, James},
year = {2026},
month = {aug},
publisher = {Zenodo},
doi = {10.5281/zenodo.21951641},
url = {https://doi.org/10.5281/zenodo.21951641}
}License
MIT License — Free and open source
Zero drift. Eternal sync. AI optimized. ✪
"It's so logical if it didn't exist, AI would have built it itself" — Claude
Available Tools
15 toolsfaf_aboutARead-only
Explain what the .faf format is — the IANA-registered, portable context file (application/vnd.faf+yaml) that gives any AI instant project understanding. Returns a plain-language overview of the format and its purpose. Use this when you or the user are new to FAF and want the concept before running other tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds that it returns a plain-language overview. No side effects or additional behaviors need disclosure; description aligns with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. First sentence explains the format, second explains usage. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, simple informational tool, the description fully covers purpose, format, and usage context. No gaps given the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, so schema coverage is 100%. Baseline is 4; description need not add parameter info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool explains the .faf format, its IANA registration, and purpose. It distinguishes from sibling tools by specifying it is for understanding the concept before using other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this when you or the user are new to FAF and want the concept before running other tools,' providing clear guidance on when to use. Does not list when not to use, but this is a simple informational tool so not necessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_agentsA
Import AGENTS.md (the OpenAI/Codex convention) into project.faf, or write it from project.faf. Returns the merged or written result for the chosen action. Use this to keep a Codex/OpenAI-style AGENTS.md and your .faf in agreement from one source.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Project path. Sets session context for subsequent calls. | |
| force | No | Update the faf-managed block in an existing file (content outside it is preserved) | |
| merge | No | Write the imported data into project.faf (without it, import only reports the section count and writes nothing) | |
| action | Yes | Action: import (AGENTS.md -> .faf; merge:true writes it into project.faf), export (.faf -> AGENTS.md), sync (re-writes AGENTS.md from .faf; export with force) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the write-but-safe profile is covered structurally. The description adds only that it "Returns the merged or written result for the chosen action"; the richer behavioral caveats (force preserves content outside the managed block, merge controls whether anything is written) live entirely in the schema, not the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the bidirectional purpose and ending with the use case. The middle sentence about return values is mildly redundant but earns its place by signaling the action-dependent output. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a sync tool with no output schema, the description covers the two directions of flow, the action-dependent return, and the motivating use case. Annotations carry the safety profile and the schema carries parameter detail, so the remaining gap is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema thoroughly documents action, merge, force, and path, including enum semantics. The description adds no parameter-level meaning beyond that, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names specific verbs and resources: importing AGENTS.md into project.faf and writing AGENTS.md from project.faf. The naming of the OpenAI/Codex convention implicitly distinguishes it from sibling convention tools (faf_claude, faf_cursor, faf_gemini), but it never names or contrasts them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the use case clearly: "Use this to keep a Codex/OpenAI-style AGENTS.md and your .faf in agreement from one source." That gives a clear context for when to reach for it, but there are no exclusions or named alternatives (e.g., when to prefer faf_claude or faf_sync instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_autoA
Run the setup pipeline in one call — init or merge, stack detection, CLAUDE.md, and score — taking a project from no context to a scored project.faf plus CLAUDE.md; faf_go closes the human slots. Returns the final AI-readiness score and what was created. Use this as the fast path on a fresh project; use the individual tools when you need finer control.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Project path. Sets session context for subsequent calls. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the write/scope profile is covered. The description usefully adds what the tool creates (project.faf and CLAUDE.md) and that it returns the final AI-readiness score. It does not say whether existing files are overwritten versus merged, or how the 'init or merge' branch is chosen — meaningful gaps for a mutating orchestrator.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action sentence, then return value, then routing guidance — a sound order. The pipeline enumeration clause is dense with em-dashes and parentheses but each sentence carries distinct information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by stating the return ('final AI-readiness score and what was created') and the artifacts produced. It is nearly complete for an orchestration tool; only the init-vs-merge decision rule and overwrite behavior for existing files are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'path' parameter, and the schema documents its session-context side effect. The description adds nothing about the parameter, so the baseline of 3 applies for a fully documented one-param tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource ('run the setup pipeline in one call') with an explicit enumeration of the stages it chains (init/merge, stack detection, CLAUDE.md, score). It also names the sibling it complements (faf_go) and the alternative class (the individual tools), so an agent can place it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Use this as the fast path on a fresh project; use the individual tools when you need finer control.' It states both the condition that selects this tool and the condition that selects alternatives, plus where faf_go fits after it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_checkA
Inspect the human_context fields and rate each empty/generic/good. Returns the ratings; with protect it records the good fields in _protected_fields as an advisory list (other tools do not enforce it), with unlock it clears that list. Use this to gauge context quality.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Project path. Sets session context for subsequent calls. | |
| unlock | No | Clear the _protected_fields list | |
| protect | No | Record good fields in _protected_fields (advisory; other tools do not enforce it) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the generic readOnlyHint=false/destructiveHint=false profile, while the description adds the genuinely useful disclosure that _protected_fields is advisory and NOT enforced by other tools, plus that unlock clears the list. That is real behavioral context beyond structured fields. It stops short of stating persistence or the shape of the returned ratings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core operation and no filler; the protect/unlock clauses are appended efficiently. The semicolon-chained middle sentence is slightly dense but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and only three simple parameters, the description covers the operation, the two mutating flags, and the advisory caveat. An agent has enough to call it correctly; only return-format details are absent, which is a minor gap for a tool that returns ratings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (path, protect, unlock) are already documented in the schema, and the description's explanation of protect/unlock largely restates the schema wording. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (inspect), a specific resource (human_context fields), and the operation performed (rate each empty/generic/good). It is clear what the tool does, though it never contrasts itself with the adjacent faf_score or faf_context siblings, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this to gauge context quality" implies the intent but gives no when-to-use vs. when-not guidance and never names an alternative (e.g. faf_score). The protect/unlock conditions are described, but that is parameter behavior rather than tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_claudeA
Write CLAUDE.md from project.faf (one direction: .faf → CLAUDE.md) and, with the format flags or all, also AGENTS.md, .cursorrules and GEMINI.md. Content outside the faf-managed block is preserved. Returns the files written. Use this to keep every AI tool's context file current from one source. (Named faf_bi_sync before 3.0.1; that name still works.)
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Write ALL formats: CLAUDE.md + AGENTS.md + .cursorrules + GEMINI.md | |
| path | No | Project path. Sets session context for subsequent calls. | |
| agents | No | Also write AGENTS.md (OpenAI/Codex format) | |
| cursor | No | Also write .cursorrules (Cursor IDE format) | |
| gemini | No | Also write GEMINI.md (Google Gemini format) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the mutation is expected and the safety profile is partially covered. The description adds real value beyond that: it discloses the faf-managed block boundary and that surrounding content is preserved during the write, and it states the return payload ('the files written'). It does not describe overwrite behavior when no managed block exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the primary output and direction before the optional-format detail, and the parenthetical legacy-name note is compact. The middle clause about preserved content is load-bearing rather than filler, though the sentence runs long with several parentheticals.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter write tool with no output schema, the description covers what is written, where the write is bounded, that files are reported back, and how to expand the output set. The main remaining gap is precedence among the flags and 'all', which the schema hints at but never resolves.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including 'all' and the per-format booleans is already self-documenting; baseline is 3. The description references the format flags and 'all' but adds no syntax, interaction rules, or precedence detail beyond what the schema already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Write CLAUDE.md from project.faf') and pins the direction of the operation with '.faf → CLAUDE.md', which is genuinely distinguishing detail. It also enumerates the additional artifacts the format flags produce. It stops short of differentiating itself from the near-identically named siblings faf_agents, faf_cursor, and faf_gemini, which an agent would reasonably confuse with the flag-driven behavior here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear motivating context ('Use this to keep every AI tool's context file current from one source') and implies the flag-based fan-out path, plus a rename note for older callers. It never states when NOT to use this tool or when to prefer the individual faf_agents/faf_cursor/faf_gemini siblings over the flags.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_contextARead-only
Set or show the active project path that later faf_ project tools resolve against (faf_read and faf_write resolve relative paths against the server's working directory instead). Returns the current context path. Call this once at the start of a session so the project tools target the right project.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Set active project path. If omitted, shows current context. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description notably discloses that when invoked with a path it mutates session state that other tools resolve against, and that omission returns the current path. However, annotations declare readOnlyHint=true, which conflicts with an operation whose 'Set' branch changes the resolution context for every subsequent project tool call — a side effect on the environment. The description is honest, but the structured safety signal is misleading, so this is flagged as a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: the core purpose and resolution semantics come first, the return value second, and the session-start directive last. The parenthetical about faf_read/faf_write earns its space by preventing a likely misuse. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter tool with no output schema, the description covers purpose, the read/write duality, the returned value, and the recommended call timing. An agent has everything needed to invoke it correctly; only the annotation mismatch mars the picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's description already states 'Set active project path. If omitted, shows current context.' The prose restates that behavior with no added syntax, format, or validation detail, so the baseline 3 is appropriate when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb set (set/show) on a specific resource (the active project path) and explains its downstream effect on 'later faf_ project tools.' It even differentiates itself from sibling behavior by noting that faf_read and faf_write resolve against the server's working directory instead. An agent can distinguish this from faf_init or faf_sync without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing guidance: 'Call this once at the start of a session so the project tools target the right project,' and clarifies which tools it does and does not affect. It lacks an explicit when-not-to-use case (e.g., what happens if you call it twice, or whether it is required before faf_read/faf_write), so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_cursorA
Import .cursorrules (the Cursor IDE convention) into project.faf, or write it from project.faf. Returns the merged or written result for the chosen action. Use this to keep Cursor rules and your .faf in agreement from one source.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Project path. Sets session context for subsequent calls. | |
| force | No | Update the faf-managed block in an existing file (content outside it is preserved) | |
| merge | No | Write the imported data into project.faf (without it, import only reports the section count and writes nothing) | |
| action | Yes | Action: import (.cursorrules -> .faf; merge:true writes it into project.faf), export (.faf -> .cursorrules), sync (re-writes .cursorrules from .faf; export with force) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this is a write operation (readOnlyHint=false) that is neither destructive nor open-world, so the safety profile is already covered. The description adds that it returns the merged or written result, useful given there is no output schema, but it does not disclose the write-over-file nuances that the schema's merge/force params imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with minimal waste: the operation, the return, and the intent. It is appropriately sized, though the middle sentence about return values is partly redundant with the action description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderate-complexity mutation tool with full schema coverage and annotation-backed safety, the description covers the what, the return, and the purpose. Nothing beyond minor sibling disambiguation is missing to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are fully documented in the schema, including the action enum and the merge/force semantics. The description mentions only the import/export direction and adds no meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific bidirectional resource operation: importing .cursorrules into project.faf and writing it back out. The Cursor IDE convention is named explicitly, making the resource identifiable. However, it never distinguishes itself from the sibling tool faf_sync or the analogous faf_claude/faf_gemini conventions, which an agent must disambiguate between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing sentence ('Use this to keep Cursor rules and your .faf in agreement from one source') gives an implied purpose but no when-to-use versus when-not, and no routing to alternatives. With faf_sync and other convention-specific siblings present, the lack of explicit differentiation leaves selection partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_doctorARead-only
Diagnose a project.faf setup — report missing files, the real score with populated/active slot counts, and common configuration issues, each with a fix. Returns a checklist. Use this when your score is low and you need to know why.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Project path. Sets session context for subsequent calls. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description goes further by disclosing the shape of the result ('Returns a checklist') and that each finding carries a fix, which helps an agent interpret output without a schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and the report contents, followed by the trigger condition. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining the return shape, and it does so (a checklist of issues with fixes). Missing only minor detail about ordering or scope relative to the optional path argument.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter ('path') and schema description coverage is 100%, so the schema already explains it fully, including that it sets session context. The description adds no parameter-level meaning beyond that, which is the expected baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (Diagnose) and resource (a project.faf setup) and enumerates what the report contains: missing files, the real score with slot counts, and config issues with fixes. It implicitly separates itself from faf_score by promising the 'why' behind a low score, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a clear trigger condition: 'Use this when your score is low and you need to know why.' That is real routing guidance, but it stops short of naming the alternative tools (e.g. faf_score for the number alone) or stating when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_geminiA
Import GEMINI.md (the Google Gemini CLI convention) into project.faf, or write it from project.faf. Returns the merged or written result for the chosen action. Use this to keep a Gemini context file and your .faf in agreement from one source.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Project path. Sets session context for subsequent calls. | |
| force | No | Update the faf-managed block in an existing file (content outside it is preserved) | |
| merge | No | Write the imported data into project.faf (without it, import only reports the section count and writes nothing) | |
| action | Yes | Action: import (GEMINI.md -> .faf; merge:true writes it into project.faf), export (.faf -> GEMINI.md), sync (re-writes GEMINI.md from .faf; export with force) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, closed-world operation, so the safety profile is carried structurally. The description adds that it returns the merged or written result and that data flows both directions, but it does not disclose the practical consequence that sync/force rewrites GEMINI.md or that import alone writes nothing – that caveat lives only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences that front-load the operation and follow with the return behavior and purpose. The phrase 'for the chosen action' is mildly redundant given the enum, but overall it wastes little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with no output schema and full annotation coverage, the description supplies the essential what, why, and return shape. The action-specific write/merge semantics that an agent would need are delegated to the schema, leaving only minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the action enum values are individually documented in the schema, so the description need not restate them. It adds only the bilateral import/write framing, not meaning beyond what the schema already provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (GEMINI.md, project.faf) and a clear bidirectional verb (import into / write from), with the parenthetical clarifying the Gemini CLI convention. This is easily distinguished from faf_claude and faf_cursor by naming the exact artifact, though it never explicitly contrasts itself with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing sentence gives a clear purpose statement ('keep a Gemini context file and your .faf in agreement from one source'), which implies when to reach for it. It stops short of naming alternatives or stating when-not to use it, so it lands just below the explicit routing bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_gitADestructive
Author a project.faf from any public GitHub repository URL — fetches the repo and extracts its stack and context. Returns the authored .faf. Use this to bootstrap context for a project you have the URL for but not cloned locally.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | GitHub repository URL (e.g., https://github.com/owner/repo or owner/repo) | |
| path | No | Output directory for the authored project.faf. If omitted, returns content without writing. | |
| force | No | Overwrite an existing project.faf at path (without it, faf_git refuses) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, and destructiveHint=true. The description adds useful scope by saying it fetches a public repo and returns an authored .faf, but it does not explain the write/overwrite behavior, refusal semantics, auth needs, or rate limits beyond what the annotations and schema already imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences/clauses, front-loaded with the action and source, then the return value, then the usage context. No filler material.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description appropriately says it returns the authored .faf. It leaves the optional path-writing and force-overwrite behavior to the schema, which is acceptable because those parameters are fully described there and the annotations signal destructiveness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents url, path, and force in detail. The description mentions the GitHub URL source and the returned artifact but does not add syntax, formatting, or behavioral meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and artifact ('Author a project.faf') and a specific source ('from any public GitHub repository URL'), then clarifies the extraction behavior. The final sentence distinguishes the use case from local-clone workflows, so an agent can tell what this tool is for without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: to bootstrap context for a project with a known URL but no local clone. It gives clear context but does not name or rule out specific sibling alternatives such as faf_init or local workflow tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_goA
Drive a project.faf to 100% through a guided interview — returns the next questions for the missing human-context and goal fields, then applies the answers passed back. Returns the updated score after each round. Use this to close the gap to a complete context when auto-detection cannot fill the human slots.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Project path. Sets session context for subsequent calls. | |
| answers | No | Answers to apply. Keys are field paths (e.g., "project.goal", "human_context.why"), values are the answers. If provided, applies answers and returns new score. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite minimal annotations (only readOnlyHint false, destructiveHint false), the description adds behavioral context: it returns questions, applies answers, updates the score, and implies interactive iteration. It does not detail side effects or error conditions, but adequately describes the interactive protocol.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero wasted words, front-loaded with the purpose and then details. Every sentence provides critical information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (2 params, nested objects, no output schema), the description fully covers what the tool does, when to use it, how parameters behave, and what it returns (next questions and updated score). No missing critical information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds notable value: explains path sets session context for subsequent calls, and answers describes the key-value format and the effect of applying answers (new score returned). This goes beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool drives a project.faf to 100% through a guided interview, returning questions and applying answers. This specific verb+resource+process distinguishes it from siblings like faf_auto (auto-detection) and faf_score (just scoring).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this tool when auto-detection cannot fill human slots, providing a clear when-to-use and when-not-to-use context. This directly guides the agent to choose this over alternatives like faf_auto.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_initA
Create a project.faf for a project, making it instantly AI-readable. Returns the new file location and starting score. Accepts a path or bare project name (e.g. ~/Projects/my-app, my-app) and omitting it uses the current directory.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Project path or name. Smart resolution: "my-app" finds ~/Projects/my-app OR ~/Code/my-app. Full paths like ~/Projects/app or /Users/me/code/app work too. Omit to use current directory. | |
| force | No | Overwrite existing project.faf if it exists |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false, so the description is not required to restate these. It adds value by explaining the side effect (creating a file) and the return values (file location and starting score). However, it does not mention behavior when the file already exists without the 'force' parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively concise (three sentences) and front-loads the main purpose. Each sentence provides relevant information, though space could be saved by merging the last two sentences. Overall, it is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (2 optional parameters, no output schema), the description covers the essential aspects: purpose, return values, and parameter usage. It does not mention error handling or edge cases, but these are minor gaps for such a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant semantic detail beyond the schema, especially for the 'path' parameter (smart resolution rules, examples). For 'force', the description is sufficient. The added context helps the agent understand parameter behavior better than the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool creates a 'project.faf' file for a project, making it AI-readable. The verb 'Create' is specific to the resource, and the description differentiates from sibling tools like 'faf_score' or 'faf_sync' by focusing on initialization.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear guidance on when to use the tool: to create a project.faf. It explains acceptable inputs (path, bare name, omit) with examples, but does not explicitly mention when not to use it or suggest alternatives, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_scoreARead-only
Calculate a project.faf AI-readiness score (0-100%) from the populated context slots. Returns the percentage and tier, and with details a slot-by-slot breakdown with improvement suggestions. Use this to measure how complete the AI context is and what to fill next.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Project path. Sets session context for subsequent calls. | |
| details | No | Include detailed breakdown and improvement suggestions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description aligns with readOnlyHint annotation and adds details on return structure (percentage, tier, optional slot-by-slot breakdown with suggestions). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with action and output, each sentence serves a clear purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Schema is fully covered, no output schema needed as description explains return object, readOnlyHint covers safety, and all aspects (purpose, usage, parameters, output) are addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, description adds value by explaining 'details' as providing 'slot-by-slot breakdown with improvement suggestions' and 'path' as setting session context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'calculate', resource 'AI-readiness score', and scope. Distinguishes from siblings like faf_context and faf_check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to measure how complete the AI context is and what to fill next', providing clear when-to-use guidance. Lacks explicit exclusions but purpose sufficiently contrasts alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_syncA
Reconcile project.faf with what the repo manifests say now (package.json name, description, framework dependencies). Dry-run by default: reports the fields that would change. Pass apply:true to write them into project.faf. Does not touch CLAUDE.md — use faf_claude for CLAUDE.md, AGENTS.md, .cursorrules and GEMINI.md.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Project path. Sets session context for subsequent calls. | |
| apply | No | Write the detected changes into project.faf (default: dry-run report only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the safety profile is partly covered; the description adds the non-obvious trait that this mutating tool is dry-run by default and only writes when apply:true is passed, plus a hard scope boundary on which files it never modifies. It stops short of covering idempotency or conflict handling, so it adds value without being exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose first, then the default/write semantics, then the exclusion boundary. No filler, and the most decision-relevant fact (dry-run by default) appears early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema, the description still tells the agent what the dry-run returns ('reports the fields that would change'), what gets written, and what is out of scope. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema and the baseline is 3. The description restates the apply semantics (default dry-run vs. write) consistently with the schema but adds no new syntax or edge-case meaning beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reconcile project.faf') plus the authoritative source ('what the repo manifests say now'), listing the concrete inputs (package.json name, description, framework dependencies). It also distinguishes itself from faf_claude and the other file-targeted siblings, so an agent can pick it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the default behavior (dry-run reporting) and the opt-in write path (apply:true), and names the correct alternative for a different file set ('Does not touch CLAUDE.md — use faf_claude for CLAUDE.md, AGENTS.md, .cursorrules and GEMINI.md'). Both the when and the when-not are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_trustBRead-only
Validate a project.faf's required fields (faf_version, project.name) and about.* block with faf-cli's validator, and report its real score.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful context: the exact fields validated and that it invokes faf-cli's validator to produce a "real score," which hints at behavior beyond a simple read. It doesn't describe failure modes or what happens when validation fails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. The verb and target come first, and the secondary outcome (score report) closes the sentence efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no params, the description carries the full burden of explaining results. It mentions a score but not the validation report shape (e.g. pass/fail per field), and it doesn't clarify the target file location or how this differs from faf_score, leaving an agent with moderate gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is nothing to document; baseline is 4. The description correctly implies no inputs are needed beyond the implicit project.faf target.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Validate") and resource ("project.faf's required fields (faf_version, project.name) and about.* block"), and adds that it reports a score. However, it does not distinguish this from close siblings like faf_score or faf_check, which likely also validate or score a project.faf.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus faf_score, faf_check, or faf_doctor. It doesn't state prerequisites (e.g. that a project.faf must exist) or exclusions, leaving the agent to infer the boundary among several overlapping sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v2.3.2- Changed
faf_agents3 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Action: import (AGENTS.md -> .faf), export (.faf -> AGENTS.md), sync (bidirectional)"New value: +"Action: import (AGENTS.md -> .faf; merge:true writes it into project.faf), export (.faf -> AGENTS.md), sync (re-writes AGENTS.md from .faf; export with force)" - changed
Input schema / properties / force / descriptionPrevious value: -"Force overwrite existing files"New value: +"Update the faf-managed block in an existing file (content outside it is preserved)" - changed
Input schema / properties / merge / descriptionPrevious value: -"Merge imported data with existing .faf instead of replacing"New value: +"Write the imported data into project.faf (without it, import only reports the section count and writes nothing)"
- Changed
faf_auto1 field changed- removed
Input schema / properties / forceRemoved value: -{ - "description": "Force overwrite existing files", - "type": "boolean" -}
- Removed
faf_bi_sync - Changed
faf_check2 fields changed- changed
Input schema / properties / protect / descriptionPrevious value: -"Lock good/excellent fields from being overwritten"New value: +"Record good fields in _protected_fields (advisory; other tools do not enforce it)" - changed
Input schema / properties / unlock / descriptionPrevious value: -"Remove all field protections"New value: +"Clear the _protected_fields list"
- Added
faf_claude - Changed
faf_cursor3 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Action: import (.cursorrules -> .faf), export (.faf -> .cursorrules), sync (bidirectional)"New value: +"Action: import (.cursorrules -> .faf; merge:true writes it into project.faf), export (.faf -> .cursorrules), sync (re-writes .cursorrules from .faf; export with force)" - changed
Input schema / properties / force / descriptionPrevious value: -"Force overwrite existing files"New value: +"Update the faf-managed block in an existing file (content outside it is preserved)" - changed
Input schema / properties / merge / descriptionPrevious value: -"Merge imported data with existing .faf instead of replacing"New value: +"Write the imported data into project.faf (without it, import only reports the section count and writes nothing)"
- Changed
faf_gemini3 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Action: import (GEMINI.md -> .faf), export (.faf -> GEMINI.md), sync (bidirectional)"New value: +"Action: import (GEMINI.md -> .faf; merge:true writes it into project.faf), export (.faf -> GEMINI.md), sync (re-writes GEMINI.md from .faf; export with force)" - changed
Input schema / properties / force / descriptionPrevious value: -"Force overwrite existing files"New value: +"Update the faf-managed block in an existing file (content outside it is preserved)" - changed
Input schema / properties / merge / descriptionPrevious value: -"Merge imported data with existing .faf instead of replacing"New value: +"Write the imported data into project.faf (without it, import only reports the section count and writes nothing)"
- Changed
faf_git2 fields changed- added
Input schema / properties / forceAdded value: +{ + "description": "Overwrite an existing project.faf at path (without it, faf_git refuses)", + "type": "boolean" +} - changed
Input schema / properties / path / descriptionPrevious value: -"Output directory for generated project.faf. If omitted, returns content without writing."New value: +"Output directory for the authored project.faf. If omitted, returns content without writing."
- Changed
faf_sync1 field changed- added
Input schema / properties / applyAdded value: +{ + "description": "Write the detected changes into project.faf (default: dry-run report only)", + "type": "boolean" +}
16 tool updates
v2.3.0- Removed
faf_clear - Removed
faf_conductor - Removed
faf_debug - Removed
faf_dna - Removed
faf_enhance - Removed
faf_formats - Removed
faf_friday - Removed
faf_guide - Removed
faf_human_add - Removed
faf_list - Removed
faf_quick - Removed
faf_read - Removed
faf_readme - Removed
faf_status - Removed
faf_what - Removed
faf_write
1 tool update
v2.1.3- Removed
faf_chat
32 tool updates
v2.1.1- First observed
faf_about - First observed
faf_agents - First observed
faf_auto - First observed
faf_bi_sync - First observed
faf_chat - First observed
faf_check - First observed
faf_clear - First observed
faf_conductor - First observed
faf_context - First observed
faf_cursor - First observed
faf_debug - First observed
faf_dna - First observed
faf_doctor - First observed
faf_enhance - First observed
faf_formats - First observed
faf_friday - First observed
faf_gemini - First observed
faf_git - First observed
faf_go - First observed
faf_guide - First observed
faf_human_add - First observed
faf_init - First observed
faf_list - First observed
faf_quick - First observed
faf_read - First observed
faf_readme - First observed
faf_score - First observed
faf_status - First observed
faf_sync - First observed
faf_trust - First observed
faf_what - First observed
faf_write
TDQS
Scored across 15 tools
Several tools overlap in function: faf_score, faf_check, faf_doctor, and faf_trust all inspect the .faf and report status, so an agent could misselect among them. Worse, faf_claude (with format flags/all) writes AGENTS.md, .cursorrules, and GEMINI.md — duplicating the write direction of faf_agents, faf_cursor, and faf_gemini. The detailed cross-referencing descriptions mitigate this, but the boundaries are genuinely fuzzy.
Every tool uses a consistent faf_ snake_case prefix, which is highly predictable. The suffixes mix verbs (init, score, check, sync) with target-resource nouns (claude, cursor, gemini, agents, git), a minor stylistic deviation but still readable and coherent.
15 tools is within the reasonable upper range for a multi-format context manager. However, the four platform-specific tools (claude, cursor, gemini, agents) are near-duplicates of one parameterized operation, suggesting the set is slightly heavier than necessary.
Coverage spans creation (init, auto, git), evaluation (score, check, doctor, trust), updating (sync, go), and import/export across AI formats, which is solid lifecycle coverage. The gap is that faf_context's description references faf_read and faf_write tools that are absent from the surface, leaving no direct raw read/write operation.
Maintenance
Related MCP Connectors
Persistent project context — Rust-native MCP server. IANA-registered .faf format.
Share one project context across ChatGPT, Claude, Telegram and any MCP client.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Persistent project context for xAI Grok. IANA-registered .faf format.
Related MCP Servers
- AlicenseAqualityAmaintenance.FAF (Foundational AI-context Format) with 50+ tools - Only Persistent project context that integrates seamlessly with Claude Desktop workflows. Officially merged (#2759) Anthropic MCP server.14249 npm23MIT
- AlicenseAqualityAmaintenancePersistent project context for Google Gemini. 12 MCP tools for .faf Project DNA — auto-detect your stack, validate, score, and sync across CLAUDE.md, GEMINI.md, and AGENTS.md. Python/FastMCP. IANA-registered format (application/vnd.faf+yaml). 183 tests. One file, every AI platform.1390 PyPI2MIT
- AlicenseNot gradedqualityAmaintenancePersistent project context in Rust. 8 MCP tools via rmcp SDK — parse, validate, score, compress, discover, and token analysis. Single binary, zero config. IANA-registered format (application/vnd.faf+yaml). One file, every AI platform.252 npm4MIT
- AlicenseAqualityBmaintenanceGrok asked for MCP on a URL. This is it. First MCP server built for Grok URL-based • Zero config • Just works12193 npm19MIT