MCP server for interacting with the Luno cryptocurrency exchange API, providing tools for account management, market data, trading, and transaction queries
Luno MCP demonstrates solid definition quality with comprehensive tool coverage, consistent naming conventions, and detailed parameter descriptions. All 13 tools are explicitly registered with proper verb_noun naming (get_*, create_, cancel_, list_, convert). Descriptions are well-structured and contextual, averaging ~160 characters and following the 'WHAT/WHEN/WHY' pattern effectively. Most parameters have type definitions and descriptions. However, output schemas are not explicitly visible in the source code, they are generated via a helper function (withOutputSchema[T]()) that is referenced but not shown, creating ambiguity about schema completeness. Error handling is present but generic. The server correctly uses tool annotations (readOnlyHint, destructiveHint, idempotentHint) for all tools. Field naming is consistent and follows Luno API conventions (e.g., account_id, trading pair). Security handling is solid: API credentials injected server-side, write operations gated behind flags.
Cancel a pending buy or sell order by its order ID. Returns the cancelled order's ID and updated status. This is a write operation; requires the --allow-write-operations flag or ALLOW_WRITE_OPERATIONS=true.
Convert funds from one asset to another in your account (e.g. ZAR to XBT or XBT to ZAR) at the best available price. Conversions settle instantly. Returns the order ID and confirmation details. This is a write operation; requires the --allow-write-operations flag or ALLOW_WRITE_OPERATIONS=true.
Place a new buy or sell order on Luno. Specify the trading pair, order type (BID for buy or ASK for sell), volume in the base currency (e.g. XBT), and optional limit price. Returns the new order's ID, status, and details. This is a write operation; requires the --allow-write-operations flag or ALLOW_WRITE_OPERATIONS=true.
Return balances for every account on the authenticated Luno profile, including available, reserved, and unconfirmed amounts per asset. Requires API credentials. Use this to check holdings before placing orders, conversions, or transfers; not for public market data (use get_ticker or get_tickers).
Return OHLCV candlestick data for a trading pair. Each candle contains timestamp (ms), open, high, low, close, and base-currency volume. Public endpoint, no auth required. Use for charts, indicators, or backtesting; not for live order-book state (use get_order_book) or trade-by-trade flow (use list_trades).
Output schemas are referenced but not explicitly visible in provided source code. The withOutputSchema[T]() helper is called but the schema generation logic is not shown, making it impossible to verify output field completeness, proper typing, and field naming conventions for downstream tool chaining.
Parameter descriptions lack explicit constraints for numeric fields. For example, 'get_candles' duration parameter states 'Common values: 60, 300, 900...' but does not declare this as an enum or state 'The Luno API only accepts a fixed set of values.' LLMs may attempt durations outside the supported set, requiring runtime validation.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 68 | 2025-06-18+ | v2 |
| 2026-03-09 | F | 25 | - | v1 |
Return details about Luno's trading pairs, including pair, status, trading unit (e.g. ZAR for XBTZAR), display unit (e.g. XBT), maker fee, taker fee, and decimal places. Public endpoint, no auth required. Use to understand which markets are tradeable and their fees.
Return the top 100 bids and asks for a trading pair, aggregated by price level. Public endpoint, no auth required. Use this to assess available liquidity and likely slippage before sizing an order; use get_ticker for a simple price quote or list_trades for recent execution flow.
Get the latest ticker (last trade price, best bid, best ask, 24h rolling volume) for a single Luno trading pair. Public endpoint, no auth required. Use this for a quick price snapshot of one market; use get_tickers for multiple markets at once, or get_order_book for depth-of-book.
List the latest tickers for all Luno trading pairs, or for a comma-separated subset. Each ticker has last trade price, best bid, best ask, and 24h volume. Public endpoint, no auth required. Use this to survey or compare multiple markets in one call; use get_ticker when you only need a single pair.
Get details of a single transaction by account ID and transaction ID. Returns full details including amount, fees, counterparty, and timestamp.
List all orders (pending, completed, and cancelled) for a trading pair or account. Filter by pair, order status, and limit the number of results. Use to track order history, monitor fills, and spot rejected orders.
List executed trades for a trading pair, starting from a given timestamp. Each trade includes price, volume, side (BUY or SELL), and timestamp. Use to track market execution flow or analyze recent price action.
List all transactions for an account, including deposits, withdrawals, trades, fees, and conversions. Transactions are returned in reverse chronological order (newest first). Use min_row and max_row for pagination.
No explicit dry-run or confirmation pattern for irreversible write operations (create_order, cancel_order, convert). Agents can execute trades and conversions without a pre-execution confirmation step, which is high-risk for financial operations.
Error handling guidance is minimal. The source shows generic error message constants (e.g., ErrAPICredentialsRequired, ErrWriteOperationDisabled) but no evidence of actionable recovery hints (e.g., 'Try get_balances() first if you need account details' or 'Available pairs can be retrieved via get_markets_info()'). Agents receive errors but lack next-step guidance.
No pagination documentation for list tools. list_orders, list_transactions, and list_trades accept optional limit/offset parameters, but descriptions do not specify max values, default limits, or whether results are truncated. Large result sets could exhaust context without explicit guidance.