Tool overview
What is an MCP Server Validator?
An MCP server validator lints `mcpServers` JSON client configs used by Cursor, Claude, and similar MCP hosts.
Why use this MCP Validator?
Catch transport, args, and env mistakes before a broken MCP server config lands in an editor or agent runtime.
Key Features
Structured lint messages, config-focused checks, instant feedback, and local-only validation.
How to Use
Follow these steps to get accurate results from the tool interface above.
- Paste your Cursor or Claude Desktop JSON configuration containing a top-level "mcpServers" object.
- Review the lint report for errors (blocking) and warnings (non-blocking) with JSON pointer paths.
- Fix transport issues: stdio servers need command (+ args); remote servers need a valid http/https url.
- Ensure env objects contain only string values and args arrays contain only strings.
- Remove dual command+url entries and unknown keys flagged as warnings when possible.
- Re-validate until ok is true β warnings alone do not fail, but treat them as production debt.
- Paste the corrected JSON back into your client config file and reload MCP servers.
- Copy the issue report into a PR or CI checklist when sharing team MCP templates; keep secrets as placeholders.
MCP Validator β Complete Guide & Use Cases
Authoritative walkthrough: errors vs warnings, stdio vs HTTP, Cursor and Claude Desktop use cases, env string rules, fix guides, and secrets hygiene β aligned with the linter above.
MCP Validator guide β start here
This page is the canonical guide to linting MCP client JSON with DevUtilitiesβ MCP Validator. Paste your mcpServers config above while you read, or jump to a topic below. Parsing stays in your browser β commands, paths, and env values are never uploaded.
What MCP Validator does
MCP Validator is a client-side linter for Cursor and Claude Desktop mcpServers JSON. It walks each server entry, checks stdio vs HTTP/HTTPS transport rules, validates args and env shapes, and reports issues with JSON-pointer paths so you can fix configs before paste.
What you get
- Blocking errors vs non-blocking warnings with path pointers (mcpServers.serverNameβ¦)
- Stdio checks: command required; args array of strings (warn if missing)
- Remote checks: url must be http or https; malformed URLs fail
- Env object values must be strings β numeric ports must be quoted
- Unknown keys and dual command+url transports flagged as warnings
- ok status only when zero errors remain (warnings alone do not fail)
Use this tool when
- You are editing Cursor mcp.json or Claude Desktop MCP settings
- You want lint before committing a shared team MCP template
- You need a readable report for CI docs or PR review
- You are swapping stdio filesystem servers for remote HTTP MCP endpoints
Prefer a related tool when
- You need schemas + MCP + prompts in one session β AI Agent Builder
- You only need JSON Schema from an example payload β Structured Output Generator
- You need token budgets for the assembled agent β LLM Token Counter or Agent Builder
Errors vs warnings β what blocks paste
The report panel separates severity so you can unblock paste first, then clean warnings.
Severity guide
| Severity | Effect on ok | Typical causes |
|---|---|---|
| Error | Fails validation (ok = false) | Missing mcpServers, missing command and url, bad URL scheme, non-string args/env, invalid JSON |
| Warning | ok can still be true | Missing args on stdio, both command and url set, unknown properties, unusual server names |
Treat warnings as production debt: dual transports and unknown keys often mean the client will ignore half your config or reject it later.
Step-by-step: paste, lint, fix, paste back
First-time walkthrough for a Cursor or Claude Desktop config.
- Copy the JSON that contains a top-level mcpServers object from your client config file.
- Paste it into the validator input panel (replace sample content).
- Scan errors first β fix missing command/url, malformed URLs, and type mismatches.
- Resolve warnings: add args for stdio servers, remove dual transports, drop unknown keys.
- Confirm env values are quoted strings ("3000" not 3000).
- Re-check until ok is true and only intentional warnings remain.
- Paste the corrected JSON back into Cursor or Claude Desktop.
- Optionally copy the issue list into a PR or CI checklist for the team.
Use case: fix Cursor mcp.json before reload
Problem: a teammateβs Cursor mcp.json fails silently after adding a filesystem MCP server with a wrong path or missing args.
How this tool helps
- Paste the project or global mcp.json envelope into the validator.
- Fix the stdio entry: command (e.g. npx), args with the package and absolute path.
- Confirm env placeholders are strings; keep real secrets out of the paste.
- Copy the cleaned JSON back into Cursor and reload MCP servers.
Outcome: Cursor loads the server on first try with a shared, linted template.
Use case: Claude Desktop remote MCP URL
Problem: Claude Desktop rejects a remote MCP URL because the scheme is wrong or command and url were both set.
How this tool helps
- Paste the Claude Desktop MCP JSON fragment.
- For remote servers, keep only url with http:// or https://.
- Remove command/args from that entry (or remove url if you meant stdio).
- Re-validate, then paste into Claude Desktop settings.
Outcome: a single clear transport per server that matches Claudeβs client expectations.
Use case: lint MCP templates in PR review
Problem: teams commit broken mcpServers snippets into docs or starter repos and discover failures only on a developerβs machine.
How this tool helps
- Lint the canonical mcpServers JSON in the browser before merge.
- Copy the error/warning report (paths + messages) into the PR description.
- Require ok = true (zero errors) as a human checklist item for MCP-related PRs.
- Keep production secrets as placeholders in the committed template.
Outcome: MCP templates stay mergeable and onboarding stops failing on day one.
Use case: secrets hygiene while debugging
Problem: API keys in env blocks get pasted into chat, screenshots, or shared validators during debugging.
How this tool helps
- Replace real secrets with placeholders (e.g. YOUR_API_KEY) before pasting.
- Lint structure only β the validator never needs live credentials.
- Inject real values only in the local desktop client or secret store.
- Rotate any key that was pasted into a shared channel.
Outcome: you still catch type and transport bugs without exfiltrating production secrets.
Stdio vs HTTP/HTTPS transport rules
Each server entry must define exactly one transport style. Mixing both is a warning; defining neither is an error.
Transport shapes
| Transport | Required fields | Notes |
|---|---|---|
| Stdio | command (string); args recommended | Local CLI / npx MCP servers; args must be string[]; missing args β warning |
| HTTP / HTTPS | url (http: or https:) | Remote SSE/HTTP MCP; ftp and other schemes fail; malformed URLs fail |
Optional known keys include env, headers, and disabled. Unknown keys produce warnings so you can verify against your clientβs schema.
Env values must be strings
Client configs serialize process environment as JSON. Non-string values are a common copy-paste bug from TypeScript objects or YAML.
- Valid: { "env": { "API_KEY": "sk-test", "PORT": "3000" } }
- Invalid: { "env": { "PORT": 3000 } } β PORT must be a string
- env itself must be a plain object, not an array
- Lint with placeholders; never require production secrets to validate shape
Fix: missing command or url
Error: each server requires either a command (stdio) or a url (SSE/HTTP).
Why it happens
Empty objects, incomplete copy-pastes, or renaming keys leave a server with neither transport field.
Diagnose
Find the issue path mcpServers.<name>. If both command and url are absent, that entry cannot start.
Fixes
- For local servers: set command to the executable (e.g. npx) and args to the package + path list.
- For remote servers: set url to a full http:// or https:// endpoint and remove command/args.
- Re-paste and confirm the error disappears before addressing warnings.
Fix: non-string env values
Error: environment variable values must be strings.
Why it happens
JSON numbers, booleans, or nested objects were pasted into env from another config format.
Diagnose
Open the reported path mcpServers.<name>.env.<KEY>. The value type is not a string.
Fixes
- Quote numeric ports and flags: "3000", "true".
- Flatten nested objects into string values or move them out of env.
- Re-validate until env-related errors are gone.
Warnings about unknown keys are separate β fix type errors first.
Fix: wrong root envelope
Error: missing top-level "mcpServers" object.
Why it happens
Cursor and Claude Desktop expect the root key mcpServers. Wrappers like servers, mcp, or a bare server map do not match.
Diagnose
If the root parses but mcpServers is undefined, you pasted the wrong envelope or only an inner server object.
Fixes
- Wrap your servers: { "mcpServers": { "my-server": { ... } } }.
- Do not rename mcpServers to match other product docs.
- Ensure the root is a JSON object, not an array.
MCP validation best practices
- Lint before paste into Cursor or Claude Desktop β catch transport bugs offline
- One transport per server: command or url, never both
- Always include args for stdio CLI servers (use [] if empty)
- Keep env values as strings; quote numbers
- Use placeholders for secrets in shared docs and this browser tool
- Prefer absolute, least-privilege paths for filesystem MCP servers
- Re-lint after every path, package, or URL change
- Use AI Agent Builder when you also need schemas, prompts, and token budgets
Frequently Asked Questions
Expandable answers for common debugging bottlenecks and data privacy questions.
Related tools
Explore other related utilities that complement this tool.
Official Documentation & References
Authoritative specifications and platform documentation for this utility.