Skip to main content
Glama

MCP File Tools

Release Downloads Test OpenSSF Scorecard License: GPL-3.0 MCP Registry Glama score

Claude sees Настройки — not ???? or Íàñòðîéêè.

MCP server for file operations on text that isn't UTF-8. It detects the encoding from the file's bytes rather than its extension, hands the model UTF-8, and writes back in the original encoding — BOM and CRLF/LF intact, still byte-compatible with whatever legacy tool owns the file.

  • 45 encodings, read and write — Cyrillic (CP1251, KOI8-R/U, CP866/855), Windows-125x, ISO-8859-x, DOS code pages, MacRoman, UTF-16/UTF-32, CJK (GBK, Big5, Shift_JIS, EUC-JP/KR) (full list)

  • Encoding-aware across the whole tool set — edit_file, grep_text_files and search_files decode the same way, not just read and write

  • Detection you can inspect — detect_encoding reports the charset, a confidence score and any BOM, so garbled text becomes diagnosable

  • BOM and line endings are first-class — including on UTF-16, where a naive byte-level rewrite corrupts the file

  • Sandboxed — every path, symlink and junction targets included, is checked against the directories you allowed

Built for: Delphi/Pascal units with Cyrillic UI text, VB6 forms, legacy PHP/HTML with localized content, and INI or data files whose encoding you can't tell from the filename.

User: Read config.ini and change the title to "Настройки"
Claude: [read_text_file → cp1251 detected] → [edits UTF-8] → [write_file → back to cp1251]

PRs welcome and merged fast — no CLA, no style review, one-line fixes count. Forked this to fix something? Please send it back instead.

Installation

claude plugin marketplace add dimitar-grigorov/mcp-file-tools
claude plugin install mcp-file-tools

Inside a session: /plugin marketplace add … and /plugin install ….

Requires Node.js 18+ on your PATH. The launcher is a Node script and Claude Code does not bundle Node; without it /mcp shows the server as not connected.

First launch downloads the binary for your OS at a pinned version, verifies its SHA-256 and caches it. It is scoped to the folder you have open, so there is nothing to configure. For directories outside the workspace, or a machine without Node, use a manual install.

Coming from a manual install

claude mcp list                                              # find the old file-tools entry
claude mcp remove file-tools
claude plugin marketplace add dimitar-grigorov/mcp-file-tools
claude plugin install mcp-file-tools
# Old binary, once /mcp shows the plugin connected:
#   Windows      Remove-Item "$env:LOCALAPPDATA\Programs\mcp-file-tools\mcp-file-tools.exe"
#   Linux/macOS  rm ~/.local/bin/mcp-file-tools

Tool names change too: mcp__file-tools__* becomes mcp__plugin_mcp-file-tools_file-tools__*, so update your permission rules, see Auto-approve tools.

Updating the plugin

claude plugin marketplace update mcp-file-tools
claude plugin update mcp-file-tools@mcp-file-tools

Use the full plugin@marketplace id, not the bare name, or turn on auto-update in /plugin → Marketplaces.

Registries and directories

This server is listed in the Official MCP Registry for discovery by any MCP client, and indexed on Glama, which scores it A for license, quality and maintenance.

Manual install (other MCP clients, or access outside your workspace)

Download the binary for your platform, then register it with the directories it may access.

Platform

Release asset

Suggested path

Windows x64

mcp-file-tools_windows_amd64.exe

%LOCALAPPDATA%\Programs\mcp-file-tools\mcp-file-tools.exe

Linux x64

mcp-file-tools_linux_amd64

~/.local/bin/mcp-file-tools

macOS ARM64

mcp-file-tools_darwin_arm64

~/.local/bin/mcp-file-tools

Windows (PowerShell, not CMD):

mkdir -Force "$env:LOCALAPPDATA\Programs\mcp-file-tools"
iwr "https://github.com/dimitar-grigorov/mcp-file-tools/releases/latest/download/mcp-file-tools_windows_amd64.exe" -OutFile "$env:LOCALAPPDATA\Programs\mcp-file-tools\mcp-file-tools.exe"
claude mcp add --scope user file-tools -- "$env:LOCALAPPDATA\Programs\mcp-file-tools\mcp-file-tools.exe" "C:\Projects"

Linux / macOS (swap the asset name from the table for your platform):

mkdir -p ~/.local/bin
curl -L "https://github.com/dimitar-grigorov/mcp-file-tools/releases/latest/download/mcp-file-tools_linux_amd64" -o ~/.local/bin/mcp-file-tools
chmod +x ~/.local/bin/mcp-file-tools
claude mcp add --scope user file-tools -- ~/.local/bin/mcp-file-tools ~/Projects

Go install (all platforms)

# Requires Go 1.27+
go install github.com/dimitar-grigorov/mcp-file-tools/v4/cmd/mcp-file-tools@latest
# Linux / macOS
claude mcp add --scope user file-tools -- $(go env GOPATH)/bin/mcp-file-tools ~/Projects
# Windows PowerShell
claude mcp add --scope user file-tools -- "$(go env GOPATH)\bin\mcp-file-tools.exe" "C:\Projects"

Other Clients

For Claude Desktop, VSCode, or Cursor, use the downloaded binary path in your config:

Claude Desktop (%APPDATA%\Claude\claude_desktop_config.json on Windows, ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

Windows:

{
  "mcpServers": {
    "file-tools": {
      "command": "C:\\Users\\YOUR_NAME\\AppData\\Local\\Programs\\mcp-file-tools\\mcp-file-tools.exe",
      "args": ["D:\\Projects", "C:\\Users\\YOUR_NAME\\Documents"]
    }
  }
}

macOS / Linux:

{
  "mcpServers": {
    "file-tools": {
      "command": "/Users/YOUR_NAME/.local/bin/mcp-file-tools",
      "args": ["/Users/YOUR_NAME/Projects", "/Users/YOUR_NAME/Documents"]
    }
  }
}

args lists the directories the server may access — as many as you need.

VSCode / Cursor (Claude Code extension)

If you already ran claude mcp add --scope user from the installation steps above, the server is already available in VSCode — no extra config needed.

To configure separately for VSCode only:

claude mcp add --scope user file-tools -- "%LOCALAPPDATA%\Programs\mcp-file-tools\mcp-file-tools.exe" "C:\Projects"

Alternatively, create a per-project config by adding .mcp.json to your project root:

{
  "mcpServers": {
    "file-tools": {
      "type": "stdio",
      "command": "C:\\Users\\YOUR_NAME\\AppData\\Local\\Programs\\mcp-file-tools\\mcp-file-tools.exe",
      "args": ["D:\\Projects", "D:\\Other\\Directory"]
    }
  }
}

Note: type: "stdio" is required here. The VSCode extension does not add the workspace directory by itself, so args must list every directory you want reachable. Adding one later means re-running claude mcp add with the full list — it overwrites the previous config rather than appending.

OpenAI Codex CLI

Codex takes a direct MCP command, so no manual TOML editing is needed.

Windows (PowerShell):

mkdir -Force "$env:LOCALAPPDATA\Programs\mcp-file-tools"
iwr "https://github.com/dimitar-grigorov/mcp-file-tools/releases/latest/download/mcp-file-tools_windows_amd64.exe" -OutFile "$env:LOCALAPPDATA\Programs\mcp-file-tools\mcp-file-tools.exe"
codex mcp add file-tools -- "$env:LOCALAPPDATA\Programs\mcp-file-tools\mcp-file-tools.exe" "C:\Projects"

Run codex mcp list to verify it, then start a new Codex session. Add more directory arguments to grant access outside the current project.

Auto-approve tools (Claude Code)

To skip the permission prompts, add to .claude/settings.local.json in your project root:

{ "permissions": { "allow": ["mcp__plugin_mcp-file-tools_file-tools__*"] } }

That prefix is the plugin install; a manual one registered as file-tools is mcp__file-tools__* instead, and a rule with the wrong prefix matches nothing and fails quietly. Which modes the rules affect, and keeping delete_file / move_file behind a prompt, are in docs/extra.md.

Update

The server checks for updates automatically and notifies you through tool responses when a newer version is available; the notice carries the steps for your install. Plugin installs update through Updating the plugin — a re-downloaded binary is ignored there.

For a manual install, re-download the binary over the existing one — the registration does not need repeating:

  1. Close all Claude Code sessions (the binary is locked while running)

  2. Re-download:

iwr "https://github.com/dimitar-grigorov/mcp-file-tools/releases/latest/download/mcp-file-tools_windows_amd64.exe" `
    -OutFile "$env:LOCALAPPDATA\Programs\mcp-file-tools\mcp-file-tools.exe"

To disable update checks, set the environment variable MCP_NO_UPDATE_CHECK=1.

Verify & Uninstall

# Check which file-tools server is connected (plugin or manual)
claude mcp list

# Remove a manual install
claude mcp remove file-tools

# Remove the plugin
claude plugin uninstall mcp-file-tools

Related MCP server: ellmos-filecommander-mcp

How to Use

Once installed, just ask Claude:

  • "List all .pas files in this directory"

  • "Read config.ini and detect its encoding"

  • "Show all supported encodings"

  • "Read MainForm.dfm using CP1251 encoding"

Security: the server reaches only the directories you allowed. It takes them from args: ["/path/to/project"] first, then MCP_FILE_TOOLS_ALLOWED_DIRS, and failing both from the directory it was started in — the workspace, when a client launches it there. Clients that still speak the MCP roots protocol add their roots on top. A drive root or your home directory is never granted by that last fallback; name it explicitly instead. Paths are resolved before the check, so a symlink or Windows junction pointing outside is rejected rather than followed.

Tools

20 tools — every one that touches text content is encoding-aware:

Plus three prompts — audit_encodings, fix_mojibake, migrate_to_utf8 — surfaced by clients as user commands.

See TOOLS.md for detailed parameters and examples. Calls shaped like Claude Code's built-in Read/Write/Edit/Grep are accepted too — the alias layer translates them where the semantics match exactly, so a model's habits don't fail the call.

Out of scope: binary/media reading (read_media_file). This is a text tool; agents read images with their built-in tools.

Supported encodings

Every one below reads and writes. Name one explicitly via the encoding parameter, or leave it to auto-detection.

Script / region

Encodings

Unicode

UTF-8, UTF-16 LE/BE, UTF-32 LE/BE

Cyrillic

Windows-1251, KOI8-R, KOI8-U, CP866, CP855, ISO-8859-5, MacCyrillic

Western European

Windows-1252, ISO-8859-1, ISO-8859-15, MacRoman

Central European

Windows-1250, ISO-8859-2

Greek

Windows-1253, ISO-8859-7

Turkish

Windows-1254, ISO-8859-9

Baltic and Nordic

Windows-1257, ISO-8859-4, ISO-8859-10, ISO-8859-13

Hebrew, Arabic, Vietnamese, Thai

Windows-1255, 1256, 1258, 874, ISO-8859-6, ISO-8859-8

Other Latin

ISO-8859-3, ISO-8859-14, ISO-8859-16

DOS code pages

CP437, CP850, CP852

Chinese

GBK, GB18030, Big5

Japanese and Korean

Shift_JIS, EUC-JP, ISO-2022-JP, EUC-KR

Common aliases are accepted (cp1251, latin1, gb2312, tis-620, …) — list_encodings prints the whole table with aliases.

Auto-detection never guesses MacRoman, the DOS pages or the rarer ISO tables; name them explicitly. UTF-32 is found only by its BOM.

Configuration

The server can be configured via environment variables:

Variable

Description

Default

MCP_DEFAULT_ENCODING

Default encoding for write_file on new files when none specified. Existing files keep their detected encoding. Set to cp1251 to restore the pre-2.0.0 default.

utf-8

MCP_DEFAULT_LINE_ENDINGS

Line endings for write_file on new files (crlf/lf). Existing files keep their own style regardless.

unset (write unchanged)

MCP_MEMORY_THRESHOLD

Memory threshold in bytes. Files smaller are loaded into memory for faster I/O; larger files use streaming. Also affects encoding detection mode.

67108864 (64MB)

MCP_DETECTION_CANDIDATES

Comma-separated list pinning what detection may answer, in priority order — e.g. utf-8,windows-1252. See Pinning the encodings.

unset (detection unrestricted)

MCP_FILE_TOOLS_ALLOWED_DIRS

Allowed directories as an OS path list (; on Windows, : elsewhere). For clients where env is the only block you control, such as the Claude Code plugin. Overridden by args.

unset

MCP_FILE_TOOLS_NO_CWD_FALLBACK

Set to turn off granting the working directory when neither args nor MCP_FILE_TOOLS_ALLOWED_DIRS names one.

unset (fallback on)

Set them with an env block in your config (Claude Desktop example):

{
  "mcpServers": {
    "file-tools": {
      "command": "C:\\Users\\YOUR_NAME\\AppData\\Local\\Programs\\mcp-file-tools\\mcp-file-tools.exe",
      "args": ["D:\\Projects"],
      "env": {
        "MCP_DEFAULT_ENCODING": "utf-8"
      }
    }
  }
}

Pinning the encodings

Detection is a guess, and guesses have blind spots: Spanish CP1252 like MÓDULO FÍSICAMENTE ÚNICO is plausible GBK — every uppercase accent before an ASCII letter is a valid hanzi pair — so it reads back as Chinese and edits fail with "gbk cannot represent 2 characters". If you know what the repo contains, say so:

"env": { "MCP_DETECTION_CANDIDATES": "utf-8,windows-1252" }

A BOM still wins. A guess inside the list keeps its confidence; one outside it is dropped and the listed encoding that reads most like text takes over, list order breaking ties. A file that fits none of them is read as the default and reported as an ODD ENCODING in read_text_file's hint, so a stray file gets said out loud rather than guessed at. Unlisted encodings stop appearing in detect_encoding's candidates too. UTF-16/32 are named only by a BOM or the structural classifier, so listing them cannot make them a catch-all.

Legacy teams (pre-2.0.0 behaviour)

Before 2.0.0 new files defaulted to cp1251; they now default to utf-8. Existing files are unaffected — their encoding is detected and preserved — so this only matters if your team creates new non-UTF-8 files, e.g. new Delphi units with Cyrillic literals. To keep the old behaviour:

"env": { "MCP_DEFAULT_ENCODING": "cp1251" }

Commit that in the legacy repo's .mcp.json rather than setting it per machine, and everyone working in that repo gets the right default with no local setup.

Delphi 2007 and older read UTF-8 only when it carries a BOM, so a UTF-8 file without one is silently treated as ANSI. Set cp1251 (or your own ANSI code page) for such a repo and new Cyrillic literals land in the encoding the IDE expects. Files that already exist keep their own encoding either way, and no tool adds a BOM to them.

Development

Prerequisites: Go 1.27+

make test    # go test -race ./...
make lint    # go vet, go fmt, staticcheck (same pinned version as CI)
make build

test_server.go is an end-to-end smoke test over every tool, run by CI on each push:

go run test_server.go

Debugging

MCP Inspector gives a web UI for calling tools and inspecting responses (needs Node.js 18+):

npx @modelcontextprotocol/inspector go run ./cmd/mcp-file-tools -- /path/to/allowed/dir

Or pipe JSON-RPC straight to stdin:

echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | go run ./cmd/mcp-file-tools /path/to/project

Contributing

If it fits the scope and works, it gets merged. Don't ask first — just send the PR. No CLA, no style review: make test and make lint passing is enough, and tests are welcome but never required. One-line fixes and half-finished features behind a flag both count. Out of scope, or breaking a tool contract other people's agents rely on, gets a comment rather than a close. Not writing the fix yourself? Open an issue with the file, its encoding, and what the tool did.

Details in CONTRIBUTING.md. Found a way out of an allowed directory? That one goes to SECURITY.md, privately, not to an issue.

Forking

Forking is fine. That's what GPL-3.0 is for. Taking the project over is not.

GPL-3.0 is a license, not a preference. Distribute your fork in any form (public repo, release binary, registry listing, product you ship to customers) and you must:

  • Keep GPL-3.0 and LICENSE, copyright notice intact (§4, §5c)

  • Say what you changed and when, prominently (§5a)

  • Give the source to everyone you gave the binary to (§6)

WARNING

Deleting the license or the notice, relicensing as MIT or proprietary, or shipping only a binary is alicense violation, and §8 ends your rights the moment you do it.

It will be enforced, in this order: a request to comply, then a DMCA takedown plus delisting from whichever registry or marketplace carries it, then legal action. Complying costs one license file, one notice and one source link. Ask in an issue if you are unsure whether what you ship complies.

Asked, not enforced: leave the credit in — the copyright notice is the legal minimum, one line saying "Fork of mcp-file-tools" is what tells a reader where it came from. Give your fork its own name, so a registry listing under this one with the author swapped doesn't read as if the project moved and send its bugs here. And try upstream first: a PR beats carrying merge conflicts forever, and puts your name on the commit rather than in a credits list.

Credits

Ideas that started in someone else's fork and were reimplemented here:

  • @skyispainted - GBK/GB18030, JSON-string array args, edit_file retry hint

  • @haobiao - GBK/GB18030, independently

  • Hugo Rosário - merging MCP roots with CLI allowed dirs

  • @zoster81 - UTF-16 line endings and grep, path containment fixes, write durability, BOM policy, ordered concurrency

  • Mario Rial - pinning detection to known encodings, multi-pattern grep

A PR gets your name on the commit instead of this list.

License

GPL-3.0 - see LICENSE

Copyright (C) 2026 Dimitar Grigorov. Free software, distributed WITHOUT ANY WARRANTY.

Available Tools

20 tools
check_for_updatesA
Read-only

Check if a newer version of mcp-file-tools is available. Returns current version, latest version, and update instructions if outdated. Uses a cached result (max 1 GitHub API call per 30 min); force=true bypasses the cache. Call once at the start of each session.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
installMethodYes
latestVersionYes
updateMessageNo
currentVersionYes

TDQS

A5/5.0
Behavior5/5

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

The description discloses caching behavior (max 1 GitHub API call per 30 min), bypass condition, and return contents, adding context beyond the annotations (readOnlyHint, idempotentHint). It clarifies the tool's non-idempotent nature through the cache and force explanation.

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 four concise sentences, each providing distinct information: purpose, returns, caching behavior, and usage recommendation. Every sentence earns its place with no 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?

For a simple one-parameter tool with an output schema, the description covers purpose, behavior, parameters, and usage. It is fully complete without needing to describe return structure since the output schema exists.

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 only parameter 'force' is fully explained in the description as bypassing the cache, compensating for the 0% schema description coverage. This adds essential meaning beyond the bare boolean type.

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 checks for a newer version of mcp-file-tools, a specific action on a specific resource. It distinguishes this tool from sibling file operation tools by focusing on self-update functionality.

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 instructs to 'Call once at the start of each session,' providing clear when-to-use guidance. It also explains the force parameter's conditional use (bypassing cache), which helps decide when to invoke it differently.

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

convert_encodingA
Destructive

Convert files between encodings. Parameters: path (one file) OR paths (a batch — never both), to (required), from (omit to auto-detect), backup (write .bak first), dryRun (report only), allowLowConfidence, bom ("auto" default, "always", "never", "preserve"). Refuses rather than corrupting: a narrowing conversion (utf-8 to cp1251) names the characters the target lacks with line and column, and an untrusted detection names its best guess — confirm it with from, or pass allowLowConfidence=true. A source BOM is stripped before decoding; one contradicting an explicit from is an error. No-op if the file already holds the target bytes. In a batch one bad file does not stop the rest. Run dryRun over a project first. Examples: {"path": "D:\legacy\data.txt", "to": "utf-8", "backup": true} leaves data.txt.bak; {"paths": ["a.pas", "b.pas"], "to": "utf-8", "dryRun": true} previews a migration.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
bomNo
fromNo
pathNo
pathsNo
backupNo
dryRunNo
allowLowConfidenceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dryRunNo
errorsNo
hasBomYes
bomTypeNo
changedYes
messageYes
resultsNo
backupPathNo
errorCountNo
successCountNo
sourceEncodingNo
targetEncodingYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructive/readOnly/idempotent status, but the description adds rich behavior: refuses rather than corrupting, names offending characters with line/column, handles BOM stripping and contradictions, no-ops on target bytes, and continues batches after one bad file.

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 front-loads purpose, then compactly lists parameters, then adds behavioral notes and examples. Although long, every clause adds needed detail for an 8-parameter mutation tool with complex failure semantics.

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?

With an output schema present, the description need not explain return values. It covers operation, parameters, failure modes, and batch semantics, leaving nothing critical for invoking 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 description coverage is 0%, so the description must carry parameter semantics. It fully documents all 8 parameters, including path OR paths mutual exclusion, backup .bak behavior, dryRun, allowLowConfidence, and bom enum values.

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

Purpose4/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: 'Convert files between encodings.' It does not explicitly name sibling tools such as detect_encoding or manage_bom to differentiate, but the conversion action is clear from the name and description.

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

Usage Guidelines4/5

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

It gives clear operational guidance: run dryRun first, use path XOR paths (never both), omit from to auto-detect. However, it does not state when to choose this tool over sibling tools like detect_encoding or manage_bom, so sibling selection is left implicit.

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

copy_fileA

Copy one file byte for byte, keeping its encoding, BOM, line endings, permissions and mtime. Use it to back up a file before an edit or a conversion. Parameters: source (required), destination (required). Never overwrites: an existing destination is an error and nothing is written, so the same call repeated fails the second time rather than copying again. Source must be a file, a directory is refused. The destination's parent directory has to exist already (create_directory first), both paths must sit inside the allowed directories, and a relative path resolves against the directory the server was started in. Prefer move_file to relocate a file (the source stops existing), write_file to create one from new content, convert_encoding with backup=true for a .bak beside a converted file.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYes
destinationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes

TDQS

A4.9/5.0
Behavior5/5

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

The description provides rich behavioral details beyond the annotations: never overwrites, existing destination causes an error, source must be a file, destination parent must exist, paths must be inside allowed directories, and relative paths resolve against the server start directory. These are exactly the kind of non-obvious behaviors an agent needs to know. There is no contradiction with the annotations.

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

Conciseness5/5

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

The description is dense but every sentence serves a purpose: core semantics, typical use, parameter preconditions, failure behavior, path constraints, and sibling routing. It is front-loaded with the most important information and uses straightforward language without redundant filler.

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 this is a simple two-parameter copy operation with an output schema available, the description covers everything needed for correct invocation: exact behavior, preconditions, error conditions, path constraints, and alternatives. No critical information 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?

With 0% schema description coverage, the description compensates by naming both parameters and clarifying their roles: source is a required file path and destination is a required path whose parent must exist and which must not already exist. It could have described path formats more explicitly, but it adds meaningful semantics beyond the bare string 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?

The description opens with a precise action: 'Copy one file byte for byte, keeping its encoding, BOM, line endings, permissions and mtime.' This clearly identifies the resource and operation, and it distinguishes copy_file from sibling tools by emphasizing its byte-for-byte preservation semantics.

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 the primary use case ('back up a file before an edit or a conversion') and names concrete alternatives with selection criteria: prefer move_file to relocate, write_file for new content, and convert_encoding with backup=true for a .bak beside a converted file. This leaves no ambiguity about when to choose this tool.

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

create_directoryA
Idempotent

Create a directory recursively (mkdir -p). Succeeds silently if already exists. Parameter: path (required).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes

TDQS

A4.2/5.0
Behavior4/5

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

The description adds behavioral details beyond the annotations, specifically the recursive creation ('mkdir -p') and the silent success behavior if the directory already exists. These align with the idempotentHint annotation but provide concrete implementation context.

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 two sentences, front-loaded with the primary action, and contains no unnecessary words. Every sentence contributes useful information.

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 directory creation tool with idempotentHint and a known output schema, the description covers the essential behavior. It notes recursion and silent success, which are the main nuances. No additional return value explanation is needed given the output schema exists.

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

Parameters2/5

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

The description merely repeats 'Parameter: path (required)', which restates the schema without adding any new meaning. It does not explain what kind of path is expected (absolute/relative) or any constraints. Since schema coverage is 0%, the description fails to compensate.

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 function: 'Create a directory recursively (mkdir -p)'. This uses a specific verb and resource, and distinguishes it from sibling tools like write_file or delete_file.

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

Usage Guidelines4/5

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

The description provides clear context by noting it creates directories recursively and silently succeeds if the directory already exists. It does not explicitly mention alternatives, but the purpose is distinct and unambiguous given the sibling tool names.

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

delete_fileA
Destructive

Delete a file. Does not delete directories. Parameter: path (required).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint: true, so the safety profile is known. The description adds a valuable behavioral trait: 'Does not delete directories', which prevents misuse. This goes beyond the annotations without contradicting them.

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 extremely concise, consisting of two short sentences. It front-loads the main action and includes a necessary limitation without any filler, making it highly efficient.

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

Completeness4/5

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

For a simple delete tool with one parameter and a destructive annotation, the description covers the core behavior and a key limitation. It lacks details on error handling or return values, but the presence of an output schema and annotations partially fills this gap.

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

Parameters2/5

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

The input schema has 0% description coverage, and the description only restates 'Parameter: path (required)' without adding semantic detail. It does not explain the path format, whether absolute/relative, or behavior with non-existent paths, so it fails to compensate for the schema gap.

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 'Delete a file' uses a specific verb and resource, clearly stating the tool's purpose. It also distinguishes from sibling tools by explicitly noting 'Does not delete directories', which differentiates it from directory-related operations.

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

Usage Guidelines4/5

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

The description provides a clear usage constraint by stating the tool does not delete directories, implying it should be used only for files. However, it does not explicitly name alternative tools for directory deletion, so it lacks a direct comparison but still gives useful context.

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

detect_encodingA
Read-only

Auto-detect file encoding with confidence score (0-100) and BOM detection. ALWAYS use this first when encountering garbled text or � characters. Use before read_text_file to determine the correct encoding. Parameters: path (required), mode (sample=fast default, chunked=thorough, full=entire file). When the answer is in doubt the result also ranks candidates, all of them usable; retry the read with one and ask the user if two are plausible. A file the detector cannot place is refused rather than guessed at, with the same ranking in the error.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
has_bomYes
encodingYes
candidatesNo
confidenceYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only give the safety profile (readOnlyHint, openWorldHint, idempotentHint); the description adds substantive behavior beyond that: confidence scoring, BOM detection, candidate ranking on ambiguous files, and refusal-with-ranking for undetectable files instead of guessing. This is exactly the kind of non-obvious behavior an agent needs.

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

Conciseness4/5

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

Front-loaded with purpose, then usage, then parameters, then edge-case behavior — a logical order with no filler. Slightly sprawling: the inline 'Parameters:' enumeration interrupts the prose and the final sentence about refused files is dense, but nothing is expendable.

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

Completeness5/5

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

An output schema exists, so return values needn't be explained, yet the description still covers result shape (confidence, ranked candidates) and error behavior. For a read-only detector callable from many contexts, this is complete.

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 description coverage is 0% and mode has no enum, so the description carries the whole burden — and it does: path marked required, and all three mode values explained semantically (sample=fast default, chunked=thorough, full=entire file). No gap remains.

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?

Starts with a specific verb+resource ('Auto-detect file encoding') and immediately names the two distinguishing outputs (confidence score 0-100, BOM detection). An agent can tell this apart from siblings like get_file_info or read_text_file 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?

Explicit trigger ('ALWAYS use this first when encountering garbled text or characters') plus explicit sequencing against a named sibling ('Use before read_text_file to determine the correct encoding'). Also covers the ambiguous-result path: retry the read with a ranked candidate, ask the user if two are plausible.

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

edit_fileA
Destructive

Edit one file with replacements or a unified diff. Returns a unified diff and keeps the file's encoding and line endings. PREFER THIS over read+write to modify a file. In 'ask before edits' mode call dryRun=true first, show the diff, then dryRun=false once the user confirms; with auto-edit permissions go straight to dryRun=false. On no match, prefer fixing oldText from the closest-content hint. Alternatively retry that edit with similarity (0.0-1.0) for whitespace/comment drift, not different code. Do NOT re-read the file afterwards to verify: a success with a diff means the edit is on disk, a failed edit changes nothing. A file with mixed line endings is repaired to its dominant style; the result says how many endings changed, so report that to the user. Parameters: path; exactly one of edits [{oldText, newText, similarity?, replaceAll?}] or patch (---/+++/@@ unified diff for one file); dryRun (default false); encoding (auto); expectedHash (the contentHash of the read this edit is based on — the edit fails and changes nothing if the file has since changed). oldText must match ONE place: several matches fail with their line numbers and change nothing — add surrounding lines to pick one, or set replaceAll: true to change them all and report the count to the user. Edits apply in order. Matching ignores per-line leading/trailing whitespace and CRLF/LF, but interior spacing must match; newText is re-indented. Example: {"path": "D:\src\unit1.pas", "edits": [{"oldText": "i: Integer;", "newText": "i: NativeInt;"}, {"oldText": "for i := 0 to 10 do", "newText": "for i := 0 to 20 do"}], "dryRun": true}

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
editsNo
patchNo
dryRunNo
encodingNo
expectedHashNo
forceWritableNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered, yet the description still adds major context: atomicity ('a failed edit changes nothing'), encoding/line-ending preservation, mixed-ending repair with a reported count, ordered application, and exact match/failure semantics.

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

Conciseness4/5

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

Front-loads the preference and the dryRun workflow, then flows into matching and parameter details. Dense and largely earns its length, though it is overloaded for a single paragraph.

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

Completeness4/5

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

For a 7-parameter mutation tool with no output schema and an unusual input shape, coverage is strong: behavior, failure modes, concurrency guard, and matching rules are all stated. Missing only forceWritable and any hint of the exact diff return shape.

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 0%, so the description carries the burden and documents path, the edits shape (oldText/newText/similarity/replaceAll), patch format, dryRun default, encoding auto, and expectedHash concurrency semantics. The only gap is that the schema's forceWritable parameter is never mentioned.

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 precise verb+resource ('Edit one file with replacements or a unified diff') and explicitly distinguishes itself from the read+write approach with 'PREFER THIS over read+write'.

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

Usage Guidelines5/5

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

Gives an explicit workflow for 'ask before edits' vs auto-edit permissions, tells when to use similarity vs different code, when to add surrounding lines vs replaceAll, and forbids re-reading to verify.

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

get_file_infoA
Read-only

Get file/directory metadata: size, timestamps, permissions, type. Use this to check file size before reading large files with read_text_file. Parameter: path (required).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
sizeYes
isFileYes
createdYes
accessedYes
modifiedYes
isDirectoryYes
permissionsYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds that it returns specific metadata fields and warns about large files, but it doesn't discuss error handling, path existence, or directory-specific behavior. This is modest added context, appropriate given the low bar set by annotations.

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 two sentences, front-loaded with the primary function and metadata types. It includes a practical usage hint and parameter mention without any waste, achieving maximum conciseness.

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

Completeness4/5

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

Given the tool's simplicity (one parameter, read-only, output schema present), the description covers the main metadata returned and a key use case. It doesn't elaborate on edge cases, but the output schema and annotations fill some gaps, making it fairly complete for the tool's complexity.

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

Parameters2/5

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

The schema only provides a required string 'path' with no semantic detail, and the description merely repeats 'path (required)' without explaining accepted formats, relative vs absolute paths, or how directories versus files are handled. With 0% schema coverage, the description fails to compensate sufficiently.

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 retrieves file/directory metadata (size, timestamps, permissions, type), which is a specific verb plus resource. It distinguishes itself from content-reading tools like read_text_file by focusing on metadata rather than file contents.

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

Usage Guidelines4/5

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

It gives an explicit use case: 'Use this to check file size before reading large files with read_text_file.' This names an alternative tool and specifies a scenario. It doesn't explicitly mention when not to use, but the guidance is clear and actionable.

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

grep_text_filesA
Read-only

Regex search in file contents with encoding support. PREFER THIS over built-in Grep for non-UTF-8 files. Skips .gitignore'd files (respectGitignore=false to include). Parameters: pattern (regex) or patterns (array), paths (array of files, or dirs searched recursively), caseSensitive (default true), contextBefore/After, maxMatches (default 1000), offset, include/includes, exclude/excludes, encoding. patterns finds ANY of several regexes in ONE pass — sweeping a codebase for a list of names is one call, not one per name. outputMode: "content" (default, matching lines), "files_with_matches" (paths only, far cheaper when you just need WHICH files), "count" (matching lines per file). contextBefore/After apply to content mode only. matchesOnly=true returns the matched substring instead of the whole line, for extracting values — with patterns it also tells you which one hit. offset skips the first N results, so you can page past maxMatches; the response echoes nextOffset when truncated. Include and exclude patterns are basename-only globs; {a,b} alternatives work and a leading **/ is ignored. Includes match any pattern and excludes reject any match. Do not combine a singular field with its plural. Example: {"patterns": ["TCustomer", "TOrder"], "paths": ["D:\proj\src"], "includes": [".pas", ".dfm"], "outputMode": "files_with_matches"}

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYes
offsetNo
excludeNo
includeNo
patternNo
encodingNo
excludesNo
includesNo
patternsNo
maxMatchesNo
outputModeNo
matchesOnlyNo
contextAfterNo
caseSensitiveNo
contextBeforeNo
respectGitignoreNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
hintNo
filesNo
countsNo
matchesYes
truncatedNo
nextOffsetNo
filesMatchedYes
totalMatchesYes
filesSearchedYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations cover only the safety profile (readOnly/openWorld/idempotent), so the description carries real weight beyond them and does: it discloses gitignore skipping with the override flag, the default maxMatches=1000, the truncation/nextOffset echo for paging, and the fact that contextBefore/After only apply in content mode. These are non-obvious behaviors an agent would otherwise get wrong.

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

Conciseness4/5

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

Purpose and the sibling preference are front-loaded, and every sentence carries information. It is dense and runs long as a single paragraph, but there is no true filler; a bulleted parameter block would scan faster, which keeps it from a 5.

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

Completeness5/5

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

With 16 parameters, an enum-free schema, and an output schema that covers return shape, the description needs to supply the calling contract — defaults, mode selection, glob rules, paging, and mutual-exclusion rules — and it does all of that. Nothing material is left for the agent to guess.

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 0% across 16 parameters, so the description must compensate fully and does — it documents every one of pattern/patterns, paths, caseSensitive (default true), contextBefore/After, maxMatches, offset, include/includes, exclude/exclude, encoding, outputMode, matchesOnly, and respectGitignore, including default values, glob semantics ('basename-only', '{a,b}', leading '**/'), and a worked example object.

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+resource ('Regex search in file contents') plus an unusual capability (encoding support) that no sibling offers. It also positions itself against an implicit alternative ('PREFER THIS over built-in Grep for non-UTF-8 files'), so an agent can distinguish it from search_files at a glance.

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 states when to prefer it (non-UTF-8 files), when it is cheaper to switch modes ('files_with_matches ... far cheaper when you just need WHICH files'), and how to avoid the singleton/plural conflict ('Do not combine a singular field with its plural'). This is routing guidance plus exclusion guidance in one place.

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

list_allowed_directoriesA
Read-only

Returns the list of directories this server is allowed to access, normally the directory it was started in. Subdirectories are also accessible. If empty, the user needs to add paths as args in .mcp.json or set MCP_FILE_TOOLS_ALLOWED_DIRS.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageNo
directoriesYes

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description adds meaningful behavioral context: directories are typically the startup directory, subdirectories are also accessible, and an empty list indicates a configuration issue. This enriches the agent's understanding without contradicting annotations.

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?

Two sentences with the primary function first and troubleshooting second. Every sentence adds value; no filler or 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?

For a simple, zero-parameter tool with an output schema, the description fully covers purpose, typical behavior, and the empty-result remediation. No additional context is needed for correct invocation.

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?

Tool has zero parameters, so the input schema is inherently complete. The description appropriately does not invent parameter details; baseline of 4 applies for a zero-parameter tool.

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?

Description states a specific action ('Returns the list of directories this server is allowed to access') and clearly distinguishes from sibling list_directory by focusing on allowed roots rather than directory contents. The added detail 'normally the directory it was started in' further clarifies the tool's unique role.

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

Usage Guidelines4/5

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

Provides clear context for when to use the tool: to discover accessible directories. It also gives actionable guidance for the empty-result case (.mcp.json or MCP_FILE_TOOLS_ALLOWED_DIRS). However, it does not explicitly contrast with sibling tools or state when not to use it, so it falls short of a 5.

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

list_directoryA
Read-only

List files and directories with optional glob pattern filtering (e.g., *.pas, *.dfm). Parameters: path (required), pattern (optional, default: *), sortBy ("name" default, "mtime" newest first, "size" largest first), reverse (bool, flips the order).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
sortByNo
patternNo
reverseNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
filesYes

TDQS

A4.6/5.0
Behavior4/5

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

Beyond the readOnlyHint annotation, the description adds behavior details about sorting (sortBy values and their effects) and the reverse option, giving the agent a better sense of the tool's output ordering. It also notes the default pattern '*', which is useful context.

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 a single sentence that packs essential parameter details without fluff. It is front-loaded with the primary purpose and wastes no words.

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

Completeness5/5

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

For a 4-parameter read-only directory listing tool with an output schema, the description covers purpose, filtering, sorting, and defaults. Output format is handled by the output schema, so no gap exists.

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 schema has no parameter descriptions, but the description compensates fully by explaining path (required), pattern (optional, default *), sortBy (with specific sort options), and reverse (flips order). This adds substantial meaning beyond the raw 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?

The description clearly states the tool lists files and directories with optional glob filtering, using the verb 'List' and specifying the resource. This distinguishes it from sibling tools like 'tree' (which implies hierarchy) and 'search_files' (which implies content search).

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

Usage Guidelines4/5

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

The description provides clear usage context by explaining the parameters, including the default sort order and reverse flag. However, it does not explicitly compare to alternatives like 'tree' or 'search_files' for when to choose this tool.

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

list_encodingsA
Read-only

List all 45 supported encodings with name, aliases, and description. Use this to find the correct encoding name for read/write/convert operations.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
encodingsYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safe-read profile is covered. The description adds valuable specifics the annotations lack: it is a static, complete enumeration ("all 45") with a defined return shape, which tells the agent it can cache/trust the list rather than probe incrementally.

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?

Two sentences, zero padding: the first gives the inventory and its shape, the second immediately states the purpose. Front-loaded and appropriately sized for a simple lookup tool.

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

Completeness5/5

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

An output schema exists, so the description is not obligated to document return values, yet it still names the returned fields. Combined with the annotations and zero-parameter schema, nothing an agent needs to invoke 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?

The tool takes zero parameters, so there is no parameter semantics to convey and the baseline is 4. Nothing in the description misleads about inputs, and the empty schema correctly signals the tool is called with no arguments.

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

Purpose5/5

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

States a specific verb (List) plus resource (supported encodings) and even quantifies the resource (45) and the fields returned (name, aliases, description). An agent can immediately distinguish this reference-lookup tool from siblings like convert_encoding or detect_encoding, which perform operations rather than enumerate.

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

Usage Guidelines4/5

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

"Use this to find the correct encoding name for read/write/convert operations" gives a clear when-to-use context and ties the tool to the encoding-consuming operations. It does not explicitly name alternatives (e.g., detect_encoding for an unknown file), so it falls short of a full when-not/alternative statement.

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

manage_bomA
DestructiveIdempotent

Detect, strip, or add Unicode BOM (Byte Order Mark). UTF-8 BOM breaks PHP/shell scripts; UTF-16 files need BOMs. Parameters: path (required), action (required: "detect"|"strip"|"add"), encoding (required for "add": utf-8, utf-16-le, utf-16-be, utf-32-le, utf-32-be).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
actionYes
encodingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
hasBomYes
bomTypeNo
changedYes
messageYes
bomBytesNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate destructive and idempotent behavior. The description adds specific action semantics (detect, strip, add) and conditional requirements (encoding for 'add'), enriching understanding beyond the generic hints without contradiction.

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 two sentences: the first defines purpose, the second condenses all parameter details. It is information-dense with no redundancy or unnecessary elaboration.

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 description, combined with annotations (destructive, idempotent) and output schema, covers purpose, usage context, parameter constraints, and safety implications. Nothing critical is missing for an agent to invoke the 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?

With 0% schema description coverage, the description fully compensates by enumerating valid action values, specifying encoding as required for 'add', and listing supported encoding formats. This provides complete parameter meaning beyond the bare 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?

The description explicitly states the tool detects, strips, or adds a Unicode BOM, using specific verbs and identifying the resource. It also provides context about UTF-8 and UTF-16 implications, clearly distinguishing it from sibling tools like detect_encoding and convert_encoding.

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

Usage Guidelines4/5

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

The description conveys when BOM management is relevant (UTF-8 breaking scripts, UTF-16 needing BOMs), giving clear context for use. However, it does not explicitly name alternatives or state when not to use this tool, falling short of full exclusion guidance.

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

manage_line_endingsA
DestructiveIdempotent

Detect or fix line endings. action="detect" reports the dominant style (crlf/lf/mixed/none), total lines, and the line numbers that disagree — use it when a file looks inconsistent. action="convert" rewrites the file to style, per code unit for UTF-16/32 and preserving its BOM; no-op if the file already matches. Parameters: path, action ("detect"|"convert"), style ("lf"|"crlf", required for convert), encoding (auto-detected, including most BOM-less UTF-16 — pass utf-16-le/utf-16-be if a very short or unusual file is misread). Example: {"path": "D:\src\unit1.pas", "action": "convert", "style": "crlf"}

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
styleNo
actionYes
encodingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
styleYes
changedNo
messageNo
totalLinesNo
linesChangedNo
originalStyleNo
inconsistentLinesNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructive=true, idempotent=true and non-readonly, and the description is consistent, adding real context: convert rewrites the file preserving the BOM, is a no-op on matching files, and handles UTF-16/32 per code unit. The encoding auto-detection caveat for short/unusual files is a valuable behavioral disclosure beyond the annotations.

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

Conciseness4/5

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

Front-loaded with purpose, then mode behavior, then parameters and an example. It is dense but each sentence adds information; the parameter recap is slightly redundant with the schema but compensates for the missing schema descriptions.

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

Completeness5/5

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

For a four-parameter, destructive, idempotent file-mutation tool with an output schema present, the description covers modes, side effects, encoding caveats, enums, and required parameters. Nothing an agent needs to invoke it correctly is missing.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does: it documents all four parameters, gives the allowed values for action and style, marks style as required for convert, and explains encoding auto-detection with fallback values. The worked example further anchors the parameter usage.

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 pair and resource: 'Detect or fix line endings', then names the two modes explicitly. This clearly distinguishes it from siblings like manage_bom and convert_encoding without needing to open any schema.

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

Usage Guidelines4/5

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

Gives an explicit trigger for detect ('use it when a file looks inconsistent') and explains convert semantics. It does not name alternative siblings (e.g. convert_encoding) or state when-not-to-use, so it stops short of full 5.

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

move_fileA
Destructive

Move or rename files/directories. Fails if destination exists. Parameters: source (required), destination (required).

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYes
destinationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already signal destructive behavior, and the description adds a critical behavioral detail: it fails if the destination exists, meaning no overwrite. This is valuable context beyond annotations. It also clarifies it operates on both files and directories.

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?

The description is short and front-loaded with the core purpose in the first sentence. The second sentence about parameters is redundant with the schema but does not significantly bloat the description.

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

Completeness4/5

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

For a simple two-parameter move tool, the description covers the core operation, the failure mode, and the applicable resources. With annotations already providing destructive hints and an output schema available, the description is 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.

Parameters2/5

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

Schema description coverage is 0%, so the description should compensate for the bare schema. However, it merely repeats 'source (required), destination (required)' without explaining the meaning of each parameter, such as source being the current path and destination being the target path. The parameter names are self-evident, but the description adds no semantic depth.

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 uses a specific verb ('move/rename') with a clear resource ('files/directories') and explicitly states a key constraint ('fails if destination exists'), which distinguishes it from siblings like copy_file and delete_file.

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

Usage Guidelines3/5

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

The description implies usage by its clear verb and resource, but does not explicitly reference alternatives or when-not-to-use. It mentions a failure condition but not when to choose this over copy_file or write_file.

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

read_multiple_filesA
Read-only

Read multiple files concurrently with encoding support. PREFER THIS when reading several non-UTF-8 files at once. Individual failures don't stop the batch — partial results are returned. Parameters: paths (required array), encoding (optional, auto-detected per file).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathsYes
encodingNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorsNo
resultsYes
errorCountYes
successCountYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds genuinely new behavior: concurrent execution and partial results when individual reads fail. That failure-isolation detail is valuable context an agent could not infer from the annotations.

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

Conciseness4/5

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

Four short sentences, with the primary scope and the usage preference front-loaded before the failure semantics and parameter recap. Tight overall, with only minor redundancy in restating the schema-declared parameters.

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

Completeness4/5

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

An output schema exists so return values need no explanation, and annotations cover the safety profile. Combined with the description's coverage of concurrency, failure isolation, and encoding, an agent has what it needs to call this 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?

Schema description coverage is 0%, so the description must carry the param burden, and it does: paths as a required array and encoding as optional with per-file auto-detection. The auto-detection note adds meaning beyond the bare schema, though it lacks format examples.

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

Purpose4/5

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

States a specific verb (read) and resource (multiple files) with the added scope of concurrency and encoding support, which distinguishes it from the single-file read_text_file sibling. It stops short of naming the sibling directly, but the plural/encoding scope makes the distinction clear.

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

Usage Guidelines4/5

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

"PREFER THIS when reading several non-UTF-8 files at once" gives an explicit when-to-use condition that implicitly routes the agent away from single-file readers. No explicit when-not or named alternative, so it falls short of a 5.

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

read_text_fileA
Read-only

Read file with encoding auto-detection, converts to UTF-8. PREFER THIS over built-in Read for non-UTF-8 files (Cyrillic, legacy codebases). Returns totalLines and fileSizeBytes for planning the next read, and contentHash — pass that back as expectedHash on edit_file or write_file and the call fails, changing nothing, if the file moved on since you read it. Parameters: path, encoding (auto-detected), offset (1-indexed start line), limit (max lines), maxCharacters (caps output to avoid token overflow), lineNumbers (default false: prefix lines with "N", absolute numbers — use to locate lines reported by grep or encoding errors; STRIP the prefix before using text as edit_file oldText). Page files >2000 lines: {"path": "D:\src\app.pas", "offset": 1, "limit": 2000}, then offset 2001, until offset exceeds totalLines.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
limitNo
offsetNo
encodingNo
lineNumbersNo
maxCharactersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
hintNo
contentYes
endLineNo
startLineNo
truncatedNo
totalLinesYes
contentHashNo
fileSizeBytesYes
detectedEncodingNo
encodingConfidenceNo

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond that: contentHash staleness detection ('the call fails, changing nothing, if the file moved on since you read it') and the returned planning fields (totalLines, fileSizeBytes). It does not explain the idempotentHint=false, but that is a minor gap against an otherwise rich disclosure.

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

Conciseness4/5

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

Well front-loaded: purpose, then the preferential-use rule, then output fields, then parameter semantics, then a worked pagination example. It is dense and somewhat long, but nearly every clause earns its place; only the trailing JSON example borders on excess.

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

Completeness5/5

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

An output schema exists, so return values need not be fully specified, yet the description still names the key fields. Combined with annotations and the thorough parameter coverage, an agent has everything needed to call this correctly, including the concurrency contract with edit_file/write_file.

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?

With 0% schema description coverage, the description carries the full parameter burden and does so: it documents path, auto-detected encoding, 1-indexed offset, limit, maxCharacters, and the lineNumbers prefix format with the warning to strip it before reuse as edit_file oldText. This adds meaning well beyond the bare schema types.

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+resource (read file) plus a distinguishing capability (encoding auto-detection, conversion to UTF-8), and explicitly separates itself from the built-in Read for non-UTF-8 files. An agent can tell exactly what this tool is for 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?

'PREFER THIS over built-in Read for non-UTF-8 files (Cyrillic, legacy codebases)' gives an explicit when-to-use condition and a named alternative. It also supplies concrete pagination guidance (page files >2000 lines with offset/limit) for large files.

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

search_filesA
Read-only

Recursively search for files matching a glob pattern (*.ext at any depth, /*.ext, several ** and {a,b} alternatives allowed). Returns full paths. Skips .gitignore'd files (respectGitignore=false to include). Parameters: path (required), pattern (required), excludePatterns, maxResults (default 10000), sortBy, reverse. sortBy: "name" (default, lexical), "mtime" (newest first) or "size" (largest first); reverse flips the order. Unlike the built-in Glob there is no mtime default — pass sortBy "mtime" for newest first. With mtime or size the whole tree is ranked before the cap, so a truncated result really is the newest/largest maxResults files. Example: {"path": "D:\proj", "pattern": "/*.pas", "sortBy": "mtime"}

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
sortByNo
patternYes
reverseNo
maxResultsNo
excludePatternsNo
respectGitignoreNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
filesYes
truncatedNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark the tool as readOnlyHint, lowering the bar. The description adds meaningful behavioral detail: skips .gitignore'd files unless respectGitignore=false, sorts lexically by name by default, and ranks the whole tree before trimming to maxResults for mtime/size sorts. No contradiction with annotations.

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?

The description is dense but every sentence contributes value, from the core purpose to sorting rules and an example. The parameter list is a bit run-on, yet the overall length is justified by the tool's complexity. Minor structural improvements would earn a 5.

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

Completeness4/5

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

The output schema exists, so return values need no description. The description covers search semantics, sort options, gitignore behavior, and result capping, which is largely sufficient. The lack of excludePatterns explanation is the main gap, making it complete but not flawless.

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?

With 0% schema description coverage, the description must explain parameters. It thoroughly covers sortBy options, reverse, maxResults behavior, and respectGitignore, and shows path/pattern via example. Only excludePatterns is left with no semantic detail, preventing a 5.

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 clear verb and resource: 'Recursively search for files matching a glob pattern,' and expands with specifics about supported patterns and output (full paths). It also distinguishes itself from the built-in Glob by noting the missing mtime default, which differentiates it from sibling file tools.

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

Usage Guidelines4/5

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

Usage context is provided via the contrast with the built-in Glob and the explanation of sortBy behavior (e.g., no mtime default, pass sortBy for newest first). However, it does not explicitly state when to prefer this over siblings like list_directory or tree, so it misses the top score.

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

treeA
Read-only

Compact indented tree view of directory structure. PREFER THIS for directory visualization. Skips .gitignore'd files and .git (respectGitignore=false to include). Set showEncoding=true to detect and display file encodings (e.g., for auditing legacy codebases). Parameters: path (required), maxDepth (0=unlimited), maxFiles (default 1000), dirsOnly (bool), exclude (array of patterns), showEncoding (bool, shows detected encoding per file).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
excludeNo
dirsOnlyNo
maxDepthNo
maxFilesNo
showEncodingNo
respectGitignoreNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
treeYes
dirCountYes
fileCountYes
truncatedNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. The description adds behavioral details (skips .gitignore/.git, includes when respectGitignore=false, showEncoding feature) without contradicting annotations.

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?

Three sentences with no redundancy: purpose, preference, behavior, and parameter list. Front-loaded with essential info and each 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?

Covers all 7 parameters with defaults and semantics, gives usage context, and an output schema exists. Adequate for a tree tool with no missing operational details.

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 0%, so the description must compensate. It lists path (required), maxDepth (0=unlimited), maxFiles (default 1000), dirsOnly, exclude (array of patterns), and showEncoding. respectGitignore is also explained in the behavior sentence. All parameters have semantic context.

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 'Compact indented tree view of directory structure' with a specific verb+resource. The directive 'PREFER THIS for directory visualization' clearly distinguishes it from siblings like list_directory and search_files.

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

Usage Guidelines4/5

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

Explicitly says 'PREFER THIS for directory visualization' and gives a concrete use case via showEncoding. Does not name alternative tools but the preference is strong and context is clear.

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

write_fileA
DestructiveIdempotent

Write file with encoding conversion from UTF-8. PREFER THIS over built-in Write for non-UTF-8 files. Use after read_text_file to keep the original encoding. Parameters: path, content, encoding (default: the existing file's detected encoding, else utf-8), bom, lineEndings, expectedHash (the contentHash of the read this rewrite is based on — the write fails and changes nothing if the file has since changed). bom: "auto" (default) writes a BOM for utf-16-/utf-32- targets, else keeps one only if the file already had a BOM of the same encoding; "preserve" keeps it even when the encoding changed; "never" strips it; "always" fails on encodings with no BOM (e.g. cp1251). lineEndings: "preserve" (default) converts content to the file's existing style, so sending LF into a CRLF file will NOT leave it mixed; also "crlf", "lf", "asis" (byte for byte). Example — strip a UTF-8 BOM that breaks PHP: {"path": "D:\www\index.php", "content": "<?php ...", "bom": "never"}

ParametersJSON Schema
NameRequiredDescriptionDefault
bomNo
pathYes
contentYes
encodingNo
lineEndingsNo
expectedHashNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
hasBomYes
bomTypeNo
messageYes
contentHashNo
lineEndingsNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare destructive/idempotent/non-readOnly, and the description adds substantial beyond that: expectedHash concurrency guard that aborts the write if the file changed, BOM-mode behavior including failure on BOM-less encodings, and line-ending conversion semantics. This is rich behavioral disclosure of exactly the traits that matter for a destructive write.

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?

Dense but front-loaded with purpose and preference first, then parameters, then a concrete example. Every sentence earns its place, though the parameter block is long and could be marginally tightened; sizing is justified by six undocumented parameters.

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?

Output schema exists so return values need not be described, and annotations cover the safety profile. Given the six-parameter destructive write, the description supplies encoding defaults, BOM/line-ending edge cases, and the optimistic-concurrency guard — nothing essential for correct invocation is missing.

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 0%, so the description carries the full burden and does: it documents path, content, encoding (with default resolution logic), bom (all four modes and their effects), lineEndings (all four values with the LF-into-CRLF example), and expectedHash (tied to the read's contentHash). Nearly every parameter gets meaning beyond a bare type.

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+resource (write file) with its defining scope (encoding conversion from UTF-8), and explicitly contrasts with the built-in Write sibling. An agent can tell what this does and how it differs from generic write/edit tools without opening a schema.

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

Usage Guidelines5/5

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

Explicitly says to PREFER this over built-in Write for non-UTF-8 files and to use it after read_text_file to preserve original encoding. Names both the when (non-UTF-8 rewrites) and the workflow alternative, leaving little to inference.

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. 6 tool updatesv4.5.0
    • Changeddetect_encoding2 fields changed
      • removedOutput schema / properties / candidates / items / properties / supported
        Removed value: -{
        -  "type": "boolean"
        -}
      • changedOutput schema / properties / candidates / items / required
        Previous value: -[
        -  "encoding",
        -  "confidence",
        -  "supported"
        -]New value: +[
        +  "encoding",
        +  "confidence"
        +]
    • Changededit_file1 field changed
      • addedInput schema / properties / expectedHash
        Added value: +{
        +  "type": "string"
        +}
    • Changedgrep_text_files1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "pattern",
        -  "paths"
        -]New value: +[
        +  "paths"
        +]
    • Changedread_multiple_files1 field changed
      • addedOutput schema / properties / results / items / properties / contentHash
        Added value: +{
        +  "type": "string"
        +}
    • Changedread_text_file1 field changed
      • addedOutput schema / properties / contentHash
        Added value: +{
        +  "type": "string"
        +}
    • Changedwrite_file2 fields changed
      • addedInput schema / properties / expectedHash
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / contentHash
        Added value: +{
        +  "type": "string"
        +}
  2. 5 tool updatesv4.2.0
    • Changedconvert_encoding1 field changed
      • addedInput schema / properties / allowLowConfidence
        Added value: +{
        +  "type": "boolean"
        +}
    • Changeddetect_encoding1 field changed
      • addedOutput schema / properties / candidates
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "confidence": {
        +        "type": "integer"
        +      },
        +      "encoding": {
        +        "type": "string"
        +      },
        +      "supported": {
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "encoding",
        +      "confidence",
        +      "supported"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
    • Changededit_file1 field changed
      • addedInput schema / properties / edits / items / properties / replaceAll
        Added value: +{
        +  "type": "boolean"
        +}
    • Changedgrep_text_files2 fields changed
      • addedInput schema / properties / patterns
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / hint
        Added value: +{
        +  "type": "string"
        +}
    • Changedread_multiple_files1 field changed
      • addedOutput schema / properties / results / items / properties / hint
        Added value: +{
        +  "type": "string"
        +}
  3. 19 tool updatesv3.3.0
    • Removedchange_line_endings
    • Changedcheck_for_updates2 fields changed
      • addedOutput schema / properties / installMethod
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "currentVersion",
        -  "latestVersion"
        -]New value: +[
        +  "currentVersion",
        +  "latestVersion",
        +  "installMethod"
        +]
    • Changedconvert_encoding9 fields changed
      • addedInput schema / properties / dryRun
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / paths
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • changedInput schema / required
        Previous value: -[
        -  "path",
        -  "to"
        -]New value: +[
        +  "to"
        +]
      • addedOutput schema / properties / dryRun
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / errorCount
        Added value: +{
        +  "type": "integer"
        +}
      • addedOutput schema / properties / errors
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / results
        Added value: +{
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "backupPath": {
        +        "type": "string"
        +      },
        +      "bomType": {
        +        "type": "string"
        +      },
        +      "changed": {
        +        "type": "boolean"
        +      },
        +      "error": {
        +        "type": "string"
        +      },
        +      "hasBom": {
        +        "type": "boolean"
        +      },
        +      "message": {
        +        "type": "string"
        +      },
        +      "path": {
        +        "type": "string"
        +      },
        +      "sourceEncoding": {
        +        "type": "string"
        +      },
        +      "unsupported": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "char": {
        +              "type": "string"
        +            },
        +            "code": {
        +              "type": "string"
        +            },
        +            "column": {
        +              "type": "integer"
        +            },
        +            "line": {
        +              "type": "integer"
        +            }
        +          },
        +          "required": [
        +            "char",
        +            "code",
        +            "line",
        +            "column"
        +          ],
        +          "type": "object"
        +        },
        +        "type": [
        +          "null",
        +          "array"
        +        ]
        +      },
        +      "unsupportedCount": {
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "path",
        +      "changed"
        +    ],
        +    "type": "object"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
      • addedOutput schema / properties / successCount
        Added value: +{
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "message",
        -  "sourceEncoding",
        -  "targetEncoding",
        -  "hasBom",
        -  "changed"
        -]New value: +[
        +  "message",
        +  "targetEncoding",
        +  "hasBom",
        +  "changed"
        +]
    • Addedcopy_file
    • Removeddetect_line_endings
    • Addededit_file
    • Addedget_file_info
    • Addedgrep_text_files
    • Addedlist_allowed_directories
    • Addedlist_directory
    • Addedlist_encodings
    • Addedmanage_bom
    • Addedmanage_line_endings
    • Addedmove_file
    • Addedread_multiple_files
    • Addedread_text_file
    • Addedsearch_files
    • Addedtree
    • Changedwrite_file2 fields changed
      • addedInput schema / properties / lineEndings
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / lineEndings
        Added value: +{
        +  "type": "string"
        +}
  4. 10 tool updatesv2.0.1
    • Addedchange_line_endings
    • Addedcheck_for_updates
    • Removedcopy_file
    • Removeddirectory_tree
    • Removedlist_directory
    • Removedlist_encodings
    • Removedread_multiple_files
    • Removedread_text_file
    • Removedsearch_files
    • Removedtree
  5. 10 tool updatesv0.1.1
    • Removedchange_line_endings
    • Removedcheck_for_updates
    • Addedconvert_encoding
    • Addeddetect_line_endings
    • Removededit_file
    • Removedget_file_info
    • Removedlist_allowed_directories
    • Removedmanage_bom
    • Removedmove_file
    • Addedwrite_file
  6. 18 tool updatesv0.1.0
    • First observedchange_line_endings
    • First observedcheck_for_updates
    • First observedcopy_file
    • First observedcreate_directory
    • First observeddelete_file
    • First observeddetect_encoding
    • First observeddirectory_tree
    • First observededit_file
    • First observedget_file_info
    • First observedlist_allowed_directories
    • First observedlist_directory
    • First observedlist_encodings
    • First observedmanage_bom
    • First observedmove_file
    • First observedread_multiple_files
    • First observedread_text_file
    • First observedsearch_files
    • First observedtree

TDQS

A4.1/5.0

Scored across 20 tools

Disambiguation4/5

Each tool targets a distinct action, and descriptions actively route the agent (e.g. 'prefer move_file to relocate', 'PREFER THIS over built-in Read'), which sharply reduces misselection. There is mild near-neighbor density among search_files/list_directory/tree and read_text_file/read_multiple_files, but purpose boundaries remain clear.

Naming Consistency4/5

Nearly all tools follow a clean snake_case verb_noun pattern (read_text_file, convert_encoding, manage_bom, create_directory). The only real deviation is 'tree', a bare noun, which breaks the pattern slightly.

Tool Count4/5

At 20 tools this sits in the heavy range, but the domain genuinely spans reading, writing, searching, encoding detection/conversion, BOM, and line-ending management, so most tools earn their place. check_for_updates and the several encoding helpers make it feel slightly bloated.

Completeness4/5

Coverage is broad: read/write/edit/move/copy/delete, directory creation, listing, searching, grepping, and full encoding/BOM/line-ending lifecycle. The main gap is directory deletion (delete_file explicitly refuses directories) and no append/create-from-scratch variants, but these are minor workarounds.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

Appeared in Searches