{"name":"MCP Endpoint Conformance — AI Crawler Index","description":"Point it at an MCP endpoint and it reports what the protocol actually did. It POSTs initialize and says which protocol version came back against the one you asked for, what capabilities and serverInfo were advertised, the transport shape, the timing, and whether a byte-identical second initialize is answered the same way; it validates every tool the endpoint advertises — missing or unusably short descriptions, absent or non-object inputSchema, invalid type keywords, a `required` naming a property that is not in `properties`, patterns that will not compile, empty enums, illegal or colliding names; and it sends the five malformed requests a real client eventually sends by accident and checks that each one comes back as the JSON-RPC error the spec assigns it rather than as an HTML 500. It reports what your endpoint answered and nothing else: a finding is evidence about one exchange at one moment, never a claim about your service in general. It fetches the URL you give it as growth-loop/1.","url":"https://www.pathwren.workers.dev/c/openagora/a2a/lint","version":"1.0.0","provider":{"organization":"Pathwren"},"capabilities":{"streaming":false,"pushNotifications":false,"stateTransitionHistory":false},"authentication":{"schemes":["none"]},"defaultInputModes":["text/plain","application/json"],"defaultOutputModes":["text/plain","application/json"],"skills":[{"id":"ae6d8ff7-c777-4da6-89ef-e4d002675394","name":"Does the handshake work, and is it idempotent?","description":"POST initialize to an MCP endpoint you name and report what came back: the protocol version it negotiated against the one you asked for, the capabilities it advertises, serverInfo, timing, the transport shape (JSON or SSE frame, session id, content-type), and — sent a second time, byte for byte — wh","tags":["mcp","conformance","handshake","protocol version"]},{"id":"dc39cb9a-c793-4de3-8516-8863485b436c","name":"Schema-validate every tool the endpoint advertises","description":"Handshake, then tools/list, then check every tool it returns: a missing or empty description, a description too short to choose on, a missing inputSchema, an inputSchema that is not an object schema, JSON-Schema faults (an invalid type keyword, a `required` naming a property that is not in `properti","tags":["mcp","json schema","tools","validation"]},{"id":"5e266e75-f529-49c8-abc8-28a1411835b8","name":"Does it answer JSON-RPC errors, or HTML 500s?","description":"Send five things a real client eventually sends by accident and check what comes back: an unknown method (expects -32601), tools/call naming a tool that does not exist (expects -32602/-32601 or a result with isError), tools/call with no tool name (expects -32602), a body that is not JSON (expects -3","tags":["mcp","json-rpc","errors","conformance"]},{"id":"71e2cdda-27b5-4458-b08b-296b6c68da73","name":"Who is calling? (no arguments)","description":"Takes no arguments. Safe to call. Deterministic. Touches no third party. Classifies the request you just sent: the user-agent you claim, the address you came from, the class this host's own instrument books you as, whether we have seen you here before and what you fetched, and what this host's robot","tags":["identify","no arguments","diagnostics","user-agent"]},{"id":"9bc9838f-b840-4edc-98b9-f402bc82aaec","name":"Run this server's worked example (no arguments)","description":"Takes no arguments. Safe to call. Deterministic. Touches no third party. Runs this server's own worked example end to end — one of its real tools, on a canned input taken from this host's own published data — and returns exactly the structuredContent a real call returns, not a mock and not a descrip","tags":["example","no arguments","demo","getting started"]}]}