io.github.0rkz/byte-protocol
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
PayPerByte — per-byte data for AI agents: x402 USDC on Base, EIP-712-attested. No token.
| Author | io.github.0rkz |
|---|---|
| Access | mixed |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 260 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"byte-protocol": {
"url": "https://mcp.payperbyte.io/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (15)
byte_search_publishersread-onlySearch PayPerByte publishers by topic and sort order. Returns publisher addresses, topics, subscriber counts, message counts, and price-per-KB.
Parameters:
limit— number — Max results to return (default 20)query— string — Topic keyword to search (e.g. 'weather', 'crypto', 'cve')sortBy— string — Sort field: 'subscribers', 'revenue', 'messages'
Hints: read-only yes · destructive no · idempotent yes · open-world yes
byte_get_publisherread-onlyGet on-chain info for a specific PayPerByte publisher: status, subscriber and message counts, USDC revenue, and the registered schema (size bounds, cadence, price-per-KB).
Parameters:
address(required) — string — Publisher Ethereum address (0x...)
Hints: read-only yes · destructive no · idempotent yes · open-world yes
byte_get_network_statsread-onlyGet PayPerByte network-wide statistics: total publishers, messages streamed, and total subscriber fees settled in USDC.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
byte_check_subscriptionread-onlyCheck if an address is subscribed to a specific publisher on PayPerByte.
Parameters:
subscriber(required) — string — Subscriber Ethereum address (0x...)publisher(required) — string — Publisher Ethereum address (0x...)
Hints: read-only yes · destructive no · idempotent yes · open-world yes
byte_get_token_balancesread-onlyGet USDC and ETH balances for an address on Arbitrum Sepolia (the on-chain testnet layer — MockUSDC settles subscriptions and fact-oracle queries there). Does NOT show the Base-mainnet USDC balance that byte_buy_data spends.
Parameters:
address(required) — string — Ethereum address (0x...)
Hints: read-only yes · destructive no · idempotent yes · open-world yes
byte_list_feedsread-onlyList all active data feeds in the PayPerByte catalog with topics, price-per-call, and frequency (pricePerKB is a deprecated alias).
Hints: read-only yes · destructive no · idempotent yes · open-world yes
byte_list_my_subscriptionsread-onlyList every active subscription for a given wallet address. Each entry has the publisher address, topic, status, when you subscribed, messages received in 7/30 days, USDC spent in 7/30 days, and the timestamp of the last message received. Use this to see what you're currently paying for and decide whether to unsubscribe.
Parameters:
subscriber(required) — string — Wallet address to list subscriptions forindexerUrl— string — Optional indexer URL override (default: INDEXER_URL/BYTE_INDEXER_URL env or https://feeds.payperbyte.io)
Hints: read-only yes · destructive no · idempotent yes · open-world yes
byte_subscription_healthread-onlyGet the content-drift signal for a publisher. Compares their last 7 days of publishing activity (cadence, message count) against their 23-day baseline (days 8-30). Returns 'stable' (steady publishing), 'moderate' (20-50% cadence shift or 24-48h silence), 'significant' (>50% shift or >48h silence), or 'unknown' (new publisher, insufficient baseline). Use this to detect when a publisher you subscribe to has pivoted content or gone dormant.
Parameters:
publisher(required) — string — Publisher address to checkindexerUrl— string — Optional indexer URL override
Hints: read-only yes · destructive no · idempotent yes · open-world yes
byte_unsubscribeUnsubscribe from a publisher's data feed. Takes effect next block: no more billing, no more data flow. Reversible — you can resubscribe later via byte_subscribe. Use this when a publisher has pivoted content (check with byte_subscription_health first) or when you simply don't want the feed anymore. Requires PRIVATE_KEY for the connected wallet.
Parameters:
publisher(required) — string — Publisher address to unsubscribe from
Hints: read-only no · destructive no · idempotent no · open-world yes
byte_subscribeSubscribe to a PayPerByte publisher's data feed. By default also sets USDC allowance to DataStreamLib to type(uint256).max so the subscription doesn't silently lose payments when allowance depletes (the contract's allowance-skip path emits DataStreamed with amount=0 on transferFrom failure rather than reverting). Pass skipAllowance: true to opt out and set a finite cap manually. Requires PRIVATE_KEY.
Parameters:
publisher(required) — string — Publisher Ethereum address (0x...) to subscribe toskipAllowance— boolean — If true, don't bundle the USDC approve(max) call. Default false. Auto-approve is also skipped when the wallet already has ≥ $1000 USDC of allowance to DataStreamLib.
Hints: read-only no · destructive no · idempotent no · open-world yes
byte_register_publisherdestructiveRegister as a data publisher on PayPerByte. Registers a schema and the publisher on-chain. Requires PRIVATE_KEY. PayPerByte v1 publishers are first-party and unstaked — leave stake at '0'; a non-zero USDC stake is approved to DataRegistry first if you choose to post one.
Parameters:
stake(required) — string — USDC reputation stake to post, as a decimal string. Default '0' — PayPerByte v1 publishers are unstaked.topic(required) — string — Data feed topic (e.g. 'eth-price', 'weather-nyc', 'gas-tracker')expectedSize(required) — number — Expected payload size in bytes per messagemaxSize(required) — number — Maximum payload size in bytes per messagefrequency(required) — number — Expected publishing frequency in secondspricePerKB(required) — number — Price per kilobyte in USDC (e.g. 0.003)
Hints: read-only no · destructive yes · idempotent no · open-world yes
byte_publish_datadestructivePublish data to a subscriber via the PayPerByte DataStream contract. Hashes the payload, records size on-chain, and settles the fee in USDC. Requires PRIVATE_KEY.
Parameters:
subscriber(required) — string — Subscriber Ethereum address (0x...)data(required) — string — Data payload to publish (will be hashed on-chain)maxFee(required) — number — Maximum fee in USDC willing to pay for this publish (e.g. 0.05)
Hints: read-only no · destructive yes · idempotent no · open-world yes
byte_query_factQuery a PayPerByte fact-oracle publisher for a signed answer with citations. Posts the question to a registered fact-oracle publisher (topic='fact-oracle'), waits for the on-chain BroadcastStreamed response, and returns the answer plus structured citation URLs. The signed receipt proves which publisher produced the answer (provenance + tamper-evidence), NOT that the answer is correct — ground your output in the cited sources, not in a truth guarantee. Availability: this requires a registered fact-oracle publisher actively broadcasting; if none is live the call returns a timeout rather than an answer.
Parameters:
question(required) — string — The factual question to ask (e.g. 'What was last night's Lakers vs Warriors score?'). Should be specific and verifiable.subscriber_address(required) — string — Your wallet address. You MUST be subscribed to the chosen publisher (with sufficient USDC escrow) or the publisher's on-chain broadcast will be skipped.topic_filter— string — Optional topic filter (e.g. 'fact-oracle' default; future: 'sports', 'finance').max_byte_cost— number — Max response payload bytes you're willing to pay for (defaults to 2000). Billed at the publisher's registered price-per-KB — read it with byte_get_publisher or byte_search_publishers before asking. Publisher refuses if can't fit answer.min_publisher_pqs— number — Minimum PQS to consider (BPS scale, 0-10000). 9000 = Elite-only, 7500 = Premium+.max_response_latency_ms— number — Max time to wait for the publisher's broadcast (default 30000 ms). Local-LLM publishers (Ollama + Searxng + 3-sample NLI gate) take ~30-60s; Anthropic + passthrough takes ~10-20s. Hard ceiling 180s.
Hints: read-only no · destructive no · idempotent no · open-world yes
byte_buy_dataBuy a single data packet from any PayPerByte feed via the x402 payment gateway. No subscription, no allowance, no prior on-chain setup — pay-per-call USDC settlement. The MCP server signs an EIP-3009 transferWithAuthorization on behalf of the wallet whose PRIVATE_KEY is configured, the x402 facilitator submits the tx, and the data comes back inline with the on-chain settlement tx hash. Use byte_subscribe instead if you want a continuous stream of broadcasts from a publisher. The catalog of available feed slugs lives at https://x402.payperbyte.io/feeds (free GET). GET data feeds (weather, earthquakes, …) need only `feed`; the POST oracles (see https://x402.payperbyte.io/feeds for the live list and each feed's `method`) additionally require a JSON `body` (the query) — supplying `body` switches this call to POST. Requires PRIVATE_KEY env var on the MCP server and USDC on the configured wallet. NOTE: paid feeds settle REAL USDC on Base mainnet (eip155:8453) — the exact price is quoted in the 402 challenge and listed per feed at https://x402.payperbyte.io/feeds — the signed EIP-712 attestation over the exact response bytes proves delivery, not that a verdict itself is correct. Use a dedicated wallet holding only what you intend to spend.
Parameters:
feed(required) — string — Feed slug — see https://x402.payperbyte.io/feeds for the live catalog. (For fact-oracle Q&A use byte_query_fact instead — it uses a different request-response flow.)body— object — Optional JSON query body for POST oracles. Supplying it switches the call from GET to POST. Required by the verdict oracles, e.g. address-reputation {domain,address[,amount,chain]}, sanctions-screen {address|name}, pkg-verdict {ecosystem,package[,version]}, reasoning-verdict {subject}. Omit for GET data feeds (weather, earthquakes, …).
Hints: read-only no · destructive no · idempotent no · open-world yes
byte_verify_payloadread-onlyVerify-before-act: confirm a data payload an agent is about to act on actually matches what the publisher cryptographically attested to on-chain. Recomputes keccak256 of the received bytes and compares it to the on-chain EIP-712 PayloadAttestation hash. ALWAYS call this on BYTE-sourced data before acting on it; if verified=false the bytes were tampered/corrupted in transit and MUST NOT be used. Anchor the check with EITHER expectedHash (an on-chain payloadHash you already hold, e.g. from byte_query_fact / byte_buy_data) OR txHash (the settlement tx — also recovers the attestation signer and confirms it is the named publisher). Read-only; no wallet or payment required.
Parameters:
data(required) — string — The exact payload bytes the agent received and is about to act on — the raw delivered string, or a 0x-prefixed hex byte string.txHash— string — Settlement tx hash whose on-chain BroadcastStreamed attestation to verify against. When provided, also recovers the EIP-712 signer and confirms it is the attesting publisher.hashMode— string — How to hash structured payloads: 'raw' (keccak of the utf8 string, default — matches byte_publish_data) or 'canonical' (keccak of key-sorted, whitespace-free JSON).expectedHash— string — On-chain payloadHash to verify against (0x + 64 hex), e.g. the payloadHash returned by byte_query_fact or byte_buy_data.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.