PayPerByte
This server gives AI agents access to PayPerByte — a per-byte USDC data marketplace on Arbitrum Sepolia — enabling discovery, subscription, and on-demand purchase of real-time data feeds with on-chain payment settlement.
Discovery (no wallet required)
Search publishers by topic keyword (e.g., 'weather', 'crypto', 'CVE') with sorting options
List all active feeds with pricing and frequency details
Get publisher details — on-chain status, subscriber/message counts, USDC revenue, and data schema
View network-wide stats — total publishers, messages streamed, and fees settled
Check subscription status for any wallet/publisher pair
List subscriptions for a wallet, including 7/30-day message counts and USDC spend
Check subscription health — detect if a publisher has gone dormant or shifted content
Get token balances — USDC and ETH for any address on Arbitrum Sepolia
Verify payload integrity — recompute keccak256 hash and check against on-chain EIP-712 attestation
Subscribe to Data Streams (requires PRIVATE_KEY)
Subscribe to a publisher's continuous feed with automatic USDC allowance management
Unsubscribe from a feed
Register as a publisher with an on-chain schema and topic
Publish data to subscribers via the DataStream contract with USDC fee settlement
Buy Data On-Demand (requires PRIVATE_KEY)
Buy a single data packet from any feed via the x402 gateway — no subscription needed, pays per-call via EIP-3009 USDC authorization
Query a fact-oracle — ask a slashable on-chain oracle a factual question and receive a verified answer with citations
PayPerByte MCP Server
A Model Context Protocol server that gives AI agents direct access to PayPerByte — cryptographically attested, provenance-verifiable data feeds for AI agents (the X-BYTE-Attestation receipt proves delivery-integrity — these are exactly the bytes PayPerByte served and attested under the BYTE Library domain — not that an independent data publisher signed them, and not that the data is correct). Agents discover feeds, pay-per-call via x402 (settled in USDC on Base mainnet), or subscribe to on-chain streams (Arbitrum Sepolia testnet). Every paid x402 response carries an EIP-712 PayloadAttestation receipt (X-BYTE-Attestation header) the agent verifies before acting. No tokens, no API keys, no off-chain accounts.
Two rails — read this before setting
PRIVATE_KEY.
x402 pay-per-call (
byte_buy_data): Base mainnet (eip155:8453), REAL USDC. Paid feeds settle real money — the flagship Merchant Screen Oracle is $0.10 per verdict: a signed ALLOW/WARN/BLOCK check on a merchant's domain and payout address, backed by a signed EIP-712 attestation over the exact response bytes, run before an agent settles an x402 payment to it. Authenticity and delivery-integrity, not a correctness guarantee on the verdict itself — and on the domain, address and price you supply; it does not observe or constrain the address you ultimately settle to. Use a dedicated wallet holding only what you intend to spend.On-chain subscribe/publish/query layer (BYTE Library contracts + indexer): Arbitrum Sepolia testnet (chain
421614), MockUSDC. Mainnet for this layer is gated on an external security audit. The EIP-712 attestation signing domain stays anchored at421614regardless of which rail you paid on.One
PRIVATE_KEYserves both rails. Never reuse a key holding funds you can't afford to spend.
Quick start
npx -y byte-mcp-serverWire it into your MCP client (Claude Desktop config below), then your agent can:
Discover feeds: "List the PayPerByte catalog" / "Search publishers for weather"
Screen a counterparty before you pay it (x402, no setup): "Screen this domain and payout address before I settle" → $0.10 real USDC on Base mainnet, signed ALLOW/WARN/BLOCK verdict from the Merchant Screen Oracle with an attestation receipt
Try it cheap first: "Get the weather" / "Any earthquakes over M4 today?" → $0.005 / $0.003 real USDC, same attestation receipt on every response — the cheapest way to see verify-before-act work before spending on a verdict
Subscribe to a stream (testnet): "Subscribe me to the earthquakes feed" → auto-approves MockUSDC for ongoing settlement on Arbitrum Sepolia
Query a fact-oracle (testnet): post a signed EIP-712 question to a registered fact-oracle publisher for an on-chain signed answer with citations — when a fact-oracle publisher is live (none is broadcasting today; the tool times out until one registers and broadcasts)
The live catalog is at x402.payperbyte.io/feeds — cryptographically attested, provenance-verifiable feeds across weather, markets, code, security, and knowledge.
Related MCP server: Funding-mcp
Verify before acting (ForeSeal)
See the whole verify-before-act loop in one command — no install, no signup, no wallet:
npx @foreseal/demoIt runs locally (no real USDC) and shows an agent ACT on genuine bytes and REFUSE four attacks — a tampered byte, a forged signature, a missing receipt, a forked signing domain — in about a second.
The same primitive ships as two packages you can drop into your own stack:
Kit —
@payperbyte/sdk: the buyer verifies a receipt before acting.Gate —
@foreseal/gate: a seller stamps a verifiable receipt on any x402 endpoint.
Two paradigms: subscribe vs. buy
Mode | Tool | Rail | Best for | Pricing |
Buy (x402) |
| Base mainnet — real USDC | One-off needs (single snapshot or verdict for this user query) | Per-feed, quoted in the 402 challenge ($0.10 flagship; most feeds cents or less) |
Subscribe |
| Arbitrum Sepolia — testnet MockUSDC | Continuous streams (every weather update, every new earthquake) | $0.003 / KB per delivery |
Buy is zero-setup, pay-as-you-go, and live with real settlement; subscribe delivers every broadcast on the audit-gated testnet layer. Pick by access pattern.
Buying a verdict (POST oracle)
GET data feeds need only a feed. Any feed whose method includes POST (live list: https://x402.payperbyte.io/feeds) takes the query as a body — byte_buy_data switches the call from GET to POST automatically. The verdict oracles — feeds that return a signed ALLOW/WARN/BLOCK — are merchant-screen, address-reputation, sanctions-screen, pkg-verdict, reasoning-verdict:
// byte_buy_data tool call — screen a merchant/counterparty before settling
{
"feed": "merchant-screen",
"body": { "domain": "example.com", "address": "0x1234…abcd", "observed_price_atomic": "100000" }
}The paid response returns the signed verdict and an inline verify-before-act result over the X-BYTE-Attestation receipt:
{
"feed": "merchant-screen",
"paid": true,
"price": "$0.100000",
"txHash": "0x…",
"data": { "answer": { "verdict": "ALLOW", "reasons": ["…"] }, "attestation": { "…": "…" } },
"verification": { "verified": true, "hashMatch": true, "signerMatch": true,
"reason": "receipt verified — bytes intact AND signed by the pinned gateway attester (safe to act)" }
}Act only when verification.verified === true — the receipt proves provenance and integrity, not correctness. Other POST bodies: address-reputation {domain,address}, sanctions-screen {address|name}, pkg-verdict {ecosystem,package[,version]}, reasoning-verdict {subject}. Omit body entirely for GET data feeds (weather, earthquakes, …).
Tools (15 total)
Discovery (read-only, no wallet)
Tool | Description |
| Search publishers by topic and sort order |
| List the active feed catalog with prices and frequencies |
| On-chain info for one publisher (status, subscribers, messages, USDC revenue, schema) |
| Network-wide stats: publishers, messages, total fees settled |
| Is |
| All active subscriptions for a wallet — last 7d/30d messages + USDC spend |
| Content-drift signal for a publisher: stable / moderate / significant / unknown |
| USDC + ETH balances on Arbitrum Sepolia |
| Verify-before-act. Recompute |
Subscribe to a stream (requires PRIVATE_KEY)
Tool | Description |
| Subscribe to a publisher's stream. Auto-bundles USDC |
| Unsubscribe — takes effect next block |
| Register as a data publisher (schema + on-chain registration). v1 is first-party only; stake = 0 |
| Publish a payload to a subscriber via DataStream (settles fee in USDC). See migration notice above re: r2 |
Buy on-demand (requires PRIVATE_KEY)
Tool | Description |
| Buy one packet from any feed via the x402 gateway — real USDC on Base mainnet. No subscription, no allowance. Signs EIP-3009 |
| Ask a slashable fact-oracle publisher a question. Signed EIP-712 request (binds query to your wallet so leaked queries can't burn your escrow); the answer is broadcast on-chain to your address with citations. Requires a live fact-oracle publisher — none is broadcasting today, so the call times out until one registers. |
Configuration
Claude Desktop
Edit ~/.config/claude/claude_desktop_config.json (Linux) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"payperbyte": {
"command": "npx",
"args": ["-y", "byte-mcp-server"],
"env": {
"PRIVATE_KEY": "0x...",
"RPC_URL": "https://sepolia-rollup.arbitrum.io/rpc",
"INDEXER_URL": "http://localhost:8080"
}
}
}
}PRIVATE_KEY is optional — read-only tools work without it. Add it to enable subscribe, publish, buy, and query.
Claude Code
claude mcp add payperbyte -- npx -y byte-mcp-serverEnvironment variables
Variable | Required | Default | Description |
| only for write/buy/query tools | — | EOA key. Signs real Base-mainnet USDC for |
| no |
| Arbitrum Sepolia RPC (the on-chain read/subscribe layer) |
| no |
| PayPerByte indexer API |
| no |
| x402 gateway base URL (used by |
| no | current gateway attester ( | Attester address |
| no | — (uncapped) | Server-side spend cap for |
Network
Two rails, honestly stated:
x402 payment rail (
byte_buy_data): Base mainnet (eip155:8453). Paid feeds settle real USDC through the gateway at x402.payperbyte.io; each paid 200 returns anX-BYTE-AttestationEIP-712 receipt over the exact response bytes.On-chain layer (subscriptions, broadcasts, fact-oracle escrow, indexer): Arbitrum Sepolia (chain
421614). Mainnet for the BYTE Library contracts is gated on an external security audit. The EIP-712PayloadAttestationsigning domain is anchored on421614regardless of the payment rail.
Contract addresses are pinned in the bundled config; the npm release ships ready-to-use defaults. No token.
Development
git clone https://github.com/0rkz/byte-mcp-server.git
cd byte-mcp-server
npm install
npm run build && npm startLicense
MIT — see LICENSE.
Starter kit
Optional paid kit ($39): the buyer-side agent kit — an agent that buys and verifies feeds, with drop-in Claude Desktop / Claude Code / Cursor config and a free 30-minute readiness call included. The npm packages are and stay free MIT — the kit sells the assembled setup.
Links
payperbyte.io — PayPerByte home
x402.payperbyte.io/feeds — live feed catalog
Model Context Protocol — MCP spec
gold-402 — curated directory of live x402 services (PayPerByte is listed)
Available Tools
15 toolsbyte_buy_dataAInspect
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 10 POST oracles — runtime-eol, threat-intel, address-reputation, pkg-verdict, sanctions-screen, reasoning-verdict, merchant-screen, positioning-snapshot, cctp-attestation-latency, regime-signal — 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 (flagship merchant-screen: $0.10/verdict, a pre-settlement counterparty screen — the signed EIP-712 attestation over the exact response bytes proves delivery, not that the verdict itself is correct). Use a dedicated wallet holding only what you intend to spend.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | 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 | Yes | Feed slug — one of: weather ($0.0050), earthquakes ($0.0030), runtime-eol ($0.020), threat-intel ($0.050), address-reputation ($0.100), pkg-verdict ($0.100), sanctions-screen ($0.100), reasoning-verdict ($0.100), merchant-screen ($0.100), positioning-snapshot ($0.030), cctp-attestation-latency ($0.010), regime-signal ($0.020). Full catalog: https://x402.payperbyte.io/feeds (free GET). (For fact-oracle Q&A use byte_query_fact instead — it uses a different request-response flow.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Decoded feed payload returned by the publisher |
| feed | No | Echoed feed slug |
| paid | No | True if an x402 payment was made (false on free/cached feeds) |
| error | No | Error message if the buy failed |
| payer | No | Wallet that signed the EIP-3009 authorization |
| price | No | USDC paid for this packet (e.g. '$0.003000'); omitted on free feeds |
| detail | No | Additional error detail, if any |
| status | No | HTTP status of the (post-payment) gateway response |
| txHash | No | x402 settlement transaction hash |
| verification | No | Two-leg verify-before-act result: {gatewayVerified, hashMatch, signerMatch, recovered, attester, expired, deadline, checkedAt, embeddedAttestation, reason, note}. gatewayVerified=true means the GATEWAY delivered these exact bytes (signed by the pinned gateway attester) — it does NOT verify the per-feed publisher's embedded attestation (answer.attestation). When embeddedAttestation==='present', verify that leg before trusting the data (see note). expired=true means the receipt's EIP-712 deadline had already passed on arrival (deadline/checkedAt are UNIX-second strings); a freshly minted receipt cannot be expired, so that indicates a replayed/cached response or clock skew and the tool refuses (isError) even if the signature checks out. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=false), the description discloses the real payment consequence ('pay-per-call USDC settlement'), the auth prerequisite (server signs EIP-3009 on behalf of the wallet whose PRIVATE_KEY is configured), the settlement flow via the x402 facilitator, and the inline response format: data plus the on-chain tx hash. It even states what is NOT needed (no subscription, no allowance, no prior on-chain setup). This is exactly the context annotations don't carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six dense sentences front-loaded with purpose and payment model, then mechanism, alternative, catalog URL, and usage rules in logical order. Every sentence carries distinct info, though the enumeration of the 10 POST oracles duplicates the schema's feed description — a mild redundancy rather than waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering idempotency/safety traits, the description fills all remaining gaps for a money-spending call: settlement mechanics, wallet/PRIVATE_KEY prerequisite, feed discovery URL, GET vs POST input rules, and explicit sibling routing. An agent has everything needed to invoke this tool correctly and understand what will happen.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — both `feed` (with all 12 slugs and prices) and `body` (POST-oracle requirements) are already fully documented. The description restates the GET/POST switching rule and the oracle list in prose, adding marginal browsing value but no new meaning beyond the schema. Baseline 3 for high coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Buy a single data packet from any PayPerByte feed via the x402 payment gateway.' It explicitly differentiates from siblings by naming byte_subscribe ('continuous stream') and the feed schema names byte_query_fact for fact-oracle Q&A, so an agent can tell this purchase tool apart from subscription and query tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives exdirect when-to-use vs alternatives: 'Use byte_subscribe instead if you want a continuous stream of broadcasts from a publisher,' plus a schema note pointing to byte_query_fact for Q&A. It also tells the agent where to discover feed slugs (the free catalog GET) and exactly when to supply `body` — the GET feeds vs 10 POST oracles split.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_check_subscriptionARead-onlyIdempotentInspect
Check if an address is subscribed to a specific publisher on PayPerByte.
| Name | Required | Description | Default |
|---|---|---|---|
| publisher | Yes | Publisher Ethereum address (0x...) | |
| subscriber | Yes | Subscriber Ethereum address (0x...) |
Output Schema
| Name | Required | Description |
|---|---|---|
| subscribed | Yes | True if the subscriber has an active subscription to the publisher |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the description's lack of explicit safety caveat is acceptable. However, the description does not add behavioral context beyond the annotation: it doesn't mention response details (e.g., whether it returns boolean, subscription info), or if any edge cases (e.g., invalid addresses) exist. It adds minimal value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that clearly conveys the tool's purpose. It is front-loaded and has no unnecessary words or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (two simple parameters, both documented, with a clear purpose), a single sentence is likely sufficient. The output schema exists, so return details are covered by that. However, the description could benefit from telling the agent whether the tool returns a boolean, status, or detailed subscription info, but that may be unnecessary given the output schema. It's minimally complete but not rich.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter has a clear description ('Subscriber Ethereum address', 'Publisher Ethereum address'). The tool description rephrases the parameters but doesn't add deeper semantic context (e.g., how these addresses are used, what format is expected beyond '0x...', or any relationship to the subscription). Since the schema already covers the parameters, the description adds little extra semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Check if an address is subscribed'), the specific resource (a subscription on PayPerByte), and the key entities (address and publisher). It distinguishes itself from siblings like byte_list_my_subscriptions (which lists current user's subscriptions) and byte_subscription_health (which likely assesses health).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While the description implies the tool is for checking a specific subscription status given an address and publisher, it does not provide explicit guidance on when to use this versus alternatives like byte_list_my_subscriptions, byte_subscription_health, or byte_get_token_balances. No exclusions or alternative suggestions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_get_network_statsARead-onlyIdempotentInspect
Get PayPerByte network-wide statistics: total publishers, messages streamed, and total subscriber fees settled in USDC.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| messages | No | Total messages streamed all-time |
| publishers | No | Active publisher count network-wide |
| totalSubscriberFeesUsdc | No | Total subscriber fees settled (USDC, decimal string) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, providing strong safety guarantees. The description adds value by specifying the exact output fields, but does not disclose additional behavioral traits like rate limits or data freshness. With annotations covering the safety profile, a score of 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently conveys the purpose and details of the output. It is front-loaded with the action ('Get') and resource ('PayPerByte network-wide statistics'), earning its place without wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has zero parameters and is well-annotated (read-only, idempotent), the description adequately explains what the tool returns. The existence of an output schema further supports completeness, but the description itself covers the key statistics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and schema description coverage is 100% (trivially). With no parameters to describe, the baseline is 4. The description does not need to add parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool's purpose: 'Get PayPerByte network-wide statistics' and lists the specific statistics returned (total publishers, messages streamed, subscriber fees settled in USDC). This clearly differentiates it from sibling tools like byte_get_publisher (which focuses on a single publisher).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for network-wide statistics, and sibling tools like byte_get_publisher suggest more focused alternatives, but there is no explicit guidance on when to use this tool versus others, nor any exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_get_publisherARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Publisher Ethereum address (0x...) |
Output Schema
| Name | Required | Description |
|---|---|---|
| schema | No | Registered schema (topic, sizes, cadence, price) |
| status | No | On-chain publisher status |
| address | Yes | Publisher Ethereum address |
| messages | No | Total messages published |
| lastActive | No | Unix timestamp of last on-chain activity |
| revenueUsdc | No | Total USDC revenue (decimal string) |
| subscribers | No | Active subscriber count |
| registeredAt | No | Unix timestamp of publisher registration |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, establishing safety. The description adds value by specifying the returned data components (status, counts, revenue, schema), providing behavioral context beyond annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that efficiently conveys the tool's purpose and key data fields. No redundancy or extra words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (1 parameter), rich annotations, and existence of an output schema (not shown but implied), the description covers the necessary context. It lists the returned data types, making it complete for a read-only info retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema's description of the single 'address' parameter ('Publisher Ethereum address (0x...)') is clear. The tool description does not add additional meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves on-chain info for a specific PayPerByte publisher, listing concrete data fields (status, counts, revenue, schema). It distinguishes from sibling tools like byte_search_publishers (search multiple) and byte_list_feeds (list feeds) by its specificity to a single publisher address.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when needing info on a specific publisher by address, but does not explicitly state when to use vs alternatives or provide exclusion criteria. Sibling tools exist, but no guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_get_token_balancesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Ethereum address (0x...) |
Output Schema
| Name | Required | Description |
|---|---|---|
| eth | No | ETH balance (wei) |
| usdc | No | USDC balance (atomic, 6 decimals) |
| address | No | Echoed address |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint, covering safety. The description adds valuable behavioral context: the network (Arbitrum Sepolia testnet) and the explicit exclusion of Base-mainnet balance, which goes beyond what annotations provide. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loading the primary purpose and immediately following with a critical exclusion. Every word serves a purpose, and there is no unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has a single parameter, comprehensive annotations, and an output schema, the description provides sufficient context about the network and the scope of balances. It is complete for the agent to understand usage. A minor improvement could be mentioning the expected balance format, but it's not necessary due to output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description of the address parameter. The tool description does not add additional parameter semantics beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states the tool gets USDC and ETH balances for an address on Arbitrum Sepolia, clearly identifying the specific tokens and network. It distinguishes itself from the sibling tool byte_buy_data by stating what it does not show (Base-mainnet USDC balance), providing strong differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when to use this tool (to get specific token balances on a specific testnet) and explicitly excludes when not to use it (for Base-mainnet USDC balance, which is handled by byte_buy_data). This gives the agent clear guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_list_feedsARead-onlyIdempotentInspect
List all active data feeds in the PayPerByte catalog with topics, price-per-KB, and frequency.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| feeds | No | Catalog of active feeds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds specific behavioral context by stating it returns active feeds with topics, price-per-KB, and frequency, which is meaningful beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is clear, front-loaded, and contains no unnecessary words. It efficiently communicates the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, comprehensive annotations, and an existing output schema, the description is complete. It explains what the tool does and what data it provides, leaving no significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters, so the description does not need to add parameter information. Schema description coverage is 100%. The description adds value by clarifying what the tool returns, meeting the baseline of 4 for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('active data feeds in the PayPerByte catalog'), and mentions what details are included ('topics, price-per-KB, and frequency'). It clearly distinguishes from siblings like byte_search_publishers and byte_list_my_subscriptions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for browsing the catalog but does not explicitly state when to use this tool versus alternatives. No direct guidance on exclusions or when-not-to-use is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_list_my_subscriptionsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| indexerUrl | No | Optional indexer URL override (default: INDEXER_URL/BYTE_INDEXER_URL env or https://feeds.payperbyte.io) | |
| subscriber | Yes | Wallet address to list subscriptions for |
Output Schema
| Name | Required | Description |
|---|---|---|
| subscriptions | No | Active subscriptions for the given wallet |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, idempotentHint, and non-destructive behavior. The description adds behavioral detail beyond annotations by explaining that it returns all active subscriptions with specific per-entry fields, and frames the operation as a read-only review activity. No contradictions found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: first the operation, then the exact output fields, then the intended use. Every sentence earns its place with no redundant phrasing or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list-type read-only tool with a rich output schema and complete annotations, this description is sufficient. It tells the agent what the tool returns, why it should be used, and provides enough context alongside the schema for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `subscriber` and `indexerUrl` are already documented in the schema. The description only reiterates that the wallet address is used to list subscriptions, adding little semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation: 'List every active subscription for a given wallet address.' It precisely identifies the resource (subscriptions), the scope (active, per wallet), and even enumerates the returned fields. This clearly separates it from sibling tools like byte_check_subscription, which checks an individual subscription.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear when-to-use statement: 'Use this to see what you're currently paying for and decide whether to unsubscribe.' It does not explicitly mention alternative tools or exclusions, but the context is unambiguous for the primary use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_publish_dataADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Data payload to publish (will be hashed on-chain) | |
| maxFee | Yes | Maximum fee in USDC willing to pay for this publish (e.g. 0.05) | |
| subscriber | Yes | Subscriber Ethereum address (0x...) |
Output Schema
| Name | Required | Description |
|---|---|---|
| txHash | No | Publish transaction hash |
| success | No | True if publish landed on-chain |
| payloadHash | No | keccak256 of the payload as recorded on-chain |
| payloadSize | No | Payload size recorded on-chain (bytes) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations by explaining what the action entails: 'Hashes the payload, records size on-chain, and settles the fee in USDC.' This is consistent with the destructiveHint and readOnlyHint in the annotations, and it discloses the side effects clearly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the primary action, and every sentence adds value. It is concise without excessive detail, making it easy for an agent to quickly grasp the tool's purpose and key behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a write operation with fee settlement), the description covers the essential behavioral aspects: hashing, on-chain recording, fee settlement, and the private key requirement. The presence of an output schema and full parameter descriptions fills the remaining gaps, making this reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters are fully described in the input schema, so the description does not need to add parameter-level details. The description's mention of hashing and settling fees partially clarifies the purpose of 'data' and 'maxFee', but does not significantly exceed what the schema already provides. Thus, baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Publish data to a subscriber via the PayPerByte DataStream contract.' This is a specific verb and resource that distinguishes it from sibling tools like 'subscribe' or 'buy_data'. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that this tool is used to publish data to a subscriber, but it does not explicitly state when to use it versus alternatives. It does mention a prerequisite ('Requires PRIVATE_KEY'), which provides some usage context, but there is no explicit guidance on when to prefer this tool over other byte_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_query_factAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | The factual question to ask (e.g. 'What was last night's Lakers vs Warriors score?'). Should be specific and verifiable. | |
| topic_filter | No | Optional topic filter (e.g. 'fact-oracle' default; future: 'sports', 'finance'). | |
| max_byte_cost | No | Max response payload bytes you're willing to pay for (defaults to 2000, ≈$1 at $0.0005/byte). Publisher refuses if can't fit answer. | |
| min_publisher_pqs | No | Minimum PQS to consider (BPS scale, 0-10000). 9000 = Elite-only, 7500 = Premium+. | |
| subscriber_address | Yes | 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 | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error message if the query failed (no eligible publisher, broadcast timeout, etc.) |
| answer | No | Publisher's grounded answer to the question |
| citations | No | URLs/sources cited by the publisher in support of the answer |
| confidence | No | Publisher-reported confidence (0-1) |
| elapsed_ms | No | End-to-end time to obtain the answer (ms) |
| request_id | No | Request id binding the query to this answer |
| payload_hash | No | keccak256 of the response payload |
| publisher_pqs | No | Publisher quality score (PQS) at fulfillment |
| publisher_address | No | Publisher address that fulfilled the query |
| response_size_bytes | No | Size of the response payload (bytes) |
| publisher_tx_or_status | No | Delivery status or settlement reference |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: posts a question, waits for broadcast, returns answer + citations. Emphasizes that signed receipt proves provenance, not answer correctness. Also provides latency estimates. No contradiction with annotations (readOnlyHint=false, openWorldHint=true).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise yet comprehensive: 5-6 sentences covering purpose, process, caveats, and parameter specifics. No wasted words; front-loaded with purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 params, output schema exists), the description covers all essential aspects: what it does, how it works, caveats, parameter meanings, and publisher availability. Output schema presumably handles return values, so no gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even with 100% schema coverage, the description adds meaningful context for all parameters: question (specific/verifiable), topic_filter (default), max_byte_cost (cost estimation), min_publisher_pqs (BPS scale), subscriber_address (subscription requirement), max_response_latency_ms (typical times). Goes beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: query a fact-oracle publisher for a signed answer with citations. It distinguishes from sibling tools (e.g., searching publishers, subscribing) by focusing on the querying process.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (need a signed answer with citations) and prerequisites (must be subscribed to a publisher). Also explains caveats like availability and timeout, and mentions the proof vs. correctness distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_register_publisherADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| stake | Yes | USDC reputation stake to post, as a decimal string. Default '0' — PayPerByte v1 publishers are unstaked. | |
| topic | Yes | Data feed topic (e.g. 'eth-price', 'weather-nyc', 'gas-tracker') | |
| maxSize | Yes | Maximum payload size in bytes per message | |
| frequency | Yes | Expected publishing frequency in seconds | |
| pricePerKB | Yes | Price per kilobyte in USDC (e.g. 0.003) | |
| expectedSize | Yes | Expected payload size in bytes per message |
Output Schema
| Name | Required | Description |
|---|---|---|
| topic | No | Registered feed topic |
| txHash | No | Publisher-registration transaction hash |
| success | No | True if registration landed on-chain |
| publisher | No | Registered publisher address (the signer) |
| stakeUsdc | No | USDC stake posted (decimal string; '0' for v1 first-party) |
| schemaTxHash | No | Schema-registration transaction hash |
| approveTxHash | No | USDC stake approval tx hash, if a non-zero stake was posted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a destructive, non-read-only operation. The description adds important context: requires PRIVATE_KEY, registers on-chain, and explains the stake approval flow. This goes beyond what annotations provide and shows no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences, front-loaded with the core purpose, and every sentence contributes new information. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a registration tool with six parameters and an output schema, the description covers the essential context: purpose, on-chain side effects, private key requirement, and stake behavior. It does not detail parameter relationships or prerequisites beyond stake, but remains complete enough for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All six parameters have descriptions in the schema (100% coverage), so the baseline is 3. The description adds a little extra meaning, mainly reinforcing the stake parameter's default and approval step, but does not significantly compensate for any missing parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Register as a data publisher') and specifies that it 'Registers a schema and the publisher on-chain.' This is specific and distinguishes it from sibling tools like byte_publish_data or byte_subscribe.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance for the stake parameter ('leave stake at 0') and notes the approval requirement for non-zero stakes, giving practical context. However, it does not explicitly name alternative tools or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_search_publishersBRead-onlyIdempotentInspect
Search PayPerByte publishers by topic and sort order. Returns publisher addresses, topics, subscriber counts, message counts, and price-per-KB.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return (default 20) | |
| query | No | Topic keyword to search (e.g. 'weather', 'crypto', 'cve') | |
| sortBy | No | Sort field: 'subscribers', 'revenue', 'messages' |
Output Schema
| Name | Required | Description |
|---|---|---|
| publishers | No | Matching publishers, sorted by the requested field |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description only adds return field details. No additional behavioral traits (e.g., pagination, result ordering) are disclosed beyond what the schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence that efficiently conveys action, resource, and return payload. No wasted words; front-loaded with the verb and key nouns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and clear parameter descriptions, the description is largely complete. Missing details like default sort order or case sensitivity are minor, given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters have clear descriptions in the schema (100% coverage). The tool description adds no further meaning to the parameters, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches publishers by topic and sort order, listing specific return fields. It implies a list-oriented search versus a single-publisher retrieval, but does not explicitly distinguish from sibling tools like byte_get_publisher.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. It does not specify prerequisites, like requiring a registered publisher or subscription context, nor does it advise against use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_subscribeAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| publisher | Yes | Publisher Ethereum address (0x...) to subscribe to | |
| skipAllowance | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| txHash | No | Subscribe transaction hash |
| success | No | True if subscribe landed on-chain |
| publisher | No | Publisher subscribed to |
| allowanceTxHash | No | USDC approve(max) transaction hash, if bundled |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral traits: the auto-allowance to type(uint256).max, the contract's silent failure path with DataStreamed emit and amount=0, and the skipAllowance option. These details go well beyond the annotations (readOnlyHint=false, destructiveHint=false) and are essential for understanding the tool's side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is informative but slightly verbose with technical details about the allowance-skip path. However, the information is valuable and well-structured. A minor trim could improve conciseness, but it remains effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (not shown but implied from context), the description need not explain return values. It covers the main action, prerequisite, and edge cases (allowance depletion behavior). It is complete for a mutation tool with two parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description adds significant meaning: clarifying that publisher is an Ethereum address, and explaining skipAllowance's default, the auto-approve logic, and the condition when it is skipped (wallet already has >= $1000 USDC allowance). This enriches the parameter schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Subscribe to a PayPerByte publisher's data feed' with a specific verb and resource. It distinguishes itself from sibling tools like byte_unsubscribe and byte_check_subscription by describing the core action and the default allowance setting behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a prerequisite ('Requires PRIVATE_KEY') and explains when to use skipAllowance: true vs the default. It could be more explicit about when to choose this tool over alternatives like byte_buy_data or byte_list_my_subscriptions, but it provides sufficient context for an AI agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_subscription_healthARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| publisher | Yes | Publisher address to check | |
| indexerUrl | No | Optional indexer URL override |
Output Schema
| Name | Required | Description |
|---|---|---|
| signal | No | Content-drift bucket for the publisher |
| publisher | No | Publisher address checked |
| messages7d | No | Messages in the last 7 days |
| messages30d | No | Messages in the last 30 days |
| messages_7d | No | Messages in the last 7 days (indexer key) |
| messages_30d | No | Messages in the last 30 days (indexer key) |
| silence_hours | No | Hours since the last message (null if never) |
| volume_ratio_bps | No | 7d/baseline volume ratio (bps) |
| cadence_drift_bps | No | Cadence drift vs 23-day baseline (bps) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the readOnly/idempotent annotations by explaining the exact comparison windows (7 days vs 23-day baseline), the thresholds for each return value, and the edge case 'unknown' for new publishers. No contradictions with annotations; the description and annotations agree this is a read-only, idempotent operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: one for purpose, one for algorithm and returns, one for usage. Every sentence carries necessary information and there is no redundancy. The most distinguishing content (signal categories and thresholds) is compactly and clearly presented.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present for return values, the description still adds the algorithmic context, threshold meanings, and intended use-case. It covers the edge cases (new publisher, insufficient baseline) and enough operational detail that an agent can select and invoke the tool correctly without further clarification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: publisher and indexerUrl already have clear descriptions in the schema. The description adds only contextual flavor ('a publisher you subscribe to') without introducing new parameter meaning, syntax, or format details, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get the content-drift signal for a publisher.' It further distinguishes itself from siblings by describing a unique comparison of recent activity against a baseline and enumerating the exact signal categories. The use case ('detect when a publisher you subscribe to has pivoted content or gone dormant') makes the tool's role in the sibling set unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context with 'Use this to detect when a publisher you subscribe to has pivoted content or gone dormant.' It does not explicitly name sibling alternatives or state when not to use it, such as versus byte_check_subscription for plain subscription status, so it stops short of full exclusionary routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_unsubscribeAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| publisher | Yes | Publisher address to unsubscribe from |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | Receipt status ('success' | 'reverted') |
| txHash | No | Unsubscribe transaction hash |
| publisher | No | Publisher unsubscribed from |
| subscriber | No | Subscriber address (the signer) |
| blockNumber | No | Block number the tx landed in |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes effects (next block, no billing, no data flow) and reversibility (resubscribe via byte_subscribe). Adds substantial context beyond annotations, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise, front-loaded sentences with no wasted words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple tool with one parameter and output schema. Description covers usage context, prerequisites, effects, and reversibility. Fully complete for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter 'publisher' already fully described in schema (address pattern). Description adds no new semantic details beyond what schema provides. With 100% coverage, baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Unsubscribe from a publisher's data feed', specifying the action and resource. Distinguishes from sibling tools like byte_subscribe and byte_subscription_health.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises when to use (pivoted content or no longer want feed) and suggests checking byte_subscription_health first. Notes requirement for PRIVATE_KEY.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
byte_verify_payloadARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | 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 | No | 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 | No | 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 | No | On-chain payloadHash to verify against (0x + 64 hex), e.g. the payloadHash returned by byte_query_fact or byte_buy_data. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | Yes | Human-readable verdict an agent can surface when it acts or refuses |
| signer | No | Recovered EIP-712 attestation signer (txHash mode) |
| source | No | Which anchor was used: 'txHash' or 'expectedHash' |
| txHash | No | Settlement tx hash verified against (txHash mode) |
| expired | No | Whether the attestation's EIP-712 deadline has passed at check time — the same rule the contract enforces (block.timestamp > deadline). txHash mode only; absent in expectedHash mode, which carries no deadline. NOT folded into `verified`: the chain refuses to emit an already-expired attestation, so every historical settlement reads expired=true as a matter of course, and refusing those would break provenance audits without proving anything. verified answers 'did the publisher sign exactly these bytes'; expired answers 'is that attestation still inside its validity window'. If you need freshness, require verified && !expired. |
| deadline | No | Attestation deadline as UNIX seconds (decimal string) — txHash mode only |
| verified | Yes | True only if the recomputed hash matches the on-chain attested hash AND (when a signer was recovered) the signer is the publisher. If false: do NOT act on the data. |
| checkedAt | No | Wall-clock time the expiry comparison was made, UNIX seconds (decimal string) |
| hashMatch | Yes | Whether the recomputed hash equals the on-chain hash |
| blockNumber | No | Block number of the settlement tx (txHash mode) |
| onChainHash | Yes | The on-chain attested payloadHash compared against |
| signerMatch | No | Whether the recovered signer is the attesting publisher |
| recomputedHash | Yes | keccak256 of the received bytes |
| attestingPublisher | No | Publisher named in the on-chain event (txHash mode) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint/idempotentHint annotations by explaining the exact mechanism (recompute keccak256 and compare to EIP-712 PayloadAttestation hash), the signer-recovery behavior when txHash is provided, and the operational consequence of verified=false. It also states 'Read-only; no wallet or payment required,' adding auth/context value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense. It front-loads the core purpose with 'Verify-before-act', immediately states the critical safety rule, then supplies anchoring options and read-only status. Each sentence contributes distinct value with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the description covers the full lifecycle: what it does, when it must be used, both verification modes, failure semantics, and read-only/auth implications. The presence of an output schema means return-value details are already handled, so the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful usage semantics beyond the schema: expectedHash is sourced from byte_query_fact/byte_buy_data, txHash recovers the attestation signer, and hashMode 'raw' matches byte_publish_data. This enriches parameter understanding without duplicating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: verify a data payload against an on-chain attestation hash. It clearly distinguishes this from sibling tools by framing it as the verify-before-act counterpart to publish/query/buy data operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call the tool ('ALWAYS call this on BYTE-sourced data before acting on it'), what to do on failure ('if verified=false the bytes were tampered/corrupted... MUST NOT be used'), and how to anchor the check with either expectedHash or txHash. This is strong, actionable usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
3 tool updates
v0.11.13- Changed
byte_buy_data1 field changed- changed
Input schema / properties / feed / descriptionPrevious value: -"Feed slug — one of: weather ($0.0050), earthquakes ($0.0030), runtime-eol ($0.020), threat-intel ($0.050), address-reputation ($0.100), pkg-verdict ($0.100), sanctions-screen ($0.100), reasoning-verdict ($0.100), merchant-screen ($0.100), positioning-snapshot ($0.030). Full catalog: https://x402.payperbyte.io/feeds (free GET). (For fact-oracle Q&A use byte_query_fact instead — it uses a different request-response flow.)"New value: +"Feed slug — one of: weather ($0.0050), earthquakes ($0.0030), runtime-eol ($0.020), threat-intel ($0.050), address-reputation ($0.100), pkg-verdict ($0.100), sanctions-screen ($0.100), reasoning-verdict ($0.100), merchant-screen ($0.100), positioning-snapshot ($0.030), cctp-attestation-latency ($0.010), regime-signal ($0.020). Full catalog: https://x402.payperbyte.io/feeds (free GET). (For fact-oracle Q&A use byte_query_fact instead — it uses a different request-response flow.)"
- Changed
byte_list_my_subscriptions6 fields changed- removed
Output schema / properties / subscriptions / items / properties / lastMessageAt / anyOfRemoved value: -[ - { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - } - ] - }, - { - "type": "null" - } -] - added
Output schema / properties / subscriptions / items / properties / lastMessageAt / typeAdded value: +[ + "number", + "string", + "null" +] - removed
Output schema / properties / subscriptions / items / properties / status / anyOfRemoved value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - } - ] - }, - { - "type": "null" - } -] - added
Output schema / properties / subscriptions / items / properties / status / typeAdded value: +[ + "string", + "number", + "null" +] - removed
Output schema / properties / subscriptions / items / properties / subscribedAt / anyOfRemoved value: -[ - { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - } - ] - }, - { - "type": "null" - } -] - added
Output schema / properties / subscriptions / items / properties / subscribedAt / typeAdded value: +[ + "number", + "string", + "null" +]
- Changed
byte_subscription_health14 fields changed- removed
Output schema / properties / cadence_drift_bps / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / cadence_drift_bps / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / messages30d / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / messages30d / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / messages7d / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / messages7d / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / messages_30d / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / messages_30d / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / messages_7d / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / messages_7d / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / silence_hours / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / silence_hours / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / volume_ratio_bps / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / volume_ratio_bps / typeAdded value: +[ + "number", + "null" +]
5 tool updates
v0.11.12- Changed
byte_buy_data2 fields changed- changed
Input schema / properties / feed / descriptionPrevious value: -"Feed slug — one of: weather ($0.0050), earthquakes ($0.0030), runtime-eol ($0.020), threat-intel ($0.050), evidence-pack ($0.100), address-reputation ($0.100), pkg-verdict ($0.100), sanctions-screen ($0.100), reasoning-verdict ($0.100), liquidation-stream ($0.030), positioning-snapshot ($0.030). Full catalog: https://x402.payperbyte.io/feeds (free GET). (For fact-oracle Q&A use byte_query_fact instead — it uses a different request-response flow.)"New value: +"Feed slug — one of: weather ($0.0050), earthquakes ($0.0030), runtime-eol ($0.020), threat-intel ($0.050), address-reputation ($0.100), pkg-verdict ($0.100), sanctions-screen ($0.100), reasoning-verdict ($0.100), merchant-screen ($0.100), positioning-snapshot ($0.030). Full catalog: https://x402.payperbyte.io/feeds (free GET). (For fact-oracle Q&A use byte_query_fact instead — it uses a different request-response flow.)" - changed
Output schema / properties / verification / descriptionPrevious value: -"Two-leg verify-before-act result: {gatewayVerified, hashMatch, signerMatch, recovered, attester, embeddedAttestation, reason, note}. gatewayVerified=true means the GATEWAY delivered these exact bytes (signed by the pinned gateway attester) — it does NOT verify the per-feed publisher's embedded attestation (answer.attestation). When embeddedAttestation==='present', verify that leg before trusting the data (see note)."New value: +"Two-leg verify-before-act result: {gatewayVerified, hashMatch, signerMatch, recovered, attester, expired, deadline, checkedAt, embeddedAttestation, reason, note}. gatewayVerified=true means the GATEWAY delivered these exact bytes (signed by the pinned gateway attester) — it does NOT verify the per-feed publisher's embedded attestation (answer.attestation). When embeddedAttestation==='present', verify that leg before trusting the data (see note). expired=true means the receipt's EIP-712 deadline had already passed on arrival (deadline/checkedAt are UNIX-second strings); a freshly minted receipt cannot be expired, so that indicates a replayed/cached response or clock skew and the tool refuses (isError) even if the signature checks out."
- Added
byte_check_subscription - Added
byte_publish_data - Added
byte_register_publisher - Changed
byte_verify_payload3 fields changed- added
Output schema / properties / checkedAtAdded value: +{ + "description": "Wall-clock time the expiry comparison was made, UNIX seconds (decimal string)", + "type": "string" +} - added
Output schema / properties / deadlineAdded value: +{ + "description": "Attestation deadline as UNIX seconds (decimal string) — txHash mode only", + "type": "string" +} - added
Output schema / properties / expiredAdded value: +{ + "description": "Whether the attestation's EIP-712 deadline has passed at check time — the same rule the contract enforces (block.timestamp > deadline). txHash mode only; absent in expectedHash mode, which carries no deadline. NOT folded into `verified`: the chain refuses to emit an already-expired attestation, so every historical settlement reads expired=true as a matter of course, and refusing those would break provenance audits without proving anything. verified answers 'did the publisher sign exactly these bytes'; expired answers 'is that attestation still inside its validity window'. If you need freshness, require verified && !expired.", + "type": "boolean" +}
4 tool updates
v0.11.11- Changed
byte_buy_data4 fields changed- added
Input schema / properties / bodyAdded value: +{ + "additionalProperties": {}, + "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" + }, + "type": "object" +} - changed
Input schema / properties / feed / descriptionPrevious value: -"Feed slug — one of: defi-yields ($0.030), weather ($0.0050), earthquakes ($0.0030), space-weather ($0.0030), news-feed ($0.010), code-pulse ($0.020), runtime-eol ($0.020), threat-intel ($0.050), x402-pulse ($0.010), stablecoin-rails ($0.030), perp-funding ($0.020), usc-statute ($0.050), evidence-pack ($0.020), address-reputation ($0.050), pkg-verdict ($0.050), sanctions-screen ($0.050), reasoning-verdict ($0.050), liquidation-stream ($0.030), positioning-snapshot ($0.030), agent-compute ($0.050), agent-memory ($0.050), agent-tools ($0.050). Full catalog: https://x402.payperbyte.io/feeds (free GET). (For fact-oracle Q&A use byte_query_fact instead — it uses a different request-response flow.)"New value: +"Feed slug — one of: weather ($0.0050), earthquakes ($0.0030), runtime-eol ($0.020), threat-intel ($0.050), evidence-pack ($0.100), address-reputation ($0.100), pkg-verdict ($0.100), sanctions-screen ($0.100), reasoning-verdict ($0.100), liquidation-stream ($0.030), positioning-snapshot ($0.030). Full catalog: https://x402.payperbyte.io/feeds (free GET). (For fact-oracle Q&A use byte_query_fact instead — it uses a different request-response flow.)" - changed
Output schema / properties / price / descriptionPrevious value: -"USDC paid for this packet (e.g. '$0.001000'); omitted on free feeds"New value: +"USDC paid for this packet (e.g. '$0.003000'); omitted on free feeds" - added
Output schema / properties / verificationAdded value: +{ + "additionalProperties": {}, + "description": "Two-leg verify-before-act result: {gatewayVerified, hashMatch, signerMatch, recovered, attester, embeddedAttestation, reason, note}. gatewayVerified=true means the GATEWAY delivered these exact bytes (signed by the pinned gateway attester) — it does NOT verify the per-feed publisher's embedded attestation (answer.attestation). When embeddedAttestation==='present', verify that leg before trusting the data (see note).", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Removed
byte_check_subscription - Removed
byte_publish_data - Removed
byte_register_publisher
1 tool update
v0.10.9- Changed
byte_buy_data1 field changed- changed
Input schema / properties / feed / descriptionPrevious value: -"Feed slug — one of: defi-yields ($0.049), weather ($0.021), earthquakes ($0.0015), space-weather ($0.0024), news-feed ($0.0063), code-pulse ($0.010), runtime-eol ($0.069), threat-intel ($0.026), x402-pulse ($0.015), stablecoin-rails ($0.020), perp-funding ($0.0073), usc-statute ($0.012), evidence-pack ($0.100), address-reputation ($0.050), pkg-verdict ($0.050), sanctions-screen ($0.050), liquidation-stream ($0.0079), positioning-snapshot ($0.037). Full catalog: https://x402.payperbyte.io/feeds (free GET). (For fact-oracle Q&A use byte_query_fact instead — it uses a different request-response flow.)"New value: +"Feed slug — one of: defi-yields ($0.030), weather ($0.0050), earthquakes ($0.0030), space-weather ($0.0030), news-feed ($0.010), code-pulse ($0.020), runtime-eol ($0.020), threat-intel ($0.050), x402-pulse ($0.010), stablecoin-rails ($0.030), perp-funding ($0.020), usc-statute ($0.050), evidence-pack ($0.020), address-reputation ($0.050), pkg-verdict ($0.050), sanctions-screen ($0.050), reasoning-verdict ($0.050), liquidation-stream ($0.030), positioning-snapshot ($0.030), agent-compute ($0.050), agent-memory ($0.050), agent-tools ($0.050). Full catalog: https://x402.payperbyte.io/feeds (free GET). (For fact-oracle Q&A use byte_query_fact instead — it uses a different request-response flow.)"
1 tool update
v0.10.8- Changed
byte_buy_data1 field changed- changed
Input schema / properties / feed / descriptionPrevious value: -"Feed slug — one of: weather, earthquakes, space-weather, news-feed, code-pulse, runtime-eol, threat-intel, btc-metrics, pkg-facts, cve-facts, wiki-facts, merchant-trust, crypto-top100, defi-yields, byte-status. (For fact-oracle Q&A use byte_query_fact instead — it uses a different request-response flow.)"New value: +"Feed slug — one of: defi-yields ($0.049), weather ($0.021), earthquakes ($0.0015), space-weather ($0.0024), news-feed ($0.0063), code-pulse ($0.010), runtime-eol ($0.069), threat-intel ($0.026), x402-pulse ($0.015), stablecoin-rails ($0.020), perp-funding ($0.0073), usc-statute ($0.012), evidence-pack ($0.100), address-reputation ($0.050), pkg-verdict ($0.050), sanctions-screen ($0.050), liquidation-stream ($0.0079), positioning-snapshot ($0.037). Full catalog: https://x402.payperbyte.io/feeds (free GET). (For fact-oracle Q&A use byte_query_fact instead — it uses a different request-response flow.)"
12 tool updates
v0.10.7- Changed
byte_buy_data8 fields changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / detailAdded value: +{ + "description": "Additional error detail, if any", + "type": "string" +} - added
Output schema / properties / paidAdded value: +{ + "description": "True if an x402 payment was made (false on free/cached feeds)", + "type": "boolean" +} - added
Output schema / properties / payerAdded value: +{ + "description": "Wallet that signed the EIP-3009 authorization", + "type": "string" +} - removed
Output schema / properties / payloadHashRemoved value: -{ - "description": "keccak256 of the response payload", - "type": "string" -} - added
Output schema / properties / priceAdded value: +{ + "description": "USDC paid for this packet (e.g. '$0.001000'); omitted on free feeds", + "type": "string" +} - removed
Output schema / properties / pricePaidRemoved value: -{ - "description": "USDC paid for this packet (atomic)", - "type": "string" -} - added
Output schema / properties / statusAdded value: +{ + "description": "HTTP status of the (post-payment) gateway response", + "type": "number" +}
- Changed
byte_get_network_stats6 fields changed- added
Output schema / properties / messagesAdded value: +{ + "description": "Total messages streamed all-time", + "type": "number" +} - added
Output schema / properties / publishersAdded value: +{ + "description": "Active publisher count network-wide", + "type": "number" +} - removed
Output schema / properties / totalMessagesRemoved value: -{ - "description": "Total messages streamed all-time", - "type": "number" -} - removed
Output schema / properties / totalPublishersRemoved value: -{ - "description": "Active publisher count network-wide", - "type": "number" -} - removed
Output schema / properties / totalSubscriberFeesRemoved value: -{ - "description": "Total subscriber fees settled (USDC atomic)", - "type": "string" -} - added
Output schema / properties / totalSubscriberFeesUsdcAdded value: +{ + "description": "Total subscriber fees settled (USDC, decimal string)", + "type": "string" +}
- Changed
byte_get_publisher4 fields changed- added
Output schema / properties / lastActiveAdded value: +{ + "description": "Unix timestamp of last on-chain activity", + "type": "number" +} - added
Output schema / properties / registeredAtAdded value: +{ + "description": "Unix timestamp of publisher registration", + "type": "number" +} - removed
Output schema / properties / revenueRemoved value: -{ - "description": "Total USDC revenue (atomic)", - "type": "string" -} - added
Output schema / properties / revenueUsdcAdded value: +{ + "description": "Total USDC revenue (decimal string)", + "type": "string" +}
- Changed
byte_list_feeds5 fields changed- changed
Output schema / properties / feeds / items / properties / pricePerKB / descriptionPrevious value: -"Price per KB in USDC"New value: +"Price per KB in USDC (decimal string)" - changed
Output schema / properties / feeds / items / properties / pricePerKB / typePrevious value: -"number"New value: +"string" - added
Output schema / properties / feeds / items / properties / publisherAdded value: +{ + "description": "Publisher address for the feed", + "type": "string" +} - removed
Output schema / properties / feeds / items / properties / slugRemoved value: -{ - "description": "Feed slug used in x402 routes", - "type": "string" -} - removed
Output schema / properties / feeds / items / properties / statusRemoved value: -{ - "description": "Feed status", - "type": "string" -}
- Changed
byte_list_my_subscriptions12 fields changed- changed
Input schema / properties / indexerUrl / descriptionPrevious value: -"Optional indexer URL override (default: BYTE_INDEXER_URL env or http://localhost:8080)"New value: +"Optional indexer URL override (default: INDEXER_URL/BYTE_INDEXER_URL env or https://feeds.payperbyte.io)" - added
Output schema / properties / subscriptions / items / properties / lastMessageAt / anyOfAdded value: +[ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } +] - removed
Output schema / properties / subscriptions / items / properties / lastMessageAt / typeRemoved value: -"number" - added
Output schema / properties / subscriptions / items / properties / spend30dUsdcAdded value: +{ + "description": "USDC spent in last 30 days (decimal string)", + "type": "string" +} - added
Output schema / properties / subscriptions / items / properties / spend7dUsdcAdded value: +{ + "description": "USDC spent in last 7 days (decimal string)", + "type": "string" +} - removed
Output schema / properties / subscriptions / items / properties / spent30dRemoved value: -{ - "description": "USDC spent in last 30 days (atomic)", - "type": "string" -} - removed
Output schema / properties / subscriptions / items / properties / spent7dRemoved value: -{ - "description": "USDC spent in last 7 days (atomic)", - "type": "string" -} - added
Output schema / properties / subscriptions / items / properties / status / anyOfAdded value: +[ + { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } +] - changed
Output schema / properties / subscriptions / items / properties / status / descriptionPrevious value: -"Subscription status"New value: +"Subscription status (string label or numeric code)" - removed
Output schema / properties / subscriptions / items / properties / status / typeRemoved value: -"string" - added
Output schema / properties / subscriptions / items / properties / subscribedAt / anyOfAdded value: +[ + { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } +] - removed
Output schema / properties / subscriptions / items / properties / subscribedAt / typeRemoved value: -"number"
- Changed
byte_publish_data3 fields changed- removed
Output schema / properties / errorRemoved value: -{ - "description": "Error message if the operation failed", - "type": "string" -} - removed
Output schema / properties / feePaidRemoved value: -{ - "description": "Actual USDC fee paid (atomic)", - "type": "string" -} - added
Output schema / properties / payloadSizeAdded value: +{ + "description": "Payload size recorded on-chain (bytes)", + "type": "number" +}
- Changed
byte_query_fact15 fields changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / citations / descriptionPrevious value: -"URLs cited by the publisher in support of the answer"New value: +"URLs/sources cited by the publisher in support of the answer" - removed
Output schema / properties / citations / items / typeRemoved value: -"string" - added
Output schema / properties / confidenceAdded value: +{ + "description": "Publisher-reported confidence (0-1)", + "type": "number" +} - added
Output schema / properties / elapsed_msAdded value: +{ + "description": "End-to-end time to obtain the answer (ms)", + "type": "number" +} - removed
Output schema / properties / feePaidRemoved value: -{ - "description": "USDC fee paid for the broadcast (atomic)", - "type": "string" -} - removed
Output schema / properties / payloadHashRemoved value: -{ - "description": "keccak256 of the response payload", - "type": "string" -} - added
Output schema / properties / payload_hashAdded value: +{ + "description": "keccak256 of the response payload", + "type": "string" +} - removed
Output schema / properties / publisherRemoved value: -{ - "description": "Publisher address that fulfilled the query", - "type": "string" -} - added
Output schema / properties / publisher_addressAdded value: +{ + "description": "Publisher address that fulfilled the query", + "type": "string" +} - added
Output schema / properties / publisher_pqsAdded value: +{ + "description": "Publisher quality score (PQS) at fulfillment", + "type": "number" +} - added
Output schema / properties / publisher_tx_or_statusAdded value: +{ + "description": "Delivery status or settlement reference", + "type": "string" +} - added
Output schema / properties / request_idAdded value: +{ + "description": "Request id binding the query to this answer", + "type": "string" +} - added
Output schema / properties / response_size_bytesAdded value: +{ + "description": "Size of the response payload (bytes)", + "type": "number" +} - removed
Output schema / properties / txHashRemoved value: -{ - "description": "BroadcastStreamed transaction hash", - "type": "string" -}
- Changed
byte_register_publisher8 fields changed- added
Output schema / properties / approveTxHashAdded value: +{ + "description": "USDC stake approval tx hash, if a non-zero stake was posted", + "type": "string" +} - removed
Output schema / properties / errorRemoved value: -{ - "description": "Error message if the operation failed", - "type": "string" -} - added
Output schema / properties / publisherAdded value: +{ + "description": "Registered publisher address (the signer)", + "type": "string" +} - removed
Output schema / properties / publisherAddressRemoved value: -{ - "description": "Registered publisher address (the signer)", - "type": "string" -} - added
Output schema / properties / schemaTxHashAdded value: +{ + "description": "Schema-registration transaction hash", + "type": "string" +} - added
Output schema / properties / stakeUsdcAdded value: +{ + "description": "USDC stake posted (decimal string; '0' for v1 first-party)", + "type": "string" +} - added
Output schema / properties / topicAdded value: +{ + "description": "Registered feed topic", + "type": "string" +} - changed
Output schema / properties / txHash / descriptionPrevious value: -"Register transaction hash"New value: +"Publisher-registration transaction hash"
- Changed
byte_subscribe6 fields changed- added
Output schema / properties / allowanceTxHashAdded value: +{ + "description": "USDC approve(max) transaction hash, if bundled", + "type": "string" +} - removed
Output schema / properties / approveTxRemoved value: -{ - "description": "USDC approve(max) transaction hash, if bundled", - "type": "string" -} - removed
Output schema / properties / errorRemoved value: -{ - "description": "Error message if the operation failed", - "type": "string" -} - added
Output schema / properties / publisherAdded value: +{ + "description": "Publisher subscribed to", + "type": "string" +} - removed
Output schema / properties / subscribeTxRemoved value: -{ - "description": "Subscribe transaction hash", - "type": "string" -} - added
Output schema / properties / txHashAdded value: +{ + "description": "Subscribe transaction hash", + "type": "string" +}
- Changed
byte_subscription_health12 fields changed- changed
Output schema / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / cadence_drift_bpsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Cadence drift vs 23-day baseline (bps)" +} - removed
Output schema / properties / detailsRemoved value: -{ - "description": "Underlying counts, cadence ratios, and last-message timestamp" -} - added
Output schema / properties / messages30dAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Messages in the last 30 days" +} - added
Output schema / properties / messages7dAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Messages in the last 7 days" +} - added
Output schema / properties / messages_30dAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Messages in the last 30 days (indexer key)" +} - added
Output schema / properties / messages_7dAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Messages in the last 7 days (indexer key)" +} - added
Output schema / properties / publisherAdded value: +{ + "description": "Publisher address checked", + "type": "string" +} - added
Output schema / properties / signalAdded value: +{ + "description": "Content-drift bucket for the publisher", + "enum": [ + "stable", + "moderate", + "significant", + "unknown" + ], + "type": "string" +} - added
Output schema / properties / silence_hoursAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Hours since the last message (null if never)" +} - removed
Output schema / properties / statusRemoved value: -{ - "description": "Content-drift bucket for the publisher", - "enum": [ - "stable", - "moderate", - "significant", - "unknown" - ], - "type": "string" -} - added
Output schema / properties / volume_ratio_bpsAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "7d/baseline volume ratio (bps)" +}
- Changed
byte_unsubscribe6 fields changed- added
Output schema / properties / blockNumberAdded value: +{ + "description": "Block number the tx landed in", + "type": "string" +} - removed
Output schema / properties / errorRemoved value: -{ - "description": "Error message if the operation failed", - "type": "string" -} - added
Output schema / properties / publisherAdded value: +{ + "description": "Publisher unsubscribed from", + "type": "string" +} - added
Output schema / properties / statusAdded value: +{ + "description": "Receipt status ('success' | 'reverted')", + "type": "string" +} - added
Output schema / properties / subscriberAdded value: +{ + "description": "Subscriber address (the signer)", + "type": "string" +} - removed
Output schema / properties / successRemoved value: -{ - "description": "True if the unsubscribe landed on-chain", - "type": "boolean" -}
- Changed
byte_verify_payload3 fields changed- added
Output schema / properties / blockNumberAdded value: +{ + "description": "Block number of the settlement tx (txHash mode)", + "type": "string" +} - added
Output schema / properties / sourceAdded value: +{ + "description": "Which anchor was used: 'txHash' or 'expectedHash'", + "type": "string" +} - added
Output schema / properties / txHashAdded value: +{ + "description": "Settlement tx hash verified against (txHash mode)", + "type": "string" +}
15 tool updates
v0.10.5- Added
byte_buy_data - Added
byte_check_subscription - Added
byte_get_network_stats - Added
byte_get_publisher - Added
byte_get_token_balances - Added
byte_list_feeds - Added
byte_list_my_subscriptions - Added
byte_publish_data - Added
byte_query_fact - Added
byte_register_publisher - Added
byte_search_publishers - Added
byte_subscribe - Added
byte_subscription_health - Added
byte_unsubscribe - Added
byte_verify_payload
TDQS
Each tool clearly targets a distinct resource and action: network stats, publisher search, subscription checks, pay-per-call purchase, fact queries, and payload verification. Even similar tools like byte_check_subscription and byte_list_my_subscriptions are separated by scope, so an agent should be able to select correctly.
All tools share the byte_ prefix and almost universally follow a snake_case verb_noun pattern: get_*, list_*, check_*, subscribe, publish_data, query_fact, verify_payload. byte_subscription_health is a minor noun-phrase deviation, but the overall naming scheme is highly predictable.
Fifteen tools is at the upper edge of the ideal range, but each tool earns its place by covering a distinct workflow step: discovery, publisher registration, subscription lifecycle, publishing, pay-per-call buying, fact-oracle queries, and verification. The count feels intentional rather than padded.
The tool surface covers the major workflows well: finding feeds, subscribing/unsubscribing, registering and publishing data, buying data without a subscription, querying fact oracles, and verifying payloads. Minor gaps exist around publisher account maintenance—such as updating a schema/price or withdrawing earned revenue—but these do not block the primary agent workflows.
Maintenance
Related MCP Connectors
Market data and web intelligence for AI agents, paid per call in USDC on Base via x402.
Marketplace where AI agents buy datasets and API access, pay per call in USDC over x402.
Pay-per-call data APIs for AI agents. USDC on Base via x402. 33 tools, no signup.
Pay-per-call (x402/USDC-Base) web + crypto data tools for AI agents: audit, extract, crypto, DeFi.
Related MCP Servers
- AlicenseBqualityDmaintenanceHigh-performance CCXT MCP server for cryptocurrency exchange integration2478145MIT

Funding-mcpofficial
AlicenseAqualityBmaintenanceReal-time perp market-data for AI trading agents — funding rates, funding-arb signals, open interest, volume, orderbook depth/slippage and oracle families across 25 venues, plus HIP-3 RWA coverage (tokenized stocks, metals, oil) that mainstream aggregators lack. x402-native pay-per-call (USDC on Base): one free funding screener tool + 11 paid tools with auto-pay.12212MIT- FlicenseAqualityCmaintenancePay-per-call tools for AI agents including trust checks, due diligence, market data, and human-verified approvals, settled in USDC on Base via the x402 protocol.16-
- AlicenseAqualityCmaintenanceEnables AI agents to access crypto/web3 data across 5 chains with pay-per-call billing in USDC via x402, no API key required, and built-in spend caps.3647MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/0rkz/byte-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server