Patchloom
OfficialPatchloom is an MCP server giving AI agents safe, structured, multi-file editing capabilities with parser-backed config edits, AST-aware code operations, markdown manipulation, atomic batch/transaction plans, and file/search utilities.
Parser-backed config edits: Set, get, merge, append, prepend, delete, move, ensure, update, and query JSON/YAML/TOML by selector (including wildcards and predicates) while preserving comments and formatting.
Multi-file atomic operations:
execute_planruns mixed operations atomically with rollback;batch_replaceandbatch_tidyapply across many files in one call;apply_patchhandles unified diffs, SEARCH/REPLACE, and Codex-style patches with stale detection and conflict control.Markdown editing: Heading-aware section insert/replace/move/dedupe, table row append, bullet upsert, and linting of agent rules files.
AST code operations: List, read, search, rename, replace, insert, move, split, group, wrap, reorder, extract, rewrite signatures, and analyze dependencies/impact across 20 programming languages while skipping strings/comments.
File utilities: Create, read, append, prepend, replace, delete, move, list, search, and whitespace-normalize files, plus apply Morph-style fragments with required anchors.
Repository awareness: Git status, server info, workspace-root-relative paths, path containment, and result caps to respect agent context budgets.
Performs heading-aware edits on Markdown documents, including appending rows to tables and modifying sections and bullets.
Edits TOML files by selector, preserving comments and formatting for safe configuration changes.
Edits YAML files by selector, preserving comments and formatting while supporting value updates and array operations.
Patchloom
One binary. Every platform. Structured file edits for AI agents.
Patchloom is a single-binary CLI that gives AI coding agents safe, structured file editing on any operating system. It edits JSON, YAML, and TOML by selector (not regex), preserves comments, understands code structure across 20 languages, batches multiple file edits into one tool call, and works identically on Linux, macOS, and Windows.
Not a generic filesystem MCP. Default MCP filesystem servers read/write files as text. Patchloom adds dry-run previews, parser-backed config and markdown edits, AST ops, multi-file batch/tx with undo, and stable error_kind peels for hosts. Full coding agents (Claude Code, Codex, Cursor) own the loop; Patchloom is the tool layer they (or a Rust embedder) call.

# Edit a YAML value by selector without breaking comments or formatting
patchloom doc set config.yaml database.port 5432 --apply
# Batch 6 file edits into a single tool call
patchloom batch --apply <<'EOF'
doc.set package.json version "2.0.0"
doc.set config.yaml app.version "2.0.0"
doc.set config.toml project.version "2.0.0"
replace README.md "1.0.0" "2.0.0"
replace CHANGELOG.md "1.0.0" "2.0.0"
file.create VERSION "2.0.0"
EOFWhy Patchloom? | Install | Quick start | Commands | Comparison | When to use what | Architecture | Status
Why Patchloom?
The problem
AI agents edit files through tool calls. Each call is a round-trip back to the LLM. When a task touches config files, that process has three failure modes:
Syntax corruption. The agent uses text replacement on JSON, YAML, or TOML and produces invalid output (mismatched braces, broken indentation, lost comments).
Round-trip tax. Editing 6 files means 6 separate tool calls. Each one waits for the LLM to generate, execute, read the result, and plan the next call.
Platform fragmentation. On Linux the agent uses
sed,jq,grep. On Windows, none of those exist. The agent falls back to verbose PowerShell or makes errors with unfamiliar syntax.
How patchloom solves each one
Problem | How patchloom solves it |
Syntax corruption |
|
Round-trip tax |
|
Platform fragmentation | Single static binary with zero dependencies. Same commands, same flags, same behavior on Linux, macOS, and Windows. |
What changes with patchloom
Without patchloom (6 tool calls)
Agent: edit file 1 ─── tool call ───▶ 15s
Agent: edit file 2 ─── tool call ───▶ 15s
Agent: edit file 3 ─── tool call ───▶ 15s
Agent: edit file 4 ─── tool call ───▶ 15s
Agent: edit file 5 ─── tool call ───▶ 15s
Agent: edit file 6 ─── tool call ───▶ 15s
Total: ~90sWith patchloom batch (1 tool call)
Agent: batch with
all 6 edits ─── tool call ───▶ 25s
5 round-trips saved
Total: ~25sKey capabilities
Capability | What it does | Example |
Parser-backed edits | Edit JSON/YAML/TOML by selector, preserving comments and formatting |
|
Batch N files in 1 call |
|
|
Comment preservation | YAML/TOML comments survive all edits, including array resizing |
|
Heading-aware markdown | Edit sections, tables, and bullets by heading, not line number |
|
AST-aware code ops | List, rename, replace, and analyze symbols across 20 languages |
|
Atomic rollback |
|
|
MCP server | Expose all operations as structured MCP tool calls |
|
Optional CLI sandbox | Reject |
|
Cross-platform | Identical behavior on Linux, macOS, Windows. No | Same binary everywhere |
When to use patchloom vs native tools
Patchloom is not a replacement for all file operations. Its instructions tell agents exactly when to use it and when native tools are faster:
Task | Use patchloom? | Why |
Edit a JSON/YAML/TOML value by selector | Yes | Parser guarantees valid output, preserves comments |
Edit 3+ files in one task | Yes |
|
Append a row to a markdown table | Yes | Heading-aware, no line number guessing |
Read a single file | No | Native |
Simple text search | No | Native |
Single-file text replacement | No | Native |
Correctness over speed
Patchloom is not faster than native tools for simple, single-file edits. Use native tools for those. But native text replacement cannot safely edit structured files: a sed on YAML can corrupt indentation, strip comments, or produce invalid syntax. doc set parses the file, changes the value by selector, and writes valid output. That guarantee is the point.
Where patchloom is faster is multi-file batching. Six file edits via native tools means six round-trips to the LLM. One batch call does the same work in a single round-trip.
Task PL-CLI MCP Native
────────────────────── ────── ────── ──────
search 18.5s 12.7s 13.9s ◀ ~same
replace 36.1s 26.6s 26.1s ◀ ~same
doc_set 30.9s 16.9s 13.7s ◀ native fastest
md_table 15.5s 13.5s 15.3s ◀ MCP fastest
tx_multi_file 41.4s 28.5s 22.9s ◀ native fastest
batch_6_files 50.6s 46.6s 30.3s ◀ native fastest
batch_mixed_ops 24.7s 13.6s 20.9s ◀ MCP fastest
yaml_comment_preserve 18.1s 11.6s 16.1s ◀ MCP fastest
md_insert 15.0s 11.7s 15.7s ◀ MCP fastest
file_ops 26.0s 16.6s 17.2s ◀ ~same
tidy 45.0s 30.3s 41.7s ◀ MCP fastest
────────────────────── ────── ────── ──────
TOTAL 321.9s 228.5s 233.8sMCP mode wins overall (228.5s vs 233.8s native) because structured tool calls skip shell syntax construction entirely. MCP wins 5/11 tasks; native wins 3/11; 3 are ties. CLI mode is always slowest due to shell construction overhead.
Related MCP server: mcp-json-yaml-toml
Install
Prefer channels that track each GitHub Release (Homebrew, Scoop, crates,
npm, Releases). On Windows, Scoop is recommended. winget
(Patchloom.Patchloom) is published per release and is usually current
after Microsoft's publish pipeline (winget source update if search is
stale). Chocolatey often lags while community moderation runs.
# Homebrew (macOS/Linux)
brew install patchloom/tap/patchloom
# crates.io (requires Rust 1.95+, includes MCP server)
cargo install patchloom
# npm / npx (downloads the platform binary from GitHub Releases)
npx patchloom --version
# or: npm install -g patchloom# Scoop (Windows; recommended Windows channel)
scoop bucket add patchloom https://github.com/patchloom/scoop-bucket
scoop install patchloom/patchloomPre-built binaries for Linux, macOS, and Windows are on the Releases page. See Installation for shell installer scripts, source builds, shell completions, and winget / Chocolatey notes.
MCP Registry name:
mcp-name: io.github.patchloom/patchloom
Editor extension
Install the companion extension for VS Code, Cursor, Windsurf, or VSCodium:
The extension auto-discovers the CLI (or installs it for you), generates AGENTS.md, configures MCP servers, and adds Quick Actions to the command palette. See the Editor Extension guide for details.
Quick start
1. Set up your project
patchloom initThis creates AGENTS.md in a new project or appends the rules to an existing agent instructions file, offers shell completions, and detects MCP configuration opportunities. Pass -y to skip confirmation prompts.
If you only want the rules text:
patchloom agent-rules >> AGENTS.md
# Or tailor the output:
patchloom agent-rules --mode mcp >> AGENTS.md # MCP-only (no CLI examples)
patchloom agent-rules --platform windows >> AGENTS.md # Windows-only syntaxIf .vscode/ or .cursor/ exists, init also prints ready-to-copy .vscode/mcp.json or .cursor/mcp.json snippets.
Your AI agent reads AGENTS.md and learns when to use patchloom vs native tools.
2. Edit a config file safely
# Parser-backed: changes the value, preserves comments and formatting
patchloom doc set config.yaml database.port 5432 --apply3. Batch multiple edits into one call
patchloom batch --apply <<'EOF'
doc.set config.json version '"2.0.0"'
md.upsert_bullet AGENTS.md "Rules" "- Always test"
replace src/main.rs "v1" "v2"
EOFValues are JSON-first: unquoted 2.0 becomes a number. Force a string with nested
quotes as above (Unix shells).
On Windows PowerShell (no bash heredoc), write ops to a file:
@'
doc.set config.json version "\"2.0.0\""
md.upsert_bullet AGENTS.md "Rules" "- Always test"
replace src/main.rs "v1" "v2"
'@ | Set-Content ops.txt -Encoding utf8
patchloom batch --apply ops.txtOr use a JSON plan with format and validate lifecycle:
{
"version": 1,
"operations": [
{ "op": "doc.set", "path": "config.json", "selector": "version", "value": "2.0.0" },
{ "op": "md.upsert_bullet", "path": "AGENTS.md", "heading": "Rules", "bullet": "- Always test" },
{ "op": "replace", "path": "src/main.rs", "old": "v1", "new": "v2" }
],
"format": [{ "cmd": "cargo fmt --all" }],
"validate": [{ "cmd": "cargo test", "required": true }]
}patchloom tx plan.json --applytx plans are trusted input. format and validate run their cmd fields through the host shell (sh -c on Unix, cmd /C on Windows), so only run plans you trust.
4. Or use MCP for structured tool calls (no shell syntax)
After installing with MCP support, start the server:
PATCHLOOM_MCP_SURFACE=core patchloom mcp-serverMCP-capable agents call patchloom tools directly as structured JSON, with no shell quoting or command construction. The agent sends {"path": "config.json", "selector": "version", "value": "2.0"} instead of building patchloom doc set config.json version '"2.0"' --apply.
Coding agents: set PATCHLOOM_MCP_SURFACE=core for an 11-tool pack (list_files, search/read/replace, doc/md, execute_plan, server_info) so schemas stay small. Product default remains full inventory when the env is unset. Prefer Patchloom MCP alone for list+edit (no second filesystem MCP). See the MCP setup guide for Cursor / Claude / Codex paste configs and the full security model.
Using VS Code, Cursor, or Windsurf? The Patchloom extension handles setup automatically: it installs the binary, runs init, and configures your editor's MCP settings.
As a Rust library
Host teams embedding Patchloom instead of a private edit stack: see the
embedder host case study
(for_agent, peels, fuzzy refuse, apply_fragment, path-only ops).
Add patchloom as a dependency (omit CLI/MCP/AST with default-features = false):
[dependencies]
patchloom = { version = "0.34.0", default-features = false } <!-- x-release-please-version -->use patchloom::api::{self, ApplyMode, ReplaceOptions, edit_error_kind, EditErrorKind};
use std::path::Path;
// Replace text (preview only, no disk write)
let result = api::replace_text(
Path::new("src/config.rs"),
"old_value", "new_value",
&ReplaceOptions::default(),
ApplyMode::Preview,
None,
)?;
println!("{}", result.diff);
// Agent hosts: shared primary+fallback policy (unique, require_change, fuzzy @ 0.90)
let opts = ReplaceOptions::for_agent();
// Fail closed: zero matches become EditErrorKind::NoMatch
match api::replace_in_content("body", "missing", "x", &opts) {
Ok(r) => println!("changed={}", r.changed),
Err(e) => assert_eq!(edit_error_kind(&e), Some(EditErrorKind::NoMatch)),
}
// for_agent auto-refuses over-wide fuzzy; custom options use api::fuzzy_span_suspicious
// Buffer multi-op + host write: api::refuse_batch_if_suspicious_fuzzy after apply_content_edits
// Invalid options and bad regex peel InvalidInput (CLI/tx typed errors included)
match api::replace_in_content("body", "", "x", &ReplaceOptions::default()) {
Err(e) => assert_eq!(edit_error_kind(&e), Some(EditErrorKind::InvalidInput)),
Ok(_) => panic!("empty pattern must error"),
}
// Set a value in a JSON file
api::doc_set(
Path::new("config.json"),
"version",
serde_json::json!("2.0"),
ApplyMode::Apply,
None,
)?;
// Multi-doc YAML: merge into document 0 (selector None = root only)
api::doc_merge(
Path::new("stream.yaml"),
serde_json::json!({"env": "prod"}),
ApplyMode::Apply,
None,
Some("0"),
)?;
// Sole-path text load: binary → EditErrorKind::Binary; invalid UTF-8 → InvalidEncoding
let _text = api::load_text(Path::new("notes.md"))?;All API types are Send + Sync. Beyond the api module, utility modules are also public: containment (workspace path guarding), exec (shell command execution), files (file-walking, load_text_strict, binary detection), backup (restore_path_from_latest_backup for post-Apply validate/revert), and write (atomic file writes with policy transformations). Library users needing temp dirs (e.g. agents) can use PathGuard::builder(cwd).allow_temp_directory() (handles /tmp on macOS); see the containment and api module rustdocs. Multi-doc bare keys and wrong-root merges peel to EditErrorKind::TypeError via edit_error_kind. Create/rename dest-exists peels to EditErrorKind::AlreadyExists (or api::is_already_exists / api::error_kind_str for CLI-stable "already_exists" strings). Fine-grained kinds also have bool peels (is_not_found, is_conflicts, is_changes_detected, is_type_error, is_format_failed, is_guard_rejected, is_invalid_input, is_no_match, is_ambiguous) matching edit_error_kind.
Replace fail-closed / shell-token options: CLI replace --require-change and --command-position (also plan/MCP fields and ReplaceOptions on the library). Agent hosts: ReplaceOptions::for_agent() on primary and fallback replace paths (auto span refuse); custom options still call api::fuzzy_span_suspicious / FuzzySpanPolicy after fuzzy Apply; buffer multi-op hosts call api::refuse_batch_if_suspicious_fuzzy after apply_content_edits (#2064). Library-only AST mutators: ast_rename / ast_replace_in_symbol / ast_rename_batch (feature ast + files), and FunctionSigEdit::parse_rust. Ordered host onboarding: Embedder host checklist (#2009). Full surface: docs.rs/patchloom.
Getting started
Resource | What you'll learn |
Install options and shell completions | |
Write modes, transaction plans, exit codes | |
Configure patchloom as an MCP server for your agent | |
VS Code, Cursor, Windsurf, and VSCodium integration | |
5-minute walkthrough | |
Every command, operation, and mode | |
Transaction plan templates |
Commands
Agent-optimized (these are faster or safer than native tools)
Command | What it does | When to use |
| Line-oriented multi-file edits in 1 call | Editing 3+ files with simple syntax |
| JSON plan with format/validate lifecycle | Complex multi-file edits with rollback |
| Parser-backed JSON/YAML/TOML edits | Changing config values without breaking syntax |
| Heading-aware markdown edits | Updating tables, sections, bullets in docs |
| AST-aware symbol operations (20 languages) | Renaming identifiers, listing symbols, impact analysis |
| Apply unified diffs with stale detection | Replaying patches safely |
| Text-file whitespace and newline normalization | CI checks for text tidiness |
| MCP protocol server | MCP-capable agents (no shell syntax) |
General-purpose (also useful in scripts and CI)
Command | Description |
| Fast literal or regex search across text files (supports --glob/--exclude/--ignore-file for layered custom ignore files, --max-results, -C context, etc.) |
| Mechanical string replacement across text files with diff preview |
| Freeform fragment with required anchors (MorphLLM-style markers stripped; no cloud merge) |
| Append content to an existing file |
| Prepend content to an existing file |
| Create a new file with content |
| Delete a file |
| Move (rename) a file |
| Read file contents with optional line range |
| Show which files have uncommitted changes |
| Summarize a tx plan in plain English |
| Restore files from a backup created by |
| Generate shell completions (bash, zsh, fish, elvish) |
| Set up patchloom in a project (agent rules, completions, MCP) |
| Export operation schemas with tier filtering and system prompts |
| Generate agent instructions for your project |
How patchloom compares
Tool | Strength | Where patchloom differs |
jq | JSON query/transform | patchloom also handles YAML, TOML, markdown; batches across files; preserves comments |
yq | YAML/JSON query/transform | patchloom preserves YAML comments via CST editing; adds markdown, batching, atomic transactions |
dasel | Multi-format get/set | patchloom adds batching (N edits in 1 call), atomic rollback, format/validate lifecycle |
sd | Regex find/replace | patchloom adds parser-backed structured edits; batching; never produces invalid JSON/YAML |
comby | Structural code patterns | patchloom targets config files and agent workflows, not source code pattern matching |
The key difference: patchloom is designed for AI agent workflows. One batch or tx call replaces N sequential tool calls, cutting round-trips and eliminating partial-failure states.
vs agent-native editing tools
The table above compares patchloom to human CLI tools. But agents already have built-in editing: Claude Code's edit_file, Cursor's apply, Grok Build's search_replace, Aider's /code blocks. Why add patchloom on top?
Agent-native tools use text matching. They find a block of text and replace it. This works for source code but fails on structured config files:
Agent uses search_replace on YAML
database:
# Production settings
host: db.prod.internal
port: 5432 # PostgreSQL default
pool_size: 10The agent replaces port: 5432 with port: 5433. Result depends on implementation. Many agents lose the inline comment, break indentation, or fail to match because of surrounding context changes.
Agent uses patchloom doc set
patchloom doc set config.yaml \
database.port 5433 --applyThe YAML parser changes the value at the selector path. Comments, indentation, key ordering, and all other formatting are preserved. The output is always valid YAML.
Limitation of agent-native tools | How patchloom addresses it |
Comment destruction | CST-level YAML/TOML editing preserves all comments |
One file per tool call |
|
No rollback |
|
Platform-dependent | Same binary and syntax on Linux, macOS, Windows |
Stale context risk |
|
When to keep using native tools: Single-file reads, simple text search, single-file text replacement where comments don't matter. Patchloom's agent-rules tell agents exactly when to use each approach.
When to use what
Need | Prefer | Prefer something else |
JSON/YAML/TOML by path | Patchloom | Generic filesystem MCP / blind text replace |
Multi-doc YAML stream | Patchloom selectors ( | Bare key on stream root |
Structural code pattern search | Text-only grep for shapes | |
Identifier rename in code | Patchloom | Fuzzy text replace for symbols |
Multi-file atomic apply + undo | Patchloom | N sequential shell edits |
Freeform snippet with known anchor (after/before/old) | Patchloom | Whole-file rewrite or guessing placement |
Freeform snippet without anchors (cloud model merge) | Morph Fast Apply or similar | Patchloom (anchor-less Morph merge is a non-goal) |
Full agent product | Claude Code / Codex / Cursor | Patchloom alone |
Longer write-ups: Comparisons · Embedder host checklist · MCP setup
Library hosts: Embedder host checklist: dual-path ReplaceOptions::for_agent() (primary + fallback, includes refuse_suspicious_fuzzy), peels via edit_error_kind / is_* / is_fuzzy_span_suspicious with #[non_exhaustive] _ arm, multi-op ContentEditsResult.op_honesty + refuse_batch_if_suspicious_fuzzy after buffer multi-op (#2064), plan/tx widest matched_text, optional apply_content_edits_to_file_with_span_policy. Custom options still use api::fuzzy_span_suspicious / FuzzySpanPolicy after fuzzy Apply.
Context budget: line-range read, search --count / --files-with-matches, one batch/tx, --jsonl for large streams.
How it works with your AI agent
Two integration modes, same capabilities:
flowchart LR
subgraph CLI["CLI mode (any agent)"]
direction TB
A["patchloom agent-rules >> AGENTS.md"] --> B["Agent reads AGENTS.md"]
B --> C{"What kind of edit?"}
C -->|Simple edit| D["Native tool (faster)"]
C -->|Config edit| E["patchloom doc (safer)"]
C -->|Markdown edit| F["patchloom md (smarter)"]
C -->|Multi-file edit| G["patchloom batch (batched)"]
end
subgraph MCP["MCP mode (MCP-capable agents)"]
direction TB
H["patchloom mcp-server"] --> I["Agent discovers tools via MCP"]
I --> J["Structured JSON tool calls"]
J --> K["No shell syntax needed"]
endStatus
5200+ tests across 24 commands. Tested with Grok 4.3, GPT-5.4, and Claude Opus 4.6.
Component | Status |
CLI | Install from crates.io, Homebrew, Scoop, npm ( |
MCP server | Official MCP Registry name |
Editor extension | Published on VS Code Marketplace and Open VSX |
Full command reference
Every command, flag, transaction operation, and exit code is documented in the Command Reference (also available at docs/reference/README.md).
License
Licensed under either of:
MIT license (LICENSE)
Apache License, Version 2.0 (LICENSE-APACHE)
at your option.
Contributing
See CONTRIBUTING.md.
For local verification before opening a pull request, run make check. It covers the main Linux test and lint gate: formatting, clippy, unit tests (including feature-matrix jobs), integration tests, PTY tests, release-notes structure, test hygiene, generated-doc freshness (check-patchloom-md, check-readme), server-json-test, verify-homebrew-version-test, packaging-script unit tests (scoop-manifest-test, chocolatey-package-test, pack-mcpb-test, force-release-version-test), workflow-sanity-test, and apply-release-notes-test. It is not every GitHub required check: audit, deny, and Windows stay in GitHub Actions. While iterating locally, make check-fast is the same except it skips only check-patchloom-md (it still runs check-readme, server-json-test, verify-homebrew-version-test, the packaging-script tests, workflow-sanity-test, and apply-release-notes-test).
Pull request titles must use one Conventional Commits prefix (feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert; no commas or +). See CONTRIBUTING.md.
All commits must be signed off with git commit -s.
Agent integration tests
make agent-test runs 19 pytest scenarios that verify AI agents correctly use patchloom when given instructions. make bench-agent runs 3-way benchmarks (CLI vs MCP vs native) across 11 tasks. Use MODEL=X to switch models and RUNS=N for variance reduction. Requires an LLM API key. Not part of make check. See tests/agent/README.md for details.
Security
For current security reporting guidance, see SECURITY.md.
Available Tools
58 toolsappend_fileA
Append content to an existing file. Inserts the file's line ending first when the file does not already end with one. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"content":"#[test]\nfn new_test() {}\n","path":"tests/test.rs"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it delivers meaningful context: it discloses the line-ending insertion edge case ('Inserts the file's line ending first when the file does not already end with one') and warns about concurrent-call hazards, implying non-atomicity. It does not mention failure behavior for missing files, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose first, then the line-ending nuance, then the critical concurrency warning, then a working example. Every sentence earns its place — there is no filler or repetition of the schema.
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 two-parameter tool with no annotations and no output schema, the description covers the essential ground: purpose, edge-case behavior, concurrency hazard, an atomicity alternative, and a usage example. The main gaps are the missing-file failure behavior and what the tool returns, but these are minor for a simple append operation.
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, and it does: 'Append content to an existing file' maps content and path directly, and the example {"content":"#[test]\nfn new_test() {}\n","path":"tests/test.rs"} demonstrates concrete formats for both parameters and clarifies that path must point to an existing file. It lacks deeper parameter nuance (e.g., size limits or encoding) but compensates adequately.
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 opening sentence uses a specific verb plus resource: 'Append content to an existing file.' The word 'existing' explicitly distinguishes it from create_file, and 'append' contrasts with prepend_file and replace_text. The edge-case detail about line endings and the concrete example reinforce the tool's exact function.
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 provides clear context for when to use the tool (append to an existing file) and gives an explicit exclusion: 'do NOT issue concurrent calls targeting the same file.' It also routes to an alternative, 'use execute_plan for multi-op atomicity.' It stops short of a 5 because it does not explicitly contrast with direct siblings like prepend_file or create_file.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_fragmentA
Constrained freeform fragment apply (#2018). Strips Morph-style // ... existing code ... marker lines from fragment, then inserts or replaces at a required unique anchor (exactly one of after, before, old). Fail-closed: no anchor-less Morph model merge. Prefer for lazy-snippet agent output when anchors are known; use replace/ast for precise edits. Morph-class freeform fragment with required placement (exactly one of after/before/old). Lazy // ... existing code ... lines are stripped; no model merge without anchors (#2018). IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"fragment":"// ... existing code ...\n bar();\n// ... existing code ...\n","path":"src/lib.rs","after":"fn foo() {"}
| Name | Required | Description | Default |
|---|---|---|---|
| old | No | Replace this unique span with the cleaned fragment. | |
| path | Yes | File to edit. | |
| after | No | Insert cleaned fragment after this unique anchor. | |
| before | No | Insert cleaned fragment before this unique anchor. | |
| unique | No | Fail if the anchor matches more than once (default true). | |
| fragment | Yes | New text or Morph-style snippet (lazy marker lines stripped). Aliases `new`/`to`/`content` match replace_text agent priors. | |
| instruction | No | Optional human instruction (explain only; not used for merge). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that marker lines are stripped, that merging is fail-closed without anchors, that the operation mutates the target file, and that concurrent calls to the same file are unsafe. It lacks explicit return/error behavior, but the core side effects and constraints are clearly stated.
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 and includes a great example, but it repeats the same core facts: anchor placement appears twice, marker stripping appears twice, and the no-anchor-merge constraint appears twice. The redundancy makes it longer than necessary, though the structure remains logical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the combination of description and rich schema covers the purpose, the one-of anchor invariant, marker stripping, fail-closed behavior, concurrency safety, and a worked example. There is no output schema, and return-value details are not explained, but that is not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all 7 parameters at 100% coverage, so the baseline is 3. The description adds useful semantic context beyond the schema by emphasizing the exactly-one-of after/before/old requirement, the uniqueness of the anchor, and by providing a concrete JSON example showing how fragment, path, and after work together.
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: applying a fragment to a file by stripping lazy marker lines and inserting or replacing at a required unique anchor. It also differentiates from siblings by explicitly directing precise edits to replace/ast tools rather than this one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Prefer for lazy-snippet agent output when anchors are known' and 'use replace/ast for precise edits.' It also warns against concurrent calls and points to execute_plan for multi-operation atomicity, which is strong routing and exclusion information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_patchA
Apply a unified diff, a Codex *** Begin Patch document, or an Aider SEARCH/REPLACE / DiffFenced document. The diff parameter is the full unified diff text, a *** Begin Patch ... *** End Patch envelope (Add/Update/Delete/Move), or <<<<<<< SEARCH / ======= / >>>>>>> REPLACE blocks (path on the first line after SEARCH). SEARCH/REPLACE is unique by default (multi-match is ambiguous, no write); set replace_all=true to update every exact match. Empty-hunk +++ /dev/null (git deleted file mode, no hunks) unlinks. A hunked delete applies minus lines first; leftover bytes rewrite the file (preview --diff). Stale minus lines are ambiguous and the file is not removed; regenerate minus lines or use file.delete for path-only unlink. Use on_stale=merge for three-way merge on stale unified-diff context; allow_conflicts=true writes conflict markers. Never commit files containing conflict markers. IMPORTANT: do NOT issue concurrent patches/writes against the same files; use execute_plan for multi-op atomicity. Example: {"diff": "--- a/file.txt\n+++ b/file.txt\n@@ -1 +1 @@\n-old\n+new", "on_stale": "fail"}
| Name | Required | Description | Default |
|---|---|---|---|
| diff | Yes | ||
| strict | No | Roll back all writes when format/validate lifecycle steps fail. | |
| on_stale | No | fail | |
| replace_all | No | SEARCH/REPLACE only: update every exact match. Default unique. | |
| allow_conflicts | No |
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 it delivers. It discloses unique-match ambiguity leading to no write, empty-hunk unlink behavior, hunked-delete ordering, leftover-byte rewrites, stale-line ambiguity, three-way merge on on_stale=merge, conflict-marker writing, and the warning to never commit conflict markers. This is exceptionally transparent about edge-case behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries substantive information about formats, edge cases, or usage warnings. The density is justified by the tool's complexity. It could be slightly better organized with paragraph breaks, but the front-loaded purpose and example at the end keep it functional.
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 write tool with multiple input formats, ambiguity handling, and conflict behavior, the description is complete. It includes an example, covers all parameter semantics, warns about concurrency, and explains how to handle stale diffs. No output schema is present, but for a mutating tool the input and behavioral coverage is sufficient.
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 only 40%; diff, on_stale, and allow_conflicts lack schema descriptions. The description explains the diff parameter's accepted formats in detail, clarifies on_stale=merge behavior, and states that allow_conflicts=true writes conflict markers. It also clarifies replace_all semantics beyond the schema. This fully compensates for schema gaps.
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 opens with a specific verb and resource: 'Apply a unified diff, a Codex *** Begin Patch document, or an Aider SEARCH/REPLACE / DiffFenced document.' It enumerates three distinct input formats, making the tool's scope concrete and separating it from siblings like apply_fragment or replace_text.
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 provides actionable usage routing: use file.delete for path-only unlink, use execute_plan for multi-op atomicity, and avoid concurrent patches. It also explains when to set replace_all=true and on_stale=merge. It doesn't systematically compare against all sibling tools, but the guidance it does give is explicit and practical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_depsA
Extract import/dependency statements from source files. Supports Rust, Python, JS/TS, Go, Java, C/C++, Ruby, PHP. Use reverse=true to find what imports a file. Example: {"path": "src/main.rs"}
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language hint. | |
| path | Yes | File or directory to analyze (relative to working directory). | |
| reverse | No | Show reverse dependencies (what imports this file). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It communicates the read-only nature of the operation via 'Extract,' names the tool's language coverage, and clarifies the reverse-dependency mode. This goes beyond the raw schema and gives an agent useful expectations about what the tool will do.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each carrying useful information: the core operation, language support, and a concrete invocation example. No filler or redundancy; the description is appropriately front-loaded and easy to scan.
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 description covers the main invocation path, optional language support, reverse mode, and a representative example, which is sufficient for an agent to select and call the tool correctly. It does not detail output format or error behavior, but no output schema is available and those omissions are not critical for a straightforward extraction tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds a concrete path example and language context, but the reverse behavior is already described in the schema, and the lang parameter receives no additional semantic detail. The description therefore provides only modest value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Extract import/dependency statements from source files.' It also lists supported languages and an example path, making the tool's purpose concrete. However, it does not differentiate itself from the similarly named sibling tool ast_imports, so it misses full sibling distinction.
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 gives a practical usage hint with 'Use reverse=true to find what imports a file' and includes an example call. It does not, however, explain when to choose ast_deps over alternatives like ast_imports, ast_refs, or ast_impact, leaving tool-selection guidance implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_diffA
Structural diff between two versions of a file. Shows added, removed, and modified symbols (not line-level diff). Compares against git refs. Example: {"path": "src/lib.rs", "from": "HEAD~1"}
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Git ref for the "new" version (default: working tree). | |
| from | No | Git ref for the "old" version (default: HEAD). | HEAD |
| lang | No | Language hint. | |
| path | Yes | File to diff (relative to working directory). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It does explain the diff granularity, the symbol-level output, and git ref comparison, which is useful. But it does not state whether the operation is read-only, whether it modifies anything, or what the output structure looks like.
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 compact and front-loaded. Every sentence contributes: the first defines the operation, the second clarifies output granularity, the third establishes git ref usage, and the example provides a concrete invocation pattern. No unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately simple tool with full schema coverage and no output schema, the description provides enough to select and invoke the tool correctly. The example clarifies required input. The main gap is that it does not describe the return format, but that is not essential for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description's example demonstrates usage of 'path' and 'from', adding a small amount of practical meaning, but it does not add detail about the 'to' or 'lang' parameters or their interactions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool performs a structural diff between two file versions, showing added, removed, and modified symbols rather than line-level changes. This makes the tool's purpose specific and distinguishes it from generic diff or doc_diff 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 gives clear context: it compares against git refs and is explicitly not a line-level diff. It provides a concrete example showing how to specify path and from. However, it does not name alternative tools or when-not conditions beyond the line-level exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_extract_to_fileA
Extract a symbol (module, function, struct) to a separate file. For modules with unwrap=true, content is un-indented. IMPORTANT: do NOT issue concurrent extracts/writes against the same files; use execute_plan for multi-op atomicity. Example: {"source": "src/lib.rs", "symbol": "tests", "target": "src/lib_tests.rs", "replacement": "mod tests;", "prepend": "use super::*;"}
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language hint. | |
| force | No | Overwrite target if it exists. | |
| source | Yes | Source file containing the symbol. | |
| symbol | Yes | Name of the symbol to extract. | |
| target | Yes | Destination file path. | |
| unwrap | No | If true (default), remove wrapper and un-indent for modules. | |
| prepend | No | Content to prepend to the target file. | |
| replacement | No | Text to leave in place of the extracted block. | |
| update_imports | No | Rewrite consumer `use`/import statements of the extracted symbol. | |
| new_module_path | No | Module path consumers should import from (required with `update_imports`). | |
| old_module_path | No | Module path consumers currently import from (required with `update_imports`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the behavioral disclosure burden. It reveals the un-indenting behavior for modules with unwrap=true, warns about concurrent write hazards, and illustrates a realistic invocation with the example. It does not mention side effects like source-file modification or force-overwrite behavior, but the most operationally critical traits are 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?
The description is tight: one purpose sentence, one behavior note, one important warning, and one illustrative example. There is no filler, and the highest-priority warning is clearly marked. The example earns its place by clarifying the parameter relationships.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 11 parameters, no annotations, and no output schema, the description is helpful but not fully complete. It explains core behavior and concurrency constraints, but does not clarify return values, whether the source file is modified in place, or how update_imports and force interact in real usage. The example mitigates some gaps, but not all.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes slightly beyond the schema by supplying a complete example that shows how source, symbol, target, replacement, and prepend relate in practice. This helps an agent understand typical usage patterns more concretely than property descriptions alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Extract a symbol (module, function, struct) to a separate file.' This is specific about the verb, resource, and scope. It does not explicitly differentiate itself from sibling tools like ast_move or ast_split, but the phrase 'to a separate file' narrows the intent sufficiently.
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 gives an explicit usage caution: 'do NOT issue concurrent extracts/writes against the same files; use execute_plan for multi-op atomicity.' This provides a concrete when-not-to-use and points to the correct alternative for atomic multi-op workflows. It does not compare against all sibling extraction/move tools, but the guidance is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_groupA
Group symbols into a named module within a file. Creates the module if it doesn't exist, or appends to it. IMPORTANT: do NOT issue concurrent writes against the same file; use execute_plan for multi-op atomicity. Example: {"path": "src/tests.rs", "module": "line_endings", "symbols": ["test_crlf", "test_lf"], "preamble": "use super::*;"}
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language hint. | |
| path | Yes | File to modify (relative to working directory). | |
| module | Yes | Module name to create or append to. | |
| symbols | Yes | Symbols to move into the module. | |
| position | No | Where to place new module: "first-symbol" (default), "end", or "after:<symbol>". | |
| preamble | No | Code to insert at the top of the module (e.g., `use super::*;`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden. It discloses that the tool mutates the file, creates or appends the module, and has an important concurrency hazard; it also points to execute_plan for atomicity. It does not describe return values or error behavior, but the most operationally important behavioral traits are 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?
The description is compact and front-loaded: purpose, critical warning, then a concrete example. Every sentence contributes actionable information 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?
For a mutation tool with no output schema and no annotations, the description covers the core usage scenario well: file, module, symbols, preamble, and atomicity. It stops short of explaining failure cases or return values, but the combined schema and example provide enough to call the tool correctly in typical cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value with a concrete example binding path, module, symbols, and preamble, and demonstrates a realistic preamble value like 'use super::*;'. Position and lang remain documented only by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: group symbols into a named module within a file, with clear create-or-append behavior. The example makes the intent unambiguous and distinguishes it from related AST mutation tools like ast_insert and ast_move.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly warns against concurrent writes to the same file and directs multi-operation scenarios to execute_plan, which is a clear when-not and alternative guidance. It does not exhaustively compare against all sibling AST tools, but the key usage constraint is stated plainly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_impactA
Transitive impact analysis: what symbols are affected by changing a given symbol. Traces the reference graph to find all direct and indirect dependents. Example: {"symbol": "parse_config", "path": "src/", "depth": 3}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Directory to scan for references (relative to working directory). | |
| depth | No | Maximum traversal depth (1 = direct refs only). | |
| symbol | Yes | Symbol name to analyze. |
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 discloses the core algorithm (traversing the reference graph for transitive dependents) but leaves side-effect status implicit and does not describe output format or limitations. The word 'analysis' implies read-only, but that is not stated explicitly.
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 two well-structured sentences with a concrete example, leading with the core concept 'Transitive impact analysis' before providing detail. Every sentence earns its place, and the example is placed at the end without disrupting the conceptual summary.
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 no output schema, and the description does not state what the result looks like (e.g., list of symbols, file paths, or a graph). It provides the purpose and an example input, but an agent cannot confidently anticipate the return shape. This is a notable gap for a tool without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents symbol, path, and depth. The description adds an example input, which is helpful for understanding parameter combinations, but it does not elaborate on parameter meaning or format beyond the schema. This matches the baseline for high schema coverage.
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: 'Traces the reference graph to find all direct and indirect dependents.' It clearly identifies 'transitive impact analysis' as the core function, which distinguishes it from sibling tools like ast_refs or ast_deps that likely handle direct references or dependencies. The scope ('all direct and indirect') is explicit and unambiguous.
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 phrase 'what symbols are affected by changing a given symbol' gives a clear use case: use this tool when planning a change to assess downstream impact. It does not explicitly name alternatives or exclusion conditions, but the context is unmistakable within the ast_* family, and the transitive nature sets it apart from more direct reference tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_importsA
Manage import/use statements: add (idempotent), remove, deduplicate. With no mutation args, lists existing imports. IMPORTANT: when mutating, do NOT issue concurrent writes against the same file; use execute_plan for multi-op atomicity. Example: {"path": "src/main.rs", "add": ["use std::collections::HashMap;"]}
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | Import statements to add (idempotent; skips if already present). | |
| lang | No | Language hint. | |
| path | Yes | File to modify (relative to working directory). | |
| dedupe | No | Deduplicate imports. | |
| remove | No | Import statements to remove. |
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 provides meaningful traits: idempotent adds, deduplication behavior, list mode, and a critical concurrency warning. It does not disclose return format or edge-case behavior such as handling nonexistent files, but the most important behavioral warnings are present.
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 compact and front-loaded: key actions first, then mode behavior, then a critical concurrency warning, then a concrete example. Every sentence adds distinct value with no redundancy.
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 tool with 5 parameters, no output schema, and no annotations, the description covers the main modes, the concurrency hazard, and gives an example. It could be more complete by describing the return value or format of the listed imports, but the essentials for correct invocation are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds useful semantics by explaining that omitting mutation args triggers list mode and that adds are idempotent. The example also demonstrates the expected shape of add values, going beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: managing import/use statements with add, remove, and deduplicate actions, plus a list mode when no mutation args are given. This distinguishes it from sibling tools like ast_read or ast_insert by focusing specifically on import/use statement manipulation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly explains when to use the tool in different modes: mutation args trigger modifications, while no mutation args triggers listing. It also gives a clear when-not-to-use rule: do not issue concurrent writes when mutating, and use execute_plan for multi-op atomicity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_insertA
Insert code at a structurally-aware position: inside a module/impl/struct (at start or end), or after/before a named symbol. Indentation is auto-detected. IMPORTANT: do NOT issue concurrent writes against the same file; use execute_plan for multi-op atomicity. Example: {"path": "src/lib.rs", "content": "fn new_fn() {}", "after": "existing_fn"}
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language hint. | |
| path | Yes | File to insert code into (relative to working directory). | |
| after | No | Insert after this symbol (mutually exclusive with inside/before). | |
| before | No | Insert before this symbol (mutually exclusive with inside/after). | |
| inside | No | Module/impl/struct to insert into (mutually exclusive with after/before). | |
| content | Yes | Code to insert. | |
| position | No | Position within `inside`: "start" or "end" (default). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. It mentions that indentation is auto-detected and warns about concurrent writes, but it does not describe failure modes, what happens when the target symbol is not found, or whether the operation is idempotent.
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 compact and well-structured, covering purpose, key positioning options, a behavioral warning, and a concrete example. Every sentence contributes actionable information without unnecessary verbosity.
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 description provides enough context to invoke the tool correctly for typical use cases, including the mutually exclusive positioning parameters and the warning about concurrent writes. It omits details about return values and error handling, but no output schema is expected and the core usage is adequately covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description adds useful context such as mutual exclusivity among after/before/inside, the meaning of position within inside, and the path being relative to the working directory. It could clarify the expected format of the symbol name but is otherwise clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool inserts code at a structurally-aware position, either inside a module/impl/struct (at start or end) or after/before a named symbol. This distinguishes it from plain file append/prepend tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a specific warning against concurrent writes and directs users to execute_plan when multiple operations need atomicity. However, it does not explicitly compare itself to other insertion tools like append_file or apply_fragment, relying on the structural-awareness phrasing to imply when it should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_listB
List symbol definitions (functions, classes, structs, enums, methods, etc.) in a file or directory. Supports 20 languages. Example: {"path": "src/"} or {"path": "main.py", "kind": "function,class"}
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter by symbol kind (comma-separated: function,struct,enum,class,method,trait,impl,const,type,interface,module). | |
| lang | No | Language hint (overrides extension detection). E.g. "rs", "py", "go", "ts", "java", "c", "cpp". | |
| path | Yes | File or directory to list symbols from (relative to working directory). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does convey that the tool enumerates symbol definitions, supports 20 languages, and accepts either a file or directory. However, it omits behavioral details such as whether directories are traversed recursively, how unsupported languages are handled, and what the returned data looks like.
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 two sentences plus a short JSON example, with the core purpose front-loaded. Every element earns its place: the verb+resource, the language support claim, and the concrete invocation example. There is no redundant or filler content.
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 input side is well covered: all three parameters are documented in the schema and the description gives a working example. However, the lack of an output schema and the absence of any disambiguation from the many sibling ast_* tools means an agent cannot fully determine what response to expect or when to select this tool over a close alternative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents path, kind, and lang. The description adds a compact example showing how 'path' and 'kind' can be combined, but it does not provide semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List symbol definitions') on a concrete resource ('file or directory'), and gives examples of valid invocations. It is clear enough to distinguish from most sibling tools, though it does not explicitly name a differentiating sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided for when to use this tool versus alternatives such as ast_search, ast_map, or ast_read. The description implies a use case through the verb 'list', but it never states exclusions, prerequisites, or conditions for preferring another tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_mapA
Generate a ranked repository map using PageRank over the symbol reference graph. Shows the most important symbols with token-budget-aware output. Example: {"path": "src/", "max_tokens": 2048}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Directory to map (relative to working directory). | |
| boost | No | Boost these symbol names (comma-separated). | |
| focus | No | Boost symbols from these files (comma-separated paths). | |
| max_tokens | No | Maximum approximate token count for output. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose meaningful behavior: PageRank-based ranking and token-budget-aware output. However, it does not explicitly state that the command is read-only or describe error handling, limits, or output formatting 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?
Two tight sentences plus a concrete JSON example. The core ranking behavior is front-loaded, and there is no filler or repetition of schema content.
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?
Input-side details are well covered by the schema and example, but there is no output schema, and the description only vaguely says it 'shows' important symbols. The exact returned shape/format is not specified, which is a meaningful gap for an agent consuming the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The example reinforces that path and max_tokens go together, but it adds no substantive meaning beyond the schema's parameter descriptions, especially for boost and focus.
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 uses a specific verb and resource: 'Generate a ranked repository map' via 'PageRank over the symbol reference graph.' It also clarifies what the output contains ('most important symbols') and distinguishes itself from AST siblings like ast_list or ast_deps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool—when an overview of important symbols is needed—but it never explicitly states when to prefer it over alternatives like ast_list, ast_search, or ast_deps. There are no exclusions or explicit when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_moveA
Move symbols between files. Removes from source, inserts into target (creating it if needed). IMPORTANT: do NOT issue concurrent moves/writes against the same files; use execute_plan for multi-op atomicity. Example: {"path": "src/big.rs", "target": "src/helpers.rs", "symbols": ["helper_fn"], "target_prepend": "use super::*;"}
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language hint. | |
| path | Yes | Source file (relative to working directory). | |
| target | Yes | Target file. | |
| symbols | Yes | Symbols to move. | |
| position | No | Position in target: "end" (default), "start", "after:<symbol>", "before:<symbol>". | |
| target_prepend | No | Content to prepend to target file if creating it. | |
| update_imports | No | Rewrite consumer `use`/import statements of moved symbols. | |
| new_module_path | No | Module path consumers should import from (required with `update_imports`). | |
| old_module_path | No | Module path consumers currently import from (required with `update_imports`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It clearly states that the tool removes from the source, inserts into the target, creates the target file if needed, and warns against concurrent writes. It does not disclose reversibility or error behavior, but the core destructive and file-creation traits are transparent.
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 compact and well-organized: core semantics first, then the critical concurrency warning, then a concrete example. Every sentence earns its place, and the example makes parameter usage immediately understandable.
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 destructive tool with 9 parameters, no annotations, and no output schema, the description covers the central behavior, file creation, and a critical concurrency constraint. It could be more complete by referencing the ast_move alternatives or describing return/error behavior, but the provided example and warning make it largely sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a concrete example showing path, target, symbols, and target_prepend, but does not add extra meaning for position, update_imports, new_module_path, or old_module_path beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Move symbols between files' and explicitly states the behavior 'Removes from source, inserts into target (creating it if needed)'. This clearly differentiates it from file-level tools like move_file or copy-like operations, since the destructive nature of the move is stated up front.
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 gives explicit guidance about when not to use it concurrently and directs users to execute_plan for multi-operation atomicity. However, it does not explicitly contrast ast_move with similar siblings such as ast_extract_to_file or ast_rename, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_readA
Read a specific symbol's source code by name from a file. Uses AST parsing to find the exact definition. Example: {"path": "src/main.rs", "symbol": "run"}
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language hint. | |
| path | Yes | File to read from (relative to working directory). | |
| symbol | Yes | Symbol name (e.g. "run" or "Server::start"). | |
| context | No | Number of context lines before/after the symbol. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses a meaningful behavioral trait: AST parsing finds the exact definition rather than a text match. However, it does not mention output format, error behavior when the symbol is missing, or how lang affects parsing, leaving significant behavior undisclosed.
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 two short sentences plus a compact JSON example. The action is front-loaded, and every clause adds information: the target, the method, and a concrete call shape. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no annotations and no output schema, the description gives the core behavior and example but omits return format, failure modes, and the role of lang/context. This is adequate for a simple invocation but not fully complete for an agent handling edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters. The description only supplies example values for path and symbol and does not clarify lang or context beyond their schema descriptions, meeting the baseline but adding no extra semantic value.
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 action: read a symbol's source code from a file, with the method (AST parsing) and scope (exact definition). This clearly differentiates from siblings like read_file, which reads whole files, and ast_search, which locates symbols rather than returning their code.
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 usage is implied: use when you know the file path and symbol name, as shown in the example. However, there are no explicit when-to-use vs alternatives statements, such as 'use ast_search when the symbol is unknown' or 'use read_file to read the entire file'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_refsA
Find all references to a symbol across files using AST analysis. Distinguishes definitions from references. Example: {"symbol": "process_data", "path": "src/"}
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language hint. | |
| path | Yes | File or directory to search (relative to working directory). | |
| symbol | Yes | Symbol name to find references for. | |
| include_def | No | Include the definition site in results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the behavioral burden. It clearly signals a read-only AST analysis operation and calls out a key behavioral distinction: definitions are separated from references. It could add more about output shape or language limitations, but the core behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus an example with no filler. The core behavior is front-loaded, and every part of the description earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description and full schema coverage are enough to know what the tool does and what inputs to provide. However, there is no output schema and no description of the result format, so the agent must infer what the returned references look like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so lang, path, symbol, and include_def are already documented in the schema. The example adds a concrete usage illustration but does not provide additional semantic meaning beyond what the parameter descriptions already convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific action: find all references to a symbol across files using AST analysis. It also distinguishes definitions from references, which separates it from generic AST search or dependency tools like ast_search and ast_deps.
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 gives an example but no explicit guidance about when to use ast_refs versus sibling tools such as ast_search, ast_deps, or ast_imports. The example implies usage, but no when-not-to-use or alternative routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_renameA
Rename identifiers across files using AST-aware renaming (skips strings and comments). IMPORTANT: do NOT issue concurrent renames (or other writes) against the same file or directory tree; use execute_plan for multi-op atomicity (e.g. multiple renames). Example: {"path": "src/", "old": "process_data", "new": "transform_data"}
| Name | Required | Description | Default |
|---|---|---|---|
| new | Yes | The new identifier name (same name as replace / plan `new`). Alias `to` accepted because agents often emit that name (LLM prior). | |
| old | Yes | The identifier to rename (same name as replace / plan `old`). Alias `from` accepted because agents often emit that name (LLM prior). | |
| lang | No | Language hint. | |
| path | Yes | File or directory to rename in (relative to working directory). |
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 discloses the critical concurrency hazard (no concurrent writes), the AST-aware behavior, and that strings/comments are skipped. This is strong, though it doesn't mention failure modes or what happens when no matches exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: purpose, critical warning, and example. Every sentence earns its place, and the most important constraint is clearly marked with 'IMPORTANT'.
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 description, combined with the rich schema, covers purpose, path semantics, parameter meaning, and the safety constraint for multi-op atomicity. It lacks details about return format or what happens on consecutive renames beyond the warning, but no output schema exists and the key operational context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters well. The description adds a brief example showing path/old/new values and mentions aliases in the schema itself, but it does not add substantial meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Rename'), a resource ('identifiers across files'), and the key method ('AST-aware renaming (skips strings and comments)'). This clearly distinguishes it from simpler text-replacement siblings like replace_text and ast_replace, and the example reinforces the operation.
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 gives explicit guidance on when NOT to use it directly ('do NOT issue concurrent renames... use execute_plan for multi-op atomicity') and provides an example of a single rename call. It does not explicitly name alternatives for cases like simple text substitution, but the AST-aware, identifiers-only behavior implies the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_reorderA
Reorder symbols within a file or scope by name, kind, or custom order. IMPORTANT: do NOT issue concurrent writes against the same file; use execute_plan for multi-op atomicity. Example: {"path": "src/lib.rs", "order": "alphabetical"} or {"path": "src/lib.rs", "order": ["Struct", "impl Struct", "helper"], "inside": "mod tests"}
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language hint. | |
| path | Yes | File to reorder symbols in (relative to working directory). | |
| order | Yes | Ordering: "alphabetical", "reverse", "kind-first", or array of names. | |
| inside | No | Scope to reorder within (module/impl). Default: top-level. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It adds a valuable constraint: 'do NOT issue concurrent writes against the same file; use execute_plan for multi-op atomicity', which signals a mutating operation. But it does not disclose side effects on surrounding code, what happens when the custom order omits or misnames symbols, or whether the operation is reversible.
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 appropriately sized: one purpose sentence, one essential concurrency warning, and two compact examples. Every sentence contributes useful information, and the warning is placed prominently before examples.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with no output schema and no annotations, this covers the essential invocation surface: path, order, inside scope, atomicity guidance, and example payloads. Minor gaps remain, such as the meaning of 'kind-first' and behavior when a listed symbol is absent, but they do not prevent correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by enumerating ordering modes and providing concrete examples such as 'alphabetical' and a custom array with 'inside': 'mod tests', which helps the agent understand how the parameters combine beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Reorder symbols within a file or scope by name, kind, or custom order.' This clearly differentiates the tool from siblings like ast_move or ast_group, which reposition or group symbols rather than sort them by ordering criteria.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context by warning against concurrent writes and directing multi-op sequences to execute_plan for atomicity. However, it does not explicitly contrast this tool with sibling reorder/rename/group tools, so selection among alternatives is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_replaceA
Replace text only within a specific symbol's body using AST scoping. Precise: only changes code inside the named symbol, leaving everything else untouched. IMPORTANT: do NOT issue concurrent writes against the same file or directory tree; use execute_plan for multi-op atomicity. Example: {"path": "src/lib.rs", "symbol": "parse_config", "old": "unwrap()", "new": "expect("parse failed")"}
| Name | Required | Description | Default |
|---|---|---|---|
| new | Yes | Replacement text. Alias `to` accepted because agents often emit that name (LLM prior). | |
| old | Yes | Text or regex pattern to find. Alias `from` accepted because agents often emit that name (LLM prior). | |
| lang | No | Language hint. | |
| path | Yes | File containing the symbol (relative to working directory). | |
| regex | No | Treat `old` as a regex pattern. | |
| symbol | Yes | Symbol name to scope the replacement to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and it discloses meaningful behavior: the replacement is scoped to the symbol body and leaves all other code untouched. It also warns about concurrency safety. It does not mention error cases (e.g., symbol not found) or return/result format, but the core side-effect profile is clearly conveyed.
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 purposeful sentences plus a compact example. The main behavior is front-loaded, the critical concurrency warning is prominent, and every sentence contributes either scope, safety, or usage guidance.
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?
Provides the core behavior, an example, and a concurrency rule, but leaves ambiguity about whether all matching occurrences inside the symbol are replaced or only the first, what happens if the symbol or old text is not found, and what output the tool returns. For a mutation tool with no output schema and no annotations, these are meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds a concrete usage example that demonstrates path, symbol, old, and new, giving agents a clear pattern for emitting values. It reinforces the meaning of the symbol parameter as the AST scope boundary.
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 ('Replace'), resource ('text within a specific symbol's body'), and method ('AST scoping'). It explicitly differentiates itself from broad text editing by claiming only the named symbol's body is changed, which distinguishes it from sibling tools like replace_text or batch_replace.
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?
Clearly establishes when to use it: when a precise, symbol-scoped replacement is needed and everything else must remain untouched. It also provides an atomicity guideline ('use execute_plan for multi-op atomicity') and warns against concurrent writes, but it does not explicitly name non-scoped alternatives or state when to prefer them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_rewrite_signatureA
Rewrite a function signature with structured fields (visibility, parameters, return_type) or a full new_signature string. Multi-language via tree-sitter. IMPORTANT: do NOT issue concurrent writes against the same file; use execute_plan for multi-op atomicity. Example: {"path": "src/lib.rs", "old": "process", "parameters": "(x: i32)", "return_type": "-> String"}
| Name | Required | Description | Default |
|---|---|---|---|
| old | Yes | Function name to rewrite. Aliases `name`/`from` accepted for agents. | |
| lang | No | Language hint. | |
| path | Yes | File containing the function (relative to working directory). | |
| parameters | No | New parameter list including parens. | |
| visibility | No | New visibility (e.g. "pub", "pub(crate)", or ""). | |
| return_type | No | New return type using language-native syntax. | |
| new_signature | No | Full replacement signature text (optional). Alias `to` for agents. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden of disclosing behavioral traits. It mentions the multi-language support via tree-sitter and explicitly warns against concurrent writes to the same file, directing to execute_plan for atomic operations. However, it does not disclose potential side effects, error handling, or return values, which are important for an agent to fully understand the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It fronts the core purpose, then details the two modes, mentions the language support, adds a critical warning, and finishes with a concrete example. Every sentence serves a purpose, with no redundancy or irrelevant detail, making it easy for an agent to parse quickly.
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 description, combined with the schema, provides enough context for an agent to invoke the tool correctly: it explains the parameters via the schema, offers an example, and includes the atomicity warning. However, it lacks guidance on when to prefer this tool over related siblings (e.g., ast_rename) and does not address edge cases like conflicting parameters (e.g., new_signature vs. structured fields). These omissions prevent a perfect score, but the description is still reasonably complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptions for all parameters (100% coverage), so the baseline is 3. The tool description adds an example that demonstrates how parameters combine (path, old, parameters, return_type), which clarifies relationships and typical usage. This extra context slightly enhances parameter understanding beyond the schema, justifying a score of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Rewrite a function signature' and provides two distinct modes of operation (structured fields vs. full new_signature string). It also specifies the multi-language capability via tree-sitter, which is a key functional trait. The example further clarifies the intended usage, leaving no ambiguity about what the tool does.
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 does not explicitly state when to use this tool over its siblings (e.g., ast_rename, ast_replace), nor does it provide guidance on selecting between the structured-field mode and the full new_signature mode. It does include a warning about concurrent writes and directs to execute_plan for atomicity, but this is a caution rather than a usage recommendation. Overall, usage guidance is implicit rather than explicit, leaving the agent to infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_searchA
Structural search using AST queries. Use S-expression syntax or set pattern=true for code patterns with $VAR meta-variables (pattern must be valid source after substitution, e.g. fn $NAME() {}). Literal tokens match exactly. $$$MULTI is not implemented. Example: {"query": "(function_item name: (identifier) @name)", "path": "src/"}
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language hint (required for pattern mode). | |
| path | Yes | File or directory to search (relative to working directory). | |
| query | Yes | Tree-sitter S-expression query, or a code pattern (with pattern=true). | |
| pattern | No | Treat the query as a code pattern with `$VAR` meta-variables. The pattern must be valid source after substituting `$VAR`. Literal tokens match exactly. `$$$MULTI` is not implemented. | |
| max_results | No | Maximum number of results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the full burden and does disclose non-obvious behavior: pattern mode requires valid source after $VAR substitution, literal tokens match exactly, and $$$MULTI is unimplemented. It omits result/error behavior, but the critical query-behavior constraints are clearly surfaced.
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 compact and front-loads the core purpose before diving into syntax. Some content (pattern=true validity, literal matching, $$$MULTI) duplicates the schema, but the example and mode selector justify the length.
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 tool with five parameters, no annotations, and no output schema, the description covers query construction and known limitations well. The main gap is the lack of any detail on the return shape or behavior when no matches are found.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above baseline by adding a concrete S-expression example and a pattern example (fn $NAME() {}) not present in the schema. It also reinforces the interplay between query and pattern mode, which helps an agent formulate valid queries.
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 opens with 'Structural search using AST queries,' identifying the specific operation (search) and resource (AST) and distinguishing it from sibling tools like search_files or ast_read. The example and query syntax further clarify exactly what kind of search this performs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the two query modes (S-expression vs. pattern=true) and provides an example, so an agent knows how to invoke it. However, it never states when to choose ast_search over search_files or the other ast_* siblings, nor does it give explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_splitA
Split a file into multiple target files by distributing symbols. Atomic: all targets succeed or all roll back. IMPORTANT: do NOT issue concurrent splits/writes against the same files; use execute_plan for multi-op atomicity. Example: {"source": "src/big.rs", "targets": [{"path": "src/types.rs", "symbols": ["Config", "Mode"], "prepend": "use super::*;"}], "keep_in_source": ["main"], "source_suffix": "mod types;"}
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language hint. | |
| source | Yes | The file to split. | |
| targets | Yes | Target file specs. | |
| source_prefix | No | Text to prepend to source after split. | |
| source_suffix | No | Text to append to source after split (e.g., `mod` declarations). | |
| keep_in_source | No | Symbols to keep in the source file. | |
| require_exhaustive | No | Error if any symbol is unaccounted for (default: true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It does disclose atomicity ('all targets succeed or all roll back') and a concurrency hazard, which is valuable. However, it does not state whether existing target files are overwritten, whether source is destructively modified, or what happens on partial symbol matches, so some important behavioral traits remain implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core operation, followed by the atomicity warning and a compact example. The example is long but earns its place by illustrating a multi-symbol split. Minor formatting noise from 'IMPORTANT' in caps keeps it from being maximally polished.
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 7-parameter mutation tool with no output schema, the description covers the core operation, atomicity, concurrency constraints, and usage pattern via example. It could be more complete by stating overwrite behavior and error semantics, but the essential context for an agent to invoke this correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds a concrete example showing how 'targets', 'prepend', 'keep_in_source', and 'source_suffix' combine in practice, which clarifies intended usage beyond the schema's generic field descriptions. It does not add much for 'lang' or 'require_exhaustive', but those are already well described in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Split a file into multiple target files by distributing symbols.' This is specific enough to distinguish it from many sibling tools like ast_move or ast_extract_to_file, though it does not explicitly name an alternative for contrast.
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 gives useful usage context: it warns against concurrent splits/writes and explicitly points to execute_plan for multi-op atomicity. It does not fully enumerate when to prefer this tool over other ast_* file-mutation siblings, but the atomicity guidance is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ast_validateB
Validate syntax of source files. Returns parse errors with line numbers. Supports 20 languages. Example: {"path": "src/main.rs"}
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language hint. | |
| path | Yes | File or directory to validate syntax (relative to working directory). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses that it returns parse errors with line numbers and supports 20 languages. However, it does not state whether the operation is read-only, how directories are handled, what happens for unsupported languages, or the exact output shape. These are notable gaps for a tool with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: core action, expected result, and a concrete example in three sentences. The only slightly weak point is the vague phrase 'Supports 20 languages' without a list, but overall there is no wasted text.
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 two-parameter tool, the description covers the core purpose and return behavior. However, with no output schema and no annotations, an agent still lacks details about directory semantics, unsupported-language behavior, side effects, and the full output structure. It is minimally viable but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains both 'path' and 'lang'. The description adds an example using 'path' and notes 20-language support, but it does not enumerate valid language values or explain how 'lang' interacts with auto-detection. It meets the baseline but does not significantly enhance schema meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly says 'Validate syntax of source files' and states the result: 'Returns parse errors with line numbers.' This is a specific verb and resource, and validation is distinguishable from sibling AST tools like ast_read, ast_search, or ast_reorder. It does not explicitly name a sibling it differs from, so it falls 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?
The intended use is implied: call this when you need to check whether source files have valid syntax. However, there are no explicit when-to-use or when-not-to-use statements, and no alternative tools are mentioned. The purpose is distinct enough to guide selection, but the guidance 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.
ast_wrapA
Wrap existing code in a structural block (module, impl, cfg, etc.). Specify symbols by name or a line range. IMPORTANT: do NOT issue concurrent writes against the same file; use execute_plan for multi-op atomicity. Example: {"path": "src/lib.rs", "symbols": ["helper_fn", "HelperStruct"], "wrapper": "mod helpers"}
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language hint. | |
| path | Yes | File to modify (relative to working directory). | |
| lines | No | Line range to wrap (e.g. "10:50", mutually exclusive with symbols). | |
| symbols | No | Symbols to wrap (mutually exclusive with lines). | |
| wrapper | Yes | The wrapping construct (e.g. "mod foo", "impl Bar", "#[cfg(test)]"). | |
| preamble | No | Content to insert at the top of the wrapped block. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It discloses that the tool writes to files and warns about concurrency risks, recommending execute_plan for atomicity. However, it does not describe what happens to existing code, reversibility, or any side effects beyond the concurrency caveat.
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 compact: purpose, selection mode, safety warning, and a concrete example in four short segments. Every sentence earns its place and the critical concurrency warning is prominently included.
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 6-parameter tool with complete schema coverage and no output schema, the description is nearly sufficient. It covers purpose, how to choose targets, example usage, and a key safety constraint. It would benefit from saying what the tool returns or rejects, but that is not required by the schema context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds a small amount of practical meaning by showing a valid wrapper and symbol selection in the example, but it does not materially go beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Wrap existing code in a structural block (module, impl, cfg, etc.).' This clearly distinguishes ast_wrap from sibling AST operations like ast_insert, ast_move, or ast_split, and the example reinforces the intended action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete selection guidance ('Specify symbols by name or a line range'), and warns against concurrent writes. It does not explicitly name alternatives or when-not-to-use cases, but the context is clear enough for an agent to decide when wrapping is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_replaceA
Replace the same text across multiple files in one call. Engine staging is atomic for applied writes (all written files succeed or none change). Pattern misses are soft by default: matching files still apply and total misses appear in refused[]; set require_change=true to fail the whole batch if any file has no match. Canonical field is files (array); singular file is accepted as an alias for one path. Optional fuzzy enables similarity fallback; when exact old is absent, refuse by default unless allow_absent_old=true (#1758). JSON reports match_mode (exact/fuzzy/anchored), optional match_score, optional matched_text, match_count per change and aggregate (#1674). IMPORTANT: do NOT issue concurrent write calls targeting the same files; use execute_plan for multi-op atomicity. Example: {"files": ["Cargo.toml", "README.md"], "old": "0.1.0", "new": "0.2.0"}
| Name | Required | Description | Default |
|---|---|---|---|
| new | Yes | Text to replace with. Alias `to` accepted because agents often emit that name (LLM prior). | |
| old | Yes | Text to find in each file. Alias `from` accepted because agents often emit that name (LLM prior). | |
| file | No | Single file (LLM prior). Equivalent to `files: [file]` when `files` is empty. If both are set, `files` wins. Alias `path` matches replace_text priors. | |
| files | No | File paths to apply the replacement to (relative to working directory). Canonical multi-file form. | |
| fuzzy | No | When exact match fails, try fuzzy/similarity fallback (#1668). | |
| regex | No | Use regex mode for the `old` pattern. | |
| strict | No | Roll back all writes when format/validate lifecycle steps fail. | |
| if_exists | No | If true, silently succeed when a file does not contain the pattern instead of returning an error. Useful for idempotent batch replacements. | |
| multiline | No | Enable multiline matching (dot matches newlines in regex mode). | |
| word_boundary | No | Match only at word boundaries. Prevents 'SetupFile' from matching inside 'BenchSetupFile'. Auto-escapes regex metacharacters. | |
| require_change | No | Fail when a file has zero matches (fail closed). Softened when if_exists is true. | |
| min_fuzzy_score | No | Reject fuzzy matches below this similarity floor (#1687). `None` = no floor. | |
| allow_absent_old | No | Allow fuzzy apply when exact `old` is absent (#1758). Default false (fail closed; report best candidate without writing). | |
| case_insensitive | No | Case-insensitive matching. | |
| command_position | No | Only rewrite shell command-position tokens (not arguments / longer words). Peels wrappers like sudo, timeout, busybox, flock, runuser, setsid. |
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 of behavioral disclosure. It clearly explains atomic staging, soft pattern misses surfaced in refused[], fuzzy fallback behavior with allow_absent_old, the JSON report shape, and a strong concurrency constraint. This is far more than the schema alone would reveal.
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 dense but well organized: purpose first, then atomicity, failure mode, aliases, fuzzy behavior, output shape, concurrency warning, and example. Every sentence adds operational value, and important warnings are capitalized and highlighted. The issue-tracker references are minor and do not detract.
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 complex 15-parameter mutation tool with no output schema and no annotations, the description covers all the high-risk behaviors: atomicity, soft failures, fuzzy matching outcomes, report fields, and concurrent-write prohibition. Since the schema comprehensively documents individual parameter semantics, no critical contextual gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all 15 parameters, so the baseline is 3, but the description goes beyond it by clarifying that files is canonical while singular file is an accepted alias, by explaining fuzzy fallback and allow_absent_old semantics, and by giving a concrete JSON example. This materially improves the agent's ability to construct correct calls.
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 uses a specific verb and resource: 'Replace the same text across multiple files in one call.' It clearly distinguishes this from single-file text tools and AST/structural tools by emphasizing the batch, multi-file scope. The first sentence immediately communicates what the tool does and what makes it different.
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 explicitly warns against issuing concurrent write calls to the same files and directs the agent to use execute_plan for multi-op atomicity. It also explains the soft-miss vs require_change behavior, giving the agent concrete criteria for when the batch will succeed, partially succeed, or fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_tidyA
Fix whitespace in multiple files in one call: trims trailing spaces and ensures final newline. Atomic: all files succeed or none change. Canonical field is files (array); singular file is accepted as an alias for one path. IMPORTANT: do NOT issue concurrent write calls targeting the same files; use execute_plan for multi-op atomicity. Example: {"files": ["src/main.rs", "src/lib.rs"]}
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Single file (LLM prior). Equivalent to `files: [file]` when `files` is empty. If both are set, `files` wins. Alias `path` matches other tools. | |
| files | No | File paths to normalize (relative to working directory). Canonical multi-file form. | |
| strict | No | Roll back all writes when format/validate lifecycle steps fail. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and meets it: it discloses atomic all-or-nothing behavior, the canonical/alias input behavior, and the concurrency hazard. These are non-obvious operational traits an agent must know before calling.
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 sections front-load the operation, state key semantics, give a parameter example, and warn about concurrency with no filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter write tool with no annotations and no output schema, the description plus fully documented schema covers behavior, parameter precedence, concurrency constraints, and example usage. Nothing critical to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents files/file/strict; the description adds a plain-language statement of the canonical field and gives a concrete usage example. That is marginal but real added value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening phrase 'Fix whitespace in multiple files' names a concrete verb and resource, and the body spells out exact transformations (trim trailing spaces, ensure final newline). This clearly distinguishes batch_tidy from single-file fix_whitespace and batch_replace.
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 states the multi-file batching intent and provides an important exclusion: do not issue concurrent writes targeting the same files, with execute_plan named as the alternative for multi-op atomicity. It does not explicitly contrast every sibling (e.g., fix_whitespace for single files), but the guidance is sufficient for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_fileA
Create a new file with specified content. Fails if the file exists unless force=true. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"content":"{"version": "1.0"}","path":"config.json"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| force | No | ||
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden. It clearly discloses the failure condition for existing files, the force=true escape hatch, and the concurrency hazard. That is strong behavioral transparency for a simple file-creation tool, though it does not detail permission requirements or error response formats.
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 compact and front-loaded with the core action. The failure condition, concurrency warning, and example all earn their place without unnecessary fluff. It uses only a few sentences to cover meaning, edge cases, and a concrete usage example.
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 3-parameter tool with no output schema, the description is nearly complete. It covers the essential operation, failure behavior, overwrite option, and a critical concurrency caveat. A return-value note or mention of parent-directory handling would round it out, but nothing essential is missing for correct invocation.
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. It does: the example demonstrates path and content together, and the force parameter is given explicit semantics via 'unless force=true.' The parameter meaning is mostly clear, though path/content formatting or path constraints are not deeply specified.
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 opens with a specific verb and resource: 'Create a new file with specified content.' It also distinguishes itself from siblings like append_file and prepend_file by stating 'Fails if the file exists unless force=true,' making it clear this is not an update or append operation.
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 gives explicit usage constraints: 'do NOT issue concurrent calls targeting the same file' and 'use execute_plan for multi-op atomicity.' This effectively tells the agent when not to use this tool directly and names an alternative. It does not explicitly route to append_file/prepend_file for existing files, but the overwrite behavior implies that boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_fileA
Delete a file. Default fails with not_found if the path is missing. Set if_exists=true to soft-skip a missing file (no write, success). Set if_exists=true to soft-skip when the file is missing. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"path":"tmp/scratch.txt"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path of the file to delete. | |
| if_exists | No | Soft-skip (no write) when the file is missing. Default false: missing path is `not_found`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the default not_found failure, the no-write success behavior when if_exists=true, and warns against concurrent calls. It could mention irreversibility or path scope, but the key failure modes and write semantics are clearly 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?
The description is front-loaded with 'Delete a file' and stays fairly compact, but it contains a redundant duplicate sentence: 'Set if_exists=true to soft-skip a missing file (no write, success).' followed by 'Set if_exists=true to soft-skip when the file is missing.' This wastes a sentence and slightly hurts structure.
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 two-parameter delete tool with no output schema, the description is reasonably complete. It covers default failure, soft-skip behavior, atomicity guidance, and includes an example call. Minor details like path normalization or response payload are not specified, but they are not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already well documented. The description mostly restates what the schema says about if_exists and adds a concrete example path, which is mildly useful but does not substantially expand the parameter semantics.
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 opens with a clear verb and resource: 'Delete a file.' It also gives the default failure behavior, so an agent knows what the core operation is. It does not explicitly differentiate from sibling tools like move_file or doc_delete, but the operation is unambiguous.
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 gives practical guidance: use if_exists=true for soft-skip behavior, and do not issue concurrent calls to the same file, pointing to execute_plan for multi-op atomicity. It does not explicitly discuss all sibling alternatives, but the most important routing and exclusion guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_appendA
Append a value to an array at a selector path. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"value":"new_item","path":"data.json","selector":"items"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the JSON, YAML, or TOML file. | |
| value | Yes | Value to append to the array. | |
| selector | Yes | Dot-notation selector path to an array. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of explaining behavior. It clearly states the mutation (append to an array) and warns about concurrency/atomicity, but it does not mention whether the file or selector must already exist, what happens on failure, or the return value. These gaps leave some behavioral uncertainty.
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 concise: two sentences plus an example. The critical concurrency warning is front-loaded, and the example is compact and informative without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the presence of a clear example, the description is adequate for an agent to invoke it correctly. It omits return-value details and edge-case behavior, but these are less critical for a basic append operation and are partially covered by the example and the atomicity warning.
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?
Each parameter has a description in the schema, and the example clarifies the role of path, selector, and value. However, the description adds little beyond the schema—it does not elaborate on the value type, selector syntax beyond 'dot-notation', or path constraints, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Append a value to an array at a selector path') and provides a concrete example mapping all parameters. It also distinguishes itself from file-level append tools by specifying the selector-path domain, which helps an agent choose between doc_append and append_file.
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 includes explicit usage guidance: do not issue concurrent calls to the same file and use execute_plan for multi-operation atomicity. It also provides an example that illustrates parameter usage, though it does not explicitly compare with alternative doc manipulation tools such as doc_update or doc_set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_deleteA
Delete a value at a selector path in a JSON, YAML, or TOML file. CLI --json and MCP/tx success include changed and removed (0 on missing key; exit 0 / ok is idempotent). IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"selector":"deprecated_key","path":"config.json"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the JSON, YAML, or TOML file. | |
| selector | Yes | Dot-notation selector path to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description claims full burden. It discloses idempotent behavior for missing keys, return fields (changed/removed), and exit-success semantics, which are valuable beyond the schema. It does not address permissions or file-creation side effects, but the core mutation behavior is transparent.
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 compact and front-loads the core purpose before the warning and example. The important concurrency warning is prominent, and the example is concise. Every sentence adds value, 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?
For a mutation tool with no output schema and no annotations, the description provides enough detail about return values, idempotency, and concurrency constraints. It does not describe exactly what 'changed' and 'removed' appear as, but the wording ('include changed and removed') and exit behavior cover the practical needs of calling the tool 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?
Both parameters are fully described in the schema (100% coverage), so the description is not responsible for compensating missing semantics. Its example clarifies selector/path composition but adds little meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Delete a value at a selector path'), the resource ('JSON, YAML, or TOML file'), and uses 'selector path' to distinguish from nearby doc_delete_where and doc_update/delete_file. The example reinforces the expected input shape.
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 gives clear negative guidance (do NOT issue concurrent calls to the same file) and routes multi-op atomicity to execute_plan. It does not explicitly compare against doc_delete_where for conditional deletions, but the selector-path framing makes the intended use reasonably apparent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_delete_whereA
Delete array elements matching a key=value predicate via --predicate (CLI) or the predicate field (plans). For scalar arrays use .=x, =x, or value=x. Different from doc.update, which filters inside the selector path. CLI --json and MCP/tx success include changed and removed (0 when no elements match; exit 0 / ok is idempotent). For object arrays: predicate='role=admin'. For simple arrays: predicate='=value'. Nested paths: predicate='settings.theme=dark'. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"predicate":"value=a","path":"config.toml","selector":"tags"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the JSON, YAML, or TOML file. | |
| selector | Yes | Dot-notation selector path to an array. | |
| predicate | Yes | Predicate in "field=value" format to match elements for deletion. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral burden and succeeds: it discloses idempotent behavior (0 changed/removed, exit 0/ok), mentions the CLI and plan predicate field variants, and warns about concurrent calls targeting the same file. This is far beyond a bare 'delete matching elements' statement.
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 dense but every sentence earns its place: core action, predicate variants, sibling distinction, return/exit semantics, concurrency warning, and an example. It is front-loaded with the most important behavior and uses compact examples rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and absence of an output schema, the description is remarkably complete. It covers semantics, predicate formats, success/result behavior, idempotence, concurrency constraints, and alternatives, leaving no major gap an agent would need to infer.
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?
Although schema description coverage is 100%, the description adds substantial meaning beyond the schema by explaining predicate syntaxes ('.=x', '_=x', 'value=x', 'field=value'), giving concrete examples for object arrays, simple arrays, and nested paths, and providing a full usage example mapping all three parameters. This materially helps an agent construct correct invocations.
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 opens with a specific verb-resource pair: 'Delete array elements matching a key=value predicate,' which precisely states what the tool does. It also names doc.update as a different tool and clarifies where that tool operates, helping distinguish it from a sibling.
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 explicitly contrasts this tool with doc.update ('Different from doc.update, which filters inside the selector path') and provides concrete usage guidance for object arrays, simple arrays, and nested paths. It also warns against concurrent calls and directs users to execute_plan for multi-op atomicity, giving clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_diffB
Compare two structured files (JSON, YAML, or TOML) and show differences. Example: {"file_a": "old.json", "file_b": "new.json"}
| Name | Required | Description | Default |
|---|---|---|---|
| file_a | Yes | First file path (relative to working directory). | |
| file_b | Yes | Second file path (relative to working directory). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden, but it only says 'show differences' without specifying the output format, whether the operation is read-only, or any side effects. The example shows input shape but not expected result. For a tool lacking an output schema, this is a significant gap.
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 a single front-loaded sentence stating the verb and resource, followed by a compact illustrative example. There is no filler or redundant 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?
For a simple two-parameter tool with fully documented schema, the description gives enough to identify inputs and basic operation. However, with no output schema, it leaves the return value unspecified, and the lack of sibling differentiation weakens completeness for tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented. The description adds value by using the example {'file_a': 'old.json', 'file_b': 'new.json'} to clarify parameter ordering semantics (first file vs second file), which the schema's 'First/Second file path' descriptions do not fully convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Compare two structured files') and defines the supported formats (JSON, YAML, TOML), making the tool's purpose unambiguous. It doesn't explicitly name sibling alternatives like ast_diff, but the file-format focus helps distinguish it.
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 provides an invocation example but no guidance on when to choose this tool over siblings such as ast_diff or doc_merge. No alternatives, exclusions, or selection criteria are mentioned, leaving the agent to infer appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_ensureA
Set a value only if the selector path does not already exist. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"value":30,"path":"config.json","selector":"timeout"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the JSON, YAML, or TOML file. | |
| value | Yes | Value to set only if the key does not already exist. | |
| selector | Yes | Dot-notation selector path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses conditionality and the concurrency caveat, which is valuable, but it does not state what happens when the selector already exists (no-op vs error), whether missing files are created, or any return/error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact components—primary behavior, critical caveat, and a concrete example—with no filler. The most important semantics are front-loaded before operational guidance.
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 3-parameter write tool with no annotations and no output schema, the description covers core behavior, concurrency constraints, and an alternative for atomicity. The main gap is explicit no-op/error semantics when the selector path already exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all three parameters (100% coverage), so the baseline is 3; the description's concrete example maps path, selector, and value into a valid invocation and adds a formatting model beyond the schema prose.
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 conditional write operation: 'Set a value only if the selector path does not already exist.' This clearly identifies the resource (a value at a dot-notation selector in a config file) and separates it from unconditional set/update siblings such as doc_set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit concurrency guidance ('do NOT issue concurrent calls targeting the same file') and points to execute_plan for atomic multi-operation workflows. It does not explicitly name doc_set/doc_update as alternatives for overwrite semantics, but the conditional wording conveys the main use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_getB
Read a value from a JSON, YAML, or TOML file by selector path. Example: {"path": "package.json", "selector": "version"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path (relative to working directory). | |
| selector | Yes | Dot-notation selector path for the value to read (e.g., "version", "db.pool"). Alias `key` accepted so agents that emit the LLM-prior field name still work. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It does a decent job by stating the operation is a read, enumerating supported formats, and providing an example. However, it does not explain what the returned value looks like, how errors are handled for missing files or selectors, or whether the `key` alias is accepted at the tool level.
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 one focused sentence plus an example, with no filler or redundant restatement of the schema. The core action and mechanism are front-loaded, making it easy to scan.
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 is simple and both parameters are fully documented in the schema, so the description does not need much. Still, with no output schema and no annotations, the description should at least mention the return representation and behavior on missing files or invalid selectors. These gaps keep it merely adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by specifying the supported file formats (JSON, YAML, TOML) and giving a concrete usage example that ties `path` and `selector` together, which helps an agent invoke the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation (Read), the resource (a JSON, YAML, or TOML file), and the method (selector path), with a concrete example. It does not explicitly differentiate from sibling tools like doc_query or read_file, but the read-by-selector semantics are specific enough for an agent to understand the tool's purpose.
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 gives no guidance on when to use this tool versus alternatives such as read_file or doc_query. There are no exclusion criteria, prerequisites, or context hints, so an agent must infer the appropriate use case solely from the phrase 'Read a value...'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_mergeA
Deep-merge a JSON object into a document root, or into a selector path (e.g. multi-doc YAML 0 / [0]). IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"value":{"database":{"host":"localhost","port":5432}},"path":"config.yaml"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the JSON, YAML, or TOML file. | |
| value | Yes | Object to deep-merge into the file (or selected object). | |
| selector | No | Optional selector for the merge target (e.g. `0` for multi-doc YAML). When omitted, merges into the document root. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does note an important concurrency hazard and the deep-merge semantics. It stops short of explaining whether the file must already exist, what happens on key conflicts, or what the return value/error behavior is.
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 compact and front-loaded: core operation, warning, then example. The IMPORTANT note earns its place, and the JSON example is useful rather than 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 description covers the essential operation and a critical concurrency constraint, but for a mutation tool with no output schema it should also mention expected return behavior, file existence assumptions, or conflict semantics. Still adequate for a moderately simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all parameters, but the description strengthens this by clarifying that value is a JSON object and adding selector examples for multi-doc YAML. The concrete merge example also gives the agent a working model beyond raw schema field names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: deep-merge a JSON object into a document root or a selector path. It distinguishes itself from basic doc_* mutations by emphasizing 'deep-merge', though it does not explicitly name sibling 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?
Provides an explicit operational warning about not issuing concurrent calls on the same file and recommends execute_plan for multi-op atomicity. However, it does not clarify when to choose doc_merge over doc_set, doc_update, or doc_append.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_moveA
Move a value from one selector path to another within the same file. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"to":"new_key","path":"config.json","from":"old_key"}
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Dot-notation destination path. | |
| from | Yes | Dot-notation source path. | |
| path | Yes | Path to the JSON, YAML, or TOML file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the behavioral burden. It usefully discloses the same-file constraint and the concurrency/atomicity caveat, which is important for a mutating tool. However, it does not say what happens when the destination path already exists or whether the move is destructive in 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 sentences with no filler: purpose first, then the critical concurrency warning, then a concrete example. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter tool, the definition covers the operation, file scope, and atomicity caveat. Missing overwrite/failure semantics are a notable gap for a mutation without annotations, but the definition is still sufficient for basic correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents path, from, and to as dot-notation paths. The example adds a concrete mapping but does not significantly expand parameter meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Move a value from one selector path to another within the same file.' This clearly differentiates doc_move from sibling write tools like doc_set/doc_update and from file-level move_file.
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 warns against concurrent calls targeting the same file and points to execute_plan for multi-op atomicity. This gives clear when-not-to-use guidance and names the relevant alternative, though it does not broadly enumerate comparisons with other doc_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_prependA
Prepend a value to the beginning of an array at a selector path. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the JSON, YAML, or TOML file. | |
| value | Yes | Value to prepend to the array. | |
| selector | Yes | Dot-notation selector path to an array. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does disclose one important non-obvious trait: same-file concurrent calls are unsafe, and atomic multi-op execution requires execute_plan. However, it does not describe what happens on missing files, missing arrays, non-array selectors, or whether the mutation is in-place or returns a result.
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 two sentences with no filler: the first states the core operation, and the second delivers a critical concurrency/atomicity warning. Information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter tool with fully described parameters, the description is nearly complete: it defines the behavior and adds the key caveat about concurrency and atomicity. Minor gaps remain—no value type constraints, no statement about array creation or existence requirements, and no return-value note—but these are not blocking for a tool this simple.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents path, selector, and value. The description adds no additional parameter semantics; it essentially restates the schema's own descriptions. Baseline 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and target: 'Prepend a value to the beginning of an array at a selector path.' This clearly states the operation, the resource (array at a selector path), and the position (beginning). The word 'beginning' also implicitly distinguishes it from sibling doc_append, which would target the end.
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 includes one explicit usage guideline: do NOT issue concurrent calls targeting the same file, and use execute_plan for multi-op atomicity. This is helpful for the concurrency case, but it does not explain when to prefer doc_prepend over sibling doc_* tools such as doc_append or doc_set. Most selection guidance remains implied by the operation name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_queryA
Query a JSON, YAML, or TOML file. Actions: "has" (exists, true/false), "keys" (keys of one object; omit selector for .; e.g. database or items[0]), "len" (length of one object or array; omit selector for .; e.g. items or database), "select" (filter via selector predicates, e.g. users[role=admin]; no separate predicate field), "flatten" (leaf paths). keys need one object; len needs one object or array; items[*] is fail-closed ambiguous (use items[0] / items[1]). Example: {"action": "has", "path": "config.json", "selector": "database.host"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | File path (relative to working directory). | |
| action | Yes | Query action: "has" (check existence), "keys" (list keys), "len" (count), "select" (filter array), or "flatten" (list all paths). | |
| selector | No | Selector path. Required for has/select. Optional for keys/len (defaults to `.`). Ignored for flatten. keys need one object (`database`, `items[0]`); len needs one object or array (`database`, `items`); multi-match (`items[*]`) is fail-closed `ambiguous` (use `items[0]` / `items[1]`). Alias `key` accepted because agents often emit that name (LLM prior). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so thoroughly: it states per-action return semantics ('has' true/false, 'keys' list, 'len' count, 'select' filter, 'flatten' leaf paths), the fail-closed 'ambiguous' behavior for multi-match selectors, and the accepted 'key' alias. This is strong disclosure for a read-only query 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?
The description is dense but every clause carries actionable detail: actions, selector constraints, fail-closed behavior, an alias note, and a complete invocation example. It is front-loaded with the core verb and resource and organized by action, 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?
For a tool with no output schema, the description defines the return nature of each action, the shape of valid selectors, the required/optional parameter behavior, and gives a complete example. An agent has enough information to correctly invoke every action; the only minor gap is the exact full predicate grammar for 'select', which is not blocking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful usage examples ('database', 'items[0]', 'users[role=admin]') and clarifies that 'select' has no separate predicate field. It reinforces selector defaults and requiredness already in the schema without introducing new parameters.
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 opens with a specific verb and resource: 'Query a JSON, YAML, or TOML file,' and then enumerates five concrete query actions with examples, making the tool's scope clear. It does not explicitly compare itself to sibling doc_* tools (e.g., doc_get), so differentiation is functional rather than explicitly named.
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 action list and per-action selector constraints tell an agent when to use the tool and how to shape each call, including fail-closed ambiguous-selector behavior and a concrete example. It gives clear context but does not state when to prefer an alternative sibling tool or include explicit exclusion cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_setA
Set a value at a single concrete selector path in a JSON, YAML, or TOML file (keys and indexes such as server.port or items.0.v). Parser-backed; output is always valid. Not for predicates or wildcards (items[name=foo].v, items[].v); use doc.update for multi-match writes. Default creates a missing key and fails with not_found if the file is missing. Set if_exists=true to soft-skip when the file is missing or the selector is not present (does not create the key). Single concrete path only (keys/indexes). For selector predicates or wildcards (items[name=foo].v, items[].v) use doc_update / plan doc.update. Set if_exists=true to soft-skip a missing file or missing selector (does not create the key). IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"value":"2.0.0","path":"package.json","selector":"version"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the JSON, YAML, or TOML file. | |
| value | Yes | Value to set (any JSON type). | |
| strict | No | Enable strict mode (default true). When true, roll back all file writes if format or validate lifecycle steps fail. | |
| selector | Yes | Dot-notation selector path (e.g. "server.port", "env.0.value"). `.` (or empty / `/`) is the document root and replaces the whole value. Alias `key` accepted because agents often emit that name (LLM prior). | |
| if_exists | No | Soft-skip (no write) when the file is missing or the selector is not present. Default false: missing file is `not_found`; a missing selector creates the key. |
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 substantial work: it discloses the parser-backed validity guarantee, the default create-missing-key behavior, the not_found failure mode, the if_exists soft-skip semantics, and an explicit concurrency prohibition ('do NOT issue concurrent calls targeting the same file'). It stops short of describing exact success-return behavior or overwrite semantics, which keeps it a step below exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core sentence is strong and the example is useful, but the description is visibly redundant: the 'not for predicates or wildcards / use doc.update' guidance appears twice, and the 'Set if_exists=true to soft-skip' sentence appears twice nearly verbatim. Roughly 40 of ~130 words are duplicated, which wastes tokens and dilutes the signal despite the otherwise sensible front-loaded structure.
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 5-parameter mutation tool with no output schema and no annotations, the description covers the key decision points: supported file types, selector scope, failure modes, soft-skip behavior, concurrency constraints, and the sibling/plan alternative for atomicity. The only notable gap is that success return values are not described, which is minor for a setter; the duplicated sentences are the main blemish.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds genuine value beyond the schema by delineating what selectors are NOT valid (predicates, wildcards), clarifying that only concrete key/index paths are accepted, and providing a full worked example tying value/path/selector together. This pushes it above baseline, though it doesn't add much per-parameter detail beyond the boundary constraint.
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 first sentence states a specific verb ('Set'), a specific resource ('value at a single concrete selector path in a JSON, YAML, or TOML file'), and the supported selector forms (keys and indexes such as server.port or items.0.v). It explicitly distinguishes itself from doc_update/doc.update by stating 'single concrete path only' and naming the sibling for multi-match writes, so an agent can tell them apart without opening schemas.
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 gives explicit routing: predicates/wildcards should use 'doc.update for multi-match writes' (repeated with the doc_update sibling name), and multi-op atomicity should use execute_plan. It also states the default behavior (creates missing key, fails with not_found on missing file) and the if_exists=true soft-skip alternative, leaving no ambiguity about when to invoke this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doc_updateA
Set a new value at every location matching a selector. Use wildcards (items[].enabled) or selector predicates (items[name=foo].v). Not a separate --where flag; the filter is part of the selector string. Multi-match writes: use selector predicates or wildcards (items[name=foo].v, items[].enabled). Prefer this over doc_set when filtering by field. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"value":7,"path":"config.toml","selector":"items[name=a].v"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the JSON, YAML, or TOML file. | |
| value | Yes | New value for all matching locations. | |
| selector | Yes | Dot-notation selector path (supports wildcards and predicates). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure burden. It explains multi-match write semantics, selector predicate/wildcard behavior, and the concurrency limitation. It does not describe return values or no-match/error behavior, but the critical operational traits are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and selector syntax, followed by usage guidance and a concrete example. It is slightly redundant in repeating wildcard/predicate examples, but every sentence contributes useful information and the structure is logical.
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 description covers the essential operational context: selector syntax, multi-match behavior, example invocation, sibling differentiation, and concurrency safety. It lacks explicit return-value or failure-mode details, which would improve completeness given there is no output schema, but the information needed to call the tool correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds valuable semantics beyond the schema by explaining selector syntax (wildcards, predicates) and providing a concrete example mapping value, path, and selector. This meaningfully helps an agent construct valid parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Set a new value at every location matching a selector') on a specific resource (document files via selector paths). It also distinguishes itself from doc_set by saying to prefer this tool when filtering by field, which helps an agent pick the right sibling.
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 explicitly says to prefer this over doc_set when filtering by field, and warns against concurrent calls on the same file, directing to execute_plan for atomicity. It also clarifies that filtering is part of the selector string rather than a separate flag, leaving little ambiguity about when and how to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_planA
Execute an arbitrary multi-step transaction plan atomically (MCP equivalent of patchloom tx). Provide either an inline 'plan' object or a 'plan_path' to a plan file. Supports mixed operations (doc., md., replace, file create/delete/rename, tidy, patch, etc). Plan field for the op list is operations (alias ops accepted). Optional plan.cwd must be a relative path under the server workspace (re-roots relative op paths); absolute plan.cwd strings and ../ escapes are rejected. Op path fields may use absolute paths that resolve inside the workspace (AllowIfContained). Do not set both plan.cwd and for_each. plan.format/validate lifecycle shell steps are ignored on MCP (use project config). Strongly recommended for multi-file or multi-op work. See agent-rules --mode mcp or PATCHLOOM.md for plan schema examples. Nested example: {"plan": {"version": 1, "cwd": "fixtures/svc", "operations": [{"op": "doc.set", "path": "configs/app.yaml", "selector": "name", "value": "x"}]}}
| Name | Required | Description | Default |
|---|---|---|---|
| plan | No | Full inline plan object (preferred for agents; same schema as CLI tx plans). Must contain at minimum `version` and `operations` (alias `ops` also accepted). | |
| strict | No | Optional override of the plan's `strict` field. Applied only when present so `{"plan":{"strict":false}}` is not overwritten. MCP still strips plan.format/validate (lifecycle shells are not run from submitted plans). | |
| plan_path | No | Path (relative to cwd) to a plan file (JSON, YAML, or TOML). Used only if `plan` is not provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and delivers: atomic execution, path-safety rules (absolute plan.cwd and ../ escapes rejected, op paths must resolve inside the workspace), the cwd/for_each conflict, and the MCP-specific stripping of format/validate steps. It stops short of describing the return format, which matters since no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence in this dense paragraph earns its place — purpose, input modes, op breadth, aliases, path safety, exclusions, lifecycle caveat, and recommendation. The final nested example is high-value. It loses one point for being a single wall of text without paragraph or bullet structure, which makes the many constraints harder to scan.
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 tool of this complexity (3 params, a huge nested Plan schema, no output schema, no annotations), the description covers the decision-critical and safety-critical facts: how to supply the plan, path containment rules, MCP-specific behavior, and where to find full schema examples. The main gap is the absence of any indication of what the tool returns on success or failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description adds real value on top by documenting the `ops` alias for `operations`, flagging the cwd/for_each mutual exclusion, and giving a complete nested example that shows exactly how an inline plan is shaped. The schema's cwd description is also exceptionally detailed, so the agent is well equipped.
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 — 'Execute an arbitrary multi-step transaction plan atomically' — and anchors it to a known CLI equivalent ('MCP equivalent of patchloom tx'). The phrase 'Strongly recommended for multi-file or multi-op work' clearly differentiates it from the many single-op sibling tools in the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear when-to-use guidance ('Strongly recommended for multi-file or multi-op work') and practical constraints ('Do not set both plan.cwd and for_each', 'plan.format/validate lifecycle shell steps are ignored on MCP (use project config)'). It does not explicitly name a single-op sibling as the alternative for one-off edits, but that is strongly implied by the multi-op framing and the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fix_whitespaceA
Normalize whitespace in a file. When op fields are omitted, defaults match CLI tidy fix (trim trailing whitespace + ensure final newline; normalize_eol stays keep). Precedence: defaults → plan write_policy → op fields. Plan write_policy is not re-applied at commit for paths last written by tidy.fix so op fields stick (#1840, #1847). Defaults: trim trailing whitespace and ensure final newline when those fields are omitted. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"trim_trailing_whitespace":true,"path":"src/main.rs","ensure_final_newline":true}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| lines | No | Line range restriction for dedent/indent: "10:50" (1-based inclusive). | |
| dedent | No | Dedent specification: "4", "tab", or "auto". | |
| indent | No | Indent specification: "4", "tab". | |
| normalize_eol | No | ||
| collapse_blanks | No | Collapse consecutive blank lines into a single blank line. | |
| ensure_final_newline | No | ||
| trim_trailing_whitespace | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses defaults, precedence order, write_policy behavior at commit, and the concurrency warning. It does not mention whether the file must already exist or what the return/error behavior is, leaving some behavioral 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?
The description is front-loaded with the core purpose and contains a helpful example. However, it repeats the defaults information: 'defaults match CLI tidy fix (trim trailing whitespace + ensure final newline; normalize_eol stays keep)' is followed by 'Defaults: trim trailing whitespace and ensure final newline...'. This redundancy makes it longer than necessary.
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?
There is no annotations object, no output schema, and eight parameters to account for. The description covers the common defaults and concurrency safety well, but it omits the role of dedent/indent/lines entirely and does not describe return values or failure behavior, leaving notable gaps for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, so the description needs to compensate. It adds meaningful detail for trim_trailing_whitespace, ensure_final_newline, and normalize_eol defaults, but it does not explain dedent, indent, lines, or collapse_blanks beyond what the schema already provides. Partial compensation, not complete.
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 opens with a specific verb and resource: 'Normalize whitespace in a file.' It adds concrete default behavior and an example, making the tool's main function clear. It does not explicitly differentiate it from related siblings like batch_tidy, so it stops short of full sibling-level clarity.
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 provides clear context: defaults apply when op fields are omitted, and it explicitly warns against concurrent calls on the same file, directing the agent to execute_plan for multi-op atomicity. It lacks broader guidance on when to prefer this tool over batch_tidy or other editing tools, so it does not fully cover exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_statusA
Show uncommitted file changes vs git HEAD. Returns lists of modified, created, and deleted files. Omits .patchloom/ backup paths from --apply undo sessions. No parameters required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses the comparison reference (git HEAD), the output structure (lists of modified, created, deleted files), and a non-obvious filtering behavior (omitting .patchloom/ backup paths). This is strong behavioral context beyond the empty schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, information-dense sentences. The primary purpose is front-loaded, followed by output details and a special-case omission. Every sentence earns its place with no repetition or 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?
This is a simple, zero-parameter tool with no output schema and no annotations. The description sufficiently explains what it does, what it returns, and the one notable filtering behavior. An agent has enough information to call it correctly and interpret its results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema already reflects that with an empty object and no properties. The description reinforces this with 'No parameters required,' which is helpful and accurate. Since there are no parameters to document, a baseline of 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Show'), a clear resource ('uncommitted file changes vs git HEAD'), and the exact scope of the operation. It also names the output categories (modified, created, deleted), making it unmistakable and distinct from the sibling file and AST 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 makes it clear this tool is for inspecting uncommitted changes and explicitly says no parameters are required, which tells an agent exactly how to invoke it. It does not explicitly contrast it with alternatives, but no sibling tool provides comparable git-status functionality, so the usage context is still clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filesA
List files under the workspace (or given roots) with the same ignore/exclude/glob rules as search. Use this instead of a generic filesystem MCP list_dir/tree. Caps results (default max_results=500) and reports truncated+total_matched when capped. max_depth prunes the walk at each root (does not enter deeper dirs). max_results still counts all in-depth matches then truncates (total_matched remains honest). Prefer relative paths. Example: {"path": "src/", "exclude_patterns": ["target/**"], "max_results": 100, "max_depth": 3}
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Single walk root (LLM prior). Equivalent to `paths: [path]` when `paths` is empty. If both are set, `paths` wins. | |
| globs | No | Glob include patterns (same role as search `globs` / CLI `--glob`). | |
| paths | No | Walk roots relative to working directory (defaults to workspace root). Prefer this for multi-root lists. | |
| max_depth | No | Max path depth under each root (1 = only files directly under the root). Applied during the walk: deeper directories are not entered (#2078). Omit for unlimited depth (still subject to max_results). | |
| max_results | No | Max paths to return. Default 500 when omitted or 0 (agent context budget). | |
| include_hidden | No | Include hidden files (still never walks `.git` / `.patchloom`). | |
| exclude_patterns | No | Exclude glob patterns (in addition to ignore files). | |
| custom_ignore_filenames | No | Custom ignore filenames (e.g. `.agentignore`). |
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 an excellent job: it discloses result capping, default max_results=500, truncated/total_matched reporting when capped, max_depth pruning behavior, honest max_results counting, and hidden-file handling. This goes well beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose is front-loaded, key behavioral caveats are explained compactly, and the example anchors parameter usage. No filler or redundancy.
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 an 8-parameter tool with no annotations and no output schema, the description is remarkably complete. It covers filtering, capping, depth semantics, truncation honesty, hidden files, path preference, and invocation parameters, leaving no critical ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter. The description adds extra value by clarifying that omitted/0 max_results means 500, explaining what total_matched reports, and giving a concrete example mapping path, exclude_patterns, max_results, and max_depth.
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 action and resource: 'List files under the workspace (or given roots)'. It also distinguishes itself from generic filesystem list_dir/tree tools and aligns with search's ignore/exclude/glob rules, so an agent can tell this apart from siblings like search_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this instead of a generic filesystem MCP list_dir/tree', giving a clear when-to-use signal. It does not explicitly contrast against search_files for content-vs-name searches, but the context is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
md_dedupe_headingsA
Remove later whole sections whose heading text+level already appeared (heading and body until next same-or-higher heading; unique second-section content is discarded). Removes later whole sections with the same heading level+text (body under the second heading is discarded, not merged). IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral burden. It explicitly discloses destructive behavior: 'unique second-section content is discarded' and 'body under the second heading is discarded, not merged.' It also warns against concurrent calls, which is valuable operational transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and contains important warnings, but the first two sentences are largely redundant: both explain that later duplicate sections are removed and their content discarded. The 'not merged' clarification is useful but could have been folded into one sentence.
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-parameter mutation tool with no annotations or output schema, the description is fairly complete: it defines scope, discloses destructive behavior, and includes a concurrency warning. It could still add explicit file-type constraints or expected return behavior, but the essentials for safe invocation are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no description for the single path parameter, and the description does not describe the expected path format or constraints. The phrase 'same file' implies path identifies a target file, but that is minimal compensation for 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation (removing later duplicate sections) and a specific resource (sections identified by heading text+level). It clearly distinguishes itself from merge-like alternatives by emphasizing that later content is discarded, not merged.
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 intended use is implied through the deduplication semantics, and the description gives an operational warning about concurrency and points to execute_plan for multi-op atomicity. However, it does not explicitly state when to choose this tool over sibling tools like md_replace_section or md_move_section.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
md_insert_after_headingB
Insert content immediately after a markdown heading line (before any existing body). For a sibling section after the full body, use md.insert_after_section. Inserts immediately under the heading line (before existing body). For a sibling ## section after the full body, use md_insert_after_section. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| content | Yes | ||
| heading | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full transparency burden. It does disclose the core insertion behavior—content goes immediately under the heading, before existing body content—and flags a concurrency hazard. However, it does not say what happens if the heading is missing, whether content is inserted as raw markdown, or which characteristics of the target file might affect behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description repeats itself: 'Insert content immediately after a markdown heading line (before any existing body)' is functionally restated as 'Inserts immediately under the heading line (before existing body).' The sibling alternative also appears twice, once with a dot separator ('md.insert_after_section') and once with underscores ('md_insert_after_section'), which adds no value and creates confusion. The useful concurrency note is buried amid redundancy.
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 three required parameters, no annotations, and no output schema, so the description is the only documentation. It clarifies the insertion position and gives one concurrency warning, but it omits parameter conventions, heading-match behavior, failure modes, and any semantics around the inserted content. An agent is likely to guess at critical details when calling it.
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 three undocumented parameters. It only hints at the purpose of the file by referring to markdown headings; it never explains what 'path' should be, how 'heading' should be formatted (e.g., with or without '#'), or how 'content' is used beyond being inserted. This is a significant 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 uses a precise verb-resource pair: 'Insert content immediately after a markdown heading line' and explicitly contrasts it with md_insert_after_section, which places a sibling section after the full body. An agent can distinguish this tool from its closest sibling without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent when to use the sibling tool ('after the full body') and gives an explicit concurrency rule: do not issue concurrent calls; use execute_plan for atomicity. It does not exhaustively list all alternatives, but the key decision point versus its direct sibling is clearly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
md_insert_after_sectionA
Insert content after the full section body (sibling placement). Use when adding a new ## section after this section's content. Prefer md.insert_after_heading for content under the heading line. Inserts after the full section body (sibling placement). Prefer md_insert_after_heading for content under the heading. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"content":"## FAQ\n\nCommon questions.\n","path":"README.md","heading":"## Config"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| content | Yes | ||
| heading | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose the sibling-placement behavior and the concurrency warning, which is useful. However, it does not explain what happens if the heading is not found, whether insertion is idempotent, or what the return/error behavior is, so transparency is only partial.
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 repeats itself: 'Insert content after the full section body (sibling placement)' appears twice, and the preference for md_insert_after_heading is stated twice with inconsistent naming ('md.insert_after_heading' vs 'md_insert_after_heading'). This redundancy wastes tokens and reduces clarity.
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 is fairly simple with three required string parameters, and the description includes an example, a usage rule, and a concurrency warning. Still, it omits key context such as what happens when the target heading does not exist, whether the heading must match exactly, and what the tool returns or reports on success or failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema itself provides no parameter descriptions (0% coverage), so the description must compensate. It offers a complete example mapping content, path, and heading, which clarifies their shapes. However, it does not specify the exact expected format of the heading parameter beyond the example showing '## Config', and it does not describe each parameter explicitly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: insert content after the full section body, with sibling placement. It also differentiates itself from md_insert_after_heading by specifying that the sibling tool is for content directly under the heading line. This distinguishes it well from closely related sibling 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?
It explicitly says when to use this tool ('Use when adding a new ## section after this section's content') and when to prefer the alternative ('Prefer md_insert_after_heading for content under the heading line'). It also warns against concurrent calls and directs the agent to execute_plan for multi-op atomicity, providing clear operational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
md_insert_before_headingA
Insert content immediately before a markdown heading line. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| content | Yes | ||
| heading | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does disclose an important behavioral constraint: do not run concurrent calls on the same file. It does not explain edge-case behavior such as exact heading matching, multiple matching headings, or what happens when the heading is not found.
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 two concise sentences with no filler. It front-loads the core operation and places the critical concurrency warning in a clearly marked second sentence.
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 three-parameter mutation tool, the core usage is clear and the concurrency warning is valuable. However, without annotations, output schema, or parameter descriptions, the description leaves matching semantics and failure behavior to inference, making it incomplete for edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no parameter descriptions, but the description implies that 'content' is the text to insert and 'heading' is the target heading line. 'path' is not explicitly explained in the description, though it is inferable from context; heading format details are also unspecified.
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 action ('Insert content immediately before a markdown heading line') with a clear resource and positional qualifier. This unambiguously differentiates it from similar siblings like md_insert_after_heading.
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 provides useful operational guidance by warning against concurrent calls and recommending execute_plan for multi-op atomicity. However, it does not explicitly state when to choose this tool over alternatives such as md_insert_after_heading or md_upsert_bullet.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
md_lintA
Lint a markdown rules file for duplicate headings, dangerous git commands, and missing final newline. Returns object envelope {ok, path, issue_count, issues} (CLI lint-agents --json parity; not a bare array). isError stays false when issues are present; branch on ok / issue_count. Example: {"path": "AGENTS.md"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Markdown file path, relative to working directory (typically AGENTS.md). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavior, and it does a good job: it specifies the return envelope, warns that the result is not a bare array, and explains isError/ok branching. It also gives CLI parity context. It stops short of stating whether the file is left unmodified, but 'lint' strongly implies a read-only check.
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 compact and every sentence earns its place; the example and envelope details are not padding. Slightly dense but efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool, the description covers invocation, return shape, and error semantics. Missing only details about the shape of individual `issues` items, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%; the schema already documents `path` as a file path relative to the working directory. The description only reinforces with an example path, adding no new constraints. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('lint'), a resource ('markdown rules file'), and three concrete checks, which distinguishes it from editing/deduping siblings like md_dedupe_headings. It is immediately obvious what the tool does and where it fits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly targets linting a markdown rules file (typically AGENTS.md), but it doesn't explicitly say when to choose this over md_dedupe_headings or other md_* tools, nor does it state exclusions. Usage context is clear, but sibling differentiation 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.
md_move_sectionA
Move a markdown heading section to a new position (same file reorder or cross-file). Exactly one of before or after is required. Omit to for same-file reorder. IMPORTANT: do NOT issue concurrent writes against the same file(s); use execute_plan for multi-op atomicity. Example: {"path": "spec.md", "heading": "## Appendix", "to": "notes.md", "before": "## References"}
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Destination file path (relative to working directory). Omit for same-file reorder. | |
| path | Yes | Source file path containing the section to move (relative to working directory). | |
| after | No | Insert after this heading at the destination. | |
| before | No | Insert before this heading at the destination. | |
| heading | Yes | Heading of the section to move (e.g., "## FAQ"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. It makes the mutating nature clear through 'Move' and adds a valuable concurrency warning about concurrent writes and execute_plan. However, it does not explicitly describe what happens to the source section, error behavior, or whether the move is destructive if a target heading is missing.
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 compact and front-loaded: core action first, then parameter rules, then a high-value concurrency warning, then a concrete example. Every sentence contributes, and the example earns its place by disambiguating the cross-file move case.
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 mutating tool with five parameters, no output schema, and no annotations, the description covers the main operation, the before/after requirement, same-file vs cross-file behavior, and a usage example. Remaining gaps include exact heading matching semantics and error behavior, but an agent has enough to invoke the tool correctly in the common cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful cross-parameter semantics by stating that exactly one of before or after is required and that omitting to means same-file reorder. The JSON example also clarifies how path, heading, to, and before combine in a realistic call.
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 opens with a specific verb and resource: 'Move a markdown heading section to a new position.' It also distinguishes the two modes, same-file reorder and cross-file, and provides an example that clarifies the operation. This is clearly differentiated from insert/replace/copy-style sibling 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 gives concrete invocation rules: exactly one of before or after is required, and omit to for same-file reorder. It also warns against concurrent writes and recommends execute_plan for multi-op atomicity. It does not explicitly list sibling alternatives or state when not to use this tool, so it falls just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
md_replace_sectionA
Replace the body of a markdown section identified by heading (section ends at the next same-or-higher-level heading; nested lower-level headings are included). Section ends at the next same-or-higher-level heading; nested lower-level headings are included in the replaced range. Prefer peer-level headings when siblings must survive. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"content":"Run npm install.\n","path":"README.md","heading":"## Installation"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| content | Yes | ||
| heading | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It transparently defines the replacement range, including nested headings, and warns about concurrency hazards. It does not mention error cases like a missing heading or return values, but the core destructive behavior is clearly disclosed.
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 mostly concise and front-loads the core purpose, but it repeats the section-boundary rule almost verbatim: 'section ends at the next same-or-higher-level heading; nested lower-level headings are included' appears twice. This redundancy wastes space, though the example and warnings are valuable.
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 three-parameter tool with no output schema, the description covers the key operational details: replacement scope, concurrency constraint, atomicity guidance, and an example invocation. It could mention behavior when a heading is missing or duplicated, but the provided context is sufficient for most agent invocation scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides zero property descriptions, so the description must compensate. It explains that heading identifies the section to replace and includes a concrete JSON example mapping content, path, and heading. This makes the parameter roles much clearer than the bare schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Replace the body of a markdown section identified by heading.' It also defines the exact replacement range by explaining same-or-higher-level heading boundaries and inclusion of nested lower-level headings. This clearly distinguishes it from sibling tools like md_insert_after_section or md_move_section.
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 gives actionable guidance: 'Prefer peer-level headings when siblings must survive' and explicitly warns against concurrent calls, directing users to execute_plan for multi-op atomicity. It does not name all alternative markdown tools, but it provides enough context for when and how to use this tool safely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
md_table_appendA
Append a row to a markdown table under a heading. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"row":"| GET | /health | Health check |","path":"README.md","heading":"## API"}
| Name | Required | Description | Default |
|---|---|---|---|
| row | Yes | ||
| path | Yes | ||
| heading | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It discloses the critical concurrency limitation and provides a concrete example. It does not mention what happens if the heading is missing, whether the table is created if absent, or how row formatting is validated, leaving some behavioral 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?
The description is compact: a one-sentence purpose, a critical warning, and a helpful example. Every sentence earns its place, and the most important constraint is highlighted with 'IMPORTANT.'
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 description is adequate for a simple three-parameter tool: it states the action, warns about concurrency, and gives a complete example. However, with no annotations and no output schema, it leaves uncertainty about failure modes, missing headings, and return values, so it is not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must compensate. The example clearly maps all three parameters: row as a full markdown table row, path as the file path, and heading as the markdown heading. This adds practical meaning beyond the bare schema, though it stops short of explaining edge-case formatting rules.
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: 'Append a row to a markdown table under a heading.' This clearly identifies the operation. It does not explicitly distinguish itself from sibling tools like md_insert_after_heading or doc_append, so it misses 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?
The description gives a clear usage context: appending a row to a markdown table. It also provides an explicit concurrency warning and recommends execute_plan for multi-op atomicity. However, it does not explain when to choose this tool over related siblings such as md_insert_after_heading or md_upsert_bullet.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
md_upsert_bulletA
Insert or update a bullet point under a markdown heading. Idempotent: skipped if the bullet is already present. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"bullet":"- Added new feature","path":"CHANGELOG.md","heading":"## Changes"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| bullet | Yes | Bullet text. Alias `content` matches CLI `--content` / other md ops. | |
| heading | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full disclosure burden and does it well: it reveals idempotency ('skipped if the bullet is already present') and a concurrency hazard at the file level. A notable gap is whether a missing heading is auto-created or causes an error, which is material behavior for a heading-targeted mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences plus a compact example, zero filler. Purpose is front-loaded, then idempotency, then the concurrency warning and alternative, then a self-contained usage example. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no annotations and no output schema, the description covers purpose, idempotency, concurrency constraints, the alternative tool, and a fully populated example. The main omissions are return value behavior and missing-heading semantics, which would complete the picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (path and heading lack descriptions), but the example compensates by demonstrating all three parameters with concrete formatting conventions: bullet includes '- ' prefix, heading includes '## ' prefix, and path is a file path. It could be stronger with explicit per-parameter prose, but the example teaches the required shapes.
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+resource: 'Insert or update a bullet point under a markdown heading.' The upsert semantics and bullet-specific targeting clearly separate it from the md_insert_* siblings (which handle sections/content), and the idempotency note adds precision beyond the 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?
Provides an explicit alternative ('use execute_plan for multi-op atomicity') and a hard constraint ('do NOT issue concurrent calls targeting the same file'). It implies when to use it (idempotent single-bullet operations) but doesn't explicitly contrast with the md_insert_* / md_replace_section siblings, leaving some routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_fileA
Rename (move) a file. Use force=true to overwrite an existing destination. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"to":"new.txt","from":"old.txt"}
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| from | Yes | ||
| force | No | If true, overwrite the destination if it already exists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it delivers: it discloses overwrite semantics (force=true), flags a concurrency hazard ('do NOT issue concurrent calls targeting the same file'), and implies non-atomicity by recommending execute_plan. It does not state what happens when force=false and the destination exists, or the error behavior for a missing source, but the most critical behaviors are 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?
Three tightly packed sentences plus one illustrative example, with zero filler. The purpose is front-loaded, the critical force and concurrency warnings are immediately visible, and the example demonstrates the parameter format. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple file operation with no output schema, the description covers the key agent-relevant context: purpose, overwrite behavior, concurrency constraint, and atomicity routing. It is missing explicit failure semantics (e.g., behavior when source does not exist or destination exists without force=true), but the coverage is strong for the tool's complexity level.
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 only 33% (force), leaving from/to undocumented. The description compensates with the example {"to":"new.txt","from":"old.txt"}, which clarifies parameter direction (from=source, to=destination), and it adds meaning to force with 'overwrite an existing destination.' It does not explicitly say these are file paths, but the example strongly implies it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Rename (move) a file,' which clearly identifies the operation. It distinguishes reasonably from siblings like ast_rename and doc_move by framing this as a file-level operation, though it never explicitly says 'filesystem,' relying on the example filenames to make that implicit.
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 gives explicit operational guidance: use force=true to overwrite, avoid concurrent calls on the same file, and 'use execute_plan for multi-op atomicity' — directly routing to a sibling alternative for a specific condition. It does not enumerate when to prefer ast_move or doc_move, but the file-scoped purpose makes that boundary reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepend_fileA
Prepend content to an existing file. Inserts the file's line ending after the new text when that text does not already end with one. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"content":"// Copyright 2026\n","path":"src/main.rs"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and reveals a non-obvious line-ending behavior and a concurrency hazard. It does not describe error behavior when the file is missing or what the return value looks like, but the disclosed behaviors are significant.
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 purposeful sentences plus a concrete example. The main purpose is front-loaded, with the nuance and warning following in order of importance and no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter file mutation with no output schema, the description provides the key usage details and an example. It leaves minor gaps around edge cases such as missing files or empty files, but an agent has enough to call it correctly in the normal case.
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 descriptions are absent (0% coverage), but the tool description names the operation and includes an example mapping content and path. The line-ending detail adds semantic meaning to content. Path semantics remain implicit, but the parameter names are intuitive.
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 operation: 'Prepend content to an existing file.' The word 'prepend' and the requirement that the file already exist clearly differentiate it from append_file and create_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit concurrency guidance ('do NOT issue concurrent calls targeting the same file') and points to execute_plan for multi-op atomicity. It does not explicitly contrast with append_file or describe when to prefer one over the other, but the constraints are actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_fileB
Read file contents with optional line range. Optional lines range uses start:end (1-based).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| lines | No | Optional line range (e.g., "10:25"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the burden of disclosing behavioral traits. It does not mention that the operation is read-only, does not describe error behavior (e.g., file not found), and leaves the line range semantics incomplete (inclusive/exclusive bounds).
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 extremely concise—two short sentences. No filler or redundant wording; every word serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool, the description covers the basic action but omits essential context: what the return value looks like (full file vs. lines), what happens if the file does not exist, and any permission considerations. This leaves the agent with significant unknowns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds the '1-based' detail for the lines parameter, which goes beyond the schema's example. However, the path parameter is completely undescribed, and the schema already covers the line range example, so the added value is limited.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's verb and resource: 'Read file contents'. It also mentions the optional line range, which distinguishes it from simple read operations. The purpose is unambiguous and distinguishes it from search/list 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?
No guidance is provided on when to use this tool versus alternatives like search_files or list_files. There is no mention of conditions under which reading a file is preferred over searching or listing, nor any indication of when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
replace_textA
Replace text in a file. Literal by default; set regex=true for regex. Options: nth, insert_before, insert_after, case_insensitive, multiline, if_exists, whole_line, range, word_boundary, fuzzy, min_fuzzy_score, allow_absent_old. Set word_boundary=true to match only whole words (prevents 'SetupFile' matching inside 'BenchSetupFile'). Set whole_line=true to replace entire lines containing a match (use with new="" to delete lines). Fuzzy: when exact old is absent, refuse by default even if score ≥ min_fuzzy_score (#1758); set allow_absent_old=true only for deliberate approximate recovery. Prefer ast_rename for identifiers. IMPORTANT: do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity. Example: {"path": "README.md", "old": "1.0.0", "new": "2.0.0"}. Insert after anchor (mutually exclusive with new): {"path": "src/main.rs", "old": "use std::io;", "insert_after": "use std::fs;"}
| Name | Required | Description | Default |
|---|---|---|---|
| new | No | Text to replace with. Mutually exclusive with insert_before/insert_after. Alias `to` accepted because agents often emit that name (LLM prior). | |
| nth | No | Replace only the Nth match (1-based). Default: replace all. | |
| old | Yes | Text to find. Alias `from` accepted because agents often emit that name (LLM prior). | |
| path | Yes | File path (relative to working directory). Alias `file` matches CLI/batch. | |
| fuzzy | No | When exact match fails, try fuzzy/similarity fallback (#1668). | |
| range | No | Restrict matching to a line range (e.g. "10:50" or "10-50"). Requires whole_line=true. | |
| regex | No | Use regex mode for the `old` pattern. | |
| strict | No | Roll back all writes when format/validate lifecycle steps fail. | |
| unique | No | Fail if the pattern matches more than once (enforce unambiguous edits). | |
| if_exists | No | Return success even if no matches found (idempotent mode). | |
| multiline | No | Enable multiline matching (dot matches newlines in regex mode). | |
| whole_line | No | Replace the entire line containing each match, not just the matched span. When combined with new="" this deletes matching lines. | |
| insert_after | No | Insert text after each match instead of replacing. Mutually exclusive with new/insert_before. | |
| after_context | No | Context line(s) after the target. Enables anchor-based fallback matching when the exact `old` text is not found. | |
| insert_before | No | Insert text before each match instead of replacing. Mutually exclusive with new/insert_after. | |
| word_boundary | No | Match only at word boundaries. Prevents 'SetupFile' from matching inside 'BenchSetupFile'. Auto-escapes regex metacharacters. | |
| before_context | No | Context line(s) before the target. Enables anchor-based fallback matching when the exact `old` text is not found. | |
| require_change | No | Zero matches is an error (fail closed). Softened when if_exists is true. | |
| min_fuzzy_score | No | Reject fuzzy matches below this similarity floor (#1687). `None` = no floor. | |
| allow_absent_old | No | Allow fuzzy apply when exact `old` is absent (#1758). Default false (fail closed; report best candidate without writing). | |
| case_insensitive | No | Case-insensitive matching. | |
| command_position | No | Only rewrite shell command-position tokens (not arguments / longer words). Peels wrappers like sudo, timeout, busybox, flock, runuser, setsid. |
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 delivers: default literal vs regex, word-boundary semantics with a concrete example, whole_line delete behavior, fail-closed fuzzy behavior, mutual exclusivity of insert_after with new, and the concurrency warning. These are behavioral traits not discoverable from the schema alone.
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 dense but well organized: core behavior first, then key flags, warnings, and concrete examples. The 'Options:' list is slightly redundant with the schema, but it is compact and the examples earn their place; 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?
For a mutation tool with 22 parameters, no annotations, and no output schema, this description is remarkably complete: it covers defaults, dangerous fuzzy behavior, concurrency constraints, deletion use case, and gives two invocation examples. The missing return-format details are minor against the operational hazards that are disclosed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds extra meaning for several parameters with examples and edge-case semantics (whole_line with new='', fuzzy refusal, word_boundary). It does not walk through every parameter, but the schema already documents those thoroughly, so the additional semantic value justifies a 4.
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 opens with a specific verb and resource ('Replace text in a file') and immediately clarifies default behavior ('Literal by default; set regex=true for regex'). It also names a sibling alternative ('Prefer ast_rename for identifiers'), which helps an agent distinguish it from related tools such as ast_rename or batch_replace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to prefer a different tool ('Prefer ast_rename for identifiers') and gives a hard operational constraint with the alternative ('do NOT issue concurrent calls targeting the same file; use execute_plan for multi-op atomicity'). This goes beyond implied usage into explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_filesB
Search text files for a pattern (regex by default, use literal=true for exact match). Supports advanced layered ignores for LLM agents: globs (include), exclude_patterns, custom_ignore_filenames (e.g. .agentignore), max_results. Other options: files_with_matches, files_without_match, count, case_insensitive, multiline, invert_match, assert_count, before/after_context. Canonical multi-root field is paths (array); singular path is accepted as an alias for one root (same as paths:[path]). Example: {"pattern": "TODO", "paths": ["src/"], "literal": true, "custom_ignore_filenames": [".agentignore"], "exclude_patterns": ["target/**"], "max_results": 20}
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Single search root (LLM prior: most MCP tools use singular `path`). Equivalent to `paths: [path]` when `paths` is empty. If both are set, `paths` wins. | |
| count | No | Only return match counts per file. | |
| globs | No | Glob include patterns (may be repeated). Supports parity with CLI --glob and library SearchOptions. | |
| paths | No | Paths to search in, relative to working directory (defaults to working directory root). Canonical multi-root form. Prefer this when searching multiple roots. | |
| context | No | Lines of context around matches (shorthand for before_context + after_context). | |
| literal | No | Treat pattern as a literal string instead of regex. | |
| pattern | Yes | Pattern to search for. | |
| multiline | No | Enable multiline matching (dot matches newlines in regex mode). | |
| max_results | No | Max detailed results (0 = unlimited). | |
| assert_count | No | Assert that the total match count equals N. Returns exit code 0 if exact, 2 otherwise. | |
| invert_match | No | Show lines that do NOT match the pattern. | |
| after_context | No | Lines of context after each match. | |
| before_context | No | Lines of context before each match. | |
| case_insensitive | No | Case-insensitive matching. | |
| exclude_patterns | No | Exclude glob patterns (in addition to ignore files). | |
| files_with_matches | No | Only return file paths with matches (not match details). | |
| files_without_match | No | Only return file paths with no matches (grep -L). | |
| custom_ignore_filenames | No | Custom ignore filenames (e.g. .agentignore). |
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 regex default, literal mode, path alias equivalence, and layered ignore semantics. However, it does not explicitly confirm the operation is read-only, describe the return format, or mention whether searches recurse into subdirectories—clear gaps for a no-annotation 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?
The description is dense but well-organized: main behavior, key options, path semantics, and a compact example. There is minimal redundancy and each sentence contributes useful information, though it is somewhat long and could be tightened without losing value.
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 tool with 18 parameters and no output schema, the description covers the important usage patterns, defaults, and an illustrative example. It omits the exact return shape and recursion behavior, but the schema plus output-mode options like count and files_with_matches still give an agent enough grounding to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful value by clarifying the regex default, the literal=true toggle, the canonical paths array versus singular path alias, and by providing a concrete combined example. This helps an agent select and combine parameters correctly.
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 opens with a specific verb and resource: 'Search text files for a pattern,' and adds clarifying details like regex-by-default and literal=true for exact matches. The tool's scope is clear and distinct from siblings like list_files or ast_search, though it doesn't explicitly name any sibling for disambiguation.
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 usage for text pattern searches but never states when to prefer this tool over alternatives, nor does it give exclusion criteria. Sibling tools such as ast_search and list_files represent different kinds of search/list operations, but no guidance is provided to help an agent choose among them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_infoA
Return server identity and workspace root: cwd, surface (full|core), tool_count, package version, MCP protocol_version from handshake, and optional recommendation (coding agents may prefer core). Prefer relative path parameters under cwd; absolute paths are allowed only when they resolve inside the workspace (AllowIfContained). Outside-workspace and ../ escapes are rejected.
| Name | Required | Description | Default |
|---|---|---|---|
No 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 well by disclosing what the tool returns and the relevant workspace path security model (relative paths preferred, absolute paths only inside workspace, outside/../ rejected). It does not explicitly state side effects, but as a read-only info endpoint, the 'Return' framing and lack of mutation language make the behavior adequately transparent.
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 compact and front-loaded with the output contract, followed by workspace path rules. It is not bloated, but the path-parameter sentence is somewhat tangential for a zero-parameter tool, so it earns a small deduction rather than a perfect score.
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 zero-parameter info tool, the description is nearly complete: it lists the returned fields and clarifies workspace path boundaries, which is useful context for interpreting cwd. It does not specify the exact JSON shape or whether the recommendation field is always present, but these are minor gaps without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and 0 required parameters, so the baseline is 4; there is no parameter meaning for the description to add. The schema coverage is vacuously 100%, and no parameter documentation burden exists.
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 uses a specific verb ('Return') and names a specific resource: server identity and workspace root. It enumerates the exact fields returned (cwd, surface, tool_count, package version, protocol_version, recommendation), which makes the tool's role unmistakable and clearly distinguishes it from the file, AST, and doc mutation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied rather than explicit: an agent can infer to call this when it needs server identity, workspace root, or surface information before path-sensitive operations. However, there is no direct comparison to alternatives or conditions for when not to use it; the 'coding agents may prefer core' hint offers only weak guidance.
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.
58 tool updates
v0.32.0- First observed
append_file - First observed
apply_fragment - First observed
apply_patch - First observed
ast_deps - First observed
ast_diff - First observed
ast_extract_to_file - First observed
ast_group - First observed
ast_impact - First observed
ast_imports - First observed
ast_insert - First observed
ast_list - First observed
ast_map - First observed
ast_move - First observed
ast_read - First observed
ast_refs - First observed
ast_rename - First observed
ast_reorder - First observed
ast_replace - First observed
ast_rewrite_signature - First observed
ast_search - First observed
ast_split - First observed
ast_validate - First observed
ast_wrap - First observed
batch_replace - First observed
batch_tidy - First observed
create_file - First observed
delete_file - First observed
doc_append - First observed
doc_delete - First observed
doc_delete_where - First observed
doc_diff - First observed
doc_ensure - First observed
doc_get - First observed
doc_merge - First observed
doc_move - First observed
doc_prepend - First observed
doc_query - First observed
doc_set - First observed
doc_update - First observed
execute_plan - First observed
fix_whitespace - First observed
git_status - First observed
list_files - First observed
md_dedupe_headings - First observed
md_insert_after_heading - First observed
md_insert_after_section - First observed
md_insert_before_heading - First observed
md_lint - First observed
md_move_section - First observed
md_replace_section - First observed
md_table_append - First observed
md_upsert_bullet - First observed
move_file - First observed
prepend_file - First observed
read_file - First observed
replace_text - First observed
search_files - First observed
server_info
TDQS
Scored across 58 tools
Most tools have clear, distinct purposes (file ops, AST ops, doc ops, markdown ops, search). Minor potential confusion exists among text-replacement variants (replace_text, batch_replace, apply_patch) and doc setter variants (doc_set, doc_ensure, doc_update), but the descriptions clarify the differences.
Names follow a consistent verb_noun pattern (create_file, delete_file, read_file) with domain prefixes (ast_, doc_, md_) used uniformly. A few outliers like fix_whitespace and batch_tidy are similar but acceptable, and overall the naming pattern is predictable.
58 tools is a large surface, considerably more than typical MCP servers. While many operations are granular (per AST, doc, markdown), the count starts to feel heavy and may burden agents with navigation overhead. Still, each tool addresses a specific need in a comprehensive code-manipulation toolset.
The toolset covers file CRUD, AST-aware refactoring/analysis, structured document editing (JSON/YAML/TOML), markdown manipulation, text search/replace, and batch atomic operations. The only notable gap is limited git integration (only git_status), but within its core domain the coverage is thorough.
Maintenance
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Convert files, URLs, and documents to clean, AI-ready Markdown via MCP.
MCP-native collaborative markdown editor with real-time AI document editing
System-of-record notebook for AI coding agents: pages, datastores, tasks, skills over MCP.
Related MCP Servers
- AlicenseBqualityDmaintenanceAdvanced code search and transformation MCP server for AI assistants. Combines ugrep's speed with intelligent replace capabilities, dry-run previews, and language-aware refactoring across 11 tools.110MIT
- AlicenseAqualityAmaintenanceA token-efficient, schema-aware MCP server that enables AI assistants to safely read, modify, query, and validate JSON, YAML, and TOML files with automatic schema detection and format conversion capabilities.89MIT
- AlicenseAqualityAmaintenanceA robust, language-agnostic Model Context Protocol (MCP) server that provides AI coding agents with the ability to edit files surgically via Abstract Syntax Trees (AST) instead of relying on token-heavy, brittle search-and-replace or diff operations.289MIT
- AlicenseAqualityCmaintenanceAdmission-control MCP server for AI coding agents — rejects bad file edits without coaching the LLM.31MIT