@forestrie/mcp-resolve
Fetch a SCITT receipt, its genesis and on-chain accumulator for @forestrie/mcp-verify to verify
npm · fingerprint c6632ace6e034dfdbfb4f516 · repository · RSS
8tools
3recorded versions
23dtracked
changed since 13 Oct
What changed
Changed between 13 October 2026 and 26 October 2026 (first seen 2026-10-26 13:08 UTC)
7 schema or annotation changes with the description left byte-identical, 1 tool added.
--- pinned/fetch_accumulator +++ observed/fetch_accumulator { "annotations": { "destructiveHint": false, + "block": { + "additionalProperties": false, + "properties": { + "blockHash": { + "type": "string" + }, + "blockNumber": { + "type": "number" + } + }, + "required": [ + "blockNumber", + "blockHash" + ], + "type": "object" + }, + "chainFrom": { + "const": "held-genesis", + "type": "string" + }, "from": { "anyOf": [ { + }, + { + "additionalProperties": false, + "properties": { + "chainId": { + "type": "number" + }, + "root": { + "type": "string" + }, + "rpcUrl": { + "type": "string" + } + }, + "required": [ + "rpcUrl", + "root", + "chainId" + ], + "type": "object" } ] },
--- pinned/fetch_checkpoint_history +++ observed/fetch_checkpoint_history { "annotations": { "destructiveHint": false, + "block": { + "additionalProperties": false, + "properties": { + "blockHash": { + "type": "string" + }, + "blockNumber": { + "type": "number" + } + }, + "required": [ + "blockNumber", + "blockHash" + ], + "type": "object" + }, + "chainFrom": { + "const": "held-genesis", + "type": "string" + }, "from": { "anyOf": [ { + }, + { + "additionalProperties": false, + "properties": { + "chainId": { + "type": "number" + }, + "root": { + "type": "string" + }, + "rpcUrl": { + "type": "string" + } + }, + "required": [ + "rpcUrl", + "root", + "chainId" + ], + "type": "object" } ] },
--- pinned/fetch_genesis +++ observed/fetch_genesis { "annotations": { "destructiveHint": false, + "block": { + "additionalProperties": false, + "properties": { + "blockHash": { + "type": "string" + }, + "blockNumber": { + "type": "number" + } + }, + "required": [ + "blockNumber", + "blockHash" + ], + "type": "object" + }, + "chainFrom": { + "const": "held-genesis", + "type": "string" + }, "from": { "anyOf": [ { + }, + { + "additionalProperties": false, + "properties": { + "chainId": { + "type": "number" + }, + "root": { + "type": "string" + }, + "rpcUrl": { + "type": "string" + } + }, + "required": [ + "rpcUrl", + "root", + "chainId" + ], + "type": "object" } ] },
+ tool added: fetch_ks256_attestation
--- pinned/fetch_receipt +++ observed/fetch_receipt { "annotations": { "destructiveHint": false, + "block": { + "additionalProperties": false, + "properties": { + "blockHash": { + "type": "string" + }, + "blockNumber": { + "type": "number" + } + }, + "required": [ + "blockNumber", + "blockHash" + ], + "type": "object" + }, + "chainFrom": { + "const": "held-genesis", + "type": "string" + }, "from": { "anyOf": [ { + }, + { + "additionalProperties": false, + "properties": { + "chainId": { + "type": "number" + }, + "root": { + "type": "string" + }, + "rpcUrl": { + "type": "string" + } + }, + "required": [ + "rpcUrl", + "root", + "chainId" + ], + "type": "object" } ] },
--- pinned/fetch_scitt_configuration +++ observed/fetch_scitt_configuration { "annotations": { "destructiveHint": false, + "block": { + "additionalProperties": false, + "properties": { + "blockHash": { + "type": "string" + }, + "blockNumber": { + "type": "number" + } + }, + "required": [ + "blockNumber", + "blockHash" + ], + "type": "object" + }, + "chainFrom": { + "const": "held-genesis", + "type": "string" + }, "from": { "anyOf": [ { + }, + { + "additionalProperties": false, + "properties": { + "chainId": { + "type": "number" + }, + "root": { + "type": "string" + }, + "rpcUrl": { + "type": "string" + } + }, + "required": [ + "rpcUrl", + "root", + "chainId" + ], + "type": "object" } ] },
--- pinned/query_registration +++ observed/query_registration { "annotations": { "destructiveHint": false, + "block": { + "additionalProperties": false, + "properties": { + "blockHash": { + "type": "string" + }, + "blockNumber": { + "type": "number" + } + }, + "required": [ + "blockNumber", + "blockHash" + ], + "type": "object" + }, + "chainFrom": { + "const": "held-genesis", + "type": "string" + }, "from": { "anyOf": [ { + }, + { + "additionalProperties": false, + "properties": { + "chainId": { + "type": "number" + }, + "root": { + "type": "string" + }, + "rpcUrl": { + "type": "string" + } + }, + "required": [ + "rpcUrl", + "root", + "chainId" + ], + "type": "object" } ] },
--- pinned/verify_fetched_receipt +++ observed/verify_fetched_receipt { "annotations": { "destructiveHint": false, + "block": { + "additionalProperties": false, + "properties": { + "blockHash": { + "type": "string" + }, + "blockNumber": { + "type": "number" + } + }, + "required": [ + "blockNumber", + "blockHash" + ], + "type": "object" + }, + "chainFrom": { + "const": "held-genesis", + "type": "string" + }, "from": { "anyOf": [ { + }, + { + "additionalProperties": false, + "properties": { + "chainId": { + "type": "number" + }, + "root": { + "type": "string" + }, + "rpcUrl": { + "type": "string" + } + }, + "required": [ + "rpcUrl", + "root", + "chainId" + ], + "type": "object" } ] }, + "block": { + "additionalProperties": false, + "properties": { + "blockHash": { + "type": "string" + }, + "blockNumber": { + "type": "number" + } + }, + "required": [ + "blockNumber", + "blockHash" + ], + "type": "object" + }, + "chainFrom": { + "const": "held-genesis", + "type": "string" + }, "from": { "anyOf": [ { + }, + { + "additionalProperties": false, + "properties": { + "chainId": { + "type": "number" + }, + "root": { + "type": "string" + }, + "rpcUrl": { + "type": "string" + } + }, + "required": [ + "rpcUrl", + "root", + "chainId" + ], + "type": "object" } ] },
Changed 2026-10-13 14:23 UTC
3 descriptions rewritten, 3 schema or annotation changes with the description left byte-identical.
--- pinned/fetch_accumulator +++ observed/fetch_accumulator { "annotations": { "destructiveHint": false, - "anyOf": [ - { - "properties": { - "genesis": { - "anyOf": [ - { - "description": "standard base64", - "properties": { - "base64": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "base64" - ], - "type": "object" - }, - { - "description": "filesystem path, read by the stdio adapter", - "properties": { - "path": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "path" - ], - "type": "object" + "description": "The forest's chain binding: {genesis, logId, rpcUrl?} from a genesis you hold, or {univocity, chainId?, logId, rpcUrl?} given explicitly. Never defaulted, never taken from a fetched genesis, never read from the environment except rpcUrl.", + "properties": { + "chainId": { + "description": "with univocity only: checked against eth_chainId before any eth_call, if given", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "genesis": { + "anyOf": [ + { + "description": "standard base64", + "properties": { + "b64": { + "minLength": 1, + "type": "string" } + }, + "required": [ + "b64" ], - "description": "a genesis document you hold; univocity and chainId are decoded from it" + "type": "object" }, - "history": { - "description": "Bounds for the CheckpointPublished scan: fromBlock (do not scan below this block), maxBlocks (stop after this many blocks; default 200000), chunkBlocks (blocks per eth_getLogs request; default 10000). The scan walks backwards from the latest block, newest window first, one request per window, and stops at the first checkpoint that holds the receipt's peak. Running out of range is a structured problem, code history_scan_exhausted, with scannedFrom, scannedTo and checkpointsSeen; it is not an error.", + { + "description": "standard base64 (alias of b64)", "properties": { - "chunkBlocks": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "fromBlock": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "maxBlocks": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" + "base64": { + "minLength": 1, + "type": "string" } }, + "required": [ + "base64" + ], "type": "object" }, - "logId": { - "description": "UUID (with dashes), or a 16/32-byte hex log id", - "minLength": 1, - "type": "string" - }, - "rpcUrl": { - "description": "your own chain RPC access; falls back to FORESTRIE_RPC_URL when omitted — the package ships no provider", - "minLength": 1, - "type": "string" + { + "description": "filesystem path, read by the stdio adapter", + "properties": { + "path": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" } - }, - "required": [ - "genesis", - "logId" ], - "type": "object" + "description": "a genesis document you hold; univocity and chainId are decoded from it (give this OR univocity) — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" }, - { + "history": { + "description": "Bounds for the CheckpointPublished scan: fromBlock (do not scan below this block), maxBlocks (stop after this many blocks; default 200000), chunkBlocks (blocks per eth_getLogs request; default 10000). The scan walks backwards from the latest block, newest window first, one request per window, and stops at the first checkpoint that holds the receipt's peak. Running out of range is a structured problem, code history_scan_exhausted, with scannedFrom, scannedTo and checkpointsSeen; it is not an error.", "properties": { - "chainId": { - "description": "checked against eth_chainId before any eth_call, if given", + "chunkBlocks": { + "exclusiveMinimum": 0, "maximum": 9007199254740991, - "minimum": -9007199254740991, "type": "integer" }, - "history": { - "description": "Bounds for the CheckpointPublished scan: fromBlock (do not scan below this block), maxBlocks (stop after this many blocks; default 200000), chunkBlocks (blocks per eth_getLogs request; default 10000). The scan walks backwards from the latest block, newest window first, one request per window, and stops at the first checkpoint that holds the receipt's peak. Running out of range is a structured problem, code history_scan_exhausted, with scannedFrom, scannedTo and checkpointsSeen; it is not an error.", - "properties": { - "chunkBlocks": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "fromBlock": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "maxBlocks": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "type": "object" - }, - "logId": { - "description": "UUID (with dashes), or a 16/32-byte hex log id", - "minLength": 1, - "type": "string" - }, - "rpcUrl": { - "description": "your own chain RPC access; falls back to FORESTRIE_RPC_URL when omitted — the package ships no provider", - "minLength": 1, - "type": "string" + "fromBlock": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" }, - "univocity": { - "description": "0x-prefixed or bare 40-hex address", - "minLength": 1, - "type": "string" + "maxBlocks": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" } }, - "required": [ - "univocity", - "logId" - ], "type": "object" + }, + "logId": { + "description": "UUID (with dashes), or a 16/32-byte hex log id; sent to the operator in UUID form", + "minLength": 1, + "type": "string" + }, + "rpcUrl": { + "description": "your own chain RPC access; falls back to FORESTRIE_RPC_URL when omitted — the package ships no provider", + "minLength": 1, + "type": "string" + }, + "univocity": { + "description": "the univocity contract address, given explicitly (give this OR genesis)", + "minLength": 1, + "type": "string" } + }, + "required": [ + "logId" ], - "description": "The forest's chain binding: from a genesis you hold, or given explicitly. Never defaulted, never taken from a fetched genesis, never read from the environment except rpcUrl." + "type": "object" }, "forReceipt": { - "description": "The receipt this snapshot must hold the peak of: receipt (base64) with the exact registered payload (base64) and its entryId, or with grant true and payload set to the committed grant bytes. These are the leaf inputs the verifier needs to recompute the receipt's peak; nothing is verified here beyond that. With forReceipt the tool returns the latest state only if it holds the peak, and otherwise looks back through published checkpoint history within chain.history. Without forReceipt the tool returns the latest state.", + "description": "The receipt this snapshot must hold the peak of: receipt (bytes) with the exact registered payload (bytes) and its entryId, or with grant true and payload set to the committed grant bytes. These are the leaf inputs the verifier needs to recompute the receipt's peak; nothing is verified here beyond that. With forReceipt the tool returns the latest state only if it holds the peak, and otherwise looks back through published checkpoint history within chain.history. Without forReceipt the tool returns the latest state.", "properties": { "entryId": { "description": "required for payload verification; optional for a COSE grant, required for a raw grant payload", + "b64": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "b64" + ], + "type": "object" + }, + { + "description": "standard base64 (alias of b64)", + "properties": { "base64": { "minLength": 1, "type": "string" - "description": "the exact registered payload (payload verification), or the committed grant bytes when grant:true" + "description": "the exact registered payload (payload verification), or the committed grant bytes when grant:true — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" }, "receipt": { "anyOf": [ + "b64": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "b64" + ], + "type": "object" + }, + { + "description": "standard base64 (alias of b64)", + "properties": { "base64": { "minLength": 1, "type": "string" - "description": "the receipt bytes" + "description": "the receipt bytes — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" } }, "required": [
--- pinned/fetch_checkpoint_history +++ observed/fetch_checkpoint_history { "annotations": { "destructiveHint": false, - "anyOf": [ - { - "properties": { - "genesis": { - "anyOf": [ - { - "description": "standard base64", - "properties": { - "base64": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "base64" - ], - "type": "object" - }, - { - "description": "filesystem path, read by the stdio adapter", - "properties": { - "path": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "path" - ], - "type": "object" + "description": "The forest's chain binding: {genesis, logId, rpcUrl?} from a genesis you hold, or {univocity, chainId?, logId, rpcUrl?} given explicitly. Never defaulted, never taken from a fetched genesis, never read from the environment except rpcUrl.", + "properties": { + "chainId": { + "description": "with univocity only: checked against eth_chainId before any eth_call, if given", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "genesis": { + "anyOf": [ + { + "description": "standard base64", + "properties": { + "b64": { + "minLength": 1, + "type": "string" } + }, + "required": [ + "b64" ], - "description": "a genesis document you hold; univocity and chainId are decoded from it" + "type": "object" }, - "history": { - "description": "Bounds for the CheckpointPublished scan: fromBlock (do not scan below this block), maxBlocks (stop after this many blocks; default 200000), chunkBlocks (blocks per eth_getLogs request; default 10000). The scan walks backwards from the latest block, newest window first, one request per window, and stops at the first checkpoint that holds the receipt's peak. Running out of range is a structured problem, code history_scan_exhausted, with scannedFrom, scannedTo and checkpointsSeen; it is not an error.", + { + "description": "standard base64 (alias of b64)", "properties": { - "chunkBlocks": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "fromBlock": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "maxBlocks": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" + "base64": { + "minLength": 1, + "type": "string" } }, + "required": [ + "base64" + ], "type": "object" }, - "logId": { - "description": "UUID (with dashes), or a 16/32-byte hex log id", - "minLength": 1, - "type": "string" - }, - "rpcUrl": { - "description": "your own chain RPC access; falls back to FORESTRIE_RPC_URL when omitted — the package ships no provider", - "minLength": 1, - "type": "string" + { + "description": "filesystem path, read by the stdio adapter", + "properties": { + "path": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" } - }, - "required": [ - "genesis", - "logId" ], - "type": "object" + "description": "a genesis document you hold; univocity and chainId are decoded from it (give this OR univocity) — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" }, - { + "history": { + "description": "Bounds for the CheckpointPublished scan: fromBlock (do not scan below this block), maxBlocks (stop after this many blocks; default 200000), chunkBlocks (blocks per eth_getLogs request; default 10000). The scan walks backwards from the latest block, newest window first, one request per window, and stops at the first checkpoint that holds the receipt's peak. Running out of range is a structured problem, code history_scan_exhausted, with scannedFrom, scannedTo and checkpointsSeen; it is not an error.", "properties": { - "chainId": { - "description": "checked against eth_chainId before any eth_call, if given", + "chunkBlocks": { + "exclusiveMinimum": 0, "maximum": 9007199254740991, - "minimum": -9007199254740991, "type": "integer" }, - "history": { - "description": "Bounds for the CheckpointPublished scan: fromBlock (do not scan below this block), maxBlocks (stop after this many blocks; default 200000), chunkBlocks (blocks per eth_getLogs request; default 10000). The scan walks backwards from the latest block, newest window first, one request per window, and stops at the first checkpoint that holds the receipt's peak. Running out of range is a structured problem, code history_scan_exhausted, with scannedFrom, scannedTo and checkpointsSeen; it is not an error.", - "properties": { - "chunkBlocks": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "fromBlock": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "maxBlocks": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "type": "object" - }, - "logId": { - "description": "UUID (with dashes), or a 16/32-byte hex log id", - "minLength": 1, - "type": "string" - }, - "rpcUrl": { - "description": "your own chain RPC access; falls back to FORESTRIE_RPC_URL when omitted — the package ships no provider", - "minLength": 1, - "type": "string" + "fromBlock": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" }, - "univocity": { - "description": "0x-prefixed or bare 40-hex address", - "minLength": 1, - "type": "string" + "maxBlocks": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" } }, - "required": [ - "univocity", - "logId" - ], "type": "object" + }, + "logId": { + "description": "UUID (with dashes), or a 16/32-byte hex log id; sent to the operator in UUID form", + "minLength": 1, + "type": "string" + }, + "rpcUrl": { + "description": "your own chain RPC access; falls back to FORESTRIE_RPC_URL when omitted — the package ships no provider", + "minLength": 1, + "type": "string" + }, + "univocity": { + "description": "the univocity contract address, given explicitly (give this OR genesis)", + "minLength": 1, + "type": "string" } + }, + "required": [ + "logId" ], - "description": "The forest's chain binding: from a genesis you hold, or given explicitly. Never defaulted, never taken from a fetched genesis, never read from the environment except rpcUrl." + "type": "object" } }, "required": [
--- pinned/fetch_genesis +++ observed/fetch_genesis { "annotations": { "destructiveHint": false, - "description": "UUID (with dashes), or a 16/32-byte hex log id", + "description": "UUID (with dashes), or a 16/32-byte hex log id; sent to the operator in UUID form", "minLength": 1, "type": "string" }
--- pinned/fetch_receipt +++ observed/fetch_receipt { "annotations": { "destructiveHint": false, - "description": "GET a receipt: either by receiptUrl (as returned by query_registration) or by {baseUrl, bootstrapLogId, logId, massifHeight, entryId}. Returns the receipt bytes base64-encoded, the verifier's decoding of them, and receiptLogId: the log the receipt's delegation certificate names, which is the operator's statement like the rest of the receipt. Provenance: fetched. Supports: none on its own; a receipt is the operator's claim, so verify it under a trust root you hold (or use verify_fetched_receipt).", + "description": "GET a receipt: either by receiptUrl (as returned by query_registration) or by {baseUrl, bootstrapLogId, logId, massifHeight, entryId}. Returns the receipt bytes base64-encoded, the verifier's decoding of them, and receiptLogId: the log the receipt's delegation certificate names, which is the operator's statement like the rest of the receipt. A 404 is the structured problem not_found carrying the operator's own title (for example 'Entry receipt not found (checkpoint missing)' for a wrong massif height); it is never reported as pending, because a receipt URL the operator holds nothing at does not fill in by waiting. Provenance: fetched. Supports: none on its own; a receipt is the operator's claim, so verify it under a trust root you hold (or use verify_fetched_receipt).", "execution": { "taskSupport": "forbidden" }, - "description": "UUID (with dashes), or a 16/32-byte hex log id", + "description": "UUID (with dashes), or a 16/32-byte hex log id; sent to the operator in UUID form", "minLength": 1, "type": "string" }, - "description": "UUID (with dashes), or a 16/32-byte hex log id", + "description": "UUID (with dashes), or a 16/32-byte hex log id; sent to the operator in UUID form", "minLength": 1, "type": "string" },
--- pinned/query_registration +++ observed/query_registration { "annotations": { "destructiveHint": false, - "description": "One GET of {baseUrl}/logs/{bootstrapLogId}/{logId}/entries/{contentHash}, where contentHash is the hex sha256 of the signed statement bytes. Returns pending (with retryAfterMs when the server said so) or the receipt's URL and entry id. Never polls: call again yourself if you want to. Provenance: fetched. Supports: none of the four questions; this is registration status.", + "description": "One GET of {baseUrl}/logs/{bootstrapLogId}/{logId}/entries/{contentHash}, where contentHash is the hex sha256 of the signed statement bytes. Returns pending (with retryAfterMs when the server said so) or the receipt's URL, which includes the massif height, and the entry id. pending is the operator's answer for any content hash its sequencing index does not hold yet, including one that was never registered: the operator does not distinguish the two, so a retry only helps for a statement you know was submitted. receipt-available is the index's answer, not proof the receipt is written: fetch_receipt is the check, and a 404 there is not_found, never pending. Never polls: call again yourself if you want to. Provenance: fetched. Supports: none of the four questions; this is registration status.", "execution": { "taskSupport": "forbidden" }, - "description": "UUID (with dashes), or a 16/32-byte hex log id", + "description": "UUID (with dashes), or a 16/32-byte hex log id; sent to the operator in UUID form", "minLength": 1, "type": "string" }, - "description": "UUID (with dashes), or a 16/32-byte hex log id", + "description": "UUID (with dashes), or a 16/32-byte hex log id; sent to the operator in UUID form", "minLength": 1, "type": "string" }
--- pinned/verify_fetched_receipt +++ observed/verify_fetched_receipt { "annotations": { "destructiveHint": false, - "description": "Fetch a receipt (as fetch_receipt) and verify it with @forestrie/mcp-verify's core under a trust root you supply as bytes (genesis, keyXy, accumulator, or checkpoints) or under an accumulator read from the chain in this call ({root: 'known-accumulator', chain: {genesis, rpcUrl, logId?} or {rpcUrl, univocity, logId?, chainId?}}). A genesis fetched in the same call is never the root. The result is the verifier's own: stages, the four questions (sealing, split-view, append-authority, attribution; not_answered_by_this_root is a real answer) and diagnostics, passed through unaltered, plus receipt_fetched_from_operator always and root_read_from_chain when the chain path was taken. If the latest chain state no longer holds the receipt's peak, the chain path walks CheckpointPublished history backwards within the bounds in chain.history (default 200000 blocks in windows of 10000, one eth_getLogs each) and verifies under the newest checkpoint that holds it, adding root_read_from_chain_history; running out of range is the structured problem history_scan_exhausted. The log read is the one you name, in chain.logId or in the receipt coordinates; if the receipt's delegation certificate names a different log, the result adds receipt_log_id_mismatch and the call still uses yours. If you name none, the call uses the certificate's log id and says so in provenance.logId, with source receipt-delegation-certificate. Supply payload bytes and the entry id to have attribution answered.", + "description": "Fetch a receipt (as fetch_receipt) and verify it with @forestrie/mcp-verify's core under a trust root you supply as bytes (genesis, keyXy, accumulator, or checkpoints; each {b64} or {path}) or under an accumulator read from the chain in this call ({root: 'known-accumulator', chain: {genesis, rpcUrl, logId?} or {rpcUrl, univocity, logId?, chainId?}}). A genesis fetched in the same call is never the root. The result is the verifier's own: stages, the four questions (sealing, split-view, append-authority, attribution; not_answered_by_this_root is a real answer) and diagnostics, passed through unaltered, plus receipt_fetched_from_operator always and root_read_from_chain when the chain path was taken. If the latest chain state no longer holds the receipt's peak, the chain path walks CheckpointPublished history backwards within the bounds in chain.history (default 200000 blocks in windows of 10000, one eth_getLogs each) and verifies under the newest checkpoint that holds it, adding root_read_from_chain_history; running out of range is the structured problem history_scan_exhausted. The log read is the one you name, in chain.logId or in the receipt coordinates; if the receipt's delegation certificate names a different log, the result adds receipt_log_id_mismatch and the call still uses yours. If you name none, the call uses the certificate's log id and says so in provenance.logId, with source receipt-delegation-certificate. Supply payload bytes and the entry id to have attribution answered. The genesis root's offline walk resolves one delegation hop from the forest root: a receipt from a log further down the grant chain (the verifier's own publications log is a grandchild) fails under a supplied genesis with delegation_invalid, and the result adds genesis_root_reaches_direct_delegates_only to say that this is the walk's limit, not a finding about the receipt; verify such a receipt under known-log-key or known-accumulator.", "execution": { "taskSupport": "forbidden" }, - "description": "UUID (with dashes), or a 16/32-byte hex log id", + "description": "UUID (with dashes), or a 16/32-byte hex log id; sent to the operator in UUID form", "minLength": 1, "type": "string" }, - "description": "UUID (with dashes), or a 16/32-byte hex log id", + "description": "UUID (with dashes), or a 16/32-byte hex log id; sent to the operator in UUID form", "minLength": 1, "type": "string" }, + "b64": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "b64" + ], + "type": "object" + }, + { + "description": "standard base64 (alias of b64)", + "properties": { "base64": { "minLength": 1, "type": "string" - "description": "the exact registered payload (payload verification), or the committed grant bytes when grant:true" + "description": "the exact registered payload (payload verification), or the committed grant bytes when grant:true — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" }, "receiptUrl": { "description": "as returned by query_registration", - "anyOf": [ + "description": "Which trust root to verify under: bytes you supply (genesis, keyXy, accumulator, checkpoints), or {root:'known-accumulator', chain:…} to read the accumulator from the chain in this call. Never a genesis fetched in this same call.", + "oneOf": [ { - "oneOf": [ - { - "properties": { - "genesis": { - "anyOf": [ - { - "description": "standard base64", - "properties": { - "base64": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "base64" - ], - "type": "object" - }, - { - "description": "filesystem path, read by the stdio adapter", - "properties": { - "path": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "path" - ], - "type": "object" + "properties": { + "genesis": { + "anyOf": [ + { + "description": "standard base64", + "properties": { + "b64": { + "minLength": 1, + "type": "string" } + }, + "required": [ + "b64" ], - "description": "Bytes as base64, or a path the local server reads" + "type": "object" }, - "root": { - "const": "genesis", - "type": "string" + { + "description": "standard base64 (alias of b64)", + "properties": { + "base64": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "base64" + ], + "type": "object" + }, + { + "description": "filesystem path, read by the stdio adapter", + "properties": { + "path": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" } - }, - "required": [ - "root", - "genesis" ], - "type": "object" + "description": "the forest's genesis document you hold — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" }, - { - "properties": { - "keyXy": { - "anyOf": [ - { - "description": "standard base64", - "properties": { - "base64": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "base64" - ], - "type": "object" - }, - { - "description": "filesystem path, read by the stdio adapter", - "properties": { - "path": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "path" - ], - "type": "object" + "root": { + "const": "genesis", + "type": "string" + } + }, + "required": [ + "root", + "genesis" + ], + "type": "object" + }, + { + "properties": { + "keyXy": { + "anyOf": [ + { + "description": "standard base64", + "properties": { + "b64": { + "minLength": 1, + "type": "string" } + }, + "required": [ + "b64" ], - "description": "raw 64-byte P-256 x||y" + "type": "object" }, - "root": { - "const": "known-log-key", - "type": "string" + { + "description": "standard base64 (alias of b64)", + "properties": { + "base64": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "base64" + ], + "type": "object" + }, + { + "description": "filesystem path, read by the stdio adapter", + "properties": { + "path": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" } - }, - "required": [ - "root", - "keyXy" ], - "type": "object" + "description": "raw 64-byte P-256 x||y of the log owner key — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" }, - { + "root": { + "const": "known-log-key", + "type": "string" + } + }, + "required": [ + "root", + "keyXy" + ], + "type": "object" + }, + { + "properties": { + "accumulator": { + "anyOf": [ + { + "description": "standard base64", + "properties": { + "b64": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "b64" + ], + "type": "object" + }, + { + "description": "standard base64 (alias of b64)", + "properties": { + "base64": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "base64" + ], + "type": "object" + }, + { + "description": "filesystem path, read by the stdio adapter", + "properties": { + "path": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" + } + ], + "description": "encodeKnownAccumulator snapshot bytes you hold (give this OR chain) — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" + }, + "chain": { + "description": "read the accumulator from the chain in this call (give this OR accumulator)", "properties": { - "accumulator": { + "chainId": { + "description": "with univocity only: checked against eth_chainId before any eth_call, if given", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "genesis": { "anyOf": [ { "description": "standard base64", - "base64": { + "b64": { "minLength": 1, "type": "string" } - "base64" + "b64" ], "type": "object" }, - "description": "filesystem path, read by the stdio adapter", - "properties": { - "path": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "path" - ], - "type": "object" - } - ], - "description": "encodeKnownAccumulator snapshot bytes you hold" - }, - "consistencyProof": { - "anyOf": [ - { - "description": "standard base64", + "description": "standard base64 (alias of b64)", "properties": { "base64": { "minLength": 1, - "description": "Bytes as base64, or a path the local server reads" + "description": "a genesis document you hold; univocity and chainId are decoded from it (give this OR univocity) — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" }, - "massif": { - "anyOf": [ - { - "description": "standard base64", - "properties": { - "base64": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "base64" - ], - "type": "object" + "history": { + "description": "Bounds for the CheckpointPublished scan: fromBlock (do not scan below this block), maxBlocks (stop after this many blocks; default 200000), chunkBlocks (blocks per eth_getLogs request; default 10000). The scan walks backwards from the latest block, newest window first, one request per window, and stops at the first checkpoint that holds the receipt's peak. Running out of range is a structured problem, code history_scan_exhausted, with scannedFrom, scannedTo and checkpointsSeen; it is not an error.", + "properties": { + "chunkBlocks": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" }, - { - "description": "filesystem path, read by the stdio adapter", - "properties": { - "path": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "path" - ], - "type": "object" + "fromBlock": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "maxBlocks": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" } - ], - "description": "Bytes as base64, or a path the local server reads" + }, + "type": "object" }, - "root": { - "const": "known-accumulator", + "logId": { + "description": "UUID (with dashes), or a 16/32-byte hex log id; sent to the operator in UUID form", + "minLength": 1, "type": "string" + }, + "rpcUrl": { + "description": "your own chain RPC access; falls back to FORESTRIE_RPC_URL when omitted — the package ships no provider", + "minLength": 1, + "type": "string" + }, + "univocity": { + "description": "the univocity contract address, given explicitly (give this OR genesis)", + "minLength": 1, + "type": "string" } }, - "required": [ - "root", - "accumulator" - ], "type": "object" }, - { - "properties": { - "checkpoints": { - "items": { - "anyOf": [ - { - "description": "standard base64", - "properties": { - "base64": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "base64" - ], - "type": "object" - }, - { - "description": "filesystem path, read by the stdio adapter", - "properties": { - "path": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "path" - ], - "type": "object" - } - ], - "description": "Bytes as base64, or a path the local server reads" + "consistencyProof": { + "anyOf": [ + { + "description": "standard base64", + "properties": { + "b64": { + "minLength": 1, + "type": "string" + } }, - "minItems": 1, - "type": "array" + "required": [ + "b64" + ], + "type": "object" }, - "genesis": { - "anyOf": [ - { - "description": "standard base64", - "properties": { - "base64": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "base64" - ], - "type": "object" - }, - { - "description": "filesystem path, read by the stdio adapter", - "properties": { - "path": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "path" - ], - "type": "object" + { + "description": "standard base64 (alias of b64)", + "properties": { + "base64": { + "minLength": 1, + "type": "string" } + }, + "required": [ + "base64" ], - "description": "Bytes as base64, or a path the local server reads" + "type": "object" }, - "keyXy": { - "anyOf": [ - { - "description": "standard base64", - "properties": { - "base64": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "base64" - ], - "type": "object" - }, - { - "description": "filesystem path, read by the stdio adapter", - "properties": { - "path": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "path" - ], - "type": "object" + { + "description": "filesystem path, read by the stdio adapter", + "properties": { + "path": { + "minLength": 1, + "type": "string" } + }, + "required": [ + "path" ], - "description": "Bytes as base64, or a path the local server reads" + "type": "object" + } + ], + "description": "with accumulator only — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" + }, + "massif": { + "anyOf": [ + { + "description": "standard base64", + "properties": { + "b64": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "b64" + ], + "type": "object" }, - "root": { - "const": "checkpoint-chain", - "type": "string" + { + "description": "standard base64 (alias of b64)", + "properties": { + "base64": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "base64" + ], + "type": "object" + }, + { + "description": "filesystem path, read by the stdio adapter", + "properties": { + "path": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" } - }, - "required": [ - "root", - "checkpoints" ], - "type": "object" + "description": "with accumulator only — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" + }, + "root": { + "const": "known-accumulator", + "type": "string" } - ] + }, + "required": [ + "root" + ], + "type": "object" }, { "properties": { - "chain": { + "checkpoints": { + "description": "retained .sth checkpoints in ascending order, each {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}", + "items": { + "anyOf": [ + { + "description": "standard base64", + "properties": { + "b64": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "b64" + ], + "type": "object" + }, + { + "description": "standard base64 (alias of b64)", + "properties": { + "base64": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "base64" + ], + "type": "object" + }, + { + "description": "filesystem path, read by the stdio adapter", + "properties": { + "path": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" + } + ], + "description": "Bytes as {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" + }, + "minItems": 1, + "type": "array" + }, + "genesis": { "anyOf": [ { + "description": "standard base64", "properties": { - "genesis": { - "anyOf": [ - { - "description": "standard base64", - "properties": { - "base64": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "base64" - ], - "type": "object" - }, - { - "description": "filesystem path, read by the stdio adapter", - "properties": { - "path": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "path" - ], - "type": "object" - } - ], - "description": "a genesis document you hold; univocity and chainId are decoded from it" - }, - "history": { - "description": "Bounds for the CheckpointPublished scan: fromBlock (do not scan below this block), maxBlocks (stop after this many blocks; default 200000), chunkBlocks (blocks per eth_getLogs request; default 10000). The scan walks backwards from the latest block, newest window first, one request per window, and stops at the first checkpoint that holds the receipt's peak. Running out of range is a structured problem, code history_scan_exhausted, with scannedFrom, scannedTo and checkpointsSeen; it is not an error.", - "properties": { - "chunkBlocks": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "fromBlock": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "maxBlocks": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "type": "object" - }, - "logId": { - "description": "UUID (with dashes), or a 16/32-byte hex log id", + "b64": { "minLength": 1, "type": "string" - }, - "rpcUrl": { - "description": "your own chain RPC access; falls back to FORESTRIE_RPC_URL when omitted — the package ships no provider", + } + }, + "required": [ + "b64" + ], + "type": "object" + }, + { + "description": "standard base64 (alias of b64)", + "properties": { + "base64": { "minLength": 1, "type": "string" } - "genesis" + "base64" ], "type": "object" }, + "description": "filesystem path, read by the stdio adapter", "properties": { - "chainId": { - "description": "checked against eth_chainId before any eth_call, if given", - "maximum": 9007199254740991, - "minimum": -9007199254740991, - "type": "integer" - }, - "history": { - "description": "Bounds for the CheckpointPublished scan: fromBlock (do not scan below this block), maxBlocks (stop after this many blocks; default 200000), chunkBlocks (blocks per eth_getLogs request; default 10000). The scan walks backwards from the latest block, newest window first, one request per window, and stops at the first checkpoint that holds the receipt's peak. Running out of range is a structured problem, code history_scan_exhausted, with scannedFrom, scannedTo and checkpointsSeen; it is not an error.", - "properties": { - "chunkBlocks": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "fromBlock": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "maxBlocks": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "type": "object" - }, - "logId": { - "description": "UUID (with dashes), or a 16/32-byte hex log id", + "path": { "minLength": 1, "type": "string" - }, - "rpcUrl": { - "description": "your own chain RPC access; falls back to FORESTRIE_RPC_URL when omitted — the package ships no provider", + } + }, + "required": [ + "path" + ], + "type": "object" + } + ], + "description": "roots the first link (give this or keyXy) — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" + }, + "keyXy": { + "anyOf": [ + { + "description": "standard base64", + "properties": { + "b64": { "minLength": 1, "type": "string" - }, - "univocity": { - "description": "0x-prefixed or bare 40-hex address", + } + }, + "required": [ + "b64" + ], + "type": "object" + }, + { + "description": "standard base64 (alias of b64)", + "properties": { + "base64": { "minLength": 1, "type": "string" } - "univocity" + "base64" ], "type": "object" + }, + { + "description": "filesystem path, read by the stdio adapter", + "properties": { + "path": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "path" + ], + "type": "object" } ], - "description": "The forest's chain binding: from a genesis you hold, or given explicitly. Never defaulted, never taken from a fetched genesis, never read from the environment except rpcUrl." + "description": "roots the first link (give this or genesis) — {b64: <standard base64>} (base64 is accepted as an alias), or {path: <a file the local server reads>}" }, "root": { - "const": "known-accumulator", + "const": "checkpoint-chain", "type": "string" } }, - "chain" + "checkpoints" ], "type": "object" } - ], - "description": "Which trust root to verify under: bytes you supply (genesis, keyXy, accumulator, checkpoints), or {root:'known-accumulator', chain:…} to read the accumulator from the chain in this call. Never a genesis fetched in this same call." + ] } }, "required": [
Current tools
Show all 8 tool fingerprints
fetch_accumulator
fetch_checkpoint_history
fetch_genesis
fetch_ks256_attestation
fetch_receipt
fetch_scitt_configuration
query_registration
verify_fetched_receipt
Watch this server yourself
If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.
npx -y mcp-pin@0.2.3 -- <your @forestrie/mcp-resolve command>
Or subscribe to this page's RSS feed to be told when it changes.
Badge
The badge states one fact about time and nothing else. It never claims a server is safe.
[](https://mcp-pin.gautamkhosla.com/servers/535f0bf9fd569fbc.html)