Fetches receipts, genesis and accumulator snapshots for @forestrie/mcp-verify and labels provenance
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
One-click editor setup isnβt available for this listing yet β we donβt have a confirmed install command, and weβd rather show nothing than point your editor at the wrong package or host. Follow the projectβs own setup instructions, linked above.
Fetch a SCITT receipt, its log's genesis document and its on-chain
accumulator, and hand them to
@forestrie/mcp-verify
to verify β including the split-view answer, from a chain read. An MCP
server that fetches the material the verifier verifies: a receipt, a
genesis document, an accumulator snapshot, a registration status, a
service configuration. Every result says where its bytes came from and
which of the four questions of the trust model they can support. Listed in
the MCP registry as dev.forestrie/resolve.
The verifier runs entirely in your process with no network, no account, no key and no backend, and its own rule is that installing it can never imply a network dependency. So anything that fetches lives here.
Both environment variables are optional and both are yours. baseUrl is
any SCRAPI base URL and rpcUrl is your own chain access; a call may pass
either explicitly, and the environment values are used only when a call
omits them. The package ships no default operator and no default chain
provider, and names none.
Two public lanes exist and are examples, not defaults:
| Lane | Base URL | Service id |
|---|---|---|
| A | https://api-a.forest-2.forestrie.dev | canopy-dev-1 |
| B | https://api-b.forest-2.forestrie.dev | canopy-prod-1 |
Requires Node 20.11 or later.
Every value below is public, and the ones that change per release come
from the verifier's own tarball. @forestrie/mcp-verify registers each
release in a Forestrie log and ships the receipt under fixtures/self/
(docs/self-registration.md there), so the published package is a
statement, a receipt, a genesis document and a log owner key that this
package can fetch and verify against the live lane. The run below takes
about four seconds and ends in split-view ok from a public RPC
endpoint, with no key and no account.
| Coordinate | Value | Where it comes from |
|---|---|---|
| base URL | https://api-a.forest-2.forestrie.dev | lane A above (an example, not a default) |
| bootstrap log | e22c8d55-3f88-b2b5-f225-5d2c2441bcdd | the forest root; also decoded from the genesis document |
| publications log | da6f297c-4a0c-4c9a-b2ae-e701e558721d | the log the verifier registers releases on |
| content hash | sha256(fixtures/self/statement.cose) | the tarball; fixtures/self/manifest.json lists the same digest |
| entry id | fixtures/self/entry-id.txt | the tarball; query_registration returns it too |
| massif height | never typed | inside the receiptUrl that query_registration returns |
| log owner key | fixtures/self/log-key.xy.b64 (base64 text) | the tarball |
| chain | id 84532 (Base Sepolia), univocity 0xe22c8d553f88b2b5f2255d2c2441bcdd0d50cd58 | bound in the genesis document; fetch_genesis decodes it |
To have the tarball at hand in an empty directory:
The sequence, with the arguments as JSON and the one-line result each
call returned when run on 2026-09-22 against the published 0.5.0 bundle
(its entry id is a0caa672b7030b000000000000000001; yours is whatever
entry-id.txt says):
fetch_scitt_configuration {"baseUrl": "https://api-a.forest-2.forestrie.dev"}
β fetched SCITT configuration (serviceId canopy-dev-1) from β¦/.well-known/scitt-configurationquery_registration {"baseUrl": β¦, "bootstrapLogId": "e22c8d55-3f88-b2b5-f225-5d2c2441bcdd", "logId": "da6f297c-4a0c-4c9a-b2ae-e701e558721d", "contentHash": "<sha256 of statement.cose>"}
β registration complete; receipt at https://api-a.forest-2.forestrie.dev/logs/e22c8d55-β¦/da6f297c-β¦/14/entries/a0caa672b7030b000000000000000001/receipt
β status: "receipt-available", the receiptUrl (with the massif
height, 14, inside it) and entryId.fetch_receipt {"receiptUrl": "<from step 2>"}
β fetched receipt (438 B) from β¦/receipt β receipt.sha256 equals
the digest of the tarball's receipt.cbor; receiptLogId names the
publications log.fetch_genesis {"baseUrl": β¦, "logId": "e22c8d55-3f88-b2b5-f225-5d2c2441bcdd"}
β fetched genesis (160 B) from β¦/api/forest/e22c8d55-β¦/genesis: univocity 0xe22c8d553f88b2b5f2255d2c2441bcdd0d50cd58 on chain 84532
β byte-identical to the tarball's genesis.cbor. Keep it: the calls
below pass it back as bytes, never fetched in the same call.verify_fetched_receipt {"receiptUrl": β¦, "entryId": "<entry-id.txt>", "payload": {"path": "β¦/fixtures/self/statement.cose"}, "trust": {"root": "known-log-key", "keyXy": {"b64": "<contents of log-key.xy.b64>"}}}
β verify: PASS Β· root=known-log-key Β· sealing ok, split-view not answered at this root, append-authority not answered at this root, attribution ok"trust": {"root": "genesis", "genesis": {"path": "β¦/fixtures/self/genesis.cbor"}}
β verify: FAILED at signature (delegation_invalid) Β· root=genesis Β· β¦
This is expected, not tampering: the genesis root's offline walk
resolves one delegation hop from the forest root, and the publications
log is a grandchild. The result carries
genesis_root_reaches_direct_delegates_only saying exactly that.
Verify this receipt under a key or an accumulator, as in 5 and 7.verify_fetched_receipt {"receiptUrl": β¦, "entryId": β¦, "payload": β¦, "trust": {"root": "known-accumulator", "chain": {"genesis": {"path": "β¦/fixtures/self/genesis.cbor"}, "rpcUrl": "https://sepolia.base.org", "logId": "da6f297c-4a0c-4c9a-b2ae-e701e558721d"}}}
β verify: PASS Β· root=known-accumulator Β· sealing ok, split-view ok, append-authority not answered at this root, attribution ok
β anchor.blockNumber, anchor.matchedPeak and
provenance.root.from.rpcUrl say which chain state answered. If the
log has grown past the receipt's peak since, the same call looks back
through published checkpoints and adds root_read_from_chain_history.fetch_accumulator {"chain": {β¦as in 7β¦}, "forReceipt": {"receipt": β¦, "payload": β¦, "entryId": β¦}}
returns the snapshot as bytes to keep; later, @forestrie/mcp-verify's
verify_receipt under {"root": "known-accumulator", "accumulator": <those bytes>} answers split-view again, offline.The chain, and where to read it. Step 7 needs JSON-RPC access to
chain 84532 (Base Sepolia). This package ships no provider and names
none as a default; rpcUrl (or FORESTRIE_RPC_URL) is yours. The
endpoints below are third-party public services, listed only as examples
of what answered unauthenticated when this example was written; use your
own provider for anything beyond a first try.
| Endpoint | On 2026-09-22 |
|---|---|
https://sepolia.base.org | answered |
https://base-sepolia-rpc.publicnode.com | answered |
https://base-sepolia.drpc.org | answered |
https://base-sepolia.gateway.tenderly.co | answered |
https://1rpc.io/base-sepolia | HTTP 400 |
https://rpc.ankr.com/base_sepolia | HTTP 403 |
https://base-sepolia.g.alchemy.com/v2/demo | HTTP 429 |
Two traps. keyXy: {"path": "log-key.xy.b64"} fails: that file is
base64 text, and path inputs are read as raw bytes β pass its
contents as b64. And the byte-field name is b64 in both servers
(base64 is accepted here as an alias), so the shapes you learn from the
verifier work here unchanged.
test/core/readme-example.test.ts asserts the coordinates in this
section against the recorded lane-A fixtures, so a fixture re-capture
cannot silently invalidate the example.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/resolve)<a href="https://allmcps.com/mcp/resolve"><img src="https://allmcps.com/api/badge/resolve?style=directory" alt="Resolve on AllMCPs" /></a>