Skip to main content
Glama

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.

Ownership verified
Status
Healthy
Uptime
100.0% over 42 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4/5.0

Scored across 34 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness4/5

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 tools
assess_counterparty_riskAssess Counterparty RiskA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
chain_idsNoDeBank chain identifiers scoping approvals and history; positions and net worth remain all-chain.
wallet_addressYesEVM wallet address (0x-prefixed)

Output Schema

ParametersJSON Schema
NameRequiredDescription
as_ofYes
verdictYes
activityNo
provenanceYes
liquidationNo
risk_factorsNo
data_completeNo
partial_errorsNo
wallet_addressYes
approval_summaryNo
total_net_worth_usdNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

calculateCalculateA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
expressionYesA safe arithmetic expression, e.g. '(3 + 4) * 2 / sqrt(9)'

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
resultNo
expressionYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 CurrencyA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesAmount to convert
to_currencyYesTarget currency (e.g. 'USD', 'EUR', 'BTC')
from_currencyYesSource currency (e.g. 'ETH', 'USD', 'BTC')

Output Schema

ParametersJSON Schema
NameRequiredDescription
rateYes
amountYes
sourceYes
to_currencyYes
from_currencyYes
converted_amountYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 StatsA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesText to summarize

Output Schema

ParametersJSON Schema
NameRequiredDescription
word_countYes
sentence_countYes
character_countYes
paragraph_countYes
average_words_per_sentenceYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 TransactionA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
tx_hashYesTransaction hash (0x… 64 hex chars)
abi_jsonNoOptional ABI JSON array for decoding. If omitted, 4byte.directory is used.
chain_idNoChain ID (1=Ethereum, 8453=Base)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
statusNo1=success, 0=revert, None=pending
tx_hashYes
chain_idYes
gas_usedYes
value_ethYes
to_addressYes
block_numberYes
decoded_argsYes
from_addressYes
raw_calldataYes
decode_sourceYes
function_nameYes
function_selectorYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
agent_urlYesBase URL of the remote A2A agent (e.g. https://agent.example.com)
task_typeNoBroad task class for routing telemetry; never include user data or task text.general
task_descriptionYesNatural language description of the task to delegate

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoError message, if any
resultYesText result extracted from the remote agent's response
statusYesA2A task state: completed, failed, etc.
cost_usdcNoCost of this delegation in atomic USDC
agent_nameYesName of the remote agent (from its agent card)
error_typeNoStable error type for delegation failures that require planner recovery.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 AgentsA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoOptional search across agent name, organization slug, or published tool name
limitNoMaximum number of agents to return

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
agentsYes
generated_atYes
registration_endpointNoEndpoint where an organization can publish its own A2A endpoint.
registration_benefits_urlNoMachine-readable registration benefits, requirements, and non-guarantees.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 BlockA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
chain_idNoChain ID (1=Ethereum, 8453=Base)
block_identifierNoBlock number, block hash, or 'latest'/'earliest'/'pending'latest

Output Schema

ParametersJSON Schema
NameRequiredDescription
hashYes
numberYes
gas_usedYes
timestampYes
base_fee_gweiYes
transaction_countYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 MetricsA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLookback window used when selecting the historical TVL points to inspect.
limitNoMaximum number of chain rows to return when the result is not explicitly filtered.
chainsNoOptional chain names to compare, such as ['Ethereum', 'Arbitrum', 'Solana']. When omitted, return the highest-TVL chains up to limit.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
errorNo
chainsYes
error_typeNo
provenanceNoSource and freshness metadata for the DeFiLlama response.
total_availableYes
requested_chainsYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DatetimeA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNostrftime format string for the output%Y-%m-%d %H:%M:%S UTC

Output Schema

ParametersJSON Schema
NameRequiredDescription
iso8601Yes
datetimeYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PositionsA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
chain_idNoChain ID (1=Ethereum, 8453=Base)
wallet_addressYesWallet address (0x…)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
errorsNo
aave_v3No
chain_idYes
uniswap_v3No
compound_v3No
lido_stakingNo
wallet_addressYes
data_block_numberYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 QuoteA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
chain_idNo1 = Ethereum mainnet, 8453 = Base mainnet. Other chains unsupported.
token_inYesEIP-55 checksummed address of the token being sold. For native ETH, pass the WETH address (Ethereum: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; Base: 0x4200000000000000000000000000000000000006).
amount_inYesInput 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_outYesEIP-55 checksummed address of the token being bought.

Output Schema

ParametersJSON Schema
NameRequiredDescription
chain_idYes
token_inYes
amount_inYes
token_outYes
amount_outYes
block_numberYes
no_liquidityYes
fee_tier_usedYes
effective_rateYes
quotes_per_tierYes
amount_out_humanYes
amount_in_decimalsYes
amount_out_decimalsYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description 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.

Purpose5/5

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.

Usage Guidelines5/5

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 VolumeA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of DEX protocols to return.
protocolsNoOptional protocol names or DeFiLlama slugs, such as ['uniswap-v3', 'curve-dex']. When omitted, return the largest DEX protocols.
lookback_daysNoWindow used to rank the returned protocols: 1, 7, or 30 days (nearest supported window is used).

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
dexesYes
errorNo
error_typeNo
total_matchingYes
total_availableYes
volume_share_basisYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 BalanceA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
chain_idNoChain ID (1=Ethereum, 8453=Base)
token_addressYesERC-20 token contract address (0x…)
wallet_addressYesWallet address (0x…)

Output Schema

ParametersJSON Schema
NameRequiredDescription
chain_idYes
balance_rawYes
token_symbolYes
token_addressYes
token_decimalsYes
wallet_addressYes
balance_formattedYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 BalanceA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesEthereum address (0x…)
chain_idNoChain ID (1=Ethereum, 8453=Base)

Output Schema

ParametersJSON Schema
NameRequiredDescription
addressYes
chain_idYes
balance_ethYes
balance_weiYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines5/5

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 PriceA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
chain_idNoChain ID (1=Ethereum, 8453=Base)
include_usd_estimateNoIf 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

ParametersJSON Schema
NameRequiredDescription
chain_idYes
base_fee_gweiYes
eth_price_usdNo
gas_price_gweiYes
gas_used_ratioYes
priority_fee_gweiYes
next_base_fee_gweiYes
estimated_swap_cost_usdNo
estimated_transfer_cost_usdNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 RatesA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
assetsNoOptional asset-symbol filter (e.g., ['USDC','DAI']). Case-insensitive. Max 20 symbols.
chain_idNoChain ID (1=Ethereum, 8453=Base).
protocolNoProtocol to query: 'aave-v3', 'compound-v3', or 'all'.all

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
ratesYes
errorsNo
chain_idYes
protocolYes
data_block_numberYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 RiskA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
chain_idNoChain ID (1=Ethereum, 8453=Base)
wallet_addressesYesWallet addresses to assess (max 50; duplicates are silently removed).

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
resultsYes
summaryYes
chain_idYes
data_block_numberYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 TvlA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLookback window in days for the historical series (only used when include_historical=True).
protocolNoDeFiLlama 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=[...].
protocolsNoOptional batch mode: list of DeFiLlama protocol slugs. When provided, the tool returns one TVL result object per protocol.
include_historicalNoIf true, return a daily historical TVL series for the requested window.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ApprovalsA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
tokensNoToken contract addresses to check (max 50). Defaults to the platform tracked token list.
chain_idNoChain ID (1=Ethereum, 8453=Base)
spendersNoSpender contract addresses to check (max 20). Defaults to the curated DeFi protocol list.
wallet_addressYesWallet address (0x…)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
errorNo
chain_idYes
approvalsYes
risk_summaryYes
wallet_addressYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PriceA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
tokensYesToken symbols or CoinGecko IDs (e.g. ['BTC', 'ETH', 'SOL'])
vs_currencyNoQuote currency (usd, eur, gbp, btc, eth)usd

Output Schema

ParametersJSON Schema
NameRequiredDescription
pricesYes
vs_currencyYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines5/5

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 HistoricalA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLookback window in days (1–365). 1=5-min granularity, 2-90=hourly, 91+=daily.
tokensYesToken symbols or CoinGecko IDs (e.g. ['BTC', 'ETH']). Max 10 per call.
stats_onlyNoIf true, omit the daily price series and return period stats plus precomputed 30-day high/volatility and 90-day DCA baseline metrics.
vs_currencyNoQuote currency (usd, eur, gbp, btc, eth). Lowercase 3–10 letters.usd

Output Schema

ParametersJSON Schema
NameRequiredDescription
daysYes
tokensYes
vs_currencyYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 TransactionA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
tx_hashYesTransaction hash (0x…)
chain_idNoChain ID (1=Ethereum, 8453=Base)

Output Schema

ParametersJSON Schema
NameRequiredDescription
logsNo
statusNo1=success, 0=revert, None=pending
fee_ethNo
fee_weiNo
tx_hashYes
chain_idYes
gas_usedYes
value_ethYes
input_dataNoHex calldata, bounded to 8 KiB
to_addressYes
block_numberYes
from_addressYes
gas_price_gweiYes
logs_truncatedNo
transaction_indexNo
input_data_truncatedNo
effective_gas_price_gweiNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

The description states a specific verb + resource ('Get 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.

Usage Guidelines5/5

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 ApprovalsA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
chain_idYesDeBank chain identifier, for example eth, arb, or base
wallet_addressYesEVM wallet address (0x-prefixed)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
errorsNo
chain_idYes
approvalsNo
provenanceYes
data_completeYes
wallet_addressYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 HistoryA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
chain_idsNoOptional DeBank chain identifiers; omit to query all supported chains.
page_countNoNumber of history entries to request (maximum 20).
start_timeNoReturn entries earlier than this Unix timestamp for cursor pagination.
wallet_addressYesEVM wallet address (0x-prefixed)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
errorsNo
cex_dictNo
has_moreNo
chain_idsYes
page_countYes
provenanceYes
start_timeYes
token_dictNo
next_cursorNo
history_listNo
project_dictNo
data_completeYes
wallet_addressYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description 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.

Purpose5/5

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.

Usage Guidelines5/5

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 PortfolioA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
chain_idNoChain ID (1=Ethereum, 8453=Base)
wallet_addressYesWallet address (0x…)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
chain_idYes
holdingsYes
fetch_errorsNo
wallet_addressYes
total_value_usdYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PositionsA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
wallet_addressYesEVM wallet address (0x…)
include_net_worthNoInclude all-chain net worth and per-chain balances; disable to avoid that additional provider request.
include_token_listsNoInclude protocol position token lists; disable for a compact balance and debt summary.
include_token_balancesNoInclude DeBank's complete cross-chain token balance list; adds a billable provider request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
errorsNo
positionsNo
provenanceYes
data_completeYes
total_net_usdNo
chain_balancesNo
token_balancesNo
total_debt_usdNo
wallet_addressYes
total_asset_usdNo
include_net_worthYes
staleness_secondsNoMax age in seconds of the underlying DeBank position data (from per-item update_at), or None when unavailable.
include_token_listsYes
total_net_worth_usdNo
include_token_balancesYes

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 RatesA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
chainNoFilter by chain name (e.g. 'Ethereum', 'Base', 'Arbitrum'). Case-insensitive. None = all chains.
limitNoMaximum number of pools to return, sorted by APY descending.
max_apyNoExclude 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_apyNoExclude pools with APY below this value (%). Default 0 includes all.
protocolsNoFilter by DeFiLlama project slugs (e.g. ['aave-v3', 'compound-v3']). None or empty list = include all protocols.
min_tvl_usdNoExclude pools with TVL below this threshold (USD). Default $1M filters noise.
stable_onlyNoWhen true, return only stablecoin pools and rank by 30d mean APY first to emphasize consistency over short-term spikes.
symbols_anyNoOptional 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

ParametersJSON Schema
NameRequiredDescription
noteYes
poolsYes
provenanceNoSource and freshness metadata for the DeFiLlama response.
total_matchingYes
filters_appliedYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 FetchA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesURL to fetch (http or https only)
max_charsNoMaximum characters of extracted content to return

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
titleYes
contentYes
truncatedYes
content_lengthYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ContractA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoDEPRECATED: Positional arguments for the function call. Use 'args_json' for complex objects or Gemini compatibility.
chain_idNoChain ID (1=Ethereum, 8453=Base)
args_jsonNoOptional 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_fragmentYesJSON 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_nameYesName of the function to call
caller_addressNoOptional EVM address to supply as msg.sender for caller-dependent view functions. This does not sign or submit a transaction.
block_identifierNoBlock number, block hash, or 'latest'/'earliest'/'pending'latest
contract_addressYesContract address (0x…)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes
chain_idYes
function_nameYes
caller_addressNo
block_identifierYes
contract_addressYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

Provides an explicit 'Use when' condition (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 PredictionsA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
predictionsYesThe complete structured prediction document for this run.

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordedYes

TDQS

A3.8/5.0
Behavior1/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 EnsA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesENS 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

ParametersJSON Schema
NameRequiredDescription
nameYes
errorNo
avatarNo
addressYes
resolvedYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 OpportunityA
Read-only
Inspect

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

ParametersJSON Schema
NameRequiredDescriptionDefault
pool_idYesDeFiLlama yield pool UUID (e.g. '747c1d2a-c668-4682-b9f9-296708a3dd90').

Output Schema

ParametersJSON Schema
NameRequiredDescription
as_ofYes
chainNo
symbolNo
pool_idYes
projectNo
verdictYes
provenanceYes
risk_factorsNo
data_completeNo
yield_summaryNo
partial_errorsNo
liquidity_summaryNo
sustainability_reasonYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedget_wallet_positions6 fields changed
      • addedInput schema / properties / include_token_lists
        Added value: +{
        +  "default": true,
        +  "description": "Include protocol position token lists; disable for a compact balance and debt summary.",
        +  "title": "Include Token Lists",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / include_token_lists
        Added value: +{
        +  "title": "Include Token Lists",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / total_asset_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Total Asset Usd"
        +}
      • addedOutput schema / properties / total_debt_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Total Debt Usd"
        +}
      • addedOutput schema / properties / total_net_usd
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Total Net Usd"
        +}
      • changedOutput schema / required
        Previous 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"
        +]
  2. 1 tool update
    • Changeddiscover_agents2 fields changed
      • addedOutput schema / properties / registration_benefits_url
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Machine-readable registration benefits, requirements, and non-guarantees.",
        +  "title": "Registration Benefits Url"
        +}
      • addedOutput schema / properties / registration_endpoint
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Endpoint where an organization can publish its own A2A endpoint.",
        +  "title": "Registration Endpoint"
        +}
  3. 2 tool updates
    • Addedassess_counterparty_risk
    • Addedvalidate_opportunity
  4. 2 tool updates
    • Changeddelegate_to_agent1 field changed
      • addedOutput schema / properties / error_type
        Added 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"
        +}
    • Changeddiscover_agents3 fields changed
      • changedInput schema / properties / q / description
        Previous value: -"Optional search across agent name and organization slug"New value: +"Optional search across agent name, organization slug, or published tool name"
      • addedOutput schema / $defs / DiscoveredAgent / properties / registered_at
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "UTC timestamp when the organization first registered its A2A endpoint",
        +  "title": "Registered At"
        +}
      • addedOutput schema / $defs / DiscoveredAgent / properties / tool_names
        Added value: +{
        +  "description": "Names of up to 20 active published tools exposed by the agent organization",
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Tool Names",
        +  "type": "array"
        +}
  5. 1 tool update
    • Addeddiscover_agents
  6. 1 tool update
    • Addedrecord_predictions
  7. 3 tool updates
    • Addedget_wallet_approvals
    • Addedget_wallet_history
    • Addedget_wallet_positions
  8. 27 tool updates
    • Changedcalculate3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / expression / title
        Added value: +"Expression"
      • addedInput schema / title
        Added value: +"mcp_calculateArguments"
    • Changedconvert_currency5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / amount / title
        Added value: +"Amount"
      • addedInput schema / properties / from_currency / title
        Added value: +"From Currency"
      • addedInput schema / properties / to_currency / title
        Added value: +"To Currency"
      • addedInput schema / title
        Added value: +"mcp_convert_currencyArguments"
    • Changedcount_text_stats3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / text / title
        Added value: +"Text"
      • addedInput schema / title
        Added value: +"mcp_count_text_statsArguments"
    • Changeddecode_transaction5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / abi_json / title
        Added value: +"Abi Json"
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / properties / tx_hash / title
        Added value: +"Tx Hash"
      • addedInput schema / title
        Added value: +"mcp_decode_transactionArguments"
    • Changeddelegate_to_agent5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / agent_url / title
        Added value: +"Agent Url"
      • addedInput schema / properties / task_description / title
        Added value: +"Task Description"
      • addedInput schema / properties / task_type / title
        Added value: +"Task Type"
      • addedInput schema / title
        Added value: +"mcp_delegate_to_agentArguments"
    • Changedget_block4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / block_identifier / title
        Added value: +"Block Identifier"
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / title
        Added value: +"mcp_get_blockArguments"
    • Changedget_chain_metrics12 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / chains / title
        Added value: +"Chains"
      • addedInput schema / properties / days / title
        Added value: +"Days"
      • addedInput schema / properties / limit / title
        Added value: +"Limit"
      • addedInput schema / title
        Added value: +"mcp_get_chain_metricsArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / chains / items / $ref
        Added value: +"#/$defs/ChainMetricsEntry"
      • removedOutput schema / properties / chains / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / chains / items / required
        Removed 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"
        -]
      • removedOutput schema / properties / chains / items / title
        Removed value: -"ChainMetricsEntry"
      • removedOutput schema / properties / chains / items / type
        Removed value: -"object"
      • changedOutput schema / properties / provenance / anyOf
        Previous 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"
        +  }
        +]
    • Changedget_datetime3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / format / title
        Added value: +"Format"
      • addedInput schema / title
        Added value: +"mcp_get_datetimeArguments"
    • Changedget_defi_positions22 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / properties / wallet_address / title
        Added value: +"Wallet Address"
      • addedInput schema / title
        Added value: +"mcp_get_defi_positionsArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • changedOutput schema / properties / aave_v3 / anyOf
        Previous 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"
        +  }
        +]
      • addedOutput schema / properties / compound_v3 / items / $ref
        Added value: +"#/$defs/CompoundMarketPosition"
      • removedOutput schema / properties / compound_v3 / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / compound_v3 / items / required
        Removed value: -[
        -  "market_name",
        -  "market_address",
        -  "base_asset_symbol",
        -  "base_asset_address",
        -  "supplied_amount",
        -  "borrowed_amount",
        -  "collateral",
        -  "is_liquidatable"
        -]
      • removedOutput schema / properties / compound_v3 / items / title
        Removed value: -"CompoundMarketPosition"
      • removedOutput schema / properties / compound_v3 / items / type
        Removed value: -"object"
      • addedOutput schema / properties / errors / items / $ref
        Added value: +"#/$defs/ProtocolErrorInfo"
      • removedOutput schema / properties / errors / items / properties
        Removed value: -{
        -  "error": {
        -    "title": "Error",
        -    "type": "string"
        -  },
        -  "protocol": {
        -    "title": "Protocol",
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / properties / errors / items / required
        Removed value: -[
        -  "protocol",
        -  "error"
        -]
      • removedOutput schema / properties / errors / items / title
        Removed value: -"ProtocolErrorInfo"
      • removedOutput schema / properties / errors / items / type
        Removed value: -"object"
      • changedOutput schema / properties / lido_staking / anyOf
        Previous 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"
        +  }
        +]
      • addedOutput schema / properties / uniswap_v3 / items / $ref
        Added value: +"#/$defs/UniswapV3Position"
      • removedOutput schema / properties / uniswap_v3 / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / uniswap_v3 / items / required
        Removed value: -[
        -  "token_id",
        -  "token0_address",
        -  "token1_address",
        -  "fee_tier_raw",
        -  "tick_lower",
        -  "tick_upper",
        -  "liquidity",
        -  "tokens_owed_0",
        -  "tokens_owed_1",
        -  "status"
        -]
      • removedOutput schema / properties / uniswap_v3 / items / title
        Removed value: -"UniswapV3Position"
      • removedOutput schema / properties / uniswap_v3 / items / type
        Removed value: -"object"
    • Changedget_dex_quote12 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / amount_in / title
        Added value: +"Amount In"
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / properties / token_in / title
        Added value: +"Token In"
      • addedInput schema / properties / token_out / title
        Added value: +"Token Out"
      • addedInput schema / title
        Added value: +"mcp_get_dex_quoteArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / quotes_per_tier / items / $ref
        Added value: +"#/$defs/TierQuote"
      • removedOutput schema / properties / quotes_per_tier / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / quotes_per_tier / items / required
        Removed value: -[
        -  "fee_tier",
        -  "success"
        -]
      • removedOutput schema / properties / quotes_per_tier / items / title
        Removed value: -"TierQuote"
      • removedOutput schema / properties / quotes_per_tier / items / type
        Removed value: -"object"
    • Changedget_dex_volume11 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / limit / title
        Added value: +"Limit"
      • addedInput schema / properties / lookback_days / title
        Added value: +"Lookback Days"
      • addedInput schema / properties / protocols / title
        Added value: +"Protocols"
      • addedInput schema / title
        Added value: +"mcp_get_dex_volumeArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / dexes / items / $ref
        Added value: +"#/$defs/DexVolumeEntry"
      • removedOutput schema / properties / dexes / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / dexes / items / required
        Removed 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"
        -]
      • removedOutput schema / properties / dexes / items / title
        Removed value: -"DexVolumeEntry"
      • removedOutput schema / properties / dexes / items / type
        Removed value: -"object"
    • Changedget_erc20_balance5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / properties / token_address / title
        Added value: +"Token Address"
      • addedInput schema / properties / wallet_address / title
        Added value: +"Wallet Address"
      • addedInput schema / title
        Added value: +"mcp_get_erc20_balanceArguments"
    • Changedget_eth_balance4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / address / title
        Added value: +"Address"
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / title
        Added value: +"mcp_get_eth_balanceArguments"
    • Changedget_gas_price4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / properties / include_usd_estimate / title
        Added value: +"Include Usd Estimate"
      • addedInput schema / title
        Added value: +"mcp_get_gas_priceArguments"
    • Changedget_lending_rates11 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / assets / title
        Added value: +"Assets"
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / properties / protocol / title
        Added value: +"Protocol"
      • addedInput schema / title
        Added value: +"mcp_get_lending_ratesArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / rates / items / $ref
        Added value: +"#/$defs/LendingRateEntry"
      • removedOutput schema / properties / rates / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / rates / items / required
        Removed value: -[
        -  "protocol",
        -  "chain_id",
        -  "market_name",
        -  "asset_symbol",
        -  "supply_apy_pct",
        -  "borrow_apy_pct"
        -]
      • removedOutput schema / properties / rates / items / title
        Removed value: -"LendingRateEntry"
      • removedOutput schema / properties / rates / items / type
        Removed value: -"object"
    • Changedget_liquidation_risk15 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / properties / wallet_addresses / title
        Added value: +"Wallet Addresses"
      • addedInput schema / title
        Added value: +"mcp_get_liquidation_riskArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / results / items / $ref
        Added value: +"#/$defs/WalletRiskResult"
      • removedOutput schema / properties / results / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / results / items / required
        Removed value: -[
        -  "wallet_address",
        -  "chain_id",
        -  "overall_tier"
        -]
      • removedOutput schema / properties / results / items / title
        Removed value: -"WalletRiskResult"
      • removedOutput schema / properties / results / items / type
        Removed value: -"object"
      • addedOutput schema / properties / summary / $ref
        Added value: +"#/$defs/RiskSummary"
      • removedOutput schema / properties / summary / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / summary / required
        Removed value: -[
        -  "total_wallets",
        -  "liquidatable_count",
        -  "critical_count",
        -  "warning_count",
        -  "caution_count",
        -  "healthy_count",
        -  "no_debt_count"
        -]
      • removedOutput schema / properties / summary / title
        Removed value: -"RiskSummary"
      • removedOutput schema / properties / summary / type
        Removed value: -"object"
    • Changedget_protocol_tvl6 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / days / title
        Added value: +"Days"
      • addedInput schema / properties / include_historical / title
        Added value: +"Include Historical"
      • addedInput schema / properties / protocol / title
        Added value: +"Protocol"
      • addedInput schema / properties / protocols / title
        Added value: +"Protocols"
      • addedInput schema / title
        Added value: +"mcp_get_protocol_tvlArguments"
    • Changedget_token_approvals17 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / properties / spenders / title
        Added value: +"Spenders"
      • addedInput schema / properties / tokens / title
        Added value: +"Tokens"
      • addedInput schema / properties / wallet_address / title
        Added value: +"Wallet Address"
      • addedInput schema / title
        Added value: +"mcp_get_token_approvalsArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / approvals / items / $ref
        Added value: +"#/$defs/ApprovalEntry"
      • removedOutput schema / properties / approvals / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / approvals / items / required
        Removed value: -[
        -  "token_symbol",
        -  "token_address",
        -  "spender_name",
        -  "spender_address",
        -  "allowance_raw",
        -  "allowance_formatted",
        -  "is_unlimited",
        -  "is_permit2",
        -  "risk_level"
        -]
      • removedOutput schema / properties / approvals / items / title
        Removed value: -"ApprovalEntry"
      • removedOutput schema / properties / approvals / items / type
        Removed value: -"object"
      • addedOutput schema / properties / risk_summary / $ref
        Added value: +"#/$defs/RiskSummary"
      • removedOutput schema / properties / risk_summary / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / risk_summary / required
        Removed value: -[
        -  "total_approvals",
        -  "unlimited_approvals",
        -  "high_risk_approvals",
        -  "unknown_spenders"
        -]
      • removedOutput schema / properties / risk_summary / title
        Removed value: -"RiskSummary"
      • removedOutput schema / properties / risk_summary / type
        Removed value: -"object"
    • Changedget_token_price10 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / tokens / title
        Added value: +"Tokens"
      • addedInput schema / properties / vs_currency / title
        Added value: +"Vs Currency"
      • addedInput schema / title
        Added value: +"mcp_get_token_priceArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / prices / items / $ref
        Added value: +"#/$defs/TokenPriceEntry"
      • removedOutput schema / properties / prices / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / prices / items / required
        Removed value: -[
        -  "id",
        -  "symbol",
        -  "price",
        -  "market_cap",
        -  "volume_24h",
        -  "change_24h_pct"
        -]
      • removedOutput schema / properties / prices / items / title
        Removed value: -"TokenPriceEntry"
      • removedOutput schema / properties / prices / items / type
        Removed value: -"object"
    • Changedget_token_price_historical12 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / days / title
        Added value: +"Days"
      • addedInput schema / properties / stats_only / title
        Added value: +"Stats Only"
      • addedInput schema / properties / tokens / title
        Added value: +"Tokens"
      • addedInput schema / properties / vs_currency / title
        Added value: +"Vs Currency"
      • addedInput schema / title
        Added value: +"mcp_get_token_price_historicalArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / tokens / items / $ref
        Added value: +"#/$defs/TokenHistoricalEntry"
      • removedOutput schema / properties / tokens / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / tokens / items / required
        Removed value: -[
        -  "id",
        -  "symbol",
        -  "price_start",
        -  "price_end",
        -  "price_change_pct",
        -  "price_high",
        -  "price_low",
        -  "daily_prices"
        -]
      • removedOutput schema / properties / tokens / items / title
        Removed value: -"TokenHistoricalEntry"
      • removedOutput schema / properties / tokens / items / type
        Removed value: -"object"
    • Changedget_transaction10 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / properties / tx_hash / title
        Added value: +"Tx Hash"
      • addedInput schema / title
        Added value: +"mcp_get_transactionArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / logs / items / $ref
        Added value: +"#/$defs/TransactionLog"
      • removedOutput schema / properties / logs / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / logs / items / required
        Removed value: -[
        -  "address",
        -  "topics",
        -  "data"
        -]
      • removedOutput schema / properties / logs / items / title
        Removed value: -"TransactionLog"
      • removedOutput schema / properties / logs / items / type
        Removed value: -"object"
    • Changedget_wallet_portfolio10 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / properties / wallet_address / title
        Added value: +"Wallet Address"
      • addedInput schema / title
        Added value: +"mcp_get_wallet_portfolioArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / holdings / items / $ref
        Added value: +"#/$defs/PortfolioEntry"
      • removedOutput schema / properties / holdings / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / holdings / items / required
        Removed value: -[
        -  "symbol",
        -  "token_address",
        -  "balance_formatted",
        -  "price_usd",
        -  "value_usd"
        -]
      • removedOutput schema / properties / holdings / items / title
        Removed value: -"PortfolioEntry"
      • removedOutput schema / properties / holdings / items / type
        Removed value: -"object"
    • Changedget_yield_rates17 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / chain / title
        Added value: +"Chain"
      • addedInput schema / properties / limit / title
        Added value: +"Limit"
      • addedInput schema / properties / max_apy / title
        Added value: +"Max Apy"
      • addedInput schema / properties / min_apy / title
        Added value: +"Min Apy"
      • addedInput schema / properties / min_tvl_usd / title
        Added value: +"Min Tvl Usd"
      • addedInput schema / properties / protocols / title
        Added value: +"Protocols"
      • addedInput schema / properties / stable_only / title
        Added value: +"Stable Only"
      • addedInput schema / properties / symbols_any / title
        Added value: +"Symbols Any"
      • addedInput schema / title
        Added value: +"mcp_get_yield_ratesArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / pools / items / $ref
        Added value: +"#/$defs/YieldPoolEntry"
      • removedOutput schema / properties / pools / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / pools / items / required
        Removed value: -[
        -  "pool_id",
        -  "project",
        -  "symbol",
        -  "chain",
        -  "tvl_usd",
        -  "apy",
        -  "apy_mean_7d",
        -  "apy_mean_30d",
        -  "apy_base",
        -  "apy_reward",
        -  "stable",
        -  "il_risk"
        -]
      • removedOutput schema / properties / pools / items / title
        Removed value: -"YieldPoolEntry"
      • removedOutput schema / properties / pools / items / type
        Removed value: -"object"
      • changedOutput schema / properties / provenance / anyOf
        Previous 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"
        +  }
        +]
    • Changedhttp_fetch4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / max_chars / title
        Added value: +"Max Chars"
      • addedInput schema / properties / url / title
        Added value: +"Url"
      • addedInput schema / title
        Added value: +"mcp_http_fetchArguments"
    • Changedread_contract10 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / abi_fragment / title
        Added value: +"Abi Fragment"
      • addedInput schema / properties / args / title
        Added value: +"Args"
      • addedInput schema / properties / args_json / title
        Added value: +"Args Json"
      • addedInput schema / properties / block_identifier / title
        Added value: +"Block Identifier"
      • addedInput schema / properties / caller_address / title
        Added value: +"Caller Address"
      • addedInput schema / properties / chain_id / title
        Added value: +"Chain Id"
      • addedInput schema / properties / contract_address / title
        Added value: +"Contract Address"
      • addedInput schema / properties / function_name / title
        Added value: +"Function Name"
      • addedInput schema / title
        Added value: +"mcp_read_contractArguments"
    • Changedresolve_ens3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / name / title
        Added value: +"Name"
      • addedInput schema / title
        Added value: +"mcp_resolve_ensArguments"
    • Changedweb_search12 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / num_results / title
        Added value: +"Num Results"
      • addedInput schema / properties / query / title
        Added value: +"Query"
      • addedInput schema / properties / search_depth / title
        Added value: +"Search Depth"
      • addedInput schema / properties / topic / title
        Added value: +"Topic"
      • addedInput schema / title
        Added value: +"mcp_web_searchArguments"
      • addedOutput schema / $defs
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / results / items / $ref
        Added value: +"#/$defs/SearchResult"
      • removedOutput schema / properties / results / items / properties
        Removed 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"
        -  }
        -}
      • removedOutput schema / properties / results / items / required
        Removed value: -[
        -  "title",
        -  "url",
        -  "snippet"
        -]
      • removedOutput schema / properties / results / items / title
        Removed value: -"SearchResult"
      • removedOutput schema / properties / results / items / type
        Removed value: -"object"
  9. 1 tool update
    • Changedget_defi_positions2 fields changed
      • addedOutput schema / properties / lido_staking
        Added 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
        +}
      • changedOutput schema / properties / note / default
        Previous 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."
  10. 4 tool updates
    • Changedget_chain_metrics1 field changed
      • addedOutput schema / properties / provenance
        Added 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."
        +}
    • Changedget_transaction8 fields changed
      • addedOutput schema / properties / effective_gas_price_gwei
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Effective Gas Price Gwei"
        +}
      • addedOutput schema / properties / fee_eth
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Fee Eth"
        +}
      • addedOutput schema / properties / fee_wei
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Fee Wei"
        +}
      • addedOutput schema / properties / input_data
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Hex calldata, bounded to 8 KiB",
        +  "title": "Input Data"
        +}
      • addedOutput schema / properties / input_data_truncated
        Added value: +{
        +  "default": false,
        +  "title": "Input Data Truncated",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / logs
        Added 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"
        +}
      • addedOutput schema / properties / logs_truncated
        Added value: +{
        +  "default": false,
        +  "title": "Logs Truncated",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / transaction_index
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Transaction Index"
        +}
    • Changedget_yield_rates1 field changed
      • addedOutput schema / properties / provenance
        Added 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."
        +}
    • Changedread_contract2 fields changed
      • addedInput schema / properties / caller_address
        Added 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."
        +}
      • addedOutput schema / properties / caller_address
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Caller Address"
        +}
  11. 1 tool update
    • Changedget_token_price_historical5 fields changed
      • changedInput schema / properties / stats_only / description
        Previous 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."
      • addedOutput schema / properties / tokens / items / properties / dca_baseline_90d
        Added 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"
        +}
      • addedOutput schema / properties / tokens / items / properties / dca_baseline_90d_partial
        Added 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"
        +}
      • addedOutput schema / properties / tokens / items / properties / high_30d
        Added 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"
        +}
      • addedOutput schema / properties / tokens / items / properties / std_30d
        Added 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"
        +}
  12. 2 tool updates
    • Addedget_chain_metrics
    • Addedget_dex_volume
  13. 1 tool update
    • Changedget_yield_rates1 field changed
      • addedInput schema / properties / max_apy
        Added 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

  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    16
    7 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources