Spaces:
Running
Running
import gradio as gr | |
import requests | |
COINGECKO_API = "https://api.coingecko.com/api/v3" | |
def get_simple_price( | |
ids: str = "bitcoin,ethereum", | |
vs_currencies: str = "usd" | |
) -> dict: | |
""" | |
Get current price for one or more coins. | |
""" | |
url = f"{COINGECKO_API}/simple/price" | |
params = { | |
"ids": ids, | |
"vs_currencies": vs_currencies, | |
"include_market_cap": "true", | |
"include_24hr_vol": "true", | |
"include_24hr_change": "true", | |
"include_last_updated_at": "true" | |
} | |
resp = requests.get(url, params=params) | |
try: | |
return resp.json() | |
except Exception: | |
return {"error": resp.text} | |
def get_coin_metadata(coin_id: str = "bitcoin") -> dict: | |
""" | |
Get full metadata for a given coin. | |
""" | |
url = f"{COINGECKO_API}/coins/{coin_id}" | |
resp = requests.get(url) | |
try: | |
data = resp.json() | |
return { | |
"id": data.get("id"), | |
"symbol": data.get("symbol"), | |
"name": data.get("name"), | |
"description": data.get("description", {}).get("en"), | |
"homepage": data.get("links", {}).get("homepage", [None])[0], | |
"genesis_date": data.get("genesis_date"), | |
"market_data": data.get("market_data"), | |
"image": data.get("image", {}).get("large") | |
} | |
except Exception: | |
return {"error": resp.text} | |
def get_markets( | |
vs_currency: str = "usd", | |
per_page: int = 10, | |
page: int = 1 | |
) -> dict: | |
""" | |
Get a list of coins with price/market data (like top 10 by market cap). | |
""" | |
url = f"{COINGECKO_API}/coins/markets" | |
params = { | |
"vs_currency": vs_currency, | |
"order": "market_cap_desc", | |
"per_page": per_page, | |
"page": page, | |
"sparkline": "false" | |
} | |
resp = requests.get(url, params=params) | |
try: | |
return resp.json() | |
except Exception: | |
return {"error": resp.text} | |
def get_coin_history( | |
coin_id: str = "bitcoin", | |
date: str = "01-01-2023" | |
) -> dict: | |
""" | |
Get historical data for a coin (dd-mm-yyyy). | |
""" | |
url = f"{COINGECKO_API}/coins/{coin_id}/history" | |
params = {"date": date} | |
resp = requests.get(url, params=params) | |
try: | |
data = resp.json() | |
price = data.get("market_data", {}).get("current_price", {}).get("usd") | |
return { | |
"coin": coin_id, | |
"date": date, | |
"price_usd": price, | |
"snapshot": data.get("market_data", {}) | |
} | |
except Exception: | |
return {"error": resp.text} | |
def get_global() -> dict: | |
""" | |
Get global crypto stats (total market cap, #coins, #markets, etc). | |
""" | |
url = f"{COINGECKO_API}/global" | |
resp = requests.get(url) | |
try: | |
return resp.json() | |
except Exception: | |
return {"error": resp.text} | |
with gr.Blocks() as demo: | |
gr.Markdown( | |
"# 🦎 CoinGecko MCP API\n\nPublic CoinGecko endpoints exposed as MCP tools!" | |
) | |
with gr.Tab("Simple Price"): | |
gr.Interface( | |
fn=get_simple_price, | |
inputs=[ | |
gr.Textbox(value="bitcoin,ethereum", label="Coin IDs (comma separated)"), | |
gr.Textbox(value="usd", label="Vs Currencies (comma separated)") | |
], | |
outputs=gr.JSON(), | |
allow_flagging="never" | |
) | |
with gr.Tab("Markets (Top N)"): | |
gr.Interface( | |
fn=get_markets, | |
inputs=[ | |
gr.Textbox(value="usd", label="Fiat Currency"), | |
gr.Slider(minimum=1, maximum=100, value=10, step=1, label="Results per page"), | |
gr.Slider(minimum=1, maximum=10, value=1, step=1, label="Page Number") | |
], | |
outputs=gr.JSON(), | |
allow_flagging="never" | |
) | |
with gr.Tab("Coin Metadata"): | |
gr.Interface( | |
fn=get_coin_metadata, | |
inputs=[gr.Textbox(value="bitcoin", label="Coin ID")], | |
outputs=gr.JSON(), | |
allow_flagging="never" | |
) | |
with gr.Tab("Coin History"): | |
gr.Interface( | |
fn=get_coin_history, | |
inputs=[ | |
gr.Textbox(value="bitcoin", label="Coin ID"), | |
gr.Textbox(value="01-01-2023", label="Date (dd-mm-yyyy)") | |
], | |
outputs=gr.JSON(), | |
allow_flagging="never" | |
) | |
with gr.Tab("Global Stats"): | |
gr.Interface( | |
fn=get_global, | |
inputs=[], | |
outputs=gr.JSON(), | |
allow_flagging="never" | |
) | |
if __name__ == "__main__": | |
demo.launch(mcp_server=True) |