Local Dev Bridge MCP
The server schema exposes local file and shell tools (read/write/edit files, list directories, run commands, search files) — though the README says these v2 tools were removed in v3 in favor of Herdr and UAT tools.
Read files —
read_filereturns contents of any path (relative to projects dir or absolute).Write files —
write_filecreates or overwrites a file with new content.Edit files —
edit_filedoes exact-text find/replace (old_text→new_text).Browse directories —
list_directorylists files and subdirectories in a path.Run shell commands —
run_commandexecutes commands (npm install, git, tests) in an optionalcwd.Search files —
search_filesrecursively greps for text, optionally filtered byfile_pattern.
Note: this schema contradicts the README, which claims v3 has no file/shell tools and instead offers herdr_* (drive Herdr agent panes) and uat_* (claim/complete browser UAT queue tests) — none of which appear here. The schema is a v2 build.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Local Dev Bridge MCPread the package.json file in my current project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Local Dev Bridge MCP v3
A small MCP server that does the two things nothing else on the Mac does:
Herdr control — list, read, type into, and wait on Herdr agent panes on this Mac.
UAT queue — a file-based work queue where coding sessions author browser tests and browser sessions (Cowork + Claude in Chrome) claim, run, and report them.
It has no file or shell tools any more. See Pairing model.
Pairing model
Native bridge for files and shell. This bridge for Herdr and UAT.
Need | Claude Desktop / Cowork | Claude Code |
Read / write / edit / search files | Native device bridge — Add folder (connect | Built-in |
Run shell commands | Native device bridge ( | Built-in |
Drive Herdr panes | this bridge ( | this bridge or |
UAT queue | this bridge ( | this bridge ( |
Why: the v2 file tools ran any command anywhere on the host as the operator, with no approval gate and absolute-path escape. The native bridge's per-folder grant is the right control for raw file/shell work.
Related MCP server: copilot-studio-code
Setup
git clone https://github.com/talentedmrweb/local-dev-bridge-mcp.git
cd local-dev-bridge-mcp
npm installRequires Node ≥ 18 and, for the Herdr tools, Herdr at /opt/homebrew/bin/herdr (Homebrew on Apple Silicon). The UAT tools work without Herdr.
Configuration
One setting:
Variable | Default | Description |
|
| Where the UAT queue lives. A leading |
PROJECTS_DIR is gone (it only scoped the removed file tools). It is ignored if still set.
Claude Desktop / Cowork
~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"local-dev-bridge": {
"command": "node",
"args": ["/Users/you/Projects/local-dev-bridge-mcp/index.js"],
"env": {
"UAT_DIR": "/Users/you/Projects/uat-queue"
}
}
}
}Then, in each Cowork session that needs files, use Add folder to connect ~/Projects (or just the project folder).
Claude Code
claude mcp add local-dev-bridge -s user -e UAT_DIR=$HOME/Projects/uat-queue -- node $HOME/Projects/local-dev-bridge-mcp/index.jsor in .mcp.json / ~/.claude.json:
{
"mcpServers": {
"local-dev-bridge": {
"command": "node",
"args": ["/Users/you/Projects/local-dev-bridge-mcp/index.js"],
"env": { "UAT_DIR": "/Users/you/Projects/uat-queue" }
}
}
}Allow-list entries for .claude/settings.local.json → permissions.allow:
mcp__local-dev-bridge__uat_queue_test mcp__local-dev-bridge__herdr_agent_list
mcp__local-dev-bridge__uat_get_pending mcp__local-dev-bridge__herdr_agent_read
mcp__local-dev-bridge__uat_get_test mcp__local-dev-bridge__herdr_agent_send
mcp__local-dev-bridge__uat_claim_test mcp__local-dev-bridge__herdr_pane_run
mcp__local-dev-bridge__uat_complete_test mcp__local-dev-bridge__herdr_wait
mcp__local-dev-bridge__uat_get_results
mcp__local-dev-bridge__uat_reset_test
mcp__local-dev-bridge__uat_dashboardHerdr tools act on the Mac the server runs on. If the server is launched over SSH on another machine, herdr_* sees that machine's panes and the UAT tools see that machine's queue.
Tools (13)
Herdr
Tool | Runs | Notes |
|
| Pane id, status, agent, title, cwd |
|
| Defaults |
|
| Literal text, no Enter. Guarded (below) |
|
| Single-line command + Enter. Guarded (below) |
|
|
|
Implementation: /opt/homebrew/bin/herdr is spawned with an argv array — no shell — and only the five subcommands above are allowed (no start, attach, server, config, …). Targets must match [A-Za-z0-9][A-Za-z0-9_:.-]*, so they can never be parsed as flags. 30 s default timeout.
The un-sent-line rule
herdr_agent_send and herdr_pane_run first read the target pane. If its input line already holds text the operator typed but has not sent, the call is refused with that text in the error — the bridge never types over it:
{ "error": { "code": "unsent_operator_text",
"message": "Refused: the input line in w3:p1 already holds un-sent text. Not typing over it.",
"details": { "target": "w3:p1", "unsent_text": "ship it", "pane_kind": "claude" } } }Detection (lib/unsent.js):
Claude Code panes — the
❯line inside the input box (between the two horizontal rules). Claude Code draws its own prompt suggestions (e.g.Try "fix typecheck errors", or a suggestedship it) as dim ghost text; those are not operator input and do not block. Anything rendered non-dim does.Shell panes — the last non-blank line is a prompt (
user@host … %/$/#, or a bare$/%/❯) followed by text.Anything else is treated as empty. If refused, ask the operator to send or clear the line; there is no override.
UAT queue
Tool | Description |
| Queue a test (name, http/https URL, steps, tags, priority, context) |
| List pending tests (filter by tag/priority), critical first |
| Full test by ID from any queue directory |
| Atomic claim (pending → in-progress via |
| Record pass/fail/blocked/skipped with per-step results (in-progress → results) |
| One result by ID, or a list filtered by status / |
| Move a test from in-progress or results back to pending |
| Counts by state, priority, and result; pass rate |
Hardening in v3:
Path confinement — every file lives under
UAT_DIR.test_idmust match[a-z0-9-]{1,100};../,/abs/path, dots and slashes are refused withinvalid_test_id. Queue files that are symlinks are refused.screenshot_path(stored data) must be relative with no..,~, or absolute path.Atomic state moves — claim, complete, and reset each start with a single
rename, so two sessions cannot both win. Writes go temp file →rename.Validated input — step
actionmust be a supported action; enums, types, andstep_indexrange are checked.Structured errors, never a stack trace — every failure is
isError: truewith{"error": {"code", "message", "details?"}}. Codes:invalid_test_id,invalid_argument,invalid_steps,path_not_allowed,not_found,already_claimed,already_completed,already_pending,not_claimed,corrupt_queue_file,unsent_operator_text,invalid_target,herdr_unavailable,herdr_failed,herdr_timeout,unknown_tool,internal_error.
Workflow
Claude Code ──uat_queue_test──► pending/ ──uat_claim_test──► Cowork + Chrome
▲ │
└──────uat_get_results◄── results/ ◄──uat_complete_test──────┘Test format (unchanged from v2)
{
"id": "login-flow-happy-path-a1b2c3d4",
"name": "Login flow happy path",
"url": "http://your-app.lab/login",
"priority": "high",
"tags": ["auth", "smoke"],
"context": "Just refactored the auth middleware — verify login still works",
"steps": [
{ "action": "type", "target": "#email", "value": "test@example.com", "description": "Enter email" },
{ "action": "click", "target": "button[type='submit']", "description": "Submit" },
{ "action": "assert_url", "value": "/dashboard", "description": "Lands on dashboard" }
],
"created_at": "2026-04-06T12:00:00.000Z",
"created_by": "claude-code",
"status": "pending"
}Supported actions: navigate, click, type, select, scroll, wait, assert_visible, assert_text, assert_url, screenshot, custom.
Queue layout (unchanged)
uat-queue/
├── pending/ tests waiting to run (id.json + id.md)
├── in-progress/ claimed tests
├── results/ completed tests with outcomes
└── archive/ old results (manual)UAT worker (headless queue consumer)
worker/uat-worker.mjs drains the queue without a human-driven session. It is the GHOST consumer (COMMANDER keeps its interactive ~/Projects/uat-worker session).
Queue access: listing
pending//in-progress/is read-only; every claim / complete / reset goes through this MCP server (spawned over stdio). Atomic claims mean it can coexist with other claimers.Browser: launches (or attaches to) this Mac's Chrome on
127.0.0.1:9333with its own profile~/.chrome-claude/uat-worker(headless by default) and drives it over CDP.Steps:
navigate,click,type,select,scroll,wait,assert_visible,assert_text,assert_url,screenshotrun deterministically (no LLM).customsteps needUAT_AGENT=claude(headlessclaude -plimited to chrome-devtools-mcp tools); withUAT_AGENT=off(default) they are skipped and the test is markedblocked.Ops: singleton lock
$UAT_DIR/.worker.lock; writes$UAT_DIR/.status.jsonevery tick (same schema as COMMANDER's status pusher); reaps tests stuck in-progress > 15 min back to pending; infra failures (Chrome down) give the test back instead of failing it; 3 in a row → 5 min backoff.Flags:
--once,--dry-run(claims nothing),--only <id-prefix>,--loopback-only.
./launchd/install.sh # render + lint plist, worker --dry-run (changes nothing)
./launchd/install.sh --load # install ~/Library/LaunchAgents/com.22ndventures.uat-worker.plist + bootstrap
./launchd/install.sh --status # state + log tail (~/Library/Logs/uat-worker/)
./launchd/install.sh --unload # rollback
node test/worker-smoke.mjs # loopback smoke against the real queue: queue → claim → complete → resultsMigrating from v2
File tools are gone:
read_file,write_file,edit_file,list_directory,search_files,run_command. In Desktop/Cowork, connect a folder with Add folder instead; in Claude Code, use the built-in tools.Herdr via
run_command→ dedicated tools:herdr agent list|read|send,herdr pane run,herdr agent waitmap toherdr_agent_list|read|send,herdr_pane_run,herdr_wait. Other Herdr subcommands are not exposed.Config: drop
PROJECTS_DIR; keepUAT_DIR(its default moved from$PROJECTS_DIR/uat-queueto~/Projects/uat-queue).Permissions: remove
mcp__local-dev-bridge__{read_file,write_file,edit_file,list_directory,search_files,run_command}from allow lists; add the fivemcp__local-dev-bridge__herdr_*.Errors: error text is now a JSON object (
error.code) instead ofError: <message>.Rollback:
git checkout v2.0-pre-slim, restorePROJECTS_DIR, restart the client.
Testing
UAT_DIR=~/Projects/uat-queue node test/regression.mjs <scratch-pane-id> # full UAT + Herdr pass over MCP stdio
node test/call.mjs uat_dashboard '{}' # one-off tool callregression.mjs leaves one skipped result (tag bridge-smoke) in results/. Give it a scratch shell pane (e.g. herdr pane split <pane> --direction down --no-focus) — it types into it. herdr_wait needs an agent pane, so test it against a scratch Claude Code session.
License
MIT
Available Tools
6 toolsedit_fileC
Edit a file by replacing specific text. The old_text must match exactly (including whitespace).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the file | |
| old_text | Yes | Text to find and replace (must match exactly) | |
| new_text | Yes | Text to replace it with |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It adds some context: 'The old_text must match exactly (including whitespace),' which clarifies a constraint. However, it lacks details on permissions, error handling, or what happens if the text isn't found, which are critical for a mutation tool. This leaves significant gaps in understanding the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded: the first sentence states the core purpose, and the second adds a critical constraint. There is no wasted language, and every sentence earns its place by providing essential information efficiently.
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 complexity of a file-editing mutation tool with no annotations and no output schema, the description is incomplete. It covers the basic operation and a constraint but omits details on permissions, side effects, error cases, and return values. This makes it inadequate for safe and effective use by an AI agent without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so the schema already documents all three parameters. The description reinforces the exact match requirement for 'old_text' but doesn't add new semantic details beyond what's in the schema. With high schema coverage, the baseline is 3, as the description provides minimal additional value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Edit a file by replacing specific text.' It specifies the verb ('edit') and resource ('file') with the operation ('replacing specific text'). However, it doesn't explicitly distinguish this from sibling tools like 'write_file' or 'search_files', which might have overlapping functionality, so it doesn't reach the highest score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'write_file' (which might overwrite entire files) or 'search_files' (which might find text without editing), nor does it specify prerequisites or exclusions. The agent must infer usage from the purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_directoryC
List files and directories in a given path
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to directory (relative to projects directory or absolute) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the action ('List') but lacks details on permissions, error handling, output format, pagination, or whether it's read-only. This is a significant gap for a tool with no structured safety hints.
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, efficient sentence that directly states the tool's function without unnecessary words. It's front-loaded and appropriately sized for a simple tool, with zero waste.
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 lack of annotations and output schema, the description is incomplete. It doesn't cover behavioral aspects like what the output looks like (e.g., list format, error cases), permissions needed, or how it differs from siblings. For a tool with no structured context, more detail is warranted.
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 100% description coverage, with the 'path' parameter well-documented in the schema itself. The description adds minimal value beyond implying the path is for listing contents, but it doesn't provide additional context like path validation or examples. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('List') and resource ('files and directories'), and it specifies the scope ('in a given path'). However, it doesn't explicitly distinguish this from sibling tools like 'search_files' or 'read_file', which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention scenarios like browsing directory contents versus searching for specific files, nor does it reference sibling tools such as 'search_files' for filtered queries or 'read_file' for file content access.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_fileB
Read the contents of a file from the local file system. Use this to view existing code files.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the file (relative to projects directory or absolute) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool reads files but doesn't mention potential issues like file permissions, errors for non-existent files, encoding handling, or output format. For a file system tool with zero annotation coverage, this leaves significant gaps in understanding how it behaves in practice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence and uses a second sentence to add context efficiently. Both sentences earn their place by clarifying usage without waste, making it appropriately sized and well-structured.
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 low complexity (single parameter, no output schema, no annotations), the description is minimally adequate. It covers the basic purpose and usage but lacks details on behavioral aspects like error handling or output format, which would be helpful for an agent to use it correctly in varied scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with the 'path' parameter well-documented in the schema itself. The description adds no additional meaning beyond what the schema provides (e.g., no examples or constraints), so it meets the baseline score of 3 where the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Read') and resource ('contents of a file from the local file system'), making the purpose specific and understandable. However, it doesn't explicitly differentiate from sibling tools like 'search_files' or 'list_directory' beyond the general 'view existing code files' context, which is why it doesn't reach a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides some implied usage guidance with 'Use this to view existing code files,' which suggests a context for reading code files. However, it lacks explicit when-to-use vs. alternatives (e.g., compared to 'search_files' for finding files or 'edit_file' for modifying them), and no exclusions or prerequisites are mentioned, making it only moderately helpful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_commandB
Execute a shell command in the projects directory. Use for running npm install, git commands, tests, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | Shell command to execute | |
| cwd | No | Working directory (relative to projects directory or absolute) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions executing shell commands but fails to disclose critical behavioral traits: it does not warn about potential destructive effects (e.g., commands that delete files), security implications (e.g., requiring specific permissions), or operational constraints (e.g., rate limits or timeouts). The description is vague on what happens during execution, leaving gaps in transparency for a tool that interacts with the system.
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 highly concise and well-structured, consisting of two sentences that efficiently convey the core purpose and usage examples. Every sentence adds value: the first defines the action and context, and the second provides practical applications without redundancy. It is front-loaded with the main functionality, making it easy to understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of executing shell commands (which can have significant side effects), the lack of annotations, and no output schema, the description is incomplete. It does not address key contextual aspects such as error handling, output format, security warnings, or limitations. For a tool with potential system-wide impact, more detail is needed to ensure safe and effective use, making it inadequate for its intended purpose.
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 100% description coverage, with clear documentation for both parameters ('command' and 'cwd'). The description adds minimal value beyond the schema by implying the context ('in the projects directory') and providing usage examples, but does not elaborate on parameter semantics, such as specific formats or constraints for the 'command' string or how 'cwd' interacts with the projects directory. Baseline 3 is appropriate as the schema handles most of the parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Execute a shell command in the projects directory.' It specifies the verb ('Execute') and resource ('shell command'), and provides examples of typical use cases ('running npm install, git commands, tests, etc.'). However, it doesn't explicitly differentiate from sibling tools like 'list_directory' or 'search_files' in terms of when to use one over the other for command execution versus file 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 implies usage by providing examples ('Use for running npm install, git commands, tests, etc.'), which gives some context for when to apply this tool. However, it lacks explicit guidance on when to use this versus alternatives (e.g., 'edit_file' for editing vs. 'run_command' for execution), and does not specify exclusions or prerequisites, such as needing appropriate permissions or avoiding destructive commands.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_filesC
Search for text within files in a directory (recursive)
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Text to search for | |
| path | No | Directory to search in (defaults to projects directory) | |
| file_pattern | No | File pattern to match (e.g., '*.js', '*.py') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool searches recursively but doesn't cover other critical aspects: it doesn't mention if the search is case-sensitive, what the output format is (e.g., list of matches, file paths), performance implications for large directories, or error handling. For a search tool with zero annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence: 'Search for text within files in a directory (recursive)'. It is front-loaded with the core purpose and includes essential scope information without any wasted words, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (searching files recursively with three parameters), lack of annotations, and no output schema, the description is incomplete. It doesn't explain what the tool returns (e.g., search results format), potential limitations, or how it interacts with sibling tools. For a search operation, more context is needed to guide effective use by an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with clear parameter descriptions: 'query' for text to search, 'path' for the directory (with a default), and 'file_pattern' for filtering. The description adds minimal value beyond the schema by implying recursive search, but it doesn't provide additional syntax or format details. This meets the baseline score when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search for text within files in a directory (recursive)'. It specifies the verb ('Search'), resource ('text within files'), and scope ('directory (recursive)'), making it easy to understand what the tool does. However, it doesn't explicitly differentiate from sibling tools like 'list_directory' or 'read_file', which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools such as 'list_directory' for listing files without searching or 'read_file' for viewing file contents, nor does it specify prerequisites or exclusions. This lack of contextual advice leaves the agent to infer usage scenarios independently.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_fileA
Create or overwrite a file with new content. Use this to create new files or completely replace existing ones.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the file (relative to projects directory or absolute) | |
| content | Yes | Content to write to the file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly indicates this is a write/mutation operation ('create or overwrite') and specifies it completely replaces existing files. However, it doesn't mention permission requirements, error conditions (e.g., path validation), or what happens on success/failure, which are important for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly concise with two sentences that each earn their place: the first states the core functionality, the second provides usage guidance. No wasted words, and it's front-loaded with the essential 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 destructive write operation with no annotations and no output schema, the description is adequate but has clear gaps. It covers the basic purpose and behavior but lacks information about return values, error handling, and specific constraints. Given the complexity of file operations, more context would be helpful.
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 100% description coverage, providing clear documentation for both parameters. The description doesn't add any additional parameter semantics beyond what's in the schema, so it meets the baseline of 3 where the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verbs ('create or overwrite') and resource ('a file with new content'), distinguishing it from siblings like edit_file (partial updates) and read_file (read-only). It explicitly covers both creation and replacement scenarios.
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 ('create new files or completely replace existing ones'), which helps differentiate from edit_file for partial modifications. However, it doesn't explicitly mention when NOT to use this tool (e.g., for appending) or name specific alternatives beyond the implied contrast with edit_file.
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
- First observed
edit_file - First observed
list_directory - First observed
read_file - First observed
run_command - First observed
search_files - First observed
write_file
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose with no overlap: edit_file modifies specific text in files, list_directory shows directory contents, read_file reads file contents, run_command executes shell commands, search_files searches text across files, and write_file creates or overwrites files. The descriptions clearly differentiate their functions, making misselection unlikely.
All tool names follow a consistent verb_noun pattern with snake_case (e.g., edit_file, list_directory, read_file). There are no deviations in naming conventions, making the set predictable and easy to understand at a glance.
With 6 tools, this server is well-scoped for local development tasks. Each tool earns its place by covering essential file operations (read, write, edit, search, list) and command execution, without being overly sparse or bloated for the domain.
The tool surface provides strong coverage for local development workflows, including file CRUD operations (read, write, edit), directory listing, file searching, and command execution. A minor gap is the lack of file deletion or move/copy operations, but agents can work around this using run_command for such tasks.
Maintenance
Related MCP Connectors
Work on your own computers from Claude or ChatGPT: run commands, edit and search files.
Use your Mac, Windows or Linux computer from ChatGPT, Claude or Codex: files, commands, documents.
Your own computer's files from ChatGPT or Claude: folder rules, confirmations and undo.
Connect ChatGPT, Claude, Cursor or VS Code to your Windows PC: files, terminal, browser, apps.
Related MCP Servers
- AlicenseAqualityDmaintenanceAllows Claude to execute terminal commands on your computer and perform file system operations including surgical code editing with diff-based replacements.19705,497 npm7MIT
- AlicenseNot gradedqualityDmaintenanceGives a Microsoft Copilot Studio agent Claude-Code-style tools to read, edit, search, and run shell commands against your local filesystem.22MIT
- FlicenseBqualityDmaintenanceEnables local file reading and writing for your project via Claude Desktop, with tools to read, write, and list files in a specified root path.71-
- FlicenseNot gradedqualityBmaintenanceEnables Claude Desktop or other MCP clients to execute shell commands, read/write files, and list directories on the local machine. Includes basic safety guardrails to block obviously destructive operations.-