coin-mcp
A comprehensive cryptocurrency market-data MCP server with 49 tools across six data sources, enabling LLMs to answer market questions via natural language.
README
coin-mcp
English · 中文
A comprehensive cryptocurrency market-data MCP server. Six data sources, 49 tools, 8 prompt templates, 3 resources — wired together so an LLM can answer almost any "what's the market doing?" question with a single call.
Table of contents
- Why coin-mcp
- What it can answer
- Installation
- Architecture
- Tool catalog (49)
- Prompt templates (8)
- Resources (3)
- Configuration
- MCP client integration
- Transports
- Caching layer
- Security model
- Project structure
- Testing
- Roadmap
- License
- Acknowledgments
Why coin-mcp
Most crypto MCP servers are thin wrappers around a single API and hit a wall the moment a user asks anything that requires combining sources. coin-mcp is built around a different premise: a strong AI assistant needs complementary data sources behind one consistent contract.
| Source | Strength | What it covers here |
|---|---|---|
| CoinGecko | Aggregated, volume-weighted | Price, market cap, history, NFTs, categories, treasuries, trending, search |
| CCXT | Real-time, per-exchange | Tickers, order books, recent trades, OHLCV, funding rates across 100+ exchanges |
| DefiLlama | DeFi-native, free | Protocol/chain TVL, stablecoins, yield pools, DEX volume, fees & revenue |
| DexScreener | DEX-side, long-tail tokens | Pairs, liquidity, prices for tokens too small/new for CoinGecko |
| Alternative.me | Sentiment | Crypto Fear & Greed Index |
| Local TA | Offline compute | RSI, MACD, Bollinger, EMA/SMA, ATR, ADX, Stochastic, OBV |
Plus a tiered HTTP cache that keeps you safely under CoinGecko's free-tier rate limit, and a multi-transport runtime (stdio / SSE / streamable-HTTP).
What it can answer
A non-exhaustive sample of questions a connected LLM can resolve in 1–3 tool calls:
- "What is BTC trading at right now?" →
get_price - "Compare BTC's price across Coinbase, Kraken, OKX and DexScreener and tell me the spread." →
compare_prices - "Give me a 30-day chart and run RSI, MACD and Bollinger on it." →
get_market_chart+compute_indicators - "Where is the best bid for ETH/USDT across exchanges?" →
get_consolidated_orderbook - "Funding rates for the BTC perp on Binance, OKX, Bybit, Bitmex — who's paying who?" →
compare_funding_rates - "What protocols are leading TVL on Solana right now?" →
list_protocols(chain="Solana") - "Find me yield pools paying > 10% APY on stablecoins with > $5M TVL." →
list_yield_pools - "Is the market fearful or greedy today?" →
get_fear_greed_index - "Is everything healthy? I'm seeing weird data." →
health_check - "Which public companies hold BTC?" →
get_companies_holdings
Installation
Prerequisites
- Python 3.10+ (
python3 --versionto check) - Git
- One of:
uv(recommended — handles Python toolchain, venv, lockfile in one tool)pip+ a virtualenv
uv install (one line, all platforms):
curl -LsSf https://astral.sh/uv/install.sh | sh # macOS / Linux
# powershell -c "irm https://astral.sh/uv/install.ps1 | iex" # Windows PowerShell
Option 1 — uv (recommended)
git clone https://github.com/ymylive/coin-mcp.git
cd coin-mcp
uv sync # creates .venv, installs from uv.lock
uv run coin-mcp # starts the server on stdio
uv sync reads pyproject.toml + uv.lock and installs everything (mcp, httpx, ccxt) into a project-local .venv/. No system pollution.
Option 2 — pip + venv
git clone https://github.com/ymylive/coin-mcp.git
cd coin-mcp
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e . # editable install, deps resolved fresh
coin-mcp # starts the server on stdio
Option 3 — install directly from GitHub (no clone)
uv tool install git+https://github.com/ymylive/coin-mcp.git
coin-mcp # available on PATH
This puts the coin-mcp console script on your PATH globally without cluttering any project directory. Best for "I just want to point Claude Desktop at it."
Optional: install dev/test extras
If you want to run the test suite or hack on the code:
uv sync --extra dev # adds pytest + pytest-asyncio
uv run pytest # 29 tests, all should pass
Verify the installation
A 5-second sanity check that all tools registered correctly:
uv run python -c "
import asyncio, server
async def main():
tools = await server.mcp.list_tools()
prompts = await server.mcp.list_prompts()
resources = await server.mcp.list_resources()
print(f'{len(tools)} tools / {len(prompts)} prompts / {len(resources)} resources')
asyncio.run(main())
"
# Expected: 49 tools / 8 prompts / 3 resources
CLI help is also one command away:
uv run coin-mcp --help
Common pitfalls
| Symptom | Likely cause / fix |
|---|---|
python3: command not found |
Python 3.10+ not installed. Install via python.org or uv python install 3.12. |
ModuleNotFoundError: mcp |
You're not running inside the project venv. Use uv run … or activate .venv/bin/activate. |
Service unavailable from a restricted location (Binance) |
Geographic block — not a bug. Use OKX, Kraken, Bybit, etc. instead via the exchange_id param. |
HTTP 429 from CoinGecko |
Rate-limited. The cache layer mitigates this; consider setting COINGECKO_API_KEY for higher limits. |
uv: command not found |
Install uv first (see Prerequisites) or use the pip path (Option 2). |
Architecture
┌──────────────────────────────┐
│ LLM / MCP client │
│ Claude · Cursor · custom │
└──────────────┬───────────────┘
│ JSON-RPC over stdio / SSE / HTTP
┌──────────────▼───────────────┐
│ FastMCP server │
│ 49 tools · 8 prompts · 3 │
│ resources · multi-transport│
└──────────────┬───────────────┘
│
┌──────────────────────┼──────────────────────┐
│ │ │
┌────────▼─────────┐ ┌────────▼────────┐ ┌────────▼────────┐
│ HTTP layer │ │ CCXT runtime │ │ Local compute │
│ httpx + tiered │ │ Bounded LRU │ │ Indicators │
│ TTL LRU cache │ │ + per-id RLock │ │ (no I/O) │
│ + auth-aware key │ │ + pre-warm │ │ │
└────────┬─────────┘ └────────┬────────┘ └─────────────────┘
│ │
┌────────────┼──────────────┐ │
▼ ▼ ▼ ▼
CoinGecko DefiLlama DexScreener 100+ exchanges
(Binance, OKX, Coinbase,
Kraken, Bybit, …)
Key design choices:
- One tool per endpoint, with rich AI-facing docstrings. No clever endpoint factories — the docstrings ARE the API contract that the LLM reads to decide which tool to call. Forty-nine docstrings is a feature, not a bug.
{"error": "..."}envelope contract. Every HTTP-backed tool returns either upstream JSON or an error envelope. The cache never caches errors. The LLM never raises.- Path-injection guards on every URL-interpolated parameter. Coin IDs, protocol slugs, addresses are validated against strict regexes before any HTTP call.
- Per-exchange RLock + pre-warmed
load_markets(). Concurrent CCXT calls don't race the lazy markets table. - Auth-aware cache key. Header values for known auth headers are hashed into the cache key — multi-tenant deployments don't leak.
Tool catalog (49)
Aggregated market data — CoinGecko (18)
| Tool | What it does |
|---|---|
get_price |
Current spot price for one or more coins, multi-currency |
get_coin_details |
Full coin metadata: description, links, scores, market data, dev/community stats |
get_market_chart |
Historical price / market cap / volume time series |
get_aggregated_ohlc |
Aggregated OHLC candlesticks across all venues |
get_coin_tickers |
Exchange tickers for a coin, sorted by trust score / volume |
search |
Universal search across coins, exchanges, categories, NFTs |
list_top_coins |
Top coins with full market data, sortable + paginated |
get_trending |
Trending coins / NFTs / categories (last-24h searches) |
get_top_gainers_losers |
Biggest 24h movers (Pro endpoint; falls back to list_top_coins) |
get_global_market |
Total market cap, BTC/ETH dominance, # of active assets |
get_global_defi |
Global DeFi market cap and DeFi-to-ETH ratio |
list_categories |
All coin categories with aggregated market data |
list_exchanges_directory |
Centralized exchanges directory ranked by trust score |
get_exchange_info |
Single-exchange detail: description, links, tickers |
list_derivatives_exchanges |
Derivatives venues by open interest / volume |
list_nfts |
NFT collections sortable by floor / cap / volume |
get_nft_collection |
Single NFT collection detail |
get_companies_holdings |
Public companies holding BTC or ETH |
Real-time per-exchange — CCXT (7)
| Tool | What it does |
|---|---|
list_supported_exchanges |
All 111 CCXT-supported exchange IDs |
get_exchange_markets |
All markets/symbols on a specific exchange |
get_exchange_ticker |
Real-time bid/ask/last/24h on one exchange |
get_orderbook |
Level-2 order book snapshot |
get_recent_trades |
Recent public trades (the tape) |
get_exchange_ohlcv |
OHLCV candles, 1m granularity, per-exchange volume |
get_funding_rate |
Current perpetual-futures funding rate |
Derivatives extensions — CCXT (3)
| Tool | What it does |
|---|---|
get_funding_rate_history |
Time-series funding rates for a perp |
get_open_interest |
Current open interest with fetch_open_interest_history fallback |
compare_funding_rates |
Cross-exchange funding-rate snapshot with max/min/spread |
DeFi-native — DefiLlama (9)
| Tool | What it does |
|---|---|
list_protocols |
All DeFi protocols ranked by TVL, sortable, chain-filterable |
get_protocol_tvl |
Single protocol detail with trimmed TVL history |
list_chains_tvl |
TVL per chain |
get_chain_tvl_history |
Historical TVL for a chain (or total DeFi) |
list_stablecoins |
Top stablecoins by mcap with chain breakdown |
list_yield_pools |
Yield pools filtered by TVL / project / chain / symbol |
list_dex_volumes |
DEX 24h volume rankings |
list_fees_revenue |
Protocols ranked by fees or revenue |
get_token_dex_price |
DefiLlama oracle price for chain:address tokens |
DEX-side — DexScreener (5)
| Tool | What it does |
|---|---|
dex_search |
Search pairs across all chains by token name/symbol/address |
get_dex_token_pairs |
All pairs for a token contract address |
get_dex_pair |
Single pair detail by chain + pair address |
list_latest_dex_tokens |
Newly profiled DexScreener tokens |
list_top_boosted_tokens |
Currently top-boosted (paid promotion) tokens |
Cross-source aggregation (3)
| Tool | What it does |
|---|---|
health_check |
Parallel-ping every data source with latency |
compare_prices |
Same coin's price across CG + multiple CEX + DEX with spread |
get_consolidated_orderbook |
Merged L2 across many exchanges, attributed per-level |
Sentiment (1)
| Tool | What it does |
|---|---|
get_fear_greed_index |
Crypto Fear & Greed Index (0 = extreme fear, 100 = extreme greed) |
Local technical indicators (1)
| Tool | What it does |
|---|---|
compute_indicators |
RSI, MACD, Bollinger, EMA, SMA, ATR, ADX, Stochastic, OBV — pure-Python on supplied OHLCV |
Cache observability (2)
| Tool | What it does |
|---|---|
cache_stats |
Cache entries, hits, misses, hit rate, per-pattern breakdown |
clear_cache |
Drop the in-process HTTP cache |
Prompt templates (8)
Prompts are parameterized workflows the user can pick from a UI; they expand into ready-made multi-step instructions the LLM executes using tools.
| Prompt | What it does |
|---|---|
analyze_coin |
Full coin briefing: identity, price, charts, where it trades |
compare_coins |
Side-by-side comparison across N coins |
technical_analysis |
Fetch OHLCV + run full indicator bundle, summarize trend/momentum/volatility |
scan_funding_arbitrage |
Funding rates across N exchanges, surface spread |
market_overview |
Macro briefing: cap, dominance, sentiment, trending, top movers |
defi_health_check |
TVL by chain + per-protocol view + stablecoin landscape |
find_token_dex |
Search → fall back to DexScreener for new/long-tail tokens |
yield_hunter |
Filter yield pools by TVL / chain / asset, sort by 30-day avg APY |
Resources (3)
Static reference data the client can attach to the LLM's context:
coin-mcp://exchanges/ccxt— JSON list of all CCXT-supported exchange IDscoin-mcp://coins/popular-ids— markdown table mapping common ticker symbols to CoinGecko IDscoin-mcp://chains/dex-supported— markdown list of chain IDs DexScreener accepts
Configuration
All env vars are optional.
| Variable | Default | Effect |
|---|---|---|
COINGECKO_API_KEY |
(unset) | When set, the server uses the Pro endpoint and authenticates requests. Pro keys (prefixed CG-) send x-cg-pro-api-key; otherwise Demo (x-cg-demo-api-key). |
A .env.example is provided. Copy to .env and edit if you have a key.
MCP client integration
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"coin-mcp": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/coin-mcp",
"run",
"coin-mcp"
],
"env": {
"COINGECKO_API_KEY": "your-optional-key"
}
}
}
}
Restart Claude Desktop. The 49 tools, 8 prompts and 3 resources will appear.
Cursor
Cursor's MCP support uses the same JSON shape. Place the snippet in your Cursor settings under mcp.servers. For remote use, run the server with --transport sse or --transport streamable-http and point Cursor at the URL.
Custom client
Any MCP-compatible client works. The server speaks the standard MCP JSON-RPC over your transport of choice.
Transports
# stdio (default, for local IDE / Claude Desktop integration)
coin-mcp
# Server-Sent Events
coin-mcp --transport sse --host 127.0.0.1 --port 8000
# Streamable HTTP (for hosted / remote use)
coin-mcp --transport streamable-http --host 127.0.0.1 --port 8000
# Public bind (with no auth) — REQUIRES explicit flag and prints a stderr WARNING
coin-mcp --transport streamable-http --host 0.0.0.0 --port 8000 --allow-public
There is no built-in authentication. If you bind to a non-loopback host, put a reverse proxy with auth in front (Caddy, nginx, Traefik, Cloudflare Access, etc.) or restrict via firewall. The --allow-public flag is a deliberate footgun guard.
Caching layer
A tiered TTL cache sits transparently behind every HTTP call so the LLM can fan out without burning your CoinGecko quota.
| Endpoint pattern | TTL |
|---|---|
/simple/price |
10 s |
/coins/markets |
60 s |
/market_chart, /ohlc |
60 s |
/tickers |
30 s |
/search/trending |
60 s |
/search |
5 min |
/global |
60 s |
/coins/{id} (details) |
2 min |
/coins/categories |
5 min |
/exchanges/{id} |
10 min |
/exchanges (list) |
30 min |
/derivatives/exchanges |
10 min |
/nfts/{id} |
5 min |
/nfts/list |
30 min |
/companies/public_treasury |
30 min |
api.alternative.me |
10 min |
| default | 30 s |
LRU-bounded at 2,000 entries. Cache key includes the URL, sorted query params, and a sha-256 digest of any auth header values — so two clients with different keys never share a cache entry. Errors are never cached. Hits return a deep copy so callers can mutate without poisoning. Inspect at runtime via the cache_stats MCP tool.
Security model
coin-mcp is data-only — there is no transaction signing, no private-key handling, no on-chain writes. The threat surface is therefore narrow but worth being honest about:
- Path-injection guards on every URL-interpolated parameter (coin IDs, slugs, addresses). Invalid input returns
{"error": "invalid <kind>"}without making the HTTP call. compute_indicatorsrow cap at 5,000 (MAX_OHLCV_ROWS) prevents memory blowups from prompt-injected upstream data.- CCXT exchange cache bounded (LRU 16) so an LLM can't force allocation of all 111 exchanges.
- Network transports refuse non-loopback bind without
--allow-publicand emit a stderr WARNING when the flag is given. - Cache key is auth-aware — auth headers contribute to the key via sha-256 digest. Multi-tenant safe.
- No emoji of stdout in stdio mode — every log goes to stderr, so JSON-RPC framing is never corrupted.
If you find a security issue, please open an issue rather than a PR for non-trivial cases.
Project structure
coin-mcp/
├── server.py # Entrypoint — wires modules together
├── pyproject.toml
├── README.md
├── .env.example
├── .gitignore
├── coin_mcp/
│ ├── core.py # FastMCP instance, helpers, instructions block
│ ├── coingecko.py # 18 CoinGecko tools
│ ├── ccxt_tools.py # 7 CCXT tools
│ ├── derivatives.py # 3 funding/OI tools
│ ├── defillama.py # 9 DefiLlama tools
│ ├── dexscreener.py # 5 DexScreener tools
│ ├── aggregate.py # 3 cross-source tools
│ ├── sentiment.py # 1 Fear & Greed tool
│ ├── indicators.py # 1 local-compute tool
│ ├── cache.py # 2 cache-introspection tools + the cache itself
│ ├── prompts.py # 8 workflow templates
│ ├── resources.py # 3 static-reference resources
│ └── transport.py # CLI for stdio / SSE / streamable-HTTP
└── tests/
├── conftest.py # Autouse cache-clear + mcp_server fixture
├── test_registry.py # Tool count / instructions / prompt-ref sanity
├── test_cache_routing.py # TTL routing table + no-shadowing
├── test_indicators.py # Wilder RSI textbook vector, 5-col fallback, DoS cap
├── test_http_envelope.py # is_error truthy semantics + error not cached
└── test_validators.py # Path-injection rejection (CG/DexScreener)
Testing
uv sync --extra dev
uv run pytest
# 29 passed
The high-ROI tests cover:
- Every registered tool appears in the
instructionstable (LLM discoverability) - Every prompt body references only real tool names and real parameters
- Cache TTL routing for 17 representative URLs
- Cache no-shadowing (
/coins/marketsvs/coins/{id}vs/market_chart) - Wilder RSI matches the textbook 14-close reference vector (~70.46)
- 5-column OHLCV input doesn't crash OBV
compute_indicatorsrejects > 5,000 rowsis_errortruthy semantics- HTTP error responses are not cached
- Path-injection on CoinGecko / DexScreener tools is rejected before any HTTP call
Roadmap
Tracked but not yet built:
- Whale-transaction monitoring (Whale Alert)
- Etherscan / blockchain-explorer-style read-only RPC
- News + social aggregation (CryptoPanic / Santiment)
- Aggregated open-interest history (cross-exchange)
- Optional READ-ONLY signed requests for higher-tier API keys
If you have a specific data source you want integrated, open an issue with the API spec.
License
MIT — see LICENSE for the full text.
Acknowledgments
This project stands on shoulders.
- Model Context Protocol — Anthropic's open standard for AI ↔ tool wiring
- CoinGecko API — the most generous free crypto-data tier on the internet
- CCXT — the unified exchange library that makes 100+ venues feel like one
- DefiLlama — DeFi data infrastructure as a public good
- DexScreener — DEX-side market data with no auth required
- Alternative.me — the Crypto Fear & Greed Index
And all the prior MCP-server projects whose design choices we studied: doggybee/mcp-server-ccxt for the tiered cache pattern, QuantGeekDev/coincap-mcp for showing prompts matter, heurist-network/heurist-mesh-mcp-server for multi-transport precedent, the official CoinGecko MCP for dynamic tool discovery as an idea worth pursuing later.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.