etf_flow_today
Retrieve today's aggregate flows for US-listed spot crypto ETFs, including Bitcoin and Ethereum net flows, 5-day streak, and cumulative AUM.
Instructions
US-listed spot crypto ETF aggregate flows today. BTC + ETH net flow, 5d streak, cumulative AUM. Source: SoSoValue.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- falsifylab_alpha_mcp.py:147-153 (registration)Tool 'etf_flow_today' is registered in the TOOLS list with a description about US-listed spot crypto ETF aggregate flows today, sourced from SoSoValue. Takes no input parameters.
{ "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": {}}, }, - falsifylab_alpha_mcp.py:201-202 (handler)The call_tool function dispatches 'etf_flow_today' to _api_get('/api/etf_flow', args), making a GET request to the backend API endpoint /api/etf_flow.
if name == "etf_flow_today": return _api_get("/api/etf_flow", args) - falsifylab_alpha_mcp.py:51-70 (helper)The _api_get helper function handles HTTP GET requests to the FalsifyLab API backend, with authorization, error handling, and JSON parsing.
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]}