gemini-faf-mcp
gemini-faf-mcp is an MCP server that gives Gemini persistent project context by reading, scoring, authoring, and exporting .faf project DNA files.
Create & locate
.faffiles —faf_initwrites a starter file (never overwrites),faf_discoverfinds.faffiles up the directory tree, andfaf_autoauto-detects your stack from manifests, docker-compose services, Makefile/justfile targets, and CI config, then fills empty slots.Read project context —
faf_readreturns the full parsed structure, andfaf_contextreturns a Gemini-optimized summary (project + stack + score).Validate & score —
faf_validategives Mk4 score, tier, slot counts, errors and warnings;faf_scoreis a quick score/tier status check.Transform —
faf_stringifyconverts parsed FAF data back to clean YAML.Export for other agents —
faf_geminiauthorsGEMINI.mdandfaf_agentsauthorsAGENTS.md, both non-destructive via a faf-managed block that preserves hand-written content.Migrate —
faf_migratebumps a.fafto format version 3.0 and ensures section roots, withdry_runto preview (never touches your values).Reference & info —
faf_aboutreturns FAF format/IANA/ecosystem metadata, andfaf_modelprovides a 100%-Trophy example.faffor any of 15 project types (or lists them).Safety by design — all 13 tools carry annotations (8 read-only, 4 non-destructive writes, 1 rewrite), paths are confined to the project root, and no tool reaches the network.
Automatically detects project stack and configuration for Rust projects using the Actix framework.
Scans composer.json files to automatically detect and integrate PHP project stack details into the FAF context.
Automatically detects project stack and dependency information for Django-based Python projects.
Identifies and integrates project stack details for applications built with the Express framework.
Automatically detects project stack and configuration for FastAPI applications.
Automatically detects project stack and configuration for Flask-based Python projects.
Identifies and integrates project stack details for Go applications using the Gin framework.
Provides Gemini-optimized project context and exports GEMINI.md files to align project goals and stack definitions within Google Gemini environments.
Auto-detects project DNA and stack details for JavaScript projects by scanning project manifest files.
Automatically detects project stack and configuration for Next.js applications.
Scans package.json to extract project stack and dependency data for Node.js environments.
Exports project context to AGENTS.md to align project goals and stack for OpenAI Codex and other OpenAI-compatible AI tools.
Auto-detects project DNA and stack details for PHP projects by scanning manifest files like composer.json.
Identifies PostgreSQL as the project database during automatic stack detection and FAF context generation.
Identifies pytest as the project testing framework during automatic stack detection and FAF context generation.
Auto-detects project DNA and stack details for Python projects by scanning pyproject.toml or requirements.txt.
Automatically detects project stack and configuration for React-based frontend projects.
Auto-detects project DNA and stack details for Ruby projects by scanning the Gemfile.
Auto-detects project DNA and stack details for Rust projects by scanning Cargo.toml.
Auto-detects project DNA and stack details for TypeScript projects by scanning project manifest files.
gemini-faf-mcp v3.1 — The New Era Edition
Persistent Project Context for Google Gemini. Define once. Sync everywhere.
FAF defines. AGENTS.md instructs. AI codes.
☆ Bookmark the gemini-faf-mcp page for later.
Stop re-explaining your project to every new Gemini session. Every Gemini conversation starts cold — you re-state your stack, your goals, your conventions every single time. .faf is one structured file that captures all of it. This package is the MCP server that lets Gemini read it.
Before and after
Without FAF With FAF (project.faf filled in)
───────────────────────── ─────────────────────────
You: "I'm using FastAPI with... You: "Add a /users/me endpoint"
PostgreSQL, pytest, and..." Gemini: [writes correct code,
Gemini: "Got it. What's the uses your auth pattern,
codebase like?" matches your test style]
You: "It's a REST API for..."
[5 minutes of re-explaining]
Gemini: [now ready to help].faf is read once at session start. Every tool call lands on a Gemini that already knows your project.
What's New in v3.1.0 — The New Era Edition
Glass-box tools: every Gemini tool now says what it does — reads, writes or rewrites — so your client knows when to ask first. In Gemini CLI and Google Antigravity.
Every tool is labelled. All 13 tools carry MCP tool annotations, matched to what each one does: 8 read only, 4 write without losing anything (
faf_initnever overwrites,faf_autofills empty slots only,faf_geminiandfaf_agentskeep your own text), andfaf_migraterewrites the file. None reaches the network. Clients that read the labels can let reads run and ask before writes.Its own card. A refreshed FAF passport (
agent.fafa, written with faf-cli 8.2'scard init) and MCP Server Card, both 3.1.0 with all 13 tools and FAF's context.Works in Google Antigravity, local (
uvx) or hosted (serverUrl). See Google Antigravity below.A new look: the gemini-faf-mcp page, redesigned to feel at home for Google developers.
The hosted function scores always-33, the same engine as everything else.
Earlier: v3.0.0 — The Always33 Edition — one engine, one number: the same score as faf-cli 8, claude-faf-mcp 7, faf-mcp 4 and grok-faf-mcp 2.
v2.8.2 — The Full-Facts Edition
Privacy patch — FAFClient's start-up ping is now opt-in (FAF_TELEMETRY=1).
FAFClient (the Python SDK client — the MCP server never used it) sent a start-up ping, package name and version, by default, and the opt-out wasn't documented. It now sends only when you set FAF_TELEMETRY=1; FAF_TELEMETRY_OFF still turns it off. See faf.one/privacy.
v2.8.1 was a dependency patch —
faf-python-sdkfloor>=1.4.0, where the interop functions are now namedauthor_agents_md/author_gemini_md. Authored AGENTS.md / GEMINI.md output is byte-identical.
v2.8.0 — faf_auto now grounds its detection in the repo's own files, and every faf_model reference template scores 100% Trophy.
faf_auto used to read only the root manifest (pyproject.toml, package.json, …). It now also reads the files that carry the real stack: docker-compose service images map onto database / cache / search / storage (a running Postgres service is the database — it beats a dependency guess), Makefile / justfile targets map onto the commands block (test / build / check-all, root file or a nested backend/Makefile), and .github/workflows/ sets cicd. A polyglot repo that reported library / JavaScript now reports its real Postgres + Redis + FastAPI stack. In parity with faf-cli 7.10.
Separately: the 15 faf_model reference templates were scoring 48–57% — they filled 4 stack slots and used null. All rewritten to the full 21-slot schema; every one is 100% Trophy now, and a test keeps it that way. 13 tools · 265 tests.
v2.7.1 / v2.7.0 — The Interop Edition —
faf_agents/faf_geminirewritten asfaf-python-sdkauthoring-tool wrappers (were 4-field stubs); newfaf_migratebrings a.fafup to the current format. v2.6.0 — The Agent Card Edition added a realagent.fafapassport, an MCP Server Card (SEP-2127), and an AI Catalog entry. v2.5.0 — The Dart Edition detects Dart/Flutter frompubspec.yaml. v2.4.2 — The Confinement Edition confined every callerpathargument. v2.4.0 — The Chameleon Edition auto-selects its transport: stdio locally, Streamable HTTP on Cloud Run.
One-Minute Setup
1. Install
uvx gemini-faf-mcp # zero-install run via uvx (fetched from PyPI)
# or: pip3 install gemini-faf-mcp2. Add to Gemini CLI
gemini extensions install https://github.com/Wolfe-Jam/gemini-faf-mcp3. Author your project context
In your Gemini CLI:
> /faf:setupThat writes a starter project.faf and scores it. Then ask Gemini to fill it in from your repo (it calls faf_auto), and run /faf:score to see what's left. From then on, every Gemini session in this project reads it automatically.
Tip: Trophy ✪ = 100%: AI is optimized to code.
/faf:scoreshows exactly which slots are still empty.
Related MCP server: rust-faf-mcp RMCP
The "One-File" Advantage
A .faf file is structured YAML that captures your project DNA. Every AI agent reads it once and knows exactly what you're building.
# project.faf — your project, machine-readable
faf_version: "3.0"
project:
name: my-api
goal: REST API for user management
main_language: Python
stack:
backend: FastAPI
database: PostgreSQL
testing: pytest
human_context:
who: Backend developers
what: User CRUD with auth
why: Replace legacy PHP serviceResult: Gemini reads this once and knows your project. No 20-minute onboarding. No wrong assumptions. Every session starts aligned.
FAF defines. MD instructs. AI codes.
What about my GEMINI.md?
You don't replace it. .faf authors it. Run faf_gemini and you get a fresh GEMINI.md in Gemini CLI's own hierarchical, @file-importable convention — setup, verify, key files, stack, confirm-first actions — authored from a single source of truth instead of hand-maintained. Your hand-written content outside the faf-managed block is preserved.
> /faf:export
# Authors GEMINI.md from project.faf.faf is the source. GEMINI.md is one of its outputs. Same logic for AGENTS.md (OpenAI Codex), .cursorrules, CLAUDE.md, and others — write once, render everywhere.
Auto-Detect Your Stack
faf_auto scans your project's manifest files and its docker-compose services, Makefile targets, and CI config, then authors a .faf with accurate slot values. No manual entry needed.
> Auto-detect my project stack{
"detected": {
"main_language": "Python",
"package_manager": "uv",
"framework": "FastAPI",
"api_type": "REST",
"database": "PostgreSQL",
"cache": "Redis",
"hosting": "Docker Compose",
"cicd": "GitHub Actions",
"commands": { "test": "make test", "build": "make build", "lint": "make check-all" }
},
"score": 79,
"tier": "GREEN"
}database and cache came from docker-compose.yml, commands from the Makefile, cicd from .github/workflows/ — none of which the manifest scan sees. Fill in the six W's and you are at Trophy.
What it scans:
File | Detects |
| Python + build system + frameworks (FastAPI, Django, Flask, FastMCP) |
| JavaScript/TypeScript + frameworks (React, Vue, Next.js, Express) |
| Rust + cargo + frameworks (Axum, Actix) |
| Go + go modules + frameworks (Gin, Echo) |
| Python (fallback) / Ruby / PHP |
|
|
|
|
|
|
Priority rule: pyproject.toml / Cargo.toml / go.mod take priority over package.json. File-facts (a real compose service, a Makefile target) win over dependency guesses. Only sets values that are actually detected — no hardcoded defaults.
Google Antigravity
Antigravity reads one MCP config file, ~/.gemini/config/mcp_config.json, and takes both modes.
Local (stdio):
{ "mcpServers": { "gemini-faf": { "command": "uvx", "args": ["gemini-faf-mcp"] } } }Hosted:
{ "mcpServers": { "gemini-faf": { "serverUrl": "https://mcpaas.live/gemini/mcp/v1" } } }Antigravity expects serverUrl, not url or httpUrl.
All 13 Tools
Every tool carries MCP tool annotations: read only (faf_read, faf_validate, faf_score, faf_discover, faf_stringify, faf_context, faf_about, faf_model), writes without losing anything (faf_init, faf_auto, faf_gemini, faf_agents), rewrites the file (faf_migrate).
Create & Detect
Tool | What it does |
| Create a starter |
| Auto-detect stack from manifest files and author/update |
| Find |
Validate & Score
Tool | What it does |
| Full Mk4 validation — score, tier, slot counts, errors, warnings |
| Quick Mk4 score — score, tier, populated/active/total slot counts |
Read & Transform
Tool | What it does |
| Parse a |
| Convert parsed FAF data back to clean YAML |
| Get Gemini-optimized context (project + stack + score) |
Export & Interop
Tool | What it does |
| Export |
| Export a BETTER-shaped |
Migrate
Tool | What it does |
| Bring a |
Reference
Tool | What it does |
| FAF format info — IANA registration, version, ecosystem |
| Get a 100% Trophy-scored example |
Score and Tier System
Your .faf file is scored on completeness — how many slots are filled with real values.
Score | Tier | Meaning |
100% | TROPHY | AI has full context for your project |
99% | GOLD | Exceptional |
95% | SILVER | Top tier |
85% | BRONZE | Minimum recommended — AI can build from here |
70% | GREEN | Solid foundation |
55% | YELLOW | Needs improvement |
<55% | RED | Major gaps — AI will guess |
0% | WHITE | Empty |
Aim for Bronze (85%+). That's where AI stops guessing and starts knowing.
Using with Gemini CLI
> Create a .faf file for my Python FastAPI project
> Auto-detect my project and fill in the stack
> Score my .faf and show what's missing
> Export GEMINI.md for this project
> Show me a 100% example for an MCP server
> What is FAF and how does it work?
> Read my project.faf and summarize the stack
> Validate my .faf and fix the warnings
> Migrate my project.faf to the current formatArchitecture
gemini-faf-mcp v3.1.0
├── server.py → FastMCP MCP server (13 tools, dual-transport, Mk4 scoring)
├── safe_path.py → path confinement for caller-supplied `path` args
├── inject.py → non-destructive faf-managed-block injection
├── interrogate.py → Full-Facts grounding (docker-compose + Makefile signals)
├── main.py → Cloud Run REST API (GET/POST/PUT)
├── models.py → 15 project type examples
└── src/gemini_faf_mcp/ → Python SDK (FAFClient, parser)The MCP server delegates to faf-python-sdk for parsing, validation, Mk4 scoring, and AGENTS.md / GEMINI.md authoring. Stack detection in faf_auto — including the Full-Facts grounding — is Python-native, no external CLI dependencies.
Testing
pip3 install -e ".[dev]"
python -m pytest tests/ -v275 tests passing across the FastMCP server, Cloud Function, Mk4 WJTTC championship, Full-Facts grounding, path-confinement, write-guard, model-parity, Dart detection, and client-telemetry suites. Championship-grade test coverage — WJTTC certified.
FAF Ecosystem
One format, every AI platform.
Package | Platform | Registry |
Anthropic | npm + MCP #2759 | |
gemini-faf-mcp | PyPI | |
xAI | npm | |
Rust | crates.io | |
Universal | npm |
Python SDK
Use FAF directly in Python without MCP:
from gemini_faf_mcp import FAFClient, parse_faf, validate_faf, find_faf_file
# Parse and validate locally
data = parse_faf("project.faf")
result = validate_faf(data)
print(f"Score: {result['score']}%, Tier: {result['tier']}")
# Find .faf files automatically
faf_path = find_faf_file(".")
# Or use the Cloud Run endpoint
client = FAFClient()
dna = client.get_project_dna()FAFClient sends no telemetry unless you set FAF_TELEMETRY=1, which adds one start-up ping (package name and version). FAF_TELEMETRY_OFF always turns it off. Remote mode sends your requests to the Cloud Run endpoint. Privacy: faf.one/privacy.
Cloud Run REST API
Live endpoint for badges, multi-agent context brokering, and voice-to-FAF mutations.
https://faf-source-of-truth-631316210911.us-east1.run.appSupports agent-optimized responses (Gemini, Claude, Grok, Jules, Codex/Copilot/Cursor) via X-FAF-Agent header. Voice mutations via Gemini Live through PUT endpoint. Auto-deploys via Cloud Build on push to main.
If gemini-faf-mcp has been useful, consider starring the repo — it helps others find it.
Links
Citation
If you use gemini-faf-mcp or the .faf / .fafm / .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). Permanent Memory and Instant Recall: The .fafm Standard for Multi-Profile AI Agent Memory. Zenodo. https://doi.org/10.5281/zenodo.20348942
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{wolfe2026fafm,
title = {Permanent Memory and Instant Recall: The .fafm Standard for Multi-Profile AI Agent Memory},
author = {Wolfe, James},
year = {2026},
month = {may},
publisher = {Zenodo},
doi = {10.5281/zenodo.20348942},
url = {https://doi.org/10.5281/zenodo.20348942}
}
@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
Built by @wolfe_jam | wolfejam.dev
Get the CLI
faf-cli — The original AI-Context CLI. A must-have for every builder.
npx faf-cli autoAnthropic MCP #2759 · IANA Registered: application/vnd.faf+yaml · faf.one · npm
Available Tools
13 toolsfaf_aboutFaf AboutARead-only
FAF format info — IANA registration, version, ecosystem. Returns metadata about the FAF format, server version, and available MCP bridges. Use this when users ask what FAF is or how it connects to other AI platforms.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true and openWorldHint=false already establish this as a side-effect-free, non-networked read. The description adds the content scope of the response, which is modest value, but says nothing about auth, caching, or limits, and since an output schema exists the return enumeration is partly redundant. Adequate but not rich.
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 short clauses with the subject (FAF format info) front-loaded and the usage cue trailing. The first clause and the second sentence overlap slightly by both stating that format metadata is returned, a minor redundancy in an otherwise tight entry.
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 informational tool with an output schema covering the return shape, the description covers what the tool is and when to reach for it. Nothing needed to invoke it correctly is missing, though it could say a bit more about what distinguishes it from the other format-related siblings.
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 zero parameters, so there is no parameter semantics for the description to clarify; the baseline for a no-arg tool is 4. Nothing in the description misrepresents the empty input contract.
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 (the FAF format) and enumerates what the tool returns: IANA registration, version, ecosystem, server version, and available MCP bridges. That is enough to distinguish it from data-manipulation siblings like faf_read, faf_validate, or faf_migrate, though no sibling is named 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?
"Use this when users ask what FAF is or how it connects to other AI platforms" gives a clear triggering context rather than leaving usage implied. It stops short of naming alternatives (e.g. faf_model or faf_discover for deeper spec detail) or stating when not to use it, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_agentsFaf AgentsAIdempotent
Export and write AGENTS.md from a .faf file (non-destructive).
Authors a BETTER-shaped AGENTS.md (setup · tests · layout · conventions ·
three-tier guardrails · definition of done · security · commit) via
faf-python-sdk's authoring tool — in parity with faf-cli's faf export --agents.
Injects it into AGENTS.md as a faf-managed block, preserving any hand
content. Re-running updates the block in place — it never overwrites your file.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | project.faf |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false. The description usefully adds that it preserves hand-written content, injects a faf-managed block, and never overwrites the file, which clarifies the mutation behavior beyond the 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?
The description is front-loaded with the core action and then adds useful behavioral detail. It is slightly repetitive around non-destructive behavior, but every sentence contributes relevant context.
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 an output schema present and annotations covering safety and idempotency, the description supplies enough behavioral context for correct invocation. The main remaining gap is the undocumented path parameter, but overall it is complete for this 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 description coverage is 0% and the single path parameter is not mentioned by name or default in the description. The phrase 'from a .faf file' hints at the input but does not compensate for the missing parameter documentation.
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 clearly states a specific verb and resource: export/write AGENTS.md from a .faf file. It is specific enough to distinguish from most siblings, but it does not explicitly differentiate itself from other faf_* tools such as faf_stringify or faf_context.
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 description implies when to use it by naming the output artifact and noting that re-running updates the block in place. However, it gives no explicit when-not conditions or alternative sibling tools to use instead, leaving usage guidance at an implied level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_autoFaf AutoBIdempotent
Auto-detect project stack and author/update a .faf file. Scans package.json, pyproject.toml, Cargo.toml, go.mod, and other manifest files for language, framework, database, API type, and build tools — then grounds the result in the repo's own files: docker-compose service images (Postgres, Redis, Elasticsearch...) map onto stack slots, and Makefile / justfile targets map onto test / build / lint commands. Facts from files, no hardcoded defaults. Creates a new .faf if none exists, or fills empty slots in an existing one.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | project.faf | |
| directory | No | . |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and the description usefully elaborates beyond them: it lists the manifest files scanned, the fact that docker-compose images and Makefile/justfile targets are mapped, and that it only fills empty slots rather than overwriting. That last point is meaningful behavioral context for a mutation tool, though permissions/auth and any failure behavior remain unstated.
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 no filler; the mechanism and the create-or-fill outcome are stated up front. The middle sentence is dense with examples but every clause adds signal.
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?
An output schema exists, so return values need no elaboration, and the detection mechanics are well covered. The definition is still incomplete for a writer tool with 0% parameter coverage and heavy sibling overlap: it does not resolve how path/directory interact or when to prefer this over faf_init/faf_discover.
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 0%, so the description carries the full burden, yet it never mentions the two parameters. Crucially, the 'path' default ('project.faf') versus 'directory' ('.') distinction is ambiguous and undocumented, leaving the agent to infer which one governs where the file is written.
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?
It names a concrete verb (auto-detect + author/update) and resource (.faf file) and describes the mechanism in detail. The gap is sibling differentiation: faf_init and faf_discover plausibly overlap with this, yet the description never says how faf_auto differs from them, so an agent must guess.
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?
Usage is only implied through the create-or-fill branch ('Creates a new .faf if none exists, or fills empty slots in an existing one'), which is genuinely informative. But there is no explicit when-to-use vs faf_init/faf_discover/faf_read, and no exclusions or prerequisites stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_contextFaf ContextBRead-only
Get Gemini-optimized context from a .faf file. Returns the key sections an AI needs: project info, stack, instructions, and score. Use this to quickly understand a project without reading the full .faf structure.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | project.faf |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 safe read-only profile is covered. The description adds the shape of what comes back (project info, stack, instructions, score), but since an output schema exists this adds limited behavioral value and it discloses no side-effect or edge-case behavior.
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 tight sentences that front-load the core action and then the return content, with no filler. Efficient and well-ordered, though the second sentence could be slightly leaner.
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 read-only context-fetching tool with an output schema, the description covers what it does, what it returns, and a usage context, so an agent can call it correctly. The only notable gap is guidance on the path parameter and explicit differentiation from sibling retrieval tools.
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 0% and the single 'path' parameter (default 'project.faf') is never addressed in the description. The phrase 'from a .faf file' faintly implies path targets a .faf file, but the description does not compensate for the undocumented parameter or explain acceptable values.
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 (Get) and resource (Gemini-optimized context from a .faf file), and enumerates the sections returned (project info, stack, instructions, score). It partially differentiates from siblings by noting it avoids 'reading the full .faf structure', but does not clarify how it differs from close siblings like faf_gemini or faf_read.
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 quickly understand a project without reading the full .faf structure' gives a clear use case and implicitly contrasts with faf_read. However, no explicit alternatives are named and no when-not-to-use condition or prerequisite is stated, leaving the routing to inference among 12 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_discoverFaf DiscoverARead-only
Find .faf files in the project tree by walking up from start_dir. Searches the current directory and parent directories for project.faf. Use this before faf_read to locate the file automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| start_dir | No | . |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely new behavioral detail: the search proceeds upward from start_dir through parent directories, clarifying that this is not a flat directory lookup. It omits not-found behavior and search limits, so not a 5.
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 short sentences, zero filler, front-loaded with the core action and finishing with the routing hint. Every sentence earns its place.
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?
An output schema exists, so return values need not be described, and annotations cover the safety profile. Purpose, mechanism, and ordering relative to faf_read are all present. What is missing is failure semantics (no .faf found) for a discovery 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 0% and start_dir has no schema description, so the description must carry the load. It does explain that start_dir is the origin of an upward traversal, giving the parameter real meaning. It omits the '.' default and path-format expectations, so it only partially compensates.
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 ('Find .faf files') plus the exact mechanism ('walking up from start_dir') and target artifact ('project.faf'). It explicitly names the sibling faf_read, so an agent can distinguish it without inspecting 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?
Gives explicit workflow guidance: 'Use this before faf_read to locate the file automatically,' which tells the agent when this tool is the right choice. It does not state exclusions (e.g., what to do if no file exists or when to skip discovery), so it stops 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_geminiFaf GeminiAIdempotent
Export and write GEMINI.md from a .faf file (non-destructive).
Authors GEMINI.md in Gemini CLI's own convention (hierarchical,
@file-importable — setup · verify · key files · stack · confirm-first
actions) via faf-python-sdk's authoring tool, in parity with faf-cli's
faf export --gemini. Injects it as a faf-managed block, preserving any
hand content. Re-running updates the block in place.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | project.faf |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive and idempotent, but the description adds real substance beyond them: it discloses that output is injected as a faf-managed block, that hand-written content is preserved, and that re-running updates the block in place. This tells the agent exactly what is and is not overwritten, which is the key behavioral risk for a write tool.
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 correctly: the first clause gives verb, artifact and the non-destructive guarantee. The parenthetical listing of GEMINI.md sections is somewhat dense and partly decorative, but every sentence still earns its place.
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?
An output schema exists, so return values need no explanation, and the annotations plus description together cover the safety and idempotency profile well. The only real gap is the undocumented 'path' parameter, which is low-risk given it is optional with a default.
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', with 0% schema description coverage, and the description never mentions it, its expected format, or that it defaults to project.faf. The phrase 'from a .faf file' hints at the input but adds no syntax or resolution detail, so the schema carries an undocumented parameter with no compensating explanation.
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: 'Export and write GEMINI.md from a .faf file.' It also names what convention the output follows and equates itself to a known CLI command, so the purpose is unambiguous. It does not, however, differentiate itself from the likely sibling for other agent files (e.g. faf_agents), leaving the agent to infer the routing.
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?
Usage is implied rather than stated: this is the tool for producing GEMINI.md for Gemini CLI, but the description never says when to pick it over siblings like faf_agents or faf_context. There is no exclusion or precondition guidance, so the agent must infer the choice from tool names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_initFaf InitAIdempotent
Create a starter .faf file with project name, goal, and language. Writes a valid FAF YAML file with all required sections. Will not overwrite an existing file — use faf_discover first to check. The path is confined to the project root (cwd / FAF_ALLOWED_ROOTS).
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | ||
| name | No | my-project | |
| path | No | project.faf | |
| language | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=false, so the safety profile is known. The description adds genuinely new behavior: the no-clobber rule on existing files and the path confinement to cwd / FAF_ALLOWED_ROOTS, which is a sandbox constraint the annotations do not express.
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?
Four short sentences plus a parenthetical constraint; the core action and output are front-loaded and each sentence carries a distinct fact (what it writes, the no-overwrite rule, the path sandbox). Nothing is padded, though the constraint sentence could be tightened.
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?
An output schema exists, so return values need not be described, and the description covers the mutation's side effects and path safety. Complete enough for a 4-param optional-only tool; only parameter defaults and error behaviour on a blocked path are left implicit.
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 0%, so the description must compensate, and it largely does: it names name, goal, and language as the file's content and addresses path both via 'the path is confined to the project root' and the file it writes. It does not explain the defaults or accepted value formats, so it is not fully compensatory.
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 ('Create a starter .faf file') and names the exact contents (project name, goal, language) plus the output artefact (valid FAF YAML with all required sections). It also routes the agent away from itself toward the sibling faf_discover, so it is distinguishable from the other faf_* tools 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 an explicit when-not ('Will not overwrite an existing file') and names the alternative to use for the check ('use faf_discover first'). There is no guidance on when this is preferable to other creation/config siblings such as faf_auto or faf_migrate, but the main precondition is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_migrateFaf MigrateADestructiveIdempotent
Migrate a .faf file to the current format version (3.0).
Bumps faf_version, ensures the section roots exist (project, stack,
human_context, monorepo), and re-serializes. Legacy slot names
(frontend/database/…) still score via the registry's aliases — this
only touches the version and structure, never your values. The file is
re-serialized, so YAML comments and formatting are not kept. Parity with
faf-cli's faf migrate. Pass dry_run=true to preview.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | project.faf | |
| dry_run | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive=true/false readOnly, and the description adds substantial context beyond them: it names exactly what changes (faf_version bump, section roots created, re-serialization), what is preserved (values, legacy slot aliases), what is irreversibly lost (YAML comments and formatting), and how to preview via dry_run.
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 primary action, followed by the precise transformation details and caveats. Dense but every sentence carries distinct information — no filler or repetition of the 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?
An output schema exists so return shape needn't be described. The description covers mutation scope, data-loss caveat, idempotency-adjacent claims, and the dry-run escape hatch, leaving nothing an agent needs to call it safely.
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 0% and neither parameter is described in the schema, but the description explains the non-obvious dry_run semantics ('preview'), which is the parameter whose behavior actually matters; path is only implied via the .faf file reference.
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 (migrate) and resource (.faf file) plus the target version (3.0), and its scope (version + structure only) clearly separates it from siblings like faf_init, faf_validate, and faf_score.
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 a clear condition of use (moving a file to the current format version) and an operational hint ('Pass dry_run=true to preview'), but never names an alternative tool or states when NOT to use this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_modelFaf ModelARead-only
Get a 100% Trophy-scored example .faf file for a specific project type. Returns a complete, realistic project.faf that fills all 33 scored slots (populated, or slotignored where a slot does not apply). Use this as a reference when building or improving a .faf file — shows exactly what 100% looks like. Call without arguments to list all 15 available project types.
| Name | Required | Description | Default |
|---|---|---|---|
| project_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint already declaring the safety profile, the description adds real value: it explains the return is a complete realistic project.faf covering all 33 slots, including 'slotignored' semantics for non-applicable slots. It omits any rate limits or auth notes, but for a read-only reference tool this is solid disclosure.
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 core action, then adds scope, usage, and the no-argument behavior. Four sentences, each adding distinct information, though the 'shows exactly what 100% looks like' clause is mildly redundant with the Trophy-scored framing.
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?
An output schema exists, so return values need not be detailed, and the description still characterizes the returned file usefully. For a single-parameter read-only tool it covers purpose, usage, return shape, and no-arg behavior, with only the parameter's value format left unstated.
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 0% for the single project_type parameter, so the description must compensate. It explains the meaningful behavior — omitting the argument lists all 15 project types — but never states the expected value format or enumerates the valid types, leaving the parameter partially opaque.
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: 'Get a 100% Trophy-scored example .faf file for a specific project type', and clarifies it returns a complete project.faf filling all 33 scored slots. The purpose is unambiguous, but it never explicitly contrasts itself with siblings like faf_read or faf_init, so it stops short of a 5.
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 as a reference when building or improving a .faf file' clearly frames when to reach for this tool, and 'Call without arguments to list all 15 available project types' gives the discovery path. It offers no exclusions or named alternatives, so it lacks the explicit when-not guidance of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_readFaf ReadARead-only
Read project DNA from a .faf file. Returns the full parsed structure including project info, stack, preferences, and scoring data. Use this as the first step to understand any FAF-enabled project.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | project.faf |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 read-behavior detail (it returns the full parsed structure, not a partial view), but says nothing about failure modes such as a missing or malformed .faf file, which matters for a path-based reader.
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 short sentences, front-loaded with purpose and followed by return content and usage ordering. The return-content sentence partially duplicates the output schema, but no sentence is 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?
An output schema exists, so return values need not be spelled out, and the tool has one defaulted parameter and a covered safety profile. The main omission is edge-case behavior when the target file is absent or invalid.
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 0% for the single 'path' parameter, and the description only obliquely implies it by saying '.faf file'. It never explains the default (project.faf), path form, or resolution rules, so the description does not compensate for the schema gap.
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 ('Read project DNA from a .faf file') and even summarizes the returned structure. It does not differentiate itself from the many sibling tools (faf_stringify, faf_validate, faf_model), so an agent must infer the boundaries.
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 as the first step to understand any FAF-enabled project' gives clear when-to-use context and establishes the tool's entry-point role. It names no exclusions or alternatives, so an agent is not told when another sibling is preferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_scoreFaf ScoreARead-only
Quick Mk4 score check — returns score (0-100%), tier, and slot counts. Uses the Mk4 always-33 scoring engine (faf-kernel parity) for universal parity. Use this for status checks; use faf_validate when you need error details.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | project.faf |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=false, so safety profile is already covered. The description adds useful scope ('quick', 'status check' vs error-detail path) and names the scoring engine, but doesn't disclose the return shape beyond the three fields, and an output schema exists anyway. Modest added value over 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 tight sentences; the purpose is front-loaded and the routing instruction follows immediately. No filler, no repetition of the title.
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 simple single-param read-only status tool with an output schema, the description covers purpose and sibling routing, which is most of what's needed. The gap is the undocumented 'path' parameter, whose 0% schema coverage leaves an agent guessing about valid inputs.
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?
Only one optional parameter (path) with a default of 'project.faf', but schema description coverage is 0% — the schema gives no hint what 'path' points to or its format. The description does not compensate; it never mentions path, accepted file locations, or what happens if omitted/defaulted.
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 a specific verb+resource: 'Mk4 score check' returning score, tier, and slot counts. Distinguishes itself from sibling faf_validate by routing error-detail needs elsewhere. Not a 5 because 'Mk4 always-33 scoring engine (faf-kernel parity)' is jargon that may be opaque to a first-time agent, but the core purpose is legible.
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 for status checks; use faf_validate when you need error details' — names the alternative and the condition that selects it. This is exactly the when/when-not routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_stringifyFaf StringifyBRead-only
Convert parsed FAF data back to YAML string. Useful for displaying the raw .faf content or preparing it for editing. Reads the file, parses it, then re-serializes to clean YAML.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | project.faf |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 genuine process detail ('Reads the file, parses it, then re-serializes'), but says nothing about failure behavior on malformed YAML or path resolution. With annotations handling the read-only story, a 3 is fair.
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 brief, front-loaded sentences with no filler. Slight redundancy between the second and third sentences, which restate the display/edit intent alongside the mechanics, but it is efficient overall.
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?
An output schema exists, so return values need not be spelled out, and the operation is a simple single-param read. The main gap is sibling differentiation: the description never clarifies why an agent should choose faf_stringify over faf_read, which matters given twelve related tools.
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?
One parameter ('path') with 0% schema description coverage and a default of project.faf. The description only hints at it via 'Reads the file', never naming the parameter or explaining the default or accepted path forms. Marginal value over the bare schema.
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 concrete verb+resource ('Convert parsed FAF data back to YAML string') and the pipeline that produces it. It is distinguishable from read-only siblings like faf_read, though it never names one directly. Minor tension: it claims to convert 'parsed FAF data' while the third sentence reveals the input is a file path.
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?
Offers two use contexts ('displaying the raw .faf content or preparing it for editing'), which implies when to reach for it. However, it gives no when-not guidance and never contrasts against faf_read or faf_model, which an agent must otherwise infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_validateFaf ValidateARead-only
Validate a .faf file and return score, tier, and issues. Returns errors (must fix) and warnings (should fix) with specific messages. Use after faf_init or when checking if a .faf file meets quality standards.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | project.faf |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=false, so the agent already knows this is a safe, local read. The description adds useful behavioral nuance by categorizing output into errors (must fix) and warnings (should fix), but it doesn't expand on whether validation can fail, how deep the checks go, or any file prerequisites. With annotations covering the safety profile, a 3 is appropriate.
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, front-loaded with the result of validation, then output structure, then usage. No filler or redundancy; every sentence is informative.
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?
An output schema exists, so the description needn't detail return values, and it correctly sketches them anyway. It covers purpose, output categories, and when to run it. The only minor gap is not relating it to sibling tools like faf_score, but for a single-param read-only validator it is sufficiently complete.
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 0% and the single 'path' parameter has a default but no description in the schema. The description says 'a .faf file' but does not explain the path parameter, its default, or expected format. It adds only marginal meaning, so baseline 3 (one param, implicit scope) is fair.
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 states a specific verb (validate) and resource (.faf file), and it names the concrete return values: score, tier, and issues. This distinguishes it from siblings like faf_score (which only scores) and faf_read, giving an agent a clear functional boundary 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?
It explicitly says to use it 'after faf_init' and 'when checking if a .faf file meets quality standards', providing clear usage context and a workflow anchor. It doesn't name alternatives or state when not to use it (e.g., vs. faf_score), but the context is strong.
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.
1 tool update
v2.8.2- Added
faf_migrate
12 tool updates
v2.1.2- First observed
faf_about - First observed
faf_agents - First observed
faf_auto - First observed
faf_context - First observed
faf_discover - First observed
faf_gemini - First observed
faf_init - First observed
faf_model - First observed
faf_read - First observed
faf_score - First observed
faf_stringify - First observed
faf_validate
TDQS
Scored across 13 tools
Most tools target distinct operations (read, discover, init, migrate, export), and the descriptions actively differentiate the two closest pairs: faf_validate vs faf_score (error details vs quick status) and faf_read vs faf_context (full structure vs AI-optimized subset). The overlap is real but the guidance reduces misselection, leaving only mild ambiguity.
Every tool uses a uniform faf_ prefix followed by a single snake_case noun/verb (faf_read, faf_score, faf_discover, faf_migrate). The pattern is fully predictable throughout with no mixed conventions.
13 tools sit squarely in the well-scoped 3-15 range, and each maps to a concrete lifecycle step (discover, init/auto, read/context, validate/score, stringify, migrate, export). No tool feels redundant or padded.
The surface covers the full FAF lifecycle: discovery, creation (init/auto), reading (read/context), validation/scoring, serialization, migration, and two export targets (GEMINI.md, AGENTS.md). Minor gaps exist — no explicit delete/edit for arbitrary slots and no updater beyond faf_auto filling empty slots — but core workflows are covered.
Maintenance
Related MCP Connectors
Persistent project context for xAI Grok. IANA-registered .faf format.
Persistent project context for Claude. IANA-registered .faf format.
Persistent project context — Rust-native MCP server. IANA-registered .faf format.
Project management shared by people and AI agents, with persistent project state through MCP.
1
Related MCP Servers
- AlicenseAqualityBmaintenance.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.14554 npm23MIT
- 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.90 npm4MIT
- AlicenseAqualityAmaintenancePersistent project context MCP server that syncs a single .faf file to all AI tool formats (Cursor, Windsurf, Cline, etc.), enabling eternal bi-sync and optimized context for AI assistants.15217 npm7MIT
- AlicenseBqualityCmaintenancePortable, auditable, local-first MCP memory for MCP-compatible AI agents and coding workflows. It keeps durable project memory outside the model runtime, compresses continuity into smaller working packs, and carries forward operational state so agents can resume with less repetition.2839Apache 2.0