Inspect and score any MCP server 0-100 on publishability, schema and protocol before publish.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)

One command to diagnose your MCP server.
Tests every tool, resource, and prompt your server exposes β then gives you a health report with a pass/fail scorecard.
Built on the Anthropic Model Context Protocol (MCP) spec.
Note: Published to npm as
@incultnitollc/mcp-probe. The CLI binary ismcp-probe. The unscoped namemcp-doctoron npm is owned by an unrelated tool, so this project ships under a scope. Versions<= 0.2.1shipped under the deprecated@incultnitostudiosllcscope β install@incultnitollc/mcp-probeinstead.
| Check | Description |
|---|---|
| Tool calling | Calls every tool with auto-generated sample arguments based on the input schema |
| Resource reading | Reads every resource and verifies content is returned |
| Prompt rendering | Gets every prompt with sample arguments and verifies messages are returned |
| Schema validation | Checks tool schemas for missing descriptions, broken required fields, malformed types |
| Health scoring | Summarizes everything into a pass/fail scorecard |
Or run directly:
| Flag | Description |
|---|---|
--json | Output results as JSON |
--timeout <ms> | Per-operation timeout (default 30000) |
--transport <kind> | Force stdio, sse, or http (auto-detected from target) |
--header <Name: value> | Add header to remote transport. Repeatable. |
0 β All checks passed1 β One or more checks failed (useful for CI gates)Use --json to get structured output for automation:
mcp-probe auto-generates arguments for each tool based on its inputSchema:
default values and enum first choices when availableurl β https://example.com, email β test@example.com)string β "test", number β 1, boolean β false)This means tools with complex required inputs may fail β and that's useful information. It tells you your tool isn't self-contained enough for automated testing.
mcp-probe ships a second, complementary check: a publishability composite that scores your server 0β100 on whether its schemas, descriptions, and metadata are ready for other people to install. Run it as a shorthand:
Or fold it into a full test run with --publishability:
The composite combines three sub-scores β Protocol (does the wire format work), Edge cases (does it handle weird inputs), and Publishability (would a stranger understand your tools) β and a five-axis breakdown across the publishability dimension:
| Axis | What it checks |
|---|---|
description-five-axis | Per-tool description density across purpose, mutation, side-effects, invariants, examples. Tools below 3.0/5 axes fire a β€60 composite cap. |
enum-shape | Catches prose-only enums (e.g. "one of: open, closed" in the description with no JSON Schema enum). |
mutation-legibility | Does each tool tell a planner it mutates, or only reads? Name prefix / description signal / annotation all count. |
anti-purpose-clause | High-blast tools (delete, send, transfer) should include a "do not use for X, prefer Y" pointer to a narrower tool. |
distribution-metadata | npm package readiness β description length, keyword count, repository / license / homepage fields. Skipped without --package. |
The five official Anthropic MCP servers all land at 60/100 under v1.1.0 β the description-five-axis cap fires on every one. That's not a bug in the rubric; that's the bar Anthropic ships at, and the bar most servers will start from. Full scorecards in docs/publishability-scorecards/.
mcp-probe's publishability score is the pre-publish quality lane β for server authors before they ship. For the install-time security lane β server installers before they connect a third-party server β see @stephenywilson/mcp-doctor. Different audiences, complementary tools.
test/score tell you if your server is healthy today. Contract testing tells you what changed since last time β so a breaking schema edit or a poisoned tool description never ships silently.
Record a snapshot of your server's contract (its tools, resources, prompts, and their schemas β no traffic, no side effects), commit the .mcpvcr file, then diff or gate every PR against it.
Every change is classified so the gate is meaningful, not noisy:
| Severity | Examples |
|---|---|
| β breaking | tool removed Β· new required argument Β· property removed Β· type changed Β· enum narrowed |
| β οΈ security | tool description mutated (rug-pull / tool-poisoning) Β· readOnlyHint dropped Β· tool became destructive |
| β additive | new tool Β· new optional field Β· enum widened |
| βΉοΈ info | server name Β· resource/prompt description text |
gate fails on breaking,security by default β tune with --fail-on breaking (or any comma-separated set). Snapshots are deterministic: re-recording an unchanged server produces a byte-identical file, so committed baselines and diffs stay clean. Compare two recorded files offline with --against <file> instead of a live target, and write a ready-to-post PR comment with --markdown <path>.
Why it matters: the 2026-07-28 MCP spec ships breaking changes (dropped initialize handshake, error-code and JSON-Schema shifts, HTTP+SSE β Streamable HTTP). A recorded .mcpvcr baseline turns "did we break our clients?" into a one-line CI check. See examples/contract-gate.yml for the full PR workflow with auto-commenting.
mcp-probe exits 0 on full pass and 1 on any failure, so it drops directly into any CI pipeline:
Use --json for structured output and jq to gate on specific metrics (e.g. fail the build if schemaWarnings > 0).
Drop mcp-probe into your MCP server's GitHub Actions workflow in two lines:
Gate your PRs on a publishability composite:
| Name | Required | Default | Description |
|---|---|---|---|
command | yes | β | Command that launches your MCP server (e.g. node dist/index.js or npx -y @your-scope/your-server). |
fail-under | no | 0 | Fail the job if the publishability composite drops below this value (0β100). Requires publishability: 'true'. |
publishability | no | false | Run the publishability suite β 5 checks + 0β100 composite. Requires mcp-probe >= 1.1.0 (ships 2026-05-23). |
package | no | '' | Path to package.json for the distribution-metadata check. Empty skips the distribution check. |
html-report | no | '' | Path to write the HTML scorecard. Upload via actions/upload-artifact in a follow-on step. |
mcp-probe-version | no | latest | npm version, dist-tag, or latest. Pin for reproducible builds. |
json-output | no | '' | Path to write the JSON report for downstream parsing. |
| Name | Description |
|---|---|
composite-score | Publishability composite (0β100). Only set when publishability: 'true'. |
band | Grade band: publishable / almost / rough / not-ready. Only set when publishability: 'true'. |
tools-pass-rate | tools_callable / tools_listed as a decimal (e.g. 0.83). |
schema-warnings | Total schema warning count across all tools. |
More examples: examples/basic.yml Β· examples/publishability-gate.yml Β· examples/matrix.yml.
Marketplace listing: github.com/marketplace/actions/mcp-probe-mcp-server-health-check.
The official MCP Inspector is a GUI for interactive exploration β point, click, see what a server returns. mcp-probe is a CLI for automated, repeatable diagnosis β every tool/resource/prompt called automatically, pass/fail scorecard out, exit code in. Use Inspector when you're exploring; use mcp-probe in CI, in pre-publish checks, or when you want a shareable scorecard of someone else's server.
mcp-probe. CLI: npm i -g @incultnitollc/mcpr. Built by Incultnito LLC.MIT - Incultnito LLC
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/mcp-probe)<a href="https://allmcps.com/mcp/mcp-probe"><img src="https://allmcps.com/api/badge/mcp-probe?style=directory" alt="Mcp Probe on AllMCPs" /></a>