Skip to main content
Glama
ymylive
by ymylive

get_exchange_ticker

Retrieve real-time bid, ask, last price, and 24h stats for any symbol on a specific exchange. Solves the need for venue-specific price and spread data by providing ticker details for a given exchange and trading pair.

Instructions

Get a real-time ticker (bid/ask/last/24h stats) for one symbol on one exchange.

Use when the user asks about price on a specific venue ("BTC on Coinbase", "ETH on Binance") or wants tight bid-ask spread info.

Args: exchange_id: CCXT exchange ID, e.g. "binance". symbol: CCXT unified symbol, e.g. "BTC/USDT", "ETH/USD", "BTC/USDT:USDT" for a linear perp on Binance.

Returns: Ticker object with symbol, timestamp, datetime, bid, ask, last, high, low, open, close, vwap, baseVolume, quoteVolume, percentage, change.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
exchange_idYes
symbolYes

Implementation Reference

  • The core handler function for the 'get_exchange_ticker' tool. It is an async function decorated with @mcp.tool(), takes exchange_id and symbol as parameters, and calls CCXT's fetch_ticker(symbol) via the _ccxt_call helper to get real-time bid/ask/last/24h stats.
    @mcp.tool()
    async def get_exchange_ticker(exchange_id: str, symbol: str) -> Any:
        """Get a real-time ticker (bid/ask/last/24h stats) for one symbol on one exchange.
    
        Use when the user asks about price on a specific venue ("BTC on Coinbase",
        "ETH on Binance") or wants tight bid-ask spread info.
    
        Args:
            exchange_id: CCXT exchange ID, e.g. "binance".
            symbol: CCXT unified symbol, e.g. "BTC/USDT", "ETH/USD",
                "BTC/USDT:USDT" for a linear perp on Binance.
    
        Returns:
            Ticker object with `symbol`, `timestamp`, `datetime`, `bid`, `ask`,
            `last`, `high`, `low`, `open`, `close`, `vwap`, `baseVolume`,
            `quoteVolume`, `percentage`, `change`.
        """
        def _do() -> Any:
            ex = _get_ccxt_exchange(exchange_id)
            return ex.fetch_ticker(symbol)
    
        return await _ccxt_call(_do)
  • The FastMCP server instance is created here (line 58). The @mcp.tool() decorator on line 67 of ccxt_tools.py registers the handler with this mcp instance. The instructions table on line 104 documents the tool.
    mcp = FastMCP(
        name="coin-mcp",
        instructions="""\
    This MCP server provides comprehensive cryptocurrency market data from
    multiple complementary sources:
    
    - **CoinGecko** — aggregated market data (volume-weighted prices, market cap,
      OHLC, history, exchange directory, NFTs, categories, derivatives directory,
      public-company crypto treasuries, trending searches, search index).
    - **CCXT** — real-time per-exchange data via a unified API for 100+ centralized
      exchanges (order books, recent trades, tickers, OHLCV candles, market lists,
      perpetual-futures funding rates).
    - **DefiLlama** — protocol-level TVL, chain TVL, stablecoin caps, yield pools,
      DEX volumes, fees & revenue, oracle token prices.
    - **DexScreener** — DEX-side prices and liquidity for tokens too small or new
      for CoinGecko aggregation, across all major chains.
    - **Alternative.me** — Crypto Fear & Greed Index sentiment indicator.
    - **Local technical indicators** — RSI, MACD, Bollinger, EMA/SMA, ATR
      computed in-process from any OHLCV input.
    
    ================================================================
    HOW TO PICK THE RIGHT TOOL  (43 tools total)
    ================================================================
    
    | Question | Tool |
    |----------|------|
    | What's BTC's price right now? | get_price |
    | Tell me about Solana | get_coin_details |
    | 30-day price/volume/market-cap chart | get_market_chart |
    | Daily candlesticks for ETH (aggregated) | get_aggregated_ohlc |
    | Which exchanges support a coin? | get_coin_tickers |
    | Coin name -> CoinGecko ID (also exchanges/categories/NFTs) | search |
    | Top 100 coins by market cap | list_top_coins |
    | What's hot/trending today? | get_trending |
    | Biggest 24h gainers and losers | get_top_gainers_losers |
    | Total market cap, BTC dominance | get_global_market |
    | DeFi TVL totals (high level, CoinGecko view) | get_global_defi |
    | Categories (Layer 1, DeFi, Meme...) | list_categories |
    | Browse all exchanges (CoinGecko directory) | list_exchanges_directory |
    | Single-exchange metadata (CoinGecko directory) | get_exchange_info |
    | Derivatives platforms | list_derivatives_exchanges |
    | NFT collections list | list_nfts |
    | Single NFT collection detail | get_nft_collection |
    | Public companies holding BTC/ETH | get_companies_holdings |
    | What exchanges can I query in real time? | list_supported_exchanges |
    | All trading pairs on Binance/etc. | get_exchange_markets |
    | Best bid/ask/last on a specific exchange | get_exchange_ticker |
    | Real-time order book on a specific exchange | get_orderbook |
    | Recent public trades on a specific exchange | get_recent_trades |
    | 1-minute candles on Binance for BTC/USDT | get_exchange_ohlcv |
    | Funding rate for a perp | get_funding_rate |
    | Sentiment: fearful or greedy? | get_fear_greed_index |
    | Compute RSI/MACD/Bollinger/ATR/etc on OHLCV | compute_indicators |
    | Per-protocol TVL / TVL history | get_protocol_tvl |
    | Browse DefiLlama protocols by TVL | list_protocols |
    | Chain-level TVL ranking (Ethereum, Solana, ...) | list_chains_tvl |
    | Historical TVL for one chain or all of DeFi | get_chain_tvl_history |
    | Stablecoin caps and chain breakdown | list_stablecoins |
    | Yield-pool APYs | list_yield_pools |
    | DEX 24h volume rankings | list_dex_volumes |
    | Per-protocol fees and revenue | list_fees_revenue |
    | DefiLlama oracle price for `chain:address` tokens | get_token_dex_price |
    | DEX price for a small/new token (any chain) | dex_search |
    | All DEX pairs for a given token address | get_dex_token_pairs |
    | Single DEX pair detail | get_dex_pair |
    | Newly profiled DEX tokens | list_latest_dex_tokens |
    | Currently boosted (paid) DEX tokens | list_top_boosted_tokens |
    | What's currently cached (rate-limit relief) | cache_stats |
    | Drop the HTTP cache | clear_cache |
    | Funding-rate time series for a perp | get_funding_rate_history |
    | Current open interest for a perp | get_open_interest |
    | Compare funding rates across exchanges | compare_funding_rates |
    | Are all data sources healthy / fast? | health_check |
    | Same coin's price across CG + multiple CEX + DEX | compare_prices |
    | Best bid/ask merged across many exchanges | get_consolidated_orderbook |
    
    ================================================================
    KEY THINGS TO REMEMBER
    ================================================================
    
    1. **CoinGecko uses coin IDs**, not ticker symbols. IDs look like "bitcoin",
       "ethereum", "solana". Resolve unknown names via `search` first.
    
    2. **CCXT uses unified symbols + exchange IDs.** Symbols: "BTC/USDT", "ETH/USD".
       Linear perps use settle suffix: "BTC/USDT:USDT". Exchange IDs are lowercase
       ("binance", "okx", "coinbase", "kraken", "bybit", "kucoin").
    
    3. **Aggregated vs per-exchange.** CoinGecko = volume-weighted across all
       venues. CCXT = one specific exchange. Use CoinGecko for "the market";
       use CCXT for venue-specific or sub-hour granularity.
    
    4. **DEX vs CEX prices.** For tokens listed on CoinGecko, prefer CoinGecko/
       CCXT. For new/long-tail tokens, use DexScreener (`dex_search`,
       `get_dex_token_pairs`, `get_dex_pair`) or DefiLlama (`get_token_dex_price`).
    
    5. **Default vs_currency is "usd"**. CCXT symbols already encode quote currency.
    
    6. **Rate limits.** CoinGecko public allows ~30 req/min — but this server
       caches responses with TTLs tuned per endpoint. Repeated identical calls
       come from cache; check `cache_stats` if surprised by stale data, and
       `clear_cache` to force-refresh everything.
    
    7. **Time ranges.** `get_market_chart` and `get_aggregated_ohlc` accept a
       `days` parameter. CoinGecko auto-selects granularity: minute when days<=1,
       hourly when days<=90, daily otherwise.
    
    8. **Presentation.** Tools return raw numbers. Format prices/percentages/
       timestamps appropriately when answering the user.
    
    ================================================================
    NAMING & VALIDATION CONVENTIONS
    ================================================================
    
    - Coin / exchange / NFT IDs must match `^[a-z0-9._-]+$` (lowercase slugs).
    - Token addresses are either EVM (`0x` followed by 40 hex chars) or Solana
      base58 (32-44 chars). Tools validate the shape before sending requests.
    - Tools never run network requests until validation passes — invalid input
      returns a `{"error": ...}` envelope synchronously.
    - Tools may return `{"error": ...}` envelopes on upstream failure. Callers
      should check the result with the structured-error helper before assuming
      success and indexing into other fields.
    """,
    )
  • Imports and module dependencies for the CCXT tools module. Imports ccxt for exchange data, and imports _ccxt_call and _get_ccxt_exchange from .core as shared helpers used by get_exchange_ticker.
    """CCXT tools — real-time per-exchange data: tickers, order books, trades, OHLCV, funding rates."""
    from __future__ import annotations
    
    from typing import Any, Literal
    
    import ccxt
    
    from .core import _ccxt_call, _get_ccxt_exchange, mcp
  • The _ccxt_call helper that runs blocking CCXT calls in a thread executor. It handles error wrapping and per-exchange serialization via locks. Used by get_exchange_ticker to safely invoke ex.fetch_ticker(symbol).
    async def _ccxt_call(fn, *args, exchange_id: str | None = None, **kwargs):
        """Run a blocking CCXT call in a thread; return structured error on failure.
    
        When `exchange_id` is supplied, the call is serialized through the
        per-exchange lock so concurrent fetches against the same instance don't
        corrupt CCXT's internal session/rate-limit state. When omitted (legacy
        callers), no lock is taken — preserving prior behavior.
        """
        loop = asyncio.get_running_loop()
    
        def _runner():
            if exchange_id:
                with _per_lock(exchange_id):
                    return fn(*args, **kwargs)
            return fn(*args, **kwargs)
    
        try:
            return await loop.run_in_executor(None, _runner)
        except ccxt.BaseError as e:
            return {"error": f"{type(e).__name__}: {e}"}
        except Exception as e:  # pragma: no cover - safety net
            return {"error": f"unexpected error: {type(e).__name__}: {e}"}
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. While it mentions 'real-time' and the return fields, it lacks disclosure of behavioral traits such as rate limits, data source reliability, authentication requirements, or what happens if the exchange is unavailable. This is insufficient for an unannotated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: a single-sentence purpose, followed by a usage guideline, then parameter details, and a returns list. Every sentence provides essential information with no redundancy or filler. Well-structured and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool simplicity (2 parameters, no output schema), the description is complete: purpose, usage, parameter semantics, and return fields are all covered. The return fields list compensates for the lack of output schema, and the context signals indicate no nested objects or enums, so no additional explanation is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds crucial semantic information for both parameters: 'exchange_id' is explained as a CCXT ID with an example, and 'symbol' is described as a CCXT unified symbol with multiple examples including linear perpetual formats. This far exceeds the minimal schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'get', the resource 'real-time ticker', and specifies the scope 'one symbol on one exchange'. It distinguishes from siblings by mentioning 'specific venue' and giving examples like 'BTC on Coinbase', which helps the agent select this tool over aggregated or multi-exchange alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides usage context: 'Use when the user asks about price on a specific venue' and includes examples. However, it does not explicitly mention when not to use the tool or list alternative siblings, though the guidance is clear and sufficient for most cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ymylive/coin-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server