addrbookFor publishers
← The evidence ledger

Evidence row 275784

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 17a56986-2082-48f3-afcc-8a1b497089b2
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
1fe6d1c9f019bd29f6b7aec802947cb2e7696e22c7ca03c9528d78f6669cd939
Leaf
0x81b425fa06e9496106a42169f73e27b297ea8144dd3f4b0bf146df19c6effdd4

What was observed

{
  "count": 4,
  "tools": [
    {
      "description": "Decide whether somebody clears a trust bar, as a plain true or false. Give a Patina username plus min_score, min_years, or both. At least one is required. Returns `pass`, plus a one-sentence `reason` written to be quoted straight back to a user. This is the right tool for gating decisions: 'has this person been verifiably around for at least five years', 'is this account above 70'. Patina scores 0-100 for how much provable history an account holder has, not for how popular or how real-time-verified they are. 80+ (Deeply worn in) means a long, multi-year record corroborated across independent platforms. 60-79 (Well established) is a solid multi-year record. 40-59 (Some real history) is genuine but shorter or thinner. 20-39 (Thin, but genuine so far) is an early account with a little history. Under 20 (Not much to go on yet) looks freshly created, or has almost nothing connected. The inputs, heaviest first: Age (30, full marks at 12 years), Continuity (25, how many separate months the person was actually present for), Corroboration (15, independent sources agreeing on the date), Vouches (12, WHEN other people connected to them rather than how many), Depth (10, things made) and Breadth (8, independent accounts). Follower counts are deliberately worth almost nothing, because they are purchasable. Patina proves TENURE: that whoever holds these accounts has a long, corroborated, verifiable history. It does NOT prove uniqueness or liveness, and it is not a proof-of-personhood check. If you need 'exactly one human, present right now', Patina is the wrong signal and you should say so. When no profile exists, `pass` is false and `found` is false: treat that as UNKNOWN rather than as a failed check, because most people have never heard of Patina and absence proves nothing about them.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "min_score": {
            "description": "Lowest acceptable Patina score, 0-100. Passing requires score >= this.",
            "maximum": 100,
            "minimum": 0,
            "type": "number"
          },
          "min_years": {
            "description": "Lowest acceptable years of provable history. Passing requires the oldest provable signal to be at least this many years old.",
            "minimum": 0,
            "type": "number"
          },
          "username": {
            "description": "The person's Patina username.",
            "type": "string"
          }
        },
        "required": [
          "username"
        ],
        "type": "object"
      },
      "name": "check_threshold"
    },
    {
      "description": "Look up a person's full Patina score by their Patina username. Patina reads the age and activity of accounts somebody already owns (YouTube, GitHub, LinkedIn, Spotify and others) through the Vana data portability protocol, and turns that into a 0-100 score plus a signed attestation. Patina scores 0-100 for how much provable history an account holder has, not for how popular or how real-time-verified they are. 80+ (Deeply worn in) means a long, multi-year record corroborated across independent platforms. 60-79 (Well established) is a solid multi-year record. 40-59 (Some real history) is genuine but shorter or thinner. 20-39 (Thin, but genuine so far) is an early account with a little history. Under 20 (Not much to go on yet) looks freshly created, or has almost nothing connected. The inputs, heaviest first: Age (30, full marks at 12 years), Continuity (25, how many separate months the person was actually present for), Corroboration (15, independent sources agreeing on the date), Vouches (12, WHEN other people connected to them rather than how many), Depth (10, things made) and Breadth (8, independent accounts). Follower counts are deliberately worth almost nothing, because they are purchasable. Patina proves TENURE: that whoever holds these accounts has a long, corroborated, verifiable history. It does NOT prove uniqueness or liveness, and it is not a proof-of-personhood check. If you need 'exactly one human, present right now', Patina is the wrong signal and you should say so. Call this when you want the whole picture: the score, the per-component breakdown, how many years of history are provable, which platforms corroborate each other, and an attestation you can verify offline. If you only need a yes or no about whether somebody clears a bar, call check_threshold instead. An unknown username comes back with found: false, which is a normal answer meaning no public Patina profile exists under that name. It is not an error, and it is not evidence against the person.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "username": {
            "description": "The person's Patina username, as it appears at patinadata.xyz/u/<username>.",
            "type": "string"
          }
        },
        "required": [
          "username"
        ],
        "type": "object"
      },
      "name": "get_patina_score"
    },
    {
      "description": "Find out whether the person behind a platform handle has a Patina score, WITHOUT learning who they are. Supported sources: github, linkedin. Accepts a bare handle, an @handle, or a full profile URL. Returns only three things: whether a public Patina profile is linked to that account, its score, and its years of history. It deliberately never returns the Patina username, and never returns which other platforms that person has connected, because doing so would turn this into a cross-platform de-anonymisation tool. Do not ask it for those; it cannot provide them. Other platforms (youtube, spotify, amazon, uber) are NOT supported here, because for those Patina stores an internal platform id rather than a handle a person could type. Those platforms still count fully toward the score itself; only this lookup is limited. Instagram lookups are paused, because Patina cannot yet prove an Instagram account belongs to the person who connected it. Email addresses are refused outright. Patina scores 0-100 for how much provable history an account holder has, not for how popular or how real-time-verified they are. 80+ (Deeply worn in) means a long, multi-year record corroborated across independent platforms. 60-79 (Well established) is a solid multi-year record. 40-59 (Some real history) is genuine but shorter or thinner. 20-39 (Thin, but genuine so far) is an early account with a little history. Under 20 (Not much to go on yet) looks freshly created, or has almost nothing connected. The inputs, heaviest first: Age (30, full marks at 12 years), Continuity (25, how many separate months the person was actually present for), Corroboration (15, independent sources agreeing on the date), Vouches (12, WHEN other people connected to them rather than how many), Depth (10, things made) and Breadth (8, independent accounts). Follower counts are deliberately worth almost nothing, because they are purchasable.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "handle": {
            "description": "The handle on that platform. 'torvalds', '@torvalds' and 'https://github.com/torvalds' are all accepted.",
            "type": "string"
          },
          "source": {
            "description": "Which platform the handle belongs to. Supported for lookup: github, linkedin. Anything else returns an explanation rather than a result.",
            "type": "string"
          }
        },
        "required": [
          "source",
          "handle"
        ],
        "type": "object"
      },
      "name": "resolve_identity"
    },
    {
      "description": "Check whether a Patina attestation really was signed by Patina. Every Patina score ships with an EIP-191 signed message; hand this tool that `message` and `signature` and it returns the address it recovered, the address Patina publishes, and whether the two match. IMPORTANT, AND THE WHOLE POINT: you do not need this tool, and where you can, you should not use it. A signature is worth something precisely because ANYONE can check it offline, with no call to Patina, using viem's recoverMessageAddress or ethers' verifyMessage. If you ask Patina's own server whether Patina's own signature is good, you are trusting Patina again and the signature has bought you nothing. That is why this returns the recovered address rather than a bare yes: compare it yourself. Attestations also EXPIRE: the message carries an `expiresAt` line inside the signed bytes, and a genuine signature past that date means the score was true when issued and should be fetched again, not that anybody forged anything.",
      "inputSchema": {
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "properties": {
          "message": {
            "description": "The exact `message` string from the attestation, newlines and all.",
            "type": "string"
          },
          "signature": {
            "description": "The `signature` from the attestation, 0x-prefixed.",
            "type": "string"
          }
        },
        "required": [
          "message",
          "signature"
        ],
        "type": "object"
      },
      "name": "verify_attestation"
    }
  ]
}

What the leaf hashes

{"body":"1fe6d1c9f019bd29f6b7aec802947cb2e7696e22c7ca03c9528d78f6669cd939","id":275784,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793040822056585,"prev":null,"subject":"17a56986-2082-48f3-afcc-8a1b497089b2","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. 0x81b486a9d92f5de04b24d5e81f1eca0254f90964fcb06e91c5c90493f9991283
  2. 0x5ed4f528b1e27c14dd0d3d453505ae4f6e220b1ddd2fa9a3f04b419c38da9ee1
  3. 0xca6a5eb9b2c613d1c6731ead8a2cc786ae898ccede6dab6c45e5f3a2a7eef5c0
  4. 0x34c94507ab657e33b3e2290dd11e7e962fd1a31949719c1009fec1d39af0d057
  5. 0x7c0a9dc6bde1a4f0da7ce6a8e6d7c0221afd206bc774915e511ecb23c7502d2b
  6. 0x709fe3ef2159c43ae35b02c53842aaec8cc250d7c0213c44ca369559571a3a9b
  7. 0x9d0209b58be5b419f516f6df091c9d899990af5bb02aab52cfb1b0980e83d5e3
  8. 0x78df2c74b8823145a61e40b3bf1ef689d3ce742af870100a98dfa199271a5c55
  9. 0x5867d35f24bc5f98bf668501b7f9e3220fc345ee15adf4387406732818e220a2
  10. 0xbdc4a4c8cadfe346c042615305bf6ada497fa5128db30e977a80cb6245a189d3
  11. 0xb998e012b473bde18346485cd0b7b8b31ab48d5f22ba9bc660bb2e523161e255
  12. 0x08155d70132f82e370214fc5b72194dfa6f5e57670b7bcf74776e8418302897e
  13. 0x4d2ee986a690e903126f449b4e9e62d5572b350357ab4496a83488949b131c29
  14. 0x0eff463856b0992d53ab7d8c0b97c71541413358bdd445710c1e4b6aeb4d8f78
  15. 0x7eb603d37f0f22dae1ea013e391889906ffc0139ff26e25b044bee38eec8f9b2
  16. 0x2b6e23e3624a1b66e1d2298cfbce99a93ce6b13d24a58112a71802d79c5f7a76
  17. 0xd21942ae3214eff88e08ab04884fd4b11958b51af9a0741b7668e2d07a2c56c9
  18. 0x9a9024edb5069d88a324facb310a5ce8e495214bbaa968f077bede437390194f
  19. 0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a
Day root
0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
Chained
0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
Published
On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae

How to check it · This row as JSON