About coingecko-mcp-server
coingecko-mcp-server provides CoinGecko prices, historical data, trends, and coin profiles for cryptocurrency research. It resolves names or tickers to CoinGecko IDs, which can then be used for price, market, and chart queries.
Key features
- 01Search coins and resolve CoinGecko IDs
- 02Retrieve current prices and market data in batches
- 03List markets by capitalization or volume
- 04Read coin profiles and historical charts
- 05Check trending coins and global market figures
Use cases
- 01Compare current prices and market metrics across coins
- 02Review a coin’s historical price, volume, and capitalization
- 03Track 24-hour trending coins and overall market changes
MCP support
It provides 8 tools, 2 resources, and 1 prompt over MCP, with STDIO and Streamable HTTP transports. Clients can query CoinGecko market data or use the research prompt to chain coin search, profiles, charts, and global figures.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
npx -y @cyanheads/coingecko-mcp-serverCOINGECKO_API_KEYSecretOptional CoinGecko Demo API key. Present → sent as the x-cg-demo-api-key header for the dedicated Demo tier (10k/mo, 100 rpm). Absent → keyless public tier.MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').MCP_TRANSPORT_TYPESelects the HTTP transport.MCP_HTTP_HOSTThe hostname for the HTTP server.MCP_HTTP_PORTThe port to run the HTTP server on.MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.MCP_AUTH_MODESecretAuthentication mode to use: 'none', 'jwt', or 'oauth'.Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.
Tools
8Saved tool list · updated 2w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | Yes | Coin name or ticker symbol to resolve (e.g. "bitcoin", "ETH", "solana"). |
Details
From the project README@cyanheads/coingecko-mcp-server
Market data for 15,000+ cryptocurrencies — prices, history, trends, and deep coin metadata via CoinGecko.
Overview
Cryptocurrency market data from CoinGecko — prices, rankings, historical charts, and deep coin profiles across 15,000+ coins. Resolve a name or ticker to CoinGecko's slug-keyed ID, then chain into price lookups, ranked markets, and trend charts.
Tools
| Tool | Description |
|---|---|
coingecko_search_coins | Resolve a coin name or ticker symbol to a CoinGecko ID (slug). The required first step before any ID-keyed tool. |
coingecko_get_prices | Current prices and core market stats across coin/currency batches. |
coingecko_list_markets | Ranked market table — coins by market cap, volume, or ID, optionally filtered to a category or selected IDs. |
coingecko_get_coin | Deep single-coin profile — description, links, market data, developer activity, community, sentiment. sections trims the large record. |
coingecko_get_market_chart | Historical price, market cap, and volume series. recent (last N days, auto-granularity) or range (explicit Unix-second window) mode. |
coingecko_get_trending | Coins trending on CoinGecko in the last 24 hours, by search volume. |
coingecko_get_global | Global crypto market snapshot — total market cap and volume, BTC/ETH dominance, active counts, ongoing ICOs, 24h change. |
coingecko_list_categories | Coin categories (category_id + display name) — the valid slugs for coingecko_list_markets's category filter. |
Resources
| Resource | Description |
|---|---|
coingecko://coin/{id} | Deep coin record by slug — same data as coingecko_get_coin (full record, USD market figures). |
coingecko://global | Global crypto market snapshot — same data as coingecko_get_global. |
All resource data is also reachable via tools — the resources mirror coingecko_get_coin and coingecko_get_global exactly, so tool-only clients lose nothing. Large collections (markets, categories) are not exposed as resources; use coingecko_list_markets and coingecko_list_categories instead.
Prompts
| Prompt | Description |
|---|---|
coingecko_coin_research | Guides a full single-coin research pass through the search → get_coin → get_market_chart → get_global chain. |
Capability reference
coingecko_search_coins tool
- Tickers are not unique (many coins share
ETH/USDC) — returns ranked candidates withid,symbol,name, andmarketCapRankto disambiguate - Returns the top 25 matches by relevance;
enrichment.truncatedplusshown/capdisclose when the list is capped - An empty result is a normal outcome, not an error —
enrichment.noticesuggests broadening the query
coingecko_get_prices tool
- Accepts up to 500 raw IDs (trimmed, lowercased, deduplicated) and processes the first 250 unique slugs;
skippedIdslists the rest andmissinglists ids that didn't resolve, since an unknown slug returns an empty upstream response rather than an error - One row per
(id, currency)that returned a price; market cap, 24h volume, and 24h change are optional per row. Currencies with no quotes are noted inenrichment.notice lastUpdatedAtUnixSecis Unix seconds —coingecko_get_market_chart's point timestamps are milliseconds- Throws
all_missingwhen no requested id resolves,no_price_datawhen IDs resolve but no requested currency returns a numeric quote
coingecko_list_markets tool
- Sort by market cap, volume, or ID, ascending or descending, via
order; paginate withpageandper_page(default 50, max 250 rows) - Filter by
ids(same 500-raw/250-unique bounds as price batches;appliedIdsandskippedIdsshow the selection) or bycategory(acategoryIdfromcoingecko_list_categories), not both — combining them returnsconflicting_filters - Per-coin fields include price, cap, volume, 1h/24h/7d change, supply, and ATH/ATL;
enrichment.truncatedflags a full page - Throws
unknown_categorywhen CoinGecko returns HTTP 404 for a category-filtered request
coingecko_get_coin tool
- Six sections —
profile,market,links,developer,community,sentiment;sectionstrims the response to just what's needed (the full record is large) - Prices and percentage-change windows use
vs_currency(defaults tousd); missing upstream fields are omitted rather than fabricated profile.categoriesare display names (e.g."Layer 1 (L1)"), distinct from thecategoryIdslugscoingecko_list_categoriesreturns- Throws
coin_not_foundwhen the slug isn't recognized upstream,unsupported_currencywhen the requested market currency isn't a supported one
coingecko_get_market_chart tool
recentmode takes 1–365 days ("max"aliases the 365-day window and emits a notice);rangemode takesfrom/toas Unix secondsintervalselectsauto(upstream default),daily, orhourly, subject to upstream tier/window availability- Pages with
point_offset(default 0) andpoint_limit(default 100, cap 250); per-series totals andnextPointOffsetsupport continuation, and each page refetches upstream data granularityreports the series spacing as5-minute,hourly,daily,irregular, orunknown; point timestamps are Unix milliseconds, whilecoingecko_get_prices'slastUpdatedAtUnixSecis seconds- Throws
invalid_rangeon a mode/parameter mismatch,coin_not_foundwhen the slug isn't recognized
coingecko_get_trending tool
- No parameters — 24-hour trending coins by search volume, each with
marketCapRank,priceUsd,priceBtc, andpriceChangePercentage24hUsdwhen available - Upstream reports market cap and volume as pre-formatted display strings, not numbers — those fields are omitted rather than presented as numeric data
nftCountreports the trending-NFT count upstream also returns; NFT detail itself isn't surfaced
coingecko_get_global tool
- No coin id needed — one call for the macro snapshot
vs_currency(defaultusd) scopes only total market cap and volume; dominance and the 24h change percentages are always USD-denominated upstream- Throws
unsupported_currencywhen the requested currency has no entry in upstream's per-currency maps —/globalhas no upstream currency validation, so an unknown code silently returns no totals - Returns active-cryptocurrency and active-market counts, ongoing ICO count, and a Unix-second snapshot timestamp
coingecko_list_categories tool
- Optional
name_containsfilters by whitespace-separated tokens, case- and punctuation-insensitive; every token must appear in the name enrichment.totalCountreports the full category count before filtering; a filter that matches nothing returnsenrichment.notice- Returned
categoryIdvalues are whatcoingecko_list_markets'scategoryparam expects
coingecko://coin/{id} resource
- Same data as
coingecko_get_coin's full record, always denominated in USD {id}is a CoinGecko slug (e.g."bitcoin") — resolve tickers withcoingecko_search_coins- Throws
coin_not_foundwhen the slug isn't recognized upstream
coingecko://global resource
- Same data as
coingecko_get_global, always denominated in USD - No parameters
coingecko_coin_research prompt
- Argument:
coinrequired — a name, ticker, or CoinGecko slug - Returns an assistant framing message plus a user message that walks the search → get_coin → get_market_chart → get_global chain
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
CoinGecko-specific:
- Type-safe client for the CoinGecko v3 REST API, with one service method per endpoint
- Runs keyless on the public tier; an optional Demo API key (
x-cg-demo-api-key) raises the rate ceiling with no other config change - Retry/backoff for rate limits, transient upstream failures, and timeouts; honors
Retry-After, and permanent refusals fail immediately - Status-specific error reasons with recovery hints, including narrowing the range on historical-window restrictions
Agent-friendly output:
- Search-before-query enforced through descriptions — every ID-keyed tool states slugs-not-tickers and points back to
coingecko_search_coins - Partial reads — price results disclose unresolved IDs and currencies without quotes; enrichment discloses caps and applied filters
- Units made explicit — timestamp fields document seconds vs. milliseconds
- Required CoinGecko attribution ships on every tool and resource output; the research prompt instructs the agent to attribute its findings the same way
Getting started
Add the following to your MCP client configuration file. No API key is required — set COINGECKO_API_KEY only to attach the higher CoinGecko Demo tier (see Configuration).
{
"mcpServers": {
"coingecko-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/coingecko-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"coingecko-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/coingecko-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"coingecko-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/coingecko-mcp-server:latest"
]
}
}
}
To attach a CoinGecko Demo key, add "COINGECKO_API_KEY": "your-demo-key" to the env block (or -e COINGECKO_API_KEY=your-demo-key for Docker).
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
Prerequisites
- Bun v1.4.0 or higher (or Node.js v24+).
- No account or API key required to run. Optionally, a free CoinGecko Demo API key for a higher rate ceiling (10k calls/month, 100 req/min) over the shared keyless public pool.
Installation
- Clone the repository:
git clone https://github.com/cyanheads/coingecko-mcp-server.git
- Navigate into the directory:
cd coingecko-mcp-server
- Install dependencies:
bun install
- Configure environment (optional):
cp .env.example .env
# the server runs with no .env at all; edit only to set COINGECKO_API_KEY
Configuration
The server runs with zero configuration. The one server-specific variable is optional:
| Variable | Description | Default |
|---|---|---|
COINGECKO_API_KEY | Optional CoinGecko Demo API key, sent as the x-cg-demo-api-key header (10k/mo, 100 req/min). Absent → keyless public tier. | — |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for the HTTP server. | 3010 |
MCP_HTTP_ENDPOINT_PATH | HTTP endpoint path. | /mcp |
MCP_SESSION_MODE | HTTP session mode: stateless, stateful, or auto. | stateless |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (RFC 5424). | info |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry instrumentation (spans, metrics, completion logs). | false |
See .env.example for the full list of optional overrides.
Rate limits and freshness. The keyless public tier shares an IP-throttled pool, so bursty multi-tool workflows can hit 429s under light load; the server backs off and retries, but cannot raise the ceiling — a free Demo key does. CoinGecko data refreshes roughly every 60 seconds and is not tick-level.
Running the server
Local development
-
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
Run checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t coingecko-mcp-server .
docker run --rm -e MCP_TRANSPORT_TYPE=http -p 3010:3010 coingecko-mcp-server
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/coingecko-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools/resources/prompts and inits the CoinGecko service. |
src/config | Server-specific environment variable parsing and validation with Zod. |
src/mcp-server/tools | Tool definitions (*.tool.ts). |
src/mcp-server/resources | Resource definitions (*.resource.ts). |
src/mcp-server/prompts | Prompt definitions (*.prompt.ts). |
src/services/coingecko | CoinGecko v3 REST API service — HTTP client, retry/error mapping, response normalization, domain types. |
tests/ | Unit and integration tests mirroring src/. |
Development guide
See CLAUDE.md/AGENTS.md for development guidelines and architectural rules. The short version:
- Handlers throw, framework catches — no
try/catchin tool logic - Use
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storage - Register new tools and resources via the
createApp()arrays insrc/index.ts - Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
License
Apache-2.0 — see LICENSE for details.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.