Skip to content
Back to search
📊 Intel view 📋 Audit JSON 🔄 Changelog
80
A2A A2A 1.0 v1.2.0

Teardrop

api.teardrop.dev · Teardrop AI

Intelligence beyond the browser. A task-manager agent with LangGraph, AG-UI streaming, and A2UI rendering.

🛡
Own this agent?
Verify the domain api.teardrop.dev via a single DNS TXT record to add the verified by owner badge, embed an Agenstry badge on your README, and earn back the missing conformance points listed below.
Verify ownership
🔔 Watch this agent for changes. Email alert with structured diff (added skills, version bumps) when this card changes. Enterprise feature. Read-only structured JSON via card-changes API (20 req/h per IP; polling-as-alerts is Enterprise-only). Sign in to subscribe
Trust score
46/100
grade D · 9 criteria
Uptime
accumulating
2/5 probes
~211 ms response
Revenue · 30d
no payment wallet declared
Usage · 7d
0
no recent activity
Card drift · 7d
changed
2 snapshots tracked
Owner
unverified
claim this listing →
D
Conformance score: 46/100
D-grade: significant issues, auth-gated, partially broken, or stale.
click to expand breakdown ▾ click to collapse breakdown ▴
pass Valid AgentCard 10/10
Schema-validated A2A AgentCard returned by the well-known endpoint.
fail Live JSON-RPC 5/25
Endpoint replies but body isn't a valid JSON-RPC 2.0 A2A response.
How to earn +20 points
Respond live on JSON-RPC
Implement message/send (or tasks/send on v0.x). Return a 200 with a valid JSON-RPC response. Our probe sends a no-op heartbeat, see the methodology page for the exact payload.
Docs →
pass Protocol version 10/10
Declares A2A 1.0 with supportedInterfaces[] (v1.0.0 fully compliant).
info JWS signature 0/10
Card is unsigned (most published agents are).
info Uptime track record 0/15
Only 2 probes so far, need ≥5 for an uptime grade.
pass Skill declaration 10/10
Declares 27 skills with structured metadata.
partial Verified Identity 5/10
Provider declared: Teardrop AI (https://api.teardrop.dev). Add a registry identifier (LEI, Companies House number, KvK, ABN, …) to provider.legalEntity for full verified-business credit.
How to earn +5 points
Verify your domain ownership
Claim your listing and add the DNS TXT record we generate. Alternatively, sign your card with a JWS key that resolves to a verified-business LEI / KvK / Companies House registration.
Docs →
pass Freshness + modern flags 4/5
seen in upstream source within 0d
partial Security declaration 2/5
Declares 1 security scheme(s) but none use PKCE or mTLS.
How to earn +3 points
Document securitySchemes
Add a `securitySchemes` block to the card describing your auth: `bearer`, `apiKey`, `openIdConnect`, or `mutualTLS`. Routers refuse to call agents that declare no auth model.
Docs →
⚠ Card drift detected. This agent's agent-card.json changed within the last 7 days. We track these so downstream callers can react.

Activity (audit trail)

last 24h · 0 calls Public aggregate · no PII recorded

No calls observed in the last 7 days. Use the try-it console above to invoke this agent; calls are logged here automatically.

Card history

2 snapshots drifted 1× Every change to agent-card.json
Captured Hash
2026-06-19 06:02:07 current 57b2357d1e70… view →
2026-06-18 23:49:00 6a512cc1956d… view →
Uptime
100.0%
2 probes
Response
425ms
last probe
Skills
27
declared
Streaming
SSE-capable

Skills · 27 declared · mapped to canonical taxonomy

task_planning

Break complex tasks into actionable steps.

canonical Task Decomposition match 92%
calculate

Evaluate a safe arithmetic expression. Supports +,-,*,/,**,%,sqrt,abs,round,floor,ceil,log,sin,cos,tan,pi,e.

canonical Quality Evaluation match 85%
matharithmeticcalculation
convert_currency

Convert between fiat currencies (USD, EUR, GBP, etc.) and crypto assets (BTC, ETH, USDC, SOL, etc.). Returns the converted amount and exchange rate.

canonical x402 Crypto Micropayment match 84%
financecurrencycryptoconversion
decode_transaction

Decode a transaction's calldata into a human-readable function name and arguments. Also returns transaction status (1=success, 0=revert), gas used, and block nu…

canonical Bitcoin Transaction Operations match 84%
web3ethereumtransactiondecodecalldata
delegate_to_agent

Delegate a task to a remote A2A-compliant agent. Discovers the agent's capabilities via its agent card, sends it a message, and returns the result. Use when a t…

canonical Role Assignment match 86%
a2adelegationagent
get_datetime

Return the current UTC date and time. Optional strftime format parameter.

canonical Maps and Routing match 85%
datetimeutility
get_block

Get details for an Ethereum or Base block by number, hash, or 'latest'.

canonical Web Scraping and Extraction match 84%
web3ethereumblock
get_dex_quote

Get the best Uniswap v3 swap quote on Ethereum (chain_id=1) or Base (chain_id=8453) via direct on-chain QuoterV2 calls. Queries all four fee tiers (100/500/3000…

canonical Onchain Subgraph Query match 80%
web3defiuniswapdexquote
get_defi_positions

Aggregate DeFi positions for a wallet across Aave v3, Compound v3, and Uniswap v3 LP on Ethereum (chain_id=1) or Base (chain_id=8453). Returns Aave aggregate ac…

canonical Onchain Subgraph Query match 82%
web3defiaavecompounduniswap
get_gas_price

Get current EIP-1559 gas fees on Ethereum or Base. Returns base fee, priority fee, and next-block base fee estimate (useful for timing transactions). gas_used_r…

canonical Bitcoin Fee Estimation match 86%
web3ethereumgasfeeseip1559
get_lending_rates

Get current on-chain lending supply/borrow rates for Aave v3 and Compound v3 on Ethereum or Base. Returns per-asset APY snapshots and Compound utilization where…

canonical Crypto Derivatives Analytics match 83%
web3defilendingaavecompound
get_liquidation_risk

Assess DeFi liquidation risk for up to 50 wallets across Aave v3 and Compound v3 on Ethereum (chain_id=1) or Base (chain_id=8453). Returns per-wallet health fac…

canonical Crypto Derivatives Analytics match 80%
web3ethereumbasedefirisk
get_token_approvals

Audit ERC-20 token allowances for a wallet address. Returns all non-zero approvals across curated DeFi protocol spenders (Uniswap, Aave, Compound, 1inch, 0x, Op…

canonical x402 Crypto Micropayment match 81%
web3ethereumsecurityerc20approvals
get_token_price

Get current price, 24h change, market cap, and volume for one or more crypto tokens. Accepts ticker symbols (BTC, ETH, LQTY), full token names (Bitcoin, Liquity…

canonical Market Signals and Strategy match 81%
financecryptopricemarket
get_protocol_tvl

Get Total Value Locked (TVL) data for a DeFi protocol from DeFiLlama. Returns current TVL in USD, 7-day and 30-day percentage change, and a per-chain breakdown.…

canonical Crypto Derivatives Analytics match 81%
defitvlfinanceprotocoldefillama
get_token_price_historical

Get historical price data for crypto tokens over a specified time window (1–365 days). Returns period statistics (start, end, % change, high, low) plus a downsa…

canonical Crypto Derivatives Analytics match 82%
financecryptopricehistorymarket
get_yield_rates

Get DeFi yield pool rates from DeFiLlama, covering 1,000+ protocols across all chains. Returns pools sorted by APY with TVL, base rate, reward APY, and 7d/30d m…

canonical Crypto Derivatives Analytics match 81%
defiyieldapyfinancedefillama
web_search

Real-time web search via Tavily. Use for current events, fact-checking, and research. Set search_depth='advanced' for complex research queries (higher quality, …

canonical General Web Search match 88%
searchwebrealtime
count_text_stats

Return word count, character count, sentence count, and paragraph statistics for a given text.

canonical Document Summarization match 85%
textanalysisstatistics
http_fetch

Fetch a web page and extract its main text content. Useful for reading articles, documentation, and web resources. Returns cleaned text, not raw HTML.

canonical Web Scraping and Extraction match 90%
webhttpfetchcontent
get_eth_balance

Get the native ETH balance of an Ethereum or Base address. NOTE: get_wallet_portfolio already includes the native ETH balance in its holdings list — only call g…

canonical Bitcoin Fee Estimation match 81%
web3ethereumbalance
get_erc20_balance

Get the ERC-20 token balance of a wallet, including symbol and decimals.

canonical Bitcoin Fee Estimation match 82%
web3ethereumerc20tokenbalance
get_transaction

Get details and receipt for an Ethereum or Base transaction by hash.

canonical Bitcoin Transaction Operations match 85%
web3ethereumtransaction
get_wallet_portfolio

Get aggregated token holdings with USD values for a wallet address. Tracks 15+ major tokens on Ethereum (USDC, USDT, DAI, WETH, WBTC, LINK, UNI, AAVE, ARB, OP, …

canonical Onchain Subgraph Query match 80%
web3ethereumportfoliobalancedefi
read_contract

Call any view/pure function on a smart contract and return the result. Provide the ABI fragment (JSON array) and function name. State-changing functions (payabl…

canonical On-chain Settlement match 82%
web3ethereumcontractabidefi
resolve_ens

Resolve an ENS name (e.g. 'vitalik.eth') to an Ethereum address, or pass an Ethereum address for reverse lookup to its primary ENS name. Also returns the avatar…

canonical On-chain Settlement match 82%
web3ethereumensidentity
a2ui_rendering

Declarative UI component generation (table, form, text, button, etc.).

canonical Documentation Generation match 85%

Health · last 2 probes

When HTTP Live JSON-RPC Latency
2026-06-19 06:02:07 200 425ms
2026-06-18 23:49:00 200 292ms

Cheaper or better alternatives per-skill

↑ 10 higher quality

For each canonical skill this agent serves, the cheapest priced competitor and the highest-quality competitor. Only shown when at least one beats the current agent. Skills where this agent is already best on both axes are hidden.

Similar agents embedding-nearest

Strale live
Commercial capability marketplace for AI agents. 292+ capabilities with transparent per-call pricing. Available via API key (EUR wallet) or
Strale · q 100%
The Stall
Domain-agnostic x402 capability chassis by IntuiTek¹. 210 AI-callable data services for USDC on Base — stock prices, DeFi analytics, token s
IntuiTek¹ · q 75%
Agentscan Agent
AI agent for deep exploration and analysis of ERC-8004 registered AI agents across multiple blockchain networks. Rich search with combinable
q 75%
Voidly
The open observatory of global internet censorship — measured, predicted, and machine-readable. 2.2B+ network measurements across 130 countr
Voidly Research · q 75%
onyx-actions live
The independent trust layer for the agentic web — the signed verdict an agent checks BEFORE it transacts. Onyx verifies merchants, retail pr
Onyx Protocol · q 100%
GanjaMon AI live
The only ERC-8004 agent with roots in the physical world. Autonomous AI agent on Monad combining real-world IoT horticulture (environmental
Grok & Mon · q 100%

Embed your Agenstry badge

Paste any of these into your README, agent card, or marketing page. Each badge auto-updates and links back to this page.

Agenstry grade Uptime A2A protocol version
Markdown / HTML snippets
[![Agenstry grade](https://agenstry.com/badge/api.teardrop.dev.svg)](https://agenstry.com/agents/api.teardrop.dev)
[![Verified Business](https://agenstry.com/badge/api.teardrop.dev/identity.svg)](https://agenstry.com/agents/api.teardrop.dev)
[![Uptime](https://agenstry.com/badge/api.teardrop.dev/uptime.svg)](https://agenstry.com/agents/api.teardrop.dev)
[![A2A version](https://agenstry.com/badge/api.teardrop.dev/protocol.svg)](https://agenstry.com/agents/api.teardrop.dev)

Audit-grade evidence bundle

JSON snapshot for vendor-review files. Add ?sign=true for a JWS-signed envelope verifiable against our JWKS. See the methodology.

audit.json audit.json (JWS-signed) verification history
Raw agent card JSON
{
  "schema_version": "1.0",
  "protocolVersion": "1.0",
  "name": "Teardrop",
  "description": "Intelligence beyond the browser. A task-manager agent with LangGraph, AG-UI streaming, and A2UI rendering.",
  "version": "1.2.0",
  "url": "https://api.teardrop.dev",
  "provider": {
    "organization": "Teardrop AI",
    "url": "https://api.teardrop.dev"
  },
  "documentationUrl": "https://api.teardrop.dev/docs",
  "supportedInterfaces": [
    {
      "url": "https://api.teardrop.dev/agent/run",
      "protocolBinding": "https://teardrop.ai/bindings/ag-ui-sse/v1",
      "protocolVersion": "1.0"
    },
    {
      "url": "https://api.teardrop.dev/message:send",
      "protocolBinding": "https://teardrop.ai/bindings/a2a-jsonrpc/v1",
      "protocolVersion": "1.0"
    }
  ],
  "capabilities": {
    "streaming": true,
    "pushNotifications": false,
    "extendedAgentCard": false,
    "a2ui": true,
    "mcp_tools": true,
    "multi_turn": true,
    "human_in_the_loop": true,
    "billing": {
      "enabled": true,
      "scheme": "exact",
      "network": "eip155:8453",
      "payment_endpoint": "/agent/run",
      "pricing_endpoint": "/billing/pricing"
    },
    "marketplace": {
      "enabled": true,
      "catalog_endpoint": "/marketplace/catalog",
      "mcp_gateway_endpoint": "/tools/mcp"
    }
  },
  "protocols": [
    "ag-ui",
    "a2a",
    "mcp"
  ],
  "endpoints": {
    "agent_run": "/agent/run",
    "a2a_message": "/message:send",
    "health": "/health",
    "docs": "/docs",
    "mcp_tools": "/tools/mcp",
    "marketplace_catalog": "/marketplace/catalog"
  },
  "defaultInputModes": [
    "text/plain",
    "application/json"
  ],
  "defaultOutputModes": [
    "text/plain",
    "application/json"
  ],
  "skills": [
    {
      "id": "task_planning",
      "name": "task_planning",
      "description": "Break complex tasks into actionable steps."
    },
    {
      "id": "calculate",
      "name": "calculate",
      "description": "Evaluate a safe arithmetic expression. Supports +,-,*,/,**,%,sqrt,abs,round,floor,ceil,log,sin,cos,tan,pi,e.",
      "tags": [
        "math",
        "arithmetic",
        "calculation"
      ],
      "version": "1.0.0"
    },
    {
      "id": "convert_currency",
      "name": "convert_currency",
      "description": "Convert between fiat currencies (USD, EUR, GBP, etc.) and crypto assets (BTC, ETH, USDC, SOL, etc.). Returns the converted amount and exchange rate.",
      "tags": [
        "finance",
        "currency",
        "crypto",
        "conversion"
      ],
      "version": "1.0.0"
    },
    {
      "id": "decode_transaction",
      "name": "decode_transaction",
      "description": "Decode a transaction's calldata into a human-readable function name and arguments. Also returns transaction status (1=success, 0=revert), gas used, and block number. Optionally provide an ABI for precise decoding; otherwise uses 4byte.directory. Supports Ethereum mainnet and Base.",
      "tags": [
        "web3",
        "ethereum",
        "transaction",
        "decode",
        "calldata"
      ],
      "version": "1.0.0"
    },
    {
      "id": "delegate_to_agent",
      "name": "delegate_to_agent",
      "description": "Delegate a task to a remote A2A-compliant agent. Discovers the agent's capabilities via its agent card, sends it a message, and returns the result. Use when a task requires specialist capabilities beyond your own tools.",
      "tags": [
        "a2a",
        "delegation",
        "agent"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_datetime",
      "name": "get_datetime",
      "description": "Return the current UTC date and time. Optional strftime format parameter.",
      "tags": [
        "datetime",
        "utility"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_block",
      "name": "get_block",
      "description": "Get details for an Ethereum or Base block by number, hash, or 'latest'.",
      "tags": [
        "web3",
        "ethereum",
        "block"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_dex_quote",
      "name": "get_dex_quote",
      "description": "Get the best Uniswap v3 swap quote on Ethereum (chain_id=1) or Base (chain_id=8453) via direct on-chain QuoterV2 calls. Queries all four fee tiers (100/500/3000/10000 bps) in parallel and returns the tier with the highest output amount, along with per-tier breakdown. Inputs are raw uint256 amounts and EIP-55 checksummed addresses; native ETH is not quoted directly \u2014 pass the WETH address. Returns no_liquidity=true when no pool exists for the pair. Point-in-time quote at the returned block_number; do not cache.",
      "tags": [
        "web3",
        "defi",
        "uniswap",
        "dex",
        "quote",
        "trading"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_defi_positions",
      "name": "get_defi_positions",
      "description": "Aggregate DeFi positions for a wallet across Aave v3, Compound v3, and Uniswap v3 LP on Ethereum (chain_id=1) or Base (chain_id=8453). Returns Aave aggregate account health (collateral, debt, health factor, LTV) with per-reserve breakdown for major assets, Compound v3 Comet market positions (supply, borrow, per-asset collateral, liquidation flag), and Uniswap v3 LP positions by token ID (token pair, fee tier, tick range, liquidity, uncollected fees). Per-protocol failures are isolated \u2014 other protocols still return.",
      "tags": [
        "web3",
        "defi",
        "aave",
        "compound",
        "uniswap",
        "portfolio"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_gas_price",
      "name": "get_gas_price",
      "description": "Get current EIP-1559 gas fees on Ethereum or Base. Returns base fee, priority fee, and next-block base fee estimate (useful for timing transactions). gas_used_ratio indicates network congestion (>0.5 = busy, >0.9 = very congested). Optional USD estimates include ETH spot price and rough transfer/swap costs. Results cached 10 seconds per chain.",
      "tags": [
        "web3",
        "ethereum",
        "gas",
        "fees",
        "eip1559"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_lending_rates",
      "name": "get_lending_rates",
      "description": "Get current on-chain lending supply/borrow rates for Aave v3 and Compound v3 on Ethereum or Base. Returns per-asset APY snapshots and Compound utilization where available. Useful for protocol-specific stablecoin yield comparisons (e.g., USDC on Aave vs Compound).",
      "tags": [
        "web3",
        "defi",
        "lending",
        "aave",
        "compound",
        "yield"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_liquidation_risk",
      "name": "get_liquidation_risk",
      "description": "Assess DeFi liquidation risk for up to 50 wallets across Aave v3 and Compound v3 on Ethereum (chain_id=1) or Base (chain_id=8453). Returns per-wallet health factor and tiered risk classification (liquidatable, critical, warning, caution, healthy, no_debt) plus an overall_tier aggregate across protocols, and a summary count for alert dashboards. Per-protocol failures are isolated \u2014 a Compound RPC error does not blank the Aave result (and vice versa). View-only (eth_call) against hardcoded protocol addresses; duplicate wallet addresses are silently removed.",
      "tags": [
        "web3",
        "ethereum",
        "base",
        "defi",
        "risk",
        "liquidation",
        "aave",
        "compound"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_token_approvals",
      "name": "get_token_approvals",
      "description": "Audit ERC-20 token allowances for a wallet address. Returns all non-zero approvals across curated DeFi protocol spenders (Uniswap, Aave, Compound, 1inch, 0x, OpenSea). Flags unlimited approvals with risk levels: high=unknown spender, medium=trusted protocol, low=bounded amount. Use before swaps to verify approval state, or after security incidents to detect active exploit vectors. Ethereum mainnet and Base only.",
      "tags": [
        "web3",
        "ethereum",
        "security",
        "erc20",
        "approvals",
        "defi"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_token_price",
      "name": "get_token_price",
      "description": "Get current price, 24h change, market cap, and volume for one or more crypto tokens. Accepts ticker symbols (BTC, ETH, LQTY), full token names (Bitcoin, Liquity, Chainlink), or CoinGecko IDs. Unknown symbols are resolved automatically against the full CoinGecko coin list. Supports batch queries up to 50 tokens. Bare 0x contract addresses are not resolvable by CoinGecko and should be treated as unknown. If get_wallet_portfolio already returned price_usd/value_usd for a held token, reuse that value instead of calling get_token_price again.",
      "tags": [
        "finance",
        "crypto",
        "price",
        "market"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_protocol_tvl",
      "name": "get_protocol_tvl",
      "description": "Get Total Value Locked (TVL) data for a DeFi protocol from DeFiLlama. Returns current TVL in USD, 7-day and 30-day percentage change, and a per-chain breakdown. Set include_historical=True to also retrieve a daily TVL series for trend analysis. You can also batch multiple protocols via protocols=[...]. Supports 3,000+ protocols including Aave, Uniswap, Curve, Compound, Lido, MakerDAO, and more. Use the DeFiLlama slug format: 'aave-v3', 'uniswap-v3', 'curve-dex'. Common aliases such as 'spark-protocol' and 'compound' are auto-corrected.",
      "tags": [
        "defi",
        "tvl",
        "finance",
        "protocol",
        "defillama"
      ],
      "version": "1.1.0"
    },
    {
      "id": "get_token_price_historical",
      "name": "get_token_price_historical",
      "description": "Get historical price data for crypto tokens over a specified time window (1\u2013365 days). Returns period statistics (start, end, % change, high, low) plus a downsampled daily price series. Use for period comparisons (month-over-month, YTD), trend analysis, and price charts. Prefer over web_search for any time-comparative financial query. Pass stats_only=true when the daily series is unnecessary. price_change_pct is pre-computed and should not be re-derived with calculate.",
      "tags": [
        "finance",
        "crypto",
        "price",
        "history",
        "market"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_yield_rates",
      "name": "get_yield_rates",
      "description": "Get DeFi yield pool rates from DeFiLlama, covering 1,000+ protocols across all chains. Returns pools sorted by APY with TVL, base rate, reward APY, and 7d/30d mean APY context. Filter by protocol (e.g. 'aave-v3', 'compound-v3'), chain (e.g. 'Ethereum', 'Base'), minimum TVL, and minimum APY. Use this to answer questions like 'Where can I get the best USDC yield?', 'What is Aave's current APY on Ethereum?', or 'Compare Aave vs Compound yields'. Returns up to 50 pools. IMPORTANT: Call ONCE per query. The returned `symbol` field contains the underlying tokens (e.g. 'USDC', 'ETH-USDC', 'WBTC'); filter on the client side by inspecting `symbol` rather than re-calling with different arguments. Use `min_apy`, `min_tvl_usd`, and `symbols_any` to prune noise in a single call. Set stable_only=true when you need consistent stablecoin yield screening; this ranks by 30d mean APY first and still returns spot/base/reward components.",
      "tags": [
        "defi",
        "yield",
        "apy",
        "finance",
        "defillama"
      ],
      "version": "1.0.0"
    },
    {
      "id": "web_search",
      "name": "web_search",
      "description": "Real-time web search via Tavily. Use for current events, fact-checking, and research. Set search_depth='advanced' for complex research queries (higher quality, higher cost). Set topic='news' for recent headlines or 'finance' for market information.",
      "tags": [
        "search",
        "web",
        "realtime"
      ],
      "version": "1.0.0"
    },
    {
      "id": "count_text_stats",
      "name": "count_text_stats",
      "description": "Return word count, character count, sentence count, and paragraph statistics for a given text.",
      "tags": [
        "text",
        "analysis",
        "statistics"
      ],
      "version": "1.0.0"
    },
    {
      "id": "http_fetch",
      "name": "http_fetch",
      "description": "Fetch a web page and extract its main text content. Useful for reading articles, documentation, and web resources. Returns cleaned text, not raw HTML.",
      "tags": [
        "web",
        "http",
        "fetch",
        "content"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_eth_balance",
      "name": "get_eth_balance",
      "description": "Get the native ETH balance of an Ethereum or Base address. NOTE: get_wallet_portfolio already includes the native ETH balance in its holdings list \u2014 only call get_eth_balance when you need a standalone ETH balance without a full portfolio scan.",
      "tags": [
        "web3",
        "ethereum",
        "balance"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_erc20_balance",
      "name": "get_erc20_balance",
      "description": "Get the ERC-20 token balance of a wallet, including symbol and decimals.",
      "tags": [
        "web3",
        "ethereum",
        "erc20",
        "token",
        "balance"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_transaction",
      "name": "get_transaction",
      "description": "Get details and receipt for an Ethereum or Base transaction by hash.",
      "tags": [
        "web3",
        "ethereum",
        "transaction"
      ],
      "version": "1.0.0"
    },
    {
      "id": "get_wallet_portfolio",
      "name": "get_wallet_portfolio",
      "description": "Get aggregated token holdings with USD values for a wallet address. Tracks 15+ major tokens on Ethereum (USDC, USDT, DAI, WETH, WBTC, LINK, UNI, AAVE, ARB, OP, LDO, stETH, CRV, SUSHI, MKR) and 9+ on Base. Sorted by USD value. Returns up to 20 holdings. Includes native ETH balance in the holdings list \u2014 calling get_eth_balance separately after this is redundant.",
      "tags": [
        "web3",
        "ethereum",
        "portfolio",
        "balance",
        "defi"
      ],
      "version": "1.0.0"
    },
    {
      "id": "read_contract",
      "name": "read_contract",
      "description": "Call any view/pure function on a smart contract and return the result. Provide the ABI fragment (JSON array) and function name. State-changing functions (payable/nonpayable) are rejected for safety. Supports historical queries via block_identifier (block number or 'latest').",
      "tags": [
        "web3",
        "ethereum",
        "contract",
        "abi",
        "defi"
      ],
      "version": "1.0.0"
    },
    {
      "id": "resolve_ens",
      "name": "resolve_ens",
      "description": "Resolve an ENS name (e.g. 'vitalik.eth') to an Ethereum address, or pass an Ethereum address for reverse lookup to its primary ENS name. Also returns the avatar text record when available. Mainnet only.",
      "tags": [
        "web3",
        "ethereum",
        "ens",
        "identity"
      ],
      "version": "1.0.0"
    },
    {
      "id": "a2ui_rendering",
      "name": "a2ui_rendering",
      "description": "Declarative UI component generation (table, form, text, button, etc.)."
    }
  ],
  "tools": [
    {
      "name": "calculate",
      "version": "1.0.0",
      "description": "Evaluate a safe arithmetic expression. Supports +,-,*,/,**,%,sqrt,abs,round,floor,ceil,log,sin,cos,tan,pi,e.",
      "tags": [
        "math",
        "arithmetic",
        "calculation"
      ],
      "input_schema": {
        "properties": {
          "expression": {
            "description": "A safe arithmetic expression, e.g. '(3 + 4) * 2 / sqrt(9)'",
            "maxLength": 200,
            "title": "Expression",
            "type": "string"
          }
        },
        "required": [
          "expression"
        ],
        "title": "CalculateInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "expression": {
            "title": "Expression",
            "type": "string"
          },
          "result": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Result"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Error"
          }
        },
        "required": [
          "expression"
        ],
        "title": "CalculateOutput",
        "type": "object"
      }
    },
    {
      "name": "convert_currency",
      "version": "1.0.0",
      "description": "Convert between fiat currencies (USD, EUR, GBP, etc.) and crypto assets (BTC, ETH, USDC, SOL, etc.). Returns the converted amount and exchange rate.",
      "tags": [
        "finance",
        "currency",
        "crypto",
        "conversion"
      ],
      "input_schema": {
        "properties": {
          "amount": {
            "description": "Amount to convert",
            "exclusiveMinimum": 0,
            "title": "Amount",
            "type": "number"
          },
          "from_currency": {
            "description": "Source currency (e.g. 'ETH', 'USD', 'BTC')",
            "maxLength": 20,
            "minLength": 1,
            "title": "From Currency",
            "type": "string"
          },
          "to_currency": {
            "description": "Target currency (e.g. 'USD', 'EUR', 'BTC')",
            "maxLength": 20,
            "minLength": 1,
            "title": "To Currency",
            "type": "string"
          }
        },
        "required": [
          "amount",
          "from_currency",
          "to_currency"
        ],
        "title": "ConvertCurrencyInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "amount": {
            "title": "Amount",
            "type": "number"
          },
          "from_currency": {
            "title": "From Currency",
            "type": "string"
          },
          "to_currency": {
            "title": "To Currency",
            "type": "string"
          },
          "converted_amount": {
            "title": "Converted Amount",
            "type": "number"
          },
          "rate": {
            "title": "Rate",
            "type": "number"
          },
          "source": {
            "title": "Source",
            "type": "string"
          }
        },
        "required": [
          "amount",
          "from_currency",
          "to_currency",
          "converted_amount",
          "rate",
          "source"
        ],
        "title": "ConvertCurrencyOutput",
        "type": "object"
      }
    },
    {
      "name": "decode_transaction",
      "version": "1.0.0",
      "description": "Decode a transaction's calldata into a human-readable function name and arguments. Also returns transaction status (1=success, 0=revert), gas used, and block number. Optionally provide an ABI for precise decoding; otherwise uses 4byte.directory. Supports Ethereum mainnet and Base.",
      "tags": [
        "web3",
        "ethereum",
        "transaction",
        "decode",
        "calldata"
      ],
      "input_schema": {
        "properties": {
          "tx_hash": {
            "description": "Transaction hash (0x\u2026 64 hex chars)",
            "title": "Tx Hash",
            "type": "string"
          },
          "chain_id": {
            "default": 1,
            "description": "Chain ID (1=Ethereum, 8453=Base)",
            "title": "Chain Id",
            "type": "integer"
          },
          "abi_json": {
            "anyOf": [
              {
                "maxLength": 65536,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional ABI JSON array for decoding. If omitted, 4byte.directory is used.",
            "title": "Abi Json"
          }
        },
        "required": [
          "tx_hash"
        ],
        "title": "DecodeTransactionInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "tx_hash": {
            "title": "Tx Hash",
            "type": "string"
          },
          "from_address": {
            "title": "From Address",
            "type": "string"
          },
          "to_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "To Address"
          },
          "value_eth": {
            "title": "Value Eth",
            "type": "string"
          },
          "status": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "1=success, 0=revert, None=pending",
            "title": "Status"
          },
          "gas_used": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gas Used"
          },
          "block_number": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Block Number"
          },
          "function_selector": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Function Selector"
          },
          "function_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Function Name"
          },
          "decoded_args": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Decoded Args"
          },
          "raw_calldata": {
            "title": "Raw Calldata",
            "type": "string"
          },
          "decode_source": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Decode Source"
          },
          "chain_id": {
            "title": "Chain Id",
            "type": "integer"
          },
          "note": {
            "default": "decoded_args values are raw ABI-decoded types; uint256 amounts have not been decimals-formatted \u2014 do not call read_contract or get_erc20_balance to interpret them unless the user explicitly asks. Addresses (from_address, to_address, decoded_args) are plain hex \u2014 do not call resolve_ens to label them unless the user explicitly asks.",
            "title": "Note",
            "type": "string"
          }
        },
        "required": [
          "tx_hash",
          "from_address",
          "to_address",
          "value_eth",
          "gas_used",
          "block_number",
          "function_selector",
          "function_name",
          "decoded_args",
          "raw_calldata",
          "decode_source",
          "chain_id"
        ],
        "title": "DecodeTransactionOutput",
        "type": "object"
      }
    },
    {
      "name": "delegate_to_agent",
      "version": "1.0.0",
      "description": "Delegate a task to a remote A2A-compliant agent. Discovers the agent's capabilities via its agent card, sends it a message, and returns the result. Use when a task requires specialist capabilities beyond your own tools.",
      "tags": [
        "a2a",
        "delegation",
        "agent"
      ],
      "input_schema": {
        "properties": {
          "agent_url": {
            "description": "Base URL of the remote A2A agent (e.g. https://agent.example.com)",
            "maxLength": 2000,
            "minLength": 10,
            "title": "Agent Url",
            "type": "string"
          },
          "task_description": {
            "description": "Natural language description of the task to delegate",
            "maxLength": 4096,
            "minLength": 1,
            "title": "Task Description",
            "type": "string"
          }
        },
        "required": [
          "agent_url",
          "task_description"
        ],
        "title": "DelegateToAgentInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "agent_name": {
            "description": "Name of the remote agent (from its agent card)",
            "title": "Agent Name",
            "type": "string"
          },
          "status": {
            "description": "A2A task state: completed, failed, etc.",
            "title": "Status",
            "type": "string"
          },
          "result": {
            "description": "Text result extracted from the remote agent's response",
            "title": "Result",
            "type": "string"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Error message, if any",
            "title": "Error"
          },
          "cost_usdc": {
            "default": 0,
            "description": "Cost of this delegation in atomic USDC",
            "title": "Cost Usdc",
            "type": "integer"
          }
        },
        "required": [
          "agent_name",
          "status",
          "result"
        ],
        "title": "DelegateToAgentOutput",
        "type": "object"
      }
    },
    {
      "name": "get_datetime",
      "version": "1.0.0",
      "description": "Return the current UTC date and time. Optional strftime format parameter.",
      "tags": [
        "datetime",
        "utility"
      ],
      "input_schema": {
        "properties": {
          "format": {
            "default": "%Y-%m-%d %H:%M:%S UTC",
            "description": "strftime format string for the output",
            "maxLength": 100,
            "title": "Format",
            "type": "string"
          }
        },
        "title": "GetDatetimeInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "datetime": {
            "title": "Datetime",
            "type": "string"
          },
          "iso8601": {
            "title": "Iso8601",
            "type": "string"
          }
        },
        "required": [
          "datetime",
          "iso8601"
        ],
        "title": "GetDatetimeOutput",
        "type": "object"
      }
    },
    {
      "name": "get_block",
      "version": "1.0.0",
      "description": "Get details for an Ethereum or Base block by number, hash, or 'latest'.",
      "tags": [
        "web3",
        "ethereum",
        "block"
      ],
      "input_schema": {
        "properties": {
          "block_identifier": {
            "default": "latest",
            "description": "Block number, block hash, or 'latest'/'earliest'/'pending'",
            "title": "Block Identifier",
            "type": "string"
          },
          "chain_id": {
            "default": 1,
            "description": "Chain ID (1=Ethereum, 8453=Base)",
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "title": "GetBlockInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "number": {
            "title": "Number",
            "type": "integer"
          },
          "hash": {
            "title": "Hash",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          },
          "transaction_count": {
            "title": "Transaction Count",
            "type": "integer"
          },
          "gas_used": {
            "title": "Gas Used",
            "type": "integer"
          },
          "base_fee_gwei": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Base Fee Gwei"
          }
        },
        "required": [
          "number",
          "hash",
          "timestamp",
          "transaction_count",
          "gas_used",
          "base_fee_gwei"
        ],
        "title": "GetBlockOutput",
        "type": "object"
      }
    },
    {
      "name": "get_dex_quote",
      "version": "1.0.0",
      "description": "Get the best Uniswap v3 swap quote on Ethereum (chain_id=1) or Base (chain_id=8453) via direct on-chain QuoterV2 calls. Queries all four fee tiers (100/500/3000/10000 bps) in parallel and returns the tier with the highest output amount, along with per-tier breakdown. Inputs are raw uint256 amounts and EIP-55 checksummed addresses; native ETH is not quoted directly \u2014 pass the WETH address. Returns no_liquidity=true when no pool exists for the pair. Point-in-time quote at the returned block_number; do not cache.",
      "tags": [
        "web3",
        "defi",
        "uniswap",
        "dex",
        "quote",
        "trading"
      ],
      "input_schema": {
        "properties": {
          "token_in": {
            "description": "EIP-55 checksummed address of the token being sold. For native ETH, pass the WETH address (Ethereum: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; Base: 0x4200000000000000000000000000000000000006).",
            "title": "Token In",
            "type": "string"
          },
          "token_out": {
            "description": "EIP-55 checksummed address of the token being bought.",
            "title": "Token Out",
            "type": "string"
          },
          "amount_in": {
            "description": "Input amount in RAW uint256 units (e.g. '1000000' for 1 USDC, '1000000000000000000' for 1 WETH). Must be > 0 and < 2^128. Common token decimals: WETH/ETH/DAI/wstETH/cbETH/weETH 18, WBTC/cbBTC 8, USDC/USDT 6. Do not call read_contract to look up decimals \u2014 use these values directly.",
            "title": "Amount In",
            "type": "string"
          },
          "chain_id": {
            "default": 1,
            "description": "1 = Ethereum mainnet, 8453 = Base mainnet. Other chains unsupported.",
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "required": [
          "token_in",
          "token_out",
          "amount_in"
        ],
        "title": "GetDexQuoteInput",
        "type": "object"
      },
      "output_schema": {
        "$defs": {
          "TierQuote": {
            "properties": {
              "fee_tier": {
                "title": "Fee Tier",
                "type": "integer"
              },
              "success": {
                "title": "Success",
                "type": "boolean"
              },
              "amount_out": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Amount Out"
              },
              "sqrt_price_x96_after": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Sqrt Price X96 After"
              },
              "gas_estimate": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Gas Estimate"
              },
              "error": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Error"
              }
            },
            "required": [
              "fee_tier",
              "success"
            ],
            "title": "TierQuote",
            "type": "object"
          }
        },
        "properties": {
          "chain_id": {
            "title": "Chain Id",
            "type": "integer"
          },
          "token_in": {
            "title": "Token In",
            "type": "string"
          },
          "token_out": {
            "title": "Token Out",
            "type": "string"
          },
          "amount_in": {
            "title": "Amount In",
            "type": "string"
          },
          "amount_in_decimals": {
            "title": "Amount In Decimals",
            "type": "integer"
          },
          "amount_out": {
            "title": "Amount Out",
            "type": "string"
          },
          "amount_out_decimals": {
            "title": "Amount Out Decimals",
            "type": "integer"
          },
          "amount_out_human": {
            "title": "Amount Out Human",
            "type": "string"
          },
          "effective_rate": {
            "title": "Effective Rate",
            "type": "string"
          },
          "fee_tier_used": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Fee Tier Used"
          },
          "quotes_per_tier": {
            "items": {
              "$ref": "#/$defs/TierQuote"
            },
            "title": "Quotes Per Tier",
            "type": "array"
          },
          "no_liquidity": {
            "title": "No Liquidity",
            "type": "boolean"
          },
          "block_number": {
            "title": "Block Number",
            "type": "integer"
          }
        },
        "required": [
          "chain_id",
          "token_in",
          "token_out",
          "amount_in",
          "amount_in_decimals",
          "amount_out",
          "amount_out_decimals",
          "amount_out_human",
          "effective_rate",
          "fee_tier_used",
          "quotes_per_tier",
          "no_liquidity",
          "block_number"
        ],
        "title": "GetDexQuoteOutput",
        "type": "object"
      }
    },
    {
      "name": "get_defi_positions",
      "version": "1.0.0",
      "description": "Aggregate DeFi positions for a wallet across Aave v3, Compound v3, and Uniswap v3 LP on Ethereum (chain_id=1) or Base (chain_id=8453). Returns Aave aggregate account health (collateral, debt, health factor, LTV) with per-reserve breakdown for major assets, Compound v3 Comet market positions (supply, borrow, per-asset collateral, liquidation flag), and Uniswap v3 LP positions by token ID (token pair, fee tier, tick range, liquidity, uncollected fees). Per-protocol failures are isolated \u2014 other protocols still return.",
      "tags": [
        "web3",
        "defi",
        "aave",
        "compound",
        "uniswap",
        "portfolio"
      ],
      "input_schema": {
        "properties": {
          "wallet_address": {
            "description": "Wallet address (0x\u2026)",
            "title": "Wallet Address",
            "type": "string"
          },
          "chain_id": {
            "default": 1,
            "description": "Chain ID (1=Ethereum, 8453=Base)",
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "required": [
          "wallet_address"
        ],
        "title": "GetDefiPositionsInput",
        "type": "object"
      },
      "output_schema": {
        "$defs": {
          "AavePosition": {
            "properties": {
              "total_collateral_usd": {
                "title": "Total Collateral Usd",
                "type": "number"
              },
              "total_debt_usd": {
                "title": "Total Debt Usd",
                "type": "number"
              },
              "available_borrows_usd": {
                "title": "Available Borrows Usd",
                "type": "number"
              },
              "ltv_bps": {
                "title": "Ltv Bps",
                "type": "integer"
              },
              "liquidation_threshold_bps": {
                "title": "Liquidation Threshold Bps",
                "type": "integer"
              },
              "health_factor": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Health Factor"
              },
              "health_factor_status": {
                "title": "Health Factor Status",
                "type": "string"
              },
              "reserves": {
                "items": {
                  "$ref": "#/$defs/AaveReservePosition"
                },
                "title": "Reserves",
                "type": "array"
              }
            },
            "required": [
              "total_collateral_usd",
              "total_debt_usd",
              "available_borrows_usd",
              "ltv_bps",
              "liquidation_threshold_bps",
              "health_factor",
              "health_factor_status",
              "reserves"
            ],
            "title": "AavePosition",
            "type": "object"
          },
          "AaveReservePosition": {
            "properties": {
              "symbol": {
                "title": "Symbol",
                "type": "string"
              },
              "asset_address": {
                "title": "Asset Address",
                "type": "string"
              },
              "supplied_amount": {
                "title": "Supplied Amount",
                "type": "string"
              },
              "variable_debt_amount": {
                "title": "Variable Debt Amount",
                "type": "string"
              },
              "stable_debt_amount": {
                "title": "Stable Debt Amount",
                "type": "string"
              },
              "usage_as_collateral": {
                "title": "Usage As Collateral",
                "type": "boolean"
              }
            },
            "required": [
              "symbol",
              "asset_address",
              "supplied_amount",
              "variable_debt_amount",
              "stable_debt_amount",
              "usage_as_collateral"
            ],
            "title": "AaveReservePosition",
            "type": "object"
          },
          "CompoundCollateral": {
            "properties": {
              "asset_address": {
                "title": "Asset Address",
                "type": "string"
              },
              "amount": {
                "title": "Amount",
                "type": "string"
              },
              "borrow_collateral_factor": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Borrow Collateral Factor"
              },
              "liquidate_collateral_factor": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Liquidate Collateral Factor"
              }
            },
            "required": [
              "asset_address",
              "amount"
            ],
            "title": "CompoundCollateral",
            "type": "object"
          },
          "CompoundMarketPosition": {
            "properties": {
              "market_name": {
                "title": "Market Name",
                "type": "string"
              },
              "market_address": {
                "title": "Market Address",
                "type": "string"
              },
              "base_asset_symbol": {
                "title": "Base Asset Symbol",
                "type": "string"
              },
              "base_asset_address": {
                "title": "Base Asset Address",
                "type": "string"
              },
              "supplied_amount": {
                "title": "Supplied Amount",
                "type": "string"
              },
              "borrowed_amount": {
                "title": "Borrowed Amount",
                "type": "string"
              },
              "collateral": {
                "items": {
                  "$ref": "#/$defs/CompoundCollateral"
                },
                "title": "Collateral",
                "type": "array"
              },
              "is_liquidatable": {
                "title": "Is Liquidatable",
                "type": "boolean"
              }
            },
            "required": [
              "market_name",
              "market_address",
              "base_asset_symbol",
              "base_asset_address",
              "supplied_amount",
              "borrowed_amount",
              "collateral",
              "is_liquidatable"
            ],
            "title": "CompoundMarketPosition",
            "type": "object"
          },
          "ProtocolErrorInfo": {
            "properties": {
              "protocol": {
                "title": "Protocol",
                "type": "string"
              },
              "error": {
                "title": "Error",
                "type": "string"
              }
            },
            "required": [
              "protocol",
              "error"
            ],
            "title": "ProtocolErrorInfo",
            "type": "object"
          },
          "UniswapV3Position": {
            "properties": {
              "token_id": {
                "title": "Token Id",
                "type": "string"
              },
              "token0_address": {
                "title": "Token0 Address",
                "type": "string"
              },
              "token0_symbol": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Token0 Symbol"
              },
              "token1_address": {
                "title": "Token1 Address",
                "type": "string"
              },
              "token1_symbol": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Token1 Symbol"
              },
              "fee_tier_raw": {
                "title": "Fee Tier Raw",
                "type": "integer"
              },
              "tick_lower": {
                "title": "Tick Lower",
                "type": "integer"
              },
              "tick_upper": {
                "title": "Tick Upper",
                "type": "integer"
              },
              "liquidity": {
                "title": "Liquidity",
                "type": "string"
              },
              "tokens_owed_0": {
                "title": "Tokens Owed 0",
                "type": "string"
              },
              "tokens_owed_1": {
                "title": "Tokens Owed 1",
                "type": "string"
              },
              "status": {
                "title": "Status",
                "type": "string"
              }
            },
            "required": [
              "token_id",
              "token0_address",
              "token1_address",
              "fee_tier_raw",
              "tick_lower",
              "tick_upper",
              "liquidity",
              "tokens_owed_0",
              "tokens_owed_1",
              "status"
            ],
            "title": "UniswapV3Position",
            "type": "object"
          }
        },
        "properties": {
          "wallet_address": {
            "title": "Wallet Address",
            "type": "string"
          },
          "chain_id": {
            "title": "Chain Id",
            "type": "integer"
          },
          "data_block_number": {
            "title": "Data Block Number",
            "type": "integer"
          },
          "aave_v3": {
            "anyOf": [
              {
                "$ref": "#/$defs/AavePosition"
              },
              {
                "type": "null"
              }
            ],
            "default": null
          },
          "compound_v3": {
            "items": {
              "$ref": "#/$defs/CompoundMarketPosition"
            },
            "title": "Compound V3",
            "type": "array"
          },
          "uniswap_v3": {
            "items": {
              "$ref": "#/$defs/UniswapV3Position"
            },
            "title": "Uniswap V3",
            "type": "array"
          },
          "errors": {
            "items": {
              "$ref": "#/$defs/ProtocolErrorInfo"
            },
            "title": "Errors",
            "type": "array"
          },
          "note": {
            "default": "On-chain position snapshot at data_block_number. Aave USD values are from the Aave oracle (base currency = USD, 8 decimals on Ethereum/Base). Compound collateral and Uniswap v3 amounts are raw integer units \u2014 divide by 10**decimals to format. Compound collateral factors are decimals (e.g., 0.90 = 90%) when available from Comet getAssetInfo. Token symbols are resolved for well-known tokens; None means unrecognised \u2014 do NOT call read_contract, web_search, or any external lookup to identify these tokens. Report them as 'unrecognized token (0x\u2026)' in the final answer and move on. Uniswap v3 liquidity is returned raw (no underlying token valuation in v1); tokensOwed0/1 are uncollected fees only. If a protocol is missing (e.g., aave_v3 is null) and appears in errors, its risk could not be verified from this snapshot and must not be treated as no debt. Does not include staking rewards, COMP accruals, or unlisted protocols.",
            "title": "Note",
            "type": "string"
          }
        },
        "required": [
          "wallet_address",
          "chain_id",
          "data_block_number"
        ],
        "title": "GetDefiPositionsOutput",
        "type": "object"
      }
    },
    {
      "name": "get_gas_price",
      "version": "1.0.0",
      "description": "Get current EIP-1559 gas fees on Ethereum or Base. Returns base fee, priority fee, and next-block base fee estimate (useful for timing transactions). gas_used_ratio indicates network congestion (>0.5 = busy, >0.9 = very congested). Optional USD estimates include ETH spot price and rough transfer/swap costs. Results cached 10 seconds per chain.",
      "tags": [
        "web3",
        "ethereum",
        "gas",
        "fees",
        "eip1559"
      ],
      "input_schema": {
        "properties": {
          "chain_id": {
            "default": 1,
            "description": "Chain ID (1=Ethereum, 8453=Base)",
            "title": "Chain Id",
            "type": "integer"
          },
          "include_usd_estimate": {
            "default": false,
            "description": "If true, include ETH spot price and rough USD cost estimates for a simple transfer (21k gas) and a swap-like transaction (150k gas).",
            "title": "Include Usd Estimate",
            "type": "boolean"
          }
        },
        "title": "GetGasPriceInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "chain_id": {
            "title": "Chain Id",
            "type": "integer"
          },
          "gas_price_gwei": {
            "title": "Gas Price Gwei",
            "type": "string"
          },
          "base_fee_gwei": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Base Fee Gwei"
          },
          "priority_fee_gwei": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Priority Fee Gwei"
          },
          "next_base_fee_gwei": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Base Fee Gwei"
          },
          "gas_used_ratio": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gas Used Ratio"
          },
          "eth_price_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Eth Price Usd"
          },
          "estimated_transfer_cost_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Estimated Transfer Cost Usd"
          },
          "estimated_swap_cost_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Estimated Swap Cost Usd"
          }
        },
        "required": [
          "chain_id",
          "gas_price_gwei",
          "base_fee_gwei",
          "priority_fee_gwei",
          "next_base_fee_gwei",
          "gas_used_ratio"
        ],
        "title": "GetGasPriceOutput",
        "type": "object"
      }
    },
    {
      "name": "get_lending_rates",
      "version": "1.0.0",
      "description": "Get current on-chain lending supply/borrow rates for Aave v3 and Compound v3 on Ethereum or Base. Returns per-asset APY snapshots and Compound utilization where available. Useful for protocol-specific stablecoin yield comparisons (e.g., USDC on Aave vs Compound).",
      "tags": [
        "web3",
        "defi",
        "lending",
        "aave",
        "compound",
        "yield"
      ],
      "input_schema": {
        "properties": {
          "protocol": {
            "default": "all",
            "description": "Protocol to query: 'aave-v3', 'compound-v3', or 'all'.",
            "enum": [
              "all",
              "aave-v3",
              "compound-v3"
            ],
            "title": "Protocol",
            "type": "string"
          },
          "chain_id": {
            "default": 1,
            "description": "Chain ID (1=Ethereum, 8453=Base).",
            "title": "Chain Id",
            "type": "integer"
          },
          "assets": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional asset-symbol filter (e.g., ['USDC','DAI']). Case-insensitive. Max 20 symbols.",
            "title": "Assets"
          }
        },
        "title": "GetLendingRatesInput",
        "type": "object"
      },
      "output_schema": {
        "$defs": {
          "LendingRateEntry": {
            "properties": {
              "protocol": {
                "enum": [
                  "aave-v3",
                  "compound-v3"
                ],
                "title": "Protocol",
                "type": "string"
              },
              "chain_id": {
                "title": "Chain Id",
                "type": "integer"
              },
              "market_name": {
                "title": "Market Name",
                "type": "string"
              },
              "asset_symbol": {
                "title": "Asset Symbol",
                "type": "string"
              },
              "supply_apy_pct": {
                "title": "Supply Apy Pct",
                "type": "number"
              },
              "borrow_apy_pct": {
                "title": "Borrow Apy Pct",
                "type": "number"
              },
              "utilization_pct": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Utilization Pct"
              },
              "source": {
                "const": "on-chain",
                "default": "on-chain",
                "title": "Source",
                "type": "string"
              }
            },
            "required": [
              "protocol",
              "chain_id",
              "market_name",
              "asset_symbol",
              "supply_apy_pct",
              "borrow_apy_pct"
            ],
            "title": "LendingRateEntry",
            "type": "object"
          }
        },
        "properties": {
          "protocol": {
            "title": "Protocol",
            "type": "string"
          },
          "chain_id": {
            "title": "Chain Id",
            "type": "integer"
          },
          "data_block_number": {
            "title": "Data Block Number",
            "type": "integer"
          },
          "rates": {
            "items": {
              "$ref": "#/$defs/LendingRateEntry"
            },
            "title": "Rates",
            "type": "array"
          },
          "errors": {
            "items": {
              "type": "string"
            },
            "title": "Errors",
            "type": "array"
          },
          "note": {
            "default": "On-chain lending market snapshot at data_block_number. Aave rates are derived from ProtocolDataProvider.getReserveData (ray-scaled). Compound rates are derived from Comet getUtilization/getSupplyRate/getBorrowRate (per-second 1e18-scaled), annualized to APY.",
            "title": "Note",
            "type": "string"
          }
        },
        "required": [
          "protocol",
          "chain_id",
          "data_block_number",
          "rates"
        ],
        "title": "GetLendingRatesOutput",
        "type": "object"
      }
    },
    {
      "name": "get_liquidation_risk",
      "version": "1.0.0",
      "description": "Assess DeFi liquidation risk for up to 50 wallets across Aave v3 and Compound v3 on Ethereum (chain_id=1) or Base (chain_id=8453). Returns per-wallet health factor and tiered risk classification (liquidatable, critical, warning, caution, healthy, no_debt) plus an overall_tier aggregate across protocols, and a summary count for alert dashboards. Per-protocol failures are isolated \u2014 a Compound RPC error does not blank the Aave result (and vice versa). View-only (eth_call) against hardcoded protocol addresses; duplicate wallet addresses are silently removed.",
      "tags": [
        "web3",
        "ethereum",
        "base",
        "defi",
        "risk",
        "liquidation",
        "aave",
        "compound"
      ],
      "input_schema": {
        "properties": {
          "wallet_addresses": {
            "description": "Wallet addresses to assess (max 50; duplicates are silently removed).",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "title": "Wallet Addresses",
            "type": "array"
          },
          "chain_id": {
            "default": 1,
            "description": "Chain ID (1=Ethereum, 8453=Base)",
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "required": [
          "wallet_addresses"
        ],
        "title": "GetLiquidationRiskInput",
        "type": "object"
      },
      "output_schema": {
        "$defs": {
          "AaveRisk": {
            "properties": {
              "health_factor": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Health Factor"
              },
              "risk_tier": {
                "title": "Risk Tier",
                "type": "string"
              },
              "total_collateral_usd": {
                "title": "Total Collateral Usd",
                "type": "number"
              },
              "total_debt_usd": {
                "title": "Total Debt Usd",
                "type": "number"
              },
              "liquidation_threshold_bps": {
                "title": "Liquidation Threshold Bps",
                "type": "integer"
              },
              "ltv_bps": {
                "title": "Ltv Bps",
                "type": "integer"
              }
            },
            "required": [
              "health_factor",
              "risk_tier",
              "total_collateral_usd",
              "total_debt_usd",
              "liquidation_threshold_bps",
              "ltv_bps"
            ],
            "title": "AaveRisk",
            "type": "object"
          },
          "CompoundRisk": {
            "properties": {
              "market_name": {
                "title": "Market Name",
                "type": "string"
              },
              "market_address": {
                "title": "Market Address",
                "type": "string"
              },
              "base_asset_symbol": {
                "title": "Base Asset Symbol",
                "type": "string"
              },
              "is_liquidatable": {
                "title": "Is Liquidatable",
                "type": "boolean"
              },
              "borrow_balance_raw": {
                "title": "Borrow Balance Raw",
                "type": "string"
              },
              "risk_tier": {
                "title": "Risk Tier",
                "type": "string"
              }
            },
            "required": [
              "market_name",
              "market_address",
              "base_asset_symbol",
              "is_liquidatable",
              "borrow_balance_raw",
              "risk_tier"
            ],
            "title": "CompoundRisk",
            "type": "object"
          },
          "ProtocolErrorInfo": {
            "properties": {
              "protocol": {
                "title": "Protocol",
                "type": "string"
              },
              "error": {
                "title": "Error",
                "type": "string"
              }
            },
            "required": [
              "protocol",
              "error"
            ],
            "title": "ProtocolErrorInfo",
            "type": "object"
          },
          "RiskSummary": {
            "properties": {
              "total_wallets": {
                "title": "Total Wallets",
                "type": "integer"
              },
              "liquidatable_count": {
                "title": "Liquidatable Count",
                "type": "integer"
              },
              "critical_count": {
                "title": "Critical Count",
                "type": "integer"
              },
              "warning_count": {
                "title": "Warning Count",
                "type": "integer"
              },
              "caution_count": {
                "title": "Caution Count",
                "type": "integer"
              },
              "healthy_count": {
                "title": "Healthy Count",
                "type": "integer"
              },
              "no_debt_count": {
                "title": "No Debt Count",
                "type": "integer"
              }
            },
            "required": [
              "total_wallets",
              "liquidatable_count",
              "critical_count",
              "warning_count",
              "caution_count",
              "healthy_count",
              "no_debt_count"
            ],
            "title": "RiskSummary",
            "type": "object"
          },
          "WalletRiskResult": {
            "properties": {
              "wallet_address": {
                "title": "Wallet Address",
                "type": "string"
              },
              "chain_id": {
                "title": "Chain Id",
                "type": "integer"
              },
              "aave": {
                "anyOf": [
                  {
                    "$ref": "#/$defs/AaveRisk"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null
              },
              "compound": {
                "items": {
                  "$ref": "#/$defs/CompoundRisk"
                },
                "title": "Compound",
                "type": "array"
              },
              "overall_tier": {
                "title": "Overall Tier",
                "type": "string"
              },
              "errors": {
                "items": {
                  "$ref": "#/$defs/ProtocolErrorInfo"
                },
                "title": "Errors",
                "type": "array"
              }
            },
            "required": [
              "wallet_address",
              "chain_id",
              "overall_tier"
            ],
            "title": "WalletRiskResult",
            "type": "object"
          }
        },
        "properties": {
          "chain_id": {
            "title": "Chain Id",
            "type": "integer"
          },
          "data_block_number": {
            "title": "Data Block Number",
            "type": "integer"
          },
          "results": {
            "items": {
              "$ref": "#/$defs/WalletRiskResult"
            },
            "title": "Results",
            "type": "array"
          },
          "summary": {
            "$ref": "#/$defs/RiskSummary"
          },
          "note": {
            "default": "On-chain liquidation-risk snapshot at data_block_number. Aave risk_tier is derived from the numeric health factor: liquidatable (<1.0), critical (<1.05), warning (<1.15), caution (<1.5), healthy (\u22651.5). Compound v3 exposes only a boolean isLiquidatable \u2014 a numeric health factor is not available from this tool; do not attempt to compute, estimate, or infer it via additional tool calls. Do not infer a Compound liquidation or breach price from this output. overall_tier is the worst tier across protocols for each wallet. Aave USD values are base-currency 8-decimal from the Aave oracle. Duplicate wallet addresses in the request are deduplicated silently.",
            "title": "Note",
            "type": "string"
          }
        },
        "required": [
          "chain_id",
          "data_block_number",
          "results",
          "summary"
        ],
        "title": "GetLiquidationRiskOutput",
        "type": "object"
      }
    },
    {
      "name": "get_token_approvals",
      "version": "1.0.0",
      "description": "Audit ERC-20 token allowances for a wallet address. Returns all non-zero approvals across curated DeFi protocol spenders (Uniswap, Aave, Compound, 1inch, 0x, OpenSea). Flags unlimited approvals with risk levels: high=unknown spender, medium=trusted protocol, low=bounded amount. Use before swaps to verify approval state, or after security incidents to detect active exploit vectors. Ethereum mainnet and Base only.",
      "tags": [
        "web3",
        "ethereum",
        "security",
        "erc20",
        "approvals",
        "defi"
      ],
      "input_schema": {
        "properties": {
          "wallet_address": {
            "description": "Wallet address (0x\u2026)",
            "title": "Wallet Address",
            "type": "string"
          },
          "chain_id": {
            "default": 1,
            "description": "Chain ID (1=Ethereum, 8453=Base)",
            "title": "Chain Id",
            "type": "integer"
          },
          "tokens": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Token contract addresses to check (max 50). Defaults to the platform tracked token list.",
            "title": "Tokens"
          },
          "spenders": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Spender contract addresses to check (max 20). Defaults to the curated DeFi protocol list.",
            "title": "Spenders"
          }
        },
        "required": [
          "wallet_address"
        ],
        "title": "GetTokenApprovalsInput",
        "type": "object"
      },
      "output_schema": {
        "$defs": {
          "ApprovalEntry": {
            "properties": {
              "token_symbol": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Token Symbol"
              },
              "token_address": {
                "title": "Token Address",
                "type": "string"
              },
              "spender_name": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Spender Name"
              },
              "spender_address": {
                "title": "Spender Address",
                "type": "string"
              },
              "allowance_raw": {
                "title": "Allowance Raw",
                "type": "string"
              },
              "allowance_formatted": {
                "title": "Allowance Formatted",
                "type": "string"
              },
              "is_unlimited": {
                "title": "Is Unlimited",
                "type": "boolean"
              },
              "is_permit2": {
                "title": "Is Permit2",
                "type": "boolean"
              },
              "risk_level": {
                "enum": [
                  "low",
                  "medium",
                  "high"
                ],
                "title": "Risk Level",
                "type": "string"
              }
            },
            "required": [
              "token_symbol",
              "token_address",
              "spender_name",
              "spender_address",
              "allowance_raw",
              "allowance_formatted",
              "is_unlimited",
              "is_permit2",
              "risk_level"
            ],
            "title": "ApprovalEntry",
            "type": "object"
          },
          "RiskSummary": {
            "properties": {
              "total_approvals": {
                "title": "Total Approvals",
                "type": "integer"
              },
              "unlimited_approvals": {
                "title": "Unlimited Approvals",
                "type": "integer"
              },
              "high_risk_approvals": {
                "title": "High Risk Approvals",
                "type": "integer"
              },
              "unknown_spenders": {
                "title": "Unknown Spenders",
                "type": "integer"
              }
            },
            "required": [
              "total_approvals",
              "unlimited_approvals",
              "high_risk_approvals",
              "unknown_spenders"
            ],
            "title": "RiskSummary",
            "type": "object"
          }
        },
        "properties": {
          "wallet_address": {
            "title": "Wallet Address",
            "type": "string"
          },
          "chain_id": {
            "title": "Chain Id",
            "type": "integer"
          },
          "approvals": {
            "items": {
              "$ref": "#/$defs/ApprovalEntry"
            },
            "title": "Approvals",
            "type": "array"
          },
          "risk_summary": {
            "$ref": "#/$defs/RiskSummary"
          },
          "note": {
            "title": "Note",
            "type": "string"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Error"
          }
        },
        "required": [
          "wallet_address",
          "chain_id",
          "approvals",
          "risk_summary",
          "note"
        ],
        "title": "GetTokenApprovalsOutput",
        "type": "object"
      }
    },
    {
      "name": "get_token_price",
      "version": "1.0.0",
      "description": "Get current price, 24h change, market cap, and volume for one or more crypto tokens. Accepts ticker symbols (BTC, ETH, LQTY), full token names (Bitcoin, Liquity, Chainlink), or CoinGecko IDs. Unknown symbols are resolved automatically against the full CoinGecko coin list. Supports batch queries up to 50 tokens. Bare 0x contract addresses are not resolvable by CoinGecko and should be treated as unknown. If get_wallet_portfolio already returned price_usd/value_usd for a held token, reuse that value instead of calling get_token_price again.",
      "tags": [
        "finance",
        "crypto",
        "price",
        "market"
      ],
      "input_schema": {
        "properties": {
          "tokens": {
            "description": "Token symbols or CoinGecko IDs (e.g. ['BTC', 'ETH', 'SOL'])",
            "items": {
              "type": "string"
            },
            "maxItems": 50,
            "minItems": 1,
            "title": "Tokens",
            "type": "array"
          },
          "vs_currency": {
            "default": "usd",
            "description": "Quote currency (usd, eur, gbp, btc, eth)",
            "title": "Vs Currency",
            "type": "string"
          }
        },
        "required": [
          "tokens"
        ],
        "title": "GetTokenPriceInput",
        "type": "object"
      },
      "output_schema": {
        "$defs": {
          "TokenPriceEntry": {
            "properties": {
              "id": {
                "title": "Id",
                "type": "string"
              },
              "symbol": {
                "title": "Symbol",
                "type": "string"
              },
              "price": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Price"
              },
              "market_cap": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Market Cap"
              },
              "volume_24h": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Volume 24H"
              },
              "change_24h_pct": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Change 24H Pct"
              }
            },
            "required": [
              "id",
              "symbol",
              "price",
              "market_cap",
              "volume_24h",
              "change_24h_pct"
            ],
            "title": "TokenPriceEntry",
            "type": "object"
          }
        },
        "properties": {
          "vs_currency": {
            "title": "Vs Currency",
            "type": "string"
          },
          "prices": {
            "items": {
              "$ref": "#/$defs/TokenPriceEntry"
            },
            "title": "Prices",
            "type": "array"
          }
        },
        "required": [
          "vs_currency",
          "prices"
        ],
        "title": "GetTokenPriceOutput",
        "type": "object"
      }
    },
    {
      "name": "get_protocol_tvl",
      "version": "1.1.0",
      "description": "Get Total Value Locked (TVL) data for a DeFi protocol from DeFiLlama. Returns current TVL in USD, 7-day and 30-day percentage change, and a per-chain breakdown. Set include_historical=True to also retrieve a daily TVL series for trend analysis. You can also batch multiple protocols via protocols=[...]. Supports 3,000+ protocols including Aave, Uniswap, Curve, Compound, Lido, MakerDAO, and more. Use the DeFiLlama slug format: 'aave-v3', 'uniswap-v3', 'curve-dex'. Common aliases such as 'spark-protocol' and 'compound' are auto-corrected.",
      "tags": [
        "defi",
        "tvl",
        "finance",
        "protocol",
        "defillama"
      ],
      "input_schema": {
        "properties": {
          "protocol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "DeFiLlama protocol slug (e.g. 'aave-v3', 'uniswap-v3', 'curve-dex'). Use lowercase with hyphens as shown on DeFiLlama. Tip: 'aave' works for the combined Aave TVL; 'aave-v3' for V3 only. Optional when using batch mode via protocols=[...].",
            "title": "Protocol"
          },
          "protocols": {
            "description": "Optional batch mode: list of DeFiLlama protocol slugs. When provided, the tool returns one TVL result object per protocol.",
            "items": {
              "type": "string"
            },
            "title": "Protocols",
            "type": "array"
          },
          "include_historical": {
            "default": false,
            "description": "If true, return a daily historical TVL series for the requested window.",
            "title": "Include Historical",
            "type": "boolean"
          },
          "days": {
            "default": 30,
            "description": "Lookback window in days for the historical series (only used when include_historical=True).",
            "maximum": 365,
            "minimum": 1,
            "title": "Days",
            "type": "integer"
          }
        },
        "title": "GetProtocolTvlInput",
        "type": "object"
      },
      "output_schema": {
        "anyOf": [
          {
            "$defs": {
              "ChainTvlEntry": {
                "properties": {
                  "chain": {
                    "title": "Chain",
                    "type": "string"
                  },
                  "tvl_usd": {
                    "title": "Tvl Usd",
                    "type": "number"
                  }
                },
                "required": [
                  "chain",
                  "tvl_usd"
                ],
                "title": "ChainTvlEntry",
                "type": "object"
              },
              "DailyTvlPoint": {
                "properties": {
                  "date": {
                    "title": "Date",
                    "type": "string"
                  },
                  "tvl_usd": {
                    "title": "Tvl Usd",
                    "type": "number"
                  }
                },
                "required": [
                  "date",
                  "tvl_usd"
                ],
                "title": "DailyTvlPoint",
                "type": "object"
              }
            },
            "properties": {
              "protocol": {
                "title": "Protocol",
                "type": "string"
              },
              "current_tvl_usd": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Current Tvl Usd"
              },
              "tvl_7d_change_pct": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Tvl 7D Change Pct"
              },
              "tvl_30d_change_pct": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Tvl 30D Change Pct"
              },
              "chain_breakdown": {
                "items": {
                  "$ref": "#/$defs/ChainTvlEntry"
                },
                "title": "Chain Breakdown",
                "type": "array"
              },
              "historical_series": {
                "anyOf": [
                  {
                    "items": {
                      "$ref": "#/$defs/DailyTvlPoint"
                    },
                    "type": "array"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Historical Series"
              },
              "note": {
                "title": "Note",
                "type": "string"
              },
              "error": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Error"
              },
              "error_type": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Error Type"
              }
            },
            "required": [
              "protocol",
              "current_tvl_usd",
              "tvl_7d_change_pct",
              "tvl_30d_change_pct",
              "chain_breakdown",
              "historical_series",
              "note"
            ],
            "title": "GetProtocolTvlOutput",
            "type": "object"
          },
          {
            "type": "array",
            "items": {
              "$defs": {
                "ChainTvlEntry": {
                  "properties": {
                    "chain": {
                      "title": "Chain",
                      "type": "string"
                    },
                    "tvl_usd": {
                      "title": "Tvl Usd",
                      "type": "number"
                    }
                  },
                  "required": [
                    "chain",
                    "tvl_usd"
                  ],
                  "title": "ChainTvlEntry",
                  "type": "object"
                },
                "DailyTvlPoint": {
                  "properties": {
                    "date": {
                      "title": "Date",
                      "type": "string"
                    },
                    "tvl_usd": {
                      "title": "Tvl Usd",
                      "type": "number"
                    }
                  },
                  "required": [
                    "date",
                    "tvl_usd"
                  ],
                  "title": "DailyTvlPoint",
                  "type": "object"
                }
              },
              "properties": {
                "protocol": {
                  "title": "Protocol",
                  "type": "string"
                },
                "current_tvl_usd": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Current Tvl Usd"
                },
                "tvl_7d_change_pct": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Tvl 7D Change Pct"
                },
                "tvl_30d_change_pct": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Tvl 30D Change Pct"
                },
                "chain_breakdown": {
                  "items": {
                    "$ref": "#/$defs/ChainTvlEntry"
                  },
                  "title": "Chain Breakdown",
                  "type": "array"
                },
                "historical_series": {
                  "anyOf": [
                    {
                      "items": {
                        "$ref": "#/$defs/DailyTvlPoint"
                      },
                      "type": "array"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Historical Series"
                },
                "note": {
                  "title": "Note",
                  "type": "string"
                },
                "error": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "default": null,
                  "title": "Error"
                },
                "error_type": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "default": null,
                  "title": "Error Type"
                }
              },
              "required": [
                "protocol",
                "current_tvl_usd",
                "tvl_7d_change_pct",
                "tvl_30d_change_pct",
                "chain_breakdown",
                "historical_series",
                "note"
              ],
              "title": "GetProtocolTvlOutput",
              "type": "object"
            },
            "minItems": 1
          }
        ]
      }
    },
    {
      "name": "get_token_price_historical",
      "version": "1.0.0",
      "description": "Get historical price data for crypto tokens over a specified time window (1\u2013365 days). Returns period statistics (start, end, % change, high, low) plus a downsampled daily price series. Use for period comparisons (month-over-month, YTD), trend analysis, and price charts. Prefer over web_search for any time-comparative financial query. Pass stats_only=true when the daily series is unnecessary. price_change_pct is pre-computed and should not be re-derived with calculate.",
      "tags": [
        "finance",
        "crypto",
        "price",
        "history",
        "market"
      ],
      "input_schema": {
        "properties": {
          "tokens": {
            "description": "Token symbols or CoinGecko IDs (e.g. ['BTC', 'ETH']). Max 10 per call.",
            "items": {
              "type": "string"
            },
            "maxItems": 10,
            "minItems": 1,
            "title": "Tokens",
            "type": "array"
          },
          "days": {
            "default": 30,
            "description": "Lookback window in days (1\u2013365). 1=5-min granularity, 2-90=hourly, 91+=daily.",
            "maximum": 365,
            "minimum": 1,
            "title": "Days",
            "type": "integer"
          },
          "vs_currency": {
            "default": "usd",
            "description": "Quote currency (usd, eur, gbp, btc, eth). Lowercase 3\u201310 letters.",
            "pattern": "^[a-z]{3,10}$",
            "title": "Vs Currency",
            "type": "string"
          },
          "stats_only": {
            "default": false,
            "description": "If true, omit the daily price series and return only period stats (start/end/change/high/low) to reduce payload size.",
            "title": "Stats Only",
            "type": "boolean"
          }
        },
        "required": [
          "tokens"
        ],
        "title": "GetTokenPriceHistoricalInput",
        "type": "object"
      },
      "output_schema": {
        "$defs": {
          "DailyPricePoint": {
            "properties": {
              "date": {
                "title": "Date",
                "type": "string"
              },
              "price": {
                "title": "Price",
                "type": "number"
              }
            },
            "required": [
              "date",
              "price"
            ],
            "title": "DailyPricePoint",
            "type": "object"
          },
          "TokenHistoricalEntry": {
            "properties": {
              "id": {
                "title": "Id",
                "type": "string"
              },
              "symbol": {
                "title": "Symbol",
                "type": "string"
              },
              "price_start": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Price Start"
              },
              "price_end": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Price End"
              },
              "price_change_pct": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Price Change Pct"
              },
              "price_high": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Price High"
              },
              "price_low": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Price Low"
              },
              "daily_prices": {
                "items": {
                  "$ref": "#/$defs/DailyPricePoint"
                },
                "title": "Daily Prices",
                "type": "array"
              }
            },
            "required": [
              "id",
              "symbol",
              "price_start",
              "price_end",
              "price_change_pct",
              "price_high",
              "price_low",
              "daily_prices"
            ],
            "title": "TokenHistoricalEntry",
            "type": "object"
          }
        },
        "properties": {
          "vs_currency": {
            "title": "Vs Currency",
            "type": "string"
          },
          "days": {
            "title": "Days",
            "type": "integer"
          },
          "tokens": {
            "items": {
              "$ref": "#/$defs/TokenHistoricalEntry"
            },
            "title": "Tokens",
            "type": "array"
          }
        },
        "required": [
          "vs_currency",
          "days",
          "tokens"
        ],
        "title": "GetTokenPriceHistoricalOutput",
        "type": "object"
      }
    },
    {
      "name": "get_yield_rates",
      "version": "1.0.0",
      "description": "Get DeFi yield pool rates from DeFiLlama, covering 1,000+ protocols across all chains. Returns pools sorted by APY with TVL, base rate, reward APY, and 7d/30d mean APY context. Filter by protocol (e.g. 'aave-v3', 'compound-v3'), chain (e.g. 'Ethereum', 'Base'), minimum TVL, and minimum APY. Use this to answer questions like 'Where can I get the best USDC yield?', 'What is Aave's current APY on Ethereum?', or 'Compare Aave vs Compound yields'. Returns up to 50 pools. IMPORTANT: Call ONCE per query. The returned `symbol` field contains the underlying tokens (e.g. 'USDC', 'ETH-USDC', 'WBTC'); filter on the client side by inspecting `symbol` rather than re-calling with different arguments. Use `min_apy`, `min_tvl_usd`, and `symbols_any` to prune noise in a single call. Set stable_only=true when you need consistent stablecoin yield screening; this ranks by 30d mean APY first and still returns spot/base/reward components.",
      "tags": [
        "defi",
        "yield",
        "apy",
        "finance",
        "defillama"
      ],
      "input_schema": {
        "properties": {
          "protocols": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Filter by DeFiLlama project slugs (e.g. ['aave-v3', 'compound-v3']). None or empty list = include all protocols.",
            "title": "Protocols"
          },
          "chain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Filter by chain name (e.g. 'Ethereum', 'Base', 'Arbitrum'). Case-insensitive. None = all chains.",
            "title": "Chain"
          },
          "min_tvl_usd": {
            "default": 1000000.0,
            "description": "Exclude pools with TVL below this threshold (USD). Default $1M filters noise.",
            "minimum": 0.0,
            "title": "Min Tvl Usd",
            "type": "number"
          },
          "min_apy": {
            "default": 0.0,
            "description": "Exclude pools with APY below this value (%). Default 0 includes all.",
            "minimum": 0.0,
            "title": "Min Apy",
            "type": "number"
          },
          "limit": {
            "default": 20,
            "description": "Maximum number of pools to return, sorted by APY descending.",
            "maximum": 50,
            "minimum": 1,
            "title": "Limit",
            "type": "integer"
          },
          "symbols_any": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional symbol filter. If provided, include pools whose symbol field contains at least one token from this list (case-insensitive). Use held token symbols from get_wallet_portfolio to focus results.",
            "title": "Symbols Any"
          },
          "stable_only": {
            "default": false,
            "description": "When true, return only stablecoin pools and rank by 30d mean APY first to emphasize consistency over short-term spikes.",
            "title": "Stable Only",
            "type": "boolean"
          }
        },
        "title": "GetYieldRatesInput",
        "type": "object"
      },
      "output_schema": {
        "$defs": {
          "YieldPoolEntry": {
            "properties": {
              "pool_id": {
                "title": "Pool Id",
                "type": "string"
              },
              "project": {
                "title": "Project",
                "type": "string"
              },
              "symbol": {
                "title": "Symbol",
                "type": "string"
              },
              "chain": {
                "title": "Chain",
                "type": "string"
              },
              "tvl_usd": {
                "title": "Tvl Usd",
                "type": "number"
              },
              "apy": {
                "title": "Apy",
                "type": "number"
              },
              "apy_mean_7d": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Apy Mean 7D"
              },
              "apy_mean_30d": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Apy Mean 30D"
              },
              "apy_base": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Apy Base"
              },
              "apy_reward": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Apy Reward"
              },
              "stable": {
                "title": "Stable",
                "type": "boolean"
              },
              "il_risk": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Il Risk"
              }
            },
            "required": [
              "pool_id",
              "project",
              "symbol",
              "chain",
              "tvl_usd",
              "apy",
              "apy_mean_7d",
              "apy_mean_30d",
              "apy_base",
              "apy_reward",
              "stable",
              "il_risk"
            ],
            "title": "YieldPoolEntry",
            "type": "object"
          }
        },
        "properties": {
          "pools": {
            "items": {
              "$ref": "#/$defs/YieldPoolEntry"
            },
            "title": "Pools",
            "type": "array"
          },
          "total_matching": {
            "title": "Total Matching",
            "type": "integer"
          },
          "filters_applied": {
            "additionalProperties": true,
            "title": "Filters Applied",
            "type": "object"
          },
          "note": {
            "title": "Note",
            "type": "string"
          }
        },
        "required": [
          "pools",
          "total_matching",
          "filters_applied",
          "note"
        ],
        "title": "GetYieldRatesOutput",
        "type": "object"
      }
    },
    {
      "name": "web_search",
      "version": "1.0.0",
      "description": "Real-time web search via Tavily. Use for current events, fact-checking, and research. Set search_depth='advanced' for complex research queries (higher quality, higher cost). Set topic='news' for recent headlines or 'finance' for market information.",
      "tags": [
        "search",
        "web",
        "realtime"
      ],
      "input_schema": {
        "properties": {
          "query": {
            "description": "Search query",
            "maxLength": 500,
            "title": "Query",
            "type": "string"
          },
          "num_results": {
            "default": 5,
            "description": "Number of web search results to return (1\u201320, default 5).",
            "maximum": 20,
            "minimum": 1,
            "title": "Num Results",
            "type": "integer"
          },
          "search_depth": {
            "default": "basic",
            "description": "'basic' for fast results, 'advanced' for thorough research (higher cost)",
            "enum": [
              "basic",
              "advanced"
            ],
            "title": "Search Depth",
            "type": "string"
          },
          "topic": {
            "default": "general",
            "description": "Search topic: 'general' for web, 'news' for headlines, 'finance' for markets",
            "enum": [
              "general",
              "news",
              "finance"
            ],
            "title": "Topic",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "title": "WebSearchInput",
        "type": "object"
      },
      "output_schema": {
        "$defs": {
          "SearchResult": {
            "properties": {
              "title": {
                "title": "Title",
                "type": "string"
              },
              "url": {
                "title": "Url",
                "type": "string"
              },
              "snippet": {
                "title": "Snippet",
                "type": "string"
              },
              "score": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Score"
              }
            },
            "required": [
              "title",
              "url",
              "snippet"
            ],
            "title": "SearchResult",
            "type": "object"
          }
        },
        "properties": {
          "query": {
            "title": "Query",
            "type": "string"
          },
          "num_results": {
            "title": "Num Results",
            "type": "integer"
          },
          "results": {
            "items": {
              "$ref": "#/$defs/SearchResult"
            },
            "title": "Results",
            "type": "array"
          },
          "note": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Note"
          }
        },
        "required": [
          "query",
          "num_results",
          "results"
        ],
        "title": "WebSearchOutput",
        "type": "object"
      }
    },
    {
      "name": "count_text_stats",
      "version": "1.0.0",
      "description": "Return word count, character count, sentence count, and paragraph statistics for a given text.",
      "tags": [
        "text",
        "analysis",
        "statistics"
      ],
      "input_schema": {
        "properties": {
          "text": {
            "description": "Text to summarize",
            "maxLength": 10000,
            "title": "Text",
            "type": "string"
          }
        },
        "required": [
          "text"
        ],
        "title": "SummarizeTextInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "character_count": {
            "title": "Character Count",
            "type": "integer"
          },
          "word_count": {
            "title": "Word Count",
            "type": "integer"
          },
          "sentence_count": {
            "title": "Sentence Count",
            "type": "integer"
          },
          "paragraph_count": {
            "title": "Paragraph Count",
            "type": "integer"
          },
          "average_words_per_sentence": {
            "title": "Average Words Per Sentence",
            "type": "number"
          }
        },
        "required": [
          "character_count",
          "word_count",
          "sentence_count",
          "paragraph_count",
          "average_words_per_sentence"
        ],
        "title": "SummarizeTextOutput",
        "type": "object"
      }
    },
    {
      "name": "http_fetch",
      "version": "1.0.0",
      "description": "Fetch a web page and extract its main text content. Useful for reading articles, documentation, and web resources. Returns cleaned text, not raw HTML.",
      "tags": [
        "web",
        "http",
        "fetch",
        "content"
      ],
      "input_schema": {
        "properties": {
          "url": {
            "description": "URL to fetch (http or https only)",
            "maxLength": 2000,
            "minLength": 10,
            "title": "Url",
            "type": "string"
          },
          "max_chars": {
            "default": 8000,
            "description": "Maximum characters of extracted content to return",
            "maximum": 50000,
            "minimum": 100,
            "title": "Max Chars",
            "type": "integer"
          }
        },
        "required": [
          "url"
        ],
        "title": "HttpFetchInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "url": {
            "title": "Url",
            "type": "string"
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Title"
          },
          "content": {
            "title": "Content",
            "type": "string"
          },
          "content_length": {
            "title": "Content Length",
            "type": "integer"
          },
          "truncated": {
            "title": "Truncated",
            "type": "boolean"
          }
        },
        "required": [
          "url",
          "title",
          "content",
          "content_length",
          "truncated"
        ],
        "title": "HttpFetchOutput",
        "type": "object"
      }
    },
    {
      "name": "get_eth_balance",
      "version": "1.0.0",
      "description": "Get the native ETH balance of an Ethereum or Base address. NOTE: get_wallet_portfolio already includes the native ETH balance in its holdings list \u2014 only call get_eth_balance when you need a standalone ETH balance without a full portfolio scan.",
      "tags": [
        "web3",
        "ethereum",
        "balance"
      ],
      "input_schema": {
        "properties": {
          "address": {
            "description": "Ethereum address (0x\u2026)",
            "title": "Address",
            "type": "string"
          },
          "chain_id": {
            "default": 1,
            "description": "Chain ID (1=Ethereum, 8453=Base)",
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "required": [
          "address"
        ],
        "title": "GetEthBalanceInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "address": {
            "title": "Address",
            "type": "string"
          },
          "balance_wei": {
            "title": "Balance Wei",
            "type": "string"
          },
          "balance_eth": {
            "title": "Balance Eth",
            "type": "string"
          },
          "chain_id": {
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "required": [
          "address",
          "balance_wei",
          "balance_eth",
          "chain_id"
        ],
        "title": "GetEthBalanceOutput",
        "type": "object"
      }
    },
    {
      "name": "get_erc20_balance",
      "version": "1.0.0",
      "description": "Get the ERC-20 token balance of a wallet, including symbol and decimals.",
      "tags": [
        "web3",
        "ethereum",
        "erc20",
        "token",
        "balance"
      ],
      "input_schema": {
        "properties": {
          "wallet_address": {
            "description": "Wallet address (0x\u2026)",
            "title": "Wallet Address",
            "type": "string"
          },
          "token_address": {
            "description": "ERC-20 token contract address (0x\u2026)",
            "title": "Token Address",
            "type": "string"
          },
          "chain_id": {
            "default": 1,
            "description": "Chain ID (1=Ethereum, 8453=Base)",
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "required": [
          "wallet_address",
          "token_address"
        ],
        "title": "GetErc20BalanceInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "wallet_address": {
            "title": "Wallet Address",
            "type": "string"
          },
          "token_address": {
            "title": "Token Address",
            "type": "string"
          },
          "token_symbol": {
            "title": "Token Symbol",
            "type": "string"
          },
          "token_decimals": {
            "title": "Token Decimals",
            "type": "integer"
          },
          "balance_raw": {
            "title": "Balance Raw",
            "type": "string"
          },
          "balance_formatted": {
            "title": "Balance Formatted",
            "type": "string"
          },
          "chain_id": {
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "required": [
          "wallet_address",
          "token_address",
          "token_symbol",
          "token_decimals",
          "balance_raw",
          "balance_formatted",
          "chain_id"
        ],
        "title": "GetErc20BalanceOutput",
        "type": "object"
      }
    },
    {
      "name": "get_transaction",
      "version": "1.0.0",
      "description": "Get details and receipt for an Ethereum or Base transaction by hash.",
      "tags": [
        "web3",
        "ethereum",
        "transaction"
      ],
      "input_schema": {
        "properties": {
          "tx_hash": {
            "description": "Transaction hash (0x\u2026)",
            "title": "Tx Hash",
            "type": "string"
          },
          "chain_id": {
            "default": 1,
            "description": "Chain ID (1=Ethereum, 8453=Base)",
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "required": [
          "tx_hash"
        ],
        "title": "GetTransactionInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "tx_hash": {
            "title": "Tx Hash",
            "type": "string"
          },
          "from_address": {
            "title": "From Address",
            "type": "string"
          },
          "to_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "To Address"
          },
          "value_eth": {
            "title": "Value Eth",
            "type": "string"
          },
          "gas_used": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gas Used"
          },
          "gas_price_gwei": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gas Price Gwei"
          },
          "status": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "1=success, 0=revert, None=pending",
            "title": "Status"
          },
          "block_number": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Block Number"
          },
          "chain_id": {
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "required": [
          "tx_hash",
          "from_address",
          "to_address",
          "value_eth",
          "gas_used",
          "gas_price_gwei",
          "block_number",
          "chain_id"
        ],
        "title": "GetTransactionOutput",
        "type": "object"
      }
    },
    {
      "name": "get_wallet_portfolio",
      "version": "1.0.0",
      "description": "Get aggregated token holdings with USD values for a wallet address. Tracks 15+ major tokens on Ethereum (USDC, USDT, DAI, WETH, WBTC, LINK, UNI, AAVE, ARB, OP, LDO, stETH, CRV, SUSHI, MKR) and 9+ on Base. Sorted by USD value. Returns up to 20 holdings. Includes native ETH balance in the holdings list \u2014 calling get_eth_balance separately after this is redundant.",
      "tags": [
        "web3",
        "ethereum",
        "portfolio",
        "balance",
        "defi"
      ],
      "input_schema": {
        "properties": {
          "wallet_address": {
            "description": "Wallet address (0x\u2026)",
            "title": "Wallet Address",
            "type": "string"
          },
          "chain_id": {
            "default": 1,
            "description": "Chain ID (1=Ethereum, 8453=Base)",
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "required": [
          "wallet_address"
        ],
        "title": "GetWalletPortfolioInput",
        "type": "object"
      },
      "output_schema": {
        "$defs": {
          "PortfolioEntry": {
            "properties": {
              "symbol": {
                "title": "Symbol",
                "type": "string"
              },
              "token_address": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Token Address"
              },
              "balance_formatted": {
                "title": "Balance Formatted",
                "type": "string"
              },
              "price_usd": {
                "title": "Price Usd",
                "type": "number"
              },
              "value_usd": {
                "title": "Value Usd",
                "type": "number"
              }
            },
            "required": [
              "symbol",
              "token_address",
              "balance_formatted",
              "price_usd",
              "value_usd"
            ],
            "title": "PortfolioEntry",
            "type": "object"
          }
        },
        "properties": {
          "wallet_address": {
            "title": "Wallet Address",
            "type": "string"
          },
          "chain_id": {
            "title": "Chain Id",
            "type": "integer"
          },
          "total_value_usd": {
            "title": "Total Value Usd",
            "type": "number"
          },
          "holdings": {
            "items": {
              "$ref": "#/$defs/PortfolioEntry"
            },
            "title": "Holdings",
            "type": "array"
          },
          "fetch_errors": {
            "items": {
              "type": "string"
            },
            "title": "Fetch Errors",
            "type": "array"
          },
          "note": {
            "default": "Only tracked tokens shown. Untracked tokens not included.",
            "title": "Note",
            "type": "string"
          }
        },
        "required": [
          "wallet_address",
          "chain_id",
          "total_value_usd",
          "holdings"
        ],
        "title": "GetWalletPortfolioOutput",
        "type": "object"
      }
    },
    {
      "name": "read_contract",
      "version": "1.0.0",
      "description": "Call any view/pure function on a smart contract and return the result. Provide the ABI fragment (JSON array) and function name. State-changing functions (payable/nonpayable) are rejected for safety. Supports historical queries via block_identifier (block number or 'latest').",
      "tags": [
        "web3",
        "ethereum",
        "contract",
        "abi",
        "defi"
      ],
      "input_schema": {
        "properties": {
          "contract_address": {
            "description": "Contract address (0x\u2026)",
            "title": "Contract Address",
            "type": "string"
          },
          "abi_fragment": {
            "description": "JSON array containing the ABI for the function to call. Supports both modern (stateMutability: view/pure) and legacy (constant: true) formats. Only read-only functions are allowed.",
            "maxLength": 65536,
            "title": "Abi Fragment",
            "type": "string"
          },
          "function_name": {
            "description": "Name of the function to call",
            "maxLength": 200,
            "title": "Function Name",
            "type": "string"
          },
          "args_json": {
            "anyOf": [
              {
                "maxLength": 2000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional JSON array string of positional arguments for the function call. Use this instead of 'args' for complex types or when calling via Google/Gemini.",
            "title": "Args Json"
          },
          "args": {
            "description": "DEPRECATED: Positional arguments for the function call. Use 'args_json' for complex objects or Gemini compatibility.",
            "items": {
              "type": "string"
            },
            "maxItems": 50,
            "title": "Args",
            "type": "array"
          },
          "block_identifier": {
            "default": "latest",
            "description": "Block number, block hash, or 'latest'/'earliest'/'pending'",
            "maxLength": 80,
            "title": "Block Identifier",
            "type": "string"
          },
          "chain_id": {
            "default": 1,
            "description": "Chain ID (1=Ethereum, 8453=Base)",
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "required": [
          "contract_address",
          "abi_fragment",
          "function_name"
        ],
        "title": "ReadContractInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "contract_address": {
            "title": "Contract Address",
            "type": "string"
          },
          "function_name": {
            "title": "Function Name",
            "type": "string"
          },
          "result": {
            "title": "Result"
          },
          "block_identifier": {
            "title": "Block Identifier",
            "type": "string"
          },
          "chain_id": {
            "title": "Chain Id",
            "type": "integer"
          }
        },
        "required": [
          "contract_address",
          "function_name",
          "result",
          "block_identifier",
          "chain_id"
        ],
        "title": "ReadContractOutput",
        "type": "object"
      }
    },
    {
      "name": "resolve_ens",
      "version": "1.0.0",
      "description": "Resolve an ENS name (e.g. 'vitalik.eth') to an Ethereum address, or pass an Ethereum address for reverse lookup to its primary ENS name. Also returns the avatar text record when available. Mainnet only.",
      "tags": [
        "web3",
        "ethereum",
        "ens",
        "identity"
      ],
      "input_schema": {
        "properties": {
          "name": {
            "description": "ENS name (e.g. 'vitalik.eth') to resolve to an address, or an Ethereum address (0x\u2026) for reverse lookup to a primary ENS name.",
            "maxLength": 253,
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "title": "ResolveEnsInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Address"
          },
          "resolved": {
            "title": "Resolved",
            "type": "boolean"
          },
          "avatar": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Avatar"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Error"
          }
        },
        "required": [
          "name",
          "address",
          "resolved"
        ],
        "title": "ResolveEnsOutput",
        "type": "object"
      }
    }
  ],
  "authentication": {
    "required": true,
    "scheme": "bearer",
    "type": "jwt",
    "token_endpoint": "/token"
  },
  "securitySchemes": {
    "bearer_jwt": {
      "httpAuthSecurityScheme": {
        "description": "JWT bearer token issued by Teardrop.",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  },
  "security": [
    {
      "bearer_jwt": []
    }
  ],
  "securityRequirements": [
    {
      "bearer_jwt": []
    }
  ],
  "iconUrl": "https://teardrop.dev/teardrop.png"
}