Skip to main content
Glama

atlas

Tests PyPI version atlas-brief-mcp MCP server – quality and maintenance score on Glama Python 3.10+ License: MIT

Project documentation as an index and a wiring gate — not as context fuel.

Why atlas · Measured Benchmarks · 30s Quickstart · Bootstrap (atlas init) · MCP Client Setup · The 15 Tools · Google Docs & Sheets

atlas-brief-mcp overview


atlas is a local MCP server for coding agents. Ask "where is the damage model described?" and get back a file, a line, and a section anchor (~60 tokens) — instead of dumping 20,000+ tokens of raw Markdown into the context window.

When the agent finishes a task and tries to mark a work order ✅ DONE, atlas checks the codebase first: if the target function or class is defined with zero callers/references, the checkoff is refused.

┌──────────────┐    ~60 tok     ┌──────────────┐   section only   ┌─────────────────┐
│ atlas_where  │ ─────────────► │  atlas_read  │ ───────────────► │ atlas_code_find │
│ (BM25 / FTS5)│                │  (by anchor) │                  │  (9 languages)  │
└──────────────┘                └──────────────┘                  └────────┬────────┘
                                                                           │
       ┌───────────────────────────────────────────────────────────────────┘
       ▼
┌──────────────────────────────────────────────────────────┐
│ atlas_publish / atlas_set_status  (Wiring Gate)          │
│  ├─ callers > 0  ──► Write ✅ DONE + verify read-back    │
│  └─ callers == 0 ──► REFUSE write ("defined, 0 callers") │
└──────────────────────────────────────────────────────────┘

Works 100% offline with any folder of Markdown (docs/, specs/, adr/, gdd/) — plus optional live sync for multi-tab Google Docs and Google Sheets.


🛑 The Refusal (Why atlas Exists)

atlas exists because of a specific production failure. An agent implemented 1,070 lines, forgot the single dispatcher call that made them reachable, and reported "done". The next cleanup run saw an unused-function warning and deleted all of it — the lines were never committed, so nothing could be recovered. Nobody had asked the question atlas now asks before every checkoff: is this actually wired up?

That failure has a shape, and atlas answers it with a hard refusal instead of a warning nobody reads:

{
  "written": false,
  "refused": true,
  "refusal": "Acceptance refused — wiring check failed:\n  ✗ '_dispatch_unit_class_skill' is defined in scripts/turn_manager.gd:3774 but never called or bound (0 calls, 0 references)\n\nA ✅ without a caller documents an intention, not a result."
}

That check runs before any network or filesystem write, so it costs nothing when it blocks. It has caught this exact class of mistake twice in real use.


Related MCP server: docs-mcp

📊 Measured Benchmarks

All numbers below were measured with atlas measure on a real production project (5-tab specification document, 124 sections, 218 source files) — no synthetic estimates:

Task

Naive File Read (Read / Grep)

With atlas (SQLite FTS5 + AST/Regex)

Token Reduction

Answer one doc question (atlas_where → atlas_read)

20,364 tokens

875 tokens

−96%

Locate 8 code symbols & callers (atlas_code_find)

291,447 tokens

3,106 tokens

−99%

Inspect one symbol in a monolith file

74,522 tokens

388 tokens

−99%

8-question benchmark run (atlas measure)

224,088 tokens

5,945 tokens

−97%

How atlas compares to other approaches

Capability

Raw File Reads (cat / Read)

Read-Only Doc Indexers

atlas

Granularity

Full files (10k–70k tokens)

Section snippets (~300–1,000 tokens)

~60-token pointers (atlas_where) + on-demand sections (atlas_read)

Search Engine

Linear grep

Embeddings or basic FTS

Local SQLite FTS5 (BM25) + EN/DE compound & umlaut folding

Code Symbol & Caller Lookup

Manual grep across repo

❌ None

✅ atlas_code_find across 9 languages (definitions + call/ref counts)

Dead-Code Wiring Gate

❌ Trusts agent self-report

❌ Read-only

✅ Refuses ✅ DONE when verify_symbols has 0 callers

Task & Work-Order State

Lost when chat ends

❌ None

✅ atlas_status / atlas_tasks / atlas_brief persisted in docs

Cloud & Privacy

Local

Varies (often cloud embeddings)

100% local & offline (optional Google Docs/Sheets OAuth)


🧠 Context That Survives the Chat

Every new agent session starts blind. It re-reads the repository, re-discovers where things live, re-derives what the current state is — and when the context window fills up, the next session starts over. The map lives in the conversation, and conversations are disposable.

atlas moves the map next to the code:

  • atlas_where answers "where is this documented?" in one call — for any fresh chat.

  • atlas_status says which work orders are done, so the checklist survives the session.

  • atlas init writes the architecture down once instead of re-deriving it every week.

  • atlas_set_status records the outcome in the document, not in the transcript.

You can close a chat mid-task and open a new one. The next session asks three questions and is up to speed in three tool calls, without reading a single file end to end.

What it does not know is what you discussed. A decision that was never written down is gone — which is the same rule as before, just applied to conversations: if it matters, it belongs in the document.


⚡ 30-Second Quickstart

Requires Python 3.10+ and uv (or pipx). No Google account, no API key, and no network access required.

1. Install from PyPI

# Recommended (installs `atlas` globally in an isolated environment)
uv tool install atlas-brief-mcp

# Or with pipx / pip
pipx install atlas-brief-mcp
pip install atlas-brief-mcp

# Or run directly without installing via uvx
uvx --from atlas-brief-mcp atlas --help

PATH note: If atlas is not found after uv tool install, run uv tool update-shell once (or add ~/.local/bin / %USERPROFILE%\.local\bin to your PATH).

2. Try it on the bundled demo project

atlas --root examples/demo doctor
atlas --root examples/demo where "Where is the damage model?"
atlas --root examples/demo brief "damage calculation"

Any folder of .md files works — docs/, specs/, atlas/, gdd/. The index lives in <root>/.atlas/index.sqlite, can be regenerated at any time, and your Markdown stays the source of truth.


🏗️ Bootstrap an Existing Repository

cd your-project
atlas init

Scans the repository — no LLM, no network, under 0.3 seconds for 50 files — and generates docs/ARCHITECTURE.md containing:

  • Domains: every source folder with files, line counts, token estimates, and the largest functions per domain (not the first ones — those are getters).

  • Context hotspots: files over 10,000 tokens that should never be read whole.

  • Unwired symbols: functions over 15 lines whose name appears nowhere else — candidates for "implemented but never connected".

It also writes AGENTS.md, .antigravityrules, .mcp.json, and adds .atlas/ to .gitignore — but only if they don't already exist. atlas init never overwrites your rules.

atlas init --dry-run            # Preview what would be created, write nothing
atlas init --out docs/ARCH.md   # Custom output path
atlas init --force              # Regenerate deliberately

init records what it created in .atlas/managed.json. atlas lint uses that to separate managed documents (must be clean, exit code 1) from discovered legacy docs (reported as hints, exit code 0).

Supported Languages (9 Languages)

  • GDScript & Godot Scenes (.gd, .tscn)

  • Python (.py)

  • TypeScript / JavaScript (.ts, .tsx, .js, .jsx — including React.memo(...) and forwardRef<...>(...) wrappers)

  • Rust (.rs)

  • C# (.cs)

  • Go (.go)

  • Java & Kotlin (.java, .kt)

  • Swift (.swift)

Test functions (test_*, Test*, *_test) and framework-bound functions (@decorator, @mcp.tool()) are automatically excluded from unwired warnings.

Writing Without Google (100% Local Loop)

atlas init creates docs/ARCHITECTURE.md with Work Order 1 — ⬜ OPEN. If no Google document is bound to the project, atlas writes straight into that local Markdown file — with the same contract, read-back verification, and .atlas/mutations.log audit trail:

atlas set-status --wo 1 --status done --verify-symbols my_func   # ⬜ OPEN -> ✅ DONE + records symbol
atlas set-status --task "Balance damage" --status done           # - [ ] -> - [x] in Markdown
atlas status                                                     # Reads the verified state
atlas check                                                      # CI / pre-commit regression guard

🔌 MCP Client Setup

The server speaks standard MCP over stdio. Because ATLAS_ROOT=. resolves relative to the client's working directory, one installation serves every project.

1. Zero-Install via uvx (Claude Code / Cursor / Windsurf / Antigravity)

Runs directly from PyPI without pre-installing:

{
  "mcpServers": {
    "atlas": {
      "command": "uvx",
      "args": ["--from", "atlas-brief-mcp", "atlas", "serve"],
      "env": { "ATLAS_ROOT": "." }
    }
  }
}

2. Local CLI Install (.mcp.json / ~/.gemini/config/mcp_config.json)

If you installed atlas via uv tool install atlas-brief-mcp (or let atlas init create .mcp.json):

{
  "mcpServers": {
    "atlas": {
      "command": "atlas",
      "args": ["serve"],
      "env": { "ATLAS_ROOT": "." }
    }
  }
}

3. Claude Desktop (claude_desktop_config.json)

Same block as above. On Windows, use "command": "atlas.exe" if the bare command name is not resolved.

Built-in Agent Guardrails: On connect, atlas delivers its own MCP instructions telling the agent to route documentation lookups through atlas_where → atlas_read instead of Read/Grep, and to call atlas_set_status / atlas_publish only after tests pass.


🛠️ The 15 Tools

Category

Tool

Purpose

Read & Search

atlas_where

Fast topic → file, line, heading & section anchor (~60 tokens)

Read & Search

atlas_search

Full-text BM25 search across all sections (EN + DE stop words & umlaut folding)

Read & Search

atlas_read

Read a single section by anchor (offset / max_chars budget control)

Read & Search

atlas_outline

Full table of contents across all indexed documents (or one doc)

Read & Search

atlas_links

Section cross-references, tags, sibling sections, and linked implements: code files

Workflow & Briefs

atlas_brief

Build a self-contained subagent task brief (sections + affected files + guardrails)

Workflow & Briefs

atlas_tasks

List open/done Markdown checkbox tasks (- [ ] / - [x]), filterable by @owner

Workflow & Briefs

atlas_status

List all Work Orders (⬜ OPEN, 🚧 IN PROGRESS, ✅ DONE) with index freshness

Code & Wiring

atlas_code_find

Locate symbol definitions, signatures, and call/reference counts across 9 languages

Verified Writes

atlas_publish

Append a verified Work Order status block — blocks on verify_symbols with 0 callers

Verified Writes

atlas_set_status

Flip an existing Work Order status marker in-place — with the same wiring gate

Spreadsheets

atlas_sheets

List indexed spreadsheet tabs, headers, and row keys

Spreadsheets

atlas_sheet_update

Update balancing cells by row_key + column name (never fragile C14 coordinates)

Spreadsheets

atlas_sheet_append

Append new rows by column name mapping

Diagnostics

atlas_lint

Check docs for duplicate anchors, oversized sections, and broken implements: paths


☁️ Google Docs & Sheets (Optional)

If your team's living documentation or balancing tables live in Google Docs and Sheets, atlas indexes and updates them through the official Google APIs — including multi-tab documents:

atlas auth                     # One-time OAuth consent in the browser
atlas sync --query MYPROJECT   # Pull documents & sheets into the local cache
atlas status
atlas publish --wo 7 --title "Mission 1" --desc "Rooms 1-9"

Three engineering details that prevent common agent accidents:

  1. Export to read, query directly to judge: The search index is built from Drive exports, but post-write verification queries documents.get directly — because the Docs API is consistent immediately after batchUpdate while Drive export caches lag by 0.5–2 seconds.

  2. Append-only with revision lock: requiredRevisionId prevents a write from landing on a stale document revision, and an idempotency guard prevents duplicate status headers when a work order already exists in the live doc.

  3. Tab-scoped status updates: replaceAllText uses tabsCriteria so status changes only affect the active tab, never archive tabs.


📏 Measure It on Your Own Project

You don't have to take our benchmark numbers on faith — run the exact same measurement on your own repository:

cd your-project
atlas init          # Or point at existing docs
atlas measure       # Compares naive full-doc read vs. atlas index per question
Documents: 4 · naive baseline: 28,011 tokens per question

Question                                           naive   atlas   saved
------------------------------------------------------------------------
Where is 7.6 Built engine features described?     28,011     885     97%
Where is 01_Units_Stats described?                28,011     689     98%
...
------------------------------------------------------------------------
Total                                            224,088   5,945     97%

By default, questions are derived from your section headings (which is optimistic because the question shares words with the heading — atlas measure explicitly notes this). For an independent benchmark, pass your own question list:

atlas measure --questions my-questions.txt    # One question per line

🧭 What atlas Is Not

  • Not a prose editor: It writes verified status markers and spreadsheet rows/cells, not design prose.

  • Not a web crawler: It indexes the documentation folders in your repository (and optional bound Google Docs).

  • Not a test replacement: The wiring gate verifies that a symbol is defined and referenced/called — not that its logic is bug-free.


🧪 Automated Tests

uv run pytest -q                                           # 209 unit & integration tests (offline)
uv run python scripts/smoke_mcp.py --root examples/demo    # End-to-end JSON-RPC MCP smoke test

All 209 tests run completely offline. Every Google Docs & Sheets interaction is tested against deterministic fakes — including edge cases where the API swallows a write or lags on export.

📄 License

MIT — see LICENSE.

Available Tools

15 tools
atlas_briefA
Read-onlyIdempotent

Assemble a self-contained Markdown task brief for a coding agent or subagent.

Use this tool before starting or delegating a feature task. It bundles the top matching spec
sections (with stable anchors), linked source file paths, open tasks, project guardrails, and
the verified checkoff command so the subagent does not need to search from scratch.

Behavior & Output:
- Read-only aggregation of indexed documentation sections and code metadata.
- Returns a formatted Markdown brief string ready to paste into a subagent prompt.
NameRequiredDescriptionDefault
goalYesOne-sentence description of the task to prepare a brief for (e.g. 'wire the dwarf vault-charger perk into turn_manager').
filesNoOptional list of relative source file paths to include alongside auto-detected `implements` files (e.g. ['scripts/unit.gd', 'src/combat.py']).
work_orderNoOptional Work Order number (e.g. 7). When provided, the brief includes the exact `atlas_publish` / `atlas_set_status` closing command for that Work Order.
max_sectionsNoMaximum number of relevant documentation sections to embed in the brief (1-20, default 5).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only/idempotent annotations, it explains that the tool performs read-only aggregation of indexed documentation and code metadata and returns a formatted Markdown string ready to paste into a prompt. That adds useful behavioral context, though it does not discuss limitations or 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, followed by usage and behavior/output sections. Every sentence adds useful context without unnecessary repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool has an output schema and full schema coverage, the description provides enough context: what gets bundled, when to use it, and what the output is. Nothing essential for correct invocation appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters thoroughly. The description does not add parameter-specific meaning beyond what the schema provides, which is the expected baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Assemble a self-contained Markdown task brief for a coding agent or subagent.' It also clarifies the aggregation scope (spec sections, source paths, open tasks, guardrails, checkoff command), making it distinct from search/read siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear timing guidance: 'Use this tool before starting or delegating a feature task,' and implies the alternative is searching from scratch. It stops short of explicit when-not-to-use conditions or naming sibling tools directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

atlas_code_findA
Read-onlyIdempotent

Locate function or class definitions across the codebase (file, line, signature) and optionally inspect call sites.

Use this tool BEFORE reading source files to find where a symbol lives (~30 tokens per signature vs.
thousands of tokens for a full file) or set `usage=True` to check if a symbol is actually called before
marking a task done. Supports GDScript (`.gd`/`.tscn`), Python, TypeScript/JavaScript, Rust, C#, Go,
Java, Kotlin, and Swift.

Behavior & Output:
- Read-only static scan of project source files; ignores build directories and `.atlas/`.
- Returns a formatted summary of matching definitions (`path:line — signature`) and, when `usage=True`,
  the caller/reference count and file:line call sites for each symbol.
NameRequiredDescriptionDefault
limitNoMaximum number of matching symbol definitions to return (1-100, default 10).
usageNoIf true, also scan the repository for call sites and references to each matched symbol (including Godot `.tscn` signal bindings) to verify whether the symbol is wired up (default false).
symbolYesFunction, method, or class name (or substring) to search for across the codebase (e.g. 'apply_damage' or 'TurnManager'). Does not match local variables.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds real value on top: static scan scope, exclusion of build directories and .atlas/, supported languages, and the shape of returned results. It stops short of noting limits on accuracy or behavior for unresolved/dynamic symbols.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose in the first line, then usage rationale, then a labelled 'Behavior & Output' block. Slightly verbose in the token-cost aside, but every section carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, when to use, language support, scan exclusions, and output format, and an output schema exists for return details. Nothing material is missing for a read-only lookup tool with three well-documented parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns above that by explaining what usage=True actually does (call-site/reference scanning, including Godot .tscn signal bindings) and by justifying its purpose in the workflow. The limit parameter is left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Locate function or class definitions across the codebase') plus the returned fields (file, line, signature) and an optional mode. This clearly separates it from siblings like atlas_read (file contents) and atlas_search (text search).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use guidance: call it BEFORE reading source files, with a token-cost rationale, and set usage=True to verify call sites before marking a task done. It never names a specific sibling tool as the alternative (e.g. atlas_search or atlas_read), so routing is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

atlas_lintA
Read-onlyIdempotent

Audit indexed documentation for structural and formatting problems that degrade retrieval quality.

Takes no parameters. Checks managed documentation for duplicate section anchors, empty headings,
oversized sections (>8,000 chars), Work Orders missing a status marker (`⬜`/`🚧`/`✅`), and broken
`implements:` code file paths. Use this tool after editing documentation or running `atlas init`.

Behavior & Output:
- Read-only structural check; respects `.atlas/managed.json` (separating managed docs from legacy discovered docs).
- Returns a JSON string `{managed_issues: [...], discovered_hints: [...], clean: bool}` detailing each issue by file and line.
NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly, idempotent, closed-world, and non-destructive, so the description is not the sole carrier of safety information. It still adds real behavior beyond them: it clarifies that the check respects `.atlas/managed.json`, distinguishes managed docs from legacy discovered docs, and that legacy findings surface only as hints. The explicit thresholds (e.g. >8,000 chars) and required status markers are useful operational detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then a compact checklist of checks, then a labeled 'Behavior & Output' block — an easy scan for an agent. The return-shape line partially restates the output schema, which is a small redundancy rather than a structural flaw.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only audit tool, everything needed to invoke and interpret it is present: trigger conditions, the exact defect categories, the managed-vs-discovered distinction, and the response keys. No required behavior or interpretation guidance is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, which is the baseline-4 case; 'Takes no parameters' merely confirms the empty schema. There is no parameter meaning left to add, so no deficiency exists here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb ('Audit') and resource ('indexed documentation'), and enumerates the concrete defect classes it detects (duplicate anchors, empty headings, oversized sections, missing status markers, broken `implements:` paths). That specificity separates it cleanly from siblings like atlas_read, atlas_outline, and atlas_links, which inspect content rather than structural health.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger: 'Use this tool after editing documentation or running `atlas init`.' That is a clear when-to-use signal. It stops short of naming a discriminating alternative or stating when-not to run it (e.g. that atlas_links covers link inspection more deeply), 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.

atlas_outlineA
Read-onlyIdempotent

Return the hierarchical table of contents (headings and section anchors) across indexed documentation.

Use this tool when exploring an unfamiliar project structure, browsing available documents,
or when keyword searches (`atlas_where` / `atlas_search`) did not match your query terms.

Behavior & Output:
- Read-only, side-effect-free query of indexed document headings.
- Returns a JSON string `{doc, outline, truncated}` where `outline` lists each heading level,
  title, and `anchor` ready for `atlas_read`.
NameRequiredDescriptionDefault
docNoOptional document ID (e.g. '02-combat' or 'architecture') to list headings for a single document. Omit or pass null to list the table of contents for all documents.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, non-destructive behavior, but the description still adds value by describing the return envelope {doc, outline, truncated} and that anchors are directly usable with atlas_read. It stops short of explaining when 'truncated' becomes true or how to handle it, which is the main remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose followed by usage and output sections; the structure is easy to scan. The 'Read-only, side-effect-free' bullet partially restates annotations and could be trimmed, but overall wording earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers what the tool returns, how to use anchors downstream, and when to prefer it, which is more than sufficient for a single-optional-param read tool with an output schema. The unexplained truncation semantics are the only notable omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a thorough 'doc' description including example IDs and the null/omit behavior, so the schema does the heavy lifting. The description adds nothing about the single parameter, making the baseline 3 correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the hierarchical table of contents (headings and section anchors) across indexed documentation') and scopes it to indexed docs, which separates it from retrieval siblings like atlas_read and atlas_search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names three situations (unfamiliar project structure, browsing available docs, keyword searches via atlas_where/atlas_search that failed) and names the alternative tools, so an agent can decide between outline and search without opening schemas.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

atlas_publishA
Idempotent

Append a new Work Order status entry to the documentation — gated by a code-wiring check and verified by read-back.

Use this tool as the FINAL step after tests pass to record a new Work Order in the bound Google Doc
or local managed Markdown file (`docs/ARCHITECTURE.md`). If the Work Order heading already exists and
you only need to flip `⬜ OPEN` to `✅ DONE`, use `atlas_set_status` instead.

Behavior & Output:
- Pre-write wiring gate: when `status='done'`, verifies that every symbol in `verify_symbols` (and
  `.atlas/wo-symbols.yml`) is both defined and referenced/called (`calls + references > 0`). If any
  symbol is dead code, returns `{written: false, refused: true, refusal: "..."}` without touching disk/network.
- Atomic verified write: appends the formatted status line, reads the document back to confirm presence,
  logs to `.atlas/mutations.log`, and returns `{written: true, verified: true, wo, line}`.
NameRequiredDescriptionDefault
woYesWork Order number (positive integer, e.g. 7 for 'Work Order 7').
titleYesShort title of the Work Order (e.g. 'Critical Hit Calculation').
statusNoTarget Work Order status: 'done' (writes `✅ DONE`, default) or 'open' (writes `⬜ OPEN`).done
descriptionNoOptional summary of what was implemented and which files were touched.
verify_symbolsNoList of function or class names built in this Work Order (e.g. ['apply_crit_bonus']). When `status='done'`, each symbol is checked before writing: if any symbol is undefined or has 0 callers/references across the codebase, the write is refused.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/openWorld/idempotent/destructive hints; the description goes well beyond them by disclosing the pre-write wiring gate, the dead-code refusal condition with its exact return shape, the read-back verification, and the `.atlas/mutations.log` side effect. The refusal is described as happening 'without touching disk/network', which materially informs error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and alternative, then cleanly sectioned into 'Behavior & Output' with bulleted return contracts. Slightly verbose, but each sentence carries operational information rather than restating the name or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description still documents both success and refusal return shapes, and covers the mutation side effects an agent needs. For a write tool with a pre-flight gate, nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: `verify_symbols` is checked only when `status='done'`, is augmented by `.atlas/wo-symbols.yml`, and requires both definition and at least one call/reference. That conditional gating semantics is not derivable from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Append a new Work Order status entry to the documentation') plus the gating and verification that define it. It explicitly names the sibling `atlas_set_status` and the condition that separates the two, so an agent can route correctly 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit lifecycle position ('FINAL step after tests pass') and an explicit exclusion with the alternative ('if the heading already exists and you only need to flip ⬜ OPEN to ✅ DONE, use atlas_set_status instead'). Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

atlas_readA
Read-onlyIdempotent

Read the Markdown content of a single documentation section by its anchor with character-budget pagination.

Use this tool after obtaining an `anchor` from `atlas_where`, `atlas_search`, or `atlas_outline`.
Never read raw documentation files from disk when `atlas_read` can fetch the exact section.

Behavior & Output:
- Read-only lookup from the local documentation index.
- Returns a JSON string `{anchor, heading, path, lines, content, truncated, next_offset}`.
  If the anchor does not exist, returns `{error, suggestions}` with the closest valid anchors.
NameRequiredDescriptionDefault
anchorYesSection anchor identifier in `<doc_id>#<section-slug>` format (or `<doc_id>` for the document root), as returned by `atlas_where`, `atlas_search`, or `atlas_outline` (e.g. 'combat#damage-model').
offsetNoCharacter offset to start reading from (default 0). When a previous call returned `truncated: true`, pass its `next_offset` value here to read the next page.
max_charsNoMaximum number of characters to return in one call (default 3000).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so safety is covered structurally. The description adds genuinely useful behavior the annotations cannot express: the read is from a local index, the success payload carries `truncated`/`next_offset` for pagination chaining, and a missing anchor yields `{error, suggestions}` rather than a bare failure. Minor redundancy is recounting the return keys, which the output schema already supplies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the core action, follows with a routing rule, then a short labeled behavior block. Every line carries information an agent needs: there are no filler adjectives or repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 fully explained, yet the description still covers the error path and pagination continuation, the two cases an agent must handle. For a three-parameter read tool, nothing material is left unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already defines anchor, offset and max_chars in detail, which sets the baseline at 3. The description adds meaning beyond it by framing max_chars as a character budget and describing the offset/next_offset handoff across calls, though it does not restate the anchor's `<doc_id>#<section-slug>` format, which only the schema carries.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Read the Markdown content of a single documentation section by its anchor', and immediately scopes it with 'single' and 'character-budget pagination'. That distinguishes it cleanly from atlas_search (discovery), atlas_outline (structure), and atlas_where (locating anchors) without requiring the agent to open any other schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the precondition explicitly ('Use this tool after obtaining an anchor from atlas_where, atlas_search, or atlas_outline') and adds a negative guideline ('Never read raw documentation files from disk when atlas_read can fetch the exact section'). Both the when and the when-not are present, which is rare and directly actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

atlas_set_statusA
Idempotent

Flip the status marker of an existing Work Order (⬜ OPEN <-> ✅ DONE) or Markdown checkbox task (- [ ] <-> - [x]).

Use this tool as the final step when completing an existing open Work Order (`wo=N`) or a checkbox
task from `atlas_tasks` (`task='...'`). To append a brand-new Work Order entry that is not yet in the
document, use `atlas_publish` instead.

Behavior & Output:
- Pre-write wiring gate: when `status='done'`, checks that all symbols in `verify_symbols` (and
  `.atlas/wo-symbols.yml`) are defined and have at least one caller/reference. Refuses with
  `{changed: false, refused: true, refusal: "..."}` if any symbol is unwired.
- Verified in-place update: updates the status marker or checkbox in the local Markdown file (or active
  Google Doc tab for Work Orders), verifies by reading back, and returns JSON `{changed, verified, status}`.
NameRequiredDescriptionDefault
woNoExisting Work Order number to update (positive integer, e.g. 8 for 'Work Order 8'). Provide either `wo` or `task`.
taskNoSubstring identifying a Markdown checkbox item (`- [ ] ...`) to toggle between `- [ ]` ('open') and `- [x]` ('done') when `wo` is omitted (e.g. 'Balance damage formula').
statusNoNew status: 'done' (`✅ DONE` / `- [x]`, default) or 'open' (`⬜ OPEN` / `- [ ]`).done
verify_symbolsNoOptional list of function or class names that must be defined and called/referenced in the codebase before `status='done'` is allowed. Merged with `.atlas/wo-symbols.yml`.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the generic profile (not read-only, idempotent, non-destructive), while the description adds non-obvious behavior: a pre-write wiring gate triggered on `status='done'`, the exact refusal payload `{changed: false, refused: true, refusal: "..."}`, and a read-back verification step. It also discloses the `verify_symbols` merge with `.atlas/wo-symbols.yml`, which no structured field conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by clearly labeled usage and behavior blocks; no filler. Minor redundancy in restating the return shape `{changed, verified, status}` when a separate output schema already exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter tool with full schema coverage and an output schema, the description covers the remaining unknowns: gating preconditions, failure mode, verification, and file/tab targeting. An agent has everything needed to call it correctly or recognize a refusal.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real meaning: that `verify_symbols` is only enforced when `status='done'` and is merged with `.atlas/wo-symbols.yml`, and that `wo` and `task` are alternative selectors. It stops short of explaining matching semantics for `task` substring ambiguity (what happens on multiple matches).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource: flipping the status marker of an existing Work Order (`⬜ OPEN` <-> `✅ DONE`) or a Markdown checkbox task, with the literal markers shown. It also explicitly distinguishes itself from `atlas_publish`, so an agent can separate it from the closest sibling 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use rule ("final step when completing an existing open Work Order (`wo=N`) or a checkbox task from `atlas_tasks`") plus an explicit when-not rule routing new entries to `atlas_publish`. The `wo` vs `task` selector is also spelled out, 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.

atlas_sheet_appendA

Append a new row to a spreadsheet tab by mapping column header names to values.

Use this tool when adding a new entry (e.g. a new unit, item, or parameter row) to a bound spreadsheet.
To modify cells of an existing row, use `atlas_sheet_update` instead.

Behavior & Output:
- Not idempotent: each non-dry-run call appends a new row at the bottom of the table and verifies it by read-back.
- Validates all keys in `values` against the tab's header row before writing.
- Returns JSON `{ok, sheet, tab, values, range, verified, resynced, dry_run}` and updates the local search index.
NameRequiredDescriptionDefault
tabYesExact worksheet/tab name inside the spreadsheet (e.g. 'Units'). Use `atlas_sheets` to discover valid tab names.
sheetNoOptional spreadsheet name or ID when multiple spreadsheets are bound to the project.
valuesYesMapping of `{column_header_name: value}` for the new row (e.g. `{"ID": "monster_goblin", "Name": "Goblin", "HP": 100}`). Omitted columns are left empty.
dry_runNoIf true, validate column headers and preview the row without writing to the spreadsheet (default false).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the annotations by disclosing that keys are validated against the tab's header row before writing, that each append is verified by read-back, and that the local search index is updated — none of which the annotations convey. The non-idempotency claim duplicates `idempotentHint: false`, though it usefully explains the consequence (a new row at the bottom per call).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then a usage sentence with the alternative, then a compact labeled behavior section — easy to scan and every line is substantive. The explicit return-key list is mildly redundant given that an output schema exists, but it earns partial credit by naming the meaningful flags (`verified`, `resynced`).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter mutation tool with full schema coverage, rich annotations, and an output schema, the description covers purpose, selection criteria, validation constraints, side effects (index update), and safety via dry-run. No gap remains that would cause a misinvocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the 3 baseline is met; the description adds a real constraint not stated in the schema — that `values` keys are validated against the tab's header row before writing, which tells the agent keys must be exact header names. It also reinforces the header-name mapping model with a concrete conceptual example.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (append a new row to a spreadsheet tab) plus the mechanism (mapping column header names to values). It explicitly contrasts with the sibling `atlas_sheet_update`, so an agent can distinguish the two 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use condition (adding a new entry such as a unit, item, or parameter row to a bound spreadsheet) and an explicit when-not with a named alternative (`atlas_sheet_update` for modifying existing rows). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

atlas_sheetsA
Read-onlyIdempotent

List all spreadsheets bound to the project along with their worksheet tab names.

Takes no parameters. Call this tool before `atlas_sheet_update` or `atlas_sheet_append`
whenever you need to discover the exact `sheet` name/ID or valid `tab` names.

Behavior & Output:
- Read-only metadata lookup; returns spreadsheet and tab names without dumping cell contents.
- Returns JSON `{spreadsheets: [{name, id, tabs: [...]}]}` or `{spreadsheets: [], hint: "..."}`
  when no spreadsheet has been synced yet.
NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds real value beyond them by clarifying it is a metadata-only lookup that does not dump cell contents, and by describing the empty-state response with a hint string. It does not discuss scoping (which project) or sync freshness beyond the 'not yet synced' case.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then a routing instruction, then a labeled 'Behavior & Output' block. Every line carries information; nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read tool with rich annotations and an output schema, the description covers purpose, preconditions, read-only semantics and the empty-state case. An agent has everything needed to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the schema baseline of 4 applies. The description reinforces this with 'Takes no parameters', leaving no room for the agent to invent arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource: lists spreadsheets bound to the project plus their worksheet tab names. Combined with the pre-call routing to atlas_sheet_update/atlas_sheet_append, an agent can distinguish it from sibling lookup tools like atlas_where or atlas_outline 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to call this before atlas_sheet_update or atlas_sheet_append whenever the exact sheet name/ID or valid tab names are unknown, naming both alternatives and the selecting condition. Also states it takes no parameters, removing any setup ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

atlas_sheet_updateA
Idempotent

Update specific cells of an existing spreadsheet row by row_key and column header name (never by cell coordinate).

Use this tool to modify balancing values, implementation markers, or metadata in an existing row.
To add a brand-new row to a tab, use `atlas_sheet_append`. If unsure of tab names, call `atlas_sheets` first.

Behavior & Output:
- Resolves the exact cell range from `row_key` + header names, preventing off-by-one row overwrites.
- If a column name is unknown, aborts without writing and returns the list of valid column headers.
- Returns JSON `{ok, sheet, tab, row, key, changes, verified, resynced, dry_run}` and refreshes the local search index.
NameRequiredDescriptionDefault
tabYesExact worksheet/tab name inside the spreadsheet (e.g. 'Units' or 'Weapons'). Use `atlas_sheets` to list valid tabs.
sheetNoOptional spreadsheet name or ID when multiple spreadsheets are registered. Omit if only one spreadsheet exists.
dry_runNoIf true, compute and return the cell diff without writing changes to the spreadsheet (default false).
row_keyYesPrimary key value identifying the target row in the key column (e.g. 'monster_goblin').
updatesYesMapping of `{column_header_name: new_value}` for the cells to update in that row (e.g. `{"HP": 45, "Status": "✅"}`). Never pass raw cell coordinates like 'C14'.
key_columnNoOptional header name of the key column used to match `row_key`. Defaults to the first column of the tab.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond the annotations: it resolves the cell range from key + header, aborts without writing and returns the valid header list when a column name is unknown, and refreshes the local search index. The annotations only declare non-readonly, non-destructive, idempotent; the description supplies the actual failure mode and side effects an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and address model, then a scannable "Behavior & Output" block; every line carries information. The literal return-JSON enumeration is mildly redundant given an output schema exists, which keeps it off a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter nested-object mutation tool with full schema coverage and a declared output schema, the description covers intent, addressing model, failure behavior, side effects, and routing to siblings. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all six parameters are already documented in the schema, including the header-name mapping and the `dry_run` diff behavior. The description reinforces the key-vs-coordinate addressing constraint but adds no syntax or format detail the schema lacks; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Update specific cells of an existing spreadsheet row") plus the exact addressing model (by `row_key` and column header name, never by cell coordinate). This is enough to distinguish it from `atlas_sheet_append` 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use cases (balancing values, implementation markers, metadata), names the sibling to use for a different intent (`atlas_sheet_append` for brand-new rows), and prescribes a prerequisite call (`atlas_sheets`) when tab names are unknown. No alternative is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

atlas_statusA
Read-onlyIdempotent

Return the complete list of documented Work Orders (⬜ OPEN, 🚧 IN PROGRESS, ✅ DONE) and index freshness.

Takes no parameters. Use this tool first when asked about project progress, completed milestones,
or which Work Order is next — one call returns the authoritative list without reading documentation files.
For granular Markdown checkboxes (`- [ ]`), use `atlas_tasks` instead.

Behavior & Output:
- Read-only query over all Work Order headings/entries in the index (up to 60 orders).
- Returns a human- and agent-readable summary starting with the index freshness timestamp,
  total counts (`done` / `open`), and one line per Work Order (`WO # — status — title (anchor)`).
NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the description doesn't need to re-litigate safety. It adds real context beyond them: the operation is a read-only index query capped at up to 60 orders, and the output begins with an index freshness timestamp that signals possible staleness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then when-to-use, then a labeled 'Behavior & Output' block — a clean structure. Slightly long for a zero-parameter tool, and the status emoji list is mildly redundant with the status names, but every section carries usable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete enough to call correctly: it covers trigger conditions, the sibling boundary, the 60-order cap, and the return shape. The one gap is that the description explains the output format even though a formal output schema exists, which is mild duplication rather than a missing piece.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4; the description confirms 'Takes no parameters', which prevents an agent from searching for filters. Nothing further is needed since there is no schema surface to explain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the complete list of documented Work Orders') and enumerates the status values it reports, plus index freshness. It also explicitly distinguishes itself from the sibling atlas_tasks, which handles granular Markdown checkboxes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use rule ('Use this tool first when asked about project progress, completed milestones, or which Work Order is next') and an explicit alternative for the adjacent case ('For granular Markdown checkboxes, use atlas_tasks instead'). The no-parameter constraint is also stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

atlas_tasksA
Read-onlyIdempotent

List design and development action items (- [ ] / - [x] checkboxes) extracted from all documentation sections.

Use this tool to inspect granular checklist items embedded in specs. To inspect numbered
high-level Work Orders (`Work Order N — ⬜ OPEN / ✅ DONE`), use `atlas_status` instead.

Behavior & Output:
- Read-only query over indexed Markdown checkboxes.
- Returns a JSON string `{status, owner, count, tasks: [{text, done, owner, tags, anchor, path, line}]}`.
NameRequiredDescriptionDefault
ownerNoOptional owner handle to filter tasks assigned via `@name` tags in Markdown (e.g. '@design' or 'design'). Omit or pass null for all owners.
statusNoFilter tasks by completion state: 'open' for unchecked `- [ ]` items (default), 'done' for checked `- [x]` items, or 'all' for both.open

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the description need not prove safety. It goes beyond them by naming the underlying data source (indexed Markdown checkboxes) and sketching the return payload shape, which annotations cannot convey. It does not cover pagination or handling of unindexed/stale docs, keeping it just short of 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose, sibling routing, and behavior are front-loaded in that order, with the alternative named before details an agent doesn't need yet. The 'Read-only query' line partly restates the annotations, which is a minor redundancy in an otherwise tight definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Two optional, fully documented parameters and an existing output schema mean the agent needs little more than routing guidance. The description supplies the sibling disambiguation and data source that structured fields cannot, so nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with per-parameter text and an enum on `status`, so the schema already carries the semantics. The description's `- [ ]` / `- [x]` notation loosely reinforces the open/done distinction already spelled out in the schema, adding little new meaning. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List design and development action items') and pins down the data source ('checkboxes extracted from all documentation sections'). It explicitly contrasts itself with the sibling `atlas_status`, so an agent can pick between granular checklist items and numbered Work Orders 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use ('inspect granular checklist items embedded in specs') and an explicit alternative with its own defining syntax ('numbered high-level Work Orders ... use `atlas_status` instead'). The selection rule is fully determined, not inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

atlas_whereA
Read-onlyIdempotent

Locate the best-matching documentation section for a topic and return its pointer (~60 tokens) without full text.

Use this tool FIRST for 'where is X documented?', 'which file covers Y?', or 'which section defines Z?'.
Follow up with `atlas_read(anchor)` only if you need the section body, or fall back to `atlas_search`
if you need multiple ranked snippets across documents.

Behavior & Output:
- Read-only, deterministic BM25 lookup against the local SQLite FTS5 index (auto-refreshed before query).
- Returns a JSON string with `{found: true, anchor, heading, path, line, alternatives}` when matched,
  or `{found: false, hint}` when no section matches.
NameRequiredDescriptionDefault
topicYesNatural-language question or topic keywords to locate in the project documentation (e.g. 'damage model', 'Where is dialogue branching described?'). Supports English and German terms with automatic stop-word removal and umlaut folding.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds real value beyond that: deterministic BM25 ranking against a local SQLite FTS5 index that auto-refreshes before the query, which explains freshness and ranking behavior. It also restates the return payload (found/anchor/heading/path/line/alternatives, or found/hint), but an output schema already exists, so that portion is duplication rather than added disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose in sentence one, routing in the next two, behavior in a labeled block. The 'Behavior & Output' return-shape lines partly duplicate the output schema and could be trimmed, but nothing else is wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter lookup tool, the definition covers purpose, selection criteria, alternatives, index/ranking behavior, freshness, and no-match handling. With an output schema present, return values need no further explanation, so there is no meaningful gap for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single `topic` param is documented there with examples, language support, stop-word removal, and umlaut folding. The description adds nothing about the parameter beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb (locate) and resource (documentation section) and states the output shape and cost (~60 tokens, pointer only, no full text). It explicitly distinguishes itself from siblings atlas_read and atlas_search by role, so an agent can select it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit routing: use FIRST for 'where is X documented?', 'which file covers Y?', 'which section defines Z?'. It then names both alternatives with the exact conditions that select them — atlas_read(anchor) for the body, atlas_search for multiple ranked snippets.

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. 1 tool updatev0.2.3
    • Changedatlas_set_status8 fields changed
      • changedInput schema / properties / status / description
        Previous value: -"New status for the Work Order: 'done' (`✅ DONE`, default) or 'open' (`⬜ OPEN`)."New value: +"New status: 'done' (`✅ DONE` / `- [x]`, default) or 'open' (`⬜ OPEN` / `- [ ]`)."
      • addedInput schema / properties / task
        Added value: +{
        +  "anyOf": [
        +    {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Substring identifying a Markdown checkbox item (`- [ ] ...`) to toggle between `- [ ]` ('open') and `- [x]` ('done') when `wo` is omitted (e.g. 'Balance damage formula').",
        +  "title": "Task"
        +}
      • addedInput schema / properties / wo / anyOf
        Added value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / wo / default
        Added value: +null
      • changedInput schema / properties / wo / description
        Previous value: -"Existing Work Order number to update (positive integer, e.g. 8 for 'Work Order 8')."New value: +"Existing Work Order number to update (positive integer, e.g. 8 for 'Work Order 8'). Provide either `wo` or `task`."
      • removedInput schema / properties / wo / minimum
        Removed value: -1
      • removedInput schema / properties / wo / type
        Removed value: -"integer"
      • removedInput schema / required
        Removed value: -[
        -  "wo"
        -]
  2. 12 tool updatesv0.1.1
    • Changedatlas_brief8 fields changed
      • addedInput schema / properties / files / description
        Added value: +"Optional list of relative source file paths to include alongside auto-detected `implements` files (e.g. ['scripts/unit.gd', 'src/combat.py'])."
      • addedInput schema / properties / goal / description
        Added value: +"One-sentence description of the task to prepare a brief for (e.g. 'wire the dwarf vault-charger perk into turn_manager')."
      • addedInput schema / properties / goal / minLength
        Added value: +1
      • addedInput schema / properties / max_sections / description
        Added value: +"Maximum number of relevant documentation sections to embed in the brief (1-20, default 5)."
      • addedInput schema / properties / max_sections / maximum
        Added value: +20
      • addedInput schema / properties / max_sections / minimum
        Added value: +1
      • changedInput schema / properties / work_order / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / work_order / description
        Added value: +"Optional Work Order number (e.g. 7). When provided, the brief includes the exact `atlas_publish` / `atlas_set_status` closing command for that Work Order."
    • Changedatlas_code_find6 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of matching symbol definitions to return (1-100, default 10)."
      • addedInput schema / properties / limit / maximum
        Added value: +100
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / symbol / description
        Added value: +"Function, method, or class name (or substring) to search for across the codebase (e.g. 'apply_damage' or 'TurnManager'). Does not match local variables."
      • addedInput schema / properties / symbol / minLength
        Added value: +1
      • addedInput schema / properties / usage / description
        Added value: +"If true, also scan the repository for call sites and references to each matched symbol (including Godot `.tscn` signal bindings) to verify whether the symbol is wired up (default false)."
    • Changedatlas_links2 fields changed
      • addedInput schema / properties / anchor / description
        Added value: +"Section anchor identifier in `<doc_id>#<section-slug>` or `<doc_id>` format (e.g. 'combat#damage-model'), as returned by `atlas_where`, `atlas_search`, or `atlas_outline`."
      • addedInput schema / properties / anchor / minLength
        Added value: +1
    • Changedatlas_outline1 field changed
      • addedInput schema / properties / doc / description
        Added value: +"Optional document ID (e.g. '02-combat' or 'architecture') to list headings for a single document. Omit or pass null to list the table of contents for all documents."
    • Changedatlas_publish8 fields changed
      • addedInput schema / properties / description / description
        Added value: +"Optional summary of what was implemented and which files were touched."
      • addedInput schema / properties / status / description
        Added value: +"Target Work Order status: 'done' (writes `✅ DONE`, default) or 'open' (writes `⬜ OPEN`)."
      • addedInput schema / properties / status / enum
        Added value: +[
        +  "done",
        +  "open"
        +]
      • addedInput schema / properties / title / description
        Added value: +"Short title of the Work Order (e.g. 'Critical Hit Calculation')."
      • addedInput schema / properties / title / minLength
        Added value: +1
      • addedInput schema / properties / verify_symbols / description
        Added value: +"List of function or class names built in this Work Order (e.g. ['apply_crit_bonus']). When `status='done'`, each symbol is checked before writing: if any symbol is undefined or has 0 callers/references across the codebase, the write is refused."
      • addedInput schema / properties / wo / description
        Added value: +"Work Order number (positive integer, e.g. 7 for 'Work Order 7')."
      • addedInput schema / properties / wo / minimum
        Added value: +1
    • Changedatlas_read7 fields changed
      • addedInput schema / properties / anchor / description
        Added value: +"Section anchor identifier in `<doc_id>#<section-slug>` format (or `<doc_id>` for the document root), as returned by `atlas_where`, `atlas_search`, or `atlas_outline` (e.g. 'combat#damage-model')."
      • addedInput schema / properties / anchor / minLength
        Added value: +1
      • addedInput schema / properties / max_chars / description
        Added value: +"Maximum number of characters to return in one call (default 3000)."
      • addedInput schema / properties / max_chars / maximum
        Added value: +50000
      • addedInput schema / properties / max_chars / minimum
        Added value: +100
      • addedInput schema / properties / offset / description
        Added value: +"Character offset to start reading from (default 0). When a previous call returned `truncated: true`, pass its `next_offset` value here to read the next page."
      • addedInput schema / properties / offset / minimum
        Added value: +0
    • Changedatlas_search6 fields changed
      • addedInput schema / properties / doc / description
        Added value: +"Optional document ID (e.g. 'combat' or '02-combat') to restrict the search to a single document. Omit or pass null to search all documents."
      • addedInput schema / properties / k / description
        Added value: +"Maximum number of ranked section hits to return (1-50, default 5)."
      • addedInput schema / properties / k / maximum
        Added value: +50
      • addedInput schema / properties / k / minimum
        Added value: +1
      • addedInput schema / properties / query / description
        Added value: +"Keywords or phrase to search across all indexed documentation sections (e.g. 'cover reduction', 'turn order'). Uses lexical FTS5 matching with umlaut folding ('Hoehe' matches 'Höhe') and German compound splitting."
      • addedInput schema / properties / query / minLength
        Added value: +1
    • Changedatlas_set_status5 fields changed
      • addedInput schema / properties / status / description
        Added value: +"New status for the Work Order: 'done' (`✅ DONE`, default) or 'open' (`⬜ OPEN`)."
      • addedInput schema / properties / status / enum
        Added value: +[
        +  "done",
        +  "open"
        +]
      • addedInput schema / properties / verify_symbols / description
        Added value: +"Optional list of function or class names that must be defined and called/referenced in the codebase before `status='done'` is allowed. Merged with `.atlas/wo-symbols.yml`."
      • addedInput schema / properties / wo / description
        Added value: +"Existing Work Order number to update (positive integer, e.g. 8 for 'Work Order 8')."
      • addedInput schema / properties / wo / minimum
        Added value: +1
    • Changedatlas_sheet_append6 fields changed
      • addedInput schema / properties / dry_run / description
        Added value: +"If true, validate column headers and preview the row without writing to the spreadsheet (default false)."
      • addedInput schema / properties / sheet / description
        Added value: +"Optional spreadsheet name or ID when multiple spreadsheets are bound to the project."
      • addedInput schema / properties / tab / description
        Added value: +"Exact worksheet/tab name inside the spreadsheet (e.g. 'Units'). Use `atlas_sheets` to discover valid tab names."
      • addedInput schema / properties / tab / minLength
        Added value: +1
      • changedInput schema / properties / values / additionalProperties
        Previous value: -trueNew value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedInput schema / properties / values / description
        Added value: +"Mapping of `{column_header_name: value}` for the new row (e.g. `{\"ID\": \"monster_goblin\", \"Name\": \"Goblin\", \"HP\": 100}`). Omitted columns are left empty."
    • Changedatlas_sheet_update9 fields changed
      • addedInput schema / properties / dry_run / description
        Added value: +"If true, compute and return the cell diff without writing changes to the spreadsheet (default false)."
      • addedInput schema / properties / key_column / description
        Added value: +"Optional header name of the key column used to match `row_key`. Defaults to the first column of the tab."
      • addedInput schema / properties / row_key / description
        Added value: +"Primary key value identifying the target row in the key column (e.g. 'monster_goblin')."
      • addedInput schema / properties / row_key / minLength
        Added value: +1
      • addedInput schema / properties / sheet / description
        Added value: +"Optional spreadsheet name or ID when multiple spreadsheets are registered. Omit if only one spreadsheet exists."
      • addedInput schema / properties / tab / description
        Added value: +"Exact worksheet/tab name inside the spreadsheet (e.g. 'Units' or 'Weapons'). Use `atlas_sheets` to list valid tabs."
      • addedInput schema / properties / tab / minLength
        Added value: +1
      • changedInput schema / properties / updates / additionalProperties
        Previous value: -trueNew value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedInput schema / properties / updates / description
        Added value: +"Mapping of `{column_header_name: new_value}` for the cells to update in that row (e.g. `{\"HP\": 45, \"Status\": \"✅\"}`). Never pass raw cell coordinates like 'C14'."
    • Changedatlas_tasks3 fields changed
      • addedInput schema / properties / owner / description
        Added value: +"Optional owner handle to filter tasks assigned via `@name` tags in Markdown (e.g. '@design' or 'design'). Omit or pass null for all owners."
      • addedInput schema / properties / status / description
        Added value: +"Filter tasks by completion state: 'open' for unchecked `- [ ]` items (default), 'done' for checked `- [x]` items, or 'all' for both."
      • addedInput schema / properties / status / enum
        Added value: +[
        +  "open",
        +  "done",
        +  "all"
        +]
    • Changedatlas_where2 fields changed
      • addedInput schema / properties / topic / description
        Added value: +"Natural-language question or topic keywords to locate in the project documentation (e.g. 'damage model', 'Where is dialogue branching described?'). Supports English and German terms with automatic stop-word removal and umlaut folding."
      • addedInput schema / properties / topic / minLength
        Added value: +1
  3. 15 tool updatesv0.1.0
    • First observedatlas_brief
    • First observedatlas_code_find
    • First observedatlas_links
    • First observedatlas_lint
    • First observedatlas_outline
    • First observedatlas_publish
    • First observedatlas_read
    • First observedatlas_search
    • First observedatlas_set_status
    • First observedatlas_sheet_append
    • First observedatlas_sheet_update
    • First observedatlas_sheets
    • First observedatlas_status
    • First observedatlas_tasks
    • First observedatlas_where

TDQS

A4.4/5.0

Scored across 15 tools

Disambiguation4/5

Most tools target a clearly distinct resource+action (read vs outline, status vs tasks, set_status vs publish, sheet_update vs sheet_append), and descriptions explicitly cross-reference when to use each alternative. The only genuine overlaps are atlas_where vs atlas_search (both BM25 lookups over the same index) and atlas_status vs atlas_tasks, but the descriptions disambiguate those well enough that misselection is unlikely.

Naming Consistency4/5

All names use a consistent snake_case with the atlas_ prefix, which is the strongest consistency signal here. There is minor variation in convention—some are verb-first (atlas_read, atlas_publish, atlas_set_status), others noun-first (atlas_status, atlas_tasks, atlas_sheets), and subresource ordering differs (atlas_code_find vs atlas_sheet_update)—but the pattern stays readable.

Tool Count5/5

Fifteen tools is well within a healthy scope for a documentation/project-memory server and each maps to a distinct capability (search, read, outline, links, tasks, status, brief, publish, status flip, lint, code find, and three sheet operations). Nothing feels redundant or padded.

Completeness4/5

The documentation lifecycle is thoroughly covered: discover (where/search/outline), inspect (read/links/tasks/status), act (brief/publish/set_status), plus code lookup and lint. Minor gaps remain—there is no spreadsheet cell/row read tool (only list/update/append) and no delete operations for Work Orders or rows—but these are workaroundable and do not block core workflows.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Docdex is a lightweight, local documentation indexer/search daemon. It runs per-project, keeps an on-disk index of your markdown/text docs, and serves top-k snippets over HTTP or CLI for any coding assistant or tool—no external services or uploads required.
    1,185 npm
    16
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Indexes documentation sites by base URL and serves keyword search, optional semantic search, and Markdown page retrieval as MCP tools, all from a single SQLite file.
    -
  • A
    license
    A
    quality
    B
    maintenance
    Indexes your project's markdown documentation and exposes it to AI agents via local hybrid search (lexical + semantic) with progressive disclosure tools.
    3
    115 npm
    5
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to search a local folder of Markdown, AsciiDoc, and text files through a SQLite FTS5 keyword index, returning the most relevant sections with file paths, line ranges, and heading breadcrumbs instead of grepping through a repo. It also exposes tools to list indexed documents and refresh the index incrementally, all offline with no dependencies, network calls, or embeddings.
    3
    MIT