Skip to main content
Glama

Cut your MCP client's token usage by ~98% on cached reads, with millisecond responses.

Semantic Cache MCP is a Model Context Protocol server that puts every file operation behind one cache. Re-reading a file you already hold costs a few tokens instead of the whole file, and search and grep run over that same corpus rather than the disk.

Fourteen tools share the layer: read, read_image, batch_read, warm, write, edit, edit_preview, batch_edit, search, grep, glob, delete, clear, stats.


Why this exists

Reads stop costing tokens. The first read hands back a content_hash. Send it back — known_hash on read, a known_hashes entry on batch_read — and the server replies unchanged without resending. A modified file returns a diff with changed line numbers; an oversized one collapses to a structure-preserving summary rather than a blind cut at a byte offset.

Hashes travel as their first 16 hex characters — a claim is only ever checked against the entry for the path it names, so 64 bits separates two versions of one file with room to spare, and the full digest is still accepted. A shorter prefix is not: that would match every version at once.

That echoed hash is the whole contract, and it is the only evidence the server has that a file is still in your context. A warm cache proves the server holds the file, never that you do — the store is on disk and outlives the process, the session, and your context window. A read without a matching hash always sends the file, so forgetting is safe: after a compaction, omit the hashes and get your files back in full.

Search and grep run on the cache, not the disk. BM25 keyword search, glob, and grep all read the corpus that read, batch_read and warm populate — and warm fills it without returning a byte of content, so a whole tree becomes searchable for a few dozen tokens. An in-session result LRU collapses repeated queries to sub-millisecond hits.

Mutations are bounded by default. write, edit, and batch_edit enforce size and match limits, can run formatters, and refresh the cache atomically. A dry_run writes nothing and says so — the status becomes would_create / would_update / would_edit — so a preview is never mistaken for a completed write.


Related MCP server: Ambiance MCP Server

Installation

Add to Claude Code settings (~/.claude.json).

Option 1: uvx, always runs the latest version:

{
  "mcpServers": {
    "semantic-cache": {
      "command": "uvx",
      "args": ["semantic-cache-mcp"]
    }
  }
}

Option 2: uv tool install:

uv tool install semantic-cache-mcp
{
  "mcpServers": {
    "semantic-cache": {
      "command": "semantic-cache-mcp"
    }
  }
}

Restart Claude Code.

Disable the client's built-in file tools so all file I/O routes through semantic-cache.

Claude Code~/.claude/settings.json:

{
  "permissions": {
    "deny": ["Read", "Edit", "Write"]
  }
}

OpenCode~/.config/opencode/opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "permission": {
    "read": "deny",
    "edit": "deny",
    "write": "deny"
  }
}

CLAUDE.md Configuration

Add to ~/.claude/CLAUDE.md to enforce semantic-cache globally:

## Tools

- MUST use `semantic-cache-mcp` instead of native I/O tools (98% token savings on cached reads)

Tools

Core

Tool

Description

read

Cache-aware single-file read: full content plus a content_hash on the first read, unchanged for a matching known_hash, a diff for a changed file. offset/limit recover exact line ranges, with the number gutter opt-in via line_numbers=true (it costs ~17% of a window, and the range is in lines regardless). outline=true returns one line: signature per definition instead of the text — the cheap first read of a large file, and a map rather than possession, so it reports file_hash. A partial or summarized read reports file_hash (prefixed partial:) — it identifies the file but is never proof you hold it. A ranged read also returns a signed coverage_token for the lines delivered: echo it back and a window you hold answers unchanged; windows covering the whole file mint a claimable content_hash.

read_image

Image pass-through. Returns an MCP image content block (base64 + mime) so vision models see the pixels; sidecar metadata carries size and mime. Format verified by magic bytes (PNG, JPEG, GIF, TIFF, BMP, WebP), not extension. Bypasses the cache. Capped at 5 MiB (SCMCP_MAX_IMAGE_BYTES).

write

Full-file create or replace with cache refresh. Returns creation status or an overwrite diff; supports append=true and formatters. A full write hands back a claimable content_hash; an append needs known_hash to earn one.

edit

Exact edit against cached content, with scoped and line-range modes plus dry_run=true. Pass known_hash to get a claimable content_hash back and skip the read afterwards. For several edits to one file, use batch_edit.

batch_edit

Many exact edits to one file, applied atomically, with per-edit success reporting. Takes known_hash on the same terms as edit. An ambiguous anchor, an anchor inside another edit's line range, and two overlapping ranges are each rejected rather than silently resolved; every reported success is verified against the text it produced.

edit_preview

Read-only probe returning match count, line numbers, and context snippets for a candidate old_string. Confirms anchor uniqueness before a costly edit.

delete

Single-path delete for a file or symlink, with cache eviction and dry_run=true. No globs, no recursion, no directory delete.

Discovery

Tool

Description

warm

Index files into the cache so grep and search can see them, returning counts only — never content. Takes paths or globs. Every file left out is reported with a reason (not_found, not_a_file, binary, too_large, unreadable, timeout), and a cap that stops the walk sets truncated or incomplete rather than a short count that reads as complete.

batch_read

Multi-file cache-aware read. Handles globs, priorities, token budgets, and diff/full routing. Returns each file's content_hash; pass them back as known_hashes to suppress the ones you still hold.

search

Cache-only BM25 ranking of cached files. Terms join with OR, so a word your corpus lacks narrows the ranking instead of emptying the results. Previews centre on the matching term rather than the file's first 200 characters, so they show why the file ranked. Index likely files with warm first.

grep

Cache-only exact search — regex or literal. Best for symbols and exact strings. Hits come back as "<line>:<text>" strings grouped by file, context lines as "<line>-<text>", with overlapping context windows merged so no line is sent twice; paths are relative to the root the response names. output="paths" answers "which files mention X" and output="count" just the totals. An invalid, over-long, or catastrophically backtracking pattern is an error, never an empty result; use fixed_string=true for literal text. Responses state whether the scan completed, so a capped result is never read as a total.

glob

File discovery plus cache coverage. Find candidates, then pass the paths to warm (to index them) or batch_read (to read them).

Management

Tool

Description

stats

Cache metrics, session usage (tokens saved, tool calls), and lifetime aggregates.

clear

Reset all cache entries.


Tool Reference

The table above is the authoritative map; these are the common call shapes.

read path="/src/app.py"                        # automatic: full, unchanged, or diff
read path="/src/app.py" offset=120 limit=80    # lines 120 to 199 only

State

Response

Token cost

First read

Full content plus a content_hash

Normal

Unchanged

unchanged: true, when you pass back a matching known_hash

A few tokens

Modified

Unified diff only

5 to 20% of original

write path="/src/new.py" content="..."
write path="/src/new.py" content="..." auto_format=true
write path="/src/large.py" content="...chunk1..." append=false   # first chunk
write path="/src/large.py" content="...chunk2..." append=true    # subsequent chunks
# Mode A: find/replace, searches the entire file
edit path="/src/app.py" old_string="def foo():" new_string="def foo(x: int):"
edit path="/src/app.py" old_string="..." new_string="..." replace_all=true auto_format=true

# Mode B: scoped find/replace, searches only within the line range (a shorter old_string works)
edit path="/src/app.py" old_string="pass" new_string="return x" start_line=42 end_line=42

# Mode C: line replace, swaps the whole range with no old_string needed (most token savings)
edit path="/src/app.py" new_string="    return result\n" start_line=80 end_line=83

Mode

Parameters

Best for

Find/replace

old_string + new_string

Unique strings, no line numbers known

Scoped

old_string + new_string + start_line/end_line

Shorter context when read gave you line numbers

Line replace

new_string + start_line/end_line

Maximum token savings when line numbers are known

# Mode A: find/replace, [old, new]
batch_edit path="/src/app.py" edits='[["old1","new1"],["old2","new2"]]'

# Mode B: scoped, [old, new, start_line, end_line]
batch_edit path="/src/app.py" edits='[["pass","return x",42,42]]'

# Mode C: line replace, [null, new, start_line, end_line]
batch_edit path="/src/app.py" edits='[[null,"    return result\n",80,83]]'

# Mixed modes in one call (object syntax also supported)
batch_edit path="/src/app.py" edits='[
  ["old1", "new1"],
  {"old": "pass", "new": "return x", "start_line": 42, "end_line": 42},
  {"old": null, "new": "    return result\n", "start_line": 80, "end_line": 83}
]' auto_format=true
batch_read paths="/src/a.py,/src/b.py" max_total_tokens=50000
batch_read paths='["/src/a.py","/src/b.py"]' priority="/src/main.py"
batch_read paths="/src/*.py" max_total_tokens=30000
batch_read paths="/src/a.py,/src/b.py" known_hashes='{"/src/a.py":"8f3c..."}'

Expands simple globs, honors priority, enforces max_total_tokens, and reports skipped paths with recovery hints. Every file is returned in full unless you prove you still hold it: echo the delivered content_hash values back as known_hashes and the ones you hold collapse into an unchanged count.

warm paths="src/**/*.py"
warm paths="src/a.py,src/b.py"
warm paths="src/**/*" max_files=500

Indexes the files into the cache and returns counts — warmed, already_current, skipped, tokens_indexed — with no content, no previews, and no per-file paths for the ones that worked. Anything skipped comes back under failures with a reason, and a cap that stops the walk sets truncated or incomplete.

The usual opening move on an unfamiliar tree: warm, then grep for the exact string or search for the concept, then read only what those name.

search query="authentication middleware logic" k=5
glob pattern="**/*.py" directory="./src" cached_only=true
grep pattern="class Cache" path="src/**/*.py"
grep pattern="content_hash" output="paths"
grep pattern="TODO" output="count"

A grep response names the shared directory once as root and reports each file's hits as "<line>:<text>" strings — measured at 37% fewer tokens than the per-match objects it replaced, and glob at 50%. output="count" turns a 2.6k-token answer into 77.


Configuration

Environment Variables

Variable

Default

Description

LOG_LEVEL

INFO

Logging verbosity (DEBUG, INFO, WARNING, ERROR)

TOOL_OUTPUT_MODE

compact

Response detail (compact, normal, debug)

TOOL_MAX_RESPONSE_TOKENS

0

Global response token cap (0 = disabled)

TOOL_TIMEOUT

30

Seconds before a tool call times out (auto-resets executor)

MAX_CONTENT_SIZE

100000

Max bytes returned by read operations

MAX_CACHE_ENTRIES

10000

Max cache entries before W-TinyLFU eviction

SEMANTIC_CACHE_DIR

(platform)

Override cache/database directory path

SCMCP_STRUCTURED_CONTENT

false

Also send each result as MCP structuredContent. Off by default: it duplicates the text block byte for byte, and clients disagree about which they forward, so leaving it on can double the cost of every file delivered.

SCMCP_PUBLISH_OUTPUT_SCHEMA

false

Advertise per-tool output schemas in tools/list. Off by default: they were 11.5k of this server's 19.8k advertised tokens, paid on every request, and the Anthropic Messages API has no field to receive them. Turning this on forces SCMCP_STRUCTURED_CONTENT on too, since MCP requires structured content from any tool that declares a schema.

A malformed value falls back to the default and logs a warning naming the variable. See docs/env_variables.md for detail.

Safety Limits

Limit

Value

Protects against

MAX_WRITE_SIZE

10 MB

Memory exhaustion via large writes

MAX_EDIT_SIZE

10 MB

Memory exhaustion via large file edits, in edit and batch_edit alike

MAX_MATCHES

10,000

CPU exhaustion via unbounded replace_all

GREP_MAX_PATTERN_LEN

1,000 chars

Oversized grep regex source

Regex shape check

Catastrophic backtracking (details)

MCP Server Config

{
  "mcpServers": {
    "semantic-cache": {
      "command": "uvx",
      "args": ["semantic-cache-mcp"],
      "env": {
        "LOG_LEVEL": "INFO",
        "TOOL_OUTPUT_MODE": "compact",
        "MAX_CONTENT_SIZE": "100000"
      }
    }
  }
}

Cache location: ~/.cache/semantic-cache-mcp/ (Linux), ~/Library/Caches/semantic-cache-mcp/ (macOS), %LOCALAPPDATA%\semantic-cache-mcp\ (Windows). Override with SEMANTIC_CACHE_DIR.


How It Works

┌──────────┐     ┌────────────┐     ┌──────────────────────────┐
│  Claude  │────▶│ smart_read │────▶│ stat() + cache lookup    │
│   Code   │     │            │     │ (BEFORE any disk read)   │
└──────────┘     └────────────┘     └──────────────────────────┘
                        │
       ┌────────────────┼─────────────────┬──────────────────┐
       ▼                ▼                 ▼                  ▼
 ┌──────────┐    ┌──────────┐      ┌──────────┐      ┌────────────┐
 │ mtime    │    │ mtime    │      │ Changed  │      │ New /      │
 │ match    │    │ drift,   │      │ content  │      │ Large      │
 │ FAST     │    │ hash     │      │ → diff   │      │ → summary  │
 │ PATH     │    │ match    │      │ (80-95%) │      │  or full   │
 │ ~5 tok   │    │ ~5 tok   │      └──────────┘      └────────────┘
 │ (99%)    │    │ (99%)    │
 │ ~1 ms    │    │ ~1 ms    │
 │ no I/O   │    │ +update  │
 └──────────┘    └──────────┘

search is cached on the same principle. An in-session LRU keyed on (query, k, directory) returns warm hits in ~10 µs, and misses fall through to BM25. Every cache mutation (put, clear, delete_path, update_mtime) bumps the LRU, so callers never see a result that predates a write.


Performance

Measured on this project's 41 source files (212,499 tokens), i9-13900K, ext4 on NVMe, corpus held fixed across phases. Every phase models a caller that keeps its hashes and echoes them back — that is what earns the savings.

Token savings: 98.9% overall (phases 2 to 6)

Phase

Scenario

Savings

Overall (cached, phases 2 to 6)

Aggregate token reduction

98.9%

Unchanged re-read

mtime match, fast path skips disk I/O

99.3%

Content hash

mtime drifted, BLAKE3 still matches

99.3%

Batch read

All files via batch_read, 200K budget

99.3%

Search previews

5 queries × k=5, previews vs full reads

98.6%

Small edits

Real ~5% line changes in 30% of files

98.1%

Cold read

First read, no cache; one file exceeds MAX_CONTENT_SIZE and returns summarised, which is not a cache saving

5.9%

Latency: unchanged reads ~1 ms; repeat searches < 0.01 ms

Operation

p50

Notes

Single unchanged read (fast path)

1.1 ms

mtime + cache hit, no disk I/O

Single diff read (changed file)

0.7 ms

hash check + unified diff

Search k=5 (cache hit)

< 0.01 ms

in-session LRU

Search k=5 (cache miss)

1.4 ms

BM25 keyword search

Edit (scoped find/replace)

3.1 ms

cached content, plus the atomic write's fsync

Grep (literal def )

1.5 ms

FTS5 over cached corpus

Grep (regex)

3.4 ms

compiled once

Batch read (41 files, diff mode)

45.6 ms

chunk + tokenize changed files; one summarises each full pass

Unchanged re-read (41 files)

19.5 ms

whole-corpus pass

Cold read (41 files, total)

100 ms

single unrepeated pass: I/O, tokenisation, one summarisation

Write (200-line file)

2.7 ms

creates + caches, durable before it returns

Run them yourself. Pin TMPDIR to a real disk — the default /tmp is usually tmpfs, which discards fsync and reports write latency ~40% low:

TMPDIR="$HOME/.cache/scmcp-bench" \
  uv run python benchmarks/benchmark_performance.py    # operation latency
uv run python benchmarks/benchmark_token_savings.py    # token savings

See docs/performance.md for full methodology.


Documentation

Guide

Description

Architecture

Component design, algorithms, data flow

Performance

Benchmarks, methodology, cache footprint

Security

Threat model, input validation, size limits

Advanced Usage

Programmatic API, custom storage backends

Troubleshooting

Common issues, debug logging

Environment Variables

All env vars with defaults and examples


Contributing

git clone https://github.com/CoderDayton/semantic-cache-mcp.git
cd semantic-cache-mcp
uv sync
uv run pytest

See CONTRIBUTING.md for commit conventions, pre-commit hooks, and code standards.


License

MIT License. Use it freely in personal and commercial projects.


Credits

Built with FastMCP 4.0+ and:

  • SQLite with FTS5 for keyword (BM25) full-text search, vendored as a small built-in store

  • Semantic summarization based on TCRA-LLM (arXiv:2310.15556)

  • BLAKE3 cryptographic hashing for content freshness

  • W-TinyLFU frequency-aware cache eviction

Available Tools

14 tools
batch_editBatch EditA

Apply many exact edits to one file in a single atomic call.

Preferred over repeated edit calls on the same file: one response, applied atomically, faster on large files. Partial success is allowed — any failed edits are returned with their reason so you can retry just the misses (status is edited when all apply, partial when some fail, no_changes when none do). A dry_run writes nothing and says so: the status becomes would_edit/would_partial and dry_run: true comes back with it. For edits across different files, call the tool once per file.

edits is a JSON array; each entry is one of:

  • [old, new] — exact find/replace.

  • [old, new, start_line, end_line] — find/replace confined to a range.

  • [null, new, start_line, end_line] — replace that line range wholesale.

  • {"old": ..., "new": ..., "start_line": ..., "end_line": ...} — object form.

Prefer line-range entries when you already have line numbers from read. Pass known_hash and the response carries a claimable content_hash, so no read is needed afterwards; without it, or with auto_format, you get file_hash instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path to modify (absolute, or relative to root).
editsYesJSON array of edit entries, in any of the forms above.
dry_runNoPreview without writing.
show_diffNoReturn the full diff even on a deterministic all-success batch.
known_hashNoThe `content_hash` from your last read of this file. Proves you hold the text being edited, so the result can be handed back as a claimable `content_hash`.
auto_formatNoRun the formatter after all edits.

TDQS

A5/5.0
Behavior5/5

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 so thoroughly. It discloses atomic application semantics, partial success behavior, status values (`edited`, `partial`, `no_changes`), dry-run behavior (`would_edit`/`would_partial` and `dry_run: true`), and hash-handling behavior (`content_hash` vs `file_hash`).

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

Conciseness5/5

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

The description is dense but every sentence earns its place. It front-loads the core purpose and usage preference, then covers edit formats, status outcomes, dry-run behavior, and hash semantics without redundant fluff.

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

Completeness5/5

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

For a complex tool with 6 parameters, no annotations, and no output schema, the description is remarkably complete. It covers invocation context, input formats, failure behavior, return-status semantics, and post-call hash handling, leaving little ambiguity for an agent.

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

Parameters5/5

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

Although the input schema already covers 100% of parameters, the description adds meaningful semantics beyond the schema: it documents the JSON array forms for `edits`, explains the line-range variants, and clarifies how `known_hash`, `content_hash`, and `file_hash` interact. This significantly helps an agent construct valid calls.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Apply many exact edits to one file in a single atomic call.' It also distinguishes the tool from repeated `edit` calls, making its purpose and scope immediately clear.

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

Usage Guidelines5/5

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

The description explicitly states when to prefer this tool over repeated `edit` calls, when to use it once per file for cross-file edits, and when to prefer line-range entries based on existing `read` data. This gives the agent actionable routing criteria.

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

batch_readBatch ReadA

Read several files at once under a shared token budget.

Cheaper than many single read calls. To make files searchable without reading them at all, use warm instead — this tool returns their text. Pass known_hashes and each file you still hold collapses to an unchanged count, or to a diff when it moved on disk; the rest come back in full with their content_hash. A file large enough to come back summarized carries none: a summary is not the file. Smallest files are read first, and a file too big for the remaining budget is listed under skipped while smaller ones keep being read. Recover anything skipped with read using offset/limit. Paths are relative to the root the response names, when there is one worth naming.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYesThe files to read — a comma-separated list, a JSON array, or glob patterns (expanded for you).
priorityNoOptional paths to read first, ahead of the remaining files. Ordering only — a priority file still has to fit the budget, and is skipped like any other when it does not.
known_hashesNoJSON object mapping a path to the `content_hash` you still hold for it, e.g. `{"src/a.py": "8f3c..."}`. Any file you cannot vouch for this way is sent in full.
max_total_tokensNoTotal token budget shared across the whole batch.

TDQS

A4.8/5.0
Behavior5/5

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 hash-based deduplication (files collapse to an `unchanged` count or a diff), summarization of large files with no `content_hash`, smallest-first read order, `skipped` behavior under budget pressure, and root-relative path resolution. An agent can predict edge-case behavior it has never seen.

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

Conciseness4/5

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

Eight sentences, but each carries a distinct behavioral fact (budget sharing, sibling routing, hash dedup, summaries, ordering, skipping, recovery, root path) with no repetition. Longer than minimal, but the density is justified by the tool's complexity and every sentence earns its place.

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

Completeness5/5

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

For a complex tool with 4 parameters, budget dynamics, and no output schema, the description is complete: it explains what comes back in each case (full text with `content_hash`, `unchanged` counts, diffs, summaries, `skipped`, `root`) and how to recover skipped files. Nothing an agent needs to invoke it correctly or interpret its response is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description enriches parameter meaning: it explains that `known_hashes` changes the response shape (collapse to `unchanged`/diff) and that `max_total_tokens` drives the smallest-first ordering and `skipped` behavior. This goes beyond the schema's per-parameter descriptions without restating syntax already covered there.

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

Purpose5/5

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

Opens with a specific verb+resource+constraint — 'Read several files at once under a shared token budget' — which immediately distinguishes it from single-file `read` and names `warm` as the alternative for searchability. The scope is unambiguous and the tool is clearly differentiated from siblings.

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

Usage Guidelines5/5

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

Gives explicit routing guidance: 'To make files searchable without reading them at all, use `warm` instead' names the alternative and the condition that selects it, and 'Recover anything skipped with `read` using `offset`/`limit`' provides the fallback path. The cost comparison to single `read` calls clarifies when batching is the right choice.

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

clearClearA

Empty the cache. Does not touch any project file.

Removes every cached file entry and returns how many were dropped; the next read/batch_read re-seeds from disk. Use rarely — only to recover from stale cache state or force a cold re-seed. Normal reads already refresh changed files on their own, so this is seldom needed. Takes no arguments.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A5/5.0
Behavior5/5

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

Discloses side effects: does not touch project files, removes every cached file entry, returns count dropped, and that next read/batch_read re-seeds from disk. With no annotations, this provides full behavioral transparency.

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

Conciseness5/5

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

Description is concise, front-loaded with the core action, and every sentence adds useful information without redundancy.

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

Completeness5/5

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

Given the tool's simplicity, it covers the action, side effects, return value, and appropriate usage context. No output schema exists, but the description adequately explains what the caller can expect.

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

Parameters5/5

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

The tool has no parameters and the description explicitly states 'Takes no arguments,' so no additional parameter meaning is needed beyond the empty input schema.

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

Purpose5/5

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

States a specific verb and resource ('Empty the cache') and clearly distinguishes from sibling tools like read and batch_read by focusing on cache clearing rather than file operations.

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

Usage Guidelines5/5

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

Explicitly says when to use ('only to recover from stale cache state or force a cold re-seed') and when not to use it, noting normal reads already refresh changed files and this is seldom needed.

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

deleteDeleteA

Delete one file or symlink and evict its cache entries.

Use this for explicit single-path removal instead of shelling out. A missing path is reported as status not_found, not an error.

Statuses: deleted (removed), would_delete (dry-run preview only, and dry_run: true comes back with it), not_found (nothing was there). Constraints: one path only — no globs, no recursion, no real-directory deletes. A symlink path deletes the link itself, never its target.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile or symlink path (absolute, or relative to the project root).
dry_runNoPreview the outcome without deleting or evicting the cache.

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description fully carries the behavior disclosure burden. It explains status outcomes (`deleted`, `would_delete`, `not_found`), dry-run behavior, cache eviction, missing-path handling (not an error), and symlink-link vs. target behavior. This is exceptionally transparent for a destructive operation.

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

Conciseness5/5

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

The description is well-structured and front-loaded: core action first, usage guidance second, statuses third, and constraints last. Every sentence carries useful information and none are redundant or filler. The density is justified given the tool's destructive nature and complex edge cases.

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

Completeness5/5

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

Despite lacking annotations and an output schema, the description covers the essential operational context: what the tool deletes, how it handles edge cases (missing path, symlinks, directories, dry-run), and what statuses to expect. Nothing critical that an agent needs to call this tool correctly is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents both parameters. The description adds meaningful extra semantics beyond the schema, such as the `dry_run` status `would_delete` and path constraints (one path only, no globs, no recursion). This goes beyond the baseline but is primarily behavioral rather than deeply expanding parameter format details.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Delete one file or symlink and evict its cache entries.' This clearly distinguishes it from sibling tools like read, write, edit, and clear, none of which perform single-path deletion. The scope is unambiguous.

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

Usage Guidelines5/5

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

It explicitly states when to use the tool: 'Use this for explicit single-path removal instead of shelling out.' It also provides clear when-not constraints: one path only, no globs, no recursion, no real-directory deletes, and symlink-link-only semantics. These conditions enable an agent to select this tool correctly and avoid misuse.

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

editEditA

Edit one file by exact text replacement.

Three modes:

  • find/replace: old_string + new_string (the default).

  • scoped: add start_line/end_line to confine the search to a range.

  • line-range: omit old_string and give both lines to replace them wholesale.

old_string must match exactly — whitespace and indentation included — and, unless replace_all=true, must be unique, or the edit fails. Use edit_preview first if you're unsure an anchor is unique. Returns the replacement count and the affected line numbers, and refreshes the cache. The diff itself is omitted unless you ask for it with show_diff; diff_state always tells you which you got. A dry_run writes nothing and says so: the status is would_edit and dry_run: true comes back with it. For several edits to one file use batch_edit; for a full rewrite use write.

Pass known_hash and the response carries a claimable content_hash, so no read is needed afterwards. Without it, or with auto_format, you get file_hash instead — editing a file is not the same as having read it.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path to modify (absolute, or relative to root).
dry_runNoPreview without writing.
end_lineNo1-based inclusive end line for a scoped or line-range edit.
show_diffNoReturn the diff even on a deterministic edit.
known_hashNoThe `content_hash` from your last read of this file. Proves you hold the text being edited, so the result can be handed back as a claimable `content_hash`.
new_stringNoReplacement text (an empty string deletes the match).
old_stringNoExact text to find. Omit only for a line-range replacement.
start_lineNo1-based inclusive start line for a scoped or line-range edit.
auto_formatNoRun the formatter after editing.
replace_allNoReplace every occurrence instead of requiring a unique match.

TDQS

A4.9/5.0
Behavior5/5

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, and it does so thoroughly. It states exact-match requirements, uniqueness rules, return values (replacement count and line numbers), cache refresh behavior, diff omission unless show_diff is set, dry_run semantics, and hash implications. This covers both success paths and caveats.

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

Conciseness5/5

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

The description is long but front-loaded with the core purpose and mode summary. It is organized in scannable chunks, and every sentence contributes functional value: constraints, return behavior, hash semantics, and tool routing. Given the complexity of a 10-parameter editing tool, this length is earned rather than bloated.

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

Completeness5/5

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

For a complex file-editing tool with no annotations and no output schema, this description is remarkably complete. It explains all three invocation modes, uniqueness constraints, preview fallback, dry-run behavior, return values, diff control, and hash semantics. An agent has enough context to invoke the tool correctly without additional probing.

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

Parameters4/5

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

Schema coverage is 100%, so a baseline of 3 applies. The description adds meaningful semantic context beyond the schema by explaining how old_string, new_string, start_line, end_line, replace_all, dry_run, known_hash, and auto_format interact across the three modes. It does not merely repeat schema descriptions but frames them behaviorally.

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

Purpose5/5

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

The description opens with a crisp statement: 'Edit one file by exact text replacement.' It immediately names the resource ('one file'), the action ('exact text replacement'), and goes on to distinguish itself from sibling tools like batch_edit and write. An agent can tell exactly what this tool does and what it does not do.

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

Usage Guidelines5/5

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

The description provides explicit usage guidance: three modes are spelled out, when uniqueness is required, when to use edit_preview, and when to prefer batch_edit or write. It also explains when known_hash is beneficial and what happens without it. This is exemplary 'when to use vs. alternatives' content.

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

edit_previewEdit PreviewA

Show where old_string would match in a file, without editing it.

Returns the match count, 1-based line numbers, and short snippets so you can confirm an anchor is unique before calling edit. Read-only and cheap (kept under ~200 tokens), so use it freely as a probe. Raises an error on a binary file or an empty old_string.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path to search (absolute, or relative to root).
old_stringYesAnchor text to locate. Must match exactly, including whitespace and indentation. Cannot be empty.

TDQS

A4.7/5.0
Behavior5/5

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 transparency. It clearly states that the tool is read-only, returns match count, line numbers, and snippets, and raises errors on binary files or empty `old_string`.

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

Conciseness5/5

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

The description is concise and well-structured, covering purpose, behavior, usage guidance, and error conditions in just a few sentences. Every sentence adds useful information without redundancy or fluff.

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

Completeness5/5

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

Although there is no output schema, the description adequately explains the return content (match count, 1-based line numbers, snippets). It also covers error cases and usage context, making the tool's behavior sufficiently complete for an agent to use it correctly.

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

Parameters3/5

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

The schema already describes both parameters with 100% coverage, including path absoluteness and exact matching rules for `old_string`. The tool description adds no additional parameter-level detail beyond what the schema provides, so a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool's purpose: showing where `old_string` would match in a file without editing it. It also distinguishes itself from the sibling `edit` tool by explicitly noting it is a preview step before calling `edit`.

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

Usage Guidelines5/5

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

It explains when to use the tool: to confirm an anchor is unique before calling `edit`. It also provides practical guidance by noting the operation is read-only, cheap, and kept under ~200 tokens, and it specifies error conditions for binary files and empty `old_string`.

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

globGlobA

List files matching a glob and show which are already cached.

Use it to discover files and see what search/grep can already access before you spend reads. Each match carries a cached flag; set cached_only=true to list only files already in the cache. Pair it with batch_read to pull in whatever isn't cached yet.

ParametersJSON Schema
NameRequiredDescriptionDefault
patternYesGlob pattern to match (e.g. `src/**/*.py`).
directoryNoBase directory the pattern is evaluated from..
cached_onlyNoReturn only files that are already cached.

TDQS

A4.5/5.0
Behavior4/5

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 reveals that results include a cached flag, that cached_only restricts results, and that no content reads are performed before a batch_read step. It does not explicitly state it is read-only/safe, but the listing language makes that clear.

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

Conciseness5/5

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

Four short sentences, with the core action front-loaded and each subsequent sentence adding a distinct piece of useful context (cache flag, filter, batch_read pairing). No filler or repetition.

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

Completeness5/5

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

For a simple 3-parameter listing tool with no output schema, the description fully covers what the tool returns (matches with cached flags), when to use it, and how to pair it with batch_read. Nothing critical for a correct first call is missing.

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

Parameters3/5

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

Schema description coverage is 100% and all three parameters are already described with examples and defaults. The description adds modest value by highlighting cached_only usage, but does not add new meaning beyond the schema; baseline 3 is appropriate.

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

Purpose5/5

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

The description begins with a specific verb and resource: 'List files matching a glob and show which are already cached.' It clearly distinguishes itself from sibling tools like search/grep by focusing on filesystem discovery and cache status, so an agent can tell what this tool does 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.

Usage Guidelines5/5

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

Explicitly tells when to use it: before spending reads, to see what search/grep can already access. It names batch_read as the partner for uncached files, and identifies cached_only as a filter. This is clear guidance with alternatives.

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

grepGrepA

Search cached file contents for an exact string or regex.

Fast, exact, line-numbered matching over files already in the cache — it does NOT touch disk, so index files first with warm, which costs a few dozen tokens however many files it covers (empty results usually mean the files aren't cached). A pattern that is not a valid regex is an error, never an empty result, so zero matches always means zero matches. For concept-level questions where you don't know the exact term, use search instead.

Counts are complete unless the response says otherwise: if a cap stops the scan, complete comes back false with limit_reached naming which one, so total_matches is never mistaken for the total that exists.

Each file's hits come back as "<line>:<text>" strings under lines, with context lines using - instead of :. Paths are relative to the root the response names, when there is one worth naming. The cache is shared across projects, so a relative path — or none — searches only the current project; an absolute path reaches files anywhere.

A repeated group wrapping an unbounded quantifier ((a+)+) is rejected rather than run — it can take exponential time and cannot be interrupted once started. Drop the redundant repeat, or pass fixed_string=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoOptional filter — an exact path, a path suffix, a directory (matching every cached file beneath it), or a glob.
outputNoHow much to return — `matches` (default), `paths` for the matching files without their lines, or `count` for the totals alone.matches
patternYesA regular expression, or a literal string when `fixed_string=true`.
max_filesNoCap on the number of files returned.
max_matchesNoCap on total matches returned across all files.
fixed_stringNoMatch `pattern` literally instead of as a regex.
context_linesNoLines of surrounding context to include around each match. Overlapping windows are merged, so no line is sent twice.
case_sensitiveNoMatch case-sensitively.

TDQS

A5/5.0
Behavior5/5

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 that the tool does not touch disk, that invalid regexes are errors rather than empty results, that capped results are reported via `complete` and `limit_reached`, and that catastrophic regex patterns are rejected to avoid hangs. This is exceptionally thorough.

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

Conciseness5/5

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

The description is long but every paragraph earns its place: cache behavior, error semantics, alternative tool routing, output format, path scoping, and security-related regex rejection are all covered without redundancy. The first sentence immediately states the primary purpose, and subsequent paragraphs are logically organized.

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

Completeness5/5

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

Given that there is no output schema and no annotations, the description compensates fully by explaining the response structure (`lines`, `"<line>:<text>"`, context lines using `-`), completeness guarantees, error behavior, path semantics, and the need for pre-warming. An agent has everything necessary to invoke this tool correctly.

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

Parameters5/5

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

Schema coverage is 100%, so the baseline is already strong, but the description adds substantial meaning: the line-numbered output format, the distinction between relative and absolute `path` with respect to the shared cache, the semantics of `fixed_string`, and the behavior of caps. It goes well beyond simply restating schema fields.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Search cached file contents for an exact string or regex.' It then reinforces the tool's identity with 'Fast, exact, line-numbered matching over files already in the cache' and explicitly contrasts itself with the sibling `search`, so an agent can distinguish grep from related tools.

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

Usage Guidelines5/5

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

The description gives concrete usage conditions: it only works over cached files, so it directs the agent to first index with `warm`; it advises using `search` for concept-level questions where the exact term is unknown; and it even explains path-scoping behavior for current vs. other projects. This is explicit 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.

readReadA

Read a file, returning as few tokens as possible. For 2+ files, use batch_read.

The first read returns the file's full content plus a content_hash. Echo it back as known_hash on every later read: an unchanged file then answers "unchanged": true with no body, a changed one returns a unified diff, and without it the file is always sent in full. Reading also caches the file so grep, search, and batch_read can see it.

Use offset/limit to read an exact line range, for example after a large file was summarized. A read that returns only part of a file — a line range, or a summary — reports file_hash (prefixed partial:) rather than content_hash, and it cannot be redeemed as known_hash. A ranged read also returns a coverage_token: pass it back as known_hash on your next ranged read and a window you already hold answers unchanged; once the windows cover the whole file you get a claimable content_hash.

For a large or unfamiliar file, outline=true is the cheap first read: one line per class/function as <line>: <signature>, and every number is an offset you can read next. An outline is a map, not the file, so it comes back as file_hash.

is_diff marks a unified diff and truncated marks a summary. A binary file returns metadata instead of content; for images use read_image.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path (absolute, or relative to the project root). Use an absolute path for files outside the project root.
limitNoNumber of lines to return starting at `offset`.
offsetNo1-based first line for a ranged read; omit or pass 0 to start from the first line.
outlineNoReturn the file's definitions and their line numbers instead of its text. Cannot be combined with `offset`/`limit`.
max_sizeNoByte threshold above which the file is semantically summarized; recover exact lines afterward with `offset`/`limit`.
known_hashNoThe `content_hash` from your last read of this file — or the `coverage_token` from your last ranged read of it — passed back to get `"unchanged"` instead of the content re-sent. Omit only on a first read, or when you no longer hold what it vouches for.
line_numbersNoPrefix each line of a ranged read with its number. Costs about 17% more tokens; the range is in `lines` either way. Requires `offset` or `limit`.

TDQS

A5/5.0
Behavior5/5

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 does so thoroughly. It discloses the caching side effect ('Reading also caches the file so grep, search, and batch_read can see it'), the content_hash/known_hash protocol, the partial file_hash behavior, the coverage_token mechanism, and the binary-file metadata fallback.

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

Conciseness5/5

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

The description is lengthy but every paragraph earns its place given the tool's complex caching and hashing behavior. It is front-loaded with the core purpose, then progresses logically from hash protocol to ranged reads, outlines, and output flags, with no filler or repetition.

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

Completeness5/5

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

The tool has seven parameters, no annotations, and no output schema, so the description must explain behavior and return values on its own. It covers the full content_hash lifecycle, unchanged/diff responses, partial hashes, coverage tokens, outline format, summary truncation, and binary metadata, leaving no material gap for an agent to call it correctly.

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

Parameters5/5

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

Although the schema already has 100% description coverage, the tool description adds substantial meaning beyond the schema. It explains how known_hash redeems content, why partial file_hash cannot be redeemed, how coverage_token extends ranged reads, what outline returns, and the max_size summarization threshold — all semantics an agent would not infer from parameter names alone.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Read a file, returning as few tokens as possible.' It also differentiates itself from siblings by explicitly directing multi-file reads to batch_read and images to read_image, so an agent can distinguish it without inspecting other schemas.

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

Usage Guidelines5/5

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

The description explicitly states when alternatives should be used: 'For 2+ files, use batch_read' and 'for images use read_image.' It also advises outline=true as the cheap first read for large or unfamiliar files, and offset/limit for exact line ranges, giving clear contextual guidance and exclusions.

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

read_imageRead ImageA

Read an image file so the model can see it.

Returns an MCP image block (base64 data + mime type) plus a small JSON metadata sidecar (size, mime). Use this only when the model needs to view the image; for text or any other file type use read.

The format is detected from the file's magic bytes, not its extension, so a mis-named image still works and a non-image (e.g. text saved as .png) is rejected. Supports PNG, JPEG, GIF, TIFF, BMP, and WebP. Images are never cached — every call re-reads from disk. Oversized images are rejected before encoding; the cap is SCMCP_MAX_IMAGE_BYTES (default 5 MiB), bounded by Anthropic's ~5 MB upload limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesImage file path (absolute, or relative to the project root).

TDQS

A4.7/5.0
Behavior5/5

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 reveals the return shape, magic-byte detection, rejection of non-images, supported formats, no-caching behavior, and the size cap. These traits are not inferable from the schema or title, making this strong transparency.

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

Conciseness5/5

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

Four short paragraphs each earn their place: purpose, return value, usage routing, and behavioral caveats. Key information is front-loaded and there is no filler or tautology.

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

Completeness5/5

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

For a one-parameter tool with no annotations and no output schema, the description supplies the output format, error behavior, supported formats, cache policy, and size bound. An agent has everything needed to decide whether and how to call it correctly.

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

Parameters3/5

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

Schema coverage is 100% for the single parameter, including absolute/relative path semantics. The description doesn't add parameter-level detail, but none is needed given the schema already fully documents `path`. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb ('read'), resource ('image file'), and purpose ('so the model can see it'). It clearly separates itself from sibling `read` by restricting to images. This is unambiguous.

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

Usage Guidelines5/5

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

Explicitly says 'Use this only when the model needs to view the image; for text or any other file type use `read`.' This gives both a clear condition and an alternative tool. Additional format and size notes reinforce correct selection.

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

statsStatsA

Report cache health, token savings, and runtime diagnostics.

Returns storage occupancy (files, tokens, documents, DB size), session and lifetime token savings and cache hit rates, per-tool call counts, and process memory. Use it to measure or debug — not as a routine step in read/edit loops. Takes no arguments.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral burden. It conveys a read-only, observational character through 'Report' and 'diagnostics,' and lists what the caller should expect. It does not explicitly state 'does not modify state,' but the reporting/diagnostic framing makes mutation unlikely.

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

Conciseness5/5

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

The description is compact and front-loaded with the core purpose, followed by a useful enumerative detail list and a clear usage boundary. Every sentence earns its place, and no filler or redundancy is present.

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

Completeness5/5

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

For a zero-parameter diagnostic tool with no output schema, the description is complete: it names the full return categories, explains the tool's purpose, and gives usage boundaries. An agent has enough information to select and invoke this tool correctly.

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

Parameters4/5

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

The tool has zero parameters and the schema already reflects this with an empty properties object. The description reinforces this with 'Takes no arguments,' which is sufficient; there are no parameter semantics needing explanation.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Report cache health, token savings, and runtime diagnostics.' It then enumerates the exact outputs, making the tool's purpose concrete and distinguishably diagnostic relative to siblings like read, edit, and search.

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

Usage Guidelines5/5

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

The description explicitly states when to use it: 'Use it to measure or debug' and equally explicitly when not to use it: 'not as a routine step in read/edit loops.' This gives clear, actionable usage guidance without requiring inference.

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

warmWarmA

Index files into the cache so grep and search can see them, returning counts only.

Costs a few dozen tokens however many files it indexes: no content, no previews, no paths for the files that succeeded — just how many were indexed, how many were already current, and how many were not.

Anything not indexed is counted in skipped, and the first few come back under failures with a reason (not_found, not_a_file, binary, too_large, unreadable, timeout). If a cap stopped the walk early you get truncated or incomplete rather than a short count that looks complete.

Use it before searching an unfamiliar tree, then grep for the exact string or search for the concept, and read only what those name.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYesFiles to index — a comma-separated list, a JSON array, or glob patterns (expanded for you, e.g. `src/**/*.py`).
max_filesNoCap on files indexed in this call. Matches beyond it are left out and flagged with `truncated`.

TDQS

A4.9/5.0
Behavior5/5

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 does this thoroughly: no content/previews/paths returned, counts-only output, token cost, failure reason categories, and truncated/incomplete behavior when a cap stops the walk. This is unusually transparent about side effects and edge cases.

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

Conciseness5/5

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

Though longer than average, every sentence earns its place: core purpose, cost, output restrictions, failure semantics, and usage workflow. The structure is front-loaded with the essential definition and uses clear paragraphing and lists of error reasons, making it scannable for an agent.

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

Completeness5/5

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

Despite having no output schema, the description fully compensates by explaining what the agent will get back: counts of indexed/current/not-indexed files, skipped counts, failure reasons, and truncated/incomplete flags. Combined with the complete input schema and usage guidance, nothing necessary for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining the significance of max_files behavior ('If a cap stopped the walk early you get `truncated` or `incomplete`') and listing concrete failure reasons such as `not_found`, `not_a_file`, `binary`, and `too_large` that map to path-related outcomes. This enriches the parameter semantics beyond the schema's basic descriptions.

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

Purpose5/5

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

The first sentence states a specific verb and resource: 'Index files into the cache so `grep` and `search` can see them, returning counts only.' This clearly distinguishes warm from read, search, grep, and other siblings by positioning it as a cache-warming pre-step rather than a retrieval or content tool.

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

Usage Guidelines5/5

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

The final paragraph explicitly tells the agent when and how to use the tool: 'Use it before searching an unfamiliar tree, then `grep` for the exact string or `search` for the concept, and `read` only what those name.' This gives concrete workflow context and names the related sibling tools, satisfying the when-to-use and alternatives requirement.

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

writeWriteA

Create a file or replace its entire contents.

Use this for new files or full rewrites; for localized changes prefer edit or batch_edit. Status is created for a new path or updated for an existing one; an update reports diff_state, and includes the diff against the previous content only when you ask with show_diff. A dry_run writes nothing and says so: the status is would_create/would_update and dry_run: true comes back with it. Writing refreshes the cache so later reads, grep, and search see the new text.

A full write supplies the whole file, so the content_hash it returns is claimable. An append only adds a tail: pass known_hash to show you held the rest, or you get file_hash instead. auto_format reports file_hash too — the formatter's output is not what you sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path to create or replace (absolute, or relative to root).
appendNoAppend `content` to the end of the file instead of overwriting.
contentYesFull file content, or the text to append when `append=true`.
dry_runNoPreview the result without writing.
show_diffNoReturn the unified diff even on a deterministic write.
known_hashNoThe `content_hash` you hold for this file. Only needed for `append`, to prove you hold the part you are not resending.
auto_formatNoRun the formatter after writing.
create_parentsNoCreate any missing parent directories.

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and fully delivers. It discloses returned status values (`created`, `updated`, `would_create`, `would_update`), the `dry_run: true` signal, cache-refresh side effects, and the different hash-return behavior for full writes, appends, and `auto_format`. This is far more than a generic mutation description.

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

Conciseness5/5

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

The description is front-loaded with the core purpose and usage rule, then organized into hash and side-effect semantics. Despite its length, every sentence adds operational detail that an agent needs, and none merely repeats the schema.

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

Completeness5/5

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

For a complex tool with 8 parameters, no output schema, and no annotations, the description is exceptionally complete. It explains the outcome variants, return-value semantics for diff, dry-run, append, and auto_format, and side effects on the cache. No critical behavioral dimension is left for the agent to infer.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful semantics beyond the schema by explaining how `known_hash`, `show_diff`, `dry_run`, `append`, and `auto_format` affect the response and the claimability of hashes. It earns a 4, though a full parameter-by-parameter walkthrough is not needed given the schema already documents each field.

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

Purpose5/5

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

The description opens with a precise verb and resource: 'Create a file or replace its entire contents.' It explicitly distinguishes this tool from siblings by saying localized changes should use `edit` or `batch_edit`, so an agent can immediately tell which tool fits.

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

Usage Guidelines5/5

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

It clearly states when to use `write` ('new files or full rewrites') and when not to use it ('for localized changes prefer `edit` or `batch_edit`'). It also explains the append path and dry-run behavior, giving the agent actionable routing and usage context beyond the schema.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 14 tool updatesv0.6.0
    • Changedbatch_edit2 fields changed
      • addedInput schema / properties / known_hash
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The `content_hash` from your last read of this file. Proves\nyou hold the text being edited, so the result can be handed back as\na claimable `content_hash`."
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "content_hash": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Content Hash"
        -    },
        -    "diff": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Diff"
        -    },
        -    "diff_omitted": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Diff Omitted"
        -    },
        -    "diff_state": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Diff State"
        -    },
        -    "diff_stats": {
        -      "anyOf": [
        -        {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Diff Stats"
        -    },
        -    "failed": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Failed"
        -    },
        -    "failures": {
        -      "anyOf": [
        -        {
        -          "items": {
        -            "properties": {
        -              "error": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Error"
        -              },
        -              "old": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Old"
        -              },
        -              "truncated": {
        -                "anyOf": [
        -                  {
        -                    "type": "boolean"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Truncated"
        -              }
        -            },
        -            "title": "BatchEditFailure",
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Failures"
        -    },
        -    "from_cache": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "From Cache"
        -    },
        -    "outcomes": {
        -      "anyOf": [
        -        {
        -          "items": {
        -            "properties": {
        -              "error": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Error"
        -              },
        -              "line_number": {
        -                "anyOf": [
        -                  {
        -                    "type": "integer"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Line Number"
        -              },
        -              "new": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "New"
        -              },
        -              "old": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Old"
        -              },
        -              "success": {
        -                "anyOf": [
        -                  {
        -                    "type": "boolean"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Success"
        -              },
        -              "truncated": {
        -                "anyOf": [
        -                  {
        -                    "type": "boolean"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Truncated"
        -              }
        -            },
        -            "title": "BatchEditOutcome",
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Outcomes"
        -    },
        -    "params": {
        -      "anyOf": [
        -        {
        -          "properties": {
        -            "auto_format": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Auto Format"
        -            },
        -            "dry_run": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Dry Run"
        -            },
        -            "show_diff": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Show Diff"
        -            },
        -            "truncated": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Truncated"
        -            }
        -          },
        -          "title": "BatchEditParams",
        -          "type": "object"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null
        -    },
        -    "path": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Path"
        -    },
        -    "status": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Status"
        -    },
        -    "succeeded": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Succeeded"
        -    },
        -    "tokens_saved": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Tokens Saved"
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    }
        -  },
        -  "title": "BatchEditResponse",
        -  "type": "object"
        -}New value: +null
    • Changedbatch_read3 fields changed
      • addedInput schema / properties / known_hashes
        Added value: +{
        +  "default": "",
        +  "description": "JSON object mapping a path to the `content_hash` you\nstill hold for it, e.g. `{\"src/a.py\": \"8f3c...\"}`. Any file you\ncannot vouch for this way is sent in full.",
        +  "type": "string"
        +}
      • changedInput schema / properties / priority / description
        Previous value: -"Optional paths to read first, ahead of the remaining files."New value: +"Optional paths to read first, ahead of the remaining files.\nOrdering only — a priority file still has to fit the budget, and is\nskipped like any other when it does not."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "files": {
        -      "anyOf": [
        -        {
        -          "items": {
        -            "properties": {
        -              "content": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Content"
        -              },
        -              "from_cache": {
        -                "anyOf": [
        -                  {
        -                    "type": "boolean"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "From Cache"
        -              },
        -              "hint": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Hint"
        -              },
        -              "path": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Path"
        -              },
        -              "status": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Status"
        -              },
        -              "tokens": {
        -                "anyOf": [
        -                  {
        -                    "type": "integer"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Tokens"
        -              },
        -              "truncated": {
        -                "anyOf": [
        -                  {
        -                    "type": "boolean"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Truncated"
        -              }
        -            },
        -            "title": "BatchReadFile",
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Files"
        -    },
        -    "skipped": {
        -      "anyOf": [
        -        {
        -          "items": {
        -            "properties": {
        -              "est_tokens": {
        -                "anyOf": [
        -                  {
        -                    "type": "integer"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Est Tokens"
        -              },
        -              "hint": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Hint"
        -              },
        -              "path": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Path"
        -              },
        -              "truncated": {
        -                "anyOf": [
        -                  {
        -                    "type": "boolean"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Truncated"
        -              }
        -            },
        -            "title": "BatchReadSkipped",
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Skipped"
        -    },
        -    "summary": {
        -      "anyOf": [
        -        {
        -          "properties": {
        -            "files_read": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Files Read"
        -            },
        -            "files_skipped": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Files Skipped"
        -            },
        -            "hint": {
        -              "anyOf": [
        -                {
        -                  "type": "string"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Hint"
        -            },
        -            "tokens_saved": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Tokens Saved"
        -            },
        -            "total_tokens": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Total Tokens"
        -            },
        -            "truncated": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Truncated"
        -            },
        -            "unchanged": {
        -              "anyOf": [
        -                {
        -                  "items": {
        -                    "type": "string"
        -                  },
        -                  "type": "array"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Unchanged"
        -            },
        -            "unchanged_count": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Unchanged Count"
        -            }
        -          },
        -          "title": "BatchReadSummary",
        -          "type": "object"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    }
        -  },
        -  "title": "BatchReadResponse",
        -  "type": "object"
        -}New value: +null
    • Changedclear1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "count": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Count"
        -    },
        -    "output_mode": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Output Mode"
        -    },
        -    "status": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Status"
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    }
        -  },
        -  "title": "ClearResponse",
        -  "type": "object"
        -}New value: +null
    • Changeddelete1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "cache_removed": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Cache Removed"
        -    },
        -    "deleted": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Deleted"
        -    },
        -    "dry_run": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Dry Run"
        -    },
        -    "path": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Path"
        -    },
        -    "status": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Status"
        -    },
        -    "symlink": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Symlink"
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    }
        -  },
        -  "title": "DeleteResponse",
        -  "type": "object"
        -}New value: +null
    • Changededit2 fields changed
      • addedInput schema / properties / known_hash
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The `content_hash` from your last read of this file. Proves\nyou hold the text being edited, so the result can be handed back as\na claimable `content_hash`."
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "content_hash": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Content Hash"
        -    },
        -    "diff": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Diff"
        -    },
        -    "diff_omitted": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Diff Omitted"
        -    },
        -    "diff_state": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Diff State"
        -    },
        -    "diff_stats": {
        -      "anyOf": [
        -        {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Diff Stats"
        -    },
        -    "from_cache": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "From Cache"
        -    },
        -    "line_numbers": {
        -      "anyOf": [
        -        {
        -          "items": {
        -            "type": "integer"
        -          },
        -          "type": "array"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Line Numbers"
        -    },
        -    "params": {
        -      "anyOf": [
        -        {
        -          "properties": {
        -            "auto_format": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Auto Format"
        -            },
        -            "dry_run": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Dry Run"
        -            },
        -            "replace_all": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Replace All"
        -            },
        -            "show_diff": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Show Diff"
        -            },
        -            "truncated": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Truncated"
        -            }
        -          },
        -          "title": "EditParams",
        -          "type": "object"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null
        -    },
        -    "path": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Path"
        -    },
        -    "replaced": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Replaced"
        -    },
        -    "status": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Status"
        -    },
        -    "tokens_saved": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Tokens Saved"
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    }
        -  },
        -  "title": "EditResponse",
        -  "type": "object"
        -}New value: +null
    • Changededit_preview1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "context": {
        -      "anyOf": [
        -        {
        -          "items": {
        -            "properties": {
        -              "line": {
        -                "anyOf": [
        -                  {
        -                    "type": "integer"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Line"
        -              },
        -              "snippet": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Snippet"
        -              },
        -              "truncated": {
        -                "anyOf": [
        -                  {
        -                    "type": "boolean"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Truncated"
        -              }
        -            },
        -            "title": "EditPreviewMatch",
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Context"
        -    },
        -    "found": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Found"
        -    },
        -    "line_numbers": {
        -      "anyOf": [
        -        {
        -          "items": {
        -            "type": "integer"
        -          },
        -          "type": "array"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Line Numbers"
        -    },
        -    "match_count": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Match Count"
        -    },
        -    "path": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Path"
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    }
        -  },
        -  "title": "EditPreviewResponse",
        -  "type": "object"
        -}New value: +null
    • Changedglob1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "cached_count": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Cached Count"
        -    },
        -    "directory": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Directory"
        -    },
        -    "matches": {
        -      "anyOf": [
        -        {
        -          "items": {
        -            "properties": {
        -              "cached": {
        -                "anyOf": [
        -                  {
        -                    "type": "boolean"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Cached"
        -              },
        -              "mtime": {
        -                "anyOf": [
        -                  {
        -                    "type": "number"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Mtime"
        -              },
        -              "path": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Path"
        -              },
        -              "tokens": {
        -                "anyOf": [
        -                  {
        -                    "type": "integer"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Tokens"
        -              },
        -              "truncated": {
        -                "anyOf": [
        -                  {
        -                    "type": "boolean"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Truncated"
        -              }
        -            },
        -            "title": "GlobMatch",
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Matches"
        -    },
        -    "pattern": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Pattern"
        -    },
        -    "total_cached_tokens": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Total Cached Tokens"
        -    },
        -    "total_matches": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Total Matches"
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    }
        -  },
        -  "title": "GlobResponse",
        -  "type": "object"
        -}New value: +null
    • Changedgrep4 fields changed
      • changedInput schema / properties / context_lines / description
        Previous value: -"Lines of surrounding context to include per match."New value: +"Lines of surrounding context to include around each\nmatch. Overlapping windows are merged, so no line is sent twice."
      • addedInput schema / properties / output
        Added value: +{
        +  "default": "matches",
        +  "description": "How much to return — `matches` (default), `paths` for the\nmatching files without their lines, or `count` for the totals\nalone.",
        +  "type": "string"
        +}
      • changedInput schema / properties / path / description
        Previous value: -"Optional filter — an exact path, a path suffix, or a glob."New value: +"Optional filter — an exact path, a path suffix, a directory\n(matching every cached file beneath it), or a glob."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "case_sensitive": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Case Sensitive"
        -    },
        -    "context_lines": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Context Lines"
        -    },
        -    "files": {
        -      "anyOf": [
        -        {
        -          "items": {
        -            "properties": {
        -              "count": {
        -                "anyOf": [
        -                  {
        -                    "type": "integer"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Count"
        -              },
        -              "matches": {
        -                "anyOf": [
        -                  {
        -                    "items": {
        -                      "properties": {
        -                        "after": {
        -                          "anyOf": [
        -                            {
        -                              "items": {
        -                                "type": "string"
        -                              },
        -                              "type": "array"
        -                            },
        -                            {
        -                              "type": "null"
        -                            }
        -                          ],
        -                          "default": null,
        -                          "title": "After"
        -                        },
        -                        "before": {
        -                          "anyOf": [
        -                            {
        -                              "items": {
        -                                "type": "string"
        -                              },
        -                              "type": "array"
        -                            },
        -                            {
        -                              "type": "null"
        -                            }
        -                          ],
        -                          "default": null,
        -                          "title": "Before"
        -                        },
        -                        "line": {
        -                          "anyOf": [
        -                            {
        -                              "type": "string"
        -                            },
        -                            {
        -                              "type": "null"
        -                            }
        -                          ],
        -                          "default": null,
        -                          "title": "Line"
        -                        },
        -                        "line_number": {
        -                          "anyOf": [
        -                            {
        -                              "type": "integer"
        -                            },
        -                            {
        -                              "type": "null"
        -                            }
        -                          ],
        -                          "default": null,
        -                          "title": "Line Number"
        -                        },
        -                        "truncated": {
        -                          "anyOf": [
        -                            {
        -                              "type": "boolean"
        -                            },
        -                            {
        -                              "type": "null"
        -                            }
        -                          ],
        -                          "default": null,
        -                          "title": "Truncated"
        -                        }
        -                      },
        -                      "title": "GrepMatch",
        -                      "type": "object"
        -                    },
        -                    "type": "array"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Matches"
        -              },
        -              "path": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Path"
        -              },
        -              "truncated": {
        -                "anyOf": [
        -                  {
        -                    "type": "boolean"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Truncated"
        -              }
        -            },
        -            "title": "GrepFile",
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Files"
        -    },
        -    "files_matched": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Files Matched"
        -    },
        -    "fixed_string": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Fixed String"
        -    },
        -    "path": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Path"
        -    },
        -    "pattern": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Pattern"
        -    },
        -    "total_matches": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Total Matches"
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    },
        -    "truncated_files": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated Files"
        -    },
        -    "truncated_matches": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated Matches"
        -    }
        -  },
        -  "title": "GrepResponse",
        -  "type": "object"
        -}New value: +null
    • Changedread4 fields changed
      • changedInput schema / properties / known_hash / description
        Previous value: -"The `content_hash` from your last read of this file; pass it\nback to get `\"unchanged\"` instead of the content re-sent. Omit only\non a first read or when you no longer hold the hash."New value: +"The `content_hash` from your last read of this file — or the\n`coverage_token` from your last ranged read of it — passed back to\nget `\"unchanged\"` instead of the content re-sent. Omit only on a\nfirst read, or when you no longer hold what it vouches for."
      • addedInput schema / properties / line_numbers
        Added value: +{
        +  "default": false,
        +  "description": "Prefix each line of a ranged read with its number. Costs\nabout 17% more tokens; the range is in `lines` either way. Requires\n`offset` or `limit`.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / outline
        Added value: +{
        +  "default": false,
        +  "description": "Return the file's definitions and their line numbers instead\nof its text. Cannot be combined with `offset`/`limit`.",
        +  "type": "boolean"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "content": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Content"
        -    },
        -    "content_hash": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Content Hash"
        -    },
        -    "from_cache": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "From Cache"
        -    },
        -    "hint": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Hint"
        -    },
        -    "is_binary": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Is Binary"
        -    },
        -    "is_diff": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Is Diff"
        -    },
        -    "lines": {
        -      "anyOf": [
        -        {
        -          "properties": {
        -            "end": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "End"
        -            },
        -            "start": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Start"
        -            },
        -            "total": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Total"
        -            },
        -            "truncated": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Truncated"
        -            }
        -          },
        -          "title": "ReadLineRange",
        -          "type": "object"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null
        -    },
        -    "mime": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Mime"
        -    },
        -    "params": {
        -      "anyOf": [
        -        {
        -          "properties": {
        -            "diff_mode": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Diff Mode"
        -            },
        -            "limit": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Limit"
        -            },
        -            "max_size": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Max Size"
        -            },
        -            "offset": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Offset"
        -            },
        -            "truncated": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Truncated"
        -            }
        -          },
        -          "title": "ReadParams",
        -          "type": "object"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null
        -    },
        -    "path": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Path"
        -    },
        -    "size": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Size"
        -    },
        -    "tokens_original": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Tokens Original"
        -    },
        -    "tokens_returned": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Tokens Returned"
        -    },
        -    "tokens_saved": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Tokens Saved"
        -    },
        -    "total_lines": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Total Lines"
        -    },
        -    "total_tokens": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Total Tokens"
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    },
        -    "unchanged": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Unchanged"
        -    }
        -  },
        -  "title": "ReadResponse",
        -  "type": "object"
        -}New value: +null
    • Changedread_image1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "mime": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Mime"
        -    },
        -    "path": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Path"
        -    },
        -    "size": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Size"
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    }
        -  },
        -  "title": "ReadImageResponse",
        -  "type": "object"
        -}New value: +null
    • Changedsearch2 fields changed
      • changedInput schema / properties / directory / description
        Previous value: -"Restrict matches to files under this directory."New value: +"Restrict matches to files under this directory. Defaults to\nthe project root."
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "cached_files": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Cached Files"
        -    },
        -    "count": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Count"
        -    },
        -    "directory": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Directory"
        -    },
        -    "files_searched": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Files Searched"
        -    },
        -    "k": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "K"
        -    },
        -    "matches": {
        -      "anyOf": [
        -        {
        -          "items": {
        -            "properties": {
        -              "path": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Path"
        -              },
        -              "preview": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Preview"
        -              },
        -              "similarity": {
        -                "anyOf": [
        -                  {
        -                    "type": "number"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Similarity"
        -              },
        -              "tokens": {
        -                "anyOf": [
        -                  {
        -                    "type": "integer"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Tokens"
        -              },
        -              "truncated": {
        -                "anyOf": [
        -                  {
        -                    "type": "boolean"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ],
        -                "default": null,
        -                "title": "Truncated"
        -              }
        -            },
        -            "title": "SearchMatch",
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Matches"
        -    },
        -    "query": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Query"
        -    },
        -    "show_preview": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Show Preview"
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    }
        -  },
        -  "title": "SearchResponse",
        -  "type": "object"
        -}New value: +null
    • Changedstats1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "lifetime": {
        -      "anyOf": [
        -        {
        -          "properties": {
        -            "cache_hits": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Cache Hits"
        -            },
        -            "cache_misses": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Cache Misses"
        -            },
        -            "files_edited": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Files Edited"
        -            },
        -            "files_read": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Files Read"
        -            },
        -            "files_written": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Files Written"
        -            },
        -            "hit_rate_pct": {
        -              "anyOf": [
        -                {
        -                  "type": "number"
        -                },
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Hit Rate Pct"
        -            },
        -            "tokens_original": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Tokens Original"
        -            },
        -            "tokens_returned": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Tokens Returned"
        -            },
        -            "tokens_saved": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Tokens Saved"
        -            },
        -            "total_sessions": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Total Sessions"
        -            },
        -            "truncated": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Truncated"
        -            }
        -          },
        -          "title": "StatsLifetime",
        -          "type": "object"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null
        -    },
        -    "mode": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Mode"
        -    },
        -    "process_rss_mb": {
        -      "anyOf": [
        -        {
        -          "type": "number"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Process Rss Mb"
        -    },
        -    "session": {
        -      "anyOf": [
        -        {
        -          "properties": {
        -            "cache_hits": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Cache Hits"
        -            },
        -            "cache_misses": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Cache Misses"
        -            },
        -            "diffs_served": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Diffs Served"
        -            },
        -            "files_edited": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Files Edited"
        -            },
        -            "files_read": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Files Read"
        -            },
        -            "files_written": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Files Written"
        -            },
        -            "hit_rate_pct": {
        -              "anyOf": [
        -                {
        -                  "type": "number"
        -                },
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Hit Rate Pct"
        -            },
        -            "tokens_original": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Tokens Original"
        -            },
        -            "tokens_returned": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Tokens Returned"
        -            },
        -            "tokens_saved": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Tokens Saved"
        -            },
        -            "tool_calls": {
        -              "anyOf": [
        -                {
        -                  "additionalProperties": {
        -                    "type": "integer"
        -                  },
        -                  "type": "object"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Tool Calls"
        -            },
        -            "truncated": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Truncated"
        -            },
        -            "uptime_s": {
        -              "anyOf": [
        -                {
        -                  "type": "number"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Uptime S"
        -            }
        -          },
        -          "title": "StatsSession",
        -          "type": "object"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null
        -    },
        -    "storage": {
        -      "anyOf": [
        -        {
        -          "properties": {
        -            "db_size_mb": {
        -              "anyOf": [
        -                {
        -                  "type": "number"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Db Size Mb"
        -            },
        -            "files_cached": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Files Cached"
        -            },
        -            "total_documents": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Total Documents"
        -            },
        -            "total_tokens_cached": {
        -              "anyOf": [
        -                {
        -                  "type": "integer"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Total Tokens Cached"
        -            },
        -            "truncated": {
        -              "anyOf": [
        -                {
        -                  "type": "boolean"
        -                },
        -                {
        -                  "type": "null"
        -                }
        -              ],
        -              "default": null,
        -              "title": "Truncated"
        -            }
        -          },
        -          "title": "StatsStorage",
        -          "type": "object"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    }
        -  },
        -  "title": "StatsResponse",
        -  "type": "object"
        -}New value: +null
    • Addedwarm
    • Changedwrite2 fields changed
      • addedInput schema / properties / known_hash
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The `content_hash` you hold for this file. Only needed for\n`append`, to prove you hold the part you are not resending."
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "bytes_written": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Bytes Written"
        -    },
        -    "content_hash": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Content Hash"
        -    },
        -    "created": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Created"
        -    },
        -    "diff": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Diff"
        -    },
        -    "diff_omitted": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Diff Omitted"
        -    },
        -    "diff_state": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Diff State"
        -    },
        -    "diff_stats": {
        -      "anyOf": [
        -        {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Diff Stats"
        -    },
        -    "dry_run": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Dry Run"
        -    },
        -    "from_cache": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "From Cache"
        -    },
        -    "path": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Path"
        -    },
        -    "status": {
        -      "anyOf": [
        -        {
        -          "type": "string"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Status"
        -    },
        -    "tokens_saved": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Tokens Saved"
        -    },
        -    "tokens_written": {
        -      "anyOf": [
        -        {
        -          "type": "integer"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Tokens Written"
        -    },
        -    "truncated": {
        -      "anyOf": [
        -        {
        -          "type": "boolean"
        -        },
        -        {
        -          "type": "null"
        -        }
        -      ],
        -      "default": null,
        -      "title": "Truncated"
        -    }
        -  },
        -  "title": "WriteResponse",
        -  "type": "object"
        -}New value: +null
  2. 12 tool updatesv0.5.1
    • Changedbatch_edit5 fields changed
      • addedInput schema / properties / auto_format / description
        Added value: +"Run the formatter after all edits."
      • addedInput schema / properties / dry_run / description
        Added value: +"Preview without writing."
      • addedInput schema / properties / edits / description
        Added value: +"JSON array of edit entries, in any of the forms above."
      • addedInput schema / properties / path / description
        Added value: +"File path to modify (absolute, or relative to root)."
      • addedInput schema / properties / show_diff / description
        Added value: +"Return the full diff even on a deterministic all-success batch."
    • Changedbatch_read3 fields changed
      • addedInput schema / properties / max_total_tokens / description
        Added value: +"Total token budget shared across the whole batch."
      • addedInput schema / properties / paths / description
        Added value: +"The files to read — a comma-separated list, a JSON array, or\nglob patterns (expanded for you)."
      • addedInput schema / properties / priority / description
        Added value: +"Optional paths to read first, ahead of the remaining files."
    • Changeddelete2 fields changed
      • addedInput schema / properties / dry_run / description
        Added value: +"Preview the outcome without deleting or evicting the cache."
      • addedInput schema / properties / path / description
        Added value: +"File or symlink path (absolute, or relative to the project root)."
    • Changededit9 fields changed
      • addedInput schema / properties / auto_format / description
        Added value: +"Run the formatter after editing."
      • addedInput schema / properties / dry_run / description
        Added value: +"Preview without writing."
      • addedInput schema / properties / end_line / description
        Added value: +"1-based inclusive end line for a scoped or line-range edit."
      • addedInput schema / properties / new_string / description
        Added value: +"Replacement text (an empty string deletes the match)."
      • addedInput schema / properties / old_string / description
        Added value: +"Exact text to find. Omit only for a line-range replacement."
      • addedInput schema / properties / path / description
        Added value: +"File path to modify (absolute, or relative to root)."
      • addedInput schema / properties / replace_all / description
        Added value: +"Replace every occurrence instead of requiring a unique match."
      • addedInput schema / properties / show_diff / description
        Added value: +"Return the diff even on a deterministic edit."
      • addedInput schema / properties / start_line / description
        Added value: +"1-based inclusive start line for a scoped or line-range edit."
    • Changededit_preview2 fields changed
      • addedInput schema / properties / old_string / description
        Added value: +"Anchor text to locate. Must match exactly, including\nwhitespace and indentation. Cannot be empty."
      • addedInput schema / properties / path / description
        Added value: +"File path to search (absolute, or relative to root)."
    • Changedglob3 fields changed
      • addedInput schema / properties / cached_only / description
        Added value: +"Return only files that are already cached."
      • addedInput schema / properties / directory / description
        Added value: +"Base directory the pattern is evaluated from."
      • addedInput schema / properties / pattern / description
        Added value: +"Glob pattern to match (e.g. `src/**/*.py`)."
    • Changedgrep7 fields changed
      • addedInput schema / properties / case_sensitive / description
        Added value: +"Match case-sensitively."
      • addedInput schema / properties / context_lines / description
        Added value: +"Lines of surrounding context to include per match."
      • addedInput schema / properties / fixed_string / description
        Added value: +"Match `pattern` literally instead of as a regex."
      • addedInput schema / properties / max_files / description
        Added value: +"Cap on the number of files returned."
      • addedInput schema / properties / max_matches / description
        Added value: +"Cap on total matches returned across all files."
      • addedInput schema / properties / path / description
        Added value: +"Optional filter — an exact path, a path suffix, or a glob."
      • addedInput schema / properties / pattern / description
        Added value: +"A regular expression, or a literal string when\n`fixed_string=true`."
    • Changedread6 fields changed
      • addedInput schema / properties / known_hash
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The `content_hash` from your last read of this file; pass it\nback to get `\"unchanged\"` instead of the content re-sent. Omit only\non a first read or when you no longer hold the hash."
        +}
      • addedInput schema / properties / limit / description
        Added value: +"Number of lines to return starting at `offset`."
      • addedInput schema / properties / max_size / description
        Added value: +"Byte threshold above which the file is semantically\nsummarized; recover exact lines afterward with `offset`/`limit`."
      • addedInput schema / properties / offset / description
        Added value: +"1-based first line for a ranged read; omit or pass 0 to start\nfrom the first line."
      • addedInput schema / properties / path / description
        Added value: +"File path (absolute, or relative to the project root). Use an\nabsolute path for files outside the project root."
      • removedOutput schema / properties / semantic_match
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Semantic Match"
        -}
    • Changedread_image1 field changed
      • addedInput schema / properties / path / description
        Added value: +"Image file path (absolute, or relative to the project root)."
    • Changedsearch4 fields changed
      • addedInput schema / properties / directory / description
        Added value: +"Restrict matches to files under this directory."
      • addedInput schema / properties / k / description
        Added value: +"Maximum number of matches to return."
      • addedInput schema / properties / query / description
        Added value: +"Keywords to rank by. Natural-language phrasing is fine, but\nranking is on the individual words."
      • addedInput schema / properties / show_preview / description
        Added value: +"Include a short preview line for each match."
    • Changedstats2 fields changed
      • removedOutput schema / properties / embedding
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "properties": {
        -        "model": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "title": "Model"
        -        },
        -        "process_rss_mb": {
        -          "anyOf": [
        -            {
        -              "type": "number"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "title": "Process Rss Mb"
        -        },
        -        "provider": {
        -          "anyOf": [
        -            {
        -              "type": "string"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "title": "Provider"
        -        },
        -        "ready": {
        -          "anyOf": [
        -            {
        -              "type": "boolean"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "title": "Ready"
        -        },
        -        "truncated": {
        -          "anyOf": [
        -            {
        -              "type": "boolean"
        -            },
        -            {
        -              "type": "null"
        -            }
        -          ],
        -          "default": null,
        -          "title": "Truncated"
        -        }
        -      },
        -      "title": "StatsEmbedding",
        -      "type": "object"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null
        -}
      • addedOutput schema / properties / process_rss_mb
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Process Rss Mb"
        +}
    • Changedwrite7 fields changed
      • addedInput schema / properties / append / description
        Added value: +"Append `content` to the end of the file instead of overwriting."
      • addedInput schema / properties / auto_format / description
        Added value: +"Run the formatter after writing."
      • addedInput schema / properties / content / description
        Added value: +"Full file content, or the text to append when `append=true`."
      • addedInput schema / properties / create_parents / description
        Added value: +"Create any missing parent directories."
      • addedInput schema / properties / dry_run / description
        Added value: +"Preview the result without writing."
      • addedInput schema / properties / path / description
        Added value: +"File path to create or replace (absolute, or relative to root)."
      • addedInput schema / properties / show_diff / description
        Added value: +"Return the unified diff even on a deterministic write."
  3. 6 tool updatesv0.4.8
    • Removeddiff
    • Addededit_preview
    • Changedgrep2 fields changed
      • addedOutput schema / properties / truncated_files
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Truncated Files"
        +}
      • addedOutput schema / properties / truncated_matches
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Truncated Matches"
        +}
    • Changedread5 fields changed
      • addedOutput schema / properties / content_hash
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Content Hash"
        +}
      • addedOutput schema / properties / is_binary
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Is Binary"
        +}
      • addedOutput schema / properties / mime
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Mime"
        +}
      • addedOutput schema / properties / size
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Size"
        +}
      • addedOutput schema / properties / total_lines
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Total Lines"
        +}
    • Addedread_image
    • Removedsimilar
  4. 13 tool updatesv0.4.5
    • Addedbatch_edit
    • Addedbatch_read
    • Addedclear
    • Addeddelete
    • Addeddiff
    • Addededit
    • Addedglob
    • Addedgrep
    • Addedread
    • Addedsearch
    • Addedsimilar
    • Addedstats
    • Addedwrite
  5. 3 tool updatesv0.4.1
    • Removedclear
    • Removedread
    • Removedstats
  6. 3 tool updatesv0.4.1
    • First observedclear
    • First observedread
    • First observedstats

TDQS

A4.6/5.0

Scored across 14 tools

Disambiguation5/5

Each tool targets a clearly distinct operation — read/batch_read split single vs. multi-file, edit/batch_edit split single vs. batch edits, search/grep split semantic vs. exact matching, and the descriptions explicitly cross-reference each other (e.g., 'for several edits use batch_edit'). The hash/cache protocol tools (warm, stats, clear, edit_preview) have non-overlapping roles.

Naming Consistency4/5

Tool names mostly follow a verb or verb_object pattern with consistent snake_case (read_image, batch_read, edit_preview, batch_edit), and the batch_ prefix family is coherent. Minor deviations: 'stats' is a noun rather than verb_noun (e.g., get_stats), 'warm' is a bare verb without an object, and grep/glob are domain jargon rather than descriptive verb phrases.

Tool Count4/5

14 tools sits at the upper edge of a well-scoped set, but the broader domain (file read/write/edit plus cache indexing, search, and administration) justifies the count. Each tool has a distinct job — warm/search/grep form an indexing pipeline, read/batch_read/read_image cover consumption, and stats/clear handle cache lifecycle — so nothing feels redundant.

Completeness4/5

The cache-aware file lifecycle is fully covered: read, write, edit, batch_edit, delete, plus discovery (glob), search (grep/search), indexing (warm), and diagnostics (stats). The content_hash/known_hash protocol creates a coherent multi-step workflow with no dead ends. Minor gaps: no move/rename and no directory operations beyond glob, though those appear deliberately out of scope for a cache-centric server.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides AI coding assistants with context optimization tools including targeted file analysis, intelligent terminal command execution with LLM-powered output extraction, and web research capabilities. Helps reduce token usage by extracting only relevant information instead of processing entire files and command outputs.
    5
    39 npm
    62
    TypeScript
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Provides intelligent code context and analysis through semantic compression, AST parsing, and multi-language support. Offers 60-80% token reduction while enabling AI assistants to understand codebases through local analysis, OpenAI-enhanced insights, and GitHub repository integration.
    6
    16 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides file caching and diff tracking for AI coding agents, reducing token usage by returning changes or confirming no changes instead of full file contents on repeated reads.
    140 npm
    217
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI coding agents to query a pre-built semantic knowledge graph of code, reducing token usage and tool calls. Supports 16 tools for code exploration, analysis, and context building.
    5 npm
    7
    MIT