Ten checks, ordered by how badly getting them wrong hurts. The first five decide whether clients can use your server at all; the rest decide whether agents actually pick it and keep working.
Most MCP clients refuse plaintext remote endpoints. Non-negotiable for anything beyond localhost.
A POSTed initialize must return a JSON-RPC 2.0 result (as JSON or an SSE data: event). This is the single gate every client passes through — test it first.
Echo a supported protocolVersion in the initialize result. Missing it makes clients and registries unsure how to talk to you.
Set serverInfo.name and serverInfo.version. Directories, dashboards and clients identify your server by these; without them you're anonymous.
Declare the capabilities you support (tools, resources, prompts). Clients gate calls on this — undeclared capabilities may never be probed.
Agents choose tools by description. State what each tool does, when to use it, and what it returns. This is the #1 real-world gap — see why your tools aren't being called.
Typed JSON Schema with per-field descriptions and required fields, so the model can construct valid calls.
Agents chain many calls; every slow hop compounds. Serve from an edge runtime and minimize cold starts. Under ~800ms is healthy.
Public read-only server: no auth is fine. Anything that mutates state or reaches private data: require an Authorization header (OAuth or bearer). Decide on purpose — don't leave a stateful server open by accident.
Servers regress silently. Watch uptime, latency and tool-schema drift so you're alerted before agents drop you — see the monitoring guide.
MCP Pulse checks every item with a real handshake — free, 10 seconds.
Scan my server →