addrbookFor publishers
← The evidence ledger

Evidence row 566991

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 4cd255a1-6caf-4d12-a476-1f6f3b5b5586
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
795f08191f6cc528170cd22964ca29d6bfc667bb6313d5d0b0842f1af04dffb6
Leaf
0x49cd414845d34d605e5dcdb26e388fb4f3ff8ed30aff2acc66e3104a1f2fbc64

What was observed

{
  "count": 7,
  "tools": [
    {
      "description": "FIRST CALL, needs nothing: {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} — GET the documents an MCP client reads BEFORE the handshake and report what each one answered: /.well-known/oauth-protected-resource in BOTH forms — the root form everyone publishes and the RFC 9728 §3.1 insertion form a spec-following client actually requests for a resource served under a path — /.well-known/oauth-authorization-server, /.well-known/mcp, /.well-known/mcp.json, /mcp.json and /llms.txt. Each result carries the status, the verdict (served, missing, gated, soft-404 — a 200 carrying an HTML error page — or invalid JSON) and what a client does with that document. Makes one GET per document, 6 s each. Example: host='mcp.example.com' or host='https://mcp.example.com/mcp' (a path turns on the RFC 9728 insertion-form check) — or {} for the built-in fixture.",
      "inputSchema": {
        "additionalProperties": false,
        "examples": [
          {
            "host": "fixture://mcp-endpoint-lint/demo"
          }
        ],
        "properties": {
          "host": {
            "description": "A hostname, or the full endpoint URL. Give the full URL when your endpoint is served under a path: that is what the RFC 9728 §3.1 insertion form is derived from.",
            "type": "string"
          }
        },
        "required": [
          "host"
        ],
        "type": "object"
      },
      "name": "discovery_report"
    },
    {
      "description": "FIRST CALL, needs nothing: {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} — 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 -32700), and a body missing \"jsonrpc\":\"2.0\" (expects -32600). Reports the HTTP status and the error code side by side, and flags an HTML error page or a 5xx where a JSON-RPC error belongs — the failure that makes a client report the wrong cause. Makes 5 requests, 6 s each. Example: url='https://mcp.example.com/mcp' — or {} for the fixture, which fails two of the five.",
      "inputSchema": {
        "additionalProperties": false,
        "examples": [
          {
            "url": "fixture://mcp-endpoint-lint/demo"
          }
        ],
        "properties": {
          "url": {
            "description": "The MCP endpoint to lint — the URL you POST JSON-RPC to, e.g. https://mcp.example.com/mcp. Not stored anywhere. This server refuses its own publisher, IP literals and private names.",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "name": "error_conformance"
    },
    {
      "description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"example\",\"arguments\":{}}} — POST that exact body to https://www.pathwren.workers.dev/mcp/lint and you are done: free, read-only, no API key, no account, no consent prompt, nothing for you to invent, and what comes back is this server's own worked example — score_card, run for real on a canned input from this host's own data — so you see the exact shape of an answer before you send anything of yours. Takes no arguments. Safe to call. Deterministic. Touches no third party. Runs this server's own worked example end to end — score_card on this server's built-in fixture — an in-process MCP endpoint with one real defect wired in per check (it ignores the protocol version you ask for, refuses a second initialize, publishes a tool whose `required` names a property that does not exist, and answers an unknown method with an HTML 500). No outbound request is made and no third party is touched — and returns exactly the structuredContent a real call returns, not a mock and not a description of one. Use it to see the shape of an answer before you decide what to send. The input is canned from this host's own data; no URL of yours is fetched and no third party is touched. Example: arguments={} runs score_card with {\"url\":\"fixture://mcp-endpoint-lint/demo\"} and returns its real answer.",
      "inputSchema": {
        "additionalProperties": false,
        "examples": [
          {}
        ],
        "properties": {},
        "required": [],
        "type": "object"
      },
      "name": "example"
    },
    {
      "description": "FIRST CALL, needs nothing: {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} — 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 — whether the server answers an identical initialize the same way. Also asks for a version nobody publishes, to see whether it negotiates down or agrees to anything. Makes 3 requests, 6 s timeout each, user-agent growth-loop/1.0 (+https://www.pathwren.workers.dev/mcp-lint.html). Example: url='https://mcp.example.com/mcp' — or call with {} to run it against the built-in fixture, which makes no outbound request at all.",
      "inputSchema": {
        "additionalProperties": false,
        "examples": [
          {
            "url": "fixture://mcp-endpoint-lint/demo"
          }
        ],
        "properties": {
          "protocol_version": {
            "description": "The protocolVersion to ask for. Defaults to 2026-07-28.",
            "type": "string"
          },
          "url": {
            "description": "The MCP endpoint to lint — the URL you POST JSON-RPC to, e.g. https://mcp.example.com/mcp. Not stored anywhere. This server refuses its own publisher, IP literals and private names.",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "name": "handshake_report"
    },
    {
      "description": "FIRST CALL, needs nothing: {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} — Run handshake_report, tools_list_report, error_conformance and discovery_report against one endpoint and return a single verdict: a score out of 100 (handshake 30, tool schemas 30, error conformance 25, discovery 15), a letter grade, every finding by severity with the section it came from, and the full detail of each section underneath. This is the tool to call from a monitor: the score is stable enough to alert on and the findings say what to fix. Makes up to 19 requests to the URL you give it, 6 s each, and is rate-limited per caller and per target host. Example: url='https://mcp.example.com/mcp' — or {} to score the built-in fixture (it gets a D) with no outbound request at all.",
      "inputSchema": {
        "additionalProperties": false,
        "examples": [
          {
            "url": "fixture://mcp-endpoint-lint/demo"
          }
        ],
        "properties": {
          "url": {
            "description": "The MCP endpoint to lint — the URL you POST JSON-RPC to, e.g. https://mcp.example.com/mcp. Not stored anywhere. This server refuses its own publisher, IP literals and private names.",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "name": "score_card"
    },
    {
      "description": "FIRST CALL, needs nothing: {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} — 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 `properties`, a pattern that will not compile, an empty enum), names that break the character rule, and names that collide — exactly, or once case is ignored. Each finding names the tool and says what breaks. Makes 3 requests, 6 s timeout each. Example: url='https://mcp.example.com/mcp' — or {} for the built-in fixture, whose six tools carry one of each fault.",
      "inputSchema": {
        "additionalProperties": false,
        "examples": [
          {
            "url": "fixture://mcp-endpoint-lint/demo"
          }
        ],
        "properties": {
          "url": {
            "description": "The MCP endpoint to lint — the URL you POST JSON-RPC to, e.g. https://mcp.example.com/mcp. Not stored anywhere. This server refuses its own publisher, IP literals and private names.",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "name": "tools_list_report"
    },
    {
      "description": "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"whoami\",\"arguments\":{}}} — POST that to https://www.pathwren.workers.dev/mcp/lint and the answer is the user-agent you sent, the class this host's own instrument books it as, whether we have logged you here before — and the part only this server can answer: your own client's record on this host, surface by surface, with the status codes it took, plus exactly what this server would do with a URL you handed it (which hosts it refuses, what it identifies itself as, the timeout and the rate limit). Takes no arguments. Safe to call. Deterministic. Touches no third party. Nothing is fetched to build it: every fact comes from the headers on your own request or from a file this host already publishes. Only this server answers the last part — its five siblings answer one other question each about you, same empty arguments, each under the tool named beside its path: /mcp (whoami), /mcp/doctor (no_arguments_check_this_hosts_own_discovery_documents), /mcp/triage (no_arguments_triage_this_hosts_own_crawler_log), /mcp/robots (no_arguments_lint_this_hosts_robots_txt), /mcp/netcheck (no_arguments_report_the_crawler_ip_ranges_this_host_mirrors), /mcp/markdown (markdown_lane_self_report) on https://www.pathwren.workers.dev. Example: arguments={} returns your user-agent, your address, the class we book you as, whether we have seen you here before, and your own client's record on this host — every surface of ours your user-agent has been seen on, with the status codes it took.",
      "inputSchema": {
        "additionalProperties": false,
        "examples": [
          {}
        ],
        "properties": {},
        "required": [],
        "type": "object"
      },
      "name": "whoami"
    }
  ]
}

What the leaf hashes

{"body":"795f08191f6cc528170cd22964ca29d6bfc667bb6313d5d0b0842f1af04dffb6","id":566991,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793138582869835,"prev":null,"subject":"4cd255a1-6caf-4d12-a476-1f6f3b5b5586","subject_kind":"endpoint"}

Proof

Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (273461 rows).

  1. 0x49cd95e40c852d15100f6411ceedc4e632245810cfcc8ce26550b9c97bfb7500
  2. 0xc2a8988e78b3ea7e90e086d5fd5e8091298b0d23f4244aed121fc0e7b1c8ab55
  3. 0xd5a781376d0f0253e74c4012219ec0f6e18da217b5dbbb260ad4dd1146a53e52
  4. 0xc560d39aac315573bb768a492e23bff2a92181870a18ac4d339fb22ed63c3562
  5. 0x3f271b24f0875a8aa62cba123495e817f95d1cfd07110d5ccb5dd26b22667dc6
  6. 0x4a10c2cb74e04d5d1ac278bfded33dda961df9b9a541ed25d35608ac51900742
  7. 0x07521ff92055f782ff7630493ce76565b31ff681fd341ff097efc278555269a0
  8. 0x918e2cfc4503923075ed37bc4e77da4127f0cddceba65a38413ee8b11989e763
  9. 0xdc245ee3f64b125c5b5c815c91f7fa4cae2c66f7ec82b7d8b5587498f7e9d6dc
  10. 0xb10850e339c5cf611e925dab76011103589037f8925a4c500fe5fd647316ac9c
  11. 0xf38b609ad597fce93b27c195650b896689a01ed74ab6b03ca25db0fce3815293
  12. 0xa6ea35fd4950cdcd8e7e5b8dcbb37883deca6fa621672fcdbde7ee38017f71bb
  13. 0x150dc531eedad3837a4be47dd0bf1a84bf98feb63216c125982425fda525a3fd
  14. 0x80ede9e5d428e39db26928b1d08254ff1241f1d7e091fd2e57130fbb4423162b
  15. 0x2c117b27721eea45f6590fbccb471d21a7b0b079a53f089ecb300c63bdb3aebf
  16. 0x3ed50f053eca72dfd3a9d45a11935240bfe691e57835c367ddebe2cbc49efe9d
  17. 0x0e01aa9525097570a6edaf32bfc959de57bf5c24317cf10c0716affea85ca60d
  18. 0xa20d48798a34aba12eb9c7297722982d910f06c148f5e27ac59307422964a585
  19. 0x9fc354c0ea3efc3f1b6548bb77ea902a50f2c9647647ea61592efce2bd795699
Day root
0xdd77e5e99da32c3f154180d63e3c3e6fe11e896a2c6896412ef6b5c4bcf7e795
Chained
0x23bb4dfd09f55c15ac3962f53578e02c6114d5bfd9bb451cf8794fb6e2817ef4
Published
On Arc Testnet, block 69414147: 0xb2ebd83aafeb765a0ce66e76aefb133ed06606c98038fd56191e2bcd1dcb77b4

How to check it · This row as JSON