Teardrop
Server Details
Teardrop is the native economic layer for AI agents, providing a robust suite of tools for multi-chain portfolio tracking, DeFi yield analysis, and gas estimation. It enables autonomous agents to securely find Web3 data and manage micro-payments on-chain with zero human intervention.
- Status
- Healthy
- Uptime
- 100.0% over 42 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 34 tools
Most tools have explicit use-when guidance and alternatives, which helps, but the wallet/approval/position families overlap heavily: get_wallet_portfolio, get_wallet_positions, and get_defi_positions are close pairs, as are get_token_approvals and get_wallet_approvals. The three risk tools (assess_counterparty_risk, get_liquidation_risk, validate_opportunity) also require careful scope parsing before selection.
Names are almost uniformly verb-first snake_case, with get_* reserved for data retrievals and action verbs like assess_, validate_, decode_, and resolve_ for operations. Minor noun-first deviations such as web_search and http_fetch do not seriously undermine the predictable pattern.
At 34 tools, the surface is above the heavy threshold and mixes core DeFi analytics with generic helpers like calculate, count_text_stats, get_datetime, web_search, and agent delegation, inflating selection cost. The breadth of the domain justifies a large set, but this count is still more bloated than well-scoped.
For a read-only DeFi risk and analysis domain, coverage is strong: positions, balances, approvals, liquidation risk, yields, TVL, prices, gas, transactions, contract reads, and decision-verdict tools are all present. Minor gaps remain, such as swap execution, arbitrary token-by-address metadata, and bytecode-level audits, but agents can work around these with read_contract or web_search.
Available Tools
34 toolsassess_counterparty_riskAssess Counterparty RiskARead-onlyInspect
Return a decision-ready counterparty-risk verdict for an EVM address before funds or authority are committed. The result branches to high_risk, caution, acceptable, or insufficient_data with the evidence needed for the calling agent to act.
Use when: Delegate this check before sending funds, granting approvals, or interacting with an unknown EVM address when the caller needs a bounded risk decision.
Limitations: Analytics and heuristic risk assessment; not a credit bureau, fraud guarantee, or legal endorsement. Relies on DeBank indexing and on-chain Aave/Compound contract states.
Alternatives: get_wallet_approvals, get_liquidation_risk, get_wallet_positions
| Name | Required | Description | Default |
|---|---|---|---|
| chain_ids | No | DeBank chain identifiers scoping approvals and history; positions and net worth remain all-chain. | |
| wallet_address | Yes | EVM wallet address (0x-prefixed) |
Output Schema
| Name | Required | Description |
|---|---|---|
| as_of | Yes | |
| verdict | Yes | |
| activity | No | |
| provenance | Yes | |
| liquidation | No | |
| risk_factors | No | |
| data_complete | No | |
| partial_errors | No | |
| wallet_address | Yes | |
| approval_summary | No | |
| total_net_worth_usd | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is known. The description adds valuable context beyond annotations: it explicitly states limitations (not a credit bureau, fraud guarantee, or legal endorsement) and data sources (DeBank indexing, Aave/Compound contract states). This gives the agent realistic expectations without contradicting the annotation. It could go further by mentioning error handling or edge cases, but the provided context is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a tight opening sentence, then purpose-built sections (Use when, Limitations, Alternatives) that are each one line. No filler, everything earns its place, and the most critical usage guidance is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the readOnlyHint annotation, an output schema, and fully documented parameters, the description covers the essential non-obvious aspects: when to use, limitations, and alternatives. It doesn't explain how to interpret the verdict branches, but the output schema likely handles that. Overall it's complete for an agent to decide and call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and both parameters have descriptions in the schema. The wallet_address description is minimal ('EVM wallet address (0x-prefixed)') but sufficient; chain_ids has a richer description explaining scoping. The tool description itself adds no parameter-level detail beyond what the schema provides, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Return') and a precise resource ('decision-ready counterparty-risk verdict for an EVM address'), then enumerates the four possible outcome branches (high_risk, caution, acceptable, insufficient_data). It clearly distinguishes itself from siblings by naming the alternatives at the end, so an agent can differentiate without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use when' section gives concrete trigger conditions (before sending funds, granting approvals, or interacting with an unknown EVM address) and explicitly limits to cases needing a bounded risk decision. The 'Alternatives' section names three sibling tools, providing clear routing to other specific tools when the general verdict is not needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculateCalculateARead-onlyInspect
Evaluate a safe arithmetic expression and return the numeric result. Supports +,-,*,/,**,%,sqrt,abs,round,floor,ceil,log,sin,cos,tan,pi,e. Use for derived figures (ratios, differences, percentages) that no tool output already provides.
Use when: Use when an agent must derive a value that tool outputs do not already include, such as a ratio, spread, or percentage. Do not use to re-derive pre-computed fields like std_30d or dca_baseline_90d that get_token_price_historical returns.
Limitations: Arithmetic only — no aggregation over tool history, no unit conversion, and no financial modeling beyond the listed functions. Errors return an error field rather than raising.
Alternatives: get_token_price_historical, get_datetime
| Name | Required | Description | Default |
|---|---|---|---|
| expression | Yes | A safe arithmetic expression, e.g. '(3 + 4) * 2 / sqrt(9)' |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| result | No | |
| expression | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds meaningful behavioral context beyond that: it is arithmetic-only, has no aggregation/unit conversion/financial modeling, and errors return an error field rather than raising. This gives the agent a clear model of what the tool will and won't do. It doesn't describe every edge case, but it covers the important behavioral boundaries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: a one-sentence purpose, a 'Use when' section, a 'Limitations' section, and an 'Alternatives' section. Every sentence earns its place, and the most important information is front-loaded. It is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, read-only, arithmetic-only), the description is complete. It covers purpose, usage, limitations, alternatives, and error behavior. The output schema exists, so the description doesn't need to explain return values. An agent has everything it needs to decide when to call this tool and how to construct a valid expression.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single 'expression' parameter. The description adds value by listing supported operators/functions and giving an example expression format, which helps the agent construct valid input. It doesn't need to do much more because there is only one parameter and the schema covers it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Evaluate'), a resource ('a safe arithmetic expression'), and the outcome ('return the numeric result'). It also lists supported operators/functions and explicitly distinguishes itself from sibling tools by saying it is for derived figures that no tool output already provides. This is a clear, specific purpose that an agent can act on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit 'Use when' guidance, tells the agent when NOT to use it (do not re-derive pre-computed fields like std_30d or dca_baseline_90d), and names alternatives (get_token_price_historical, get_datetime). This is exactly the kind of when/when-not/alternatives guidance that helps an agent select the right tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_currencyConvert CurrencyARead-onlyInspect
Convert an amount between fiat currencies (USD, EUR, GBP) and crypto assets (BTC, ETH, USDC, SOL) and return the converted amount plus the exchange rate used.
Use when: Use when an amount must be expressed in a different currency than the source data — for example converting a USD portfolio value into EUR, or a fiat amount into its crypto equivalent. For prices only, get_token_price returns the rate directly without a second call.
Limitations: Spot-rate conversion at request time; no historical or forward rates, and no slippage or fee modeling. Actual swap execution differs — use get_dex_quote for executable on-chain quotes.
Alternatives: get_token_price, get_dex_quote
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Amount to convert | |
| to_currency | Yes | Target currency (e.g. 'USD', 'EUR', 'BTC') | |
| from_currency | Yes | Source currency (e.g. 'ETH', 'USD', 'BTC') |
Output Schema
| Name | Required | Description |
|---|---|---|
| rate | Yes | |
| amount | Yes | |
| source | Yes | |
| to_currency | Yes | |
| from_currency | Yes | |
| converted_amount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description is not required to state that this is a read-only operation. It adds valuable context beyond the annotation: the tool performs spot-rate conversion at request time, has no historical/forward rates, and does not model slippage or fees. It also clarifies that actual swap execution is handled by a different tool, which is useful behavioral disclosure. The only minor omission is whether the rate is live or cached, but this is acceptable given the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear 'Use when', 'Limitations', and 'Alternatives' sections. Each sentence serves a distinct purpose, and the most important scoping information (what the tool does) is front-loaded. The text is concise without redundancy, and the alternatives are explicitly named, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has an output schema (as indicated by 'has output schema: true'), the description does not need to explain return values. The description covers the tool's purpose, usage conditions, limitations, and alternatives, which is comprehensive for an agent to call it correctly. Nothing critical is missing for a currency conversion tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — all three parameters (amount, from_currency, to_currency) have descriptive names and explanations in the schema itself. The tool description does not add any additional parameter-level meaning, such as accepted formats, examples beyond those in the schema, or constraints. Since the schema fully documents the parameters, a baseline score of 3 is appropriate; the description adds no extra semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Convert an amount') with a specific resource (fiat currencies and crypto assets) and explicitly lists the supported asset classes. It names the two sibling tools it is not (get_token_price, get_dex_quote) and explains the difference, making it unambiguous for an agent to select this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes explicit 'Use when' guidance with concrete examples (converting USD portfolio to EUR, fiat to crypto), and explicitly says for prices only use get_token_price, and for actual swap execution use get_dex_quote. It also clearly states limitations (spot-rate only, no historical/forward rates, no slippage/fee modeling), leaving no ambiguity about when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
count_text_statsCount Text StatsARead-onlyInspect
Return word, character, sentence, and paragraph counts plus average words per sentence for a given text, for length checks and content sizing decisions.
Use when: Use when output length must be validated or reported — e.g. verifying a summary meets a length contract or comparing document sizes. Do not use for semantic summarization; it counts only.
Limitations: Pure counting on the provided text — no language detection, no reading-level or sentiment analysis, and no retrieval of external content.
Alternatives: web_search, http_fetch
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to summarize |
Output Schema
| Name | Required | Description |
|---|---|---|
| word_count | Yes | |
| sentence_count | Yes | |
| character_count | Yes | |
| paragraph_count | Yes | |
| average_words_per_sentence | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, and the description adds useful behavioral limitations: pure counting, no language detection, no reading-level or sentiment analysis, and no external retrieval. It does not cover edge cases like empty text or error handling, but for a simple read-only counter with an output schema, the disclosure is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly structured with clear labeled sections: what it does, when to use it, limitations, and alternatives. Each sentence earns its place, and the most important purpose information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only counting tool with one fully described parameter and an output schema, the description covers purpose, usage context, exclusions, and alternatives. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single 'text' parameter is fully described in the schema at 100% coverage, giving a baseline of 3. The description adds value by correcting the schema's misleading 'Text to summarize' phrase, clarifying that the text is raw content to be counted rather than semantically summarized. No additional parameter-level syntax is needed for such a simple input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: it returns counts of words, characters, sentences, paragraphs, and average words per sentence. It clearly separates this from semantic work by stating it 'counts only', and it names alternatives, distinguishing itself from web_search and http_fetch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use when' section gives concrete examples—validating a summary length contract or comparing document sizes—and explicitly says not to use it for semantic summarization. The limitation note that it does not retrieve external content reinforces when web_search or http_fetch would be better choices.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decode_transactionDecode TransactionARead-onlyInspect
Decode a transaction's calldata into a human-readable function name and arguments, and return transaction status (1=success, 0=revert), gas used, and block number. Uses a supplied ABI when provided, otherwise 4byte.directory. Supports Ethereum mainnet and Base.
Use when: Use when one known transaction must be explained — what function was called, with what arguments, and whether it succeeded. For wallet-wide activity patterns use get_wallet_history instead.
Limitations: 4byte.directory matching can be ambiguous or absent for custom contracts; supply an ABI for precise decoding. One transaction per call; Ethereum mainnet and Base only.
Alternatives: get_transaction, get_wallet_history
| Name | Required | Description | Default |
|---|---|---|---|
| tx_hash | Yes | Transaction hash (0x… 64 hex chars) | |
| abi_json | No | Optional ABI JSON array for decoding. If omitted, 4byte.directory is used. | |
| chain_id | No | Chain ID (1=Ethereum, 8453=Base) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| status | No | 1=success, 0=revert, None=pending |
| tx_hash | Yes | |
| chain_id | Yes | |
| gas_used | Yes | |
| value_eth | Yes | |
| to_address | Yes | |
| block_number | Yes | |
| decoded_args | Yes | |
| from_address | Yes | |
| raw_calldata | Yes | |
| decode_source | Yes | |
| function_name | Yes | |
| function_selector | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds useful behavioral context: it uses a supplied ABI when provided, otherwise falls back to 4byte.directory, and notes that 4byte.directory matching can be ambiguous or absent for custom contracts. It also states the one-transaction-per-call limit and supported chains. This goes beyond the annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections: what it does, when to use, limitations, and alternatives. It's slightly longer than necessary but every section earns its place, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, usage context, limitations, and alternatives. An output schema exists, so return values don't need to be explained. The only minor gap is that it doesn't explicitly state what happens when decoding fails or when no ABI is supplied and 4byte.directory has no match, but the limitations section partially covers this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds context about the ABI fallback behavior and chain support, but doesn't add significant new meaning beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: decode a transaction's calldata into a human-readable function name and arguments, plus return status, gas used, and block number. It clearly distinguishes itself from siblings like get_transaction and get_wallet_history by focusing on calldata decoding and transaction explanation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use when' one known transaction must be explained, and names the alternative get_wallet_history for wallet-wide patterns. It also lists alternatives get_transaction and get_wallet_history, giving clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delegate_to_agentDelegate To AgentAInspect
Delegate a task to a remote A2A-compliant agent: discover its capabilities via its agent card, send it a message, handle payment, and return the result. Use only when no local platform tool can fulfil the request.
Use when: Use when a task requires specialist capabilities beyond the local tool set. Call discover_agents first when the remote agent URL is unknown. Do not retry unchanged after error_type=advertised_price_exceeds_cap; pick another result or adjust the cap.
Limitations: Requires an allowlisted remote URL and sufficient delegation budget; the remote agent's price and capability claims are read from its card and are not independently verified. Involves real payment.
Alternatives: discover_agents, web_search
| Name | Required | Description | Default |
|---|---|---|---|
| agent_url | Yes | Base URL of the remote A2A agent (e.g. https://agent.example.com) | |
| task_type | No | Broad task class for routing telemetry; never include user data or task text. | general |
| task_description | Yes | Natural language description of the task to delegate |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Error message, if any |
| result | Yes | Text result extracted from the remote agent's response |
| status | Yes | A2A task state: completed, failed, etc. |
| cost_usdc | No | Cost of this delegation in atomic USDC |
| agent_name | Yes | Name of the remote agent (from its agent card) |
| error_type | No | Stable error type for delegation failures that require planner recovery. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, openWorldHint=true, idempotentHint=false, and the description adds critical behavior beyond that: it involves real payment, requires allowlisted URL and budget, and notes that remote agent claims are not verified. This goes beyond annotations by warning about payment and unverified capabilities. Slight deduction for not mentioning error handling beyond the specific error_type, but substantial transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with headings 'Use when', 'Limitations', 'Alternatives', making it scannable. It is appropriately sized given the tool's complexity. The opening sentence is concise, and the sections are efficient. Minor redundancy in mentioning 'payment' twice (in opening sentence and limitations), so 4 rather than 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (involving payment, remote agent, A2A protocol), the description covers key operational aspects: discovery, retry behavior, preconditions. An output schema exists, so return format is not required. It lacks detailed communication protocol expectations, but for a delegation tool, this is sufficient. Strong coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are documented in the schema. The description adds a small note about task_type being for telemetry (echoing schema's 'never include user data'), which aligns but doesn't add new meaning. It doesn't explain how task_description should be formatted beyond natural language, but baseline 3 is appropriate given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the action (delegate a task to a remote A2A-compliant agent), the resource (remote agent), and the outcome (return the result). It distinguishes itself from local tools by stating 'only when no local platform tool can fulfil the request', which differentiates it from siblings like http_fetch and web_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'Use when' conditions, requires calling discover_agents first if URL unknown, and warns against retrying on specific error_type. It also names alternatives (discover_agents, web_search) in the Alternatives section, giving clear guidance on when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_agentsDiscover AgentsARead-onlyInspect
Find opt-in remote A2A agents, published tool capabilities, endpoints, and public reputation status.
Use when: Use before delegate_to_agent when a specialist agent is needed but its URL is unknown.
Limitations: Discovery is read-only and does not add an agent to the org allowlist; delegate_to_agent remains authoritative.
Alternatives: delegate_to_agent
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Optional search across agent name, organization slug, or published tool name | |
| limit | No | Maximum number of agents to return |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| agents | Yes | |
| generated_at | Yes | |
| registration_endpoint | No | Endpoint where an organization can publish its own A2A endpoint. |
| registration_benefits_url | No | Machine-readable registration benefits, requirements, and non-guarantees. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces this while adding more: discovery 'does not add an agent to the org allowlist' and 'delegate_to_agent remains authoritative.' This is useful behavioral context beyond the structured annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, with a clear front-loaded purpose followed by labeled 'Use when,' 'Limitations,' and 'Alternatives' sections. Each section earns its place and avoids redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the read-only annotation, and the explicit routing to delegate_to_agent, the description is sufficiently complete. It covers purpose, usage timing, side-effect boundaries, and alternatives without needing to explain return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the two optional parameters (q and limit), so the schema already documents parameter meaning. The description adds no additional parameter-level detail, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Find') on a specific resource ('opt-in remote A2A agents, published tool capabilities, endpoints, and public reputation status'). It distinguishes the tool from name/tautology and references its intended role relative to delegate_to_agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it: 'before delegate_to_agent when a specialist agent is needed but its URL is unknown.' It also gives an exclusion by noting discovery does not add an agent to the allowlist, and names delegate_to_agent as the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_blockGet BlockARead-onlyInspect
Get block details (timestamp, gas used, base fee, miner, transaction count) for an Ethereum or Base block by number, hash, or 'latest'. Use to anchor events to a point in chain time.
Use when: Use when a question depends on when a block occurred, how full it was, or its base fee — for example dating a transaction or checking congestion at a specific height. For current fee levels use get_gas_price instead.
Limitations: One block per call; Ethereum mainnet and Base only. Historical base fee data depends on RPC node retention for older heights.
Alternatives: get_transaction, get_gas_price
| Name | Required | Description | Default |
|---|---|---|---|
| chain_id | No | Chain ID (1=Ethereum, 8453=Base) | |
| block_identifier | No | Block number, block hash, or 'latest'/'earliest'/'pending' | latest |
Output Schema
| Name | Required | Description |
|---|---|---|
| hash | Yes | |
| number | Yes | |
| gas_used | Yes | |
| timestamp | Yes | |
| base_fee_gwei | Yes | |
| transaction_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only readOnlyHint: true. The description adds valuable behavioral context beyond that: limitations ('One block per call', 'Ethereum mainnet and Base only') and the caveat that historical base fee data depends on RPC node retention. It does not contradict the read-only annotation and covers the key operational constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized into purpose, usage, limitations, and alternatives. It is front-loaded with the core function and each section earns its place. However, at seven sentences it is slightly longer than strictly necessary; still, no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values are already defined. The description covers what the tool does, when to use it, alternatives, and limitations. For a simple read-only block-fetch tool, this is complete enough for an agent to call it correctly without additional information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already explains both parameters (chain_id, block_identifier). The description mentions 'by number, hash, or latest' and 'Ethereum and Base', but these are also present in the schema. It adds no new parameter-level meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Get block details' and lists the exact fields (timestamp, gas used, base fee, miner, transaction count) and acceptable identifiers (number, hash, 'latest'). It also frames the purpose with 'Use to anchor events to a point in chain time', distinguishing it from related tools like get_transaction and get_gas_price.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes an explicit 'Use when' section with concrete examples (dating a transaction, checking congestion) and a direct exclusion: 'For current fee levels use get_gas_price instead.' It also lists alternatives (get_transaction, get_gas_price), giving the agent clear direction on when to choose this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chain_metricsGet Chain MetricsARead-onlyInspect
Compare blockchain ecosystem health via DeFiLlama: current TVL, 7/30-day TVL change, and aggregate fee activity. Pass chains such as ['Ethereum', 'Arbitrum', 'Solana'] for a focused comparison, or omit chains to inspect the highest-TVL ecosystems.
Use when: Use for ecosystem-level comparisons — which chains are growing, where fee activity concentrates, or how a chain's TVL trended. For a single protocol's economics use get_protocol_tvl instead.
Limitations: Third-party DeFiLlama analytics; historical and fee fields fail open (null) for uncovered chains. Not a real-time measure of chain throughput or security.
Alternatives: get_protocol_tvl, get_dex_volume
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window used when selecting the historical TVL points to inspect. | |
| limit | No | Maximum number of chain rows to return when the result is not explicitly filtered. | |
| chains | No | Optional chain names to compare, such as ['Ethereum', 'Arbitrum', 'Solana']. When omitted, return the highest-TVL chains up to limit. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| error | No | |
| chains | Yes | |
| error_type | No | |
| provenance | No | Source and freshness metadata for the DeFiLlama response. |
| total_available | Yes | |
| requested_chains | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only declare readOnlyHint=true, which is minimal. The description adds meaningful behavioral context: it names the third-party data source (DeFiLlama), states that historical and fee fields fail open as null for uncovered chains, and warns that this is not a real-time measure of chain throughput or security. These caveats materially affect how an agent should interpret and trust results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized: a compact opening sentence covering the core purpose and metrics, followed by clearly labeled 'Use when,' 'Limitations,' and 'Alternatives' sections. Every sentence contributes meaningful decision-support information, and the most important scoping statement is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has no required parameters, has an output schema, and carries only a readOnlyHint annotation, the description covers everything the agent needs: what the tool does, when to use it, what limits apply, and which siblings to fall back on. The additional caveats about null fields and non-real-time data complete the operational picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all three parameters. The description adds an example of chain filtering and an explanation of omission behavior, but the schema already provides equivalent detail for the chains parameter)SkipTo: 'Optional chain names to compare... When omitted, return highest-TVL chains up to limit.' Thus the description adds no significant semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Compare') with a clear resource ('blockchain ecosystem health via DeFiLlama') and enumerates the exact metrics returned: current TVL, 7/30-day TVL change, and aggregate fee activity. It also distinguishes itself from get_protocol_tvl and get_dex_volume by naming them directly, so an agent can tell this tool apart from sibling data tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use when' section explicitly states the intended ecosystem-level use cases and gives a concrete exclusion: for a single protocol's economics, use get_protocol_tvl. It also names get_dex_volume as an alternative and explains how the omit-chains behavior differs from passing an explicit chain list. This gives sufficient routing guidance without leaving anything to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_datetimeGet DatetimeARead-onlyInspect
Return the current UTC date and time as a formatted string and ISO 8601 timestamp, for grounding time-relative reasoning in the actual clock rather than training-data assumptions.
Use when: Use when a task must anchor on the current date or time — computing ages, windows, deadlines, or 'as of today' context. The runtime context block already states the date, so call this only when a specific strftime format or a precise timestamp is needed.
Limitations: UTC only — no timezone conversion. An unsupported strftime format silently falls back to the default format instead of erroring.
Alternatives: calculate, get_block
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | strftime format string for the output | %Y-%m-%d %H:%M:%S UTC |
Output Schema
| Name | Required | Description |
|---|---|---|
| iso8601 | Yes | |
| datetime | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the agent knows this is safe. The description adds valuable behavioral context beyond that: it states 'UTC only — no timezone conversion' and warns that 'An unsupported strftime format silently falls back to the default format instead of erroring.' This discloses failure modes and constraints, which is exactly the kind of context that helps an agent avoid surprises. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It front-loads the core purpose in the first sentence, then provides 'Use when' guidance, 'Limitations,' and 'Alternatives' in separate labeled sections. Every sentence earns its place; there is no fluff or redundancy. The structure makes it easy for an agent to quickly extract the key decision points.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter, no nested objects) and the presence of an output schema (indicated but not shown), the description is fully complete. It covers purpose, usage conditions, exclusions, limitations, and alternatives. There is no missing information an agent would need to correctly invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (the format parameter has a description), so the baseline is 3. The description adds semantic value by explaining the parameter is a strftime format string, reiterating the default behavior, and specifically noting the silent fallback on unsupported formats. This goes beyond the schema's terse description and helps the agent choose an appropriate format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Return the current UTC date and time as a formatted string and ISO 8601 timestamp.' This is a specific verb (return) with a precise resource (current UTC datetime), and it distinguishes itself from siblings by focusing on datetime retrieval. The added purpose of 'grounding time-relative reasoning' clarifies its intent without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use when' section explicitly enumerates scenarios (computing ages, windows, deadlines, 'as of today') and also provides a critical exclusion: 'The runtime context block already states the date, so call this only when a specific strftime format or a precise timestamp is needed.' This tells the agent exactly when NOT to call it, and it lists alternatives (calculate, get_block) for comparison. The guidance is actionable and prevents unnecessary calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_defi_positionsGet Defi PositionsARead-onlyInspect
Block-accurate DeFi positions for a wallet across Aave v3, Compound v3, Uniswap v3 LP, and Lido on Ethereum or Base. Returns Aave account health (collateral, debt, health factor, LTV) with per-reserve breakdown, Compound v3 market positions, Uniswap v3 LP positions by token ID, and on Ethereum the Lido stETH/wstETH balances with the current wstETH-to-stETH equivalent. Per-protocol failures are isolated — other protocols still return.
Use when: Use when a block-accurate single-wallet protocol snapshot is needed, including health factor and LP position detail. For broad all-chain discovery or net worth across many protocols use get_wallet_positions instead.
Limitations: On-chain RPC view of four protocol families on Ethereum and Base only; does not discover wallets' unknown or long-tail protocol positions. Compound v3 reports only a boolean liquidation flag — never state a numeric Compound health factor. Errors list which protocols were unavailable.
Alternatives: get_wallet_positions, get_liquidation_risk, get_wallet_portfolio
| Name | Required | Description | Default |
|---|---|---|---|
| chain_id | No | Chain ID (1=Ethereum, 8453=Base) | |
| wallet_address | Yes | Wallet address (0x…) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| errors | No | |
| aave_v3 | No | |
| chain_id | Yes | |
| uniswap_v3 | No | |
| compound_v3 | No | |
| lido_staking | No | |
| wallet_address | Yes | |
| data_block_number | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description aligns with that. It adds valuable behavioral context beyond annotations: per-protocol failure isolation, the fact that errors list unavailable protocols, and the warning that Compound v3 only reports a boolean liquidation flag rather than a numeric health factor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than minimal but well-organized with labeled sections: use-when, limitations, and alternatives. Content is front-loaded with the core purpose, and each section earns its place, though the repeated 'Use when:' phrase is mildly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering read-only safety, the description supplies everything else needed: invocation conditions, protocol scope, failure behavior, Compound caveat, and alternative tools. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents wallet_address and chain_id fully. The description reinforces the Ethereum/Base scope but adds no significant new parameter semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it returns block-accurate DeFi positions for a wallet across Aave v3, Compound v3, Uniswap v3 LP, and Lido. It also enumerates concrete return details like health factor, LP positions, and Lido balances, making the tool's purpose unmistakable and distinct from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'Use when' guidance, tells the agent to use get_wallet_positions for broad all-chain discovery, and lists alternatives including get_liquidation_risk and get_wallet_portfolio. Limitations such as chain scope and Compound's boolean-only flag further guide correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dex_quoteGet Dex QuoteARead-onlyInspect
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.
Use when: Choose when you need a best-execution Uniswap v3 swap quote on Ethereum or Base before executing a trade — e.g. price impact, output amount, or route selection.
Limitations: Quotes raw uint256 amounts with EIP-55 checksummed addresses only; native ETH is not quoted directly (pass WETH). Point-in-time at the returned block_number — do not cache.
Alternatives: get_token_price, get_dex_volume
| Name | Required | Description | Default |
|---|---|---|---|
| chain_id | No | 1 = Ethereum mainnet, 8453 = Base mainnet. Other chains unsupported. | |
| token_in | Yes | EIP-55 checksummed address of the token being sold. For native ETH, pass the WETH address (Ethereum: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; Base: 0x4200000000000000000000000000000000000006). | |
| amount_in | Yes | 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. | |
| token_out | Yes | EIP-55 checksummed address of the token being bought. |
Output Schema
| Name | Required | Description |
|---|---|---|
| chain_id | Yes | |
| token_in | Yes | |
| amount_in | Yes | |
| token_out | Yes | |
| amount_out | Yes | |
| block_number | Yes | |
| no_liquidity | Yes | |
| fee_tier_used | Yes | |
| effective_rate | Yes | |
| quotes_per_tier | Yes | |
| amount_out_human | Yes | |
| amount_in_decimals | Yes | |
| amount_out_decimals | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While the annotation readOnlyHint=true already indicates a safe read, the description adds substantial behavioral context: it is a point-in-time quote, should not be cached, returns no_liquidity=true when no pool exists, and provides a per-tier breakdown. It also warns about native ETH and the need to pass WETH. These details go beyond the annotation and help the agent use the tool correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clear sections (function, use when, limitations, alternatives) and front-loads the core purpose. However, some redundancy exists: the limitations section repeats the native ETH and point-in-time constraints already mentioned in the first paragraph. A lighter rewrite would tighten it, but the structure is still effective and each section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists (which presumably details the return structure), the description covers all necessary operational aspects: supported chains, fee tiers, input format requirements, caching warning, and alternative tools. Nothing an agent needs to invoke the tool correctly is missing. Even without the output schema, the description would be fairly complete, and with it, it is fully sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description enriches parameter usage with practical examples: it explains raw uint256 and gives common token decimals for amount_in, provides specific WETH addresses for native ETH, and explicitly instructs not to call read_contract for decimals. This substantially improves usability beyond the schema's own descriptions, hence a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb+resource: 'Get the best Uniswap v3 swap quote on Ethereum or Base via direct on-chain QuoterV2 calls.' It enumerates the chains, the mechanism (QuoterV2), the fee tiers, and the selection criterion (highest output amount). It also distinguishes itself from siblings by naming alternatives (get_token_price, get_dex_volume) and stating exactly what it returns, so an agent can tell it apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'Use when' section that specifies the intended context: 'when you need a best-execution Uniswap v3 swap quote on Ethereum or Base before executing a trade.' It also lists alternatives and their roles, making clear when to prefer this tool versus get_token_price or get_dex_volume. The guidance is direct and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dex_volumeGet Dex VolumeARead-onlyInspect
Compare decentralized exchange activity via DeFiLlama: 24h/7d/30-day volume, period-over-period changes, and each protocol's share of reported global 24-hour DEX volume. Filter by protocol and rank by a 1-, 7-, or 30-day lookback window.
Use when: Use for landscape questions — which DEXs dominate volume, how activity shifted week-over-week, or a specific protocol's relative share. For executable swap pricing use get_dex_quote instead.
Limitations: Third-party DeFiLlama reporting, not on-chain truth; coverage gaps understate smaller protocols. 24-hour share is computed against the unfiltered global total, so filtered results retain landscape context.
Alternatives: get_dex_quote, get_chain_metrics
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of DEX protocols to return. | |
| protocols | No | Optional protocol names or DeFiLlama slugs, such as ['uniswap-v3', 'curve-dex']. When omitted, return the largest DEX protocols. | |
| lookback_days | No | Window used to rank the returned protocols: 1, 7, or 30 days (nearest supported window is used). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| dexes | Yes | |
| error | No | |
| error_type | No | |
| total_matching | Yes | |
| total_available | Yes | |
| volume_share_basis | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds meaningful behavioral context beyond that: data comes from third-party DeFiLlama reporting rather than on-chain truth, coverage gaps may understate smaller protocols, and the 24h share is computed against the unfiltered global total. These caveats materially inform how an agent should interpret results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly structured with clear sections: core purpose first, then use cases, limitations, and alternatives. Every sentence earns its place, and the most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with 3 optional parameters and an output schema, the description covers the purpose, data source, caveats, and alternatives. Nothing an agent needs in order to select and invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all three parameters. The description adds light context by mapping 'protocols' to filtering and 'lookback_days' to ranking, but it does not provide substantial semantic value beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Compare') with a clear resource (decentralized exchange activity via DeFiLlama) and enumerates the exact metrics returned: 24h/7d/30-day volume, period-over-period changes, and global share. It also distinguishes itself from siblings by naming get_dex_quote and get_chain_metrics, so an agent can tell this tool apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use when' section explicitly identifies the intended landscape questions, and the limitation that executable swap pricing should use get_dex_quote instead provides a clear exclusion. The Alternatives line further reinforces routing, leaving no ambiguity about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_erc20_balanceGet Erc20 BalanceARead-onlyInspect
Get the exact on-chain ERC-20 balance of a wallet for one token contract, normalized by decimals and returned with the token's symbol. Use for a precise single-token check.
Use when: Use when a specific token contract's balance must be verified block-accurately — e.g. confirming funds before an approval or transfer. For a multi-asset portfolio view use get_wallet_portfolio instead.
Limitations: One token contract per call on Ethereum or Base; the contract address is required, so unknown tokens cannot be looked up by symbol. Returns raw balance data only — no USD valuation.
Alternatives: get_wallet_portfolio, get_eth_balance
| Name | Required | Description | Default |
|---|---|---|---|
| chain_id | No | Chain ID (1=Ethereum, 8453=Base) | |
| token_address | Yes | ERC-20 token contract address (0x…) | |
| wallet_address | Yes | Wallet address (0x…) |
Output Schema
| Name | Required | Description |
|---|---|---|
| chain_id | Yes | |
| balance_raw | Yes | |
| token_symbol | Yes | |
| token_address | Yes | |
| token_decimals | Yes | |
| wallet_address | Yes | |
| balance_formatted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only include readOnlyHint, so the description carries the burden of behavioral disclosure. It discloses the output format (normalized by decimals, symbol), the limitation of one token per call, the need for a contract address (no symbol lookup), and the lack of USD valuation. It does not contradict the readOnlyHint. Slightly more could be said about error handling, but the core behavior is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured into sections (purpose, use when, limitations, alternatives) and front-loads the core function. While it's longer than a single sentence, each section adds distinct value and there is no redundancy. It earns its length without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with an output schema and 100% parameter coverage, the description covers the key operational context: when to use, limitations, and output characteristics. It does not mention potential error conditions or rate limits, but for a simple balance check, these are minor. The description is sufficiently complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented. The description adds the clarification that token_address must be a contract address and cannot be a symbol, and mentions the supported chains (Ethereum/Base). This is a modest enhancement over the schema, which already labels the token_address as a contract address. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (Get), the resource (on-chain ERC-20 balance of a wallet for one token contract), and adds specific detail (normalized by decimals, returned with symbol). It explicitly differentiates from sibling tools like get_wallet_portfolio (multi-asset) and get_eth_balance (ETH), so an agent can select it correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'Use when' guidance with a concrete example (confirming funds before approval/transfer), explicitly says when not to use it (multi-asset portfolio → get_wallet_portfolio), and lists alternatives at the end. This is fully actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eth_balanceGet Eth BalanceARead-onlyInspect
Get the exact on-chain native ETH balance of an address on Ethereum or Base, in wei and ether. get_wallet_portfolio already includes native ETH in its holdings — call this only for a standalone balance without a portfolio scan.
Use when: Use when a wallet's gas-availability or standalone ETH amount must be verified block-accurately. Do not call after or alongside get_wallet_portfolio — the holdings list already includes native ETH.
Limitations: Native ETH only; ERC-20 balances require get_erc20_balance. Requires an EIP-55 checksummed address. Ethereum mainnet and Base only.
Alternatives: get_wallet_portfolio, get_erc20_balance
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Ethereum address (0x…) | |
| chain_id | No | Chain ID (1=Ethereum, 8453=Base) |
Output Schema
| Name | Required | Description |
|---|---|---|
| address | Yes | |
| chain_id | Yes | |
| balance_eth | Yes | |
| balance_wei | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses important behavioral constraints: native ETH only, Ethereum mainnet and Base only, EIP-55 checksummed address requirement, and block-accurate on-chain exactness. This gives the agent safety and compatibility information that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The heading-based structure is clear and front-loaded, but there is some redundancy: the fact that get_wallet_portfolio already includes native ETH appears twice, and 'Use when:' is followed by 'Use when'. Minor repetition keeps it from being a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read-only tool with an output schema present, the description covers purpose, usage timing, limitations, and alternatives. Nothing essential is missing for an agent to decide whether to call this tool and do so correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful parameter context by requiring an EIP-55 checksummed address and clarifying chain support (Ethereum vs Base). It also explains the output units in wei and ether, which helps the agent interpret results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: getting the exact on-chain native ETH balance of an address on Ethereum or Base, in wei and ether. It explicitly distinguishes itself from get_wallet_portfolio and get_erc20_balance, so an agent can immediately tell which tool fills this niche.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance for gas-availability checks and standalone balance verification, and clearly instructs not to call it after or alongside get_wallet_portfolio. It also names the alternative tools for portfolio and ERC-20 balances.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gas_priceGet Gas PriceARead-onlyInspect
Get current EIP-1559 gas fees on Ethereum or Base: base fee, priority fee, next-block base fee estimate, and congestion (gas_used_ratio >0.5 busy, >0.9 very congested). Optional USD estimates cover a simple transfer and a swap-like transaction. Cached 10 seconds per chain.
Use when: Use before advising a transaction — to time execution, size a gas budget, or judge congestion. Call once per decision; the 10-second cache makes rapid re-calls pointless.
Limitations: Point-in-time estimate that changes every block; USD figures are rough heuristics at 21k/150k gas, not an execution quote. Ethereum mainnet and Base only.
Alternatives: get_block, get_dex_quote
| Name | Required | Description | Default |
|---|---|---|---|
| chain_id | No | Chain ID (1=Ethereum, 8453=Base) | |
| include_usd_estimate | No | If true, include ETH spot price and rough USD cost estimates for a simple transfer (21k gas) and a swap-like transaction (150k gas). |
Output Schema
| Name | Required | Description |
|---|---|---|
| chain_id | Yes | |
| base_fee_gwei | Yes | |
| eth_price_usd | No | |
| gas_price_gwei | Yes | |
| gas_used_ratio | Yes | |
| priority_fee_gwei | Yes | |
| next_base_fee_gwei | Yes | |
| estimated_swap_cost_usd | No | |
| estimated_transfer_cost_usd | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates this is a safe read; the description goes beyond that by adding the 10-second cache, the point-in-time/change-every-block caveat, and the rough-heuristic limitation on USD figures. That is meaningful context an agent needs before acting on the output. A small deduction because the description does not explicitly mention rate limits or error behavior, but those are not critical for a read-only gas price call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tight and front-loaded: the first sentence states what the tool returns, the second gives use guidance, and the third lists limitations and alternatives. Every sentence earns its place; there is no filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with only two optional parameters, a 100%-coverage schema, and an output schema present, the description is complete enough: it covers purpose, usage timing, cache behavior, limitations, and alternatives. The only small gap is the absence of explicit error/edge-case behavior (e.g., unsupported chain handling), which is minor and not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already explains both parameters. The description adds value by clarifying how include_usd_estimate is used (rough heuristics at 21k/150k gas) and by stating the cache implication (repeated calls are wasteful), which goes beyond simply restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (EIP-1559 gas fees on Ethereum/Base) and identifies the concrete data returned: base fee, priority fee, next-block estimate, and congestion thresholds. It also explicitly scopes the tool by chain (Ethereum and Base only) and by what it is not (an execution quote). This distinguishes it from the sibling tools get_block and get_dex_quote without needing to inspect their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('Use before advising a transaction') and when-not-to (calls are pointless within the 10-second cache). It also names the alternatives (get_block, get_dex_quote) to divert the agent appropriately. No exclusion is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lending_ratesGet Lending RatesARead-onlyInspect
Get current on-chain lending supply/borrow APYs for Aave v3 reserves and Compound v3 markets on Ethereum or Base, with per-asset snapshots and Compound utilization. Use for protocol-specific yield comparisons such as USDC on Aave vs Compound.
Use when: Use for protocol-specific lending-rate questions (e.g. 'Aave vs Compound USDC rates'). Prefer over get_yield_rates when the protocols are known; use get_yield_rates for broad pool discovery across many protocols. Do not fall back to web_search when this returns errors — report them.
Limitations: On-chain snapshots of Aave v3 and Compound v3 on Ethereum and Base only; not a multi-protocol yield aggregator. Rates are point-in-time and change per block. Returns an errors list — report each unavailable protocol explicitly and treat empty rates with empty errors as transient RPC unavailability.
Alternatives: get_yield_rates, get_defi_positions, get_liquidation_risk
| Name | Required | Description | Default |
|---|---|---|---|
| assets | No | Optional asset-symbol filter (e.g., ['USDC','DAI']). Case-insensitive. Max 20 symbols. | |
| chain_id | No | Chain ID (1=Ethereum, 8453=Base). | |
| protocol | No | Protocol to query: 'aave-v3', 'compound-v3', or 'all'. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| rates | Yes | |
| errors | No | |
| chain_id | Yes | |
| protocol | Yes | |
| data_block_number | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=true in annotations, the description carries the behavioral burden and does so thoroughly. It discloses the errors list behavior, the point-in-time nature of rates, the 'empty rates with empty errors' transient RPC condition, and the protocol scope limitation. This goes well beyond what annotations convey and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections ('Use when', 'Limitations', 'Alternatives') and the core purpose is front-loaded in the first sentence. Every sentence adds either usage guidance, behavioral context, or routing information, with no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only query tool with an output schema present, the description covers purpose, selection criteria, limitations, error-reporting expectations, and alternatives. It is complete enough for an agent to invoke it correctly, including edge cases like empty errors and per-block rate changes, without needing additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter (assets, chain_id, protocol) is already documented with type, defaults, and constraints. The description adds context about per-asset snapshots and protocol-specific yield comparisons, but it does not materially extend the parameter semantics beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Get'), a precise resource ('on-chain lending supply/borrow APYs'), and explicit scope ('Aave v3 reserves and Compound v3 markets on Ethereum or Base'). It distinguishes this tool from get_yield_rates by naming it directly, so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use when' section gives explicit conditions ('protocol-specific lending-rate questions... Prefer over get_yield_rates when protocols are known'), provides a fallback rule ('use get_yield_rates for broad pool discovery'), and instructs the agent to report errors rather than falling back to web_search. Alternatives are also listed at the end, leaving no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_liquidation_riskGet Liquidation RiskARead-onlyInspect
Assess DeFi liquidation risk for up to 50 wallets across Aave v3 and Compound v3 on Ethereum or Base. Returns per-wallet health factor, tiered risk classification (liquidatable, critical, warning, caution, healthy, no_debt), and an overall_tier aggregate. Per-protocol failures are isolated — one protocol's RPC error does not blank the other's result.
Use when: Use for multi-wallet batch risk assessment (2+ wallets). For a single-wallet DeFi analysis use get_defi_positions, which already includes risk metrics. Use assess_counterparty_risk when the question is counterparty trust rather than position health.
Limitations: View-only scan of Aave v3 and Compound v3 on Ethereum and Base with hardcoded market addresses; not a liquidation simulation or guarantee. Compound v3 exposes only a boolean liquidation flag — no numeric health factor. Duplicate wallet addresses are silently removed.
Alternatives: get_defi_positions, assess_counterparty_risk, get_wallet_positions
| Name | Required | Description | Default |
|---|---|---|---|
| chain_id | No | Chain ID (1=Ethereum, 8453=Base) | |
| wallet_addresses | Yes | Wallet addresses to assess (max 50; duplicates are silently removed). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| results | Yes | |
| summary | Yes | |
| chain_id | Yes | |
| data_block_number | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description explicitly warns that this is a 'View-only scan... not a liquidation simulation or guarantee', discloses that Compound v3 only exposes a boolean flag, and notes that duplicate addresses are silently removed. It also reveals per-protocol failure isolation and hardcoded market addresses, which are material behavioral details an agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clear labeled sections (summary, use when, limitations, alternatives) with no filler sentences. The core capability is front-loaded, and every subsequent sentence adds decision-relevant information, though there is minor repetition between the 'Use when' and 'Alternatives' sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with output schema and readOnly annotation, the description covers all necessary selection and invocation context: exact protocols/chains, batch size, aggregate output, sibling routing, and important limitations. Nothing critical is missing for an agent to decide whether and how to call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description need not repeat parameter details. It does restate the 'Ethereum or Base' chain choices and the 50-wallet/duplicate-removal constraints already present in the schema, but adds no new parameter-level detail such as address format or default-chain behavior beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb ('Assess'), a precise resource ('DeFi liquidation risk'), and scoping constraints ('up to 50 wallets', 'Aave v3 and Compound v3 on Ethereum or Base'). The description also enumerates concrete outputs (health factor, tiered risk classification, overall_tier), making it immediately distinguishable from portfolio or position tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use when' section gives an explicit condition ('multi-wallet batch risk assessment (2+ wallets)') and names the correct alternative for single-wallet analysis (get_defi_positions). It also provides a clear decision rule for assess_counterparty_risk, and repeats the route in the 'Alternatives' section.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_protocol_tvlGet Protocol TvlARead-onlyInspect
Get Total Value Locked for one or many DeFi protocols from DeFiLlama: current USD TVL, 7/30-day change, fees and revenue when reported, per-chain breakdown, and optional daily historical series. Batch multiple protocols via protocols=[...] — batch responses return one compact economic summary per protocol; single-protocol calls add chain and historical detail. Supports 3,000+ protocols; use DeFiLlama slugs ('aave-v3', 'uniswap-v3'); common aliases are auto-corrected.
Use when: Use for protocol-level economic questions — size, growth, fees, or revenue of a specific protocol. For 2+ protocols always batch in one call rather than calling per-protocol. Pass include_historical=true with days when a trend is needed; without it the response is a current TVL scalar. For ecosystem-level chain comparisons use get_chain_metrics instead.
Limitations: Third-party DeFiLlama analytics, not on-chain truth. Upstream revenue failures surface as revenue_error_type and null economic fields are data gaps — never fabricate values for them.
Alternatives: get_chain_metrics, get_yield_rates, get_dex_volume
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window in days for the historical series (only used when include_historical=True). | |
| protocol | No | 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=[...]. | |
| protocols | No | Optional batch mode: list of DeFiLlama protocol slugs. When provided, the tool returns one TVL result object per protocol. | |
| include_historical | No | If true, return a daily historical TVL series for the requested window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that this is third-party DeFiLlama analytics rather than on-chain truth, explains that upstream revenue failures surface as revenue_error_type, and warns that null economic fields are data gaps to never fabricate. It also describes batch-versus-single response differences, adding substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: capability, usage guidance, limitations, alternatives. Every sentence carries useful information, and the use of short labeled sections makes the guidance easy to scan without wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description sufficiently explains what the tool returns: current TVL, historical series, fees/revenue, per-chain breakdown, and batch versus single response shapes. It also covers protocol slug format, alias behavior, and data-quality caveats, so an agent has enough context to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description goes further by explaining the protocols=[...] batch mode, the compact batch response versus detailed single-protocol response, the meaning of include_historical and days, and the auto-correction of common aliases. This materially helps an agent choose and populate parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Get Total Value Locked for one or many DeFi protocols from DeFiLlama' and enumerates concrete outputs like current USD TVL, 7/30-day change, fees, revenue, and per-chain breakdown. It also distinguishes itself from siblings by framing the tool for 'protocol-level economic questions' rather than ecosystem-level chain comparisons.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use when' section explicitly states when to use this tool, when to batch, when to set include_historical=true, and when to choose get_chain_metrics instead. The 'Alternatives' line further reinforces routing by naming related sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_token_approvalsGet Token ApprovalsARead-onlyInspect
Block-accurate audit of ERC-20 allowances for a wallet across curated DeFi spenders (Uniswap, Aave, Compound, 1inch, 0x, OpenSea) on Ethereum or Base. Flags unlimited approvals by risk level (high=unknown spender, medium=trusted protocol, low=bounded). Use before swaps or after security incidents to detect active exploit vectors.
Use when: Use for a free, block-accurate Ethereum/Base check of an address's exposure to the curated spender list. For broad all-chain spender discovery, hacked/abandoned flags, or NFT-adjacent exposure use get_wallet_approvals instead.
Limitations: Covers only the tracked-asset registry and curated spenders — untracked tokens and custom spenders are excluded. Does not inspect NFT approvals or off-chain Permit2 sub-permits. An error field marks results as incomplete rather than clean.
Alternatives: get_wallet_approvals, assess_counterparty_risk
| Name | Required | Description | Default |
|---|---|---|---|
| tokens | No | Token contract addresses to check (max 50). Defaults to the platform tracked token list. | |
| chain_id | No | Chain ID (1=Ethereum, 8453=Base) | |
| spenders | No | Spender contract addresses to check (max 20). Defaults to the curated DeFi protocol list. | |
| wallet_address | Yes | Wallet address (0x…) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| error | No | |
| chain_id | Yes | |
| approvals | Yes | |
| risk_summary | Yes | |
| wallet_address | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, but the description adds extensive behavioral context beyond that: the audit is block-accurate, flags unlimited approvals by risk level, covers only tracked assets/curated spenders, does not inspect NFT or Permit2 approvals, and uses an error field to mark incomplete results rather than returning a clean bill of health. No contradiction with the readOnly annotation exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is denser than necessary and has slight redundancy ('block-accurate' appears twice, and 'use get_wallet_approvals instead' appears in both the Use-when and Alternatives sections). However, the labeled sections — Use when, Limitations, Alternatives — make it scannable and every sentence adds useful selection or behavioral detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description covers what the tool audits, when to use it, what it misses, and how errors are signaled, while the output schema handles return-value structure. All parameter meanings and defaults are available in the schema, and the limitations are explicit. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all four parameters (100% coverage), and the description goes further by adding useful semantics: curated spender names, the risk-level classification, max allowances of 50 tokens and 20 spenders, and the exclusion of untracked tokens/custom spenders. This materially helps an agent choose correct values beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource: 'block-accurate audit of ERC-20 allowances for a wallet across curated DeFi spenders.' It names the exact protocols, chains, and risk classification behavior, and explicitly contrasts itself with the sibling get_wallet_approvals, so an agent can distinguish it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete triggers ('Use before swaps or after security incidents'), a direct 'Use when' statement, and an explicit alternative: 'For broad all-chain spender discovery... use get_wallet_approvals instead.' The 'Alternatives' section reinforces routing with assess_counterparty_risk. This leaves no ambiguity about when to select this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_token_priceGet Token PriceARead-onlyInspect
Get current price, 24h change, market cap, FDV, and volume for one or more crypto tokens. Accepts ticker symbols, full names, or CoinGecko IDs; unknown symbols resolve automatically. Batch up to 50 tokens. Reuse price_usd/value_usd already returned by get_wallet_portfolio instead of re-calling.
Use when: Use for spot pricing of named tokens — including batched multi-token queries. Do not call for tokens whose price get_wallet_portfolio already returned, or for address-only unknown tokens (report them as unrecognized). For historical windows use get_token_price_historical.
Limitations: CoinGecko spot data; point-in-time and not an executable swap quote. Bare 0x addresses are not resolvable and should be treated as unknown tokens.
Alternatives: get_token_price_historical, get_wallet_portfolio, get_dex_quote
| Name | Required | Description | Default |
|---|---|---|---|
| tokens | Yes | Token symbols or CoinGecko IDs (e.g. ['BTC', 'ETH', 'SOL']) | |
| vs_currency | No | Quote currency (usd, eur, gbp, btc, eth) | usd |
Output Schema
| Name | Required | Description |
|---|---|---|
| prices | Yes | |
| vs_currency | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers safety, and the description goes beyond it by disclosing the data source (CoinGecko spot data), the point-in-time nature, the fact that it is not an executable swap quote, and the resolution behavior for unknown symbols and bare 0x addresses. It stops short of a 5 because it omits rate-limit or freshness disclosures, but it adds substantial behavioral context the annotation alone would not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clearly labeled sections — overview, Use when, Limitations, Alternatives — and every sentence carries decision-relevant information. The core purpose is front-loaded, and the scoping/exclusion guidance is compact and immediately actionable. Length is justified by the volume of distinct behavioral constraints conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with a rich output schema and a readOnlyHint annotation, the description covers all an agent needs to call it correctly: what it returns, accepted inputs, batch limits, when to prefer siblings, when not to call, and known failure modes (unresolvable addresses). The existence of an output schema means return-value documentation is not the description's job, and nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it reveals that full names are accepted (schema only says 'symbols or CoinGecko IDs'), that unknown symbols resolve automatically, and that batch size caps at 50. The vs_currency parameter is also implicitly disambiguated by the 'Reuse price_usd/value_usd' guidance. These additions lift it above the bare baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair — 'Get current price, 24h change, market cap, FDV, and volume for one or more crypto tokens' — and explicitly names sibling alternatives (get_token_price_historical, get_wallet_portfolio, get_dex_quote). It also states the accepted input forms (tickers, full names, CoinGecko IDs) and batch capacity, leaving no ambiguity about what the tool is and is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use when' section gives explicit positive conditions ('spot pricing of named tokens — including batched multi-token queries') and explicit exclusions ('Do not call for tokens whose price get_wallet_portfolio already returned, or for address-only unknown tokens'). It also routes historical needs to get_token_price_historical and lists an Alternatives section — exactly the when/when-not/alternative guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_token_price_historicalGet Token Price HistoricalARead-onlyInspect
Get historical crypto prices over a 1–365 day window: period statistics (start, end, % change, high, low), a downsampled daily series, high_30d, std_30d, and dca_baseline_90d. Use for period comparisons and trend analysis; prefer over web_search for time-comparative financial queries. Pass stats_only=true when the daily series is unnecessary.
Use when: Use for time-comparative financial questions — month-over-month, YTD, volatility, or DCA baselines. Prefer over web_search for such queries. Use the pre-computed stats directly; do not re-derive them with calculate.
Limitations: Daily granularity (downsampled), max 365-day window, CoinGecko coverage only. Check dca_baseline_90d_partial before relying on the baseline — incomplete history yields a partial baseline.
Alternatives: get_token_price, web_search
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window in days (1–365). 1=5-min granularity, 2-90=hourly, 91+=daily. | |
| tokens | Yes | Token symbols or CoinGecko IDs (e.g. ['BTC', 'ETH']). Max 10 per call. | |
| stats_only | No | If true, omit the daily price series and return period stats plus precomputed 30-day high/volatility and 90-day DCA baseline metrics. | |
| vs_currency | No | Quote currency (usd, eur, gbp, btc, eth). Lowercase 3–10 letters. | usd |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | Yes | |
| tokens | Yes | |
| vs_currency | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations include readOnlyHint=true, so the safety profile is already known. The description adds value beyond that by disclosing the 1–365 day window, daily downsampling granularity, CoinGecko coverage limitation, and the partial dca_baseline_90d caveat. It stops short of describing error conditions (e.g., unknown token symbols), which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (output summary, use-when, limitations, alternatives) and front-loads the key capability. It is slightly longer than strictly necessary — the use-when section partly repeats the opening paragraph — but every sentence earns its place, and the repetition is pedagogically useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 100% schema coverage, the output schema, and the readOnly annotation, the description covers the remaining semantic ground: when to prefer this tool, what its limits are, and how to avoid misusing the partial DCA baseline. A fully complete description would also mention handling of invalid token symbols or the exact meaning of 'downsampled', but these are minor given the rich schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so per the rubric baseline is 3. The description earns an extra point by explaining when stats_only matters and by adding the usage semantics for the days parameter (1=5-min, 2-90=hourly, 91+=daily) — though that granularity note actually lives in the schema, the description's guidance on stats_only and the DCA baseline caveat adds meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (historical crypto prices), the action (get), and enumerates the concrete outputs (period stats, daily series, high_30d, std_30d, dca_baseline_90d). It explicitly contrasts with get_token_price and web_search, so an agent can distinguish this tool from its siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('time-comparative financial questions — month-over-month, YTD, volatility, or DCA baselines'), a preference rule ('Prefer over web_search'), and a performance tip ('Pass stats_only=true when the daily series is unnecessary'). It also warns against re-deriving stats with calculate, naming the alternative tool directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transactionGet TransactionARead-onlyInspect
Get details and receipt for one Ethereum or Base transaction by hash: bounded calldata, normalized event logs, transaction index, and receipt-derived effective gas price and fee when available. Use to verify a specific transaction's status and outcome.
Use when: Use when one known transaction must be verified — status, logs, gas paid, or execution outcome. To understand what the calldata means use decode_transaction; for wallet-wide activity use get_wallet_history.
Limitations: One transaction hash per call on Ethereum or Base; pending transactions may not resolve yet. Calldata is returned bounded, not decoded — use decode_transaction for semantic decoding.
Alternatives: decode_transaction, get_block, get_wallet_history
| Name | Required | Description | Default |
|---|---|---|---|
| tx_hash | Yes | Transaction hash (0x…) | |
| chain_id | No | Chain ID (1=Ethereum, 8453=Base) |
Output Schema
| Name | Required | Description |
|---|---|---|
| logs | No | |
| status | No | 1=success, 0=revert, None=pending |
| fee_eth | No | |
| fee_wei | No | |
| tx_hash | Yes | |
| chain_id | Yes | |
| gas_used | Yes | |
| value_eth | Yes | |
| input_data | No | Hex calldata, bounded to 8 KiB |
| to_address | Yes | |
| block_number | Yes | |
| from_address | Yes | |
| gas_price_gwei | Yes | |
| logs_truncated | No | |
| transaction_index | No | |
| input_data_truncated | No | |
| effective_gas_price_gwei | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation already covers the safety profile, lowering the burden. The description builds on it with genuinely useful behavioral notes: one transaction per call, pending transactions may not resolve yet, and calldata is returned bounded rather than decoded. No contradiction with the annotation — 'Get details' is consistent with a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized into Use when / Limitations / Alternatives sections, and the core function is front-loaded in the first sentence. It is slightly repetitive (decode_transaction is cited three times), but each section earns its place with distinct information rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be restated. With 2 params (one required, 100% schema coverage), a read-only annotation, and a description covering scope, limitations, and alternatives, nothing essential for correct invocation is missing. It is complete for a moderately complex lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both tx_hash (0x… hash) and chain_id (1=Ethereum, 8453=Base) with defaults. The description reiterates the Ethereum/Base scope and hash-based lookup but adds only marginal parameter detail beyond the schema. Baseline 3 is appropriate since the schema carries the parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb + resource ('Get details and receipt for one Ethereum or Base transaction by hash') and enumerates concrete outputs (bounded calldata, normalized event logs, transaction index, effective gas price). It explicitly disambiguates from siblings by naming decode_transaction and get_wallet_history as different tools, so an agent can select it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
An explicit 'Use when' section states the exact triggering condition (verifying one known transaction's status/outcome) and gives direct alternatives: decode_transaction for calldata meaning, get_wallet_history for wallet-wide activity, and get_block in the Alternatives list. This is above-and-beyond guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_wallet_approvalsGet Wallet ApprovalsARead-onlyInspect
Inspect a wallet's current ERC-20 token authorization exposure on one DeBank-supported chain. Returns discovered spenders, USD exposure, protocol attribution, and hacked or abandoned protocol flags. This is broader than the curated block-accurate get_token_approvals tool.
Use when: Use when broad spender discovery or cross-chain security screening is needed. Call once per chain because DeBank requires a chain_id. Use get_token_approvals for a free, block-accurate Ethereum or Base scan of curated tokens and spenders.
Limitations: The result is third-party analytics and may be stale. It covers token approvals only, not NFT approvals or off-chain Permit2 sub-permits; each chain consumes a separate billable provider call.
Alternatives: get_token_approvals
| Name | Required | Description | Default |
|---|---|---|---|
| chain_id | Yes | DeBank chain identifier, for example eth, arb, or base | |
| wallet_address | Yes | EVM wallet address (0x-prefixed) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| errors | No | |
| chain_id | Yes | |
| approvals | No | |
| provenance | Yes | |
| data_complete | Yes | |
| wallet_address | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint: true, so the description carries the burden of behavioral disclosure. It adds valuable context: results are third-party analytics that may be stale, it covers only token approvals (not NFT or Permit2), and each chain consumes a separate billable provider call. No contradiction with annotations; it enriches the safety profile beyond the bare read-only hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with clear sections (purpose, use-when, limitations, alternatives) and is front-loaded with the primary purpose. Every sentence earns its place; no filler. Length is appropriate for the tool's complexity and the need to differentiate from a sibling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (so return format need not be detailed), the description covers the essential aspects: what it inspects, what it returns (discovered spenders, exposure, protocol attribution, flags), limitations (staleness, scope, billable calls), and alternatives. Nothing an agent needs to decide and invoke correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptive parameter titles and examples, so the baseline is 3. The description adds usage-level semantics by noting 'Call once per chain' and implying the need for multiple calls for cross-chain screening, which clarifies the chain_id's role. It also frames wallet_address as an EVM address, matching the schema. This modest addition justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Inspect a wallet's current ERC-20 token authorization exposure on one DeBank-supported chain.' It clearly distinguishes from the sibling tool get_token_approvals by stating it is broader than that curated tool. The purpose is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('when broad spender discovery or cross-chain security screening is needed') and when not to ('Use get_token_approvals for a free, block-accurate Ethereum or Base scan'). It also instructs to call once per chain because DeBank requires a chain_id, covering both usage context and constraints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_wallet_historyGet Wallet HistoryARead-onlyInspect
Get one page of decoded transaction history for an EVM wallet across DeBank-supported chains. Returns send, receive, and approval categories with protocol, token, exchange, gas, and USD metadata. Use the returned next_cursor as start_time to page backward.
Use when: Use for wallet activity discovery, protocol interaction history, exchange exposure, and gas analysis. Page backward with next_cursor for older activity. Use get_transaction or decode_transaction when one known transaction needs block-level details.
Limitations: DeBank returns at most 20 entries per call and the data may be stale. This tool is not a complete ledger, PnL engine, or cost-basis calculator because historical execution prices and all transfer semantics are not guaranteed.
Alternatives: get_transaction, decode_transaction
| Name | Required | Description | Default |
|---|---|---|---|
| chain_ids | No | Optional DeBank chain identifiers; omit to query all supported chains. | |
| page_count | No | Number of history entries to request (maximum 20). | |
| start_time | No | Return entries earlier than this Unix timestamp for cursor pagination. | |
| wallet_address | Yes | EVM wallet address (0x-prefixed) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| errors | No | |
| cex_dict | No | |
| has_more | No | |
| chain_ids | Yes | |
| page_count | Yes | |
| provenance | Yes | |
| start_time | Yes | |
| token_dict | No | |
| next_cursor | No | |
| history_list | No | |
| project_dict | No | |
| data_complete | Yes | |
| wallet_address | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, and the description goes well beyond that by disclosing the 20-entry per call limit, potential staleness of data, and semantic limitations around execution prices and transfer semantics. It also explains the cursor-based pagination behavior ('Use the returned next_cursor as start_time to page backward'), which is not visible from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with distinct sections for purpose, usage, limitations, and alternatives. It is front-loaded with the core action and every sentence carries useful information; even the alternative references are justified by giving selection criteria.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderate complexity, 100% schema coverage, output schema presence, and a read-only annotation, the description is complete. It covers what the tool does, when to use it, its limitations, pagination mechanics, and alternatives, so an agent has enough context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful context by linking the start_time parameter to the returned next_cursor and clarifying page_count's maximum, which helps an agent use pagination correctly. This goes slightly beyond the schema's own parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get one page of decoded transaction history') with a clear resource ('EVM wallet across DeBank-supported chains') and scope (send, receive, approval categories). It also names sibling alternatives, so an agent can distinguish it from get_transaction and decode_transaction without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes an explicit 'Use when' section covering wallet activity discovery, protocol interaction history, exchange exposure, and gas analysis责任人. It also provides explicit routing guidance: use get_transaction or decode_transaction when a known transaction needs block-level details, and clarifies the tool is not a complete ledger or PnL engine.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_wallet_portfolioGet Wallet PortfolioARead-onlyInspect
Get aggregated token holdings with USD values for a wallet address. Tracks 19 major assets on Ethereum and 12 on Base, including spot, lending, liquid-staking, restaking, and stablecoin assets. 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.
Use when: Choose when you need a wallet's overall token exposure and USD value on Ethereum or Base in one call. Call once per chain for a cross-chain comparison.
Limitations: Tracks a fixed set of major assets per chain, not arbitrary tokens. Returns up to 20 holdings. Native ETH is included, so calling get_eth_balance separately is redundant.
Alternatives: get_eth_balance, get_token_price, get_defi_positions
| Name | Required | Description | Default |
|---|---|---|---|
| chain_id | No | Chain ID (1=Ethereum, 8453=Base) | |
| wallet_address | Yes | Wallet address (0x…) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| chain_id | Yes | |
| holdings | Yes | |
| fetch_errors | No | |
| wallet_address | Yes | |
| total_value_usd | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries the burden of behavioral disclosure. It adds useful detail beyond the schema: results are sorted by USD value, limited to 20 holdings, include native ETH, and are restricted to a fixed asset set. This goes beyond what annotations provide, though it could still be more explicit about response behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into useful sections (Use when, Limitations, Alternatives) and front-loads the core action, but it contains redundancy: the native ETH redundancy warning and the 20-holding limit are each stated twice. Tightening those repetitions would make it more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only portfolio tool with a full input schema and output schema, this description is complete. It covers when to use it, how to use it across chains, what it does and does not capture, and how it relates to sibling tools, leaving no critical gap for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds contextual color about Ethereum/Base and native ETH inclusion, but does not fundamentally expand on the schema's parameter meanings. A score of 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get aggregated token holdings with USD values for a wallet address.' It also adds concrete scope details (chains, asset types, sorting, cap of 20) that clearly distinguish this tool from siblings like get_eth_balance and get_defi_positions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes an explicit 'Use when' section, states the per-chain calling pattern for cross-chain comparisons, and lists alternatives. It also communicates when the tool is insufficient via limitations like 'Tracks a fixed set of major assets per chain, not arbitrary tokens.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_wallet_positionsGet Wallet PositionsARead-onlyInspect
Get a wallet's DeFi positions across all DeBank-supported chains and protocols. Returns protocol-level positions, asset/debt/net USD values, optional token lists, aggregate exposure, and optional all-chain net worth. Set include_token_balances=true to also return DeBank's complete cross-chain wallet token list. Set include_token_lists=false for a compact balance and debt summary without nested position tokens. This covers substantially more protocols and chains than the block-accurate get_defi_positions tool. Use raw-RPC tools for liquidation, swap quotes, or other transaction-critical questions.
Use when: Use for broad wallet discovery, portfolio allocation, protocol exposure, or cross-chain position questions. Set include_token_balances=true when complete wallet token discovery is required; otherwise the response only includes tokens attached to protocol positions. Set include_token_lists=false when only protocol balances, debt, or aggregate exposure are needed. Use get_defi_positions when the user needs a block-accurate Aave, Compound, Uniswap, or Lido snapshot.
Limitations: DeBank portfolio data is third-party analytics and may be stale, including occasional long refresh delays. It is read-only, EVM wallet oriented, and does not prove current liquidation or execution state. include_token_balances adds a separate billable DeBank request; include_token_lists only changes response detail.
Alternatives: get_defi_positions, get_wallet_portfolio, get_token_approvals
| Name | Required | Description | Default |
|---|---|---|---|
| wallet_address | Yes | EVM wallet address (0x…) | |
| include_net_worth | No | Include all-chain net worth and per-chain balances; disable to avoid that additional provider request. | |
| include_token_lists | No | Include protocol position token lists; disable for a compact balance and debt summary. | |
| include_token_balances | No | Include DeBank's complete cross-chain token balance list; adds a billable provider request. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| errors | No | |
| positions | No | |
| provenance | Yes | |
| data_complete | Yes | |
| total_net_usd | No | |
| chain_balances | No | |
| token_balances | No | |
| total_debt_usd | No | |
| wallet_address | Yes | |
| total_asset_usd | No | |
| include_net_worth | Yes | |
| staleness_seconds | No | Max age in seconds of the underlying DeBank position data (from per-item update_at), or None when unavailable. |
| include_token_lists | Yes | |
| total_net_worth_usd | No | |
| include_token_balances | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by disclosing that data is third-party analytics, may be stale, may have long refresh delays, is EVM-wallet oriented, and does not prove current liquidation or execution state. It also transparently notes that include_token_balances triggers a separate billable provider request. There is no contradiction with the readOnlyHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but it is highly structured with clear sections: core capability, use cases, limitations, and alternatives. Every section earns its place, and the most important scoping differentiators are front-loaded. No redundant or filler sentences appear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, four parameters, many sibling tools, and an existing output schema, the description is complete. It covers what the tool returns, when to use it, when to avoid it, parameter consequences, limitations, and alternatives. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Though the schema descriptions cover all four parameters, the tool description adds meaningful behavioral semantics: include_token_balances=true returns DeBank's complete cross-chain token list, while include_token_lists=false gives a compact balance/debt summary without nested tokens. It also clarifies that token lists only change response detail while token balances adds a billable request, which an agent needs to make informed decisions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Get') and resource ('a wallet's DeFi positions across all DeBank-supported chains and protocols'), and specifies what is returned: protocol-level positions, asset/debt/net USD values, token lists, aggregate exposure, and all-chain net worth. It also explicitly differentiates from the sibling get_defi_positions by noting this tool covers substantially more protocols and chains.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It has a dedicated 'Use when' section listing concrete use cases: broad wallet discovery, portfolio allocation, protocol exposure, and cross-chain position questions. It also explains when to toggle include_token_balances and include_token_lists, and explicitly directs users to get_defi_positions for block-accurate Aave/Compound/Uniswap/Lido snapshots. This is exemplary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_yield_ratesGet Yield RatesARead-onlyInspect
Get DeFi yield pool rates from DeFiLlama across 1,000+ protocols and all chains: pools sorted by APY with TVL, base/reward APY, and 7d/30d mean APY context, filterable by protocol, chain, min TVL, min/max APY, and symbol. Returns up to 50 pools. For protocol-specific lending comparisons (Aave vs Compound) prefer get_lending_rates.
Use when: Use for broad cross-protocol yield discovery. Call at most once per request — filter with min_apy, max_apy, min_tvl_usd, and symbols_any in a single call, then sort client-side rather than re-calling. For protocol-specific rate questions use get_lending_rates.
Limitations: Third-party DeFiLlama analytics; up to 50 pools per call. The symbol field lists underlying tokens (e.g. 'ETH-USDC') — filter client-side instead of re-calling with different arguments. Reward APY indicates reward-dependent yield; do not present spot APY as durable.
Alternatives: get_lending_rates, get_protocol_tvl, get_token_price
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Filter by chain name (e.g. 'Ethereum', 'Base', 'Arbitrum'). Case-insensitive. None = all chains. | |
| limit | No | Maximum number of pools to return, sorted by APY descending. | |
| max_apy | No | Exclude pools with APY above this value (%). Default None = no upper bound. Use to filter out leveraged/boosted pools (e.g. max_apy=30) so genuine stablecoin yields surface. | |
| min_apy | No | Exclude pools with APY below this value (%). Default 0 includes all. | |
| protocols | No | Filter by DeFiLlama project slugs (e.g. ['aave-v3', 'compound-v3']). None or empty list = include all protocols. | |
| min_tvl_usd | No | Exclude pools with TVL below this threshold (USD). Default $1M filters noise. | |
| stable_only | No | When true, return only stablecoin pools and rank by 30d mean APY first to emphasize consistency over short-term spikes. | |
| symbols_any | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| pools | Yes | |
| provenance | No | Source and freshness metadata for the DeFiLlama response. |
| total_matching | Yes | |
| filters_applied | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide readOnlyHint=true; the description adds substantial behavioral context beyond that: third-party DeFiLlama analytics, a hard 50-pool cap, a client-side filtering caveat for the symbol field, and a warning that reward APY is reward-dependent and spot APY should not be presented as durable. This meaningfully exceeds what the annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into labeled sections (main purpose, Use when, Limitations, Alternatives) that make it scannable and front-loaded. Each sentence earns its place: scope, invocation guidance, caveats, and routing are all distinct and non-redundant, and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 optional parameters, an output schema, and minimal annotations, the description covers purpose, filtering strategy, output limits, symbol-field semantics, and yield-durability caveats. The output schema covers return values, and no material gap remains for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 8 parameters are already documented in the schema; the description adds only marginal parameter-level value (e.g., sorting behavior and the stable_only ranking emphasis). Per the baseline rule for high coverage, 3 is appropriate — the schema carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb+resource ('Get DeFi yield pool rates from DeFiLlama') and precisely enumerates what is returned (APY-sorted pools with TVL, base/reward APY, 7d/30d mean APY) and how results can be filtered. It also names get_lending_rates as the protocol-specific sibling, so an agent can immediately distinguish this tool from related ones without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use when' section explicitly states the tool is for broad cross-protocol yield discovery, instructs calling at most once per request with filters applied in a single call, and directs protocol-specific questions to get_lending_rates. The Limitations and Alternatives sections reinforce routing, leaving no ambiguity about when to use this tool vs siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
http_fetchHttp FetchARead-onlyInspect
Fetch a web page and return its main text content, cleaned of markup. Use to read articles, documentation, and other resources referenced by URL. Blocks private and cloud-metadata addresses and re-validates every redirect hop.
Use when: Use when a known URL's content is needed and structured tools cannot answer — e.g. reading a linked document or API docs. For general factual lookup prefer web_search; for token prices prefer get_token_price.
Limitations: Read-only GET-style extraction returning cleaned text, not raw HTML or binary content. JS-heavy pages may yield little content; private/internal network targets are deliberately unreachable.
Alternatives: web_search, get_token_price
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to fetch (http or https only) | |
| max_chars | No | Maximum characters of extracted content to return |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| title | Yes | |
| content | Yes | |
| truncated | Yes | |
| content_length | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations provide readOnlyHint=true, and the description adds meaningful behavioral context beyond that: it blocks private/cloud-metadata addresses, re-validates redirect hops, returns cleaned text rather than raw HTML or binary, and warns about JS-heavy pages. This gives the agent a strong safety and expectations model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for purpose, use cases, limitations, and alternatives. Every sentence adds value, with no filler or repetition, and the most important scope information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with an output schema, full input schema descriptions, and a readOnly annotation, the description covers everything an agent needs: what it returns, when to use it, safety restrictions, and behavioral limitations. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already explains both 'url' and 'max_chars'. The description does not add parameter-level details, but it also doesn't need to; the schema carries the burden and the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Fetch'), a specific resource ('web page'), and the exact deliverable ('main text content, cleaned of markup'). It also distinguishes itself from sibling tools like web_search and get_token_price by framing when URL-based retrieval is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('known URL's content is needed and structured tools cannot answer') and provides alternatives with routing guidance ('prefer web_search' for general lookup, 'get_token_price' for token prices). This is clear, actionable, and leaves little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_contractRead ContractARead-onlyInspect
Call any view/pure function on a smart contract and return the decoded result, using a supplied ABI fragment. Supports historical reads via block_identifier and caller_address context for msg.sender-dependent views. Read-only: state-changing functions are rejected.
Use when: Use when a protocol question needs a contract read that no higher-level tool covers — e.g. a niche view function or a protocol outside the standard tool set. Prefer purpose-built tools (get_defi_positions, get_lending_rates) for supported protocols.
Limitations: Requires a valid ABI fragment; payable/nonpayable functions are rejected. Ethereum mainnet and Base only, with bounded RPC timeout and retry.
Alternatives: get_defi_positions, get_lending_rates, get_token_approvals
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | DEPRECATED: Positional arguments for the function call. Use 'args_json' for complex objects or Gemini compatibility. | |
| chain_id | No | Chain ID (1=Ethereum, 8453=Base) | |
| args_json | No | 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. | |
| abi_fragment | Yes | 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. | |
| function_name | Yes | Name of the function to call | |
| caller_address | No | Optional EVM address to supply as msg.sender for caller-dependent view functions. This does not sign or submit a transaction. | |
| block_identifier | No | Block number, block hash, or 'latest'/'earliest'/'pending' | latest |
| contract_address | Yes | Contract address (0x…) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | |
| chain_id | Yes | |
| function_name | Yes | |
| caller_address | No | |
| block_identifier | Yes | |
| contract_address | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavior beyond the readOnlyHint annotation: it explicitly rejects state-changing functions, supports historical reads via block_identifier, and explains caller_address supplies msg.sender without signing. It also states network constraints (Ethereum mainnet and Base) and bounded RPC timeout/retry, giving a full safety and operational picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with distinct sections (functionality, usage, limitations, alternatives) and is front-loaded with the core action. Every sentence earns its place; there is no fluff or redundancy. It is appropriately sized for an 8-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of an output schema and annotations, the description covers purpose, usage, limitations, and alternatives comprehensively. It specifies supported networks, rejected function types, and the non-transactional nature of caller_address. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already documented. The description adds context about using block_identifier for historical reads and caller_address for msg.sender-dependent views, which mirrors schema descriptions. It does not introduce new semantics beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Call'), a clear resource ('any view/pure function on a smart contract'), and the output ('decoded result'). It explicitly distinguishes itself from higher-level tools by naming purpose-built alternatives, so an agent can immediately tell when this low-level tool is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'Use when' condition (protocol questions not covered by higher-level tools) and instructs to prefer purpose-built tools (get_defi_positions, get_lending_rates) for supported protocols. It also lists limitations (network, ABI requirement, rejected function types) and names alternatives, leaving no ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_predictionsRecord PredictionsARead-onlyInspect
Record a complete structured prediction document for downstream evaluation. Call once with the exact machine-readable prediction; the human-readable report is provided separately.
Use when: Use at the end of a scheduled analysis run to persist the machine-readable prediction for later scoring. Call exactly once with the complete prediction document — never partially or repeatedly.
Limitations: Internal sink for scheduled analysis, not a caller-facing marketplace tool. Stores the prediction as given; no validation of prediction quality or deduplication across calls.
Alternatives: get_datetime
| Name | Required | Description | Default |
|---|---|---|---|
| predictions | Yes | The complete structured prediction document for this run. |
Output Schema
| Name | Required | Description |
|---|---|---|
| recorded | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description contradicts the annotations: it says to 'record', 'persist', and 'store' a prediction document, implying a state-changing write operation, while annotations declare readOnlyHint=true. This is a serious inconsistency that would mislead an agent about the tool's side effects. The added notes about no validation and no deduplication are useful but cannot overcome the contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with explicit sections and front-loaded purpose. It is slightly repetitive ('Call once...' and 'Call exactly once') but every section adds usable guidance. Overall it is concise for the amount of context it provides.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with a rich schema and output schema, the description covers usage, limitations, and parameter semantics well. However, the contradiction with the readOnlyHint annotation creates unresolved confusion about whether the operation mutates state, and the description does not clarify the discrepancy. This prevents the definition from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the single parameter. The description adds meaningful nuance beyond the schema: the prediction should be the exact machine-readable document, and the human-readable report is deliberately separate. This helps the agent understand what value to place in the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('record'), a specific resource ('complete structured prediction document'), and a clear purpose ('for downstream evaluation'). It also separates this tool from caller-facing marketplace tools and names a sibling alternative, so an agent can distinguish it from the large sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('at the end of a scheduled analysis run'), the exact call pattern ('exactly once', 'never partially or repeatedly'), and a stated alternative ('get_datetime'). It also clarifies the tool's intended internal role.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_ensResolve EnsARead-onlyInspect
Resolve an ENS name (e.g. 'vitalik.eth') to an Ethereum address, or an address to its primary ENS name, with avatar text record when available. Mainnet only.
Use when: Use only when no 0x address is available and a name must become an address (or vice versa for attribution). If a 0x address is already present in the task or session, use it directly — resolution is redundant and adds latency.
Limitations: Ethereum mainnet ENS only — no other chains or naming services. Reverse records are optional on ENS, so a valid address may legitimately have no primary name.
Alternatives: get_wallet_portfolio, get_wallet_history
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ENS name (e.g. 'vitalik.eth') to resolve to an address, or an Ethereum address (0x…) for reverse lookup to a primary ENS name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| error | No | |
| avatar | No | |
| address | Yes | |
| resolved | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals the operation is safe, and the description adds genuinely useful behavioral context: mainnet-only support, reverse records being optional, and avatar text records being returned only when available. This goes beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear 'Use when', 'Limitations', and 'Alternatives' sections, and the core purpose is front-loaded. Every sentence adds value, and the exclusion advice is placed immediately after the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single required parameter, a complete schema description, a read-only annotation, and an output schema, the description covers the important edge cases: mainnet-only behavior, optional reverse records, and the directive to skip resolution when unnecessary. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains that `name` accepts either an ENS name or an Ethereum address for reverse lookup. The description does not add parameter-level semantics beyond the schema except for noting the avatar text record, which is return-value context rather than parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: resolving an ENS name to an Ethereum address and reverse-resolving an address to its primary ENS name. It adds scope ('Mainnet only') and a concrete example ('vitalik.eth'), making the tool's purpose unmistakable and distinct from the sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage rule: use only when no 0x address is available, and avoid resolution entirely when a 0x address is already present. It also names alternatives and lists limitations, which is strong when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_opportunityValidate OpportunityARead-onlyInspect
Return a decision-ready yield-opportunity verdict before capital is deployed. The result branches to sustainable, caution, unsustainable, or insufficient_data and gives the calling agent the evidence needed to proceed, pause, or reject the opportunity.
Use when: Delegate this check before deploying capital into a DeFi yield pool or staking opportunity when the caller needs an independent sustainability and liquidity decision.
Limitations: Heuristic economic assessment based on DeFiLlama analytics and CoinGecko pricing. Does not audit smart contract bytecode, protocol governance, or admin key security.
Alternatives: get_yield_rates, get_protocol_tvl, get_lending_rates, assess_counterparty_risk
| Name | Required | Description | Default |
|---|---|---|---|
| pool_id | Yes | DeFiLlama yield pool UUID (e.g. '747c1d2a-c668-4682-b9f9-296708a3dd90'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| as_of | Yes | |
| chain | No | |
| symbol | No | |
| pool_id | Yes | |
| project | No | |
| verdict | Yes | |
| provenance | Yes | |
| risk_factors | No | |
| data_complete | No | |
| yield_summary | No | |
| partial_errors | No | |
| liquidity_summary | No | |
| sustainability_reason | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that this is a heuristic economic assessment based on DeFiLlama and CoinGecko, and explicitly lists what it does not audit. It also tells the agent what kind of output to expect (a branched verdict with supporting evidence), which is rich behavioral context that the annotation alone does not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with front-loaded purpose, followed by Use when, Limitations, and Alternatives. Every sentence adds distinct value, and the section headers make the information easy to scan for an agent. There is no repetition of schema or annotation details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one parameter, a fully descriptive schema, an output schema, and readOnlyHint annotation, the description supplies the remaining operational context: when to delegate the check, what the verdict branches are, what evidence sources back it, and what it cannot guarantee. Nothing essential is missing for an agent to decide whether and how to invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes pool_id as a DeFiLlama yield pool UUID with an example, and schema_description_coverage is 100%. The description adds some contextual framing that pool_id refers to a DeFi yield pool or staking opportunity, but it does not substantially extend the parameter meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and outcome ('Return a decision-ready yield-opportunity verdict') and names the exact decision branches: sustainable, caution, unsustainable, or insufficient_data. It clearly distinguishes this from sibling data-fetching tools like get_yield_rates and get_protocol_tvl by framing it as an independent decision check rather than a raw data lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use when' section gives an explicit trigger: before deploying capital when an independent sustainability and liquidity decision is needed. The 'Alternatives' section names the relevant sibling tools, giving the agent concrete routing options, and the 'Limitations' section implicitly tells the agent what this tool should not be used for, such as auditing smart contract bytecode or governance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
web_searchWeb SearchARead-onlyInspect
Real-time web search via Tavily for current events, fact-checking, and research. Use search_depth='advanced' for complex queries (higher quality, higher cost) and topic='news' or 'finance' for headlines or market information.
Use when: Choose when the task needs current, external, or factual information not available from on-chain or local data — e.g. news, prices, documentation, or fact-checking.
Limitations: Returns web snippets, not raw page bodies; results depend on Tavily coverage. Advanced depth costs more. Not a substitute for on-chain tools like get_token_price.
Alternatives: get_token_price, http_fetch
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query | |
| topic | No | Search topic: 'general' for web, 'news' for headlines, 'finance' for markets | general |
| num_results | No | Number of web search results to return (1–20, default 5). | |
| search_depth | No | 'basic' for fast results, 'advanced' for thorough research (higher cost) | basic |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| query | Yes | |
| results | Yes | |
| num_results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds beyond this by disclosing that the tool returns web snippets rather than raw page bodies, that results depend on Tavily coverage, that advanced depth increases cost, and that it should not replace on-chain tools. These behavioral details are not redundant with the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clear purpose, use-when, limitations, and alternatives paragraphs, allowing an agent to parse key decisions quickly. Every sentence earns its place, and the most important information about what the tool does is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool with an output schema and a read-only annotation, the description covers all relevant decision factors: purpose, use cases, limitations, cost implications, and alternatives. Nothing needed to select or invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents all four parameters. The description adds a marginal selection rule for using search_depth='advanced' on complex queries and topic='news' or 'finance' for headlines or market information, but this largely restates the schema's own descriptions, so no significant semantic value is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: real-time web search via Tavily for current events, fact-checking, and research. It clearly differentiates from sibling on-chain and utility tools by emphasizing external, current information, and explicitly says it is not a substitute for get_token_price.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'Use when' section naming the conditions for selection: current, external, factual information not available from on-chain or local data, with concrete examples like news, prices, documentation, and fact-checking. It also names alternatives (get_token_price, http_fetch) and states limitations, giving the agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
get_wallet_positions6 fields changed- added
Input schema / properties / include_token_listsAdded value: +{ + "default": true, + "description": "Include protocol position token lists; disable for a compact balance and debt summary.", + "title": "Include Token Lists", + "type": "boolean" +} - added
Output schema / properties / include_token_listsAdded value: +{ + "title": "Include Token Lists", + "type": "boolean" +} - added
Output schema / properties / total_asset_usdAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Total Asset Usd" +} - added
Output schema / properties / total_debt_usdAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Total Debt Usd" +} - added
Output schema / properties / total_net_usdAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Total Net Usd" +} - changed
Output schema / requiredPrevious value: -[ - "wallet_address", - "include_net_worth", - "include_token_balances", - "data_complete", - "provenance" -]New value: +[ + "wallet_address", + "include_net_worth", + "include_token_balances", + "include_token_lists", + "data_complete", + "provenance" +]
1 tool update
- Changed
discover_agents2 fields changed- added
Output schema / properties / registration_benefits_urlAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Machine-readable registration benefits, requirements, and non-guarantees.", + "title": "Registration Benefits Url" +} - added
Output schema / properties / registration_endpointAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Endpoint where an organization can publish its own A2A endpoint.", + "title": "Registration Endpoint" +}
2 tool updates
- Added
assess_counterparty_risk - Added
validate_opportunity
2 tool updates
- Changed
delegate_to_agent1 field changed- added
Output schema / properties / error_typeAdded value: +{ + "anyOf": [ + { + "const": "advertised_price_exceeds_cap", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Stable error type for delegation failures that require planner recovery.", + "title": "Error Type" +}
- Changed
discover_agents3 fields changed- changed
Input schema / properties / q / descriptionPrevious value: -"Optional search across agent name and organization slug"New value: +"Optional search across agent name, organization slug, or published tool name" - added
Output schema / $defs / DiscoveredAgent / properties / registered_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "UTC timestamp when the organization first registered its A2A endpoint", + "title": "Registered At" +} - added
Output schema / $defs / DiscoveredAgent / properties / tool_namesAdded value: +{ + "description": "Names of up to 20 active published tools exposed by the agent organization", + "items": { + "type": "string" + }, + "title": "Tool Names", + "type": "array" +}
1 tool update
- Added
discover_agents
1 tool update
- Added
record_predictions
3 tool updates
- Added
get_wallet_approvals - Added
get_wallet_history - Added
get_wallet_positions
27 tool updates
- Changed
calculate3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / expression / titleAdded value: +"Expression" - added
Input schema / titleAdded value: +"mcp_calculateArguments"
- Changed
convert_currency5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / amount / titleAdded value: +"Amount" - added
Input schema / properties / from_currency / titleAdded value: +"From Currency" - added
Input schema / properties / to_currency / titleAdded value: +"To Currency" - added
Input schema / titleAdded value: +"mcp_convert_currencyArguments"
- Changed
count_text_stats3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / text / titleAdded value: +"Text" - added
Input schema / titleAdded value: +"mcp_count_text_statsArguments"
- Changed
decode_transaction5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / abi_json / titleAdded value: +"Abi Json" - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / properties / tx_hash / titleAdded value: +"Tx Hash" - added
Input schema / titleAdded value: +"mcp_decode_transactionArguments"
- Changed
delegate_to_agent5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / agent_url / titleAdded value: +"Agent Url" - added
Input schema / properties / task_description / titleAdded value: +"Task Description" - added
Input schema / properties / task_type / titleAdded value: +"Task Type" - added
Input schema / titleAdded value: +"mcp_delegate_to_agentArguments"
- Changed
get_block4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / block_identifier / titleAdded value: +"Block Identifier" - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / titleAdded value: +"mcp_get_blockArguments"
- Changed
get_chain_metrics12 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / chains / titleAdded value: +"Chains" - added
Input schema / properties / days / titleAdded value: +"Days" - added
Input schema / properties / limit / titleAdded value: +"Limit" - added
Input schema / titleAdded value: +"mcp_get_chain_metricsArguments" - added
Output schema / $defsAdded value: +{ + "ChainMetricsEntry": { + "properties": { + "chain": { + "title": "Chain", + "type": "string" + }, + "chain_id": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Chain Id" + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Error" + }, + "error_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Error Type" + }, + "fees_24h_usd": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Fees 24H Usd" + }, + "fees_30d_change_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Fees 30D Change Pct" + }, + "fees_30d_usd": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Fees 30D Usd" + }, + "fees_7d_change_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Fees 7D Change Pct" + }, + "fees_7d_usd": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Fees 7D Usd" + }, + "token_symbol": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Token Symbol" + }, + "tvl_30d_change_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Tvl 30D Change Pct" + }, + "tvl_7d_change_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Tvl 7D Change Pct" + }, + "tvl_usd": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Tvl Usd" + } + }, + "required": [ + "chain", + "chain_id", + "token_symbol", + "tvl_usd", + "tvl_7d_change_pct", + "tvl_30d_change_pct", + "fees_24h_usd", + "fees_7d_usd", + "fees_30d_usd", + "fees_7d_change_pct", + "fees_30d_change_pct" + ], + "title": "ChainMetricsEntry", + "type": "object" + }, + "DataProvenance": { + "description": "Machine-readable source and freshness metadata for a tool response.", + "properties": { + "cache_age_seconds": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cache Age Seconds" + }, + "cache_hit": { + "default": false, + "title": "Cache Hit", + "type": "boolean" + }, + "cache_ttl_seconds": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cache Ttl Seconds" + }, + "provider": { + "title": "Provider", + "type": "string" + }, + "retrieved_at": { + "title": "Retrieved At", + "type": "string" + }, + "source_fetched_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Source Fetched At" + }, + "source_urls": { + "items": { + "type": "string" + }, + "title": "Source Urls", + "type": "array" + } + }, + "required": [ + "provider", + "retrieved_at" + ], + "title": "DataProvenance", + "type": "object" + } +} - added
Output schema / properties / chains / items / $refAdded value: +"#/$defs/ChainMetricsEntry" - removed
Output schema / properties / chains / items / propertiesRemoved value: -{ - "chain": { - "title": "Chain", - "type": "string" - }, - "chain_id": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Chain Id" - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Error" - }, - "error_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Error Type" - }, - "fees_24h_usd": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Fees 24H Usd" - }, - "fees_30d_change_pct": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Fees 30D Change Pct" - }, - "fees_30d_usd": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Fees 30D Usd" - }, - "fees_7d_change_pct": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Fees 7D Change Pct" - }, - "fees_7d_usd": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Fees 7D Usd" - }, - "token_symbol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Token Symbol" - }, - "tvl_30d_change_pct": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Tvl 30D Change Pct" - }, - "tvl_7d_change_pct": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Tvl 7D Change Pct" - }, - "tvl_usd": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Tvl Usd" - } -} - removed
Output schema / properties / chains / items / requiredRemoved value: -[ - "chain", - "chain_id", - "token_symbol", - "tvl_usd", - "tvl_7d_change_pct", - "tvl_30d_change_pct", - "fees_24h_usd", - "fees_7d_usd", - "fees_30d_usd", - "fees_7d_change_pct", - "fees_30d_change_pct" -] - removed
Output schema / properties / chains / items / titleRemoved value: -"ChainMetricsEntry" - removed
Output schema / properties / chains / items / typeRemoved value: -"object" - changed
Output schema / properties / provenance / anyOfPrevious value: -[ - { - "description": "Machine-readable source and freshness metadata for a tool response.", - "properties": { - "cache_age_seconds": { - "anyOf": [ - { - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Cache Age Seconds" - }, - "cache_hit": { - "default": false, - "title": "Cache Hit", - "type": "boolean" - }, - "cache_ttl_seconds": { - "anyOf": [ - { - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Cache Ttl Seconds" - }, - "provider": { - "title": "Provider", - "type": "string" - }, - "retrieved_at": { - "title": "Retrieved At", - "type": "string" - }, - "source_fetched_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Source Fetched At" - }, - "source_urls": { - "items": { - "type": "string" - }, - "title": "Source Urls", - "type": "array" - } - }, - "required": [ - "provider", - "retrieved_at" - ], - "title": "DataProvenance", - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "$ref": "#/$defs/DataProvenance" + }, + { + "type": "null" + } +]
- Changed
get_datetime3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / format / titleAdded value: +"Format" - added
Input schema / titleAdded value: +"mcp_get_datetimeArguments"
- Changed
get_defi_positions22 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / properties / wallet_address / titleAdded value: +"Wallet Address" - added
Input schema / titleAdded value: +"mcp_get_defi_positionsArguments" - added
Output schema / $defsAdded value: +{ + "AavePosition": { + "properties": { + "available_borrows_usd": { + "title": "Available Borrows Usd", + "type": "number" + }, + "health_factor": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Health Factor" + }, + "health_factor_status": { + "title": "Health Factor Status", + "type": "string" + }, + "liquidation_threshold_bps": { + "title": "Liquidation Threshold Bps", + "type": "integer" + }, + "ltv_bps": { + "title": "Ltv Bps", + "type": "integer" + }, + "reserves": { + "items": { + "$ref": "#/$defs/AaveReservePosition" + }, + "title": "Reserves", + "type": "array" + }, + "total_collateral_usd": { + "title": "Total Collateral Usd", + "type": "number" + }, + "total_debt_usd": { + "title": "Total Debt Usd", + "type": "number" + } + }, + "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": { + "asset_address": { + "title": "Asset Address", + "type": "string" + }, + "stable_debt_amount": { + "title": "Stable Debt Amount", + "type": "string" + }, + "supplied_amount": { + "title": "Supplied Amount", + "type": "string" + }, + "symbol": { + "title": "Symbol", + "type": "string" + }, + "usage_as_collateral": { + "title": "Usage As Collateral", + "type": "boolean" + }, + "variable_debt_amount": { + "title": "Variable Debt Amount", + "type": "string" + } + }, + "required": [ + "symbol", + "asset_address", + "supplied_amount", + "variable_debt_amount", + "stable_debt_amount", + "usage_as_collateral" + ], + "title": "AaveReservePosition", + "type": "object" + }, + "CompoundCollateral": { + "properties": { + "amount": { + "title": "Amount", + "type": "string" + }, + "asset_address": { + "title": "Asset Address", + "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": { + "base_asset_address": { + "title": "Base Asset Address", + "type": "string" + }, + "base_asset_symbol": { + "title": "Base Asset Symbol", + "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" + }, + "market_address": { + "title": "Market Address", + "type": "string" + }, + "market_name": { + "title": "Market Name", + "type": "string" + }, + "supplied_amount": { + "title": "Supplied Amount", + "type": "string" + } + }, + "required": [ + "market_name", + "market_address", + "base_asset_symbol", + "base_asset_address", + "supplied_amount", + "borrowed_amount", + "collateral", + "is_liquidatable" + ], + "title": "CompoundMarketPosition", + "type": "object" + }, + "LidoStakingPosition": { + "properties": { + "steth_balance": { + "title": "Steth Balance", + "type": "string" + }, + "total_steth_equivalent": { + "title": "Total Steth Equivalent", + "type": "string" + }, + "wsteth_balance": { + "title": "Wsteth Balance", + "type": "string" + }, + "wsteth_steth_equivalent": { + "title": "Wsteth Steth Equivalent", + "type": "string" + } + }, + "required": [ + "steth_balance", + "wsteth_balance", + "wsteth_steth_equivalent", + "total_steth_equivalent" + ], + "title": "LidoStakingPosition", + "type": "object" + }, + "ProtocolErrorInfo": { + "properties": { + "error": { + "title": "Error", + "type": "string" + }, + "protocol": { + "title": "Protocol", + "type": "string" + } + }, + "required": [ + "protocol", + "error" + ], + "title": "ProtocolErrorInfo", + "type": "object" + }, + "UniswapV3Position": { + "properties": { + "fee_tier_raw": { + "title": "Fee Tier Raw", + "type": "integer" + }, + "liquidity": { + "title": "Liquidity", + "type": "string" + }, + "status": { + "title": "Status", + "type": "string" + }, + "tick_lower": { + "title": "Tick Lower", + "type": "integer" + }, + "tick_upper": { + "title": "Tick Upper", + "type": "integer" + }, + "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" + }, + "token_id": { + "title": "Token Id", + "type": "string" + }, + "tokens_owed_0": { + "title": "Tokens Owed 0", + "type": "string" + }, + "tokens_owed_1": { + "title": "Tokens Owed 1", + "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" + } +} - changed
Output schema / properties / aave_v3 / anyOfPrevious value: -[ - { - "properties": { - "available_borrows_usd": { - "title": "Available Borrows Usd", - "type": "number" - }, - "health_factor": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Health Factor" - }, - "health_factor_status": { - "title": "Health Factor Status", - "type": "string" - }, - "liquidation_threshold_bps": { - "title": "Liquidation Threshold Bps", - "type": "integer" - }, - "ltv_bps": { - "title": "Ltv Bps", - "type": "integer" - }, - "reserves": { - "items": { - "properties": { - "asset_address": { - "title": "Asset Address", - "type": "string" - }, - "stable_debt_amount": { - "title": "Stable Debt Amount", - "type": "string" - }, - "supplied_amount": { - "title": "Supplied Amount", - "type": "string" - }, - "symbol": { - "title": "Symbol", - "type": "string" - }, - "usage_as_collateral": { - "title": "Usage As Collateral", - "type": "boolean" - }, - "variable_debt_amount": { - "title": "Variable Debt Amount", - "type": "string" - } - }, - "required": [ - "symbol", - "asset_address", - "supplied_amount", - "variable_debt_amount", - "stable_debt_amount", - "usage_as_collateral" - ], - "title": "AaveReservePosition", - "type": "object" - }, - "title": "Reserves", - "type": "array" - }, - "total_collateral_usd": { - "title": "Total Collateral Usd", - "type": "number" - }, - "total_debt_usd": { - "title": "Total Debt Usd", - "type": "number" - } - }, - "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" - }, - { - "type": "null" - } -]New value: +[ + { + "$ref": "#/$defs/AavePosition" + }, + { + "type": "null" + } +] - added
Output schema / properties / compound_v3 / items / $refAdded value: +"#/$defs/CompoundMarketPosition" - removed
Output schema / properties / compound_v3 / items / propertiesRemoved value: -{ - "base_asset_address": { - "title": "Base Asset Address", - "type": "string" - }, - "base_asset_symbol": { - "title": "Base Asset Symbol", - "type": "string" - }, - "borrowed_amount": { - "title": "Borrowed Amount", - "type": "string" - }, - "collateral": { - "items": { - "properties": { - "amount": { - "title": "Amount", - "type": "string" - }, - "asset_address": { - "title": "Asset Address", - "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" - }, - "title": "Collateral", - "type": "array" - }, - "is_liquidatable": { - "title": "Is Liquidatable", - "type": "boolean" - }, - "market_address": { - "title": "Market Address", - "type": "string" - }, - "market_name": { - "title": "Market Name", - "type": "string" - }, - "supplied_amount": { - "title": "Supplied Amount", - "type": "string" - } -} - removed
Output schema / properties / compound_v3 / items / requiredRemoved value: -[ - "market_name", - "market_address", - "base_asset_symbol", - "base_asset_address", - "supplied_amount", - "borrowed_amount", - "collateral", - "is_liquidatable" -] - removed
Output schema / properties / compound_v3 / items / titleRemoved value: -"CompoundMarketPosition" - removed
Output schema / properties / compound_v3 / items / typeRemoved value: -"object" - added
Output schema / properties / errors / items / $refAdded value: +"#/$defs/ProtocolErrorInfo" - removed
Output schema / properties / errors / items / propertiesRemoved value: -{ - "error": { - "title": "Error", - "type": "string" - }, - "protocol": { - "title": "Protocol", - "type": "string" - } -} - removed
Output schema / properties / errors / items / requiredRemoved value: -[ - "protocol", - "error" -] - removed
Output schema / properties / errors / items / titleRemoved value: -"ProtocolErrorInfo" - removed
Output schema / properties / errors / items / typeRemoved value: -"object" - changed
Output schema / properties / lido_staking / anyOfPrevious value: -[ - { - "properties": { - "steth_balance": { - "title": "Steth Balance", - "type": "string" - }, - "total_steth_equivalent": { - "title": "Total Steth Equivalent", - "type": "string" - }, - "wsteth_balance": { - "title": "Wsteth Balance", - "type": "string" - }, - "wsteth_steth_equivalent": { - "title": "Wsteth Steth Equivalent", - "type": "string" - } - }, - "required": [ - "steth_balance", - "wsteth_balance", - "wsteth_steth_equivalent", - "total_steth_equivalent" - ], - "title": "LidoStakingPosition", - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "$ref": "#/$defs/LidoStakingPosition" + }, + { + "type": "null" + } +] - added
Output schema / properties / uniswap_v3 / items / $refAdded value: +"#/$defs/UniswapV3Position" - removed
Output schema / properties / uniswap_v3 / items / propertiesRemoved value: -{ - "fee_tier_raw": { - "title": "Fee Tier Raw", - "type": "integer" - }, - "liquidity": { - "title": "Liquidity", - "type": "string" - }, - "status": { - "title": "Status", - "type": "string" - }, - "tick_lower": { - "title": "Tick Lower", - "type": "integer" - }, - "tick_upper": { - "title": "Tick Upper", - "type": "integer" - }, - "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" - }, - "token_id": { - "title": "Token Id", - "type": "string" - }, - "tokens_owed_0": { - "title": "Tokens Owed 0", - "type": "string" - }, - "tokens_owed_1": { - "title": "Tokens Owed 1", - "type": "string" - } -} - removed
Output schema / properties / uniswap_v3 / items / requiredRemoved value: -[ - "token_id", - "token0_address", - "token1_address", - "fee_tier_raw", - "tick_lower", - "tick_upper", - "liquidity", - "tokens_owed_0", - "tokens_owed_1", - "status" -] - removed
Output schema / properties / uniswap_v3 / items / titleRemoved value: -"UniswapV3Position" - removed
Output schema / properties / uniswap_v3 / items / typeRemoved value: -"object"
- Changed
get_dex_quote12 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / amount_in / titleAdded value: +"Amount In" - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / properties / token_in / titleAdded value: +"Token In" - added
Input schema / properties / token_out / titleAdded value: +"Token Out" - added
Input schema / titleAdded value: +"mcp_get_dex_quoteArguments" - added
Output schema / $defsAdded value: +{ + "TierQuote": { + "properties": { + "amount_out": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Amount Out" + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Error" + }, + "fee_tier": { + "title": "Fee Tier", + "type": "integer" + }, + "gas_estimate": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Gas Estimate" + }, + "sqrt_price_x96_after": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Sqrt Price X96 After" + }, + "success": { + "title": "Success", + "type": "boolean" + } + }, + "required": [ + "fee_tier", + "success" + ], + "title": "TierQuote", + "type": "object" + } +} - added
Output schema / properties / quotes_per_tier / items / $refAdded value: +"#/$defs/TierQuote" - removed
Output schema / properties / quotes_per_tier / items / propertiesRemoved value: -{ - "amount_out": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Amount Out" - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Error" - }, - "fee_tier": { - "title": "Fee Tier", - "type": "integer" - }, - "gas_estimate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Gas Estimate" - }, - "sqrt_price_x96_after": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Sqrt Price X96 After" - }, - "success": { - "title": "Success", - "type": "boolean" - } -} - removed
Output schema / properties / quotes_per_tier / items / requiredRemoved value: -[ - "fee_tier", - "success" -] - removed
Output schema / properties / quotes_per_tier / items / titleRemoved value: -"TierQuote" - removed
Output schema / properties / quotes_per_tier / items / typeRemoved value: -"object"
- Changed
get_dex_volume11 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / limit / titleAdded value: +"Limit" - added
Input schema / properties / lookback_days / titleAdded value: +"Lookback Days" - added
Input schema / properties / protocols / titleAdded value: +"Protocols" - added
Input schema / titleAdded value: +"mcp_get_dex_volumeArguments" - added
Output schema / $defsAdded value: +{ + "DexVolumeEntry": { + "properties": { + "category": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Category" + }, + "chains": { + "items": { + "type": "string" + }, + "title": "Chains", + "type": "array" + }, + "error": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Error" + }, + "error_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Error Type" + }, + "protocol": { + "title": "Protocol", + "type": "string" + }, + "slug": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Slug" + }, + "volume_24h_usd": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Volume 24H Usd" + }, + "volume_30d_change_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Volume 30D Change Pct" + }, + "volume_30d_usd": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Volume 30D Usd" + }, + "volume_7d_change_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Volume 7D Change Pct" + }, + "volume_7d_usd": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Volume 7D Usd" + }, + "volume_share_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Volume Share Pct" + } + }, + "required": [ + "protocol", + "slug", + "category", + "volume_24h_usd", + "volume_7d_usd", + "volume_30d_usd", + "volume_7d_change_pct", + "volume_30d_change_pct", + "volume_share_pct", + "chains" + ], + "title": "DexVolumeEntry", + "type": "object" + } +} - added
Output schema / properties / dexes / items / $refAdded value: +"#/$defs/DexVolumeEntry" - removed
Output schema / properties / dexes / items / propertiesRemoved value: -{ - "category": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Category" - }, - "chains": { - "items": { - "type": "string" - }, - "title": "Chains", - "type": "array" - }, - "error": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Error" - }, - "error_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Error Type" - }, - "protocol": { - "title": "Protocol", - "type": "string" - }, - "slug": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Slug" - }, - "volume_24h_usd": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volume 24H Usd" - }, - "volume_30d_change_pct": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volume 30D Change Pct" - }, - "volume_30d_usd": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volume 30D Usd" - }, - "volume_7d_change_pct": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volume 7D Change Pct" - }, - "volume_7d_usd": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volume 7D Usd" - }, - "volume_share_pct": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volume Share Pct" - } -} - removed
Output schema / properties / dexes / items / requiredRemoved value: -[ - "protocol", - "slug", - "category", - "volume_24h_usd", - "volume_7d_usd", - "volume_30d_usd", - "volume_7d_change_pct", - "volume_30d_change_pct", - "volume_share_pct", - "chains" -] - removed
Output schema / properties / dexes / items / titleRemoved value: -"DexVolumeEntry" - removed
Output schema / properties / dexes / items / typeRemoved value: -"object"
- Changed
get_erc20_balance5 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / properties / token_address / titleAdded value: +"Token Address" - added
Input schema / properties / wallet_address / titleAdded value: +"Wallet Address" - added
Input schema / titleAdded value: +"mcp_get_erc20_balanceArguments"
- Changed
get_eth_balance4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / address / titleAdded value: +"Address" - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / titleAdded value: +"mcp_get_eth_balanceArguments"
- Changed
get_gas_price4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / properties / include_usd_estimate / titleAdded value: +"Include Usd Estimate" - added
Input schema / titleAdded value: +"mcp_get_gas_priceArguments"
- Changed
get_lending_rates11 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / assets / titleAdded value: +"Assets" - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / properties / protocol / titleAdded value: +"Protocol" - added
Input schema / titleAdded value: +"mcp_get_lending_ratesArguments" - added
Output schema / $defsAdded value: +{ + "LendingRateEntry": { + "properties": { + "asset_symbol": { + "title": "Asset Symbol", + "type": "string" + }, + "borrow_apy_pct": { + "title": "Borrow Apy Pct", + "type": "number" + }, + "chain_id": { + "title": "Chain Id", + "type": "integer" + }, + "market_name": { + "title": "Market Name", + "type": "string" + }, + "protocol": { + "enum": [ + "aave-v3", + "compound-v3" + ], + "title": "Protocol", + "type": "string" + }, + "source": { + "const": "on-chain", + "default": "on-chain", + "title": "Source", + "type": "string" + }, + "supply_apy_pct": { + "title": "Supply Apy Pct", + "type": "number" + }, + "utilization_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Utilization Pct" + } + }, + "required": [ + "protocol", + "chain_id", + "market_name", + "asset_symbol", + "supply_apy_pct", + "borrow_apy_pct" + ], + "title": "LendingRateEntry", + "type": "object" + } +} - added
Output schema / properties / rates / items / $refAdded value: +"#/$defs/LendingRateEntry" - removed
Output schema / properties / rates / items / propertiesRemoved value: -{ - "asset_symbol": { - "title": "Asset Symbol", - "type": "string" - }, - "borrow_apy_pct": { - "title": "Borrow Apy Pct", - "type": "number" - }, - "chain_id": { - "title": "Chain Id", - "type": "integer" - }, - "market_name": { - "title": "Market Name", - "type": "string" - }, - "protocol": { - "enum": [ - "aave-v3", - "compound-v3" - ], - "title": "Protocol", - "type": "string" - }, - "source": { - "const": "on-chain", - "default": "on-chain", - "title": "Source", - "type": "string" - }, - "supply_apy_pct": { - "title": "Supply Apy Pct", - "type": "number" - }, - "utilization_pct": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Utilization Pct" - } -} - removed
Output schema / properties / rates / items / requiredRemoved value: -[ - "protocol", - "chain_id", - "market_name", - "asset_symbol", - "supply_apy_pct", - "borrow_apy_pct" -] - removed
Output schema / properties / rates / items / titleRemoved value: -"LendingRateEntry" - removed
Output schema / properties / rates / items / typeRemoved value: -"object"
- Changed
get_liquidation_risk15 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / properties / wallet_addresses / titleAdded value: +"Wallet Addresses" - added
Input schema / titleAdded value: +"mcp_get_liquidation_riskArguments" - added
Output schema / $defsAdded value: +{ + "AaveRisk": { + "properties": { + "health_factor": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Health Factor" + }, + "liquidation_threshold_bps": { + "title": "Liquidation Threshold Bps", + "type": "integer" + }, + "ltv_bps": { + "title": "Ltv Bps", + "type": "integer" + }, + "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" + } + }, + "required": [ + "health_factor", + "risk_tier", + "total_collateral_usd", + "total_debt_usd", + "liquidation_threshold_bps", + "ltv_bps" + ], + "title": "AaveRisk", + "type": "object" + }, + "CompoundRisk": { + "properties": { + "base_asset_symbol": { + "title": "Base Asset Symbol", + "type": "string" + }, + "borrow_balance_raw": { + "title": "Borrow Balance Raw", + "type": "string" + }, + "is_liquidatable": { + "title": "Is Liquidatable", + "type": "boolean" + }, + "market_address": { + "title": "Market Address", + "type": "string" + }, + "market_name": { + "title": "Market Name", + "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": { + "error": { + "title": "Error", + "type": "string" + }, + "protocol": { + "title": "Protocol", + "type": "string" + } + }, + "required": [ + "protocol", + "error" + ], + "title": "ProtocolErrorInfo", + "type": "object" + }, + "RiskSummary": { + "properties": { + "caution_count": { + "title": "Caution Count", + "type": "integer" + }, + "critical_count": { + "title": "Critical Count", + "type": "integer" + }, + "healthy_count": { + "title": "Healthy Count", + "type": "integer" + }, + "liquidatable_count": { + "title": "Liquidatable Count", + "type": "integer" + }, + "no_debt_count": { + "title": "No Debt Count", + "type": "integer" + }, + "total_wallets": { + "title": "Total Wallets", + "type": "integer" + }, + "warning_count": { + "title": "Warning 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": { + "aave": { + "anyOf": [ + { + "$ref": "#/$defs/AaveRisk" + }, + { + "type": "null" + } + ], + "default": null + }, + "chain_id": { + "title": "Chain Id", + "type": "integer" + }, + "compound": { + "items": { + "$ref": "#/$defs/CompoundRisk" + }, + "title": "Compound", + "type": "array" + }, + "errors": { + "items": { + "$ref": "#/$defs/ProtocolErrorInfo" + }, + "title": "Errors", + "type": "array" + }, + "overall_tier": { + "title": "Overall Tier", + "type": "string" + }, + "wallet_address": { + "title": "Wallet Address", + "type": "string" + } + }, + "required": [ + "wallet_address", + "chain_id", + "overall_tier" + ], + "title": "WalletRiskResult", + "type": "object" + } +} - added
Output schema / properties / results / items / $refAdded value: +"#/$defs/WalletRiskResult" - removed
Output schema / properties / results / items / propertiesRemoved value: -{ - "aave": { - "anyOf": [ - { - "properties": { - "health_factor": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Health Factor" - }, - "liquidation_threshold_bps": { - "title": "Liquidation Threshold Bps", - "type": "integer" - }, - "ltv_bps": { - "title": "Ltv Bps", - "type": "integer" - }, - "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" - } - }, - "required": [ - "health_factor", - "risk_tier", - "total_collateral_usd", - "total_debt_usd", - "liquidation_threshold_bps", - "ltv_bps" - ], - "title": "AaveRisk", - "type": "object" - }, - { - "type": "null" - } - ], - "default": null - }, - "chain_id": { - "title": "Chain Id", - "type": "integer" - }, - "compound": { - "items": { - "properties": { - "base_asset_symbol": { - "title": "Base Asset Symbol", - "type": "string" - }, - "borrow_balance_raw": { - "title": "Borrow Balance Raw", - "type": "string" - }, - "is_liquidatable": { - "title": "Is Liquidatable", - "type": "boolean" - }, - "market_address": { - "title": "Market Address", - "type": "string" - }, - "market_name": { - "title": "Market Name", - "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" - }, - "title": "Compound", - "type": "array" - }, - "errors": { - "items": { - "properties": { - "error": { - "title": "Error", - "type": "string" - }, - "protocol": { - "title": "Protocol", - "type": "string" - } - }, - "required": [ - "protocol", - "error" - ], - "title": "ProtocolErrorInfo", - "type": "object" - }, - "title": "Errors", - "type": "array" - }, - "overall_tier": { - "title": "Overall Tier", - "type": "string" - }, - "wallet_address": { - "title": "Wallet Address", - "type": "string" - } -} - removed
Output schema / properties / results / items / requiredRemoved value: -[ - "wallet_address", - "chain_id", - "overall_tier" -] - removed
Output schema / properties / results / items / titleRemoved value: -"WalletRiskResult" - removed
Output schema / properties / results / items / typeRemoved value: -"object" - added
Output schema / properties / summary / $refAdded value: +"#/$defs/RiskSummary" - removed
Output schema / properties / summary / propertiesRemoved value: -{ - "caution_count": { - "title": "Caution Count", - "type": "integer" - }, - "critical_count": { - "title": "Critical Count", - "type": "integer" - }, - "healthy_count": { - "title": "Healthy Count", - "type": "integer" - }, - "liquidatable_count": { - "title": "Liquidatable Count", - "type": "integer" - }, - "no_debt_count": { - "title": "No Debt Count", - "type": "integer" - }, - "total_wallets": { - "title": "Total Wallets", - "type": "integer" - }, - "warning_count": { - "title": "Warning Count", - "type": "integer" - } -} - removed
Output schema / properties / summary / requiredRemoved value: -[ - "total_wallets", - "liquidatable_count", - "critical_count", - "warning_count", - "caution_count", - "healthy_count", - "no_debt_count" -] - removed
Output schema / properties / summary / titleRemoved value: -"RiskSummary" - removed
Output schema / properties / summary / typeRemoved value: -"object"
- Changed
get_protocol_tvl6 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / days / titleAdded value: +"Days" - added
Input schema / properties / include_historical / titleAdded value: +"Include Historical" - added
Input schema / properties / protocol / titleAdded value: +"Protocol" - added
Input schema / properties / protocols / titleAdded value: +"Protocols" - added
Input schema / titleAdded value: +"mcp_get_protocol_tvlArguments"
- Changed
get_token_approvals17 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / properties / spenders / titleAdded value: +"Spenders" - added
Input schema / properties / tokens / titleAdded value: +"Tokens" - added
Input schema / properties / wallet_address / titleAdded value: +"Wallet Address" - added
Input schema / titleAdded value: +"mcp_get_token_approvalsArguments" - added
Output schema / $defsAdded value: +{ + "ApprovalEntry": { + "properties": { + "allowance_formatted": { + "title": "Allowance Formatted", + "type": "string" + }, + "allowance_raw": { + "title": "Allowance Raw", + "type": "string" + }, + "is_permit2": { + "title": "Is Permit2", + "type": "boolean" + }, + "is_unlimited": { + "title": "Is Unlimited", + "type": "boolean" + }, + "risk_level": { + "enum": [ + "low", + "medium", + "high" + ], + "title": "Risk Level", + "type": "string" + }, + "spender_address": { + "title": "Spender Address", + "type": "string" + }, + "spender_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Spender Name" + }, + "token_address": { + "title": "Token Address", + "type": "string" + }, + "token_symbol": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Token Symbol" + } + }, + "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": { + "high_risk_approvals": { + "title": "High Risk Approvals", + "type": "integer" + }, + "total_approvals": { + "title": "Total Approvals", + "type": "integer" + }, + "unknown_spenders": { + "title": "Unknown Spenders", + "type": "integer" + }, + "unlimited_approvals": { + "title": "Unlimited Approvals", + "type": "integer" + } + }, + "required": [ + "total_approvals", + "unlimited_approvals", + "high_risk_approvals", + "unknown_spenders" + ], + "title": "RiskSummary", + "type": "object" + } +} - added
Output schema / properties / approvals / items / $refAdded value: +"#/$defs/ApprovalEntry" - removed
Output schema / properties / approvals / items / propertiesRemoved value: -{ - "allowance_formatted": { - "title": "Allowance Formatted", - "type": "string" - }, - "allowance_raw": { - "title": "Allowance Raw", - "type": "string" - }, - "is_permit2": { - "title": "Is Permit2", - "type": "boolean" - }, - "is_unlimited": { - "title": "Is Unlimited", - "type": "boolean" - }, - "risk_level": { - "enum": [ - "low", - "medium", - "high" - ], - "title": "Risk Level", - "type": "string" - }, - "spender_address": { - "title": "Spender Address", - "type": "string" - }, - "spender_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Spender Name" - }, - "token_address": { - "title": "Token Address", - "type": "string" - }, - "token_symbol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Token Symbol" - } -} - removed
Output schema / properties / approvals / items / requiredRemoved value: -[ - "token_symbol", - "token_address", - "spender_name", - "spender_address", - "allowance_raw", - "allowance_formatted", - "is_unlimited", - "is_permit2", - "risk_level" -] - removed
Output schema / properties / approvals / items / titleRemoved value: -"ApprovalEntry" - removed
Output schema / properties / approvals / items / typeRemoved value: -"object" - added
Output schema / properties / risk_summary / $refAdded value: +"#/$defs/RiskSummary" - removed
Output schema / properties / risk_summary / propertiesRemoved value: -{ - "high_risk_approvals": { - "title": "High Risk Approvals", - "type": "integer" - }, - "total_approvals": { - "title": "Total Approvals", - "type": "integer" - }, - "unknown_spenders": { - "title": "Unknown Spenders", - "type": "integer" - }, - "unlimited_approvals": { - "title": "Unlimited Approvals", - "type": "integer" - } -} - removed
Output schema / properties / risk_summary / requiredRemoved value: -[ - "total_approvals", - "unlimited_approvals", - "high_risk_approvals", - "unknown_spenders" -] - removed
Output schema / properties / risk_summary / titleRemoved value: -"RiskSummary" - removed
Output schema / properties / risk_summary / typeRemoved value: -"object"
- Changed
get_token_price10 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / tokens / titleAdded value: +"Tokens" - added
Input schema / properties / vs_currency / titleAdded value: +"Vs Currency" - added
Input schema / titleAdded value: +"mcp_get_token_priceArguments" - added
Output schema / $defsAdded value: +{ + "TokenPriceEntry": { + "properties": { + "change_24h_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Change 24H Pct" + }, + "fully_diluted_valuation": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Fully Diluted Valuation" + }, + "id": { + "title": "Id", + "type": "string" + }, + "market_cap": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Market Cap" + }, + "price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Price" + }, + "symbol": { + "title": "Symbol", + "type": "string" + }, + "volume_24h": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Volume 24H" + } + }, + "required": [ + "id", + "symbol", + "price", + "market_cap", + "volume_24h", + "change_24h_pct" + ], + "title": "TokenPriceEntry", + "type": "object" + } +} - added
Output schema / properties / prices / items / $refAdded value: +"#/$defs/TokenPriceEntry" - removed
Output schema / properties / prices / items / propertiesRemoved value: -{ - "change_24h_pct": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Change 24H Pct" - }, - "fully_diluted_valuation": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Fully Diluted Valuation" - }, - "id": { - "title": "Id", - "type": "string" - }, - "market_cap": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Market Cap" - }, - "price": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Price" - }, - "symbol": { - "title": "Symbol", - "type": "string" - }, - "volume_24h": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volume 24H" - } -} - removed
Output schema / properties / prices / items / requiredRemoved value: -[ - "id", - "symbol", - "price", - "market_cap", - "volume_24h", - "change_24h_pct" -] - removed
Output schema / properties / prices / items / titleRemoved value: -"TokenPriceEntry" - removed
Output schema / properties / prices / items / typeRemoved value: -"object"
- Changed
get_token_price_historical12 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / days / titleAdded value: +"Days" - added
Input schema / properties / stats_only / titleAdded value: +"Stats Only" - added
Input schema / properties / tokens / titleAdded value: +"Tokens" - added
Input schema / properties / vs_currency / titleAdded value: +"Vs Currency" - added
Input schema / titleAdded value: +"mcp_get_token_price_historicalArguments" - added
Output schema / $defsAdded value: +{ + "DailyPricePoint": { + "properties": { + "date": { + "title": "Date", + "type": "string" + }, + "price": { + "title": "Price", + "type": "number" + } + }, + "required": [ + "date", + "price" + ], + "title": "DailyPricePoint", + "type": "object" + }, + "TokenHistoricalEntry": { + "properties": { + "daily_prices": { + "items": { + "$ref": "#/$defs/DailyPricePoint" + }, + "title": "Daily Prices", + "type": "array" + }, + "dca_baseline_90d": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Mean of weekly daily-close samples from the preceding 90 UTC days, in vs_currency.", + "title": "Dca Baseline 90D" + }, + "dca_baseline_90d_partial": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "True when the DCA baseline uses incomplete 90-day history; null when unavailable.", + "title": "Dca Baseline 90D Partial" + }, + "high_30d": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maximum raw price observation in the trailing 30 UTC days, in vs_currency.", + "title": "High 30D" + }, + "id": { + "title": "Id", + "type": "string" + }, + "price_change_pct": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Price Change Pct" + }, + "price_end": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Price End" + }, + "price_high": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Price High" + }, + "price_low": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Price Low" + }, + "price_start": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Price Start" + }, + "std_30d": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Population standard deviation of trailing 30-day simple daily returns, as a decimal.", + "title": "Std 30D" + }, + "symbol": { + "title": "Symbol", + "type": "string" + } + }, + "required": [ + "id", + "symbol", + "price_start", + "price_end", + "price_change_pct", + "price_high", + "price_low", + "daily_prices" + ], + "title": "TokenHistoricalEntry", + "type": "object" + } +} - added
Output schema / properties / tokens / items / $refAdded value: +"#/$defs/TokenHistoricalEntry" - removed
Output schema / properties / tokens / items / propertiesRemoved value: -{ - "daily_prices": { - "items": { - "properties": { - "date": { - "title": "Date", - "type": "string" - }, - "price": { - "title": "Price", - "type": "number" - } - }, - "required": [ - "date", - "price" - ], - "title": "DailyPricePoint", - "type": "object" - }, - "title": "Daily Prices", - "type": "array" - }, - "dca_baseline_90d": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Mean of weekly daily-close samples from the preceding 90 UTC days, in vs_currency.", - "title": "Dca Baseline 90D" - }, - "dca_baseline_90d_partial": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "True when the DCA baseline uses incomplete 90-day history; null when unavailable.", - "title": "Dca Baseline 90D Partial" - }, - "high_30d": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Maximum raw price observation in the trailing 30 UTC days, in vs_currency.", - "title": "High 30D" - }, - "id": { - "title": "Id", - "type": "string" - }, - "price_change_pct": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Price Change Pct" - }, - "price_end": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Price End" - }, - "price_high": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Price High" - }, - "price_low": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Price Low" - }, - "price_start": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Price Start" - }, - "std_30d": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Population standard deviation of trailing 30-day simple daily returns, as a decimal.", - "title": "Std 30D" - }, - "symbol": { - "title": "Symbol", - "type": "string" - } -} - removed
Output schema / properties / tokens / items / requiredRemoved value: -[ - "id", - "symbol", - "price_start", - "price_end", - "price_change_pct", - "price_high", - "price_low", - "daily_prices" -] - removed
Output schema / properties / tokens / items / titleRemoved value: -"TokenHistoricalEntry" - removed
Output schema / properties / tokens / items / typeRemoved value: -"object"
- Changed
get_transaction10 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / properties / tx_hash / titleAdded value: +"Tx Hash" - added
Input schema / titleAdded value: +"mcp_get_transactionArguments" - added
Output schema / $defsAdded value: +{ + "TransactionLog": { + "properties": { + "address": { + "title": "Address", + "type": "string" + }, + "data": { + "title": "Data", + "type": "string" + }, + "data_truncated": { + "default": false, + "title": "Data Truncated", + "type": "boolean" + }, + "log_index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Log Index" + }, + "topics": { + "items": { + "type": "string" + }, + "title": "Topics", + "type": "array" + }, + "topics_truncated": { + "default": false, + "title": "Topics Truncated", + "type": "boolean" + } + }, + "required": [ + "address", + "topics", + "data" + ], + "title": "TransactionLog", + "type": "object" + } +} - added
Output schema / properties / logs / items / $refAdded value: +"#/$defs/TransactionLog" - removed
Output schema / properties / logs / items / propertiesRemoved value: -{ - "address": { - "title": "Address", - "type": "string" - }, - "data": { - "title": "Data", - "type": "string" - }, - "data_truncated": { - "default": false, - "title": "Data Truncated", - "type": "boolean" - }, - "log_index": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Log Index" - }, - "topics": { - "items": { - "type": "string" - }, - "title": "Topics", - "type": "array" - }, - "topics_truncated": { - "default": false, - "title": "Topics Truncated", - "type": "boolean" - } -} - removed
Output schema / properties / logs / items / requiredRemoved value: -[ - "address", - "topics", - "data" -] - removed
Output schema / properties / logs / items / titleRemoved value: -"TransactionLog" - removed
Output schema / properties / logs / items / typeRemoved value: -"object"
- Changed
get_wallet_portfolio10 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / properties / wallet_address / titleAdded value: +"Wallet Address" - added
Input schema / titleAdded value: +"mcp_get_wallet_portfolioArguments" - added
Output schema / $defsAdded value: +{ + "PortfolioEntry": { + "properties": { + "balance_formatted": { + "title": "Balance Formatted", + "type": "string" + }, + "price_usd": { + "title": "Price Usd", + "type": "number" + }, + "symbol": { + "title": "Symbol", + "type": "string" + }, + "token_address": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Token Address" + }, + "value_usd": { + "title": "Value Usd", + "type": "number" + } + }, + "required": [ + "symbol", + "token_address", + "balance_formatted", + "price_usd", + "value_usd" + ], + "title": "PortfolioEntry", + "type": "object" + } +} - added
Output schema / properties / holdings / items / $refAdded value: +"#/$defs/PortfolioEntry" - removed
Output schema / properties / holdings / items / propertiesRemoved value: -{ - "balance_formatted": { - "title": "Balance Formatted", - "type": "string" - }, - "price_usd": { - "title": "Price Usd", - "type": "number" - }, - "symbol": { - "title": "Symbol", - "type": "string" - }, - "token_address": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Token Address" - }, - "value_usd": { - "title": "Value Usd", - "type": "number" - } -} - removed
Output schema / properties / holdings / items / requiredRemoved value: -[ - "symbol", - "token_address", - "balance_formatted", - "price_usd", - "value_usd" -] - removed
Output schema / properties / holdings / items / titleRemoved value: -"PortfolioEntry" - removed
Output schema / properties / holdings / items / typeRemoved value: -"object"
- Changed
get_yield_rates17 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / chain / titleAdded value: +"Chain" - added
Input schema / properties / limit / titleAdded value: +"Limit" - added
Input schema / properties / max_apy / titleAdded value: +"Max Apy" - added
Input schema / properties / min_apy / titleAdded value: +"Min Apy" - added
Input schema / properties / min_tvl_usd / titleAdded value: +"Min Tvl Usd" - added
Input schema / properties / protocols / titleAdded value: +"Protocols" - added
Input schema / properties / stable_only / titleAdded value: +"Stable Only" - added
Input schema / properties / symbols_any / titleAdded value: +"Symbols Any" - added
Input schema / titleAdded value: +"mcp_get_yield_ratesArguments" - added
Output schema / $defsAdded value: +{ + "DataProvenance": { + "description": "Machine-readable source and freshness metadata for a tool response.", + "properties": { + "cache_age_seconds": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cache Age Seconds" + }, + "cache_hit": { + "default": false, + "title": "Cache Hit", + "type": "boolean" + }, + "cache_ttl_seconds": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cache Ttl Seconds" + }, + "provider": { + "title": "Provider", + "type": "string" + }, + "retrieved_at": { + "title": "Retrieved At", + "type": "string" + }, + "source_fetched_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Source Fetched At" + }, + "source_urls": { + "items": { + "type": "string" + }, + "title": "Source Urls", + "type": "array" + } + }, + "required": [ + "provider", + "retrieved_at" + ], + "title": "DataProvenance", + "type": "object" + }, + "YieldPoolEntry": { + "properties": { + "apy": { + "title": "Apy", + "type": "number" + }, + "apy_base": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Apy Base" + }, + "apy_mean_30d": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Apy Mean 30D" + }, + "apy_mean_7d": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Apy Mean 7D" + }, + "apy_reward": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Apy Reward" + }, + "chain": { + "title": "Chain", + "type": "string" + }, + "il_risk": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Il Risk" + }, + "pool_id": { + "title": "Pool Id", + "type": "string" + }, + "project": { + "title": "Project", + "type": "string" + }, + "stable": { + "title": "Stable", + "type": "boolean" + }, + "symbol": { + "title": "Symbol", + "type": "string" + }, + "tvl_usd": { + "title": "Tvl Usd", + "type": "number" + } + }, + "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" + } +} - added
Output schema / properties / pools / items / $refAdded value: +"#/$defs/YieldPoolEntry" - removed
Output schema / properties / pools / items / propertiesRemoved value: -{ - "apy": { - "title": "Apy", - "type": "number" - }, - "apy_base": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Apy Base" - }, - "apy_mean_30d": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Apy Mean 30D" - }, - "apy_mean_7d": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Apy Mean 7D" - }, - "apy_reward": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Apy Reward" - }, - "chain": { - "title": "Chain", - "type": "string" - }, - "il_risk": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Il Risk" - }, - "pool_id": { - "title": "Pool Id", - "type": "string" - }, - "project": { - "title": "Project", - "type": "string" - }, - "stable": { - "title": "Stable", - "type": "boolean" - }, - "symbol": { - "title": "Symbol", - "type": "string" - }, - "tvl_usd": { - "title": "Tvl Usd", - "type": "number" - } -} - removed
Output schema / properties / pools / items / requiredRemoved value: -[ - "pool_id", - "project", - "symbol", - "chain", - "tvl_usd", - "apy", - "apy_mean_7d", - "apy_mean_30d", - "apy_base", - "apy_reward", - "stable", - "il_risk" -] - removed
Output schema / properties / pools / items / titleRemoved value: -"YieldPoolEntry" - removed
Output schema / properties / pools / items / typeRemoved value: -"object" - changed
Output schema / properties / provenance / anyOfPrevious value: -[ - { - "description": "Machine-readable source and freshness metadata for a tool response.", - "properties": { - "cache_age_seconds": { - "anyOf": [ - { - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Cache Age Seconds" - }, - "cache_hit": { - "default": false, - "title": "Cache Hit", - "type": "boolean" - }, - "cache_ttl_seconds": { - "anyOf": [ - { - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Cache Ttl Seconds" - }, - "provider": { - "title": "Provider", - "type": "string" - }, - "retrieved_at": { - "title": "Retrieved At", - "type": "string" - }, - "source_fetched_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Source Fetched At" - }, - "source_urls": { - "items": { - "type": "string" - }, - "title": "Source Urls", - "type": "array" - } - }, - "required": [ - "provider", - "retrieved_at" - ], - "title": "DataProvenance", - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "$ref": "#/$defs/DataProvenance" + }, + { + "type": "null" + } +]
- Changed
http_fetch4 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / max_chars / titleAdded value: +"Max Chars" - added
Input schema / properties / url / titleAdded value: +"Url" - added
Input schema / titleAdded value: +"mcp_http_fetchArguments"
- Changed
read_contract10 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / abi_fragment / titleAdded value: +"Abi Fragment" - added
Input schema / properties / args / titleAdded value: +"Args" - added
Input schema / properties / args_json / titleAdded value: +"Args Json" - added
Input schema / properties / block_identifier / titleAdded value: +"Block Identifier" - added
Input schema / properties / caller_address / titleAdded value: +"Caller Address" - added
Input schema / properties / chain_id / titleAdded value: +"Chain Id" - added
Input schema / properties / contract_address / titleAdded value: +"Contract Address" - added
Input schema / properties / function_name / titleAdded value: +"Function Name" - added
Input schema / titleAdded value: +"mcp_read_contractArguments"
- Changed
resolve_ens3 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / name / titleAdded value: +"Name" - added
Input schema / titleAdded value: +"mcp_resolve_ensArguments"
- Changed
web_search12 fields changed- removed
Input schema / additionalPropertiesRemoved value: -false - added
Input schema / properties / num_results / titleAdded value: +"Num Results" - added
Input schema / properties / query / titleAdded value: +"Query" - added
Input schema / properties / search_depth / titleAdded value: +"Search Depth" - added
Input schema / properties / topic / titleAdded value: +"Topic" - added
Input schema / titleAdded value: +"mcp_web_searchArguments" - added
Output schema / $defsAdded value: +{ + "SearchResult": { + "properties": { + "score": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Score" + }, + "snippet": { + "title": "Snippet", + "type": "string" + }, + "title": { + "title": "Title", + "type": "string" + }, + "url": { + "title": "Url", + "type": "string" + } + }, + "required": [ + "title", + "url", + "snippet" + ], + "title": "SearchResult", + "type": "object" + } +} - added
Output schema / properties / results / items / $refAdded value: +"#/$defs/SearchResult" - removed
Output schema / properties / results / items / propertiesRemoved value: -{ - "score": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Score" - }, - "snippet": { - "title": "Snippet", - "type": "string" - }, - "title": { - "title": "Title", - "type": "string" - }, - "url": { - "title": "Url", - "type": "string" - } -} - removed
Output schema / properties / results / items / requiredRemoved value: -[ - "title", - "url", - "snippet" -] - removed
Output schema / properties / results / items / titleRemoved value: -"SearchResult" - removed
Output schema / properties / results / items / typeRemoved value: -"object"
1 tool update
- Changed
get_defi_positions2 fields changed- added
Output schema / properties / lido_stakingAdded value: +{ + "anyOf": [ + { + "properties": { + "steth_balance": { + "title": "Steth Balance", + "type": "string" + }, + "total_steth_equivalent": { + "title": "Total Steth Equivalent", + "type": "string" + }, + "wsteth_balance": { + "title": "Wsteth Balance", + "type": "string" + }, + "wsteth_steth_equivalent": { + "title": "Wsteth Steth Equivalent", + "type": "string" + } + }, + "required": [ + "steth_balance", + "wsteth_balance", + "wsteth_steth_equivalent", + "total_steth_equivalent" + ], + "title": "LidoStakingPosition", + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +} - changed
Output schema / properties / note / defaultPrevious value: -"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."New value: +"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. Lido staking contains canonical Ethereum stETH/wstETH balances and a current wstETH-to-stETH equivalent in raw integer units; it does not include APR, rewards accounting, validator positions, or withdrawal queue status. Lido staking is null on Base because its wstETH representation there is bridged. 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 COMP accruals or unlisted protocols."
4 tool updates
- Changed
get_chain_metrics1 field changed- added
Output schema / properties / provenanceAdded value: +{ + "anyOf": [ + { + "description": "Machine-readable source and freshness metadata for a tool response.", + "properties": { + "cache_age_seconds": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cache Age Seconds" + }, + "cache_hit": { + "default": false, + "title": "Cache Hit", + "type": "boolean" + }, + "cache_ttl_seconds": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cache Ttl Seconds" + }, + "provider": { + "title": "Provider", + "type": "string" + }, + "retrieved_at": { + "title": "Retrieved At", + "type": "string" + }, + "source_fetched_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Source Fetched At" + }, + "source_urls": { + "items": { + "type": "string" + }, + "title": "Source Urls", + "type": "array" + } + }, + "required": [ + "provider", + "retrieved_at" + ], + "title": "DataProvenance", + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Source and freshness metadata for the DeFiLlama response." +}
- Changed
get_transaction8 fields changed- added
Output schema / properties / effective_gas_price_gweiAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Effective Gas Price Gwei" +} - added
Output schema / properties / fee_ethAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Fee Eth" +} - added
Output schema / properties / fee_weiAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Fee Wei" +} - added
Output schema / properties / input_dataAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Hex calldata, bounded to 8 KiB", + "title": "Input Data" +} - added
Output schema / properties / input_data_truncatedAdded value: +{ + "default": false, + "title": "Input Data Truncated", + "type": "boolean" +} - added
Output schema / properties / logsAdded value: +{ + "items": { + "properties": { + "address": { + "title": "Address", + "type": "string" + }, + "data": { + "title": "Data", + "type": "string" + }, + "data_truncated": { + "default": false, + "title": "Data Truncated", + "type": "boolean" + }, + "log_index": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Log Index" + }, + "topics": { + "items": { + "type": "string" + }, + "title": "Topics", + "type": "array" + }, + "topics_truncated": { + "default": false, + "title": "Topics Truncated", + "type": "boolean" + } + }, + "required": [ + "address", + "topics", + "data" + ], + "title": "TransactionLog", + "type": "object" + }, + "title": "Logs", + "type": "array" +} - added
Output schema / properties / logs_truncatedAdded value: +{ + "default": false, + "title": "Logs Truncated", + "type": "boolean" +} - added
Output schema / properties / transaction_indexAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Transaction Index" +}
- Changed
get_yield_rates1 field changed- added
Output schema / properties / provenanceAdded value: +{ + "anyOf": [ + { + "description": "Machine-readable source and freshness metadata for a tool response.", + "properties": { + "cache_age_seconds": { + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cache Age Seconds" + }, + "cache_hit": { + "default": false, + "title": "Cache Hit", + "type": "boolean" + }, + "cache_ttl_seconds": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Cache Ttl Seconds" + }, + "provider": { + "title": "Provider", + "type": "string" + }, + "retrieved_at": { + "title": "Retrieved At", + "type": "string" + }, + "source_fetched_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Source Fetched At" + }, + "source_urls": { + "items": { + "type": "string" + }, + "title": "Source Urls", + "type": "array" + } + }, + "required": [ + "provider", + "retrieved_at" + ], + "title": "DataProvenance", + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Source and freshness metadata for the DeFiLlama response." +}
- Changed
read_contract2 fields changed- added
Input schema / properties / caller_addressAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional EVM address to supply as msg.sender for caller-dependent view functions. This does not sign or submit a transaction." +} - added
Output schema / properties / caller_addressAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Caller Address" +}
1 tool update
- Changed
get_token_price_historical5 fields changed- changed
Input schema / properties / stats_only / descriptionPrevious value: -"If true, omit the daily price series and return only period stats (start/end/change/high/low) to reduce payload size."New value: +"If true, omit the daily price series and return period stats plus precomputed 30-day high/volatility and 90-day DCA baseline metrics." - added
Output schema / properties / tokens / items / properties / dca_baseline_90dAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Mean of weekly daily-close samples from the preceding 90 UTC days, in vs_currency.", + "title": "Dca Baseline 90D" +} - added
Output schema / properties / tokens / items / properties / dca_baseline_90d_partialAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "description": "True when the DCA baseline uses incomplete 90-day history; null when unavailable.", + "title": "Dca Baseline 90D Partial" +} - added
Output schema / properties / tokens / items / properties / high_30dAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Maximum raw price observation in the trailing 30 UTC days, in vs_currency.", + "title": "High 30D" +} - added
Output schema / properties / tokens / items / properties / std_30dAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Population standard deviation of trailing 30-day simple daily returns, as a decimal.", + "title": "Std 30D" +}
2 tool updates
- Added
get_chain_metrics - Added
get_dex_volume
1 tool update
- Changed
get_yield_rates1 field changed- added
Input schema / properties / max_apyAdded value: +{ + "anyOf": [ + { + "minimum": 0, + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Exclude pools with APY above this value (%). Default None = no upper bound. Use to filter out leveraged/boosted pools (e.g. max_apy=30) so genuine stablecoin yields surface." +}
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.167 npm1MIT
- AlicenseCqualityAmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs119 npm37 PyPIMIT
- AlicenseNot gradedqualityBmaintenanceEnables tracking competitor websites, changelogs, blog feeds, and pricing pages with meaningful diffs, classification, and Markdown digests via MCP tools for listing, adding, removing competitors, running checks, and retrieving digests or changes.MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.