Skip to main content
Glama
Hryhorii77

aero-allocator

by Hryhorii77

aero-allocator

CI

MCP server that forecasts next-epoch demand for Aerodrome (Base) or Velodrome (Optimism) pools and turns it into concrete incentive-allocation recommendations — built for Aerodrome's Predictive Allocation era (September 2026, pushed back from the original July target), where incentives follow predicted future demand instead of last week's votes. Aerodrome is the default; see Multi-protocol to switch.

Any MCP-capable agent (Claude Code, Claude Desktop, Bankr-hosted agents) can use it to answer:

  • Which pools will generate the most fees next epoch?

  • Where is vote share mispriced vs predicted demand (the "predictive edge")?

  • How should I split my veAERO votes / incentive budget right now?

All data comes live from Base — Aerodrome Sugar contracts for pool state and per-epoch history, DefiLlama for USD pricing. No API keys required.

Tools

Tool

What it does

scan_pools

Gauge-enabled pools with live TVL, staked TVL, fee tier

pool_history

Per-epoch votes, emissions, fees (USD), bribes (USD) for one pool

predict_demand

Next-epoch fee forecast per pool + predictiveEdgePct (predicted demand share − current vote share)

recommend_allocation

Weighted allocation: protocol_efficiency (∝ predicted demand), voter_roi (dilution-aware optimal split of your veAERO — the one for "where should I vote"), or edge_hunter (biggest trustworthy mispricings)

recommend_bribe_placement

For teams/protocols spending a bribe budget (not voters): estimated vote-share pull per pool, and who gets diluted

recommend_lp_deposit

For LPs deciding where to stake liquidity: forward-looking AERO-emissions APR per pool (not fee revenue — see below)

detect_vote_swings

Pools whose in-progress epoch is running well off its own trend in bribes (risers) or votes (fallers) — the "an incentivized pool is draining regular pools right before lock" pattern

prepare_vote_calldata

Unsigned Voter.vote() calldata from an allocation — submit via your own wallet layer (e.g. Base MCP send_calls)

prepare_submission

Unsigned calldata for direct Predictive Allocation submission, once wired up — see Predictive Allocation adapter

predictive_allocation_status

Whether direct Predictive Allocation submission is wired up yet

backtest_summary

Walk-forward accuracy of the demand forecast vs. realized fees and a naive baseline — see Forecast accuracy

realized_performance

Your logged voter_roi recommendations vs. what actually happened, once each epoch completes — a track record, not a backtest — see Realized performance tracking

This server never holds keys or signs anything. Execution is the host agent's job, behind explicit user approval.

Related MCP server: aero-vote-radar

Quick start

npm install
npm run smoke        # live end-to-end test against Base mainnet
npm run build

Multi-protocol (Aerodrome / Velodrome)

Aerodrome (Base) and Velodrome (Optimism) are the same ve(3,3) lineage — Aerodrome is a Velodrome fork sharing the Sugar/Voter contract pattern — so one engine covers both. A single server process serves one protocol, selected at startup:

{
  "mcpServers": {
    "aero-allocator": {
      "command": "npx",
      "args": ["tsx", "/path/to/aero-allocator/src/index.ts"],
      "env": { "AERO_PROTOCOL": "aerodrome" }
    },
    "velo-allocator": {
      "command": "npx",
      "args": ["tsx", "/path/to/aero-allocator/src/index.ts"],
      "env": { "AERO_PROTOCOL": "velodrome" }
    }
  }
}

AERO_PROTOCOL defaults to aerodrome (unchanged behavior if unset). Register both entries to run them side by side — each is a separate process with its own RPC client and caches. Tool descriptions, ve-token naming (veAERO/veVELO), and reward-token naming (AERO/VELO) all switch automatically with the configured protocol; predictive_allocation_status correctly reports the mechanism as not applicable when running Velodrome, since Dromos Labs' announcement is Aerodrome-specific.

RPC selection: RPC_URL (new, works for either protocol) always wins if set; otherwise BASE_RPC_URL is honored for backward compatibility when running Aerodrome; otherwise each protocol falls back to a public default (base-rpc.publicnode.com / mainnet.optimism.io). Every deployment also gets automatic failover to a second public RPC (RPC_URL_FALLBACK, overridable) if the primary goes down outright, not just rate-limited.

Dashboard

Live: https://aero-allocator.vercel.app (Aerodrome/Base) · https://aero-allocator-velodrome.vercel.app (Velodrome/Optimism) — each links to the other via a header switcher

A "predicted hot pools" web UI lives in web/ (Next.js, reuses the engine directly):

npm run build                 # engine dist/ used by the web app
cd web && npm install && npm run dev

Open http://localhost:3000 — hot-pools table (predicted fees, edge, confidence); interactive Voter ROI, Protocol Efficiency, and Edge Hunter allocation panels; an LP staking-yield table; a vote-swings (risers/fallers) panel; a bribe-placement simulator; and a forecast-accuracy panel (the same walk-forward backtest as backtest_summary — see Forecast accuracy — so you can judge the model's track record without leaving the page). First load builds the onchain snapshot (~1 min), then it's cached.

Connect a wallet (injected or Coinbase Wallet) to cast the Voter ROI allocation as a real vote: your veNFTs are auto-detected via VeSugar (manual id entry as fallback) and the "cast vote" button submits Voter.vote() with the recommended weights — you sign in your wallet; the app never holds keys.

Multi-protocol: like the MCP server, one web deployment serves one protocol, fixed at build time by AERO_PROTOCOL (server) and NEXT_PUBLIC_AERO_PROTOCOL (client — must be set to the same value; a console warning fires if they ever drift). Contract addresses used in the vote transaction always come from the server's PRESET via /api/protocol, never duplicated client-side, so a mismatched NEXT_PUBLIC_AERO_PROTOCOL can produce wrong labels but never a wrong-contract vote. To run both protocols side by side, deploy web/ twice with different AERO_PROTOCOL/NEXT_PUBLIC_AERO_PROTOCOL pairs and set NEXT_PUBLIC_SIBLING_URL on each to the other's URL — a "switch to {other protocol}" link then appears in the header.

Deploying to Vercel

The dashboard depends on the engine package via a local file:.. reference, which needs some non-default project settings to build correctly on Vercel — the framework's zero-config detection doesn't handle this monorepo shape out of the box:

Setting

Value

Why

Root Directory

web

Vercel's Next.js detection checks this directory's package.json for a next dependency — pointing it at the repo root (which has no next dep) fails detection entirely

Install Command

npm install (default)

Must be a real install, not a no-op — Vercel checks the installed Next.js version immediately after this step, before running Build Command

Build Command

cd .. && npm install --include=dev && npm run build && cd web && npm run build

Builds the engine's dist/ first (needs --include=dev for typescript/@types/node, which a plain npm install can skip in Vercel's build environment), then the Next.js app that depends on it

Output Directory

default (.next)

Resolved relative to Root Directory — do not prefix with web/ (that double-counts and fails with "output directory not found")

Root Directory isn't exposed as a vercel CLI flag; set it via the dashboard (Project Settings → General) or the API (PATCH /v9/projects/{id} with {"rootDirectory": "web"}). Env vars (RPC_URL, AERO_PROTOCOL, NEXT_PUBLIC_AERO_PROTOCOL, optionally NEXT_PUBLIC_SIBLING_URL) go in Project Settings → Environment Variables, per environment (Production/Preview). A dedicated RPC (Alchemy, Infura) is strongly recommended over the public default — it's the difference between a ~20s and a ~1min cold snapshot build, which matters against Vercel's function timeout (60s ceiling on Hobby).

Vercel's Deployment Protection (an SSO auth wall) is on by default for all deployments including production. To make production public while keeping preview deployments protected, set ssoProtection.deploymentType to "preview" via the API (also not a dashboard toggle at the time of writing).

Register with Claude Code:

claude mcp add aero-allocator -- npx tsx /path/to/aero-allocator/src/index.ts

Or in any MCP client config:

{
  "mcpServers": {
    "aero-allocator": {
      "command": "npx",
      "args": ["tsx", "/path/to/aero-allocator/src/index.ts"],
      "env": { "BASE_RPC_URL": "https://mainnet.base.org" }
    }
  }
}

This is a standard MCP server, not Claude-specific — the same config (in whatever format the client expects) works with Gemini CLI, Cursor, Windsurf, or any other MCP-capable agent, not just the Claude/Bankr ones named above.

Example agent flow:

"Predict demand for the top Aerodrome pools, recommend a voter_roi allocation across 8 pools, then prepare the vote calldata for my veAERO #12345 and submit it with my Base wallet."

Paid API (x402)

GET /api/v1/forecast on the dashboard deployment is a pay-per-call mirror of the free dashboard's data (predicted hot pools, all three allocation objectives, LP staking yield, vote-swing signals) — same engine, same numbers, priced at $0.05/call in USDC on Base mainnet via the x402 protocol, for agents or treasuries that want programmatic access without self-hosting the MCP server and their own RPC. The free dashboard and MCP server are unaffected — this is an additional way to get at the data, not a paywall on the existing ones.

Standard x402 flow: a request without an X-PAYMENT header gets 402 with the price; a request with a valid one is verified by Coinbase's CDP facilitator before the handler runs, and settled on-chain only after a successful response — a failed request is never charged. SKILL.md has a copy-pasteable client example (@x402/fetch) for calling this directly from an agent — no clone, no RPC key, no MCP registration.

Requires three env vars to activate; without all three the route serves a clean 501 rather than accepting misrouted or unverifiable payments:

Var

X402_PAYTO_ADDRESS

Base address you control

Where payments land — never generated or held by this codebase

CDP_API_KEY_ID

From portal.cdp.coinbase.com

Coinbase Developer Platform API key

CDP_API_KEY_SECRET

Same place

Paired secret

How the forecast works

For each candidate pool (top N by staked TVL above a TVL floor):

  1. Pull up to 8 weekly epochs of history from RewardsSugar.epochsByAddress — votes, emissions, fees, incentives per epoch — and price everything in USD.

  2. Extrapolate the in-progress epoch to full length once >20% has elapsed (the freshest demand signal).

  3. Forecast next-epoch fees = EWMA (α=0.45) + ½ × linear trend, floored at 0. Confidence scores from history depth and variance.

  4. predictiveEdge = predicted fee-demand share − current vote share. Positive edge → under-incentivized pool: exactly what a prediction-market allocator should reward.

Three allocation objectives — each answers a different question, and they can disagree sharply:

  • protocol_efficiency — weights ∝ predicted demand share. This is the Predictive Allocation ideal; a market-wide benchmark, not personalized — useful for treasuries/protocols directing incentives and for benchmarking the live mechanism once it ships. Not a personal voting recommendation: it doesn't know your veAERO amount or account for dilution.

  • voter_roi — maximize your expected next-epoch reward for a given veAERO amount (votingPowerVe). Each pool pays pro-rata (R·v/(E+v)), so the optimizer water-fills votes to equalize marginal returns — dust pools with high headline ROI but no reward capacity naturally get few or no votes (plus a hard $500 capacity floor). Output includes the expected USD reward per pool after self-dilution. This is the one to use for "where should I actually vote" — but only if you pass your real veAERO amount; the default (10,000) can produce a meaningfully different split than what's optimal for a much larger or smaller holder.

  • edge_hunter — ranks pools by predictiveEdge × confidence: the biggest, most-trustworthy mispricings between predicted demand and current votes, rather than raw demand (protocol_efficiency) or dilution-optimal ROI (voter_roi). Only positive edge counts (under-incentivized — the "buy" signal); a big edge from a low-confidence forecast can rank below a smaller edge the model actually trusts. Not dilution-aware — pair it with voter_roi to size a real vote once you've picked targets.

recommend_bribe_placement flips this around for teams/protocols spending a bribe budget instead of voters: it re-runs the same water-fill over the market's entire active voting power, with and without the bribe added to one pool's payout, and reports the vote-share delta. Votes water-fill ∝ √payout, so a bribe dollar pulls disproportionately more on a cheap pool than an already-large one. This models an instant, frictionless, whole-market reallocation, so it's a theoretical ceiling, not a forecast — useful for comparing candidate pools, not for predicting a literal vote count.

recommend_lp_deposit targets a third audience — LPs deciding where to deposit and stake liquidity — and deliberately does not rank by predictedFeesUsd. On Aerodrome, trading fees (and bribes) accrue to veAERO voters, not to liquidity stakers; stakers instead earn AERO emissions pro-rata to staked TVL. So this tool forecasts next-epoch emissions from each pool's emissions history with the same EWMA+trend model predict_demand uses for fees, and annualizes the result against current staked TVL as predictedNextEpochAprPct. It also reports currentEpochAprPct, which needs no forecast at all — the live epoch's emission rate was already fixed by votes cast before it started, so it's read directly rather than predicted.

detect_vote_swings watches for the pattern voters chase in the final hours of an epoch: a pool suddenly gets a large bribe, and votes drain toward it from everywhere else before lock. For each pool it forecasts a full-epoch baseline from completed-epoch history (same EWMA+trend model, applied to bribes and votes instead of fees), scales it by how much of the epoch has elapsed to get an expected-so-far value, and compares that against the actual in-progress epoch. risers are pools whose bribes are running ahead of pace — the early, causal signal, since a bribe can land in one transaction. fallers are pools whose votes are running behind pace — the effect, once other voters have reacted. A brand-new bribe with no comparable prior-epoch baseline is reported with a null ratio rather than a meaningless divide-by-near-zero number. Like the reminder script, this sharpens as the epoch progresses and is noisiest early on.

Forecast accuracy

confidence on each forecast starts as a heuristic (history depth + variance), then gets recalibrated against real backtested accuracy before it reaches any tool output — see Confidence calibration below. backtest_summary (tool) and npm run backtest (script) expose the full validation.

Methodology: walk forward through each pool's completed-epoch history. At every historical epoch boundary, forecast that epoch using only the epochs that would have actually been available beforehand (capped at the same trailing window predict_demand uses — the backtest never gives the model more history than it gets live), then compare against what actually happened. Errors are reported as MAE, RMSE and WAPE (Σ|error| / Σactual, robust to the near-zero-fee epochs MAPE chokes on), alongside skill vs. baseline — the same comparison against a naive "predict next epoch = last epoch" model, so a negative skill number means the EWMA+trend forecast isn't earning its complexity over doing nothing. A confidence-calibration table checks whether higher-confidence forecasts actually have lower error. One known gap: this replays epoch-boundary predictions only — it doesn't replay the mid-epoch pace-extrapolation blend used for the live in-progress epoch.

Confidence calibration

The heuristic confidence (depthScore × stabilityScore) is a guess at how trustworthy a forecast is — it's never seen a real outcome. deriveConfidenceCalibration buckets every walk-forward backtest point by its raw heuristic confidence, computes the actual WAPE realized within each bucket, and converts that to calibratedConfidence = 1/(1+wape) (the same functional form the heuristic already uses for its own variance term). predict_demand, recommend_allocation and recommend_bribe_placement then remap every live forecast's confidence through this curve via applyConfidenceCalibration — so a confidence range that the heuristic thought looked solid but has actually been noisy in practice gets marked down, and vice versa. This matters beyond display: confidence directly weights the voter_roi reward estimate and gates recommend_bribe_placement's candidate pools, so a miscalibrated score would quietly bias both.

Buckets with fewer than 8 backtest samples are dropped rather than trusted, and any forecast whose raw confidence falls in a dropped (or as-yet-uncomputed) range keeps its heuristic score — calibration is opportunistic on top of the always-available heuristic, never a hard dependency. If a fresh backtest_summary hasn't run yet in the last hour, the relevant tools fetch one alongside the market snapshot (concurrently, so it doesn't add to the wait) and fall back to the raw heuristic if that fetch fails for any reason.

Run npm run backtest for a console report, or call backtest_summary from any connected agent for live numbers (cached ~1h; AERO_BACKTEST_EPOCHS / AERO_BACKTEST_MAX_POOLS tune the depth/breadth).

Predictive Allocation adapter

Dromos Labs announced the mechanism but hasn't published contracts/ABI yet (as of 2026-08-16; launch has slipped from July to September 2026). Everything mechanism-specific lives behind one interface in src/adapters/predictive-allocation.ts, and it's fully config-driven — no code changes needed on launch day, just set env vars once Dromos publishes the address and ABI:

Var

Example

AERO_PREDICTIVE_ALLOCATION_ADDRESS

0x...

The mechanism's contract address

AERO_PREDICTIVE_ALLOCATION_ABI

["function submitAllocation(uint256 tokenId, address[] pools, uint256[] weights)"]

Human-readable ABI (JSON array), single function

AERO_PREDICTIVE_ALLOCATION_FUNCTION

submitAllocation

Function name to call

AERO_PREDICTIVE_ALLOCATION_ARGS

["veNftId","pools","weightsBps"]

Positional arg roles — supported: veNftId, pools, weightsBps (100 = 1%, matches Voter.vote()), weightsWad (fraction of 1e18)

With all four set, prepare_submission builds real calldata; predictive_allocation_status reports live: true. Until then, prepare_submission fails with a clear "not published yet" error and prepare_vote_calldata targets the classic Voter.vote() flow, which works today.

Configuration (env)

Var

Default

AERO_PROTOCOL

aerodrome

aerodrome (Base) or velodrome (Optimism) — see Multi-protocol

RPC_URL

protocol default

Dedicated RPC, either protocol — always wins if set

BASE_RPC_URL

https://base-rpc.publicnode.com

Legacy alias for RPC_URL, honored when AERO_PROTOCOL=aerodrome

RPC_URL_FALLBACK

protocol default

Automatic failover if RPC_URL goes down (not just rate-limited) — a second, independently-operated public RPC per protocol; override if you have a dedicated backup

AERO_MIN_TVL_USD

50000

Candidate pool TVL floor

AERO_MAX_CANDIDATES

300

Pools receiving full epoch-history analysis, ranked by staked TVL. Comfortably above the ~260 pools that currently clear AERO_MIN_TVL_USD — a lower value silently excludes small-but-high-APR pools from every ranked tool, regardless of how good their yield is

AERO_BACKTEST_EPOCHS

26

Epochs of history pulled per pool for backtest_summary

AERO_BACKTEST_MAX_POOLS

30

Pools analyzed per default backtest_summary run

AERO_DISCORD_WEBHOOK_URL

unset

If set, npm run epoch-reminder also posts its summary to this Discord webhook — see Epoch reminders

AERO_VOTING_POWER

unset

Your veAERO amount — if set, the epoch-reminder Discord post includes your personal voter_roi split, not just the market-wide reference — see One-click voting from the alert

AERO_DASHBOARD_URL

unset

Your dashboard deployment's URL — if also set, the Discord post links straight into it with that allocation pre-loaded

Epoch reminders

npm run epoch-reminder (scripts/epoch-reminder.ts) prints time-to-flip, the biggest predictive-edge mispricings, any detect_vote_swings signals, and a protocol_efficiency reference allocation — a snapshot of what's worth re-voting into or out of before lock. Set AERO_DISCORD_WEBHOOK_URL and it also posts the same summary as a Discord embed, so this is actionable without anyone polling for it.

.github/workflows/epoch-reminder.yml runs it on a schedule three times in the final hours before each epoch's Thursday 00:00 UTC lock (12h, 6h, and 1.5h out) via workflow_dispatch-triggerable cron. Set the AERO_DISCORD_WEBHOOK_URL repo secret (and optionally RPC_URL, for a dedicated endpoint instead of the public default) to enable it on your fork.

One-click voting from the alert

Set AERO_VOTING_POWER (your veAERO amount) and the post also includes your personal voter_roi split, not just the market-wide protocol_efficiency reference. Set AERO_DASHBOARD_URL too (your dashboard deployment's URL) and the alert becomes a clickable link straight into it with that allocation pre-loaded (via the ?vp= param — see Deploying to Vercel), wallet-connect ready.

This is deliberately "prepare + one-click approve," not unattended signing — no private key is ever held by this script, the GitHub Actions workflow, or any server. You still connect your own wallet and confirm the transaction yourself; automation only removes the "remember to check and compute this every week" part, not the signing.

Realized performance tracking

Every time epoch-reminder runs with AERO_VOTING_POWER set, it also logs that voter_roi recommendation to data/voter-roi-log.jsonl — one entry per epoch (idempotently overwritten across the schedule's three runs, so the log always reflects whichever run was closest to lock, the most accurate one). .github/workflows/epoch-reminder.yml commits this file back to the repo automatically when it changes.

npm run realized-performance (or the realized_performance MCP tool) then compares each logged epoch that's since completed against what actually happened: realized reward per pool uses the exact same formula recommend_allocation used to predict it — R·v/(E+v) — just with the epoch's final, actual fees/bribes/votes instead of forecasts. This needs no new on-chain fetching: the pool's actual outcome for any given epoch is already sitting in the same RewardsSugar.epochsByAddress history the engine reads for everything else — as long as reconciliation happens within that history's 8-epoch window of the epoch completing (SETTINGS.historyEpochs, not currently env-configurable), not months later.

This is a different question from backtest_summary: that validates the forecast model by replaying history; this is a track record of your actual recommendations going forward. One caveat: the tool can't know whether you actually followed a given logged recommendation — the "actual votes" figure it reconciles against is the pool's whole recorded total for that epoch, which may or may not already include yours.

Contracts used

Both from velodrome-finance/sugar's deployments/{base,optimism}.env; reward-token addresses cross-checked against DefiLlama + CoinGecko.

Aerodrome (Base, 8453)

Velodrome (Optimism, 10)

LpSugar

0x69dD9db6d8f8E7d83887A704f447b1a584b599A1

0x347512180804A8B40AA7525AE932a31198F074aA

RewardsSugar

0x1b121EfDaF4ABb8785a315C51D29BCE0552A7678

0x62CCFB2496f49A80B0184AD720379B529E9152fB

VeSugar

0x4d6A741cEE6A8cC5632B2d948C050303F6246D24

0xFE0a44d356a9F52c9F1bE0ba0f0877d986438c9C

Voter

0x16613524e02ad97eDfeF371bC883F2F5d6C480A5

0x41C914ee0c7E1A5edCD0295623e6dC557B5aBf3C

Reward token (AERO/VELO)

0x940181a94A35A4569E4529A3CDfB74e38FD98631

0x9560e827aF36c94D2Ac33a39bCe1fe78631088dB

Roadmap

  • Predictive Allocation adapter is config-driven and launch-ready — wiring the real contracts is an env var change (prepare_submission)

  • Social/attention signals (Farcaster mentions, token listings) as forecast features

  • Backtest harness: replay past epochs, score forecast vs realized fees, publish accuracy (backtest_summary, npm run backtest)

  • x402-monetized hosted endpoint — /api/v1/forecast, pay-per-forecast in USDC on Base, see Paid API (x402)

  • "Predicted hot pools" dashboard (web/)

  • Wallet connection + one-click vote from the dashboard (wagmi)

  • Multi-protocol: Velodrome (Optimism) alongside Aerodrome (Base), selected via AERO_PROTOCOL

  • Dashboard (web/) multi-protocol support — one protocol-fixed deployment per protocol, switcher link between them

  • Dashboard deployed live, both protocols (Vercel, cross-linked) — see Deploying to Vercel

  • Semi-automated voting: epoch-reminder posts your personal split with a one-click approve link — see One-click voting from the alert

  • Realized-vs-recommended tracking: realized_performance compares logged recommendations against actual outcomes — see Realized performance tracking

Disclaimer

Forecasts are statistical extrapolations of onchain history, not financial advice. Always review calldata before signing.

Available Tools

6 tools
pool_historyA

Per-epoch history for one Aerodrome pool: votes, AERO emissions, trading fees (USD) and bribes/incentives (USD) per weekly epoch, newest first (first row is the in-progress epoch).

ParametersJSON Schema
NameRequiredDescriptionDefault
poolYesPool (lp) address
epochsNo

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It discloses ordering and the in-progress epoch, but does not mention read-only nature, authentication requirements, or rate limits. For a read-only historical tool, this is adequate but not comprehensive.

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?

A single, well-structured sentence that front-loads the purpose and includes all key details without waste.

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 is sufficient for a simple tool with two parameters and no output schema. It explains what data is returned and ordering, though it could mention that it returns rows or a list.

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 covers 50% of parameters (pool with description). The description adds context that pool refers to 'one Aerodrome pool', but does not add meaning for the 'epochs' parameter beyond schema constraints. 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 it provides per-epoch history for one Aerodrome pool, listing specific data types (votes, AERO emissions, trading fees, bribes/incentives) and ordering (newest first). This distinguishes it from sibling tools that focus on predictions, allocation, or scanning.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

The description implies when to use (when historical pool data is needed) but does not explicitly state when not to use or mention alternatives. However, the context of sibling tools makes the usage clear.

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

predict_demandA

Forecast next-epoch trading-fee demand for top Aerodrome pools and compare it with current vote allocation. Key output: predictiveEdgePct — pools with positive edge are under-incentivized relative to predicted demand (the signal Predictive Allocation rewards). Data is cached ~5 min.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax pools to return
sortByNopredicted_fees
refreshNoForce a fresh onchain snapshot

TDQS

A4/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It discloses data caching (~5 min) and mentions the key output field. However, it does not state whether the tool is read-only, permissions needed, or potential side effects. It provides moderate transparency.

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?

Two sentences with precise language. No redundant words. Purpose is stated upfront, followed by key output explanation and caching note.

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 adequately explains what the tool does and the main output for a 3-parameter tool with no output schema. It could benefit from a brief note on return structure or error conditions, but overall it's sufficient for agent understanding.

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 67% (limit and refresh have descriptions, sortBy lacks description but enum values are self-explanatory). The description adds minimal extra parameter meaning beyond schema, mostly contextualizing the output rather than parameters.

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 action ('Forecast... and compare') and resource ('top Aerodrome pools'). It distinguishes from siblings (pool_history, recommend_allocation, etc.) by specifying it's about next-epoch demand vs current allocation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

The description explains the key output (predictiveEdgePct) and its interpretation (positive edge = under-incentivized), giving context for when to use. It implicitly suggests this tool for identifying under-incentivized pools, but lacks explicit when-not-to-use or alternative comparisons.

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

predictive_allocation_statusA

Status of the direct Predictive Allocation submission path (Aerodrome's July 2026 mechanism replacing weekly gauge voting). Reports whether live contracts are wired into this server.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

No annotations are provided, so the description bears the full burden. It states the tool reports status (read-only) but does not explicitly confirm it has no side effects or require special permissions. The behavior is implied but not fully transparent.

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 a single sentence that is front-loaded and free of unnecessary words. It efficiently communicates the tool's purpose without redundancy, earning a high score for conciseness.

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 simplicity (zero parameters, no output schema, no nested objects), the description provides sufficient context. It describes the tool's function and the specific mechanism it belongs to, making it complete for an agent to understand its utility.

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 input schema has zero parameters and 100% coverage, so the description's role is to explain what information the tool returns. It adds meaning beyond the schema by specifying that it reports whether 'live contracts are wired into this server', which clarifies the output's semantic content.

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 that the tool reports the status of the direct Predictive Allocation submission path, specifically whether live contracts are wired into the server. It distinguishes from sibling tools (e.g., pool_history, recommend_allocation) by being a status check rather than a data query or action tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

No explicit when-to-use guidance is given. The description implies it should be used to check system connectivity, but it does not specify when this is preferable to alternatives or mention prerequisites. This is acceptable for a simple read-only tool, but could be more helpful.

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

prepare_vote_calldataA

Build unsigned transaction calldata for Aerodrome Voter.vote() from an allocation (veAERO NFT id + pool weights). Returns { to, data, value } for the host wallet (e.g. Base MCP send/send_calls) to review, sign and submit — this server never signs. Note: votes can only be cast once per epoch per veNFT, and not in the final hour before epoch flip.

ParametersJSON Schema
NameRequiredDescriptionDefault
veNftIdYesveAERO NFT token id that holds the voting power
allocationsYes

TDQS

A4.5/5.0
Behavior4/5

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

No annotations exist, so description bears full burden. It discloses the tool does not sign transactions and returns data for external signing, and notes voting constraints. This adequately discloses behavioral traits beyond basic purpose.

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?

Two sentences plus a note. Front-loads the action and output format, then adds constraints. Every sentence is informative with no 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?

Covers input, output, usage constraints, and the tool's role in a broader signing flow. No output schema exists, but description explains return values. Sibling tool names confirm differentiation. Complete for decision-making.

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 50% (veNftId has description, allocations does not). Description adds meaning by summarizing parameters as 'veAERO NFT id + pool weights', clarifying the allocation structure. It doesn't detail constraints like maxItems, but the schema covers those.

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?

Description clearly states the tool builds unsigned calldata for a specific function (Aerodrome Voter.vote()), specifying verb, resource, and input. Sibling tools are about prediction and scanning, so this tool's distinct purpose is evident.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

Description implies usage context for voting calldata preparation, and includes important constraints (once per epoch, not final hour). It does not explicitly contrast with siblings, but the context is clear enough given sibling tool names.

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

recommend_allocationA

Produce a concrete incentive-allocation recommendation across Aerodrome pools. objective=protocol_efficiency allocates proportional to predicted next-epoch fee demand (the Predictive Allocation ideal); objective=voter_roi maximizes expected reward per veAERO vote with a 25% per-pool concentration cap. Returns weights that sum to 100%.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNo
maxPoolsNo
objectiveNovoter_roi

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that the tool returns weights summing to 100% and mentions a 25% concentration cap for voter_roi. However, it does not state whether the tool is read-only, whether it requires authentication, or any side effects. The refresh parameter is not explained, which is a gap for behavioral understanding.

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 two sentences long, front-loading the purpose and then detailing the objectives. Every sentence adds value, and there is no redundant or extraneous information. It is optimally concise for the information provided.

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?

Given 3 parameters, no annotations, and no output schema, the description is moderately complete. It explains the output (weights summing to 100%), covers the two modes, and mentions the concentration cap. However, it lacks explanation for refresh and maxPools, and does not detail the return format beyond the sum constraint. Additional context on these gaps would improve completeness.

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 0%, so the description must compensate. It explains the objective parameter in detail (the two enum values and their behaviors), but does not explain the refresh boolean or maxPools integer parameters. For a 3-parameter tool, covering only one well is partial but the most critical parameter is covered, so a middle score 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 that the tool produces concrete incentive-allocation recommendations across Aerodrome pools, and explains the two possible objectives. This distinguishes it from sibling tools like pool_history (historical data) and predict_demand (demand prediction), making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

The description explains the two objectives (protocol_efficiency and voter_roi) and their behaviors, providing some guidance on which to choose. However, it does not explicitly state when to use this tool over siblings or provide exclusions/alternatives. The guidance is implicit in the objective descriptions but lacks completeness.

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

scan_poolsA

Scan Aerodrome (Base) gauge-enabled pools with live TVL, staked TVL, fee tier and emissions. Sorted by staked TVL. Use this for a market overview before predicting demand.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax pools to return
minTvlUsdNoMinimum pool TVL in USD

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description must convey behavior. It describes the tool as scanning for live data and sorting by staked TVL. It does not explicitly state read-only nature or any side effects, but the verb 'scan' implies a read operation. The description adds value over no description but lacks explicit behavioral guarantees.

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 two sentences long with no wasted words. It front-loads the core action and output fields, then provides usage guidance. Every sentence adds value.

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 has no output schema, the description lists the main return fields (live TVL, staked TVL, fee tier, emissions) and states the sort order. It also mentions the platform (Aerodrome on Base) and ties to sibling tools implicitly. A minor gap is not describing each field in detail, but for a scan tool this is sufficient.

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%, meaning the input schema already documents parameters (limit, minTvlUsd) with descriptions and defaults. The tool description does not add additional meaning to these parameters beyond what is in the schema, so 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 the action ('Scan'), the resource ('Aerodrome (Base) gauge-enabled pools'), and the returned fields (live TVL, staked TVL, fee tier, emissions). It distinguishes itself from siblings by positioning as a market overview tool before predicting demand.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

The description gives explicit usage context: 'Use this for a market overview before predicting demand.' This implies it is a preliminary step to predictive tools like predict_demand. It does not specify when not to use it, but the context is clear enough.

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. Dates show when Glama detected each change.

  1. 6 tool updatesv0.1.0
    • First observedpool_history
    • First observedpredict_demand
    • First observedpredictive_allocation_status
    • First observedprepare_vote_calldata
    • First observedrecommend_allocation
    • First observedscan_pools

TDQS

A4.2/5.0
Disambiguation5/5

Each tool targets a distinct aspect of Aerodrome allocation: history, demand prediction, mechanism status, vote calldata preparation, allocation recommendation, and pool scanning. There is no overlap; descriptions clearly differentiate their purposes.

Naming Consistency4/5

Most tool names follow a clear verb_noun pattern (predict_demand, scan_pools, prepare_vote_calldata, recommend_allocation), but two are noun phrases (pool_history, predictive_allocation_status). The naming style remains consistent with snake_case and descriptive terms.

Tool Count5/5

With 6 tools, the server is well-scoped for its domain. Each tool serves a necessary function in the allocation workflow, neither too few to be incomplete nor too many to be unwieldy.

Completeness5/5

The tool set covers the full lifecycle: scanning for overview, historical data, demand prediction, allocation recommendation, and vote calldata construction. There are no obvious gaps for the intended purpose of optimizing Aero vote allocation.

Maintenance

ActivityActive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP (Model Context Protocol) server for the MAIN DEX on Base. Provides AI agents (Claude, Cursor, etc.) with tools to interact with the protocol: swap tokens, manage liquidity, enter/exit ALM strategies(10% APY), and more.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    An MCP server + CLI that reads live on-chain data from Aerodrome Finance (Base) to rank pools by veAERO vote efficiency, and recommends a vote allocation that accounts for self-dilution.
    0
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server to fetch DeFi yield opportunities on Base chain, including Aerodrome LP and Moonwell lending, with pay-per-call via x402 micropayments.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that provides AI agents with pay-per-call access to a suite of tools (honeypot check, token market, DeFi yields, etc.) via USDC on Base using the x402 protocol.
    4
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Hryhorii77/aero-allocator'

If you have feedback or need assistance with the MCP directory API, please join our Discord server