gemini-faf-mcp
A Gemini (MCP) server for reading, validating, scoring, and authoring .faf project-context files so every AI session understands your project without re-explanation.
Read project DNA — parse a
.fafinto full structured data (faf_read)Validate — get score, tier, errors, and warnings (
faf_validate)Score quickly — Mk4 21-slot score, tier, and slot counts (
faf_score)Discover files — walk up the tree to locate
project.faf(faf_discover)Create a starter
.fafwith name, goal, language (faf_init)Auto-detect stack — scan manifests, docker-compose, Makefile, CI and write/update the
.faf(faf_auto)Get Gemini-optimized context — project, stack, instructions, score (
faf_context)Convert parsed FAF data back to clean YAML (
faf_stringify)Export
GEMINI.mdnon-destructively via a managed block (faf_gemini)Export
AGENTS.mdfor Codex, Cursor, and other agents (faf_agents)Get reference templates — 100% Trophy examples for 15 project types (
faf_model)Query format info — IANA registration, version, ecosystem bridges (
faf_about)Protect paths — caller-supplied
pathargs are confined to the project root
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 — The Full-Facts Edition
Persistent Project Context for Google Gemini. Define once. Sync everywhere.
FAF defines. MD instructs. AI codes.
⭐ A star helps other devs discover gemini-faf-mcp — despite the downloads, ~3 of 4 devs check stars first.
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 (.faf at 85%+ Bronze)
───────────────────────── ─────────────────────────
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 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:setupYou should see: Created project.faf — Score: 85% (BRONZE). From this point, every Gemini session in this project reads it automatically.
Tip: A score of 85% (BRONZE) is the minimum where Gemini stops guessing. Run
/faf:scoreto see what's missing and how to push to 100% (TROPHY).
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.
All 13 Tools
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 v2.8.2
├── 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/ -v265 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 AboutA
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?
No annotations are provided, so the description carries the full burden. It implies a read-only informational operation via 'Returns metadata' and 'info', but does not explicitly state absence of side effects, required permissions, or rate limits. Adequate but not rich for a zero-param info 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?
Three short sentences, front-loaded with what the tool returns and followed by the usage trigger. Slight redundancy between 'FAF format info' and 'Returns metadata about the FAF format' but no filler sentences.
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 need not explain return values, yet it still states the key returned metadata. For a simple, zero-param info tool with no annotations, it gives enough for an agent to select and invoke 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?
Zero parameters, so the baseline is 4 per rubric. The description adds no parameter semantics because none are needed or possible.
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 'Returns metadata' and resource 'FAF format, server version, and available MCP bridges', clearly distinguishing from write-oriented siblings like faf_init or faf_stringify. Does not explicitly name alternatives, but scope is clear enough for selection.
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 trigger: 'Use this when users ask what FAF is or how it connects to other AI platforms.' No when-not conditions or named sibling alternatives are provided, so it falls 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 AgentsA
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?
With no annotations provided, the description carries the full burden and does well: it declares non-destructive behavior, block-scoped injection that preserves hand-written content, idempotent re-runs, and the exact output sections authored. It stops short of stating auth/permission needs or failure modes if the file is missing or malformed.
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 export/authoring summary and the parenthetical section list is compact and informative. Mild redundancy: 'non-destructive' is asserted twice ('non-destructive' and 'it never overwrites your file'), slightly padding the ending.
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 behavioral contract (block injection, preservation, in-place update) is well covered for a file-mutating tool with zero annotations. The only real gap is the undocumented `path` parameter and 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?
Schema description coverage is 0% for the single `path` parameter, so the description must compensate; it only alludes to 'a .faf file' and never names the parameter, its default (`project.faf`), or accepted path formats. Partial coverage of a one-param tool, hence a middling score.
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/write AGENTS.md from a .faf file) and the mechanism (faf-python-sdk authoring, parity with `faf export --agents`), which clearly separates it from siblings like faf_stringify, faf_migrate, or faf_init.
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: it's the tool that produces/refreshes the AGENTS.md block, and re-running updates in place. But it never says when to prefer this over sibling tools (e.g. faf_init or faf_auto for the same file), nor any prerequisite such as a valid .faf existing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_autoFaf AutoB
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?
With no annotations, the description carries the full burden and does so reasonably well: it discloses the mutation profile (creates or updates a file), the non-destructive rule (only fills empty slots), and the sourcing method (facts from files, no hardcoded defaults). It omits permission requirements and whether existing populated values are ever overwritten, but the mechanism is unusually well described for an unannotated 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?
It is a tight, front-loaded paragraph: purpose first, then the detection mechanism, then the create-vs-fill behavior. The manifest list is slightly padded but each example adds useful specificity, 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?
An output schema exists, so return values need not be explained, and the detection/mutation behavior is well covered. The main gap is the two undocumented parameters, which leaves the definition incomplete for a tool the agent must invoke with a file path and directory.
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% across two parameters, yet the description never mentions path or directory, their defaults, or how they interact (e.g. file name vs. working directory). The agent must infer everything from the raw JSON schema, so the description fails to compensate for the coverage 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?
The description gives a specific verb and resource: auto-detect project stack and author/update a .faf file, and spells out what it scans (package.json, pyproject.toml, docker-compose, Makefile). It is clear, but it never distinguishes itself from siblings like faf_init or faf_discover, which an agent would need to choose 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?
"Creates a new .faf if none exists, or fills empty slots in an existing one" gives one clear state condition, implying use when a .faf is missing or partially populated. However, there is no explicit when-to-use versus faf_init/faf_discover/faf_migrate, and no prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_contextFaf ContextA
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?
No annotations are provided, so the description must carry the full behavioral burden. It discloses the output shape (project info, stack, instructions, score) and that it reads rather than writes, but says nothing about auth, side effects, error behavior for missing files, or what happens with the default path.
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 the action and purpose. No filler. The 'Use this to...' sentence is slightly redundant with the earlier enumeration but earns its place by framing intent.
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 value details need not be described; the description still usefully summarizes sections. Missing the path parameter behavior and any file-not-found handling, but otherwise adequate for a simple read 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?
Only one parameter with 0% schema description coverage; the description never mentions the 'path' parameter, its default, or the expected .faf file format/location. With 1 param and low coverage, the description fails to compensate at all, though the surface area is small.
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 Gemini-optimized context from a .faf file', followed by an enumeration of what's returned (project info, stack, instructions, score). It does not, however, distinguish itself from siblings like faf_read, faf_gemini, or faf_score, which likely overlap in scope.
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 an implied use case ('to quickly understand a project without reading the full .faf structure'), which is useful framing. But it doesn't name which sibling to use instead for a full read (faf_read) or how it differs from faf_gemini, which is especially important given the overlapping sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_discoverFaf DiscoverA
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?
With no annotations, the description carries the full behavioral burden. It usefully discloses the search algorithm (ascend from start_dir through the current and parent directories) and the target filename (project.faf), implying a read-only operation. It does not say what happens on no match, whether multiple matches are returned, or whether traversal stops at a root, leaving real gaps.
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 with the core action front-loaded and the usage hint last where it belongs. Minor redundancy between 'walking up from start_dir' and 'searches the current directory and parent directories,' but no real waste.
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-parameter discovery tool with an output schema (so return format needn't be described), the description covers purpose, traversal semantics, and where it fits relative to faf_read. Missing only failure/no-match behavior and the parameter 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?
Schema description coverage is 0%, so the description must compensate for the single parameter. It explains start_dir as the origin of the upward walk, which adds meaning beyond the bare schema, but omits the default value ('.') and whether relative/absolute paths are accepted.
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 ('Find') and resource ('.faf files'), plus the exact traversal behavior ('walking up ... parent directories for project.faf'). It also names the sibling it precedes (faf_read), so an agent can distinguish it from faf_read 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 when to use it: 'Use this before faf_read to locate the file automatically,' which gives ordering relative to an alternative. It lacks any when-not condition (e.g., what to do if the file is already known), so it stops 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_geminiFaf GeminiA
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?
With no annotations, the description carries the full burden and does well: it discloses non-destructiveness, faf-managed block injection, preservation of hand-written content, and idempotent re-run behavior. Auth/prerequisite context is absent, but the behavioral profile is otherwise 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?
The core action is front-loaded in the first sentence, and details follow usefully. Some phrasing is dense/redundant (the parity clause plus the convention parenthetical), but every sentence adds real 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?
An output schema exists, so return values need not be explained, and the description adequately covers what is written and how it merges with existing content. Only the lone parameter's semantics are left under-specified.
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 with 0% schema description coverage. The description implies the .faf source ('from a .faf file') but never names or explains the `path` parameter, its default, or accepted values, so compensation for the coverage gap is only partial.
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 specific verbs and resource ('Export and write GEMINI.md from a .faf file') and the generated artifact's convention (hierarchical, @file-importable). It is distinguishable from siblings, though it does not explicitly contrast itself with any of them by name.
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 by the description ('in parity with faf-cli's `faf export --gemini`') but there is no explicit when-to-use vs alternatives guidance or exclusions among the many faf_* siblings. An agent must infer that this tool targets Gemini specifically.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_initFaf InitA
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?
With no annotations, the description carries the burden and does well: it discloses that it writes a valid FAF YAML file with all required sections, refuses to overwrite existing files, and confines the path to the project root (cwd / FAF_ALLOWED_ROOTS). The only gap is the absence of any note on permissions or what the write returns, but the safety profile is well covered.
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, each carrying a distinct piece of load-bearing information (purpose, output validity, non-overwrite rule, path scope), with the primary action front-loaded. 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?
An output schema exists, so return values need not be documented. The description covers purpose, safety behavior, and path scoping for a 4-parameter write tool, leaving only minor gaps around parameter defaults and privilege requirements.
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 maps three of four parameters (name, goal, language) plus the path constraint (root confinement). It adds real meaning beyond the bare schema, though it does not clarify defaults or that all four parameters are optional.
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: creates a starter .faf file and enumerates the fields written (project name, goal, language). It also names faf_discover as the pre-check sibling, giving partial differentiation from the large sibling set, though it does not contrast with close relatives like faf_auto or faf_migrate.
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 gives the when-not condition ('Will not overwrite an existing file') and routes to the alternative ('use faf_discover first to check'). This is clear conditional guidance, but it does not describe the general when-to-use case versus faf_auto/faf_migrate for starting a project.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_migrateFaf MigrateA
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. 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?
With no annotations, the description carries the full behavioral burden and does well: it discloses that it bumps faf_version, ensures section roots exist, re-serializes, preserves values, and offers dry_run previewing. It does not cover permissions, error handling, or whether migrations are idempotent, but the core effects are unusually clear.
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 main action, then adds necessary behavioral details in a compact paragraph. Every sentence adds useful context about scope, guarantees, and dry_run, with 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?
The tool has moderate complexity with two parameters and an output schema, so return values do not need explanation here. The description covers the migration behavior, what gets modified, and what stays untouched, but could add a brief note on prerequisites or idempotency.
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 both parameters. The description explains dry_run ('Pass dry_run=true to preview') and implies the path is the .faf file to migrate, but it does not document the default filename or path format, so it only partially compensates for the missing 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?
The description states a specific verb and resource: 'Migrate a .faf file to the current format version (3.0)'. It adds concrete detail about what migration changes, which clearly distinguishes it from siblings like faf_init or faf_validate, though it does not explicitly name alternative 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?
The description implies when the tool is useful ('Migrate a .faf file to the current format version') and mentions the dry_run preview option, but it does not explicitly say when to choose this tool over siblings or what conditions require migration versus validation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_modelFaf ModelA
Get a 100% Trophy-scored example .faf file for a specific project type. Returns a complete, realistic project.faf that fills all 21 scored slots. 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 no annotations, the description carries the full burden and it does disclose non-obvious behavior: the file fills 'all 21 scored slots' and an argument-free call 'list[s] all 15 available project types'. That empty-argument fallback is genuinely behavioral information the schema cannot convey. It stops short of stating the operation is side-effect-free or what an invalid project_type returns.
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, all front-loaded with the core output first and the no-argument behavior last. There is mild redundancy between '100% Trophy-scored' and 'shows exactly what 100% looks like', 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?
For a simple single-parameter fetch tool with an output schema present, the description covers selection, output nature, and the empty-argument mode, so an agent can call it correctly. The main omission is not distinguishing itself from the many sibling faf_* tools that also operate on .faf files.
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 parameter has no schema description or enum, so the description must compensate — and it largely does by explaining that project_type selects a project type and that the 15 valid values can be enumerated via a no-argument call. It does not specify the accepted value format (slug vs. label), leaving a small gap the agent must probe for.
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 and resource ('Get a ... example .faf file') plus a clear scope ('for a specific project type'), so its purpose is unambiguous. It never names which sibling it complements (faf_init, faf_score, faf_validate), but against a 13-tool family that only costs it the top 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?
'Use this as a reference when building or improving a .faf file' supplies a concrete usage context, which is stronger than mere implication. However, it names no alternative and states no when-not-to-use condition, so it falls short of an explicit routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_readFaf ReadA
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?
With no annotations, the description carries the full burden. It implies read-only behavior ("Read") and discloses what is returned, but says nothing about failure modes (missing file, malformed .faf), permissions, or whether anything is written back, so an agent cannot fully predict behavior on edge cases.
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 the core action and return contents, then the usage hint. 'Project DNA' is mildly informal but not wasteful; nothing is padded.
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 still summarizes the parsed structure. For a one-parameter read tool this is nearly sufficient, with only the default-path behavior 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 'path' parameter, so the description must compensate and only partially does: it names the file type but never mentions that a path can be supplied or that it defaults to 'project.faf'. Calling the tool with no arguments is the common case and its behavior is never explained.
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 and resource (read project DNA from a .faf file) and names what it returns (project info, stack, preferences, scoring data). It does not explicitly differentiate itself from siblings that also read a .faf file, such as faf_validate or faf_score, 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 the first step to understand any FAF-enabled project' gives a clear sequencing/call-context directive rather than leaving usage to inference. However, it names no alternative (faf_validate, faf_score, faf_discover) and states no when-not conditions, so it lacks true routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_scoreFaf ScoreA
Quick Mk4 score check — returns score (0-100%), tier, and slot counts. Uses the Mk4 Championship 21-slot scoring engine 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?
No annotations are provided, so the description carries the full disclosure burden. 'Check' and 'returns' imply a read-only operation and it adds engine context (Mk4 Championship 21-slot), but it never explicitly confirms no side effects or write behavior. 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 sentences, front-loaded with what it returns before the routing guidance. Every sentence earns its place with 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?
An output schema exists, so return values needn't be re-explained. For a simple read tool the description is nearly complete, with the only gap being the undocumented path parameter and the absence of any explicit read-only confirmation.
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 there is one parameter ('path', default 'project.faf') that the description never mentions. The description does nothing to explain the path argument or its default, so it fails to compensate for the coverage 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 ('score check') and enumerates the return payload (score 0-100%, tier, slot counts). It names the sibling it is not (faf_validate), so an agent can distinguish 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 routes usage: 'Use this for status checks; use faf_validate when you need error details.' The alternative and the condition that selects it are both stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_stringifyFaf StringifyB
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?
No annotations are provided, so the description carries the full behavioral burden. It does disclose the internal pipeline ('reads the file, parses it, then re-serializes'), which is useful, but it omits whether the source file is modified, what happens if the file is missing or invalid, and any permission/auth requirements. The 'preparing it for editing' phrasing hints at a non-mutating return-only tool but never states it outright.
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 with the core action front-loaded and no filler. Efficient, though the second and third sentences could be merged without loss.
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 need not spell out return values, and it correctly summarizes the output as clean YAML. For a single-optional-parameter transform tool this is nearly sufficient; the only real gap is error/default-path behavior for the '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?
Schema description coverage is 0% for the single 'path' parameter (default 'project.faf'). The description refers only to 'the file,' adding no default value, path format, or resolution semantics beyond what the bare schema already shows, so it fails to compensate for the coverage 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: 'Convert parsed FAF data back to YAML string,' which is concrete and distinguishable from read/validate/score siblings. It does not explicitly contrast itself with the closest sibling faf_read, so it falls short of the 5 bar.
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 usage contexts ('displaying the raw .faf content or preparing it for editing'), which implies when to reach for it. However, it never names alternatives (e.g., faf_read) or states when NOT to use it, so routing among the 13 siblings is largely left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
faf_validateFaf ValidateA
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?
With no annotations, the description carries the full burden. It usefully explains that errors are must-fix and warnings should-fix and that messages are specific, but it never states that validation is read-only, that it touches no other state, or whether it can fail on a missing path.
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 the core action and output, then the error/warning distinction, then usage. Nothing is padded, though the return-value sentence is partly redundant given an output schema exists.
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 single-argument, non-destructive validation tool with an output schema, the description covers action, output shape, and trigger condition adequately. The only real gap is the undocumented path parameter.
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 one parameter with 0% schema description coverage, and the description never mentions 'path' or its default of project.faf. An agent must infer that the argument is a file path to the target .faf file.
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 (validate) and resource (.faf file) and even names the outputs (score, tier, issues). It does not differentiate from the sibling faf_score, which likely also produces a score, so an agent cannot fully disambiguate without opening both.
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 after faf_init or when checking if a .faf file meets quality standards" gives a concrete trigger and sequencing. It stops short of stating when NOT to use it or naming an alternative to faf_score, which is the obvious candidate.
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 have distinct purposes, but several pairs overlap: faf_validate vs faf_score both return score/tier (differing only in detail level), faf_init vs faf_auto both create .faf files, and faf_context vs faf_read both read the file. The descriptions do explicitly clarify the boundaries, keeping confusion manageable.
Every tool uses a uniform snake_case 'faf_<verb/noun>' pattern with a shared prefix, making the set highly predictable. No mixing of conventions.
13 tools is well within the ideal range and each maps to a meaningful operation (create, read, discover, validate, score, migrate, export, model). No tool feels redundant enough to be dead weight.
The lifecycle is well covered: discover/read/context for reading, init/auto for creation, validate/score for quality, migrate for format, and gemini/agents for export. A minor gap is the absence of an explicit arbitrary edit/write-back tool (stringify prepares content for editing but nothing writes it).
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.
Share one project context across ChatGPT, Claude, Telegram and any MCP client.
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.14313 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.109 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.15905 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.2837Apache 2.0