active_airdrop_farms
Identify active airdrop and points-farming opportunities by analyzing DefiLlama yield gaps, with realistic APY, TVL, capital requirements, and confidence scores.
Instructions
Active airdrop / points-farming opportunities. Detected from DefiLlama yield gaps (where reported APY exceeds base+rewards = likely points program). Includes realistic APY, TVL, capital required, confidence score. Sourced from Suki defi_scanner.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| min_apy | No | filter floor pct (realistic APY) | |
| min_tvl_usd | No | filter pools <X TVL | |
| chain | No | filter (ethereum, base, arbitrum, etc.) |
Implementation Reference
- falsifylab_alpha_mcp.py:154-173 (schema)Schema/definition of the 'active_airdrop_farms' tool, describing its purpose (airdrops/points-farming opportunities from DefiLlama yield gaps) and input parameters (limit, min_apy, min_tvl_usd, chain).
{ "name": "active_airdrop_farms", "description": "Active airdrop / points-farming opportunities. " "Detected from DefiLlama yield gaps (where reported " "APY exceeds base+rewards = likely points program). " "Includes realistic APY, TVL, capital required, " "confidence score. Sourced from Suki defi_scanner.", "inputSchema": { "type": "object", "properties": { "limit": {"type": "integer", "default": 10}, "min_apy": {"type": "number", "default": 0, "description": "filter floor pct (realistic APY)"}, "min_tvl_usd": {"type": "number", "default": 0, "description": "filter pools <X TVL"}, "chain": {"type": "string", "description": "filter (ethereum, base, arbitrum, etc.)"}, }, }, }, - falsifylab_alpha_mcp.py:75-185 (registration)The TOOLS list that registers all tool definitions including 'active_airdrop_farms' as one of the available MCP tools.
TOOLS = [ { "name": "top_yield_farms", "description": "Latest 24h top DeFi yield farm picks with realistic " "APY (emissions stripped), risk notes, TVL, protocol. " "Sourced from FalsifyLab daily aggregator.", "inputSchema": { "type": "object", "properties": { "limit": {"type": "integer", "default": 10, "description": "max results (1-50)"}, "min_apy": {"type": "number", "default": 0, "description": "filter floor in pct"}, "asset": {"type": "string", "description": "filter by asset symbol (BTC, ETH, SOL, etc.)"}, }, }, }, { "name": "hl_vault_leaderboard", "description": "Hyperliquid vault leaderboard with NAV, 30d return, " "max drawdown, follower count, composite score. " "Real-time scrape of HL info API.", "inputSchema": { "type": "object", "properties": { "limit": {"type": "integer", "default": 10}, "sort_by": {"type": "string", "enum": ["score", "tvl", "return_30d", "followers"], "default": "score"}, }, }, }, { "name": "insider_buy_clusters", "description": "Form 4 insider buy clusters (3+ insiders bought same " "ticker in 24-48h). Bullish signal. Filtered to " "open-market purchases (P code), excluding awards/gifts.", "inputSchema": { "type": "object", "properties": { "window_hours": {"type": "integer", "default": 24}, "min_insiders": {"type": "integer", "default": 3}, }, }, }, { "name": "sec8k_material_today", "description": "Material SEC 8-K filings today filtered by item code: " "2.02 (earnings), 5.02 (officer change), 2.01 (M&A), " "3.02 (dilution), 4.02 (restatement), 3.01 (delisting).", "inputSchema": { "type": "object", "properties": { "items": {"type": "array", "items": {"type": "string"}, "description": "item codes (e.g. ['2.02','5.02'])"}, "ticker": {"type": "string", "description": "filter by ticker symbol"}, }, }, }, { "name": "macro_tape", "description": "Live US macro snapshot: SPX, NDX, RUT, VIX, UST 2y/10y, " "DXY, GOLD, WTI, BTC, ETH. Last price + 1d/5d % change.", "inputSchema": { "type": "object", "properties": { "symbols": {"type": "array", "items": {"type": "string"}}, }, }, }, { "name": "etf_flow_today", "description": "US-listed spot crypto ETF aggregate flows today. " "BTC + ETH net flow, 5d streak, cumulative AUM. " "Source: SoSoValue.", "inputSchema": {"type": "object", "properties": {}}, }, { "name": "active_airdrop_farms", "description": "Active airdrop / points-farming opportunities. " "Detected from DefiLlama yield gaps (where reported " "APY exceeds base+rewards = likely points program). " "Includes realistic APY, TVL, capital required, " "confidence score. Sourced from Suki defi_scanner.", "inputSchema": { "type": "object", "properties": { "limit": {"type": "integer", "default": 10}, "min_apy": {"type": "number", "default": 0, "description": "filter floor pct (realistic APY)"}, "min_tvl_usd": {"type": "number", "default": 0, "description": "filter pools <X TVL"}, "chain": {"type": "string", "description": "filter (ethereum, base, arbitrum, etc.)"}, }, }, }, { "name": "polymarket_whale_positions", "description": "Top Polymarket whale wallets and their current " "active positions sized >$10k. Copy-trade reference.", "inputSchema": { "type": "object", "properties": { "min_position_usd": {"type": "integer", "default": 10000}, }, }, }, ] - falsifylab_alpha_mcp.py:190-207 (handler)The call_tool dispatch function that routes the tool name 'active_airdrop_farms' to an API GET request to the '/api/airdrops' endpoint. The actual data-fetching/processing logic is delegated to the backend API via _api_get().
def call_tool(name: str, args: dict) -> dict: if name == "top_yield_farms": return _api_get("/api/yield/top", args) if name == "hl_vault_leaderboard": return _api_get("/api/hl_vaults", args) if name == "insider_buy_clusters": return _api_get("/api/form4/clusters", args) if name == "sec8k_material_today": return _api_get("/api/sec8k/today", args) if name == "macro_tape": return _api_get("/api/macro", args) if name == "etf_flow_today": return _api_get("/api/etf_flow", args) if name == "active_airdrop_farms": return _api_get("/api/airdrops", args) if name == "polymarket_whale_positions": return _api_get("/api/polymarket/whales", args) return {"error": f"unknown tool: {name}"} - falsifylab_alpha_mcp.py:51-70 (helper)The _api_get() helper function that executes the HTTP GET request to the backend API. It constructs the URL, passes parameters, adds auth headers, and handles errors.
def _api_get(path: str, params: dict | None = None) -> dict: if params: from urllib.parse import urlencode path = f"{path}?{urlencode(params)}" req = urllib.request.Request( f"{API_BASE}{path}", headers={ "User-Agent": USER_AGENT, "Accept": "application/json", **({"Authorization": f"Bearer {API_KEY}"} if API_KEY else {}), }, ) try: with urllib.request.urlopen(req, timeout=20) as r: return json.loads(r.read()) except urllib.error.HTTPError as e: body = e.read().decode(errors="ignore")[:400] return {"error": f"HTTP {e.code}: {body}"} except Exception as e: return {"error": str(e)[:200]}