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/nfts.py
1#!/usr/bin/env python32"""3CoinGecko NFT Tools45Tools for fetching NFT collection data including lists, details, and contract lookups.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 get_nfts_list(29order: str = "market_cap_usd_desc",30per_page: int = 100,31page: int = 132) -> Dict[str, Any]:33"""34Get all NFT collections with IDs and contract addresses.3536Args:37order: Sort order (market_cap_usd_desc, h24_volume_usd_desc, etc.)38per_page: Results per page (max 250)39page: Page number4041Returns:42Dictionary with list of NFT collections43"""44api_key = get_api_key()4546url = "https://pro-api.coingecko.com/api/v3/nfts/list"47headers = {"x-cg-pro-api-key": api_key}48params = {49"order": order,50"per_page": min(per_page, 250),51"page": page52}5354response = proxied_get(url, headers=headers, params=params, timeout=30)55response.raise_for_status()56data = response.json()5758nfts = []59for nft in data:60nfts.append({61"id": nft.get("id", ""),62"contract_address": nft.get("contract_address", ""),63"name": nft.get("name", ""),64"asset_platform_id": nft.get("asset_platform_id"),65"symbol": nft.get("symbol", "")66})6768return {69"nfts": nfts,70"count": len(nfts),71"page": page,72"per_page": per_page,73"order": order74}757677def get_nft(nft_id: str) -> Dict[str, Any]:78"""79Get NFT collection data including floor price, volume, and market cap.8081Args:82nft_id: CoinGecko NFT collection id8384Returns:85Dictionary with NFT collection data86"""87api_key = get_api_key()8889url = f"https://pro-api.coingecko.com/api/v3/nfts/{nft_id}"90headers = {"x-cg-pro-api-key": api_key}9192response = proxied_get(url, headers=headers, timeout=30)93response.raise_for_status()94data = response.json()9596return {97"id": data.get("id", ""),98"contract_address": data.get("contract_address", ""),99"asset_platform_id": data.get("asset_platform_id"),100"name": data.get("name", ""),101"symbol": data.get("symbol", ""),102"image": data.get("image", {}),103"description": data.get("description"),104"native_currency": data.get("native_currency"),105"native_currency_symbol": data.get("native_currency_symbol"),106"floor_price": data.get("floor_price", {}),107"market_cap": data.get("market_cap", {}),108"volume_24h": data.get("volume_24h", {}),109"floor_price_in_usd_24h_percentage_change": data.get("floor_price_in_usd_24h_percentage_change"),110"floor_price_24h_percentage_change": data.get("floor_price_24h_percentage_change", {}),111"market_cap_24h_percentage_change": data.get("market_cap_24h_percentage_change", {}),112"volume_24h_percentage_change": data.get("volume_24h_percentage_change", {}),113"number_of_unique_addresses": data.get("number_of_unique_addresses"),114"number_of_unique_addresses_24h_percentage_change": data.get("number_of_unique_addresses_24h_percentage_change"),115"volume_in_usd_24h_percentage_change": data.get("volume_in_usd_24h_percentage_change"),116"total_supply": data.get("total_supply"),117"one_day_sales": data.get("one_day_sales"),118"one_day_sales_24h_percentage_change": data.get("one_day_sales_24h_percentage_change"),119"one_day_average_sale_price": data.get("one_day_average_sale_price"),120"one_day_average_sale_price_24h_percentage_change": data.get("one_day_average_sale_price_24h_percentage_change"),121"links": data.get("links", {}),122"floor_price_7d_percentage_change": data.get("floor_price_7d_percentage_change", {}),123"floor_price_14d_percentage_change": data.get("floor_price_14d_percentage_change", {}),124"floor_price_30d_percentage_change": data.get("floor_price_30d_percentage_change", {}),125"floor_price_60d_percentage_change": data.get("floor_price_60d_percentage_change", {}),126"floor_price_1y_percentage_change": data.get("floor_price_1y_percentage_change", {}),127"explorers": data.get("explorers", [])128}129130131def get_nft_by_contract(132asset_platform: str,133contract_address: str134) -> Dict[str, Any]:135"""136Get NFT collection data by contract address.137138Args:139asset_platform: Asset platform id (e.g., ethereum, solana)140contract_address: NFT contract address141142Returns:143Dictionary with NFT collection data144"""145api_key = get_api_key()146147url = f"https://pro-api.coingecko.com/api/v3/nfts/{asset_platform}/contract/{contract_address}"148headers = {"x-cg-pro-api-key": api_key}149150response = proxied_get(url, headers=headers, timeout=30)151response.raise_for_status()152data = response.json()153154return {155"id": data.get("id", ""),156"contract_address": data.get("contract_address", ""),157"asset_platform_id": data.get("asset_platform_id"),158"name": data.get("name", ""),159"symbol": data.get("symbol", ""),160"image": data.get("image", {}),161"description": data.get("description"),162"native_currency": data.get("native_currency"),163"native_currency_symbol": data.get("native_currency_symbol"),164"floor_price": data.get("floor_price", {}),165"market_cap": data.get("market_cap", {}),166"volume_24h": data.get("volume_24h", {}),167"floor_price_in_usd_24h_percentage_change": data.get("floor_price_in_usd_24h_percentage_change"),168"floor_price_24h_percentage_change": data.get("floor_price_24h_percentage_change", {}),169"market_cap_24h_percentage_change": data.get("market_cap_24h_percentage_change", {}),170"volume_24h_percentage_change": data.get("volume_24h_percentage_change", {}),171"number_of_unique_addresses": data.get("number_of_unique_addresses"),172"number_of_unique_addresses_24h_percentage_change": data.get("number_of_unique_addresses_24h_percentage_change"),173"volume_in_usd_24h_percentage_change": data.get("volume_in_usd_24h_percentage_change"),174"total_supply": data.get("total_supply"),175"one_day_sales": data.get("one_day_sales"),176"one_day_sales_24h_percentage_change": data.get("one_day_sales_24h_percentage_change"),177"one_day_average_sale_price": data.get("one_day_average_sale_price"),178"one_day_average_sale_price_24h_percentage_change": data.get("one_day_average_sale_price_24h_percentage_change"),179"links": data.get("links", {}),180"floor_price_7d_percentage_change": data.get("floor_price_7d_percentage_change", {}),181"floor_price_14d_percentage_change": data.get("floor_price_14d_percentage_change", {}),182"floor_price_30d_percentage_change": data.get("floor_price_30d_percentage_change", {}),183"floor_price_60d_percentage_change": data.get("floor_price_60d_percentage_change", {}),184"floor_price_1y_percentage_change": data.get("floor_price_1y_percentage_change", {}),185"explorers": data.get("explorers", [])186}187188189def main():190"""CLI interface for NFT tools."""191parser = argparse.ArgumentParser(192description="CoinGecko NFT Tools",193formatter_class=argparse.RawDescriptionHelpFormatter194)195196subparsers = parser.add_subparsers(dest="command")197198# List command199list_parser = subparsers.add_parser("list", help="Get all NFT collections")200list_parser.add_argument("--order", default="market_cap_usd_desc")201list_parser.add_argument("--per-page", type=int, default=100)202list_parser.add_argument("--page", type=int, default=1)203204# Get command205get_parser = subparsers.add_parser("get", help="Get NFT collection details")206get_parser.add_argument("nft_id", help="NFT collection ID")207208# Contract command209contract_parser = subparsers.add_parser("contract", help="Get NFT by contract")210contract_parser.add_argument("platform", help="Asset platform (ethereum, solana)")211contract_parser.add_argument("address", help="Contract address")212213args = parser.parse_args()214215try:216if args.command == "list":217result = get_nfts_list(args.order, args.per_page, args.page)218elif args.command == "get":219result = get_nft(args.nft_id)220elif args.command == "contract":221result = get_nft_by_contract(args.platform, args.address)222else:223parser.print_help()224return 0225226print(json.dumps(result, indent=2, ensure_ascii=False))227return 0228229except Exception as e:230print(json.dumps({"error": str(e)}, indent=2))231return 1232233234if __name__ == "__main__":235exit(main())236