Skip to main content
Glama
Local Dev Bridge MCP

Local Dev Bridge MCP

Local Dev Bridge MCP v3

A small MCP server that does the two things nothing else on the Mac does:

  1. Herdr control — list, read, type into, and wait on Herdr agent panes on this Mac.

  2. 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 ~/Projects or the one project folder)

Built-in Read / Write / Edit / Grep

Run shell commands

Native device bridge (device_bash, runs in a Linux VM on the granted folders)

Built-in Bash (runs on the Mac)

Drive Herdr panes

this bridge (herdr_*) — the native VM cannot reach the Herdr socket

this bridge or herdr CLI via Bash

UAT queue

this bridge (uat_*)

this bridge (uat_*)

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 install

Requires 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

UAT_DIR

~/Projects/uat-queue

Where the UAT queue lives. A leading ~/ is expanded.

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.js

or 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_dashboard

Herdr 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

herdr_agent_list

herdr agent list

Pane id, status, agent, title, cwd

herdr_agent_read {target, source?, lines?}

herdr agent read

Defaults --source recent --lines 120; lines 1–2000

herdr_agent_send {target, text}

herdr agent send

Literal text, no Enter. Guarded (below)

herdr_pane_run {target, command}

herdr pane run

Single-line command + Enter. Guarded (below)

herdr_wait {target, status, timeout_ms?}

herdr agent wait

idle|working|blocked|unknown; default 30 s, max 600 s. Target must be an agent pane. Most MCP clients time a call out at ~60 s — keep timeout_ms under that unless your client allows more

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 suggested ship 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

uat_queue_test

Queue a test (name, http/https URL, steps, tags, priority, context)

uat_get_pending

List pending tests (filter by tag/priority), critical first

uat_get_test

Full test by ID from any queue directory

uat_claim_test

Atomic claim (pending → in-progress via rename); a second claimer gets already_claimed

uat_complete_test

Record pass/fail/blocked/skipped with per-step results (in-progress → results)

uat_get_results

One result by ID, or a list filtered by status / since

uat_reset_test

Move a test from in-progress or results back to pending

uat_dashboard

Counts by state, priority, and result; pass rate

Hardening in v3:

  • Path confinement — every file lives under UAT_DIR. test_id must match [a-z0-9-]{1,100}; ../, /abs/path, dots and slashes are refused with invalid_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 action must be a supported action; enums, types, and step_index range are checked.

  • Structured errors, never a stack trace — every failure is isError: true with {"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:9333 with 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, screenshot run deterministically (no LLM). custom steps need UAT_AGENT=claude (headless claude -p limited to chrome-devtools-mcp tools); with UAT_AGENT=off (default) they are skipped and the test is marked blocked.

  • Ops: singleton lock $UAT_DIR/.worker.lock; writes $UAT_DIR/.status.json every 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 → results

Migrating 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 wait map to herdr_agent_list|read|send, herdr_pane_run, herdr_wait. Other Herdr subcommands are not exposed.

  • Config: drop PROJECTS_DIR; keep UAT_DIR (its default moved from $PROJECTS_DIR/uat-queue to ~/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 five mcp__local-dev-bridge__herdr_*.

  • Errors: error text is now a JSON object (error.code) instead of Error: <message>.

  • Rollback: git checkout v2.0-pre-slim, restore PROJECTS_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 call

regression.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 tools
edit_fileC

Edit a file by replacing specific text. The old_text must match exactly (including whitespace).

NameRequiredDescriptionDefault
pathYesPath to the file
old_textYesText to find and replace (must match exactly)
new_textYesText to replace it with

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It 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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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

The description clearly states the tool's purpose: '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.

Usage Guidelines2/5

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

NameRequiredDescriptionDefault
pathYesPath to directory (relative to projects directory or absolute)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It 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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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

The description clearly states the tool's purpose 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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
pathYesPath to the file (relative to projects directory or absolute)

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
commandYesShell command to execute
cwdNoWorking directory (relative to projects directory or absolute)

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It 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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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

The description clearly states the tool's purpose: '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.

Usage Guidelines3/5

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)

NameRequiredDescriptionDefault
queryYesText to search for
pathNoDirectory to search in (defaults to projects directory)
file_patternNoFile pattern to match (e.g., '*.js', '*.py')

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It 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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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

The description clearly states the tool's purpose: '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.

Usage Guidelines2/5

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.

NameRequiredDescriptionDefault
pathYesPath to the file (relative to projects directory or absolute)
contentYesContent to write to the file

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the tool's purpose 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.

Usage Guidelines4/5

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

The description provides clear usage context ('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.

  1. 6 tool updates
    • First observededit_file
    • First observedlist_directory
    • First observedread_file
    • First observedrun_command
    • First observedsearch_files
    • First observedwrite_file

TDQS

A3.6/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers