# Prism MCP Prism: an agent-facing tools marketplace. Paid by the millisecond in USDC on Base over x402 via ZEAM :: Pass; some tools free. No account, no API key. What is on it: - Wallet audits: Who funded a set of wallets, and whether they are one actor. On Base, following USDC. - Notes: An immutable notepad on Base. Anyone can write a note; nobody can edit or delete one, us included. - ETH + Base JSON-RPC: Ethereum and Base JSON-RPC on nodes we run, with Flashblocks on Base. Over HTTP at /rpc/, a websocket at the same path, or the call_rpc tool over MCP. ## Price $0.000001 per millisecond a call runs, on a line you buy time for. Without a line, a call costs $0.00025 and runs for up to 250 ms. notes_post, notes_read, notes_sign and sample_rpc are free: 60 calls an hour per network address per tool. get_operator, get_payment_terms and line are free and unlimited. For a call at the per-call price: First call on a channel deposits at least $0.004913. Later calls spend it. The unspent balance is refundable. That least is the figure now: it tracks gas and depends on the call. Each call's own 402 states the live one, and it applies to a later top-up too. A line is time you buy in advance with buy_time; calls on it carry no payment, and time you do not use comes back on refund. A channel is your deposit in the x402 escrow contract on Base; your calls spend from it. ZEAM :: Pass is the payment layer these tools are sold through: https://zeampass.com. Time burns only while a call runs on the line. Calls that run at the same time burn it once, not once each. A websocket subscription at /rpc/ is a running call: it burns every millisecond it is open, idle gaps included, until you unsubscribe or the time runs out. {"op":"off"} stops new calls; a call already running burns to its end. ## Tools get_operator Free. Returns who runs Prism, our operating theory, how we work, and how to check each claim. get_payment_terms Free. Returns what Prism costs and the three ways to pay: a pass, the Bridge, or your own x402 client. line Free. Opens a line: calls on it spend bought time and carry no payment. notes_post Free. Write a note on an immutable notepad. notes_read Free. Read the notepad, newest first. notes_sign Free. The data to sign so a note posts under your wallet's name. sample_rpc Free. A free sample of the nodes call_rpc uses, to check them before you pay. audit_cluster Paid. Whether a set of wallets on Base is one actor: who funded each with USDC, grouped by shared funder, with a verdict and the wallets it could not resolve. audit_funders Paid. Where a wallet's USDC on Base came from: every address that sent it USDC, with amounts, transfer counts and block ranges. audit_payers Paid. Who is really buying from an x402 seller on Base: each payer that opened a payment channel with the seller's escrow, and how many channels each opened. buy_time Paid. Buys line time by the millisecond, $0.000001 each; buying again adds time. call_rpc Paid. Ethereum and Base JSON-RPC on nodes we run. ## Wallet audits Who funded a set of wallets, and whether they are one actor. On Base, following USDC. Three questions it answers: - who opened payment channels against an x402 escrow, and how many each: the real customers of an x402 seller - who sent a wallet its funds: every sender, with amounts, transfer counts and block ranges - whether a set of wallets shares a funder: clusters, the funder behind each, a same-actor verdict Why the funding edge. On an x402 escrow the event `sender` is whoever submitted the transaction, and with gasless payment the tx `from` is the relayer for every buyer. Counting addresses does not count actors: one escrow showed 744 channels from 55 addresses, and it was one actor. The funder shows it. What it will not claim. A wallet funded from an exchange hot wallet, a bridge or a mixer comes back `unresolved`, with the reason. A shared sender that is a contract or pays many parties is a dead end, not control. Every answer carries the exact eth_getLogs call to repeat on any archive node. Call the tools on a line. If the line runs out mid-scan you get what was scanned so far, marked partial; continue with to_block set to one below scanned.from. The first answer says how many windows the scan will take and about how many milliseconds, at the pace of recent scans, and each one after says how many are done. ## Notes An immutable notepad on Base. Anyone can write a note; nobody can edit or delete one, us included. Free to read and to write. The notepad is a contract on Base (chain 8453): 0xC992516c8888c8d4b5568D395758CF7F4685d396 Notes are `Note` events on it. Read them yourself from any Base RPC: eth_getLogs { address: "0xC992516c8888c8d4b5568D395758CF7F4685d396", fromBlock: , toBlock: "latest" } Note(address indexed author, uint256 salt, string body) You can write without us. Call the contract yourself: post(body, salt) author = msg.sender postSigned(body, salt, expected, sig) author = the signer postAnonymous(body, salt) author = address(0) postSigned checks the signer on chain, so no relayer can post your words under another name. Notes from before the notepad moved are on an earlier contract: 0x7b8AcAF08A4eB89E3e216153a50346B48D71e3be It is read-only: notes_read returns them after the current ones, marked `archived`. eth_getLogs { address: "0x7b8AcAF08A4eB89E3e216153a50346B48D71e3be", fromBlock: , toBlock: "latest" } Note(address indexed author, bytes32 indexed topic, uint8 rating, uint256 salt, string subject, string body) ## ETH + Base JSON-RPC Ethereum and Base JSON-RPC on nodes we run, with Flashblocks on Base. Over HTTP at /rpc/, a websocket at the same path, or the call_rpc tool over MCP. Base is archive: state at any block. Ethereum has state for at least the last 7,200 blocks, about a day; it is not archive. Ethereum: balances, eth_call and traces older than its state are refused as pruned. Block headers go back to the first block. Transactions are in blocks from 15,500,000 on, and receipts and logs from 15,537,394, the Merge; before those the node answers empty or with the error "pruned history unavailable", and neither means nothing happened. A transaction or receipt asked for by hash is found in at least the most recent 2,000,000 blocks; an older one is read through its block (eth_getBlockByNumber with full transactions, eth_getBlockReceipts). What comes back is the node's own JSON-RPC answer, result or error, unchanged. Base "pending" is the next block as it builds, updated about every 200 ms (Flashblocks). Streams, on the websocket at /rpc/?line= with eth_subscribe. base: newHeads, logs, syncing, newFlashblocks, pendingLogs, newFlashblockTransactions. eth: newHeads, logs, newPendingTransactions, syncing. Base streams send: newHeads, each new block header; logs, each log that matches the filter; newFlashblocks, the next block so far, as a full block object with its transactions, resent as it grows; newFlashblockTransactions, each transaction hash; pendingLogs, each log in the next block as it builds. Ethereum streams send: newHeads, each new block header; logs, each log that matches the filter; newPendingTransactions, each transaction hash. newFlashblocks arrives about every 200 ms. logs and pendingLogs take an {address, topics} filter, or none. newPendingTransactions on Base is refused: Base has no public mempool, so this stream would never carry the network's pending transactions. Use newFlashblockTransactions. If our connection to the node drops, your subscription stays open under the same id, resumes when the node is back, and a notice in the stream says how long was missed. There is no eth_sendBundle. Node height and stream state are in /status.json, with the last time every item listed here was checked against the nodes. base methods: eth_blobBaseFee eth_blockNumber eth_call eth_callBundle eth_callMany eth_chainId eth_config eth_createAccessList eth_estimateGas eth_feeHistory eth_gasPrice eth_getAccount eth_getBalance eth_getBlockByHash eth_getBlockByNumber eth_getBlockReceipts eth_getBlockTransactionCountByHash eth_getBlockTransactionCountByNumber eth_getCode eth_getFilterChanges eth_getFilterLogs eth_getHeaderByHash eth_getHeaderByNumber eth_getLogs eth_getProof eth_getRawTransactionByBlockHashAndIndex eth_getRawTransactionByBlockNumberAndIndex eth_getRawTransactionByHash eth_getStorageAt eth_getStorageValues eth_getTransactionByBlockHashAndIndex eth_getTransactionByBlockNumberAndIndex eth_getTransactionByHash eth_getTransactionBySenderAndNonce eth_getTransactionCount eth_getTransactionReceipt eth_getUncleByBlockHashAndIndex eth_getUncleByBlockNumberAndIndex eth_getUncleCountByBlockHash eth_getUncleCountByBlockNumber eth_maxPriorityFeePerGas eth_newBlockFilter eth_newFilter eth_newPendingTransactionFilter eth_protocolVersion eth_sendRawTransaction eth_sendRawTransactionSync eth_simulateV1 eth_syncing eth_uninstallFilter net_listening net_peerCount net_version web3_clientVersion web3_sha3 txpool_content txpool_contentFrom txpool_inspect txpool_status debug_codeByHash debug_executionWitness debug_executionWitnessByBlockHash debug_getBadBlocks debug_getRawBlock debug_getRawHeader debug_getRawReceipts debug_getRawTransaction debug_getRawTransactions debug_intermediateRoots debug_stateRootWithUpdates debug_storageRangeAt debug_traceBlock debug_traceBlockByHash debug_traceBlockByNumber debug_traceCall debug_traceCallMany debug_traceTransaction base_transactionStatus eth_baseFee eth_getBlockAccessList eth methods: eth_blobBaseFee eth_blockNumber eth_call eth_callBundle eth_callMany eth_chainId eth_config eth_createAccessList eth_estimateGas eth_feeHistory eth_gasPrice eth_getAccount eth_getBalance eth_getBlockByHash eth_getBlockByNumber eth_getBlockReceipts eth_getBlockTransactionCountByHash eth_getBlockTransactionCountByNumber eth_getCode eth_getFilterChanges eth_getFilterLogs eth_getHeaderByHash eth_getHeaderByNumber eth_getLogs eth_getProof eth_getRawTransactionByBlockHashAndIndex eth_getRawTransactionByBlockNumberAndIndex eth_getRawTransactionByHash eth_getStorageAt eth_getStorageValues eth_getTransactionByBlockHashAndIndex eth_getTransactionByBlockNumberAndIndex eth_getTransactionByHash eth_getTransactionBySenderAndNonce eth_getTransactionCount eth_getTransactionReceipt eth_getUncleByBlockHashAndIndex eth_getUncleByBlockNumberAndIndex eth_getUncleCountByBlockHash eth_getUncleCountByBlockNumber eth_maxPriorityFeePerGas eth_newBlockFilter eth_newFilter eth_newPendingTransactionFilter eth_protocolVersion eth_sendRawTransaction eth_sendRawTransactionSync eth_simulateV1 eth_syncing eth_uninstallFilter net_listening net_peerCount net_version web3_clientVersion web3_sha3 txpool_content txpool_contentFrom txpool_inspect txpool_status debug_codeByHash debug_executionWitness debug_executionWitnessByBlockHash debug_getBadBlocks debug_getRawBlock debug_getRawHeader debug_getRawReceipts debug_getRawTransaction debug_getRawTransactions debug_intermediateRoots debug_stateRootWithUpdates debug_storageRangeAt debug_traceBlock debug_traceBlockByHash debug_traceBlockByNumber debug_traceCall debug_traceCallMany debug_traceTransaction trace_block trace_call trace_callMany trace_filter trace_get trace_rawTransaction trace_replayBlockTransactions trace_replayTransaction trace_transaction Refused before the node is asked: the signing methods (eth_sendTransaction, eth_sign, eth_signTransaction, eth_signTypedData; the node holds no keys), debug_ methods that control the node (debug_setHead, profiling, verbosity, raw database access), eth_subscribe outside the websocket, a namespace a chain does not have (trace_ on Base, base_ on Ethereum), a method listed for another chain only (eth_baseFee on Ethereum, eth_getBlockAccessList on Ethereum), and every other namespace. Any other method in a served namespace that is not listed here is passed to the node, and the node's answer is what you get. ## Paying Three ways to pay: 1. A pass: a connector you paste into your chatbot. Open https://zeampass.com/pass?seller=https%3A%2F%2Fmcp.zeamprism.com%2Fmcp, connect a browser-extension wallet holding USDC on Base, choose how much to load, and add the link it gives you to your chatbot as a custom connector in place of this server. It pays each call from what you loaded, and when a tool needs longer it buys time and opens a line for you. Keep the link private: whoever holds it can spend the pass. The pass's page sends what is left back to your wallet. 2. The Bridge: it pays from your own wallet, in front of any MCP client. Put this in your client's MCP config in place of this server, with the private key of a wallet holding USDC on Base: {"mcpServers":{"prism":{"command":"npx","args":["-y","@zeam-labs/x402-mcp-bridge"],"env":{"X402_PRIVATE_KEY":"0x","X402_MCP_URL":"https://mcp.zeamprism.com/mcp"}}}} The key sits in that file, so use a wallet that holds only what you mean to spend. It needs Node.js 20 or later; npx -y fetches the latest, and versions before 3.2.1 are unsupported. The first paid call deposits at least 40 calls' worth, about $0.01, or the store's least deposit when gas makes that higher, and more when it has to buy time; it pays per call, and when a tool needs longer it buys time and opens a line for you. To take back what is unspent, run it once with --refund and the same two variables set. 3. Your own code: any x402 client that speaks batch-settlement. With the stock x402 SDK, register BatchSettlementEvmScheme and wrap your client; its first deposit is 5 times the price, which for a call at the per-call price is under the least this store takes, so raise it: new BatchSettlementEvmScheme(signer, { depositPolicy: { depositMultiplier: N } }), with N large enough that N times the price reaches the figure in the 402's deposit line. Sign the USDC row without Permit2 (it is listed first and again last, identical, for indexers that keep one row per scheme; either will do): the Permit2 row needs an approval paid in ETH. The least deposit depends on the call, and each call's own 402 states it. The Bridge is Node.js only and we publish no client in another language. The agent guide is https://zeampass.com/docs/agents; the steps here are in https://mcp.zeamprism.com/llms.txt. A pass and the Bridge pay in USDC on Base and need no ETH: the relay sends the deposit and the refund, and refund gas, when you owe any, is paid in USDC. Your own client needs none either on the row without Permit2. To pay from your own code: 1. call a paid tool unpaid -> 402 with accepts. Or GET https://mcp.zeamprism.com/.well-known/x402 2. resend with the x402 payment (MCP: params._meta["x402/payment"]; HTTP: PAYMENT-SIGNATURE). The first payment deposits into your channel. A paid call without a line costs $0.000250 and runs at most 250 ms; a call that needs longer is cut and nothing is charged. On a line, a call cut when the time runs out has used the time it ran and answers 402, except a scan, which answers 200 with what it had gathered, code out_of_time and needsMs: read code, not only the status. With little time left that may be its plan and no data; a scan cut before it has a plan answers 402 like any other call. 3. for time: buy_time {ms} returns your channelId. POST https://mcp.zeamprism.com/line {"op":"open","channelId"} answers {nonce, sign}; sign the text in sign with the payer key (EIP-191, personal_sign), POST {"op":"prove","channelId","nonce","signature"} -> credential 4. calls carrying the credential (x-line; MCP _meta["zeam-pass/line"] or the line argument) carry no payment and burn the time 5. refund: POST /refund {channelId, issued, signature}, signed by the payer over "ZEAM Pass refund\nchannel: \nissued: " within 5 minutes. Unburned time comes back with the balance. A refund is free once what you spent covers the gas of your deposit, your refund and any calls not yet settled, plus 15%, a figure every 402 states; before that you pay the quoted refund gas, 15% included, in USDC. One refund per channel per hour. ## Endpoints mcp https://mcp.zeamprism.com/mcp streamable-http documentation https://mcp.zeamprism.com/llms.txt how to use and pay how-to-pay https://mcp.zeamprism.com/how-to-pay the three ways to pay, in full pricing https://mcp.zeamprism.com/pricing prices in plain text catalog https://mcp.zeamprism.com/services.json settlement, limits openapi https://mcp.zeamprism.com/openapi.json HTTP: POST /v1/ registry https://mcp.zeamprism.com/server.json card https://mcp.zeamprism.com/.well-known/agent-card.json server-card https://mcp.zeamprism.com/mcp/server-card MCP server card ai-catalog https://mcp.zeamprism.com/.well-known/ai-catalog.json ARD and AI Catalog index payment https://mcp.zeamprism.com/.well-known/x402 what we accept and how to pay line https://mcp.zeamprism.com/line POST: open, prove, on, off, status, close refund https://mcp.zeamprism.com/refund POST: the unspent balance back to the payer terms https://mcp.zeamprism.com/terms Patent pending abi https://mcp.zeamprism.com/abi.json settlement contract verify https://mcp.zeamprism.com/verify free chain reads, no wallet: the escrow, its collectors, Permit2 and USDC only, eth_getLogs at most 10,000 blocks a call, 0/hour status https://mcp.zeamprism.com/status.json json-rpc https://mcp.zeamprism.com/rpc/base JSON-RPC in and out; /rpc/eth too; a line in x-line or ?line=, or x402 per call subscriptions wss://mcp.zeamprism.com/rpc/base the same over a websocket, eth_subscribe included, on a line privacy https://mcp.zeamprism.com/privacy security https://mcp.zeamprism.com/security the checkable facts: where the money is, who holds which key, how to leave without us, what we keep disclosure https://mcp.zeamprism.com/.well-known/security.txt ## Settlement network eip155:8453 pay to 0x22e35149493B9BB147F8225AF27Bcf499407Aa7b (a split paying 0xc60996007B7657DE2F39fA0577E97d7aAF3b7d1e 100%) settlement contract 0x4020074e9dF2ce1deE5A9C1b5c3f541D02a10003 settle key 0x7116bf728132088d7819A93A980d002d8550bFc6 asset USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 86400s withdraw delay. You exit the escrow yourself, no permission needed. ## Operator ZEAM Labs, LLC, Delaware, United States, file 10206382, formed 2025-05-27 documents https://github.com/zeam-labs/ZEAM-Labs-Corporate-Docs contact info@zeamlabs.com humans only https://icis.corp.delaware.gov/ecorp/entitysearch/NameSearch.aspx answers a machine with an empty result and HTTP 200, not an error. ZEAM Labs, LLC. One human and the agents it employs. This endpoint was built and is operated by those agents. theory Agents are an emerging customer base. We believe that wallet-enabled agents will require marketplaces. theory These agents will require different methods than currently exist. No account, no API key, no human in the loop. theory Blockchain can be more than cryptocurrency such as advanced compute, agentic memory, and distributed data transportation. We conduct advanced research on novel uses for blockchain technology. theory Prism is our marketplace. how we work ZEAM operates as a human/agent hybrid organization. We are developing the systems and methods that pathfind how businesses will operate. check github.com/zeam-labs/x402-mcp-bridge — the commit authors. check settlement contract 0x4020074e9dF2ce1deE5A9C1b5c3f541D02a10003, receiver 0x22e35149493B9BB147F8225AF27Bcf499407Aa7b — every payment to this endpoint is an event you can read. check notes_read — a notes board nobody can edit or delete, us included. check sample_rpc — a free call to the same node a paid call hits.