dev-tools
This MCP stdio server gives Claude Code five structured development tools for testing, type-checking, and building projects.
run_e2e_tests: Run Playwright E2E tests, optionally auto-starting the dev server and filtering by test pattern; returns per-test pass/fail status, duration, and error messages.
execute_sql_as_role: Execute SQL as a Postgres role with JWT claims inside a rollback transaction to verify Supabase RLS policies; returns rows without mutating data.
typecheck: Run
tsc --noEmiton a project or specific files; returns structured TypeScript errors with file, line, column, code, and message.npm_run: Run any npm script with extra args/env; parses Vitest/Jest output into structured per-file test results.
nextjs_build: Run a Next.js production build; returns structured errors and a list of generated pages with render types and sizes.
Parses Jest test output into structured results, including per-file pass/fail status and test counts.
Runs Next.js production builds and parses output to return structured build errors and a list of pages with their sizes and types.
Runs SQL queries as a specified Postgres role with JWT claims, enabling testing of database access control and RLS rules.
Executes SQL as a specified Postgres role with JWT claims to verify Supabase Row Level Security policies, without mutating data.
Parses Vitest test output into structured results, including per-file pass/fail status and test counts.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dev-tools Run the e2e tests and show me failures"
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.
dev-tools-mcp
An MCP (Model Context Protocol) stdio server that gives Claude Code - or any MCP client - five structured development tools:
# | Tool | What it does |
1 |
| Runs Playwright tests, starts the dev server, returns pass/fail per test |
2 |
| Executes SQL as a Postgres role with JWT claims - verifies Supabase RLS |
3 |
| Runs |
4 |
| Runs any npm script, parses Vitest/Jest output into structured results |
5 |
| Runs |
Prerequisites
Node.js ≥ 18
Claude Code installed
For the RLS tool: psql on your PATH and a running Supabase/Postgres instance
Related MCP server: saas-audit-mcp
Quick start
# 1. Clone the repo
git clone https://github.com/briancox730/dev-tools-mcp.git
cd dev-tools-mcp
# 2. Install dependencies
npm install
# 3. Build
npm run build
# 4. Register with Claude Code (local scope - this project only)
claude mcp add --transport stdio dev-tools -- node /absolute/path/to/dev-tools-mcp/build/index.js
# OR register globally (available in all projects)
claude mcp add --transport stdio --scope user dev-tools -- node /absolute/path/to/dev-tools-mcp/build/index.jsAlternative: edit .claude.json directly
Add this to the mcpServers key in ~/.claude.json (global) or .claude.json in your project root:
{
"mcpServers": {
"dev-tools": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/dev-tools-mcp/build/index.js"]
}
}
}Then restart Claude Code.
Verify it's working
Inside Claude Code, run /mcp - you should see dev-tools: connected with 5 tools listed.
Tool details
1. run_e2e_tests - Playwright E2E runner
Runs Playwright with the JSON reporter and parses results into structured output.
Inputs:
project_dir(required) - absolute path to your projecttest_pattern- glob or file path to filter, e.g."tests/auth.spec.ts"headed- run in headed mode (default: false)start_server- use Playwright's webServer config (default: true)timeout_seconds- kill after this many seconds (default: 120)
What you get back:
{
"success": true,
"summary": { "passed": 8, "failed": 1, "skipped": 0, "total": 9 },
"tests": [
{ "name": "Auth > should redirect unauthenticated users", "status": "passed", "duration_ms": 1200 },
{ "name": "Auth > should show dashboard after login", "status": "failed", "duration_ms": 3400, "error": "Expected element to be visible..." }
]
}Tip: Make sure your playwright.config.ts has a webServer section so Playwright auto-starts your dev server:
export default defineConfig({
webServer: {
command: 'npm run dev',
port: 3000,
reuseExistingServer: !process.env.CI,
},
});2. execute_sql_as_role - Supabase RLS tester
Executes SQL as a specific Postgres role with JWT claims, then rolls back. Never mutates data.
Inputs:
connection_string(required) - e.g."postgresql://postgres:postgres@localhost:54322/postgres"sql(required) - the query to runrole- Postgres role (default:"authenticated")user_id- UUID set asauth.uid()claims- additional JWT claims, e.g.{ "app_role": "parent" }
Example prompt for Claude Code:
"Run
SELECT * FROM childrenas an authenticated parent user with idabc-123and confirm they can only see their own children."
What you get back:
{
"success": true,
"role": "authenticated",
"user_id": "abc-123",
"query": "SELECT * FROM children",
"rows": [["id-1", "abc-123", "Alice"], ["id-2", "abc-123", "Bob"]],
"row_count": 2
}3. typecheck - TypeScript checker
Runs tsc --noEmit and parses the output into structured errors.
Inputs:
project_dir(required)tsconfig- relative path to tsconfig (default:"tsconfig.json")files- check only specific files
What you get back:
{
"success": false,
"error_count": 2,
"errors": [
{ "file": "src/utils.ts", "line": 42, "column": 5, "code": "TS2345", "message": "Argument of type 'string' is not assignable..." },
{ "file": "src/api.ts", "line": 18, "column": 12, "code": "TS2339", "message": "Property 'foo' does not exist on type..." }
]
}4. npm_run - Structured npm script runner
Runs any npm script with CI=true and FORCE_COLOR=0, then parses Vitest/Jest output.
Inputs:
project_dir(required)script(required) - e.g."test","test:unit","lint"args- extra args passed after--env- extra environment variables
What you get back:
{
"success": false,
"exit_code": 1,
"script": "test",
"summary": { "total_tests": 14, "passed_tests": 12, "failed_tests": 2 },
"file_results": [
{ "file": "src/auth.test.ts", "status": "failed", "tests_failed": 2 },
{ "file": "src/utils.test.ts", "status": "passed", "tests_passed": 5 }
],
"raw_stdout": "..."
}5. nextjs_build - Next.js build validator
Runs next build in production mode and parses errors and page output.
Inputs:
project_dir(required)env- extra env vars for the buildtimeout_seconds- (default: 180)
What you get back:
{
"success": true,
"error_count": 0,
"errors": [],
"pages": [
{ "path": "/", "size_kb": 5.42, "type": "static" },
{ "path": "/dashboard", "size_kb": 12.1, "type": "dynamic" },
{ "path": "/api/auth", "size_kb": 0, "type": "ssr" }
],
"build_duration_ms": 24500
}Development
# Watch mode
npm run watch
# Run the unit tests (Vitest)
npm test
# Test interactively with the MCP Inspector
npm run inspectTests
The output parsers are the trickiest, most regression-prone part of the codebase.
They turn free-form Vitest/Jest/tsc/next build console output into structured
JSON. Those pure functions are unit-tested with Vitest under
test/; run them with npm test. CI (see
.github/workflows/ci.yml) runs npm ci, the
TypeScript build, and the test suite on Node 20 and 22 for every push and pull
request.
Customization ideas
Add a
linttool that parses ESLint JSON outputAdd a
prisma_migratetool for structured migration statusAdd a
docker_composetool to manage test containersWire the RLS tool to Supabase CLI (
supabase db test) instead of raw psql
License
MIT © 2026 Brian Cox
Available Tools
5 toolsexecute_sql_as_roleTest Supabase RLS policiesA
Executes a SQL query as a specific Postgres role with JWT claims set, so you can verify RLS policies. Runs inside a ROLLBACK transaction — never mutates data.
Inputs: sql (required), connection_string (required), role, claims, +2 more.
nextjs_buildValidate Next.js buildB
Runs next build and returns structured errors (TypeScript, module, page-level) plus a list of generated pages with their render types and sizes.
Inputs: project_dir (required), env, timeout_seconds.
npm_runRun npm script with structured outputA
Runs any npm script (test, lint, etc.) and parses Vitest/Jest output into structured pass/fail results per file. Falls back to raw output for non-test scripts.
Inputs: script (required), project_dir (required), env, args, +1 more.
run_e2e_testsRun Playwright E2E testsA
Spins up the dev server (if configured in playwright.config), runs Playwright tests, and returns structured pass/fail results per test with error messages.
Inputs: project_dir (required), headed, start_server, test_pattern, +1 more.
typecheckRun TypeScript type checkerA
Runs tsc --noEmit and returns structured errors with file, line, column, error code, and message.
Inputs: project_dir (required), files, tsconfig, timeout_seconds.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 5 tools
每个工具针对开发流程的不同方面: 端到端测试, SQL角色执行, 类型检查, 运行脚本, 构建。npm_run可以运行任意脚本, 包括测试, 但run_e2e_tests专门用于Playwright, 因此边界相对清晰。少数可能重叠, 但描述有帮助。
命名模式部分一致: 有些工具使用动词开头(run_e2e_tests, execute_sql_as_role), 而其他使用名词开头(npm_run, nextjs_build)或单词(typecheck)。虽然每个名称都具描述性, 但顺序和风格并不统一。
5个工具的数量非常适合开发工具服务器。每个工具都服务于核心开发任务, 没有冗余或过度精简, 范围恰当。
工具集覆盖了主要开发步骤: 测试, 类型检查, 构建, 运行脚本以及SQL安全验证。npm_run可以运行lint或单元测试等其他任务, 因此没有明显缺口, 但可能缺少如专门的格式或代码质量检查工具, 不过可通配。
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
A paid remote MCP for AI agent browser DevTools MCP, built to return verdicts, receipts, usage logs,
One PAT, any MCP agent: Vercel, GitHub, Cloudflare, Supabase, GCP — unified dev infra gateway.
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables coding agents to run project-specific checks, replays, simulations, and queries as MCP tools, providing ground-truth feedback on config edits instead of guessing.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables coding agents to audit a Next.js codebase read-only, checking routes, Prisma models, environment variables, and locale consistency via MCP tools.MIT
- AlicenseNot gradedqualityAmaintenanceProvides MCP servers that wrap common developer tools such as git, npm, Docker, Kubernetes, and test runners, returning schema-validated structured JSON instead of raw terminal text. This lets AI agents consume typed, token-efficient results directly without brittle string parsing or platform-dependent formatting issues.4 npmMIT
- AlicenseNot gradedqualityAmaintenanceProvides MCP servers that wrap developer tools like git, npm, Docker, and test runners, returning schema-validated, token-efficient JSON so agents can use structured data directly.4 npmMIT