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.
swarms/examples/tools/mcp_examples/servers/mcp_test.py

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")