PayPerByte — per-byte data for AI agents: x402 USDC on Base, EIP-712-attested. No token.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Buy 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.
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.)
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, …).
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Buy 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.
| Argument | Type | Description |
|---|---|---|
| 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, …). |
| feed* | 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.) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"feed"
],
"properties": {
"body": {
"type": "object",
"description": "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, …).",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"feed": {
"type": "string",
"minLength": 1,
"description": "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.)"
}
}
}Check if an address is subscribed to a specific publisher on PayPerByte.
| Argument | Type | Description |
|---|---|---|
| publisher* | string | Publisher Ethereum address (0x...) |
| subscriber* | string | Subscriber Ethereum address (0x...) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"subscriber",
"publisher"
],
"properties": {
"publisher": {
"type": "string",
"description": "Publisher Ethereum address (0x...)"
},
"subscriber": {
"type": "string",
"description": "Subscriber Ethereum address (0x...)"
}
}
}Get PayPerByte network-wide statistics: total publishers, messages streamed, and total subscriber fees settled in USDC.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Get 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).
| Argument | Type | Description |
|---|---|---|
| address* | string | Publisher Ethereum address (0x...) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"address"
],
"properties": {
"address": {
"type": "string",
"description": "Publisher Ethereum address (0x...)"
}
}
}Get 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.
| Argument | Type | Description |
|---|---|---|
| address* | string | Ethereum address (0x...) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"address"
],
"properties": {
"address": {
"type": "string",
"description": "Ethereum address (0x...)"
}
}
}List all active data feeds in the PayPerByte catalog with topics, price-per-call, and frequency (pricePerKB is a deprecated alias).
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}List 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.
| Argument | Type | Description |
|---|---|---|
| indexerUrl | string | Optional indexer URL override (default: INDEXER_URL/BYTE_INDEXER_URL env or https://feeds.payperbyte.io) |
| subscriber* | string | Wallet address to list subscriptions for |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"subscriber"
],
"properties": {
"indexerUrl": {
"type": "string",
"format": "uri",
"description": "Optional indexer URL override (default: INDEXER_URL/BYTE_INDEXER_URL env or https://feeds.payperbyte.io)"
},
"subscriber": {
"type": "string",
"pattern": "^0x[a-fA-F0-9]{40}$",
"description": "Wallet address to list subscriptions for"
}
}
}Publish 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.
| Argument | Type | Description |
|---|---|---|
| data* | string | Data payload to publish (will be hashed on-chain) |
| maxFee* | number | Maximum fee in USDC willing to pay for this publish (e.g. 0.05) |
| subscriber* | string | Subscriber Ethereum address (0x...) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"subscriber",
"data",
"maxFee"
],
"properties": {
"data": {
"type": "string",
"description": "Data payload to publish (will be hashed on-chain)"
},
"maxFee": {
"type": "number",
"description": "Maximum fee in USDC willing to pay for this publish (e.g. 0.05)"
},
"subscriber": {
"type": "string",
"description": "Subscriber Ethereum address (0x...)"
}
}
}Query 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.
| Argument | Type | Description |
|---|---|---|
| question* | string | The factual question to ask (e.g. 'What was last night's Lakers vs Warriors score?'). Should be specific and verifiable. |
| 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+. |
| subscriber_address* | 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. |
Register 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.
| Argument | Type | Description |
|---|---|---|
| stake* | string | USDC reputation stake to post, as a decimal string. Default '0' — PayPerByte v1 publishers are unstaked. |
| topic* | string | Data feed topic (e.g. 'eth-price', 'weather-nyc', 'gas-tracker') |
| maxSize* | number | Maximum payload size in bytes per message |
| frequency* | number | Expected publishing frequency in seconds |
| pricePerKB* | number | Price per kilobyte in USDC (e.g. 0.003) |
| expectedSize* | number | Expected payload size in bytes per message |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"stake",
"topic",
"expectedSize",
"maxSize",
"frequency",
"pricePerKB"
],
"properties": {
"stake": {
"type": "string",
"description": "USDC reputation stake to post, as a decimal string. Default '0' — PayPerByte v1 publishers are unstaked."
},
"topic": {
"type": "string",
"description": "Data feed topic (e.g. 'eth-price', 'weather-nyc', 'gas-tracker')"
},
"maxSize": {
"type": "number",
"description": "Maximum payload size in bytes per message"
},
"frequency": {
"type": "number",
"description": "Expected publishing frequency in seconds"
},
"pricePerKB": {
"type": "number",
"description": "Price per kilobyte in USDC (e.g. 0.003)"
},
"expectedSize": {
"type": "number",
"description": "Expected payload size in bytes per message"
}
}
}Search PayPerByte publishers by topic and sort order. Returns publisher addresses, topics, subscriber counts, message counts, and price-per-KB.
| Argument | Type | Description |
|---|---|---|
| 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' |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "number",
"maximum": 100,
"minimum": 1,
"description": "Max results to return (default 20)"
},
"query": {
"type": "string",
"description": "Topic keyword to search (e.g. 'weather', 'crypto', 'cve')"
},
"sortBy": {
"type": "string",
"description": "Sort field: 'subscribers', 'revenue', 'messages'"
}
}
}Subscribe 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.
| Argument | Type | Description |
|---|---|---|
| publisher* | string | Publisher Ethereum address (0x...) to subscribe to |
| skipAllowance | 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. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"publisher"
],
"properties": {
"publisher": {
"type": "string",
"description": "Publisher Ethereum address (0x...) to subscribe to"
},
"skipAllowance": {
"type": "boolean",
"description": "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."
}
}
}Get 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.
| Argument | Type | Description |
|---|---|---|
| publisher* | string | Publisher address to check |
| indexerUrl | string | Optional indexer URL override |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"publisher"
],
"properties": {
"publisher": {
"type": "string",
"pattern": "^0x[a-fA-F0-9]{40}$",
"description": "Publisher address to check"
},
"indexerUrl": {
"type": "string",
"format": "uri",
"description": "Optional indexer URL override"
}
}
}Unsubscribe 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.
| Argument | Type | Description |
|---|---|---|
| publisher* | string | Publisher address to unsubscribe from |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"publisher"
],
"properties": {
"publisher": {
"type": "string",
"pattern": "^0x[a-fA-F0-9]{40}$",
"description": "Publisher address to unsubscribe from"
}
}
}Verify-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.
| Argument | Type | Description |
|---|---|---|
| data* | 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. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"data"
],
"properties": {
"data": {
"type": "string",
"description": "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": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{64}$",
"description": "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": {
"enum": [
"raw",
"canonical"
],
"type": "string",
"description": "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": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{64}$",
"description": "On-chain payloadHash to verify against (0x + 64 hex), e.g. the payloadHash returned by byte_query_fact or byte_buy_data."
}
}
}| 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. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"question",
"subscriber_address"
],
"properties": {
"question": {
"type": "string",
"maxLength": 2048,
"minLength": 3,
"description": "The factual question to ask (e.g. 'What was last night's Lakers vs Warriors score?'). Should be specific and verifiable."
},
"topic_filter": {
"type": "string",
"description": "Optional topic filter (e.g. 'fact-oracle' default; future: 'sports', 'finance')."
},
"max_byte_cost": {
"type": "number",
"maximum": 10000,
"minimum": 100,
"description": "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": {
"type": "number",
"maximum": 10000,
"minimum": 0,
"description": "Minimum PQS to consider (BPS scale, 0-10000). 9000 = Elite-only, 7500 = Premium+."
},
"subscriber_address": {
"type": "string",
"pattern": "^0x[0-9a-fA-F]{40}$",
"description": "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."
},
"max_response_latency_ms": {
"type": "number",
"maximum": 180000,
"minimum": 5000,
"description": "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."
}
}
}