Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Access CoinGecko crypto market data: spot prices, OHLC, trending coins, exchange listings, NFTs, and global stats.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
tools/search.py
1#!/usr/bin/env python32"""3CoinGecko Search Tools45Tools for searching coins, exchanges, categories, and NFTs.6"""78import os9from dotenv import load_dotenv10import json11import argparse12from typing import Dict, Any1314from core.http_client import proxied_get1516# Load environment variables17load_dotenv()181920def get_api_key() -> str:21"""Get CoinGecko API key from environment."""22api_key = os.getenv("COINGECKO_API_KEY")23if not api_key:24raise ValueError("COINGECKO_API_KEY environment variable is required")25return api_key262728def search(query: str) -> Dict[str, Any]:29"""30Search for coins, exchanges, categories, and NFTs.3132Args:33query: Search query string3435Returns:36Dictionary with search results across all categories37"""38api_key = get_api_key()3940url = "https://pro-api.coingecko.com/api/v3/search"41headers = {"x-cg-pro-api-key": api_key}42params = {"query": query}4344response = proxied_get(url, headers=headers, params=params, timeout=30)45response.raise_for_status()46data = response.json()4748# Format coins49coins = []50for coin in data.get("coins", []):51coins.append({52"id": coin.get("id", ""),53"name": coin.get("name", ""),54"api_symbol": coin.get("api_symbol", ""),55"symbol": coin.get("symbol", "").upper(),56"market_cap_rank": coin.get("market_cap_rank"),57"thumb": coin.get("thumb"),58"large": coin.get("large")59})6061# Format exchanges62exchanges = []63for exchange in data.get("exchanges", []):64exchanges.append({65"id": exchange.get("id", ""),66"name": exchange.get("name", ""),67"market_type": exchange.get("market_type"),68"thumb": exchange.get("thumb"),69"large": exchange.get("large")70})7172# Format categories73categories = []74for category in data.get("categories", []):75categories.append({76"id": category.get("id"),77"name": category.get("name", "")78})7980# Format NFTs81nfts = []82for nft in data.get("nfts", []):83nfts.append({84"id": nft.get("id", ""),85"name": nft.get("name", ""),86"symbol": nft.get("symbol", ""),87"thumb": nft.get("thumb")88})8990# Format ICOs (if present)91icos = data.get("icos", [])9293return {94"query": query,95"coins": coins,96"coins_count": len(coins),97"exchanges": exchanges,98"exchanges_count": len(exchanges),99"categories": categories,100"categories_count": len(categories),101"nfts": nfts,102"nfts_count": len(nfts),103"icos": icos,104"icos_count": len(icos)105}106107108def main():109"""CLI interface for search tools."""110parser = argparse.ArgumentParser(111description="CoinGecko Search Tools",112formatter_class=argparse.RawDescriptionHelpFormatter113)114115parser.add_argument("query", help="Search query")116117args = parser.parse_args()118119try:120result = search(args.query)121print(json.dumps(result, indent=2, ensure_ascii=False))122return 0123124except Exception as e:125print(json.dumps({"error": str(e)}, indent=2))126return 1127128129if __name__ == "__main__":130exit(main())131