Skip to main content
Glama
romudille-bit

AgentPay x402 — Economic-intelligence layer for AI Agents

AgentPay

Tests PyPI Python License: MIT MCP Live gateway x402-list

Most agent-payment tools are a wallet — they move money. AgentPay is the layer that decides whether to spend it at all.

AgentPay is the economic intelligence layer for MCP servers and AI agents.

Agents spend money. Most don't know how much, or why, until the session ends and the bill arrives.

AgentPay gives agents economic intelligence — the ability to reason about cost while they work, not after.

It starts with a budget. Every session opens with a hard cap enforced at the payment layer — not in code a model can ignore, but at the point where money moves. The agent knows from the first call exactly what it has to spend.

Before calling a tool, it knows what that call costs. Mid-task, it can check what's left and route to a cheaper alternative if the math doesn't work. When the session ends, a receipt captures every call, every cost, every decision — not a debug log, but proof of economic accountability.

The developer sees all of it: spending patterns per agent, anomaly flags when something loops or spikes, policy controls that enforce exactly which tools an agent can use and how much it can spend on each.

The result is an agent that doesn't just have a budget. It knows how to use one.

Start free: 20 tools (17 free), no USDC needed, no wallet setup required.
Live gateway: https://agentpay.tools
Settles in: USDC on Base and Stellar, sBTC on Stacks mainnet (walkthrough)


Install

pip install agentpay-x402            # core (Stellar + Stacks/sBTC)
pip install "agentpay-x402[base]"    # + pay tools that settle on Base
pip install "agentpay-x402[stacks]"  # same as core, spelled out — pay in sBTC on Stacks

Related MCP server: CorteX402

Quickstart — 3 lines, zero setup

17 free tools. No USDC, no wallet, no API keys, no human. quickstart() registers an agent, mints a wallet, and returns a ready, budget-capped session.

from agentpay import quickstart

s = quickstart()                                   # registers + mints a wallet
print(s.call("token_price", {"symbol": "ETH"})["result"]["price_usd"])
print(s.spending_summary())                        # receipt: every call, cost, tx

Set a hard budget, or bring your own funded wallet to pay for tools:

s = quickstart(max_spend="0.50")                   # cap this run at $0.50
s = quickstart(secret_key="S...", base_key="0x...")  # your wallet (Stellar + Base)

Every call is session-tracked, and the cap is enforced before any payment is signed.


20 Tools (17 Free + 3 Paid)

Every call is session-tracked — you get a receipt showing every tool called, every cost, and every timestamp.

Tool

Parameters

Returns

url_reader

url

Clean markdown content of any web page

web_search

query

Top 5 results with full content

market_snapshot

S&P 500, Treasury yield, BTC, ETH, gas in one call

token_price

symbol (BTC, ETH, SOL…)

price_usd, change_24h_pct, market_cap_usd

gas_tracker

slow/standard/fast gwei, base_fee_gwei

fear_greed_index

limit (days of history, default 1)

value 0–100, value_classification, history[]

token_market_data

token_a, token_b

volume_24h_usd, market_cap_usd, price_usd

wallet_balance

address, chain (ethereum/stellar)

token balances

whale_activity

token, min_usd (default 100k)

large_transfers[] with direction, total_volume_usd

defi_tvl

protocol (optional, e.g. "uniswap")

tvl, change_1d, change_7d, chains[]

token_security

contract_address, chain

risk_level, is_honeypot, buy_tax, sell_tax

open_interest

symbol (BTC, ETH…)

total_oi_usd, oi_change_1h/24h_pct, long_short_ratio

orderbook_depth

symbol (e.g. ETHUSDT)

best_bid/ask, spread_pct, slippage at $10k/$50k/$250k

funding_rates

asset (optional)

funding_rate_pct, annualized_rate_pct, sentiment per exchange

crypto_news

currencies (e.g. "ETH,BTC"), filter

headlines[] with title, url, sentiment, score

yield_scanner

token, chain (optional), min_tvl

top 10 pools by APY with protocol, tvl_usd, risk_level

dune_query

query_id, limit, fast_only

rows[], columns[], row_count from Dune Analytics

session_create

agent_address, max_spend, label

session_id, budget config, gateway_url, receipt — $0.01

pre_trade_check

symbol, size_usd, side, token_address?

one-call trade verdict (ok/caution/avoid): slippage at YOUR size, side-aware funding carry, OI crowding, optional security — $0.01

verified_route

need, budget_usd?, chain?

buyer-side trust oracle: sweeps the x402 marketplace, collapses sybil/factory clusters, ranks real providers by usage × delivery scores → one vetted recommendation + ready_to_pay challenge — $0.01


Session Intelligence

This is the economic intelligence layer in practice. The Session gives your agent — and you — real visibility into what happened, what it cost, and why.

from agentpay import quickstart, BudgetExceeded

# quickstart() registers + mints a wallet; the returned session is also a
# context manager, so you can `with` it for a printed receipt on exit.
# Budget caps are exact: max_spend=0.10 (float) == "0.10" (str).
with quickstart(max_spend=0.10) as session:

    # Price an entire multi-tool plan BEFORE spending anything (free, no wallet)
    plan = session.estimate_plan(["token_price", "pre_trade_check", "session_create"])
    plan["total_usdc"], plan["fits_budget"]   # per-step costs + cheaper alternatives inside

    # Reason about cost before committing (use the *_usd Decimals for comparisons)
    if session.would_exceed(session.tool_cost_usd("dune_query")):
        alt = session.suggest_cheaper("dune_query")   # {"name": ..., "price": ...}

    # Call a tool — budget enforced before any payment is signed
    r = session.call("token_price", {"symbol": "ETH"})
    r.data["price_usd"]    # inner tool output  (r["result"]["price_usd"] still works)
    r.cost                 # payment amount, e.g. "0"
    r.network              # settlement chain, e.g. "stellar-mainnet" / "base"

    session.remaining_usd()   # Decimal('0.10')

    # For an external x402 tool that offers several chains, pick one:
    # session.call("https://some-x402-tool/endpoint", {}, chain="base")

    # Full receipt — every call, cost, tx hash, and settlement chain
    print(session.spending_summary())
    # {
    #   "calls": 1, "spent": "$0", "remaining": "$0.1", "budget": "$0.1",
    #   "breakdown": [
    #     {"tool": "token_price", "cost": "Free", "tx_hash": "", "network": "stellar-mainnet"}
    #   ]
    # }

Policy parameters

Control exactly what your agent is allowed to do:

from agentpay import AgentWallet, Session

wallet = AgentWallet(secret_key="S...", network="mainnet")   # or quickstart()'s minted wallet
with Session(wallet,
             gateway_url="https://agentpay.tools",
             max_spend=0.10,
             allowed_tools=["token_price", "gas_tracker", "web_search"],
             max_per_tool={"dune_query": 0.02},
             rate_limit=10,                # max 10 calls/min
             prefer_chain="base",          # Base is the default; "stellar" or "stacks" to override
             allowed_recipients=["0x…", "SP…"],   # only these payees may be paid (any rail)
             max_per_call="0.02",          # no single payment above this
             approve_above="0.01",         # payments above this need the approver's yes
             approver=lambda req: ask_human(req)) as session:
    ...

BudgetExceeded fires before any payment goes out if a tool would push you over the cap, isn't on the allowlist, or exceeds its per-tool limit. The recipient allowlist, per-call maximum and approval gate are checked against the 402 itself — the payee and amount that would actually be signed — on every rail, and raise PolicyRejected / ApprovalRequired (both BudgetExceeded subclasses) with nothing signed. Every refusal is listed under spending_summary()["anomalies"], alongside flags for repeated identical paid calls, a single call taking half the cap, and unconfirmed legs. budget_policy() picks the cap itself from an explicit value, an env var, a rule (share of balance) or a prompt, clamped to what the wallet holds — wallet.get_sbtc_balance_usd(rate) gives that ceiling for an sBTC payer.


Example: Market intelligence agent

Five free tools, one session, full receipt.

from agentpay import quickstart

with quickstart() as session:

    snapshot = session.call("market_snapshot", {})
    rates    = session.call("funding_rates",    {"asset": "ETH"})
    oi       = session.call("open_interest",    {"symbol": "ETH"})
    fg       = session.call("fear_greed_index", {})
    whales   = session.call("whale_activity",   {"token": "ETH", "min_usd": 500_000})

    m = snapshot["result"]
    print(f"S&P:       {m['sp500_price']:,.0f}  ({m['sp500_change_pct']:+.2f}%)")
    print(f"ETH:       ${m['eth_price_usd']:,.0f}")
    print(f"Gas:       {m['gas_standard_gwei']} gwei")

    avg_rate = sum(e["funding_rate_pct"] for e in rates["result"]["rates"]) / len(rates["result"]["rates"])
    print(f"Funding:   {avg_rate:+.4f}%/8h")
    print(f"OI 24h:    {oi['result']['oi_change_24h_pct']:+.2f}%")
    print(f"Sentiment: {fg['result']['value_classification']}")
    print(f"Whale vol: ${whales['result']['total_volume_usd']:,.0f}")

    print(session.spending_summary())

Use it in your agent

Agent Skills (one command, any agent)

npx skills add romudille-bit/agentpay

Installs the agentpay-route skill (find, judge, and pay for the best paid x402 tool within a budget) and agentpay-session (hard spend cap + verifiable receipts) into Claude Code, Codex, Droid, OpenCode, or any skills-CLI-compatible runtime. Pair with the MCP below for keyless routing out of the box; add AGENTPAY_BASE_KEY + AGENTPAY_MAX_SPEND for capped, in-place paid calls.

Claude Code plugin (one command)

/plugin marketplace add romudille-bit/agentpay
/plugin install agentpay@agentpay

Installs the agentpay-route skill — your agent finds, judges, and pays for the best paid x402 tool within a budget — plus the 17 free tools. No keys needed to route.

MCP server (any runtime)

Self-contained — pure Node, no Python, no repo, no keys to start:

npx -y @romudille/agentpay-mcp
{
  "mcpServers": {
    "agentpay": {
      "command": "npx",
      "args": ["-y", "@romudille/agentpay-mcp"]
    }
  }
}

Exposes the 17 free tools plus verified_route (buyer-side trust oracle — free preview keyless, full paid payload in wallet mode), route (legacy alias) and estimate_plan (price a multi-tool plan before spending). Listed on Glama.

Wallet mode (v2.4.0): add an EVM key and paid tools settle in-place — gasless EIP-3009 on Base (no ETH needed; nothing broadcast client-side, a rejected call moves no USDC) under a hard session cap:

{
  "mcpServers": {
    "agentpay": {
      "command": "npx",
      "args": ["-y", "@romudille/agentpay-mcp"],
      "env": {
        "AGENTPAY_BASE_KEY": "0x<EVM private key>",
        "AGENTPAY_MAX_SPEND": "0.10"
      }
    }
  }
}

Fund the key's address with USDC on Base mainnet; every paid call counts against AGENTPAY_MAX_SPEND and is refused past the cap — the budget story, enforced inside the MCP itself. Use a dedicated small-balance key.

Buyer-side routing — find & pay for the best tool, within a budget

When an agent needs a paid tool, AgentPay discovers the options across the x402 marketplace, drops the fake/empty stubs, ranks by real usage (not price), and recommends the cheapest one that actually works — within a budget. The agent pays the provider directly (peer-to-peer, no custody) and keeps a verifiable receipt.

agentpay-route "funding rates" --budget 0.01   # ranked candidates + a recommendation

Paid tools: session_create, pre_trade_check, verified_route ($0.01 each)

Three tools cost money today. session_create opens a budget-capped session with a hard max_spend limit — for autonomous agents that need spend enforcement across multiple calls. pre_trade_check is the first outcome bundle: one call returns an ok/caution/avoid trade verdict from live orderbook slippage at your size, side-aware funding carry, open-interest crowding, and an optional contract security scan — with the per-factor breakdown and raw components embedded. verified_route is the buyer-side trust oracle: "I need X, budget $Y — which x402 tool is real?" It sweeps the whole marketplace, collapses sybil/factory clusters, keeps only providers relevant to your need, ranks them by real unique-payer usage × the Prober's paid delivery scores, and returns one vetted recommendation with a ready-to-pay challenge. All 17 data tools remain free.

Price any plan before spending a cent (free, no wallet): POST /v1/plan/estimate, or session.estimate_plan([...]) from the SDK.

When metered inference ships, it works through the same Session interface — your agent checks cost, decides if it's worth it, and pays in USDC on Base or Stellar, or sBTC on Stacks (via the SDK).

# Future — inference as a Session tool
remaining = session.remaining()
infer_cost = session.tool_cost("inference")   # e.g. "$0.02"

if remaining >= infer_cost:
    result = session.call("inference", {"prompt": "...", "model": "claude-haiku"})
else:
    result = session.call("url_reader", {"url": summary_url})  # cheaper path

To fund a wallet for session_create: send USDC to a Stellar wallet (S... key, issuer GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN) or a Base wallet (0x..., contract 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913).

Eating our own dog food

AgentPay's flagship analyst agent (agents/analyst/) runs daily on these exact rails as a real customer: it prices its plan with estimate_plan, gathers free intel, buys pre_trade_check verdicts on the majors under a hard $0.25 cap, and publishes a market note with an on-chain-verifiable receipt. The first best customer is the house.


Architecture

AgentPay is an x402 payment gateway and economic intelligence layer — agents call tools within a hard budget cap, pay USDC on-chain when tools cost money, and accumulate a full session receipt as they work. Free tools skip the payment step entirely; the session tracking and cost awareness are always on.

Chain support & x402 interop

Base settles via the standard x402 exact scheme (gasless EIP-3009 through the CDP facilitator) — any standard x402 client can pay AgentPay on Base, no AgentPay SDK required.

Stellar settles as a classic payment + text memo verified directly on Horizon. It is supported by the AgentPay SDK (pip install agentpay-x402) and by manual payment per the 402 instructions — but it is not the standard @x402/stellar scheme (which uses Soroban null-account templates, signed auth entries, and facilitator settlement). A standard @x402/stellar client cannot pay AgentPay's Stellar rail today; migrating to the standard Soroban scheme is on the v2 roadmap. Standard clients should pay on Base — Circle CCTP bridges USDC 1:1 between the two.

agent (Python SDK)
    │
    │  POST /tools/{name}/call
    │  ← 200 {result: ...}              ← free tools return directly
    │  ← 402 {payment_id, amount, ...}  ← paid tools (session_create, pre_trade_check, verified_route)
    │  → USDC on Base (~2s, standard x402) or Stellar (~3–5s, SDK classic+memo)
    │  → retry with X-Payment header
    │  ← 200 {result: ...}
    ▼
gateway (FastAPI on Railway)
    │
    ├── registry/registry.py   — 20-tool catalog (17 free; session_create, pre_trade_check, verified_route — $0.01 each)
    ├── gateway/routes/plan.py — POST /v1/plan/estimate (free pre-flight plan pricing)
    ├── gateway/radar.py       — Arbitrum x402 Radar discovery + settlement verify (see RADAR.md)
    ├── gateway/stellar.py     — Stellar payment verification via Horizon
    ├── gateway/base.py        — Base payment verification via JSON-RPC
    └── gateway/services/tools_runtime.py — real API dispatchers
            ├── Jina Reader       url_reader
            ├── Jina Search       web_search
            ├── Yahoo+CoinGecko   market_snapshot
            ├── CoinGecko         token_price, token_market_data
            ├── Etherscan V2      gas_tracker, whale_activity, wallet_balance
            ├── DeFiLlama         defi_tvl, yield_scanner
            ├── alternative.me    fear_greed_index
            ├── Reddit            crypto_news
            ├── Dune Analytics    dune_query
            ├── GoPlus            token_security
            └── Binance+Bybit+OKX funding_rates, open_interest, orderbook_depth

Stacks sBTC settlement

AgentPay settles x402 micropayments in sBTC on Stacks mainnet — budget-capped, signed client-side and never broadcast by the client (the gateway broadcasts the signed transaction, so a hostile gateway can settle at most the signed amount). Live on agentpay.tools since agentpay-x402 0.5.0:

from agentpay import quickstart

s = quickstart(stacks_key="<64-hex>", prefer_chain="stacks", max_spend="0.05")
r = s.call("pre_trade_check", {"symbol": "BTC", "size_usd": 25000, "side": "long"})
print(r.data["verdict"], r.tx)      # verdict + the sbtc-token::transfer txid
  • Walkthrough (start here): docs/stacks-walkthrough.md — install → one capped mainnet payment → the receipt verified three ways → the rules refusing before signing, with real output.

  • Mainnet reference: docs/stacks-mainnet.md — config, the one-liner, redeeming an uncertain settle, ledger verification, the pilot agent.

  • Runnable demo: examples/stacks_m1_demo.py — capped session → sBTC payment → receipt → over-cap rejection. STACKS_NETWORK=mainnet runs it on mainnet; the name is from the milestone it was written for.

  • Spending rules demo: examples/stacks_policy_demo.py — recipient allowlist, per-call maximum and approval gate refusing sBTC payments before anything is signed, then one approved settlement; refusals on the receipt.

  • Demo video: YouTube (~40s)

  • Mainnet receipts: 0x30689b5e…, 0xd1de1a79…, 0x59ce7014…sbtc-token::transfer payer → gateway, each from a $0.05-capped session, chain-verified on agentpay.tools/ledger.

  • Milestone-1 (testnet) material, kept as delivered: docs/stacks-m1.md and the testnet proof 0xa5351bad… (PoX-5 testnet, block 82215). The testnet gateway is still up for anyone who wants to try the rail without mainnet sBTC.


Discovery

Directory

Status

PyPI

✅ agentpay-x402

x402scout

✅ indexed, health-checked every 15min

Glama MCP

✅ listed

awesome-x402

✅ listed

npm

✅ @romudille/agentpay-mcp

skills CLI

npx skills add romudille-bit/agentpay

402index.io

✅ domain verified, 17 tools synced

x402-list.com

✅ listed 2026-09-07 — 3 paid endpoints, 14/14 x402 compliance, measured (never self-attested) score

Coinbase Bazaar

✅ indexed via REST — session_create, pre_trade_check, verified_route (Base). ⚠️ NOT in the curated set: invisible on the MCP search_resources default (AGE-125)

Claude Code plugin

/plugin marketplace add romudille-bit/agentpay

MCP Registry

io.github.romudille-bit/agentpay v2.4.3 (official)

402audit

✅ audited — score 100, verdict "proprietary"

signal402

✅ auto-indexed from Bazaar (6h refresh)

x402.fuchss.app

✅ listed — grade recovering post-AGE-123

xpay.tools

dropped — redundant with Bazaar (SPA mirror)

Agent-readable endpoints:

Endpoint

Purpose

/.well-known/agentpay.json

AgentPay manifest

/.well-known/agent.json

A2A agent card

/llms.txt

LLM-readable service description

/.well-known/l402-services

402index.io discovery format

Available Tools

20 tools
crypto_newsA
Read-onlyIdempotent

Latest crypto news and community sentiment from r/CryptoCurrency for any token

Use when: You need recent news headlines or community sentiment for one or more crypto tokens. Not for: you need general web news or documentation — web_search; a specific article's text — url_reader; a numeric sentiment gauge — fear_greed_index. Returns: headlines[] with title, url, sentiment (bullish/neutral/bearish), score, published_at Example response: {"currencies": "ETH", "headlines": [{"title": "Ethereum devs confirm Pectra upgrade timeline", "url": "https://reddit.com/r/CryptoCurrency/...", "sentiment": "bullish", "score": 1842, "published_at": "2026-03-22T08:14:00Z"}, {"title": "ETH gas fees drop to yearly lows", "url": "https://reddit.com/r/CryptoCurrency/...", "sentiment": "bullish", "score": 934, "published_at": "2026-03-22T06:31:00Z"}], "source": "reddit"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNoFeed sort order (default: hot)hot
currenciesNoComma-separated token symbols, e.g. 'BTC,ETH'BTC,ETH

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely new context: free, no API key, nothing signed or spent, and the failure modes (unknown symbol, unreachable upstream). Rate limits or pagination behavior are not mentioned, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line summary followed by clearly labelled Use when / Not for / Returns / Example blocks. The embedded example response is long but earns its place since no output schema exists; minor verbosity otherwise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return contract itself (headlines[] with title, url, sentiment, score, published_at) and even a concrete example payload. Combined with the source, cost and failure behavior, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (filter enum, currencies) are already documented in the schema. The description only echoes 'for any token' and shows a currencies example; it adds no format or default semantics beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Latest crypto news and community sentiment from r/CryptoCurrency') plus scope ('for any token'). The source and content type are explicit, distinguishing it from generic search tools at a glance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use when' trigger and a 'Not for' clause that names three alternatives (web_search, url_reader, fear_greed_index) with the condition that selects each. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

defi_tvlA
Read-onlyIdempotent

DeFi protocol Total Value Locked from DeFiLlama. Returns top 10 or a specific protocol.

Use when: You need the Total Value Locked in a specific DeFi protocol or want to compare the top protocols by TVL. Not for: you want the best yield for a token — yield_scanner; protocol revenue or custom metrics — dune_query. Returns: tvl, change_1h, change_1d, change_7d, chains[], category for the protocol (or top 10 list) Example response: {"protocol": "aave", "tvl": 23800000000.0, "change_1h": 0.12, "change_1d": -1.43, "change_7d": 3.21, "chains": ["Ethereum", "Polygon", "Avalanche", "Base"], "category": "Lending", "source": "defillama"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
protocolNoProtocol name or slug, e.g. 'uniswap', 'aave', 'lido'. Leave empty for top 10.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld/non-destructive, and the description adds materially beyond them: cost ('free'), auth posture ('no API key, nothing signed or spent'), and explicit failure behavior ('Fails with an error message on an unknown symbol or an unreachable upstream source'). That failure-mode disclosure is exactly the kind of operational context an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then cleanly sectioned into Use when / Not for / Returns / Example / Cost and failure. Every section earns its place, though the 'Example response' field list partially repeats the 'Returns:' enumeration, which is minor redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description correctly compensates by enumerating return fields (tvl, change_1h/1d/7d, chains[], category) and giving a concrete example response. Combined with the cost/auth/failure notes, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter already documents 'Leave empty for top 10'. The description restates that behavior ('Returns top 10 or a specific protocol') but adds no new syntax, format, or constraint detail. Baseline 3 applies when the schema carries the parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('DeFi protocol Total Value Locked from DeFiLlama') and immediately defines scope: top 10 or a single named protocol. This is distinguishable from every sibling (yield_scanner, dune_query, token_market_data) without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause names the two valid scenarios (single protocol TVL, comparing top protocols), and the 'Not for' clause routes to named alternatives (yield_scanner for best yield, dune_query for revenue/custom metrics). When-to-use and when-not-to-use are both present with the alternatives spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dune_queryA
Read-onlyIdempotent

Run any Dune Analytics query and return live onchain results by query ID. Use fast_only=True for live bots — returns cached result instantly or raises immediately, never blocks.

Use when: You need deep onchain analytics from a specific Dune query — protocol revenue, user counts, custom metrics. Not for: you have no Dune query ID — the other tools cover prices, derivatives, TVL and security without one; you need sub-second answers — set fast_only=true or use a cached tool. Returns: rows[], columns[], row_count, generated_at from the Dune Analytics query result Example response: {"query_id": 3810512, "row_count": 2, "columns": ["protocol", "revenue_usd"], "rows": [{"protocol": "Uniswap V3", "revenue_usd": 1243800.0}, {"protocol": "Aave V3", "revenue_usd": 987200.0}], "generated_at": "2026-03-22T00:00:00Z", "source": "dune"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows to return (default 25)
query_idYesDune Analytics query ID (visible in the query URL)
fast_onlyNoIf True, return cached result immediately or raise — never execute a fresh query. Use for live bots where latency matters. Default: False.
query_parametersNoOptional named parameters to pass to the Dune query

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, openWorld, idempotent, non-destructive), yet the description adds real value beyond them: fast_only semantics ('returns cached result instantly or raises immediately, never blocks'), cost ('free, no API key, nothing signed or spent'), and failure modes ('fails with an error message on an unknown symbol or unreachable upstream source').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then cleanly sectioned into Use when / Not for / Returns. The example response is long but earns its place because there is no output schema to convey the return shape.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by specifying the return fields (rows[], columns[], row_count, generated_at) and a full example response. Nested query_parameters and all four params are covered, and cost/auth/failure behavior is stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema documents all four parameters, giving a baseline of 3. The description still adds meaning beyond the schema by explaining the latency/blocking contract of fast_only and its intended audience ('for live bots').

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (Run) plus resource (Dune Analytics query) scoped to a query ID, and it explicitly routes away from siblings ('the other tools cover prices, derivatives, TVL and security without one'). An agent can distinguish it from defi_tvl, token_price, etc. without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' and 'Not for' sections name the exact preconditions (you need a Dune query ID) and the disqualifiers (no query ID, need sub-second answers). It even redirects to the correct fallback ('set fast_only=true or use a cached tool').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fear_greed_indexA
Read-onlyIdempotent

Crypto Fear & Greed Index (0=extreme fear, 100=extreme greed) with optional history

Use when: You need to gauge overall crypto market sentiment or mood — whether the market is fearful or greedy. Not for: you want token-specific sentiment — crypto_news (per-token headlines) or funding_rates (leveraged positioning). Returns: value (0–100), value_classification (e.g. 'Greed'), optional history[] Example response: {"value": 10, "value_classification": "Extreme Fear", "timestamp": 1774137600, "source": "alternative.me"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of days of history to return (default 1, max 30)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered structurally. The description adds genuinely useful context beyond that: free, no API key, nothing signed or spent, and error behavior on unreachable upstream. It loses a point because the advertised failure mode 'unknown symbol' is inconsistent with a schema that only exposes a limit parameter and accepts no symbol.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then cleanly sectioned into Use when / Not for / Returns / Example / Cost. Every sentence carries distinct information; the labeled structure makes scanning fast.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description carries the return-value burden and does so explicitly: value, value_classification, optional history, plus a concrete example response. Combined with auth and failure-mode notes, an agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single optional parameter (limit) already fully documented in the schema at 100% coverage, including default and max. The description adds no syntax or semantics beyond that, so the baseline 3 for high schema coverage applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (Crypto Fear & Greed Index) with its scale semantics (0=extreme fear, 100=extreme greed) and optional history. It explicitly distinguishes itself from token-specific siblings (crypto_news, funding_rates), so an agent can route correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use when' condition (gauge overall market sentiment) and a 'Not for' clause naming two concrete alternative tools for token-specific sentiment. This is the when/when-not/alternatives pattern at full strength.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

funding_ratesA
Read-onlyIdempotent

Get perpetual futures funding rates across Binance, Bybit, and OKX

Use when: You need funding rates to gauge leveraged market sentiment or cost of holding a perp position. Not for: you need open interest or long/short ratio — open_interest; one verdict combining funding, OI, slippage and security for a trade — pre_trade_check. Returns: funding_rate_pct, annualized_rate_pct, sentiment (bullish/neutral/bearish) per exchange Example response: {"asset": "BTC", "rates": [{"exchange": "binance", "funding_rate_pct": 0.012, "annualized_rate_pct": 13.14, "sentiment": "bullish"}, {"exchange": "bybit", "funding_rate_pct": 0.011, "annualized_rate_pct": 12.04, "sentiment": "bullish"}, {"exchange": "okx", "funding_rate_pct": 0.009, "annualized_rate_pct": 9.85, "sentiment": "neutral"}], "source": "binance/bybit/okx"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetNoToken symbol, e.g. 'BTC', 'ETH'. Leave empty for all major assets.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent safety, and the description adds value beyond them: cost ('free'), auth requirements ('no API key, nothing signed or spent'), data provenance ('live public data'), and failure modes ('fails with an error message on an unknown symbol or an unreachable upstream source').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Strongly front-loaded and sectioned (purpose, use when, not for, returns, example, cost). The 'Returns' field list and the JSON example overlap somewhat, costing a little efficiency, but both are defensible given no output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description supplies the return shape (funding_rate_pct, annualized_rate_pct, sentiment per exchange) plus a concrete example and error behavior, and its annotations carry the safety profile. Nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single 'asset' parameter is already fully documented in the schema (100% coverage, including the empty-string-for-all-majors behavior). The description adds no format, casing, or lookup guidance beyond that, so it meets the baseline without extending it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get perpetual futures funding rates') and scopes it to three named exchanges, which immediately separates it from single-venue or generic market tools in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' clause names the decision context (gauging leveraged sentiment / cost of holding a perp), and the 'Not for' clause routes to two exact siblings (open_interest, pre_trade_check) with the conditions that select them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gas_trackerA
Read-onlyIdempotent

Get current Ethereum gas prices (slow, standard, fast)

Use when: You need to know current Ethereum gas prices before submitting a transaction or estimating costs. Not for: you need gas as part of a broader read — market_snapshot already includes standard gwei; only Ethereum mainnet gas is reported. Returns: slow_gwei, standard_gwei, fast_gwei, base_fee_gwei, estimated confirmation times Example response: {"slow_gwei": 1.5, "standard_gwei": 2.0, "fast_gwei": 3.0, "base_fee_gwei": 1.2, "source": "etherscan"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds genuinely new context: free pricing, no API key, nothing signed or spent, and the failure mode (error on unknown symbol or unreachable upstream). It stops short of stating rate limits or caching freshness, which for a 'current' price feed would be the one remaining useful disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then labeled sections (Use when / Not for / Returns / Example / Price) that make it skimmable. Slightly long for a zero-parameter read tool, and the inline example response duplicates the field list above it, but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the return burden and does it well: named fields (slow_gwei, standard_gwei, fast_gwei, base_fee_gwei, confirmation times) plus a concrete example payload. Combined with the failure-mode and cost notes, an agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The description correctly avoids inventing parameter semantics for a no-arg tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get current Ethereum gas prices') plus the three tiers (slow, standard, fast), and explicitly scopes it to Ethereum mainnet only. An agent can distinguish it from the 19 siblings, including the one that overlaps (market_snapshot).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Uses an explicit 'Use when' / 'Not for' structure and names the alternative route (market_snapshot already includes standard gwei) with the condition that selects it. Nothing is left to inference about when to pick this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

market_snapshotA
Read-onlyIdempotent

Fed rate, inflation proxy, S&P 500, BTC, ETH, and gas in one call. Replaces three separate API integrations with a single normalized response — the only tool that gives you macro + crypto in one shot.

Use when: You need a combined macro + crypto market overview in one call: S&P 500, Treasury yield, BTC, ETH, and Ethereum gas. Not for: you need one asset in depth — token_price, gas_tracker or funding_rates; history or time series — dune_query. Returns: sp500_price, sp500_change_pct, treasury_yield_10y, btc_price_usd, eth_price_usd, gas_standard_gwei, timestamp Example response: {"sp500_price": 5234.18, "sp500_change_pct": -0.42, "treasury_yield_10y": 4.31, "btc_price_usd": 67200.0, "eth_price_usd": 3450.0, "gas_standard_gwei": 5.2, "timestamp": "2026-05-26T12:00:00Z", "source": "yahoo_finance+coingecko+etherscan"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, open-world, non-destructive behavior. The description adds material beyond annotations: free public data, no API key, nothing signed or spent, and failure behavior on unknown symbols or unreachable upstream sources.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and organized into purpose, use cases, exclusions, returns, and example. It is somewhat verbose, repeating 'one call' and including an example response that largely restates the return fields, but no section is misleading or wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no input schema and no output schema, the description carries the full documentation burden. It lists returned fields and provides an example response, plus safety and failure context, so an agent has enough information to invoke and interpret the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero input parameters, so there are no parameter semantics to document. Per the baseline for zero-parameter tools, a 4 is appropriate; the description correctly does not invent parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific combined resource: macro and crypto market snapshot in one call. It clearly distinguishes itself from siblings such as token_price, gas_tracker, and funding_rates. However, it advertises 'Fed rate, inflation proxy' while the listed returns do not include those fields, creating a minor mismatch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use when' and 'Not for' sections explicitly define the intended context and name alternatives for single-asset depth and historical/time-series queries. An agent can route between this tool and token_price, gas_tracker, funding_rates, or dune_query without inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_interestA
Read-onlyIdempotent

Get total open interest in perpetual futures for any asset, with 1h and 24h change rates. Pairs with funding_rates to complete the derivatives picture — rising OI with high funding = overcrowded position.

Use when: You need to know total open interest in perpetual futures and whether it's rising or falling. Combine with funding_rates for a full derivatives picture. Not for: you need the funding cost of holding a position — funding_rates; a single trade verdict — pre_trade_check. Returns: total_oi_usd, oi_change_1h_pct, oi_change_24h_pct, long_short_ratio, per-exchange breakdown Example response: {"asset": "ETH", "price_usd": 2069.73, "total_oi_usd": 8420000000.0, "oi_change_1h_pct": 1.2, "oi_change_24h_pct": 12.4, "long_short_ratio": 1.08, "exchanges": [{"exchange": "Binance", "oi_contracts": 4066123.5, "oi_change_1h_pct": 1.2, "oi_change_24h_pct": 12.4, "long_short_ratio": 1.08}], "source": "binance/bybit"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetNoToken symbol, e.g. 'BTC', 'ETH', 'SOL'BTC

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, non-destructive, idempotent, openWorld), and the description adds genuinely new context: cost ('free'), no API key, nothing signed or spent, and the specific failure mode (error on unknown symbol or unreachable upstream). That is real disclosure beyond structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and structured with clear labeled sections (Use when / Not for / Returns), which is efficient. However the example response is lengthy and the opening sentence's phrasing is partially repeated in the 'Use when' block, so it is slightly padded rather than maximally tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating return fields (total_oi_usd, oi_change_1h_pct, oi_change_24h_pct, long_short_ratio, per-exchange breakdown) and giving a concrete example response. Combined with usage routing and failure modes, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and there is a single optional parameter with a default of 'BTC', already fully documented in the schema. The description adds no syntax or format detail for the asset parameter, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (get total open interest in perpetual futures) plus supplementary fields (1h/24h change rates). It explicitly distinguishes itself from siblings funding_rates and pre_trade_check by naming what each is for, so an agent can separate them without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' and 'Not for' sections that name the alternative tools (funding_rates, pre_trade_check) and the conditions selecting each. It even articulates the combination pattern (rising OI + high funding = overcrowded), leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

orderbook_depthA
Read-onlyIdempotent

Get real bid/ask depth and slippage estimates at $10k, $50k, and $250k notional from Binance and Bybit. Use before sizing a position to know if you can execute without moving the market.

Use when: You need to estimate slippage before executing a large trade. Tells you how much a $10k, $50k, or $250k order will move the market. Not for: you need market cap or 24h volume — token_market_data; a full pre-trade verdict at your size — pre_trade_check. Centralised-exchange books (Binance/Bybit) only, not DEX pools. Returns: best_bid, best_ask, spread_pct, depth with slippage_pct at $10k/$50k/$250k notional, per-exchange best prices Example response: {"asset": "ETH", "pair": "ETH/USDT", "best_ask": 2071.5, "best_bid": 2071.2, "spread_pct": 0.0145, "depth": [{"notional_usd": 10000, "slippage_pct": 0.002, "executable": true}, {"notional_usd": 50000, "slippage_pct": 0.008, "executable": true}, {"notional_usd": 250000, "slippage_pct": 0.031, "executable": true}], "exchanges": [{"exchange": "Binance", "best_ask": 2071.5, "best_bid": 2071.2}, {"exchange": "Bybit", "best_ask": 2071.6, "best_bid": 2071.1}], "source": "binance/bybit"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetYesToken symbol, e.g. 'BTC', 'ETH', 'SOL'ETH

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/openWorld, but the description adds substantive context beyond them: free pricing, no API key, nothing signed or spent, CEX-only constraint (not DEX), and explicit error behavior on unknown symbols or unreachable upstreams. This is well above the bar.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose followed by clearly labelled 'Use when', 'Not for', 'Returns', and example blocks. Every section earns its place; length is justified by the coverage it provides.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully specifies return fields, a concrete example response, cost/auth profile, and failure modes. An agent has everything needed to invoke and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and only one parameter exists, so the schema already documents 'asset'. The description only reinforces this via the example ('ETH'), adding no syntax or format detail beyond what the schema provides. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) with precise resource and scope: real bid/ask depth and slippage at $10k/$50k/$250k notional from Binance and Bybit. Explicitly differentiates from siblings token_market_data (market cap/24h volume) and pre_trade_check (full pre-trade verdict).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use ('before sizing a position', 'before executing a large trade') and when-not-to-use clauses that name the correct alternative tools for each excluded case. No inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pre_trade_checkA

One-call pre-trade sanity check: 'I want to long $X of SYMBOL — is now sane?' Combines live orderbook slippage at YOUR size, cross-exchange funding (carry cost), open-interest crowding, and contract security (GoPlus) into a single ok/caution/avoid verdict with a per-factor breakdown. Major ERC-20 addresses (LINK, UNI, ARB, OP, AAVE, PEPE, SHIB) resolve automatically; native assets (BTC, ETH, SOL, ...) report security n/a; an unrecognized token without token_address reads 'unknown' and caps the verdict at caution — an unscreened contract can never read 'ok'. Replaces four API integrations and the judgment layer on top of them. Raw component data embedded so you can apply your own thresholds.

Use when: An agent (or human) is about to enter a position and wants one verdict covering liquidity, carry, crowding, and security — instead of four raw feeds plus its own synthesis. Not for: you need a single raw factor — funding_rates, open_interest, orderbook_depth or token_security are free; you are not about to size a position. This call settles $0.01 on-chain. Returns: verdict (ok/caution/avoid), factors{liquidity,carry,crowding,security} each with level + reason, components{orderbook_depth,funding_rates,open_interest}, symbol, side, size_usd Example response: {"symbol": "ETH", "side": "long", "size_usd": 50000, "verdict": "caution", "factors": {"liquidity": {"level": "ok", "slippage_pct": 0.011, "bucket_usd": 50000, "reason": "fills within 0.011% of best ask"}, "carry": {"level": "caution", "median_funding_pct": 0.062, "annualized_pct": 67.9, "reason": "longs paying elevated funding"}, "crowding": {"level": "ok", "long_short_ratio": 1.4, "oi_change_24h_pct": 3.2, "reason": "positioning unremarkable"}, "security": {"level": "skipped", "reason": "no token_address provided"}}}

Price: $0.01 USDC per call — settles on-chain from the wallet in STELLAR_SECRET_KEY (funded mainnet Stellar account required); not read-only. Live public data, no other API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
sideNoTrade direction (funding carry is side-aware)long
symbolYesAsset to check, e.g. 'ETH', 'BTC', 'SOL'
size_usdNoIntended position size in USD (drives the slippage check)
token_addressNoOptional ERC-20 contract address for the GoPlus security scan. Auto-resolved for major tokens; required for a full verdict on tokens the resolver doesn't know (otherwise security reads 'unknown' and caps the verdict at caution)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations already flagging non-read-only/open-world, the description discloses what annotations cannot: the $0.01 on-chain settlement, the required funded mainnet Stellar account in STELLAR_SECRET_KEY, no API key needed, and the fallback semantics (native assets report security n/a; unrecognized tokens read 'unknown' and cap the verdict at caution). These are real operational constraints, not restated hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then clearly separated Use when / Not for / Returns / Example blocks. It is long and mildly repetitive (the $0.01 price is stated twice), but nearly every sentence carries routing, constraint, or output-shape information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers a complex multi-factor, paid, non-idempotent tool without an output schema by listing the return fields plus a full worked example response showing verdict, per-factor levels, and embedded raw components. An agent has enough to size inputs and interpret outputs correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description goes further by explaining the token_address resolution behavior — auto-resolution for named major tokens, security 'n/a' for native assets, and the caution cap for unknown tokens — which materially affects how an agent should populate that field.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a concrete verb+resource and a quoted user intent ('I want to long $X of SYMBOL — is now sane?'), then enumerates the four factors it fuses. It explicitly positions itself against siblings by naming funding_rates, open_interest, orderbook_depth and token_security as the raw components it replaces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Has explicit 'Use when' and 'Not for' sections: use when about to enter a position and want one combined verdict; not for a single raw factor (naming the four free alternatives) or when not sizing a position. This is the strongest form of routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

session_createA

Open a budget-capped agent session on AgentPay. Pay $0.01 USDC once — get a session_id, budget config, and gateway URL. Enforces a hard max_spend cap across all subsequent tool calls via the AgentPay SDK. The entry point for agents discovering AgentPay on Base Bazaar.

Use when: You want to start an AgentPay session with a hard spend cap and get a session_id for tracking. Not for: you only need a session for free tools — the SDK's quickstart() opens one at no cost; this call settles $0.01 on-chain. Returns: session_id, max_spend, agent_address, gateway_url, tools_endpoint, created_at, receipt (tx_hash + network) Example response: {"session_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "max_spend": "0.10", "agent_address": "GBCVQCNFWPM3GDO4GPT4YEQ42ZHPY67QTJA3WN5ERQIKQDXKBX62SLNJ", "label": null, "gateway_url": "https://agentpay.tools", "tools_endpoint": "https://agentpay.tools/tools", "created_at": "2026-05-27T12:00:00Z", "receipt": {"tx_hash": "0xabc...def", "network": "base", "amount_usdc": "0.01"}, "sdk_hint": "Use from agentpay import Session to enforce the max_spend cap client-side."}

Price: $0.01 USDC per call — settles on-chain from the wallet in STELLAR_SECRET_KEY (funded mainnet Stellar account required); not read-only. Live public data, no other API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoOptional human-readable label for this session
max_spendNoHard budget cap in USDC for this session, e.g. '0.10'0.10
agent_addressNoYour wallet address (Stellar G... or EVM 0x...)

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint false, openWorldHint true, non-idempotent, non-destructive), and the description still adds substantial context: the $0.01 on-chain settlement, the funded mainnet Stellar account requirement via STELLAR_SECRET_KEY, the hard max_spend enforcement across all downstream calls, and that no other API key is needed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with labeled Use when / Not for / Returns sections, but the price-and-network information is stated twice (in the opening and the closing paragraph) and the inline example response is long. Efficient overall, with a small amount of redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return contract itself, enumerating every returned field (session_id, max_spend, agent_address, gateway_url, tools_endpoint, created_at, receipt) plus a concrete example. An agent has everything needed to invoke and consume the call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds enforcement meaning to max_spend ('hard max_spend cap across all subsequent tool calls') and clarifies that the call returns the budget config and session_id. It modestly exceeds the schema's own wording.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Open a budget-capped agent session on AgentPay') and immediately scopes it with the entry-point role. No sibling among the data tools (token_price, gas_tracker, etc.) overlaps this session-management function, so the agent can discriminate it easily.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' and 'Not for' sections, and the exclusion names the concrete alternative (SDK quickstart() opening a free session) plus the selecting condition (spend cap / on-chain settlement). This is textbook routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

token_market_dataA
Read-onlyIdempotent

Get market cap, 24h volume, ATH, and price change for any token. Note: does NOT return pool depth or slippage — for pre-trade liquidity estimates, use a dedicated orderbook tool.

Use when: You need 24h trading volume, market cap, or all-time high for a token pair on decentralized exchanges. Not for: you only need the spot price — token_price is lighter; you need pool depth or slippage — orderbook_depth. Returns: volume_24h_usd, market_cap_usd, price_usd, ath_usd, price_change_24h_pct Example response: {"token_a": "ETH", "token_b": "USDC", "price_usd": 2071.45, "volume_24h_usd": 312847293.0, "volume_change_24h_pct": -8.3, "market_cap_usd": 249800000000.0, "ath_usd": 4878.26, "price_change_24h_pct": -3.91, "source": "coingecko"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
token_aYesFirst token symbol
token_bYesSecond token symbol, e.g. USDC

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations already declaring readOnlyHint/idempotentHint, the description adds substantial value beyond them: 'free', 'no API key', 'nothing signed or spent', and explicit failure behavior on unknown symbols or unreachable upstreams. This exceeds the annotation baseline by disclosing cost, auth, and error semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core capability, then structured with 'Use when' / 'Not for' / 'Returns' / 'Example response' / 'Price'. Every sentence earns its place; no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only data tool with no output schema, the description provides return fields, an example response, cost/auth information, and failure modes—everything an agent needs to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 meaning by implying a token pair (token_a/token_b) and demonstrating the pair in the example response (ETH/USDC), which clarifies that both tokens are required and how they interact—beyond the schema's terse field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource ('Get market cap, 24h volume, ATH, and price change for any token') and explicitly distinguishes itself from the sibling orderbook_depth and token_price. An agent can tell exactly what this tool returns without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' and 'Not for' clauses name the alternative tools (token_price for spot price, orderbook_depth for pool liquidity) and the exact conditions that select them. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

token_priceA
Read-onlyIdempotent

Get the current USD price of any cryptocurrency token

Use when: You need the current USD price, 24h change, or market cap of any cryptocurrency. Not for: you need volume, ATH or a pair quote — token_market_data; a one-call macro + crypto overview — market_snapshot; pool depth or slippage — orderbook_depth. Returns: price_usd, change_24h_pct, market_cap_usd, coin_id Example response: {"symbol": "ETH", "price_usd": 2069.73, "change_24h_pct": -4.04, "market_cap_usd": 250330787714.19, "source": "coingecko"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesToken symbol, e.g. BTC, ETH, SOL

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely new context beyond them: it is free, needs no API key, nothing is signed or spent, and it fails with an error on an unknown symbol or unreachable upstream. It does not state rate limits or caching, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then structured 'Use when / Not for / Returns / Example' blocks. Every sentence earns its place; the example response and failure notes are compact and non-redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description enumerates return fields (price_usd, change_24h_pct, market_cap_usd, coin_id) and gives a concrete example response, plus error behavior. An agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter (symbol) at 100% schema description coverage, so the schema already documents it with an example (BTC, ETH, SOL). The description adds nothing about symbol format or case-sensitivity, matching the baseline 3 when the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the current USD price of any cryptocurrency token') and immediately names the sibling it is not, routing volume/ATH/pair quotes to token_market_data. An agent can distinguish it from token_market_data, market_snapshot and orderbook_depth without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' (needs price, 24h change, market cap) and 'Not for' clauses that name the three alternative tools and the exact conditions selecting each. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

token_securityA
Read-onlyIdempotent

Scan any token contract for honeypot, rug pull, and security risks

Use when: You need to check if a token contract is safe before trading or investing. Not for: the asset is a native coin (BTC, ETH, SOL) with no contract — nothing to scan; you want liquidity or price — orderbook_depth / token_price. Ethereum and BSC contracts only. Returns: risk_level, is_honeypot, buy_tax, sell_tax, holder_count, owner_address, is_mintable, can_take_back_ownership Example response: {"contract_address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "chain": "ethereum", "risk_level": "low", "is_honeypot": false, "buy_tax": 0.0, "sell_tax": 0.0, "holder_count": 842341, "is_mintable": false, "can_take_back_ownership": false, "source": "goplus"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
chainNoBlockchain to query (default: ethereum)ethereum
contract_addressYesToken contract address (0x...)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only/idempotent/openWorld, and the description adds genuinely new context: cost ('free'), auth ('no API key, nothing signed or spent'), data provenance ('live public data'), and failure behavior ('errors on unknown symbol or unreachable upstream'). This goes well beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the one-line purpose, then organizes guidelines, return fields, an example response, and cost/failure notes into scannable labeled blocks. No filler sentences; the example payload is high-value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating every returned field and giving a concrete example response, plus cost and error behavior. An agent has everything needed to decide and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (contract_address, chain with enum and default) are fully documented by the schema. The description only restates the chain restriction ('Ethereum and BSC contracts only'), adding little format or syntax detail, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('scan') and resource ('token contract') with the exact risk classes covered (honeypot, rug pull, security risks). It is immediately distinguishable from siblings like token_price and orderbook_depth, which it explicitly disclaims.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' (checking a contract before trading/investing) and 'Not for' conditions, naming the alternative tools (orderbook_depth / token_price) for the excluded liquidity/price case, plus a native-coin exclusion and a chain limitation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

url_readerA
Read-onlyIdempotent

Convert any URL to clean, LLM-ready markdown. Strips ads, nav, and boilerplate — returns just the content. No API key needed.

Use when: You need to read the content of a web page or article and get clean, structured text for further processing. Not for: you do not have a URL yet — web_search returns pages with content; the page requires a login or renders only in a browser. Returns: content (markdown), url, length, truncated flag Example response: {"url": "https://example.com", "content": "# Example Domain\n\nThis domain is for use in illustrative examples...", "length": 1256, "truncated": false, "source": "jina_reader"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe URL to fetch and convert to markdown

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds value beyond them: no API key, cost is free, boilerplate-stripping behavior, and failure on unreachable upstream. The only blemish is a likely copy-paste artifact ('unknown symbol') that doesn't fit a URL reader.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with the core action first, then labeled Use when / Not for / Returns blocks. Mostly earns its place, though the 'Price: free' line and the stray 'unknown symbol' phrase add noise to an otherwise tight structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description compensates by listing return fields (content, url, length, truncated) and giving a concrete example response. Combined with failure behavior and cost, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and there is a single required URL parameter already documented in the schema. The description adds no URL format, scheme, or validation detail beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Convert any URL to clean, LLM-ready markdown') with concrete scope, and explicitly differentiates from the sibling web_search in the 'Not for' clause. An agent can distinguish this from web_search without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' and 'Not for' sections, naming the alternative (web_search) and the conditions that select it (no URL yet, login-walled, JS-only rendering). This is textbook when/when-not/alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verified_routeA

Paid buyer-side trust oracle: 'I need X, budget $Y — which x402 tool is real?' Sweeps the WHOLE x402 marketplace across many queries (a single search shows only a slice), collapses sybil/factory clusters (one wallet stamping many fake-distinct listings → one entry), ranks the genuinely-used survivors by real unique-payer usage, and returns ONE vetted recommendation with a ready-to-pay x402 challenge. The credit-bureau check an agent cannot do itself in one query — pay $0.01 to avoid paying a scam or a dead stub.

Use when: An agent is about to pay an unknown x402 tool and wants the real, used, non-sybil one under budget — not just the cheapest. Not for: you already know which AgentPay tool you need — call it directly; you only want a free preview of the marketplace ranking — the MCP's keyless verified_route preview. This call settles $0.01 on-chain. Returns: recommendation (with ready_to_pay), survivors[], catalog{scanned, real_providers, sybil_collapsed, biggest_factory}, vetting summary Example response: {"need": "dex pair liquidity", "chain": null, "budget_usd": "1", "recommendation": {"name": "Otto AI", "url": "https://otto.example/dex", "price_usd": "0.001", "network": "eip155:8453", "pay_to": "0x0e84ddedaae6a7", "payers30d": 200, "calls30d": 3246, "quality": 3851, "flags": [], "ready_to_pay": {"url": "https://otto.example/dex", "network": "eip155:8453", "price_usd": "0.001", "accepts": {"scheme": "exact", "network": "eip155:8453"}}}, "survivors": [], "catalog": {"scanned": 117, "after_vetting": 114, "real_providers": 41, "unique_wallets": 38, "sybil_collapsed": 73, "biggest_factory": {"pay_to": "0x2bb72231eed3", "listings": 72}}, "vetting": "swept 17 queries \u2192 117 listings \u2192 collapsed 73 sybil listings \u2192 41 real providers"}

Price: $0.01 USDC per call — settles on-chain from the wallet in STELLAR_SECRET_KEY (funded mainnet Stellar account required); not read-only. Live public data, no other API key.

ParametersJSON Schema
NameRequiredDescriptionDefault
needYesWhat the agent needs, e.g. 'dex pair liquidity', 'crypto prices'
chainNoOptional chain filter: 'base', 'arbitrum', 'arbitrum-stack'. Empty = all chains.
budget_usdNoMax USDC the agent will pay the downstream tool per call

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations: settles $0.01 on-chain from STELLAR_SECRET_KEY, requires a funded mainnet Stellar account, is not read-only, uses live public data with no other API key, and explains the sybil-collapse behavior and return shape. Annotations only cover safety hints, so this description carries the real behavioral load and does so richly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the use-when/not-for routing, which is good structure. However, it is dense and includes a full example response JSON inline, which is longer than needed for a 3-param tool and slightly buries the essential routing under illustrative bulk.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers pricing, auth/wallet requirements, sybil behavior, return fields, and an example response despite no output schema. For a paid, non-read-only, open-world tool, this is complete enough for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description mentions need/budget and chain filtering contextually but adds no syntax or enumeration details beyond the schema (e.g., no examples of chain values beyond what the schema already lists).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific, unusual verb+resource: a paid buyer-side trust oracle that sweeps the x402 marketplace, collapses sybil clusters, and returns one vetted recommendation. The quoted user-intent framing ('I need X, budget $Y — which x402 tool is real?') makes it immediately distinguishable from siblings like pre_trade_check or token_security.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' and 'Not for' sections name the alternatives: call the known AgentPay tool directly, or use the free keyless verified_route preview. The condition that selects this tool (about to pay an unknown x402 tool and want the real, used, non-sybil one under budget) is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wallet_balanceA
Read-onlyIdempotent

Get the token balances for any Ethereum or Stellar wallet address

Use when: You need to look up the token holdings of an Ethereum or Stellar wallet address. Not for: you want a token's price or market data rather than one address's holdings — token_price / token_market_data; large transfers across many wallets — whale_activity. Ethereum addresses are 0x…, Stellar addresses G…; no other chains. Returns: list of token balances (symbol, amount) for the given address Example response: {"address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "chain": "ethereum", "balances": [{"token": "ETH", "amount": "1.234"}, {"token": "USDC", "contract": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "amount": "500.00"}]}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
chainYesBlockchain to query
addressYesWallet address (Ethereum 0x... or Stellar G...)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description nonetheless adds real context the annotations cannot: it is free, requires no API key, nothing is signed or spent, and it fails with an error on unknown symbols or unreachable upstreams. It stops short of describing pagination or rate limits, but for a read-only public lookup this is strong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then blocks for usage, return shape, example and cost. Every section earns its place, though the literal example response is somewhat verbose for a two-parameter lookup.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description compensates by describing the return shape ('list of token balances (symbol, amount)') and giving a concrete example response. Combined with the explicit chain restriction and error behavior, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented with the 0x…/G… format hints in the schema itself. The description usefully reinforces that no chains other than Ethereum and Stellar are supported, but adds little syntax beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the token balances for any Ethereum or Stellar wallet address') with the scope of chains bounded. It explicitly distinguishes itself from token_price/token_market_data and whale_activity, so an agent can select it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a 'Use when' line and a 'Not for' line that names the specific alternative tools (token_price, token_market_data, whale_activity) and the condition that routes to each. Nothing about when-not-to-use is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

whale_activityA
Read-onlyIdempotent

Detect recent large wallet movements for a token (whale tracking)

Use when: You need to detect large token transfers that may signal institutional moves, accumulation, or sell-offs. Not for: you need one address's holdings — wallet_balance; exchange order-book size rather than on-chain transfers — orderbook_depth. Ethereum ERC-20 transfers only. Returns: large_transfers[] with from, to, amount, usd_value, minutes_ago; total_volume_usd Example response: {"token": "USDC", "large_transfers": [{"from": "0xabc...1234", "to": "0xdef...5678", "amount": 5000000.0, "usd_value": 5000000.0, "minutes_ago": 12}, {"from": "0x111...aaaa", "to": "0x222...bbbb", "amount": 2500000.0, "usd_value": 2500000.0, "minutes_ago": 34}], "total_volume_usd": 7500000.0, "source": "etherscan"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYesToken symbol to track
min_usdNoMinimum transaction size in USD

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds real value beyond that: 'Ethereum ERC-20 transfers only' scopes the data source, and 'no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source' discloses auth and failure behavior. Only the lack of rate-limit or freshness-window detail keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose followed by scannable Use when / Not for / Returns / Example / Price blocks — every section is labeled and easy to parse. The full JSON example response is somewhat long, but it demonstrates the shape of large_transfers[] and is defensible for a tool with no output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by enumerating return fields (from, to, amount, usd_value, minutes_ago, total_volume_usd) and giving a concrete example. Combined with the Ethereum-only scope and documented failure modes, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented in the schema, establishing a baseline of 3. The description's 'large wallet movements' hints at the min_usd threshold but never explains its default or units, so it adds essentially nothing over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Detect recent large wallet movements for a token' — with the parenthetical 'whale tracking' anchoring the concept. An agent can distinguish this from token_price, wallet_balance, or orderbook_depth without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use when' and 'Not for' clauses name two concrete alternatives (wallet_balance for address holdings, orderbook_depth for exchange book size) and give the discriminating condition for each. This is exactly the when/when-not/alternatives structure that earns the top score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

yield_scannerA
Read-onlyIdempotent

Find best DeFi yield opportunities across protocols for a given token

Use when: You need to find the best yield/APY for a token across DeFi protocols. Not for: you need a protocol's total TVL rather than pool APYs — defi_tvl; risk_level is a heuristic, run token_security on the pool's token before depositing. Returns: list of pools with protocol, apy, tvl_usd, chain, risk_level sorted by APY descending Example response: {"token": "USDC", "pools": [{"protocol": "morpho", "apy": 8.74, "tvl_usd": 312000000.0, "chain": "Ethereum", "risk_level": "low"}, {"protocol": "aave-v3", "apy": 5.21, "tvl_usd": 1840000000.0, "chain": "Ethereum", "risk_level": "low"}, {"protocol": "compound-v3", "apy": 4.87, "tvl_usd": 920000000.0, "chain": "Ethereum", "risk_level": "low"}], "source": "defillama"}

Price: free. Read-only live public data; no API key, nothing signed or spent. Fails with an error message on an unknown symbol or an unreachable upstream source.

ParametersJSON Schema
NameRequiredDescriptionDefault
chainNoFilter by chain: 'ethereum', 'base', 'arbitrum', 'polygon'. Leave empty for all chains.
tokenYesToken symbol to find yields for, e.g. 'ETH', 'USDC', 'BTC'
min_tvlNoMinimum pool TVL in USD (default 1,000,000)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/non-destructive/open-world, and the description adds substantive context on top: cost ('free'), auth ('no API key, nothing signed or spent'), and failure behavior (error on unknown symbol or unreachable upstream). It also discloses the risk_level heuristic caveat, which is not visible in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then cleanly labeled Use when/Not for/Returns/Example sections. The embedded example response is somewhat long, but it substitutes for the missing output schema, so it earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description compensates by describing the return shape ('list of pools with protocol, apy, tvl_usd, chain, risk_level sorted by APY descending') and giving a concrete example. Failure modes and constraints are also covered, leaving nothing essential missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (token, chain, min_tvl) are already documented in the schema. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope ('Find best DeFi yield opportunities across protocols for a given token') and explicitly contrasts with the sibling defi_tvl, which handles TVL rather than pool APYs. An agent can distinguish it from related siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use when' and 'Not for' clauses naming the alternative tool (defi_tvl), plus a proactive prerequisite suggesting token_security before depositing. When-to-use, when-not-to-use, and the alternative are all covered.

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.

  1. 5 tool updatesv0.3.2
    • Changeddune_query1 field changed
      • addedInput schema / properties / fast_only
        Added value: +{
        +  "default": false,
        +  "description": "If True, return cached result immediately or raise — never execute a fresh query. Use for live bots where latency matters. Default: False.",
        +  "type": "boolean"
        +}
    • Changedfunding_rates1 field changed
      • addedInput schema / properties / asset / description
        Added value: +"Token symbol, e.g. 'BTC', 'ETH'. Leave empty for all major assets."
    • Changedopen_interest3 fields changed
      • addedInput schema / properties / asset
        Added value: +{
        +  "default": "BTC",
        +  "description": "Token symbol, e.g. 'BTC', 'ETH', 'SOL'",
        +  "type": "string"
        +}
      • removedInput schema / properties / symbol
        Removed value: -{
        -  "description": "Asset symbol, e.g. BTC or ETH",
        -  "type": "string"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "symbol"
        -]
    • Changedorderbook_depth4 fields changed
      • addedInput schema / properties / asset
        Added value: +{
        +  "default": "ETH",
        +  "description": "Token symbol, e.g. 'BTC', 'ETH', 'SOL'",
        +  "type": "string"
        +}
      • removedInput schema / properties / exchange
        Removed value: -{
        -  "default": "binance",
        -  "description": "Exchange to query: binance (default) or bybit",
        -  "type": "string"
        -}
      • removedInput schema / properties / symbol
        Removed value: -{
        -  "description": "Trading pair, e.g. ETHUSDT or BTCUSDT",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "symbol"
        -]New value: +[
        +  "asset"
        +]
    • Changedyield_scanner3 fields changed
      • addedInput schema / properties / chain / description
        Added value: +"Filter by chain: 'ethereum', 'base', 'arbitrum', 'polygon'. Leave empty for all chains."
      • addedInput schema / properties / min_tvl / description
        Added value: +"Minimum pool TVL in USD (default 1,000,000)"
      • changedInput schema / properties / token / description
        Previous value: -"Token symbol, e.g. ETH, USDC"New value: +"Token symbol to find yields for, e.g. 'ETH', 'USDC', 'BTC'"
  2. 11 tool updatesv0.3.1
    • Addeddefi_tvl
    • Addeddune_query
    • Addedfunding_rates
    • Addedgas_tracker
    • Addedmarket_snapshot
    • Addedopen_interest
    • Changedpre_trade_check1 field changed
      • changedInput schema / properties / token_address / description
        Previous value: -"Optional ERC-20 contract address — adds a GoPlus security scan"New value: +"Optional ERC-20 contract address for the GoPlus security scan. Auto-resolved for major tokens; required for a full verdict on tokens the resolver doesn't know (otherwise security reads 'unknown' and caps the verdict at caution)"
    • Addedtoken_price
    • Addedverified_route
    • Addedwallet_balance
    • Addedweb_search
  3. 12 tool updatesv0.3.0
    • Removeddefi_tvl
    • Removeddex_liquidity
    • Removeddune_query
    • Removedgas_tracker
    • Addedorderbook_depth
    • Addedpre_trade_check
    • Addedsession_create
    • Addedtoken_market_data
    • Removedtoken_price
    • Addedurl_reader
    • Removedwallet_balance
    • Addedyield_scanner
  4. 10 tool updatesv0.1.0
    • First observedcrypto_news
    • First observeddefi_tvl
    • First observeddex_liquidity
    • First observeddune_query
    • First observedfear_greed_index
    • First observedgas_tracker
    • First observedtoken_price
    • First observedtoken_security
    • First observedwallet_balance
    • First observedwhale_activity

TDQS

A4.4/5.0

Scored across 20 tools

Disambiguation4/5

Each tool carries explicit 'Use when / Not for' guidance that sharply delineates boundaries, e.g. token_price vs token_market_data vs orderbook_depth. Some conceptual overlap remains between aggregate tools (market_snapshot, pre_trade_check) and the individual feeds they subsume, but the descriptions resolve it well.

Naming Consistency4/5

Nearly all tools follow a consistent snake_case noun-phrase convention (token_price, gas_tracker, orderbook_depth, funding_rates). Minor deviation: session_create uses noun_verb ordering while the rest are noun_noun, but the style is uniformly readable.

Tool Count4/5

20 tools is on the heavy side but justified by a broad domain spanning spot prices, derivatives, DeFi, security, web search, and the x402 session/payment layer. Each tool targets a distinct data need, so the count is defensible rather than padded.

Completeness4/5

The surface covers prices, market data, gas, derivatives, DeFi yields/TVL, token security, sentiment/news, on-chain analytics, and wallet balances, plus x402 session entry. Minor gaps: no session close/update or list, and historical/time-series access only via dune_query with a query ID.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers