universal-dev-mcp
Provides an HTTP/SSE interface compatible with OpenAI's tool-calling API, enabling ChatGPT to interact with local development servers similarly.
Click on "Install 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., "@universal-dev-mcpCheck my active project and view the homepage."
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.
universal-dev-mcp
A universal MCP (Model Context Protocol) server that gives AI tools live access to your running local development application. Connect Claude Desktop, Cursor, Windsurf, Zed, Gemini, ChatGPT, or any MCP-compatible tool to your localhost dev server — view pages, call APIs, read and edit source files, run commands, and switch between projects — all with configurable safety guardrails.
Table of contents
Related MCP server: local_computer
How it works
universal-dev-mcp sits between your AI tool and your local dev environment. It exposes two transport layers depending on what your AI tool supports:
┌──────────────────────────────────────────────────────────────────┐
│ AI Tools │
│ │
│ ┌─────────────────────────┐ ┌────────────────────────────┐ │
│ │ Claude Desktop │ │ Gemini │ ChatGPT │ etc │ │
│ │ Cursor / Windsurf / Zed│ └────────────────────────────┘ │
│ │ any MCP-compatible tool│ │ │
│ └────────────┬────────────┘ │ HTTP + SSE │
│ │ MCP stdio (JSON-RPC) │ localhost:3333 │
└────────────────┼──────────────────────────-┼────────────────────-┘
│ │
┌─────────▼──────────┐ ┌──────────▼─────────┐
│ server.ts │ │ http-server.ts │
│ (stdio mode) │ │ (HTTP/SSE mode) │
└─────────┬───────────┘ └──────────┬──────────┘
└──────────────┬───────────────┘
│
┌───────────▼───────────┐
│ 12 MCP Tools │
│ │
│ get_active_project │
│ get_project_info │
│ check_port │
│ view_page │
│ get_api_response │
│ read_file │
│ edit_file │
│ patch_file │
│ list_files │
│ delete_file │
│ move_file │
│ search_files │
│ run_command │
└───────────┬───────────┘
│ allowlist guards + auto-backup
│
┌────────────────▼────────────────┐
│ Your local dev project │
│ localhost:5173 / :3000 │
│ src/ package.json etc. │
└─────────────────────────────────-┘MCP stdio (server.ts) — used by editors that support MCP natively (Claude Desktop, Cursor, Windsurf, Zed). The editor spawns the server as a child process and communicates over stdin/stdout.
HTTP/SSE (http-server.ts) — used by tools that don't support MCP stdio. Exposes a REST API and an OpenAI-compatible tool-calling interface so any HTTP client can call the same tools.
All tool calls go through the same security layer regardless of transport: port allowlist, command allowlist, write directory scope, and automatic file backups.
Available tools
Tool | Description |
| Show which project is currently active — name, root, git branch, file count. Use this to confirm a project switch worked. |
| Read package.json, scripts, dependencies, config files, and project structure. Run this first. |
| Verify a dev server is running and responding on a given port. |
| Fetch a page from a running local dev server — returns title, meta tags, scripts, and visible text. |
| Make HTTP requests (GET/POST/PUT/DELETE/PATCH) to API endpoints on a local server. |
| Read a source file, optionally limiting output to a line range. |
| Overwrite a file with new content. A timestamped backup is created automatically. |
| Replace a unique string within a file without rewriting it entirely. Backup created automatically. |
| Display the project directory as a file tree. |
| Delete a file. A timestamped backup is created automatically before deletion. |
| Move or rename a file within the project. A backup is created automatically. |
| Search for a text string or regex across all project files with optional filename glob filter. |
| Run an allowlisted shell command (tests, lint, build, type-check) in the project root. |
Project structure
universal-dev-mcp/
├── src/
│ ├── cli/
│ │ └── switch.ts Cross-platform CLI for switching projects (mcp-switch)
│ ├── config.ts Environment variables and defaults
│ ├── server.ts MCP stdio entry point
│ ├── http-server.ts HTTP/SSE server for tools that do not support MCP stdio
│ ├── tools/
│ │ ├── index.ts Registers all tools onto the server
│ │ ├── browser.ts view_page, check_port
│ │ ├── api.ts get_api_response
│ │ ├── files.ts read_file, edit_file, patch_file, list_files, delete_file, move_file
│ │ ├── search.ts search_files
│ │ ├── commands.ts run_command
│ │ └── project.ts get_project_info, get_active_project
│ └── utils/
│ ├── security.ts Port, command, and path access guards
│ ├── backup.ts File backup creation, rotation, and cleanup
│ ├── fetch.ts HTTP fetch helpers and HTML parsing utilities
│ └── fs.ts File tree generation and path helpers
├── projects.json List of projects for mcp-switch
├── .env.example Configuration template
├── .gitignore
├── LICENSE MIT License
├── package.json
├── tsconfig.json
└── README.mdInstallation
git clone https://github.com/rj9884/universal-dev-mcp
cd universal-dev-mcp
npm install
# npm install automatically compiles TypeScript via the prepare scriptTo make the mcp-switch CLI available globally on your machine:
npm linkConfiguration
cp .env.example .envEdit .env:
PROJECT_ROOT=/Users/yourname/projects/my-app
# Ports your dev servers run on
# Vite=5173 Next.js/CRA=3000 Angular=4200 Vue=8080
ALLOWED_PORTS=3000,5173
# Commands the AI may run
ALLOWED_COMMANDS=npm test,npm run lint,npm run build
# Port for the HTTP server (Gemini / ChatGPT mode)
HTTP_PORT=3333
# Optional: require an API key on all HTTP endpoints
# MCP_API_KEY=your-secret-keyConnecting to Claude Desktop
Edit your Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonor%LOCALAPPDATA%\Packages\Claude_*\LocalCache\Roaming\Claude\claude_desktop_config.json(Windows Store install)Linux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"universal-dev-mcp": {
"command": "node",
"args": ["/absolute/path/to/universal-dev-mcp/dist/server.js"],
"env": {
"PROJECT_ROOT": "/absolute/path/to/your/project",
"ALLOWED_PORTS": "5173,3000",
"ALLOWED_COMMANDS": "npm test,npm run lint,npm run build"
}
}
}
}Use absolute paths. Restart Claude Desktop after saving.
Switching projects
Instead of manually editing claude_desktop_config.json every time you switch projects, use the built-in mcp-switch CLI. It works on Windows, macOS, and Linux.
Setup
Add your projects to projects.json in the repo root:
{
"projects": [
{
"name": "my-react-app",
"root": "/Users/yourname/projects/my-react-app",
"allowed_ports": "3000,5173",
"allowed_commands": "npm run build,npm test,npm run dev"
},
{
"name": "my-api-server",
"root": "/Users/yourname/projects/my-api-server",
"allowed_ports": "8080",
"allowed_commands": "npm run build,npm test"
}
]
}Commands
# Interactive menu — pick a project by number
npx mcp-switch
# Switch directly by name
npx mcp-switch use my-react-app
# Show the currently active project
npx mcp-switch current
# List all projects (active one is marked with *)
npx mcp-switch list
# Add a new project interactively
npx mcp-switch addAfter switching, restart Claude Desktop for the change to take effect.
Confirming the switch inside Claude
After restarting Claude Desktop, ask Claude:
"which project is active?"
Claude will call get_active_project and show you the project name, root path, git branch, and file count — so you can visually confirm the switch worked.
Connecting to MCP-compatible editors
Any editor that supports MCP stdio (Cursor, Windsurf, Zed, and others) uses the same configuration format. Open your editor's MCP settings and add the same server block shown in the Claude Desktop section above, then restart the editor.
Connecting to Gemini / ChatGPT (HTTP mode)
Start the HTTP server:
npm run start:httpThe server starts on http://localhost:3333.
Available HTTP endpoints
Method | Path | Description |
GET |
| Server info and endpoint list |
GET |
| Health check |
GET |
| List all tools |
POST |
| Call a tool by name |
GET |
| Tool schemas in OpenAI function-calling format |
POST |
| Execute OpenAI-format tool calls |
GET |
| Server-Sent Events stream |
POST |
| Broadcast an event to all SSE clients |
Example: calling a tool directly
curl -X POST http://localhost:3333/call \
-H "Content-Type: application/json" \
-d '{"name": "get_project_info", "arguments": {}}'Example: Gemini integration (TypeScript)
import { GoogleGenerativeAI } from "@google/generative-ai";
const MCP_URL = "http://localhost:3333";
async function getMcpTools() {
const res = await fetch(`${MCP_URL}/openai/tools`);
const { tools } = await res.json();
return tools;
}
async function callMcpTool(name: string, args: Record<string, unknown>): Promise<string> {
const res = await fetch(`${MCP_URL}/openai/call`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
tool_calls: [
{ id: "call_1", function: { name, arguments: JSON.stringify(args) } },
],
}),
});
const { tool_results } = await res.json();
return tool_results[0].content;
}
async function main() {
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY!);
const tools = await getMcpTools();
const model = genAI.getGenerativeModel({
model: "gemini-1.5-pro",
tools: [{ functionDeclarations: tools.map((t: any) => t.function) }],
});
const chat = model.startChat();
let result = await chat.sendMessage("Get an overview of my project.");
while (result.response.functionCalls()?.length) {
const toolResponses = await Promise.all(
result.response.functionCalls()!.map(async (call) => {
const output = await callMcpTool(call.name, call.args as Record<string, unknown>);
return { functionResponse: { name: call.name, response: { result: output } } };
})
);
result = await chat.sendMessage(toolResponses);
}
console.log(result.response.text());
}
main();Security
All tool calls are restricted by the following controls:
Port allowlist — AI can only connect to ports listed in
ALLOWED_PORTS.Command allowlist — AI can only run commands listed in
ALLOWED_COMMANDS.Write directory scope — File writes are restricted to
ALLOWED_WRITE_DIRS(defaults toPROJECT_ROOT).Path traversal protection — All paths are resolved and validated against allowed directories before any operation.
Automatic backups — Every file write or delete creates a
.mcp-backups/filename.timestamp.bakbefore making any change. Backups older than 7 days are cleaned up automatically; at most 10 backups are kept per file.API key — Set
MCP_API_KEYto require authentication on all HTTP endpoints.
Restoring a backup
ls .mcp-backups/
cp .mcp-backups/App.tsx.2026-03-13T10-00-00.bak src/App.tsxnpm scripts
npm run build # Compile TypeScript to dist/
npm run start # Start stdio server (Claude Desktop, Cursor, Windsurf, Zed)
npm run start:http # Start HTTP/SSE server (Gemini / ChatGPT)
npm run dev # stdio server with ts-node (no build step)
npm run dev:http # HTTP server with ts-node (no build step)Example prompts
Once connected to your AI tool:
Which project is currently active?Check if my dev server is running on port 5173.Get an overview of my project and tell me what tech stack it uses.Fetch the homepage from localhost:5173 and describe the UI structure.Search for all usages of the useAuth hook across the project.Read src/App.tsx and identify any potential issues.Run npm test and summarize any failures.Fix the TypeScript error in src/utils/api.ts on line 42.Rename src/utils/helpers.ts to src/utils/format.ts.License
MIT License — Copyright (c) 2026 RAJAN JAISWAL
See LICENSE for the full text.
Available Tools
13 toolscheck_portA
Check whether a dev server is currently running and responding on a given localhost port. Run this before view_page to confirm the server is up.
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | Port number to check |
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. It clearly implies a read-only status check, but it does not disclose potential side effects, return format, or behavior on unresponsive ports. Adequate but not rich.
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 short sentences, with the core purpose front-loaded and no redundant wording. Every word 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?
For a simple one-parameter tool with no output schema, the description provides purpose, usage guidance, and parameter context. It is nearly complete, though it could mention the return value to fully close the loop.
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 already describes the port parameter with 100% coverage, providing a baseline of 3. The description adds context by specifying the port is on localhost and the target is a dev server, which gives meaning beyond the raw schema description.
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 whether a dev server is running and responding on a given localhost port, using a specific verb and resource. It also distinguishes itself from sibling tools by positioning it as a prerequisite check before view_page.
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 run this tool before view_page, giving a clear usage context. However, it does not mention when not to use it or name alternative tools, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_fileA
Delete a file from the project. A backup is automatically created in .mcp-backups/ before deletion. Cannot delete directories.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Path to the file, relative to project root 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 transparency burden. It helpfully discloses that a backup is created in .mcp-backups/ before deletion and that directories cannot be deleted. However, it does not explain restore procedures, permissions required, or behavior for non-existent files.
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 concise sentences convey all essential information: the action, the backup behavior, and a key limitation. No filler or redundant content.
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 destructive tool, the description covers purpose, backup behavior, and a critical limitation. The absence of an output schema makes return-value documentation unnecessary, and the backup note mitigates the need for an explicit irreversibility warning.
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 covers 100% of the parameter (filepath) and includes 'relative to project root or absolute.' The tool description adds no additional parameter-level detail, so it relies on the schema's existing coverage.
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 action (delete a file) and its scope within the project. It also explicitly notes that directories cannot be deleted, distinguishing it from move_file or other 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 the tool is for files only, since it states 'Cannot delete directories.' However, it does not explicitly compare to sibling tools like move_file or edit_file, nor does it state when to use this over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_fileA
Write new content to a file, replacing it entirely. A timestamped backup is automatically created in .mcp-backups/ before any change. Use patch_file instead when making a small targeted change.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | The complete new content to write to the file | |
| filepath | Yes | Path to the file, relative to project root or absolute | |
| create_if_missing | No | Create the file if it does not exist yet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. It clearly discloses that the tool replaces the entire file and that a timestamped backup is created in .mcp-backups/ before changes, which is crucial behavioral context. It does not mention permissions or failure handling, but the core destructive nature is well covered.
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 concise sentences, front-loaded with the core purpose, followed by the backup behavior and an explicit alternative. No filler words; every sentence adds value.
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 is complete for a file-write tool: it covers the operation, the destructive replacement behavior, the backup mechanism, and the preferred alternative for targeted edits. There is no output schema, but none is needed here; all important context is provided.
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 100%, so the baseline is 3. The description adds no new parameter details beyond the schema, but it reinforces that 'content' is the complete new content, and the schema already documents all three properties adequately.
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: 'Write new content to a file, replacing it entirely.' It names the verb, resource, and scope, and explicitly contrasts with patch_file for small targeted changes, distinguishing it from siblings.
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 explicit guidance: 'Use patch_file instead when making a small targeted change.' This tells the agent when to choose an alternative, fulfilling the key usage guideline requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_active_projectA
Shows which project is currently active — name, root path, package info, file count, and git branch. Use this to visually confirm which project the MCP server is connected to.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses the tool's read-only nature ('Shows') and specifies the information returned. It does not discuss side effects or permission requirements, but for a simple display tool this is sufficient.
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 main purpose, and each sentence contributes meaning. There is no redundancy or 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 the tool's simplicity (no parameters, no output schema), the description is complete. It explains what the tool shows and when to use it. The list of returned fields partially compensates for the lack of an output schema, though the exact return format is not specified.
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 has zero parameters, so the schema is inherently complete. According to the rubric, a 0-parameter tool receives a baseline of 4; the description adds nothing about parameters because none exist.
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 what the tool does: 'Shows which project is currently active' and enumerates specific output contents (name, root path, package info, file count, git branch). It differentiates from siblings by focusing on the active project, but does not explicitly contrast with get_project_info, so it lacks explicit sibling distinction.
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: 'Use this to visually confirm which project the MCP server is connected to.' This tells the agent when to invoke it, though it does not mention alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_api_responseA
Make an HTTP request to an API endpoint on a local dev server and return the full response. Supports all standard HTTP methods and an optional JSON request body. Useful for testing REST APIs, checking response shapes, and verifying status codes.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Request body as a JSON string (used with POST, PUT, PATCH) | |
| path | Yes | API endpoint path (e.g. /api/users, /health, /auth/login) | |
| port | Yes | The localhost port the API server is running on | |
| method | No | HTTP method | GET |
| custom_headers | No | Additional headers as a JSON string, e.g. '{"Authorization":"Bearer token"}' |
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. It discloses key behaviors: making HTTP requests, returning 'the full response', supporting all standard methods, and allowing an optional JSON body. It also scopes to local dev servers. It doesn't detail error handling or side effects, but the core behavior is transparent enough.
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, front-loaded with the core action, followed by use cases. Every word earns its place with no redundancy or 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?
The description covers context (local dev server), HTTP methods, request body, and use cases. It states 'return the full response' as a high-level outcome, which is helpful given no output schema. There is slight ambiguity about what constitutes the 'full response' (headers, status code, etc.), but the description is otherwise complete for a dev testing tool.
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 100%, with each parameter having a clear description (e.g., method enum, path example, body format, headers example, port). The description adds no new parameter-level semantics beyond mentioning the optional JSON body and standard methods, so the baseline of 3 is appropriate.
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 identifies the tool's function: 'Make an HTTP request to an API endpoint on a local dev server and return the full response.' It specifies the verb, resource (API endpoint), and scope (local dev server), which distinguishes it from sibling file/command/project 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?
The description states explicit use cases: 'Useful for testing REST APIs, checking response shapes, and verifying status codes.' This gives clear context for when to use the tool, though it does not explicitly mention alternatives or exclusions relative to sibling tools like run_command.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_infoA
Get a full overview of the project: package.json metadata, npm scripts, dependencies, detected config files, and a two-level file tree. Always call this first when starting to work on a new project.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It clearly describes the expected output (metadata, scripts, deps, config files, file tree) and implies a read-only, safe operation. It could add explicit statements about non-modification, but for an info-gathering tool, the behavior is well conveyed.
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 long, front-loaded with the main purpose, and contains no fluff. Every word contributes to understanding what the tool does and when to invoke it.
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 no-parameter, no-output-schema tool, the description is complete: it enumerates all major output categories, gives a clear usage directive, and is distinguishable from sibling tools. An agent can confidently decide to call it first when exploring a project.
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 the schema provides no meaningful information. The description compensates by explaining what the tool returns, adding context that helps an agent understand the tool's value despite the empty parameter list.
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 'Get a full overview of the project' and enumerates specific contents (package.json metadata, npm scripts, dependencies, config files, two-level file tree). This distinguishes it from the sibling 'get_active_project', which likely focuses on just the active project path.
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 gives explicit guidance: 'Always call this first when starting to work on a new project.' However, it does not mention when not to use it or explicitly name alternative sibling tools for more specific queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filesA
List the files and directories in the project as a tree. Use this to understand project structure before reading or editing files.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | How many levels deep to show (1–5, default 3) | |
| directory | No | Subdirectory to list, relative to the project root. Leave empty to list from the project root. |
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. It describes the tree output format and implies a read-only operation through 'before reading or editing files,' but it doesn't explicitly state safety characteristics or any limitations (e.g., performance or symlink behavior). It's adequate but not rich.
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, front-loaded with purpose, zero wasted words. It states what it does and when to use it, 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?
Given the tool's simplicity, the description covers the main behavior and usage context. It lacks a detailed output format explanation, but no output schema is required for a listing tool. The optional parameters are fully documented in the schema, so overall completeness is strong.
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 100%, so the baseline is 3. The description adds no param-specific details; it only mentions the tree output, which is not about parameters. The schema already fully explains depth and directory.
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 as a tree, using a specific verb ('List') and resource ('files and directories in the project'). It distinguishes from sibling tools like read_file and search_files by focusing on structural overview.
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 explicitly says to use it to understand project structure before reading or editing files, providing clear usage context. It doesn't mention exclusions or alternatives, but the guidance is actionable and sufficient for this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_fileA
Move or rename a file within the project. A backup of the original is created before the move. Cannot move directories.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | Current file path, relative to project root or absolute | |
| overwrite | No | Overwrite the destination if it already exists (default: false) | |
| destination | Yes | Target file path, relative to project root or absolute |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the burden. It discloses that a backup is created before the move and that directories are not supported, which adds actionable behavioral detail. It omits some details like whether the backup is retained or how overwrite is handled, but the schema covers overwrite, so this is adequate.
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 concise sentences, front-loaded with the primary purpose. Every sentence adds essential information (purpose, backup, directory limitation) with no redundancy or unnecessary detail.
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 plus schema covers purpose, path types, overwrite default, backup behavior, and the directory limitation. It does not explicitly state what the tool returns or whether backups are retained, but for a straightforward move operation, the provided context is sufficient 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?
The schema already provides descriptions for all three parameters (100% coverage), so the baseline is 3. The description adds the directory restriction and backup behavior, but these are tool-level traits rather than parameter-specific semantics, so it does not significantly enhance parameter understanding.
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 moves or renames a file within the project, using a specific verb and resource. It also distinguishes from sibling tools by noting it cannot move directories, setting it apart from general file operations like read_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 gives clear context that this tool is for moving/renaming files within the project and excludes directories. However, it does not explicitly name alternatives or state when not to use it (e.g., for moving directories), so it lacks explicit exclusions/alternatives that would earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_fileA
Replace a specific string or block of code within a file without rewriting the whole file. The old_string must appear exactly once in the file. A backup is created automatically before the change is applied.
| Name | Required | Description | Default |
|---|---|---|---|
| filepath | Yes | Path to the file, relative to project root or absolute | |
| new_string | Yes | The string to replace it with | |
| old_string | Yes | The exact string to find and replace. Must be unique in the file — include extra surrounding lines if needed to make it unique. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and discloses key behavioral traits: it automatically creates a backup and enforces uniqueness of the old_string. It does not mention error handling for non-unique matches or permission requirements, but the disclosed traits (backup, targeted modification) are valuable and not redundant with schema.
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 just two sentences, tightly written with no filler. It front-loads the primary action and includes the most critical constraints and side effects without 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?
For a simple 3-parameter tool with no output schema, the description covers the essential aspects: what it does, the uniqueness constraint, and the automatic backup side effect. It lacks explicit error-behavior details, but for this complexity level the description is sufficiently 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 100%, and each parameter already has a clear description. The tool description reinforces the uniqueness requirement for old_string but does not add new parameter-level meaning beyond what the schema already provides, so the baseline of 3 applies.
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 'Replace' and a clear resource 'a specific string or block of code within a file', and adds the scope 'without rewriting the whole file' which distinguishes it from whole-file editing tools like edit_file. This makes the purpose unmistakable.
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 for when to use the tool: for targeted, minimal changes without rewriting the whole file. It also states a critical precondition (old_string must appear exactly once), but it does not explicitly name alternatives or when-not-to-use scenarios beyond the implied whole-file rewrite exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_fileA
Read the contents of a file in the project. Optionally limit output to a range of lines. Use list_files first if you are unsure of the file path.
| Name | Required | Description | Default |
|---|---|---|---|
| end_line | No | Last line to return (1-based, inclusive) | |
| filepath | Yes | Path to the file, relative to project root or absolute | |
| start_line | No | First line to return (1-based, inclusive) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the read operation and the optional line-range limitation, but it does not mention error behavior (e.g., file not found), encoding, or whether the read is safe in terms of side effects. The range-limiting behavior is also already described in the schema, so the added transparency is minimal.
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 concise and front-loaded: the first sentence states the core purpose, the second adds the optional line-range feature, and the third gives practical path guidance. Every sentence earns its place; no redundancy or irrelevant details.
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 tool with 3 parameters and full schema coverage, the description is adequately complete. It implies the return value by saying 'Read the contents,' and it includes a helpful prerequisite tip. It does not explain failure modes or output format, but given the simplicity, a 4 is appropriate.
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 100%, so the baseline is 3. The description adds no new meaning for filepath, start_line, or end_line beyond the schema's definitions. The tip about using list_files is more of a usage guideline than parameter semantics, so it does not raise the score above baseline.
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 'Read the contents of a file in the project,' identifying the specific verb 'read' and resource 'file.' This unambiguously distinguishes from siblings like edit_file, delete_file, and list_files, and the word 'project' scopes the tool appropriately.
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 guideline: 'Use list_files first if you are unsure of the file path.' This tells the agent when to invoke a predecessor tool, but it does not explicitly mention alternative tools like view_page or list exclusions, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_commandA
Run an allowlisted shell command in the project root directory (or a subdirectory via cwd, useful for monorepos like frontend/ + backend/). Useful for installing dependencies, running tests, linting, type-checking, and builds. Only commands explicitly listed in ALLOWED_COMMANDS may be executed.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Directory to run the command in, relative to the project root (e.g. 'frontend' or 'backend'). Must resolve inside the project root. Defaults to the project root. Prefer this over `npm run x --prefix <dir>`, which does not reliably resolve local binaries (e.g. next, vite) on Windows. | |
| command | Yes | The command to run. Must exactly match or start with one of the allowed commands. | |
| timeout_ms | No | Maximum execution time in milliseconds before the process is killed (default: 30000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses the important allowlist restriction and cwd behavior, but does not mention output format, exit code handling, or potential side effects beyond schema's timeout. This is adequate but not rich.
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: first focuses on action and location, second lists use cases and the key restriction. Front-loaded, no redundancy, every sentence adds value.
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 3-param tool with no annotations and no output schema, the description covers purpose, typical uses, and the allowlist constraint. It may not describe return values, but command execution output is intuitive. Overall sufficiently complete for agent selection and 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?
Schema description coverage is 100%, so the schema fully documents all three parameters. The description adds minimal extra context (monorepo use for cwd), but does not need to compensate for any gaps. Baseline 3 is appropriate.
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 ('Run') and clearly identifies the resource ('allowlisted shell command') with context (project root or subdirectory). It is unambiguously distinct from sibling file/project tools like read_file and get_project_info.
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 explicitly lists common use cases (installing dependencies, tests, linting, type-checking, builds) and provides monorepo guidance for `cwd`. No explicit alternatives are needed because siblings serve different functions, though 'when not to use' is not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_filesA
Search for a text string or regex pattern across all files in the project. Returns matching file paths, line numbers, and the matching lines. Optionally filter by file name glob (e.g. '*.ts'). Skips node_modules, hidden directories, and binary files.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The text or regular expression to search for | |
| is_regex | No | Treat query as a regular expression (default: false) | |
| directory | No | Subdirectory to search in, relative to project root. Leave empty to search the whole project. | |
| file_pattern | No | Optional filename filter, e.g. '*.ts' or '*.json'. Matches against the filename only, not the full path. | |
| case_sensitive | No | Whether the search is case-sensitive (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It transparently states that it skips node_modules, hidden directories, and binary files, and describes the return data. This exceeds basic expectations, though it could mention performance or edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary action and return value, followed by filtering options and exclusions. Every sentence adds value, with no redundancy or unnecessary detail.
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 absence of an output schema and annotations, the description is remarkably complete. It conveys the tool's purpose, parameters (via examples), return format, and exclusion behavior, giving an agent everything needed to invoke 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?
All 5 parameters are fully described in the schema (100% coverage), so the description adds only minimal value beyond the schema. It mentions a file glob example and regex/text search, but these are already covered by the schema definitions.
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 identifies the tool as a search for text or regex across project files, with specific details about return values (file paths, line numbers, matching lines). This distinguishes it from sibling tools like list_files or read_file, which serve different purposes.
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 clearly indicates this tool is for searching file contents across the entire project, with optional filters like file glob. It provides clear context but does not explicitly mention when not to use it or name alternative tools, so it stops 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.
view_pageA
Fetch the HTML content and structure of a page on a running local dev server. Returns the page title, meta tags, script sources, and visible text. Optionally returns the full raw HTML.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | URL path to fetch (e.g. /about, /dashboard) | / |
| port | Yes | The localhost port the dev app is running on (e.g. 5173, 3000) | |
| include_raw_html | No | Include the full raw HTML in the response (may be large) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It explains what the tool returns (title, meta tags, script sources, visible text, optional raw HTML) but does not mention whether it executes client-side JavaScript, how it handles missing pages or server errors, or that fetching may be a read-only operation. It adds some useful context but lacks caveats about limitations.
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 concise sentences with the main action front-loaded. The first sentence states what it fetches, and the second sentence lists return values including the optional raw HTML. No wasted words, every sentence adds value.
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 has 3 parameters, no output schema, and no annotations, the description provides a solid overview of purpose and expected return contents. It lists the main categories of data returned, which is enough for an agent to understand the tool's output, though it doesn't specify the exact JSON structure or error behavior. This is slightly above the minimum viable level.
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 100%, so the input schema already documents all three parameters (path, port, include_raw_html) with descriptions and defaults. The tool description adds no parameter-level meaning beyond what the schema provides, so the baseline score of 3 is appropriate.
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 fetches HTML content and structure from a page on a local dev server, naming specific return items (title, meta tags, script sources, visible text). This distinguishes it from siblings like get_api_response (API responses) and read_file (file contents), making the tool's purpose unambiguous.
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 when to use the tool: when you need to inspect the HTML of a page served by a running local dev server. It does not explicitly contrast it with alternatives like get_api_response or check_port, but the context and the mention of 'dev server' provide clear usage context without exclusions.
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. Dates show when Glama detected each change.
13 tool updates
v1.0.0- First observed
check_port - First observed
delete_file - First observed
edit_file - First observed
get_active_project - First observed
get_api_response - First observed
get_project_info - First observed
list_files - First observed
move_file - First observed
patch_file - First observed
read_file - First observed
run_command - First observed
search_files - First observed
view_page
TDQS
Most tools have clearly distinct purposes, but get_active_project and get_project_info overlap somewhat in project metadata, and edit_file/patch_file share a write-to-file role. Descriptions help clarify boundaries, so confusion is unlikely.
All tool names follow a consistent verb_noun snake_case pattern (get_, view_, check_, read_, edit_, patch_, list_, delete_, move_, run_, search_). No mixed conventions or vague verbs.
13 tools is well-scoped for a dev server MCP, covering project inspection, file operations, server interaction, and command execution. Each tool has a distinct role and the count feels balanced.
The set covers most workflows (read, edit, patch, delete, move, list, search files; test server endpoints; run commands) but lacks a dedicated create_file tool. Starting the dev server is also not directly handled, though check_port implies it may be externally managed.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Verified, pay-per-use API tools for AI agents through one authenticated connection.
Connect AI agents to 1000+ apps with managed authentication and tool-calling.
- emisarOAuthdev.emisar
Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceBridges AI coding agents with the browser to provide visual debugging, real-time error capture, screenshot capabilities, DOM inspection, and interactive wireframing through a reverse proxy with injected developer tools.5819Apache 2.0
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to access files and terminal of a local computer via a public HTTPS endpoint, secured with GitHub OAuth.-
- FlicenseNot gradedqualityDmaintenanceActs as the 'Hands and Eyes' for an Autonomous AI Agent, bridging Large Language Models and your local development environment to enable safe file manipulation, context reading, command execution, and documentation verification.2-
- AlicenseNot gradedqualityBmaintenanceEnables AI coding agents to access live console logs, errors, and network requests from web applications via a local WebSocket connection, without copying data to chat.2718MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/rj9884/universal-dev-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server