Ekubo Protocol
REMOTE · MCP.EKUBO.ORG
Token and pool data, swap quotes, and unsigned transaction plans for Ekubo and other DeFi protocols.
Available components
Last scanned (1 hour ago)
Scores higher than 52% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Crypto and Web3
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security66
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation not fully verified: no authorisation is required to call this server, and 14 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability74
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 17546 tokens (~151/item across 116 items; 99 tools + 17 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management3
- Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage95
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 82% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 14 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "get_value_transfer_status" implies "transfer" and declares readOnlyHint instead, contradicting what its own name says it does. See how to fix → Fail
- An AI judge read all 101 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 0
- Stability: unverified → 0.03 ▲ functional
- 4 Nov 26 66
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://mcp.ekubo.org/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=ekubo.org | CN=WE1,O=Google Trust Services,C=US | 28 Sept 2026 | 27 Dec 2026 | ECDSA 256 | ECDSA-SHA256 | 136683b61c23a8e3132c8d9c4dfee255 |
| SANs: ekubo.org, mcp.ekubo.org, *.mcp.ekubo.org | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of mcp.ekubo.org. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| org. | present | 725, 26974 | 8, 8 | Verified |
| ekubo.org. | present | 2371 | 13 | Verified |
| mcp.ekubo.org. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=15552000; includeSubDomains; preload |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | no-referrer |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.ekubo.org/mcp | Verified | 200 | |
| http (plaintext) | http://mcp.ekubo.org/mcp | HTTPS enforced | 301 | https://mcp.ekubo.org/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
decode_pool_config Decode an Ekubo pool config ~58
Decode the packed bytes32 extension, exact uint64 Q64 fee, concentrated/stableswap discriminator, and tick spacing or stableswap parameters. The fee is never returned as a JSON number.
| Name | Type | Req | Description |
|---|---|---|---|
| config | string | yes | bytes32 hex |
| Name | Type | Req | Description |
|---|---|---|---|
| config | string | – | – |
| discriminator_bit_set | boolean | – | – |
| extension | string | – | – |
| fee | string | – | – |
| fee_hex | string | – | – |
| pool_type | string | – | – |
| stableswap_params | object|null | – | – |
| tick_spacing | integer|null | – | – |
| type_config | string | – | – |
No examples provided.
decode_uniswap_v4_position_info Decode Uniswap V4 position info ~56
Decode the packed PositionInfo returned by wallet reads into signed tick bounds, subscriber flag and the truncated pool-ID prefix. This is local integer decoding, not a state query.
| Name | Type | Req | Description |
|---|---|---|---|
| info | string | yes | decimal integer |
| Name | Type | Req | Description |
|---|---|---|---|
| has_subscriber | boolean | – | – |
| instruction | string | – | – |
| pool_id_prefix | string | – | – |
| tick_lower | integer | – | – |
| tick_upper | integer | – | – |
No examples provided.
derive_pool_id Derive an Ekubo pool ID ~57
Pack or accept an exact PoolKey config and derive pool_id = keccak256(abi.encode(PoolKey)). The uint64 Q64 fee is string-only so JavaScript cannot silently round it.
| Name | Type | Req | Description |
|---|---|---|---|
| pool_key | object | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| decoded_config | object | – | – |
| pool_id | string | – | – |
| pool_id_decimal | string | – | – |
| pool_key | object | – | – |
No examples provided.
discover_uniswap_pools Discover Uniswap pools ~103
Fetch indexed V2, V3 or V4 pools ranked by TVL from Uniswap's interface API. Filter by chain and token; paginate using the last pool's TVL as tvl_cursor. Returns token symbols and decimals, liquidity and daily volume.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | string | yes | – |
| first | integer | – | – |
| token_address | string | – | address |
| tvl_cursor | number | – | – |
| version | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | – | – |
| errors | array | – | – |
| fetched_at | string | – | – |
| indexed_data | boolean | – | – |
| partial | boolean | – | – |
| source | string | – | – |
No examples provided.
export_tokens Export Ekubo tokens for a wallet ~147
Return a token_list_reference envelope (chain ID, address, symbol, name, decimals) and its count, with no entries, so a wallet can import token names; pass it unchanged as the wallet tool's reference argument. complete=false means the export is a prefix of the chain's list. Use list_tokens to read entries yourself.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | – | Export only this chain; almost always pass it, since a wallet holds names for the chain it is on. Ethereum alone has about 5,600 tokens |
| max_tokens | integer | – | Defaults to 1,000, what a wallet accepts in one import; a larger export is refused whole, not truncated |
| Name | Type | Req | Description |
|---|---|---|---|
| complete | boolean | – | – |
| count | integer | – | – |
| token_list_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
get_aave_v3_markets List fixed Aave V3 markets ~167
Locally return six major Aave V3 core deployments and a bounded set of popular reserve, aToken, and variable-debt-token addresses from a pinned official Aave address-book snapshot. This tool makes no RPC, indexer, API, or other network request. For live rates, caps, pause state, liquidity, collateral settings, eMode categories, and account data, an agent may call Aave's public GraphQL API at https://api.v3.aave.com/graphql directly; this server is not in that data path. Intersect the API result with this fixed list before calling a preparation tool.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | – | Optional exact chain filter. Omit to return every fixed Aave V3 core market supported by the preparation tools. |
| Name | Type | Req | Description |
|---|---|---|---|
| agent_market_data_discovery | object | – | – |
| limitations | object | – | – |
| markets | array | – | – |
| network_access | string | – | – |
| protocol | string | – | – |
| source | object | – | – |
No examples provided.
get_aerodrome_deployment Get the verified Aerodrome Base deployment ~107
Locally return Aerodrome's Base contracts (AERO, veAERO, Voter, Router, v2 factory, RewardsDistributor, Slipstream, Sugar lenses), derived on chain from the Voter, plus the protocol behaviour an agent must respect. No API or RPC request. Aerodrome is Base-only; Velodrome is not prepared here.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | – | Optional chain to check against Aerodrome's Base-only deployment |
| Name | Type | Req | Description |
|---|---|---|---|
| agent_market_data_discovery | object | – | – |
| deployment | object | – | – |
| limitations | object | – | – |
| network_access | string | – | – |
| protocol | string | – | – |
| source | object | – | – |
No examples provided.
get_lido_deployment Get the fixed Lido mainnet deployment ~50
Locally return canonical Ethereum stETH, wstETH, and WithdrawalQueueERC721 addresses plus direct wallet-read guidance. This server makes no Lido API, RPC, or indexer request.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_market_data_discovery | object | – | – |
| deployment | object | – | – |
| limitations | object | – | – |
| network_access | string | – | – |
| protocol | string | – | – |
| source | object | – | – |
No examples provided.
get_liquidity_opportunities Find Ekubo liquidity opportunities ~236
Return the interface's boosted-fee, incentive and projected ve(3,3)-emission opportunities ranked by APR, with actionable pools or pool-discovery handoffs, freshness and risk context. Call this before asking the user to choose a pair. APR is an annualized snapshot, not guaranteed yield: show its components, denominator, freshness, and range and impermanent-loss risk. If ranking_complete=false, run local_read_requirement through the wallet, decode it locally, and call again with ve33_emission_state.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | – | Omit for every chain |
| limit | integer | – | – |
| min_apr | number | – | APR ratio floor; 1.0 = 100% |
| token | string | – | Token in the pair (EVM or Starknet) (hex) |
| types | array | – | Defaults to all |
| ve33_emission_state | object | – | {current_timestamp, current_emission_rate, total_remaining_emissions}: decimal strings decoded locally from getEmissionState (rate is Q32) via local_read_requirement; omit on the first call |
| Name | Type | Req | Description |
|---|---|---|---|
| local_read_requirement | object|null | – | – |
No examples provided.
get_merkl_deployment Get the verified Merkl Distributor deployment ~75
Locally return the Merkl Distributor address, the chains it is verified on, and how Merkl's reward fields behave; preparation is limited to those chains. No Merkl API, RPC, or indexer request.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | – | Optional chain to check against the verified Merkl Distributor catalog |
| Name | Type | Req | Description |
|---|---|---|---|
| agent_market_data_discovery | object | – | – |
| deployment | object | – | – |
| limitations | object | – | – |
| network_access | string | – | – |
| protocol | string | – | – |
| source | object | – | – |
No examples provided.
get_morpho_vaults List fixed Morpho Vault V2 deployments ~109
Locally return a bounded, pinned catalog of listed Morpho Vault V2 deployments plus official direct-discovery guidance. This tool makes no API, RPC, indexer, or other network request. The agent must query Morpho's public GraphQL API and current onchain state directly, then intersect the result with the fixed chain, vault, and asset addresses before preparation.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | – | Optional exact chain filter for the fixed Morpho Vault V2 catalog |
| Name | Type | Req | Description |
|---|---|---|---|
| agent_market_data_discovery | object | – | – |
| limitations | object | – | – |
| network_access | string | – | – |
| protocol | string | – | – |
| source | object | – | – |
| vaults | array | – | – |
No examples provided.
get_pool Get an Ekubo pool ~92
Resolve a chain/core/pool ID to its verified PoolKey, decoded config and indexed pool state. For fresh sqrtRatio, tick and liquidity, pass current_state_query.read_calls_reference unchanged to wallet_batch_eth_call.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | yes | EVM chain ID |
| core_address | string | yes | address |
| pool_id | string | yes | Pool ID (decimal or 0x-hex integer) |
| Name | Type | Req | Description |
|---|---|---|---|
| current_state_query | object | – | – |
No examples provided.
get_pool_liquidity Get Ekubo pool liquidity depth ~83
Return tick-level net liquidity deltas for one exact chain/core/pool ID. Accumulate the deltas in ascending tick order to reconstruct active liquidity depth.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | yes | EVM chain ID |
| core_address | string | yes | address |
| pool_id | string | yes | Pool ID (decimal or 0x-hex integer) |
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | string | – | – |
| core_address | string | – | – |
| liquidity_deltas | array | – | – |
| pool_id | string | – | – |
| pool_id_decimal | string | – | – |
No examples provided.
get_position Get complete Ekubo position details ~144
Hydrate one owner position: pool key, bounds, liquidity, pool state, NFT metadata, history, rewards, token prices, and a pending read of current principal, fees or Ve33 rewards and owner. Pass current_state_query.read_calls_reference as a value to wallet_batch_eth_call in the same code block; current_state_query.state_call_id joins results[].id.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | yes | EVM chain ID |
| owner | string | yes | Current owner (address) |
| positions_address | string | yes | Ekubo Positions or Ve33Positions manager (address) |
| token_id | string | yes | Position NFT ID (decimal or 0x-hex integer) |
| Name | Type | Req | Description |
|---|---|---|---|
| current_state_query | object | – | – |
No examples provided.
get_position_pool_candidates Find pools for an LP position ~134
List indexed pools for a token pair with verified PoolKeys and pool IDs, Core generation, pool type, extension, 24-hour TVL/volume/fee stats and the right Positions or Ve33Positions manager.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | yes | EVM chain ID |
| core_address | string | – | address |
| extension | string | – | address |
| min_tvl_usd | number | – | TVL floor; default 0 keeps tiny pools visible |
| pool_type | string | – | – |
| token_a | string | yes | Either order (address) |
| token_b | string | yes | address |
| Name | Type | Req | Description |
|---|---|---|---|
| candidate_count | integer | – | – |
| candidates | array | – | – |
| chain_id | string | – | – |
| pair | object | – | – |
| tokens | array | – | – |
No examples provided.
get_positions_by_owner Get Ekubo positions by owner ~118
Enumerate an owner's indexed Ekubo position NFTs with pool keys, bounds, liquidity, indexed pool state and rewards. For fresh onchain state, pass each current_state_reads[].read_calls_reference to wallet_batch_eth_call as a value in the same code block; each position's current_state.state_call_id joins results[].id.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | – | EVM chain ID |
| owner | string | yes | address |
| page | integer | – | – |
| page_size | integer | – | – |
| state | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| current_state_reads | array | – | – |
No examples provided.
get_quotes_with_plans Get swap or bridge quotes with execution plans ~740
A quote, execution plan, simulation or wallet approval is not permission to trade. Robinhood Stock Tokens are tokenised debt securities subject to issuer restrictions and applicable law. Before requesting signatures or submitting approvals or trades, establish the user's relevant jurisdiction and eligibility, including location, residence or entity incorporation, US-person status under Regulation S, any person for whose account or benefit the transaction is made, and issuer Prohibited Investor restrictions. Never infer these facts from an agent or server IP. If required facts or asset-policy coverage are unknown, do not proceed. Only the user or an authorized representative of the actual investor may provide an explicit factual attestation; an agent must not attest on their behalf. A known prohibited fact cannot be overridden by attestation. An attestation is not a license, legal exemption or substitute for required screening. Keep the attestation client-side; do not send it to the quote API or MCP server. No blanket disposal exemption applies. Quote EVM swaps: Ekubo/0x same-chain; Across/LayerZero/LI.FI cross-chain. For plans, supply sender and exactly one protection: whole slippage_bps or exact-input max_output_loss in output base units. Omit all three for indicative quotes. Pass the chosen execution.execution_plan_reference unchanged to wallet simulation; show that result and send the same simulation for owner authorization. Re-quote only after revert, expiry or changed request; never retry reverted bytes or widen protection. For all/max swaps use the wallet's exact balance. Compare amount_out and native_fee (LayerZero charges it separately). Track LayerZero/LI.FI delivery with get_value_transfer_status. unavailable_sources reports provider failures; execution_unavailable reports plan failures.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | string | yes | Base units (positive decimal integer) |
| chain_id | integer|string | yes | EVM chain ID |
| destination_chain_id | integer|string | – | Destination chain; defaults to chain_id for a same-chain swap |
| include_raw_quotes | boolean | – | Echo raw provider responses; only to diagnose a provider |
| max_output_loss | string | – | Exact-input loss budget from quoted output, output-token base units as a decimal integer string; requires sender, omit slippage_bps. Ekubo: exact subtraction. 0x: two quotes, floor budget to whole pp… |
| quote_type | string | yes | – |
| recipient | string | – | Defaults to sender (address) |
| sender | string | – | Transaction sender; pass with exactly one of slippage_bps or max_output_loss for plans (address) |
| slippage_bps | integer | – | Whole-bps calldata bound: 0.1% = 10. With sender supply this OR max_output_loss. Honor user preference; size near gas value / notional * 10,000. For positive sub-bps budgets use max_output_loss, not… |
| swap_deadline_minutes | integer | – | Ekubo router route deadline; default 30 |
| token_in | string | yes | Raw EVM address or CAIP-10 eip155:<chain_id>:<address>; all-zeroes denotes the native token |
| token_out | string | yes | Raw EVM address or CAIP-10 eip155:<chain_id>:<address>; all-zeroes denotes the native token |
| Name | Type | Req | Description |
|---|---|---|---|
| jurisdiction | object | – | jurisdiction metadata (ekubo-token-jurisdictions-v2): coverage, execution_hold, restricted_jurisdictions, per-asset classification |
| quotes | array | – | – |
No examples provided.
get_rewards_claims_by_owner Get incentive rewards claims by owner ~49
Fetch canonical reward-claim records and supply the exact per-chain isClaimed/isAvailable eth_call list used by the interface before preparing claim transactions.
| Name | Type | Req | Description |
|---|---|---|---|
| owner | string | yes | address |
| Name | Type | Req | Description |
|---|---|---|---|
| onchain_validation | object | – | – |
No examples provided.
get_sky_savings_deployment Get the fixed Sky savings deployment ~52
Locally return the canonical Ethereum USDS and sUSDS addresses and direct wallet-read guidance. This server does not proxy Sky, an RPC, an indexer, or any third-party API.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_market_data_discovery | object | – | – |
| deployment | object | – | – |
| limitations | object | – | – |
| network_access | string | – | – |
| protocol | string | – | – |
| source | object | – | – |
No examples provided.
get_stonx_allocation_recommendation Get suggested STONX allocations ~267
Return a provider-neutral STONX allocation recommendation with an emissions_efficiency KPI per pool and an executable target list (exactly 10,000 bps, at most 25 Ve33 pools). The snapshot refreshes daily; read snapshot_age_seconds. voter with ve33_emission_state makes targets voter-optimal and keeps the neutral plan as provider_targets; without the emission state, execution_ready is false and local_read_requirement says what to read. The tool constructs no transaction. To apply it, require execution_ready=true, then pass its targets, the state_id from get_ve33_allocations for the connected wallet, and strategy=compact_max_lock to prepare_ve33_reallocation.
| Name | Type | Req | Description |
|---|---|---|---|
| max_emission_share_per_fee_share | number | – | Prune above this emission share / retained fee share; default 3 |
| prune_low_efficiency | boolean | – | Withhold prune candidates and redistribute their weight |
| ve33_emission_state | object | – | {current_timestamp, current_emission_rate, total_remaining_emissions}: decimal strings decoded locally from getEmissionState (rate is Q32) via local_read_requirement; omit on the first call |
| voter | object | – | With ve33_emission_state, makes targets voter-optimal |
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | string | – | – |
| execution_ready | boolean | – | – |
| recommendation_id | string | – | – |
| recommendations | array | – | – |
| schema_version | string | – | – |
| snapshot_at | string | – | – |
| targets | array | – | – |
No examples provided.
get_token Get an Ekubo token ~48
Fetch canonical token metadata for an exact chain and address.
| Name | Type | Req | Description |
|---|---|---|---|
| address | string | yes | EVM or Starknet token address (hex) |
| chain_id | integer|string | yes | EVM chain ID |
| Name | Type | Req | Description |
|---|---|---|---|
| token | object | – | – |
No examples provided.
get_tokens Get multiple Ekubo tokens ~49
Fetch canonical metadata for up to 1,000 token identifiers in one batch request, preserving input order; identifiers absent from the canonical list are omitted.
| Name | Type | Req | Description |
|---|---|---|---|
| tokens | array | yes | Entries may span chains |
| Name | Type | Req | Description |
|---|---|---|---|
| tokens | array | – | – |
No examples provided.
get_uniswap_charts Get Uniswap pool charts ~81
Fetch timestamped token0/token1 prices and USD volume history over the requested duration from the same GraphQL fields as the open source Uniswap interface. Empty series means no indexed data, never zero volume.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | string | yes | – |
| duration | string | – | – |
| pool | string | yes | – |
| version | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | – | – |
| errors | array | – | – |
| fetched_at | string | – | – |
| indexed_data | boolean | – | – |
| partial | boolean | – | – |
| source | string | – | – |
No examples provided.
get_uniswap_deployments Get Uniswap deployments ~48
Canonical V2/V3/V4 contracts on Ethereum, Optimism, Base, Arbitrum, Unichain and Robinhood, including Permit2 and wrapped native addresses.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| deployments | array | – | – |
| protocol | string | – | – |
| source | string | – | – |
No examples provided.
get_uniswap_pool Get a Uniswap pool ~75
Fetch indexed pool details, currencies, fee, TVL, volume and supplies. V4 takes a bytes32 pool ID; V2/V3 take an address. Use prepare_uniswap_reads for current chain state.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | string | yes | – |
| pool | string | yes | – |
| version | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | – | – |
| errors | array | – | – |
| fetched_at | string | – | – |
| indexed_data | boolean | – | – |
| partial | boolean | – | – |
| source | string | – | – |
No examples provided.
get_uniswap_pool_ticks Get Uniswap liquidity depth data ~96
Fetch paginated initialized ticks and exact liquidityNet/liquidityGross strings for V3/V4 liquidity depth charts. first/skip bound each request; combine with current pool liquidity and tick from prepare_uniswap_reads. Indexer data can lag.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | string | yes | – |
| first | integer | – | – |
| pool | string | yes | – |
| skip | integer | – | – |
| version | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| data | – | – | – |
| errors | array | – | – |
| fetched_at | string | – | – |
| indexed_data | boolean | – | – |
| partial | boolean | – | – |
| source | string | – | – |
No examples provided.
get_value_transfer_status Track a LayerZero or LI.FI cross-chain transfer ~207
Report whether an executed LayerZero or LI.FI transfer has been delivered; its origin receipt alone does not mean the user has the funds. Poll every 15 to 30 seconds while settled is false (it draws on the quote budget). UNKNOWN or NOT_FOUND right after submission usually means not yet indexed. For LI.FI, read substatus: REFUNDED and PARTIAL report as status DONE. Across transfers are not tracked here.
| Name | Type | Req | Description |
|---|---|---|---|
| destination_chain_id | integer|string | – | Destination chain; lifi only |
| origin_chain_id | integer|string | – | Origin chain; lifi only, narrows the lookup |
| quote_id | string | – | The executed option's provider_quote_id; required for layerzero |
| source | string | – | The executed quote's source; defaults to layerzero |
| transaction_hash | string | – | Origin transaction hash; required for lifi, and pass it for layerzero once known (some routes need it) (bytes32 hex) |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_history | array | – | – |
| explorer_url | string|null | – | – |
| origin_transaction_hash | string|null | – | – |
| polling | object | – | – |
| quote_id | string|null | – | – |
| settled | boolean | – | – |
| source | string | – | – |
| source_url | string | – | – |
| status | string | – | – |
| substatus | string|null | – | – |
| substatus_message | string|null | – | – |
No examples provided.
get_ve33_allocations Show Ekubo STONX / ve(3,3) allocations ~233
Use for requests such as 'show all my Ekubo STONX allocations'. The production Ekubo ve(3,3) deployment is the STONX voting system, so pass only owner to select its production chain and canonical VeToken automatically. Returns every pool, selected swap fee, NFT, applied vote weight, totals, state_id, and an onchain_validation request explicitly marked not_executed until the client runs its eth_call. Pass chain_id and ve_token together only for another deployment.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | – | Optional with ve_token; omit both for the production Ekubo STONX deployment |
| owner | string | yes | Connected EVM wallet whose complete Ekubo STONX/VeToken allocation should be shown; the server cannot infer 'my', so ask the user when no wallet address is available |
| ve_token | string | – | Optional with chain_id; omit both for the canonical STONX VeToken 0x9d7008E169D040B6c0140eb92E7cA82B12643497 (address) |
| Name | Type | Req | Description |
|---|---|---|---|
| onchain_validation | object | – | – |
No examples provided.
list_pool_keys List Ekubo pool keys ~163
Discover initialized pools for one chain and Core deployment, ordered by pool_id with keyset pagination, optionally filtered by token, pair or extension. Each pool_id is re-derived from its PoolKey and each row carries the indexed state (null until indexed).
| Name | Type | Req | Description |
|---|---|---|---|
| after_pool_id | string | – | Previous page's next_after_pool_id (decimal or 0x-hex integer) |
| chain_id | integer|string | yes | EVM chain ID |
| core_address | string | yes | Core deployment (address) |
| extension | string | – | Zero address = extensionless |
| page_size | integer | – | Pools per page |
| token_a | string | – | Pools containing this token (address) |
| token_b | string | – | With token_a, the exact pair (address) |
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | string | – | – |
| core_address | string | – | – |
| core_generation | string | – | – |
| page | object | – | – |
| pools | array | – | – |
No examples provided.
list_tokens List Ekubo tokens ~226
First step for symbol-based swaps, including tokenized stocks and stablecoins: list canonical Ekubo tokens by descending visibility_priority, so the preferred token wins an ambiguous symbol. Use search for a symbol prefix or suffix and min_visibility_priority to reach tokens the interface hides.
| Name | Type | Req | Description |
|---|---|---|---|
| after_token | string | – | Keep only tokens whose (chain_id, address) pair sorts after this <chain_id>:<address> identifier. Results are ordered by visibility_priority rather than by that pair, so this filters the candidate se… |
| chain_id | integer|string | – | Restrict the list to one EVM chain; omit to list tokens across every indexed chain |
| min_visibility_priority | integer | – | Lowest visibility_priority to include; defaults to 0, the interface threshold. Pass a negative value to reach tokens the interface hides |
| page_size | integer | – | Maximum tokens to return; defaults to 20 |
| search | string | – | Case-insensitive token symbol prefix or suffix match; omit to list the whole canonical set. Symbols only, not names or addresses |
| Name | Type | Req | Description |
|---|---|---|---|
| tokens | array | – | – |
No examples provided.
prepare_aave_v3_borrow Prepare an Aave V3 variable borrow ~172
Prepare a direct Aave V3 variable-rate borrow from a supported fixed reserve, including optional on-behalf-of credit delegation. This server does not query collateral, delegation, health factor, caps, or available liquidity.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | string | yes | Positive borrow amount in base units (positive decimal integer) |
| asset | string | yes | Exact underlying ERC-20 address from the selected market's fixed major-reserve list |
| chain_id | integer|string | yes | Chain of a fixed Aave V3 core market returned by get_aave_v3_markets |
| on_behalf_of | string | – | Debt owner; defaults to sender. A different owner must already have delegated variable debt to sender. (address) |
| sender | string | yes | Wallet that will execute the Aave action (address) |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aave_v3_collateral Prepare an Aave V3 collateral toggle ~137
Prepare setUserUseReserveAsCollateral for a supported fixed reserve. Disabling collateral can reduce health factor or revert when open debt needs it, so exact wallet simulation is mandatory.
| Name | Type | Req | Description |
|---|---|---|---|
| asset | string | yes | Exact underlying ERC-20 address from the selected market's fixed major-reserve list |
| chain_id | integer|string | yes | Chain of a fixed Aave V3 core market returned by get_aave_v3_markets |
| sender | string | yes | Wallet that will execute the Aave action (address) |
| use_as_collateral | boolean | yes | True enables this supplied reserve as collateral; false disables it |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aave_v3_emode Prepare an Aave V3 eMode change ~146
Prepare setUserEMode with a caller-supplied current uint8 category ID; zero disables eMode. Discover live category configuration through Aave's public GraphQL API directly, because this server makes no data or RPC request.
| Name | Type | Req | Description |
|---|---|---|---|
| category_id | integer | yes | Current onchain Aave eMode category; zero disables eMode. Obtain nonzero category IDs from Aave's public GraphQL API, because this server does not query them. |
| chain_id | integer|string | yes | Chain of a fixed Aave V3 core market returned by get_aave_v3_markets |
| sender | string | yes | Wallet whose eMode selection will change (address) |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aave_v3_repay Prepare an Aave V3 variable-debt repayment ~195
Prepare variable-debt repayment with underlying tokens or sender-owned aTokens. Underlying repayment carries an exact ERC-20 approval and cleanup in one atomic plan; uint256 maximum requests all available debt.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | string | yes | Positive repayment amount in base units; uint256 maximum requests all available variable debt (positive decimal integer) |
| asset | string | yes | Exact underlying ERC-20 address from the selected market's fixed major-reserve list |
| chain_id | integer|string | yes | Chain of a fixed Aave V3 core market returned by get_aave_v3_markets |
| funding_source | string | – | Use underlying ERC-20 with a temporary exact Pool approval, or burn sender-owned aTokens with repayWithATokens |
| on_behalf_of | string | – | Debt owner; defaults to sender (address) |
| sender | string | yes | Wallet that will execute the Aave action (address) |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aave_v3_supply Prepare an Aave V3 supply ~165
Prepare a fixed-market Aave V3 Pool supply with an exact ERC-20 approval, supply calldata, and allowance cleanup as one atomic wallet plan. No live balance, allowance, reserve, cap, pause, or rate data is queried.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | string | yes | Positive underlying-token amount in base units (positive decimal integer) |
| asset | string | yes | Exact underlying ERC-20 address from the selected market's fixed major-reserve list |
| chain_id | integer|string | yes | Chain of a fixed Aave V3 core market returned by get_aave_v3_markets |
| on_behalf_of | string | – | aToken recipient; defaults to sender (address) |
| sender | string | yes | Wallet that will execute the Aave action (address) |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aave_v3_withdraw Prepare an Aave V3 withdrawal ~170
Prepare a direct Aave V3 Pool withdrawal for a supported fixed reserve. Pass uint256 maximum as amount to request the available aToken balance. The wallet establishes balance, health-factor, collateral, and liquidity validity by exact simulation.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | string | yes | Positive underlying-token amount in base units; uint256 maximum requests all available balance (positive decimal integer) |
| asset | string | yes | Exact underlying ERC-20 address from the selected market's fixed major-reserve list |
| chain_id | integer|string | yes | Chain of a fixed Aave V3 core market returned by get_aave_v3_markets |
| recipient | string | – | Underlying-token recipient; defaults to sender (address) |
| sender | string | yes | Wallet that will execute the Aave action (address) |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aerodrome_gauge_claim Prepare an Aerodrome emissions claim ~132
Claim accrued AERO from a gauge. getReward credits its account argument rather than the sender, so a claim can pay a different address than the one paying gas; the plan states which. A claim with nothing earned succeeds and transfers nothing.
| Name | Type | Req | Description |
|---|---|---|---|
| account | string | – | Account whose emissions are claimed; defaults to sender. getReward credits this address, so a non-sender value pays someone else. |
| chain_id | integer|string | yes | Base (8453) only |
| gauge | string | yes | Gauge from a Sugar pools read (address) |
| sender | string | yes | address |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aerodrome_gauge_deposit Prepare an Aerodrome gauge stake ~231
Stake v2 LP tokens into a pool's gauge to earn AERO emissions, with the LP-token approval the gauge needs and an allowance cleanup after. Phased, because which token the gauge pulls is its own stakingToken: call it without lp_token to get that read back, then again with the resolved address for the complete atomic plan. Staking redirects that position's trading fees to the pool's voters, so it trades fee income for emissions rather than adding to it. A dead gauge accepts the stake and pays nothing, so check gauge_alive. Size amount from the live LP balance, not from an earlier deposit simulation.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | string | yes | Exact LP token amount to stake in base units (positive decimal integer) |
| chain_id | integer|string | yes | Base (8453) only |
| gauge | string | yes | Gauge from a Sugar pools read (address) |
| lp_token | string | – | Gauge stakingToken from this tool's first-phase read; omit to get that read, supply it for the full plan (address) |
| sender | string | yes | address |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aerodrome_gauge_withdraw Prepare an Aerodrome gauge unstake ~119
Unstake v2 LP tokens from a gauge. This returns the LP token, not the underlying pair, and it does not claim AERO: the read bundle reports what is still earned so it is not silently left behind.
| Name | Type | Req | Description |
|---|---|---|---|
| amount | string | yes | Exact LP token amount to unstake in base units (positive decimal integer) |
| chain_id | integer|string | yes | Base (8453) only |
| gauge | string | yes | Gauge from a Sugar pools read (address) |
| sender | string | yes | address |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aerodrome_incentive_claim Prepare a veAERO reward claim ~221
Claim a veNFT's voting rewards — trading fees, bribes, or both — and optionally the RewardsDistributor rebase, as one plan. The fee and bribe contract addresses are required inputs because they are per-pool contracts that only a Sugar rewards read returns; this server cannot derive them, and a wrong address claims nothing rather than failing loudly. Distinct from prepare_aerodrome_gauge_claim, which collects an LP's emissions rather than a voter's rewards.
| Name | Type | Req | Description |
|---|---|---|---|
| bribes | array | – | Bribe contracts and their tokens, taken from a Sugar venft_rewards read |
| chain_id | integer|string | yes | Base (8453) only |
| claim_rebase | boolean | – | Also claim the RewardsDistributor rebase, which compounds into the lock |
| fees | array | – | Fee contracts and their tokens, taken from a Sugar venft_rewards read |
| sender | string | yes | address |
| venft_id | string | yes | veNFT token id whose rewards are claimed (positive decimal integer) |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aerodrome_liquidity_deposit Prepare an Aerodrome v2 liquidity deposit ~260
Prepare a v2 addLiquidity through Aerodrome's Router with exact approvals and allowance cleanup. The read bundle quotes the actual split and resolves the pool, so a pair with no pool is caught before a deposit sets its price. LP tokens earn no AERO until staked with prepare_aerodrome_gauge_deposit.
| Name | Type | Req | Description |
|---|---|---|---|
| amount_a_desired | string | yes | Maximum token_a base units (positive decimal integer) |
| amount_a_min | string | yes | Slippage bound: minimum token_a base units consumed (positive decimal integer) |
| amount_b_desired | string | yes | Maximum token_b base units (positive decimal integer) |
| amount_b_min | string | yes | Minimum token_b base units consumed (positive decimal integer) |
| chain_id | integer|string | yes | Base (8453) only |
| deadline | string | yes | Near-term unix timestamp; a past one makes the plan revert (positive decimal integer) |
| recipient | string | – | Defaults to sender (address) |
| sender | string | yes | address |
| stable | boolean | yes | Stable (true) or volatile pool; with the pair it identifies the pool |
| token_a | string | yes | address |
| token_b | string | yes | address |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aerodrome_liquidity_withdraw Prepare an Aerodrome v2 liquidity withdrawal ~297
Prepare a v2 removeLiquidity that burns LP tokens back into the underlying pair, with the LP-token approval the router needs and an allowance cleanup after. Phased, because the token being approved is the pool and this server resolves Aerodrome addresses by reading them: call it without lp_token to get the pool read back, then again with the resolved address for the complete atomic plan. An LP balance short of the requested liquidity usually means the rest is staked in the gauge and needs unstaking first.
| Name | Type | Req | Description |
|---|---|---|---|
| amount_a_min | string | yes | Minimum token_a base units to receive (positive decimal integer) |
| amount_b_min | string | yes | Minimum token_b base units to receive (positive decimal integer) |
| chain_id | integer|string | yes | Base (8453) only |
| deadline | string | yes | Near-term unix timestamp; a past one makes the plan revert (positive decimal integer) |
| liquidity | string | yes | Exact LP token amount to burn in base units (positive decimal integer) |
| lp_token | string | – | Pool address from this tool's first-phase read; omit to get that read, supply it for the full plan |
| recipient | string | – | Defaults to sender (address) |
| sender | string | yes | address |
| stable | boolean | yes | Stable (true) or volatile pool |
| token_a | string | yes | address |
| token_b | string | yes | address |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aerodrome_lock Prepare a veAERO lock action ~237
Build one veAERO escrow action: create a lock, add AERO to one, extend it, switch permanent locking on or off, or withdraw an expired one. Durations are measured from now and floored to a week boundary, so anything under a week is refused rather than signed. The read bundle returns ownership and the lock's (amount, end, isPermanent) so an impossible action — withdrawing an unexpired or permanent lock, extending past nothing — is caught before signing.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | Which veAERO lock action to build |
| amount | string | – | AERO amount in base units; required for create and increase_amount (positive decimal integer) |
| chain_id | integer|string | yes | Base (8453) only |
| lock_duration | string | – | Lock length in seconds measured from now, required for create and extend. The escrow floors it to a week boundary and caps it at four years. (positive decimal integer) |
| sender | string | yes | address |
| venft_id | string | – | veNFT token id; required for every action but create (positive decimal integer) |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aerodrome_sugar_reads Prepare an Aerodrome Sugar read bundle ~199
Build the eth_call bundle and decode plan for one Sugar dataset (pools, positions, veNFTs, epochs, rewards) for the wallet to run against the user's RPC; Sugar has no API. The pool, gauge, fee and bribe addresses and veNFT ids it returns are the inputs to the other prepare_aerodrome_* tools.
| Name | Type | Req | Description |
|---|---|---|---|
| account | string | – | Required for positions and venfts_by_account (address) |
| chain_id | integer|string | yes | Base (8453) only |
| dataset | string | yes | Sugar dataset |
| limit | integer | – | Page size; at most 500 pools or 200 positions |
| offset | integer | – | – |
| pool | string | – | Required for pool_epochs and venft_pool_rewards (address) |
| venft_id | string | – | Required for venft_by_id, venft_rewards, and venft_pool_rewards (positive decimal integer) |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_aerodrome_vote Prepare a veAERO vote or reset ~196
Cast one veNFT's gauge vote, or reset it. Weights are relative shares of voting power, not amounts, and the allocation replaces any previous vote entirely — a pool left out is voted zero. A veNFT may vote once per weekly epoch and reverts on a second attempt, so the read bundle returns lastVoted along with each pool's gauge and liveness. Voting also locks the NFT against withdrawal until it is reset.
| Name | Type | Req | Description |
|---|---|---|---|
| chain_id | integer|string | yes | Base (8453) only |
| pools | array | – | The complete allocation. It replaces any previous vote, so a pool left out is voted zero rather than left alone. |
| reset | boolean | – | Clear this NFT's votes instead of casting new ones; required before withdrawing a voted NFT |
| sender | string | yes | address |
| venft_id | string | yes | veNFT token id casting the vote (positive decimal integer) |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_approval_revocations Prepare ERC-20 approval revocations ~68
Prepare every approve(spender,0) as an exact ordered multi-transaction execution plan. The wallet must not discover or construct the transaction list.
| Name | Type | Req | Description |
|---|---|---|---|
| approvals | array | yes | – |
| chain_id | integer|string | yes | EVM chain ID |
| sender | string | yes | address |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
prepare_auction_complete Prepare auction completion ~114
Prepare permissionless auction completion and, when necessary, graduation-pool initialization in the same atomic batch.
| Name | Type | Req | Description |
|---|---|---|---|
| auction_key | object | yes | PoolKey {token0, token1, config}: token addresses (zero = native), bytes32 config |
| chain_id | integer|string | yes | EVM chain ID |
| graduation_pool_initialized | boolean | yes | – |
| launch_pool_tick | integer | – | – |
| sender | string | yes | address |
| token_id | string | yes | decimal or 0x-hex integer |
| Name | Type | Req | Description |
|---|---|---|---|
| execution_plan_reference | object | – | artifact_reference; pass unchanged |
No examples provided.
How do I install the Ekubo Protocol MCP server?
Ekubo Protocol is a hosted endpoint at https://mcp.ekubo.org/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · mcp.ekubo.org
claude mcp add --transport http ekuboprotocol-ekubo 'https://mcp.ekubo.org/mcp'
What is the Ekubo Protocol MCP server?
Ekubo Protocol is an MCP server listed in the public MCP registry as io.github.EkuboProtocol/ekubo. Token and pool data, swap quotes, and unsigned transaction plans for Ekubo and other DeFi protocols. This page covers its hosted endpoint (https://mcp.ekubo.org/mcp).
Is the Ekubo Protocol MCP server safe to use?
Ekubo Protocol scores 66 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Ekubo Protocol MCP server expose?
Ekubo Protocol exposes 99 tools: list_tokens, export_tokens, get_token, get_tokens, get_quotes_with_plans, and 94 more. Their descriptions and schemas cost roughly 15,423 tokens of context every time the server is loaded.
Does the Ekubo Protocol MCP server require authentication?
No. We connected to Ekubo Protocol without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Ekubo Protocol MCP server still maintained?
Ekubo Protocol is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.