addrbookFor publishers
← The evidence ledger

Evidence row 309478

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 995453d2-3ac6-4f50-af65-be100ee7353f
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
8d9b188afd611749c7ff39356453b2061d1e0ed1a18ecb7383f4b689ea5d1959
Leaf
0x082f1aaab65e2cf8515a43c0e32c7172d3bb84b5acc3194d96ec0125514b418e

What was observed

{
  "count": 14,
  "tools": [
    {
      "description": "Check whether one Twitter/X user follows another. Far cheaper than fetching a follower list — use this whenever the question is about a specific pair of accounts. Both IDs must be numeric.",
      "inputSchema": {
        "properties": {
          "source_user_id": {
            "description": "The numeric ID of the user who might be following, as a string.",
            "type": "string"
          },
          "target_user_id": {
            "description": "The numeric ID of the user who might be followed, as a string.",
            "type": "string"
          }
        },
        "required": [
          "source_user_id",
          "target_user_id"
        ],
        "type": "object"
      },
      "name": "check_is_following"
    },
    {
      "description": "Fetch one page of posts from a Twitter/X list, newest first. A page is large — around 100 posts — plus a next_cursor. Billing is per result, so one call here costs several times a single-user timeline call; do not page through a busy list unless the user asked for that.",
      "inputSchema": {
        "properties": {
          "cursor": {
            "description": "Pagination cursor from a previous call's next_cursor. Omit for the first page.",
            "type": "string"
          },
          "list_id": {
            "description": "The numeric Twitter/X list ID, as a string.",
            "type": "string"
          }
        },
        "required": [
          "list_id"
        ],
        "type": "object"
      },
      "name": "get_list_tweets"
    },
    {
      "description": "Fetch a single Twitter/X post by its numeric ID, including engagement counts. Bills one post request against the caller's balance.",
      "inputSchema": {
        "properties": {
          "tweet_id": {
            "description": "The numeric post ID, as a string.",
            "type": "string"
          }
        },
        "required": [
          "tweet_id"
        ],
        "type": "object"
      },
      "name": "get_tweet"
    },
    {
      "description": "Fetch one page of replies to a Twitter/X post. Returns about 20 replies plus a next_cursor. The first item of a page can repeat the last item of the previous page, so de-duplicate by post id when paging. Each call bills against the caller's balance — do not page through the whole conversation unless the user asked for that.",
      "inputSchema": {
        "properties": {
          "cursor": {
            "description": "Pagination cursor from a previous call's next_cursor. Omit for the first page.",
            "type": "string"
          },
          "tweet_id": {
            "description": "The numeric ID of the post whose replies you want, as a string.",
            "type": "string"
          }
        },
        "required": [
          "tweet_id"
        ],
        "type": "object"
      },
      "name": "get_tweet_comments"
    },
    {
      "description": "Fetch one page of a Twitter/X thread — the chain of follow-up posts the author wrote under their own post (\"1/\", \"2/\", ...). Give it the ID of any post in the chain and it returns that chain in order. It does NOT return what other people replied; use get_tweet_comments for those. A post the author never followed up on is a one-post thread and correctly returns just that post. Roughly 30 posts per page plus a next_cursor, so a long thread takes several calls. Each call bills against the caller's balance — do not page through a long thread unless the user asked for that.",
      "inputSchema": {
        "properties": {
          "cursor": {
            "description": "Pagination cursor from a previous call's next_cursor. Omit for the first page.",
            "type": "string"
          },
          "tweet_id": {
            "description": "The numeric post ID, as a string.",
            "type": "string"
          }
        },
        "required": [
          "tweet_id"
        ],
        "type": "object"
      },
      "name": "get_tweet_thread"
    },
    {
      "description": "Look up a Twitter/X user profile by numeric user ID. Bills one user request against the caller's balance.",
      "inputSchema": {
        "properties": {
          "user_id": {
            "description": "The numeric Twitter/X user ID, as a string (IDs exceed safe integer precision).",
            "type": "string"
          }
        },
        "required": [
          "user_id"
        ],
        "type": "object"
      },
      "name": "get_user_by_id"
    },
    {
      "description": "Look up a Twitter/X user profile by username (handle). Returns the profile including follower and following counts. Bills one user request against the caller's balance.",
      "inputSchema": {
        "properties": {
          "username": {
            "description": "The Twitter/X username (handle), with or without the leading @.",
            "type": "string"
          }
        },
        "required": [
          "username"
        ],
        "type": "object"
      },
      "name": "get_user_by_username"
    },
    {
      "description": "Fetch one page of a user's followers. This is one of the most expensive tools: a page is set upstream and can run to ~100 user records, every one of which is billed. Never page through a large account's followers without the user explicitly asking. Requires a numeric user ID.",
      "inputSchema": {
        "properties": {
          "cursor": {
            "description": "Pagination cursor from a previous call's next_cursor. Omit for the first page.",
            "type": "string"
          },
          "user_id": {
            "description": "The numeric Twitter/X user ID whose followers you want, as a string.",
            "type": "string"
          }
        },
        "required": [
          "user_id"
        ],
        "type": "object"
      },
      "name": "get_user_followers"
    },
    {
      "description": "Fetch one page of the accounts a user follows. Expensive: a page is set upstream and can run to ~100 user records, every one of which is billed. Never page through a large account's following list without the user explicitly asking. Requires a numeric user ID.",
      "inputSchema": {
        "properties": {
          "cursor": {
            "description": "Pagination cursor from a previous call's next_cursor. Omit for the first page.",
            "type": "string"
          },
          "user_id": {
            "description": "The numeric Twitter/X user ID whose following list you want, as a string.",
            "type": "string"
          }
        },
        "required": [
          "user_id"
        ],
        "type": "object"
      },
      "name": "get_user_following"
    },
    {
      "description": "Fetch one page of posts mentioning a given user, newest first. Returns about 20 posts plus a next_cursor. The first item of a page can repeat the last item of the previous page, so de-duplicate by post id when paging. Each call bills against the caller's balance.",
      "inputSchema": {
        "properties": {
          "cursor": {
            "description": "Pagination cursor from a previous call's next_cursor. Omit for the first page.",
            "type": "string"
          },
          "username": {
            "description": "The Twitter/X username (handle) being mentioned, with or without the leading @.",
            "type": "string"
          }
        },
        "required": [
          "username"
        ],
        "type": "object"
      },
      "name": "get_user_mentions"
    },
    {
      "description": "Fetch one page of a user's own posts (excluding replies), newest first. Returns about 20 posts plus a next_cursor. If the account has a pinned post it is prepended to every page, so de-duplicate by post id when paging. Each call bills against the caller's balance — do not page through a whole timeline unless the user asked for that. Requires a numeric user ID: call get_user_by_username first if you only have a handle.",
      "inputSchema": {
        "properties": {
          "cursor": {
            "description": "Pagination cursor from a previous call's next_cursor. Omit for the first page.",
            "type": "string"
          },
          "user_id": {
            "description": "The numeric Twitter/X user ID, as a string.",
            "type": "string"
          }
        },
        "required": [
          "user_id"
        ],
        "type": "object"
      },
      "name": "get_user_tweets"
    },
    {
      "description": "Fetch one page of a user's posts including their replies, newest first. Returns about 20 items plus a next_cursor. If the account has a pinned post it is prepended to every page, so de-duplicate by post id when paging. Each call bills against the caller's balance. Requires a numeric user ID: call get_user_by_username first if you only have a handle.",
      "inputSchema": {
        "properties": {
          "cursor": {
            "description": "Pagination cursor from a previous call's next_cursor. Omit for the first page.",
            "type": "string"
          },
          "user_id": {
            "description": "The numeric Twitter/X user ID, as a string.",
            "type": "string"
          }
        },
        "required": [
          "user_id"
        ],
        "type": "object"
      },
      "name": "get_user_tweets_and_replies"
    },
    {
      "description": "Search Twitter/X posts. Returns one page of about 20 results plus a\nnext_cursor, and bills one search request against the caller's balance.\n\nThe query supports Twitter's advanced search operators, and using them is\nalmost always better than a bare keyword search:\n  from:handle          posts by an account\n  to:handle            replies to an account\n  @handle              posts mentioning an account\n  #tag                 hashtag\n  \"exact phrase\"       phrase match\n  since:2026-01-01     posts on or after a date\n  until:2026-02-01     posts before a date\n  min_faves:100        at least N likes\n  min_retweets:10      at least N retweets\n  filter:links         posts containing links\n  -filter:replies      exclude replies\nCombine them freely: from:jack min_faves:500 since:2026-01-01",
      "inputSchema": {
        "properties": {
          "cursor": {
            "description": "Pagination cursor from a previous call's next_cursor. Omit for the first page.",
            "type": "string"
          },
          "query": {
            "description": "The search query. Supports Twitter advanced search operators such as from:, to:, since:, until:, min_faves: and filter:.",
            "type": "string"
          },
          "type": {
            "default": "Latest",
            "description": "Latest returns the newest matching posts; Top returns the most engaged-with. Defaults to Latest.",
            "enum": [
              "Latest",
              "Top"
            ],
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "search_tweets"
    },
    {
      "description": "Search Twitter/X user profiles by name or handle. Returns one page of matching profiles and bills against the caller's balance. Use this when you know roughly who someone is but not their exact handle.",
      "inputSchema": {
        "properties": {
          "query": {
            "description": "Name or handle to search for.",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "search_users"
    }
  ]
}

What the leaf hashes

{"body":"8d9b188afd611749c7ff39356453b2061d1e0ed1a18ecb7383f4b689ea5d1959","id":309478,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793058917492159,"prev":null,"subject":"995453d2-3ac6-4f50-af65-be100ee7353f","subject_kind":"endpoint"}

Proof

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

  1. 0x082ec2951633f0188b3f25445a154f819c7cc4309cf7906daf6e0a73641730f3
  2. 0x267f8034f14564ed04d1afdb4efab0c11f1c42af71e2998da530a30aab03a791
  3. 0x92a987c29edc42f1f4cfec9d5ad7b99d896a6f8f1341d4ec5d6761f21b5d0813
  4. 0xa1acc568daa9506dbfadb7170952e4ee2386f97738a194caf9fc5f1eb3509b29
  5. 0xda49069ec39d97c0b694a85cf8dd9ecd87ff733a305967e771ad8961fd468322
  6. 0x37056156c9c77a4c4576748722b7625f9a898e8396e2bb8efd568e4ea05c73cd
  7. 0xd36fdf454717c0743478bdf980117945a51a363c103c3b89317d27fd52b1b77b
  8. 0x960b6af45a51a246581332c253046d53f8e1cf7a3efc1e31d2609de8ac177c8d
  9. 0x17487bdd8a24c59ee9743f1f5e4fe998668e6e05e30a4719999b9bec35cb8955
  10. 0x8c7a98ae2cb4ce9806641729f82b9b19104c8b000de3727bbd7eb046927d1d21
  11. 0x3585060104222ad1aae3396450719e555d4d013fa2b3a7b43777a1722ca9ce22
  12. 0x6003e14d04cde1d24b195ac15b568dd483e04047e0f2ff64d9632a51a8f7123d
  13. 0xe5a836cf25a8dfc72c9e3b6a69a7561a1f61f50f9cf36707d36f6e926aa15dec
  14. 0xa96bb9408ce00a0d40ddaba8736257dfce76d5478b131d69db1afdf8a824312b
  15. 0x7ddc2fead128357f881b63e6c7c26d7fbbb84fca6c7c8e0bbfe386de86ca8d39
  16. 0xc6a4d7899a0f442958e26505011190b7cff2483611c1b94eba9043e0ba9ac36e
  17. 0x8c756542e482157df0c36464d75c937b845e4423dbbcfad08f0cf8d5a16b9a13
  18. 0x20704208aa6923d6b2450ef74ede87a6e0265d46447926038fe9506e9e154b2d
  19. 0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a
Day root
0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
Chained
0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
Published
On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae

How to check it · This row as JSON