addrbookFor publishers
← The evidence ledger

Evidence row 1288476

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 27816c1d-c259-473d-86cb-ef0049952391
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
4a86303589b81b542e8853edb881d0b1a1147bf0a6ca51a986bf5a613e0d0557
Leaf
0x7e00a9da3f35117260534b2f55a18baf2e7833a374a400b9d30922ccf288821d

What was observed

{
  "count": 6,
  "tools": [
    {
      "description": "Read-only compact comparison of 2 to 6 products. Returns `compared` (count), `missing` (ids not found, never an error), `note` and `tools`, one compact record each: id, name, dataset, `checked` date, every plan with price and its headline limits or rates, `free` tier and `overage` policy. Products may come from different datasets. Platform fees and pass-through costs (LLM tokens, speech, telephony) stay separate rows; sum them yourself when the user wants an all-in figure. Ids as returned by list_tools or search_limits; a product name also works. Prices USD.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "tool_ids": {
            "description": "Two to six product ids or names, e.g. [\"vapi\", \"retell\", \"elevenlabs-agents\"].",
            "items": {
              "type": "string"
            },
            "maxItems": 6,
            "minItems": 2,
            "type": "array"
          }
        },
        "required": [
          "tool_ids"
        ],
        "type": "object"
      },
      "name": "compare_tools"
    },
    {
      "description": "Read-only full verified record for one product. Returns `matches` and up to 3 `records`; each record has `dataset`, `plans` (name, monthly and annual price, metering unit, limits per window), `rates` (per-unit prices such as $/min or $/1M tokens, each with the vendor `quote`), `free` tier, `overage` policy, `gotchas` (billing traps), `sources` (URLs) and `checked` date. Match by id (e.g. \"claude\", \"cursor\", \"vapi\", \"openai-api\") or by product name, case-insensitive; exact match wins, otherwise a substring match. Returns an error listing the candidates when the name is ambiguous or unknown. Prices are USD. `published: false` means the vendor states no number and the `value` is their wording; never estimate from it.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "dataset": {
            "description": "Dataset id to search in, when the same id exists in several. One of: ai-plans, usage, email-sending, llm-apis, media, plans-new, scraping-proxies, search-apis, voice. Omit to cover every dataset.",
            "enum": [
              "ai-plans",
              "usage",
              "email-sending",
              "llm-apis",
              "media",
              "plans-new",
              "scraping-proxies",
              "search-apis",
              "voice"
            ],
            "type": "string"
          },
          "tool_id": {
            "description": "Product id from list_tools, or the product name (e.g. \"cursor\", \"Retell AI\", \"gemini-api\").",
            "type": "string"
          }
        },
        "required": [
          "tool_id"
        ],
        "type": "object"
      },
      "name": "get_tool"
    },
    {
      "description": "Read-only dated change log for the AI assistant and coding-agent plans dataset (\"ai-plans\" only; other datasets carry a `checked` date but no history yet). Returns `since` (cut-off date), `count`, `changelog` URL and up to 60 `changes`, newest first, each with `date`, `tool`, `tool_id`, `plan`, `field`, `old`, `new`, vendor `source` URL, `method`, `note` and `page`. By default covers the last 30 days and only real moves: price changes, limit changes, plans added or removed. Set `include_wording` to also get re-verification rows where only the vendor wording changed or a value was recorded for the first time. Use it for \"what changed in the Claude plans this month\" or to check whether a figure from get_tool moved recently.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "days": {
            "default": 30,
            "description": "Look-back window in days.",
            "maximum": 730,
            "minimum": 1,
            "type": "integer"
          },
          "include_wording": {
            "default": false,
            "description": "Also include re-verification rows that only changed wording or were recorded for the first time.",
            "type": "boolean"
          },
          "tool_id": {
            "description": "Only changes for this product id (as in list_tools, e.g. \"claude\", \"chatgpt\", \"cursor\").",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_changes"
    },
    {
      "description": "Read-only catalog of the datasets on this server. Returns one row per dataset with `id` (the value other tools accept as `dataset`), `title`, `kind`, `tools` (number of products), `plans` (number of plans), `updated` (date of the last verified change), `page` URL and `json` endpoint on getstackversus.com, plus `generated` (build date). Currently 9 datasets: AI assistant and coding-agent plan limits, SaaS usage limits, LLM API token prices, voice-agent $/min, AI media credits, search APIs, scraping platforms and proxies, email platforms. No parameters, no auth, no pagination; the whole catalog comes back in one call. Use it once to learn dataset ids; use list_tools to see the products inside one dataset.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {},
        "type": "object"
      },
      "name": "list_datasets"
    },
    {
      "description": "Read-only list of the products (vendors) covered, to look up ids before calling get_tool or compare_tools. Returns `count` and `tools`, each with `id`, `name`, `vendor`, `dataset`, `checked` (date the vendor page was last read), `plans` (count) and `page` URL; no prices or limits, those live in get_tool. Without `dataset` it returns every product across all datasets (about 100 rows); with `dataset` only that one. Not paginated, no auth, no side effects. When the user already names a product, skip this and call get_tool or search_limits directly.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "dataset": {
            "description": "Dataset id to list. One of: ai-plans, usage, email-sending, llm-apis, media, plans-new, scraping-proxies, search-apis, voice. Omit to cover every dataset.",
            "enum": [
              "ai-plans",
              "usage",
              "email-sending",
              "llm-apis",
              "media",
              "plans-new",
              "scraping-proxies",
              "search-apis",
              "voice"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_tools"
    },
    {
      "description": "Read-only keyword search across every plan, limit, rate, free tier, overage rule and gotcha in all datasets. Best first call for a question like \"Cursor Pro requests per month\", \"Retell cost per minute\" or \"Gemini API free tier RPM\". Returns `query`, `relaxed` (true when fewer than all words matched), `total`, `shown` and `rows`, each with `type` (plan, limit, rate, free, overage, unit or gotcha), `tool`, `tool_id`, `dataset`, `plan` and/or `metric`, `value`, `unit`, `published`, vendor `quote`, `sourceUrl`, `checked` date and `page`. Matching is case-insensitive on whole words; words that name a product must all match, other words are matched strictly first and then relaxed to at least half of them. At most `limit` rows (default 20, max 50), ranked by match quality; no pagination. Returns an empty `rows` array, not an error, when nothing matches; then try list_tools to find the product id and call get_tool.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "dataset": {
            "description": "Dataset id to narrow the search to. One of: ai-plans, usage, email-sending, llm-apis, media, plans-new, scraping-proxies, search-apis, voice. Omit to cover every dataset.",
            "enum": [
              "ai-plans",
              "usage",
              "email-sending",
              "llm-apis",
              "media",
              "plans-new",
              "scraping-proxies",
              "search-apis",
              "voice"
            ],
            "type": "string"
          },
          "limit": {
            "default": 20,
            "description": "Maximum rows to return.",
            "maximum": 50,
            "minimum": 1,
            "type": "integer"
          },
          "query": {
            "description": "Plain words: vendor, plan and metric, e.g. \"cursor pro requests\" or \"vapi per minute\". No operators.",
            "minLength": 2,
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "search_limits"
    }
  ]
}

What the leaf hashes

{"body":"4a86303589b81b542e8853edb881d0b1a1147bf0a6ca51a986bf5a613e0d0557","id":1288476,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793391804366249,"prev":null,"subject":"27816c1d-c259-473d-86cb-ef0049952391","subject_kind":"endpoint"}

Proof

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

  1. 0x7e00b060e1b989751afdb1234784f945c5e226d68f30a0c636766287558e864a
  2. 0x0a0ceaefbf8a3fad1dbc70e97eb91b7e150a70e2fac77123d61a92d41f3bfa65
  3. 0x8bcaaf524ce6939305b971b831706e6ee309adc8dda5f606b34b0becf3e1f021
  4. 0x7682838ba34d1bbb76a33505966a49a8fa19aa6ca0418e7090e0d09b32d16b65
  5. 0xf6b5cdacfbbf4ed1a6e9daa11878e19987bbb7a2860af46e94a1fe0a63ee1f55
  6. 0x4ae0df6041695e37539c810647135be5207c38f3dc0ab7e8e5642954fa7bd761
  7. 0x126914f6f9d3a9e4a57cf3a67141eb774ddd05276edbc1a4d4954d206aea2af5
  8. 0x0e1a63de79888d4598b664e6ac370233a08f329f2dca40126af70efd1a769ce0
  9. 0xfac1e93c29f71d6b461279caef9442954354a084114b7abfa3e911996d6eaac7
  10. 0xe3343abc177525ba6e83eab702b2643335911b8eaa679a43be95e196c3ebd5d9
  11. 0xb09e1b91146136852c37d639a03ebca2e29f564d43d425bed8367aeb4d58e4f1
  12. 0xcf45f2dcc5888aaadc0eb496a54cc515a0a59ac8c35821d099c43cdc3ab3abad
  13. 0xa7d56640df9ea5dff8b1806e8b12302229aca5a856e7e8485fd58e4585190f8d
  14. 0x98147b4434f11be9b2162fe0bf2cff64bd30ca1bfe5cd0edf25228078b678708
  15. 0x235114e50a987e65d728b9ef8b5978846cd7c01f22effc55dd604c388ce359ec
  16. 0xdbaaffa44665d1fa60d33d2c4075bd87629b76d01a6ee63e621e78590303b56d
  17. 0xffe660edb9e5c6e3449a49454634c3e7b2f9fe703e5697f723b021735647ab7e
  18. 0x30a81d8fcef4e8f9e2877c62796cfc5612fc1b251127d531dee28f8dbd5c5147
Day root
0x0826c7ad6039e06a2360ca0a4a3a4fe7f2626c6dc19f71a37599386f78b39875
Chained
0x36b4c8a1063758f0b8765fa1bdf75fa92fb543cc183add3e261880ee2bd1f822
Published
On Arc Testnet, block 69923247: 0x8704744146c6967c8abc9e9a99de4db7283b29e840922ea83a69b6fe776e6861

How to check it · This row as JSON