Skip to main content
Glama

LP Pool Check

Check one liquidity pool

check_pool
Read-onlyIdempotent

Use this when the user asks about one real liquidity pool, such as "volume and fee APR for WETH and USDC on Ethereum" or "is this pool APR a spike?". Pass pool_id (a DefiLlama UUID), or chain plus token_a and token_b, for example chain "ethereum", token_a "WETH", token_b "USDC". Do not try pool_address first: the open index has no pool contract addresses, so it always returns needs_tokens. Returns 1-day and 7-day volume and fee APR, TVL, an APR flag with a reason, a risk checklist with warnings, price trend, token risk flags when a public source covers them, and an informational position-type label. Symbols for one token pair with several fee tiers or exchanges return the highest-TVL pool, with the others in other_tiers. Symbols that match different tokens return status ambiguous. The optional range fields (price_lower, price_upper, price_now, holding_days, capital_usd, gas_usd, exit_cost_usd) add the same fee-versus-impermanent-loss estimate as estimate_lp, at this pool's fee APR. For a pure what-if with no pool, use estimate_lp.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
chainNoChain name or short alias, used with token_a and token_b: ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, solana, zksync, linea, gnosis, scroll, mantle, celo, sonic, or sui. Aliases such as eth, arb, op, bnb, matic, avax, and sol also work
gas_usdNoGas you expect to pay to enter and exit, in the same currency as capital_usd
pool_idNoDefiLlama pool id, a UUID such as "b99bcdf5-1350-4269-981e-0e9b5cccb007", from find_active_pools or other_tiers. Send it alone
token_aNoFirst token symbol or contract address, such as "WETH" or "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2". Needs chain and token_b
token_bNoSecond token symbol or contract address, such as "USDC"
price_nowNoCurrent price in the same units as the range
capital_usdNoPosition size, so gas and exit cost can be compared with fees. Not stored as a record of who asked
price_lowerNoLower price of the range, in quote per base
price_upperNoUpper price of the range, in quote per base
holding_daysNoHolding window for the fee-versus-IL estimate. Requires price_lower, price_upper, and price_now
pool_addressNoPool contract address. The open yields index has no pool contract addresses, so this always returns needs_tokens. Prefer pool_id, or chain with token_a and token_b
exit_cost_usdNoOther exit cost, such as a withdrawal fee, in the same currency as capital_usd

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
poolNo
as_ofYesISO 8601 UTC time of the yields index read, or null when nothing was read
noticeYes
statusYesok: one pool read (other fee tiers of the same pair are in other_tiers). ambiguous: the symbols match different tokens, see other_tiers. needs_tokens: pass token addresses or a pool id. not_found: no match. unavailable: a source did not answer
messageNoWhat happened and what to pass next
sourcesYes
apr_flagYesreal: steady trading. spike: a short burst, not a steady rate. unconfirmed: no 7-day comparison, do not call it real
estimateNoFee-versus-impermanent-loss estimate, present only when holding_days and price_now were passed
warningsNo
depth_noteNo
token_riskNoGoPlus token-security flags per token, when the chain is covered
other_tiersNoOther matching pools or fee tiers. Pass one pool_id from here to read it
price_trendNoPrice change per token from DefiLlama coins
active_rangeNoThe open index does not publish the current tick band
position_typeNo
risk_checklistNo
apr_flag_reasonNo
fee_apr_formulaNo
position_type_reasonNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / status / description
      Previous value: -"ok: one pool read. ambiguous: several pools, see other_tiers. needs_tokens: pass token addresses or a pool id. not_found: no match. unavailable: a source did not answer"New value: +"ok: one pool read (other fee tiers of the same pair are in other_tiers). ambiguous: the symbols match different tokens, see other_tiers. needs_tokens: pass token addresses or a pool id. not_found: no match. unavailable: a source did not answer"
  2. Changed46 schema fields changed
    • addedInput schema / description
      Added value: +"Send pool_id alone, or chain plus token_a and token_b, for example {\"chain\": \"ethereum\", \"token_a\": \"WETH\", \"token_b\": \"USDC\"}. pool_address alone always returns needs_tokens."
    • changedInput schema / properties / chain / description
      Previous value: -"Chain name or short alias, such as ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, or solana"New value: +"Chain name or short alias, used with token_a and token_b: ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, solana, zksync, linea, gnosis, scroll, mantle, celo, sonic, or sui. Aliases such as eth, arb, op, bnb, matic, avax, and sol also work"
    • changedInput schema / properties / pool_address / description
      Previous value: -"Pool contract address. The open yields index does not list pool contract addresses; pass token addresses or a pool id instead if this cannot be matched"New value: +"Pool contract address. The open yields index has no pool contract addresses, so this always returns needs_tokens. Prefer pool_id, or chain with token_a and token_b"
    • changedInput schema / properties / pool_id / description
      Previous value: -"DefiLlama pool id (a UUID), from find_active_pools or a previous answer"New value: +"DefiLlama pool id, a UUID such as \"b99bcdf5-1350-4269-981e-0e9b5cccb007\", from find_active_pools or other_tiers. Send it alone"
    • changedInput schema / properties / token_a / description
      Previous value: -"Token symbol or contract address"New value: +"First token symbol or contract address, such as \"WETH\" or \"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2\". Needs chain and token_b"
    • changedInput schema / properties / token_b / description
      Previous value: -"The other token's symbol or contract address"New value: +"Second token symbol or contract address, such as \"USDC\""
    • removedOutput schema / properties / active_range / additionalProperties
      Removed value: -true
    • addedOutput schema / properties / active_range / description
      Added value: +"The open index does not publish the current tick band"
    • addedOutput schema / properties / active_range / properties
      Added value: +{
      +  "message": {
      +    "type": "string"
      +  },
      +  "status": {
      +    "enum": [
      +      "not_in_index"
      +    ],
      +    "type": "string"
      +  }
      +}
    • addedOutput schema / properties / active_range / required
      Added value: +[
      +  "status",
      +  "message"
      +]
    • addedOutput schema / properties / apr_flag / description
      Added value: +"real: steady trading. spike: a short burst, not a steady rate. unconfirmed: no 7-day comparison, do not call it real"
    • addedOutput schema / properties / as_of / description
      Added value: +"ISO 8601 UTC time of the yields index read, or null when nothing was read"
    • removedOutput schema / properties / estimate / additionalProperties
      Removed value: -true
    • addedOutput schema / properties / estimate / description
      Added value: +"Fee-versus-impermanent-loss estimate, present only when holding_days and price_now were passed"
    • addedOutput schema / properties / estimate / properties
      Added value: +{
      +  "assumptions": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "break_even_line": {
      +    "type": "string"
      +  },
      +  "break_even_prices": {
      +    "description": "Later prices where the net result crosses zero, from a sample",
      +    "items": {
      +      "type": "number"
      +    },
      +    "type": "array"
      +  },
      +  "cost_fraction": {
      +    "description": "(gas_usd + exit_cost_usd) / capital_usd. null without capital_usd",
      +    "type": [
      +      "number",
      +      "null"
      +    ]
      +  },
      +  "exit_cost_usd": {
      +    "type": [
      +      "number",
      +      "null"
      +    ]
      +  },
      +  "fee_fraction": {
      +    "description": "Expected fee income over the holding period, as a fraction of the position: 0.0153 means 1.53%",
      +    "type": "number"
      +  },
      +  "fees_cover_il_and_costs": {
      +    "description": "null without price_later",
      +    "type": [
      +      "boolean",
      +      "null"
      +    ]
      +  },
      +  "formula": {
      +    "type": "string"
      +  },
      +  "gas_usd": {
      +    "type": [
      +      "number",
      +      "null"
      +    ]
      +  },
      +  "il_fraction_at_later": {
      +    "description": "Impermanent loss at price_later as a negative fraction. null without price_later",
      +    "type": [
      +      "number",
      +      "null"
      +    ]
      +  },
      +  "in_range_now": {
      +    "description": "Whether price_now is inside the range. null for the full-range formula",
      +    "type": [
      +      "boolean",
      +      "null"
      +    ]
      +  },
      +  "net_versus_holding_at_later": {
      +    "description": "fee_fraction + il_fraction_at_later - cost_fraction",
      +    "type": [
      +      "number",
      +      "null"
      +    ]
      +  },
      +  "sampled_edges": {
      +    "items": {
      +      "properties": {
      +        "il_fraction": {
      +          "type": "number"
      +        },
      +        "net_versus_holding": {
      +          "type": "number"
      +        },
      +        "price": {
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "price",
      +        "il_fraction",
      +        "net_versus_holding"
      +      ],
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  "warnings": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  }
      +}
    • addedOutput schema / properties / fee_apr_formula
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / message / description
      Added value: +"What happened and what to pass next"
    • addedOutput schema / properties / other_tiers / description
      Added value: +"Other matching pools or fee tiers. Pass one pool_id from here to read it"
    • addedOutput schema / properties / other_tiers / items / properties / fee_rate / description
      Added value: +"Swap fee as a fraction, not a percent: 0.003 means 0.3%. Read from pool_meta"
    • addedOutput schema / properties / other_tiers / items / properties / fee_rate / minimum
      Added value: +0
    • addedOutput schema / properties / other_tiers / items / properties / pool_meta / description
      Added value: +"DefiLlama pool label, often the fee tier such as \"0.3%\""
    • addedOutput schema / properties / other_tiers / items / properties / tvl_usd / description
      Added value: +"Total value locked in the pool, in USD"
    • addedOutput schema / properties / other_tiers / items / properties / windows / properties / fee_apr_percent_1d / description
      Added value: +"Fee APR in percent from 1-day volume: volume x fee_rate x 365 / TVL x 100"
    • addedOutput schema / properties / other_tiers / items / properties / windows / properties / fee_apr_percent_7d / description
      Added value: +"Fee APR in percent from 7-day volume, annualized the same way"
    • addedOutput schema / properties / other_tiers / items / properties / windows / properties / volume_usd_1d / description
      Added value: +"Trading volume over the last day, in USD"
    • addedOutput schema / properties / other_tiers / items / properties / windows / properties / volume_usd_7d / description
      Added value: +"Trading volume over the last 7 days, in USD"
    • addedOutput schema / properties / pool / properties / fee_rate / description
      Added value: +"Swap fee as a fraction, not a percent: 0.003 means 0.3%. Read from pool_meta"
    • addedOutput schema / properties / pool / properties / fee_rate / minimum
      Added value: +0
    • addedOutput schema / properties / pool / properties / pool_meta / description
      Added value: +"DefiLlama pool label, often the fee tier such as \"0.3%\""
    • addedOutput schema / properties / pool / properties / tvl_usd / description
      Added value: +"Total value locked in the pool, in USD"
    • addedOutput schema / properties / pool / properties / windows / properties / fee_apr_percent_1d / description
      Added value: +"Fee APR in percent from 1-day volume: volume x fee_rate x 365 / TVL x 100"
    • addedOutput schema / properties / pool / properties / windows / properties / fee_apr_percent_7d / description
      Added value: +"Fee APR in percent from 7-day volume, annualized the same way"
    • addedOutput schema / properties / pool / properties / windows / properties / volume_usd_1d / description
      Added value: +"Trading volume over the last day, in USD"
    • addedOutput schema / properties / pool / properties / windows / properties / volume_usd_7d / description
      Added value: +"Trading volume over the last 7 days, in USD"
    • addedOutput schema / properties / price_trend / description
      Added value: +"Price change per token from DefiLlama coins"
    • removedOutput schema / properties / price_trend / items / additionalProperties
      Removed value: -true
    • addedOutput schema / properties / price_trend / items / properties
      Added value: +{
      +  "change_1d_percent": {
      +    "description": "Price change over 1 day, in percent",
      +    "type": [
      +      "number",
      +      "null"
      +    ]
      +  },
      +  "change_7d_percent": {
      +    "description": "Price change over 7 days, in percent",
      +    "type": [
      +      "number",
      +      "null"
      +    ]
      +  },
      +  "points": {
      +    "description": "How many price points the change uses",
      +    "type": "integer"
      +  },
      +  "status": {
      +    "description": "unsupported: no public source covers this chain",
      +    "enum": [
      +      "ok",
      +      "unavailable",
      +      "unsupported"
      +    ],
      +    "type": "string"
      +  },
      +  "token": {
      +    "type": "string"
      +  }
      +}
    • addedOutput schema / properties / price_trend / items / required
      Added value: +[
      +  "token",
      +  "status",
      +  "change_1d_percent",
      +  "change_7d_percent",
      +  "points"
      +]
    • removedOutput schema / properties / sources / items / additionalProperties
      Removed value: -true
    • addedOutput schema / properties / sources / items / properties
      Added value: +{
      +  "as_of": {
      +    "description": "ISO 8601 UTC time of the yields index read, or null when nothing was read",
      +    "type": [
      +      "string",
      +      "null"
      +    ]
      +  },
      +  "name": {
      +    "type": "string"
      +  },
      +  "note": {
      +    "type": "string"
      +  },
      +  "url": {
      +    "type": "string"
      +  }
      +}
    • addedOutput schema / properties / sources / items / required
      Added value: +[
      +  "name",
      +  "as_of"
      +]
    • addedOutput schema / properties / status / description
      Added value: +"ok: one pool read. ambiguous: several pools, see other_tiers. needs_tokens: pass token addresses or a pool id. not_found: no match. unavailable: a source did not answer"
    • addedOutput schema / properties / token_risk / description
      Added value: +"GoPlus token-security flags per token, when the chain is covered"
    • removedOutput schema / properties / token_risk / items / additionalProperties
      Removed value: -true
    • addedOutput schema / properties / token_risk / items / properties
      Added value: +{
      +  "buy_tax": {
      +    "description": "GoPlus scale, where 1 means 100%",
      +    "type": [
      +      "number",
      +      "null"
      +    ]
      +  },
      +  "cannot_buy": {
      +    "type": [
      +      "boolean",
      +      "null"
      +    ]
      +  },
      +  "freeze_or_blacklist": {
      +    "type": [
      +      "boolean",
      +      "null"
      +    ]
      +  },
      +  "holder_count": {
      +    "type": [
      +      "number",
      +      "null"
      +    ]
      +  },
      +  "honeypot": {
      +    "type": [
      +      "boolean",
      +      "null"
      +    ]
      +  },
      +  "mintable": {
      +    "type": [
      +      "boolean",
      +      "null"
      +    ]
      +  },
      +  "notes": {
      +    "items": {
      +      "type": "string"
      +    },
      +    "type": "array"
      +  },
      +  "sell_tax": {
      +    "description": "GoPlus scale, where 1 means 100%",
      +    "type": [
      +      "number",
      +      "null"
      +    ]
      +  },
      +  "severe": {
      +    "description": "True when a severe flag is set, such as honeypot or cannot-buy",
      +    "type": "boolean"
      +  },
      +  "status": {
      +    "description": "unsupported: no public source covers this chain",
      +    "enum": [
      +      "ok",
      +      "unavailable",
      +      "unsupported"
      +    ],
      +    "type": "string"
      +  },
      +  "token": {
      +    "type": "string"
      +  },
      +  "top10_holder_percent": {
      +    "description": "Share held by the 10 largest holders, in percent",
      +    "type": [
      +      "number",
      +      "null"
      +    ]
      +  },
      +  "top_holder_percent": {
      +    "description": "Share held by the largest holder, in percent",
      +    "type": [
      +      "number",
      +      "null"
      +    ]
      +  },
      +  "trading_cooldown": {
      +    "type": [
      +      "boolean",
      +      "null"
      +    ]
      +  },
      +  "transfer_pausable": {
      +    "type": [
      +      "boolean",
      +      "null"
      +    ]
      +  },
      +  "trusted": {
      +    "type": [
      +      "boolean",
      +      "null"
      +    ]
      +  }
      +}
    • addedOutput schema / properties / token_risk / items / required
      Added value: +[
      +  "token",
      +  "status",
      +  "severe",
      +  "notes"
      +]
  3. Changed1 schema field changed
    • removedOutput schema / properties / note_from_openkrill
      Removed value: -{
      -  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      -  "type": "string"
      -}
  4. Changed1 schema field changed
    • addedOutput schema / properties / note_from_openkrill
      Added value: +{
      +  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      +  "type": "string"
      +}
  5. Changed2 schema fields changed
    • addedOutput schema / properties / risk_checklist
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "id": {
      +        "type": "string"
      +      },
      +      "message": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "status": {
      +        "enum": [
      +          "ok",
      +          "warning",
      +          "unknown"
      +        ],
      +        "type": "string"
      +      },
      +      "triggered": {
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "name",
      +      "triggered",
      +      "status",
      +      "message"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / warnings
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  6. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/openWorld annotations, the description discloses non-obvious behavior: pool_address always fails, multi-tier symbol matches return the highest-TVL pool with others in other_tiers, cross-token symbol matches return status ambiguous, and the response carries an APR flag, risk checklist, price trend and token risk flags. This is real behavioral context an agent cannot get from annotations.

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

Conciseness4/5

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

Front-loaded with the triggering intent, then the identifier rules, then the return shape, then the estimate behavior. Dense but a single long paragraph; a sentence or two could be tightened, though little 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 12-parameter read tool with an output schema and full annotations, the description covers invocation rules, failure modes, ambiguity handling, and optional estimate behavior. An agent has everything needed to call it correctly.

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

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 genuine usage semantics: pool_id is sent alone, chain pairs with token_a and token_b, and the optional range fields add the same fee-vs-IL estimate as estimate_lp at this pool's fee APR. That clarifies inter-parameter dependencies beyond the field docs.

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

Purpose5/5

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

States a specific verb and resource ('check one real liquidity pool') and immediately scopes it with a concrete user-intent example. It clearly separates this tool from estimate_lp (pure what-if) and find_active_pools, so an agent can route 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?

Explicit when-to-use ('when the user asks about one real liquidity pool'), an explicit anti-pattern ('Do not try pool_address first... always returns needs_tokens'), and a named alternative for the adjacent case ('For a pure what-if with no pool, use estimate_lp'). Nothing is left to inference.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.