{"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 — 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 — 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 — 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–365 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 — 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 — 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… 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 — 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 — 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 — 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 — 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 — other protocols still return.","tags":["web3","defi","aave","compound","uniswap","portfolio"],"input_schema":{"properties":{"wallet_address":{"description":"Wallet address (0x…)","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 — 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 — do NOT call read_contract, web_search, or any external lookup to identify these tokens. Report them as 'unrecognized token (0x…)' 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 — 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 (≥1.5). Compound v3 exposes only a boolean isLiquidatable — 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…)","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–365 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–365). 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–10 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–20, 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 — 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…)","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…)","title":"Wallet Address","type":"string"},"token_address":{"description":"ERC-20 token contract address (0x…)","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…)","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 — calling get_eth_balance separately after this is redundant.","tags":["web3","ethereum","portfolio","balance","defi"],"input_schema":{"properties":{"wallet_address":{"description":"Wallet address (0x…)","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…)","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…) 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"}