You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.6 KiB
117 lines
3.6 KiB
# crypto_price_server.py
|
|
from mcp.server.fastmcp import FastMCP
|
|
import requests
|
|
|
|
mcp = FastMCP("CryptoPrice")
|
|
|
|
|
|
@mcp.tool(
|
|
name="get_crypto_price",
|
|
description="Get the current price and basic information for a given cryptocurrency.",
|
|
)
|
|
def get_crypto_price(coin_id: str) -> str:
|
|
"""
|
|
Get the current price and basic information for a given cryptocurrency using CoinGecko API.
|
|
|
|
Args:
|
|
coin_id (str): The cryptocurrency ID (e.g., 'bitcoin', 'ethereum')
|
|
|
|
Returns:
|
|
str: A formatted string containing the cryptocurrency information
|
|
|
|
Example:
|
|
>>> get_crypto_price('bitcoin')
|
|
'Current price of Bitcoin: $45,000'
|
|
"""
|
|
try:
|
|
if not coin_id:
|
|
return "Please provide a valid cryptocurrency ID"
|
|
|
|
# CoinGecko API endpoint
|
|
url = f"https://api.coingecko.com/api/v3/simple/price?ids={coin_id}&vs_currencies=usd&include_24hr_change=true"
|
|
|
|
# Make the API request
|
|
response = requests.get(url)
|
|
response.raise_for_status() # Raise an exception for bad status codes
|
|
|
|
data = response.json()
|
|
|
|
if coin_id not in data:
|
|
return f"Could not find data for {coin_id}. Please check the cryptocurrency ID."
|
|
|
|
price = data[coin_id]["usd"]
|
|
change_24h = data[coin_id].get("usd_24h_change", "N/A")
|
|
|
|
return f"Current price of {coin_id.capitalize()}: ${price:,.2f}\n24h Change: {change_24h:.2f}%"
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
return f"Error fetching crypto data: {str(e)}"
|
|
except Exception as e:
|
|
return f"Error: {str(e)}"
|
|
|
|
|
|
@mcp.tool(
|
|
name="get_htx_crypto_price",
|
|
description="Get the current price and basic information for a given cryptocurrency from HTX exchange.",
|
|
)
|
|
def get_htx_crypto_price(symbol: str) -> str:
|
|
"""
|
|
Get the current price and basic information for a given cryptocurrency using HTX API.
|
|
|
|
Args:
|
|
symbol (str): The cryptocurrency trading pair (e.g., 'btcusdt', 'ethusdt')
|
|
|
|
Returns:
|
|
str: A formatted string containing the cryptocurrency information
|
|
|
|
Example:
|
|
>>> get_htx_crypto_price('btcusdt')
|
|
'Current price of BTC/USDT: $45,000'
|
|
"""
|
|
try:
|
|
if not symbol:
|
|
return "Please provide a valid trading pair (e.g., 'btcusdt')"
|
|
|
|
# Convert to lowercase and ensure proper format
|
|
symbol = symbol.lower()
|
|
if not symbol.endswith("usdt"):
|
|
symbol = f"{symbol}usdt"
|
|
|
|
# HTX API endpoint
|
|
url = f"https://api.htx.com/market/detail/merged?symbol={symbol}"
|
|
|
|
# Make the API request
|
|
response = requests.get(url)
|
|
response.raise_for_status()
|
|
|
|
data = response.json()
|
|
|
|
if data.get("status") != "ok":
|
|
return f"Error: {data.get('err-msg', 'Unknown error')}"
|
|
|
|
tick = data.get("tick", {})
|
|
if not tick:
|
|
return f"Could not find data for {symbol}. Please check the trading pair."
|
|
|
|
price = tick.get("close", 0)
|
|
change_24h = tick.get("close", 0) - tick.get("open", 0)
|
|
change_percent = (
|
|
(change_24h / tick.get("open", 1)) * 100
|
|
if tick.get("open")
|
|
else 0
|
|
)
|
|
|
|
base_currency = symbol[
|
|
:-4
|
|
].upper() # Remove 'usdt' and convert to uppercase
|
|
return f"Current price of {base_currency}/USDT: ${price:,.2f}\n24h Change: {change_percent:.2f}%"
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
return f"Error fetching HTX data: {str(e)}"
|
|
except Exception as e:
|
|
return f"Error: {str(e)}"
|
|
|
|
|
|
if __name__ == "__main__":
|
|
mcp.run(transport="sse")
|