mcp-dev-tools
mcp-dev-tools
An MCP (Model Context Protocol) server I built to expose everyday dev commands — git status, recent commits, running tests, running the linter — as tools an AI coding assistant (Claude Code, Claude Desktop, or any other MCP-compatible client) can call directly against a real repository.
Why I built this
I wanted to actually understand how MCP servers work end to end — the handshake, the transport, tool schemas — rather than just wiring one up from a template. So this was built from an empty folder, one piece at a time, verifying each step before adding the next.
How I built it
Scaffolded the project —
npm init, TypeScript config for Node ESM (NodeNextmodule/resolution), installed@modelcontextprotocol/sdkandzod.Wrote the smallest possible server — an
McpServerinstance, a single dummypingtool, connected over a stdio transport.Verified it with the MCP Inspector before writing anything real — spawned the server as a subprocess, confirmed the
initializehandshake completed andtools/list/tools/callworked, using the raw protocol traffic rather than assuming it worked.Added the real tools one at a time (
git_status,recent_commits,run_tests,run_linter), re-testing after each addition rather than batching changes.Made the target repo configurable — moved from hardcoding
process.cwd()to reading a CLI argument, so the server can run against any project, not just itself.Hit and fixed a real platform bug along the way — see below.
A real bug this surfaced
run_tests and run_linter initially failed on Windows with a cryptic spawn EINVAL. Cause: Node deliberately blocks execFile/spawn from directly invoking .cmd/.bat files (like npm.cmd) without shell: true — a security fix (CVE-2024-27980) to stop unsafe argument injection into batch files. The git calls were unaffected since git.exe is a real executable, not a shell shim. Fixed by scoping shell: true to just the two npm calls, where the arguments are fixed literals rather than dynamic input, so the shell-parsing risk the restriction exists to prevent doesn't actually apply here.
Tools
Tool | Description | Arguments |
| Echoes a message back; used to verify the server is wired up |
|
| Working tree status (staged / unstaged / untracked) of the target repo | — |
| Recent commit history on the current branch |
|
| Runs | — |
| Runs | — |
How it works
Transport: stdio — the client spawns this process and communicates over stdin/stdout using JSON-RPC 2.0. stdout is reserved exclusively for protocol traffic; all logging goes to stderr (
console.error), otherwise it would corrupt the stream.Tool execution: each tool shells out to a real command (
git,npm) via Node'schild_process.execFile, using an argument array rather than a single shell string — this avoids shell injection entirely for the git-based tools.Error handling: a failing command (e.g. failing tests, a missing lint script) is not treated as a protocol error. It's caught and returned as a normal tool result with
isError: trueand the real command output attached, so the calling model can see what went wrong rather than getting an opaque failure.Target repo: a single
REPO_DIRconstant, resolved once at startup from a CLI argument (falling back to the current working directory), is threaded through every tool — so the server can be pointed at any project without code changes.
How to use it yourself
Prerequisites: Node.js 20+ and npm.
git clone <this-repo-url>
cd mcp-dev-tools
npm installRun directly against the source with tsx (no build step needed):
npm run dev -- C:\path\to\some\other\repoOr compile and run the built output:
npm run build
npm start -- C:\path\to\some\other\repoIf no path is given, it defaults to the directory the server is launched from.
Wiring it into an MCP client (Claude Code / Claude Desktop)
Add an entry to the client's MCP server config, pointing args at the built server and the repo you want it to operate on:
{
"mcpServers": {
"dev-tools": {
"command": "node",
"args": [
"C:\\path\\to\\mcp-dev-tools\\build\\index.js",
"C:\\path\\to\\the\\project\\you\\want\\to\\work\\on"
]
}
}
}Debugging with the MCP Inspector
npx @modelcontextprotocol/inspector npx tsx src/index.ts C:\path\to\some\other\repoOpens a browser UI showing the live tool list and lets you call each tool manually while watching the raw JSON-RPC exchange.
Tech stack
TypeScript, compiled with
tscto ES2022/NodeNext modules@modelcontextprotocol/sdk— official MCP server implementationzod— runtime validation for tool input schemastsxfor zero-build local development
Project structure
mcp-dev-tools/
├── src/
│ └── index.ts # server setup + all tool definitions
├── tsconfig.json
├── package.json
└── README.mdLicense
ISC
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/rishitudikeri3-rgb/mcp-dev-tools'
If you have feedback or need assistance with the MCP directory API, please join our Discord server