initialize handshake, (3) tools/list with well-described tools and valid input schemas, (4) latency and auth. You can do it by hand with curl, with the MCP Inspector, or automatically with the free MCP Pulse scanner.An MCP server isn't a normal REST API — clients like Claude, Cursor and agent frameworks speak a specific JSON-RPC 2.0 lifecycle over a transport (today: streamable HTTP, which may respond with plain JSON or an SSE stream). "It returns 200" tells you nothing. What matters is whether the client can complete the handshake, enumerate your tools, and understand them well enough to call them.
POST with Content-Type: application/json and Accept: application/json, text/event-stream.Mcp-Session-Id response header and honor it on subsequent requests.This is the make-or-break call. A minimal manual test:
curl -sN https://your-server.example.com/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2025-06-18' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{
"protocolVersion":"2025-06-18","capabilities":{},
"clientInfo":{"name":"test","version":"1.0"}}}'
A healthy response contains result.protocolVersion, result.serverInfo (name + version) and result.capabilities. If any is missing, clients and registries can't identify or route to your server.
After initialize, send the notifications/initialized notification, then call tools/list. For each tool, verify:
description — agents choose tools by their description, not their code. An undocumented tool is invisible in an agent workflow.inputSchema (JSON Schema) so the client knows how to call it.This is the single most common gap we see: servers that respond perfectly but ship tools with empty or one-word descriptions, then wonder why agents never call them.
Agents run multi-step chains — a 2-second handshake compounds across every hop. Measure it. And decide your auth posture deliberately: a public read-only server answering without auth is fine; a server whose tools mutate state or reach private data should require an Authorization header.
Doing all four layers by hand for every deploy is tedious. MCP Pulse runs the real initialize + tools/list handshake, scores conformance, tool-doc coverage, latency, TLS and auth 0–100, and tells you exactly what to fix — in 10 seconds, no signup.