mcp-file-tools
A sandboxed, encoding-aware MCP server for reading, editing, searching and managing text files in legacy encodings.
Read one or many files at once with auto-detected encoding, line paging/limits, and BOM + line-ending preservation
Write/edit/copy files keeping the original encoding (or a chosen one), with dryRun diff previews before edits
Search by glob (
search_files) or multi-pattern regex across file contents (grep_text_files), with context, counts, paging, and .gitignore supportBrowse directories, get a compact tree view (optionally annotated with each file's encoding), and read file/directory metadata
Encoding tooling: detect encoding with confidence and ranked candidates, convert between encodings, list supported encodings, detect/strip/add BOMs, detect/convert CRLF vs LF
File management: create directories recursively, move/rename, delete files
Safety: every path is restricted to explicitly allowed directories (symlinks/junctions resolved and rejected if they escape);
list_allowed_directoriesshows the scopeMaintenance: check whether a newer server release is available
Supports legacy Delphi and Pascal projects by providing tools to read and write source files and UI text in legacy encodings like Windows-1251.
Facilitates the maintenance of legacy PHP and HTML websites by providing encoding-aware file operations and regex search capabilities for localized content.
Provides automatic detection and conversion between various legacy encodings and Unicode, ensuring data integrity for files with non-UTF-8 text.
MCP File Tools
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_filesandsearch_filesdecode the same way, not just read and writeDetection you can inspect —
detect_encodingreports the charset, a confidence score and any BOM, so garbled text becomes diagnosableBOM 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 Code plugin (recommended)
claude plugin marketplace add dimitar-grigorov/mcp-file-tools
claude plugin install mcp-file-toolsInside 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-toolsTool 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-toolsUse 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 |
|
|
Linux x64 |
|
|
macOS ARM64 |
|
|
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 ~/ProjectsGo 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:
Close all Claude Code sessions (the binary is locked while running)
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-toolsRelated 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:
read_text_file- Read files with encoding auto-detection and conversionread_multiple_files- Read multiple files concurrently with encoding supportwrite_file- Write files in specific encodingsedit_file- Line-based edits with diff preview and whitespace-flexible matchingcopy_file- Copy a file to a new locationdelete_file- Delete a filelist_directory- Browse directories with pattern filteringtree- Compact indented tree view, optionally annotated with each file's encodingsearch_files- Recursively search for files matching glob patternsgrep_text_files- Regex search in file contents with encoding supportdetect_encoding- Auto-detect file encoding with confidence scoreconvert_encoding- Convert file between encodingsmanage_line_endings- Detect or convert line endings (CRLF/LF/mixed)manage_bom- Detect, strip, or add Unicode BOMlist_encodings- Show all supported encodingsget_file_info- Get file/directory metadatacreate_directory- Create directories recursively (mkdir -p)move_file- Move or rename files and directorieslist_allowed_directories- Show accessible directoriescheck_for_updates- Check whether a newer release is available
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 |
| Default encoding for |
|
| Line endings for | unset (write unchanged) |
| Memory threshold in bytes. Files smaller are loaded into memory for faster I/O; larger files use streaming. Also affects encoding detection mode. |
|
| Comma-separated list pinning what detection may answer, in priority order — e.g. | unset (detection unrestricted) |
| Allowed directories as an OS path list ( | unset |
| Set to turn off granting the working directory when neither | 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 buildtest_server.go is an end-to-end smoke test over every tool, run by CI on each push:
go run test_server.goDebugging
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/dirOr pipe JSON-RPC straight to stdin:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | go run ./cmd/mcp-file-tools /path/to/projectContributing
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)
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_fileretry 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 toolscheck_for_updatesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| installMethod | Yes | |
| latestVersion | Yes | |
| updateMessage | No | |
| currentVersion | Yes |
TDQS
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.
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.
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.
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.
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.
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_encodingADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| bom | No | ||
| from | No | ||
| path | No | ||
| paths | No | ||
| backup | No | ||
| dryRun | No | ||
| allowLowConfidence | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| dryRun | No | |
| errors | No | |
| hasBom | Yes | |
| bomType | No | |
| changed | Yes | |
| message | Yes | |
| results | No | |
| backupPath | No | |
| errorCount | No | |
| successCount | No | |
| sourceEncoding | No | |
| targetEncoding | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| destination | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes |
TDQS
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.
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.
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.
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.
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.
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_directoryAIdempotent
Create a directory recursively (mkdir -p). Succeeds silently if already exists. Parameter: path (required).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes |
TDQS
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.
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.
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.
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.
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.
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_fileADestructive
Delete a file. Does not delete directories. Parameter: path (required).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes |
TDQS
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.
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.
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.
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.
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.
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_encodingARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| has_bom | Yes | |
| encoding | Yes | |
| candidates | No | |
| confidence | Yes |
TDQS
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.
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.
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.
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.
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.
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_fileADestructive
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}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| edits | No | ||
| patch | No | ||
| dryRun | No | ||
| encoding | No | ||
| expectedHash | No | ||
| forceWritable | No |
TDQS
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.
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.
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.
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.
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.
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_infoARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| size | Yes | |
| isFile | Yes | |
| created | Yes | |
| accessed | Yes | |
| modified | Yes | |
| isDirectory | Yes | |
| permissions | Yes |
TDQS
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.
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.
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.
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.
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.
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_filesARead-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"}
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | ||
| offset | No | ||
| exclude | No | ||
| include | No | ||
| pattern | No | ||
| encoding | No | ||
| excludes | No | ||
| includes | No | ||
| patterns | No | ||
| maxMatches | No | ||
| outputMode | No | ||
| matchesOnly | No | ||
| contextAfter | No | ||
| caseSensitive | No | ||
| contextBefore | No | ||
| respectGitignore | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| files | No | |
| counts | No | |
| matches | Yes | |
| truncated | No | |
| nextOffset | No | |
| filesMatched | Yes | |
| totalMatches | Yes | |
| filesSearched | Yes |
TDQS
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.
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.
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.
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.
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.
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_directoriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | |
| directories | Yes |
TDQS
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.
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.
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.
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.
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.
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_directoryARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| sortBy | No | ||
| pattern | No | ||
| reverse | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| files | Yes |
TDQS
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.
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.
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.
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.
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.
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_encodingsARead-only
List all 45 supported encodings with name, aliases, and description. Use this to find the correct encoding name for read/write/convert operations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| encodings | Yes |
TDQS
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.
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.
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.
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.
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.
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_bomADestructiveIdempotent
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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| action | Yes | ||
| encoding | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasBom | Yes | |
| bomType | No | |
| changed | Yes | |
| message | Yes | |
| bomBytes | No |
TDQS
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.
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.
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.
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.
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.
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_endingsADestructiveIdempotent
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"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| style | No | ||
| action | Yes | ||
| encoding | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| style | Yes | |
| changed | No | |
| message | No | |
| totalLines | No | |
| linesChanged | No | |
| originalStyle | No | |
| inconsistentLines | No |
TDQS
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.
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.
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.
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.
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.
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_fileADestructive
Move or rename files/directories. Fails if destination exists. Parameters: source (required), destination (required).
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| destination | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes |
TDQS
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.
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.
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.
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.
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.
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_filesARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | ||
| encoding | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| errors | No | |
| results | Yes | |
| errorCount | Yes | |
| successCount | Yes |
TDQS
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.
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.
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.
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.
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.
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_fileARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| limit | No | ||
| offset | No | ||
| encoding | No | ||
| lineNumbers | No | ||
| maxCharacters | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| content | Yes | |
| endLine | No | |
| startLine | No | |
| truncated | No | |
| totalLines | Yes | |
| contentHash | No | |
| fileSizeBytes | Yes | |
| detectedEncoding | No | |
| encodingConfidence | No |
TDQS
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.
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.
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.
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.
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.
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_filesARead-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"}
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| sortBy | No | ||
| pattern | Yes | ||
| reverse | No | ||
| maxResults | No | ||
| excludePatterns | No | ||
| respectGitignore | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| files | Yes | |
| truncated | No |
TDQS
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.
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.
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.
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.
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.
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.
treeARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| exclude | No | ||
| dirsOnly | No | ||
| maxDepth | No | ||
| maxFiles | No | ||
| showEncoding | No | ||
| respectGitignore | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| tree | Yes | |
| dirCount | Yes | |
| fileCount | Yes | |
| truncated | No |
TDQS
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.
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.
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.
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.
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.
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_fileADestructiveIdempotent
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"}
| Name | Required | Description | Default |
|---|---|---|---|
| bom | No | ||
| path | Yes | ||
| content | Yes | ||
| encoding | No | ||
| lineEndings | No | ||
| expectedHash | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasBom | Yes | |
| bomType | No | |
| message | Yes | |
| contentHash | No | |
| lineEndings | No |
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
v4.5.0- Changed
detect_encoding2 fields changed- removed
Output schema / properties / candidates / items / properties / supportedRemoved value: -{ - "type": "boolean" -} - changed
Output schema / properties / candidates / items / requiredPrevious value: -[ - "encoding", - "confidence", - "supported" -]New value: +[ + "encoding", + "confidence" +]
- Changed
edit_file1 field changed- added
Input schema / properties / expectedHashAdded value: +{ + "type": "string" +}
- Changed
grep_text_files1 field changed- changed
Input schema / requiredPrevious value: -[ - "pattern", - "paths" -]New value: +[ + "paths" +]
- Changed
read_multiple_files1 field changed- added
Output schema / properties / results / items / properties / contentHashAdded value: +{ + "type": "string" +}
- Changed
read_text_file1 field changed- added
Output schema / properties / contentHashAdded value: +{ + "type": "string" +}
- Changed
write_file2 fields changed- added
Input schema / properties / expectedHashAdded value: +{ + "type": "string" +} - added
Output schema / properties / contentHashAdded value: +{ + "type": "string" +}
5 tool updates
v4.2.0- Changed
convert_encoding1 field changed- added
Input schema / properties / allowLowConfidenceAdded value: +{ + "type": "boolean" +}
- Changed
detect_encoding1 field changed- added
Output schema / properties / candidatesAdded value: +{ + "items": { + "additionalProperties": false, + "properties": { + "confidence": { + "type": "integer" + }, + "encoding": { + "type": "string" + }, + "supported": { + "type": "boolean" + } + }, + "required": [ + "encoding", + "confidence", + "supported" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] +}
- Changed
edit_file1 field changed- added
Input schema / properties / edits / items / properties / replaceAllAdded value: +{ + "type": "boolean" +}
- Changed
grep_text_files2 fields changed- added
Input schema / properties / patternsAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / hintAdded value: +{ + "type": "string" +}
- Changed
read_multiple_files1 field changed- added
Output schema / properties / results / items / properties / hintAdded value: +{ + "type": "string" +}
19 tool updates
v3.3.0- Removed
change_line_endings - Changed
check_for_updates2 fields changed- added
Output schema / properties / installMethodAdded value: +{ + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "currentVersion", - "latestVersion" -]New value: +[ + "currentVersion", + "latestVersion", + "installMethod" +]
- Changed
convert_encoding9 fields changed- added
Input schema / properties / dryRunAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / pathsAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - changed
Input schema / requiredPrevious value: -[ - "path", - "to" -]New value: +[ + "to" +] - added
Output schema / properties / dryRunAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / errorCountAdded value: +{ + "type": "integer" +} - added
Output schema / properties / errorsAdded value: +{ + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] +} - added
Output schema / properties / resultsAdded 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" + ] +} - added
Output schema / properties / successCountAdded value: +{ + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "message", - "sourceEncoding", - "targetEncoding", - "hasBom", - "changed" -]New value: +[ + "message", + "targetEncoding", + "hasBom", + "changed" +]
- Added
copy_file - Removed
detect_line_endings - Added
edit_file - Added
get_file_info - Added
grep_text_files - Added
list_allowed_directories - Added
list_directory - Added
list_encodings - Added
manage_bom - Added
manage_line_endings - Added
move_file - Added
read_multiple_files - Added
read_text_file - Added
search_files - Added
tree - Changed
write_file2 fields changed- added
Input schema / properties / lineEndingsAdded value: +{ + "type": "string" +} - added
Output schema / properties / lineEndingsAdded value: +{ + "type": "string" +}
10 tool updates
v2.0.1- Added
change_line_endings - Added
check_for_updates - Removed
copy_file - Removed
directory_tree - Removed
list_directory - Removed
list_encodings - Removed
read_multiple_files - Removed
read_text_file - Removed
search_files - Removed
tree
10 tool updates
v0.1.1- Removed
change_line_endings - Removed
check_for_updates - Added
convert_encoding - Added
detect_line_endings - Removed
edit_file - Removed
get_file_info - Removed
list_allowed_directories - Removed
manage_bom - Removed
move_file - Added
write_file
18 tool updates
v0.1.0- First observed
change_line_endings - First observed
check_for_updates - First observed
copy_file - First observed
create_directory - First observed
delete_file - First observed
detect_encoding - First observed
directory_tree - First observed
edit_file - First observed
get_file_info - First observed
list_allowed_directories - First observed
list_directory - First observed
list_encodings - First observed
manage_bom - First observed
move_file - First observed
read_multiple_files - First observed
read_text_file - First observed
search_files - First observed
tree
TDQS
Scored across 20 tools
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.
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.
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.
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
Related MCP Connectors
MCP server for Translation Services
MCP server for Speech-to-Text
MCP server for Russian books search, details, and recommendation candidates.
Related MCP Servers
- FlicenseDqualityDmaintenanceEnables AI models to perform file system operations (reading, creating, and listing files) on a local file system through a standardized Model Context Protocol interface.3-
- AlicenseAqualityAmaintenanceComprehensive MCP server for filesystem operations, process management, interactive sessions, and async file search. Includes utilities for JSON repair, encoding fixes, duplicate detection, OCR, ZIP archives, and Markdown export.46135 npm4MIT
- AlicenseNot gradedqualityCmaintenanceMCP server for converting various file formats (PDF, DOCX, images, audio, etc.) to Markdown using Microsoft MarkItDown, with support for large files and Cyrillic text.1MIT
- FlicenseAqualityCmaintenanceMCP server for Microsoft Office file operations. Read, write, and create Excel, Word, and PowerPoint files directly from your local filesystem.12-