The table separating real components from simulated ones is the most valuable thing here — it means nobody mistakes the wallet balance for an account. That makes it a teaching tool: the market data is genuine enough to reason about, and the transactions cannot cost anything.
An MCP server with two clearly separated halves. Prices, market statistics, historical data and technical analysis come from Coinbase's public API and are real. The wallet, purchases and transaction history are an in-memory simulation for learning, and the README labels each component as real or simulated rather than blurring the two.
- Real market data: `get_spot_price`, `get_historical_prices` over a time range, `get_exchange_rates`, `search_assets`, `get_asset_details`, `get_market_stats` for the last 24 hours and `get_popular_pairs`
- `analyze_price_data` — technical analysis over the fetched series: volatility, trend, support and resistance
- A simulated wallet for practice: `simulate_btc_purchase` converts USD to crypto, `get_virtual_wallet` shows the balance and `get_transaction_history` lists what happened
- A closed demo economy on top of it — `calculate_beer_cost` turns a spending amount into a crypto quantity and `buy_virtual_beer` spends that crypto back, which makes the USD-to-crypto-to-goods loop visible without real funds
- 13 tools in total, 8 market data and 5 transaction
Nothing for the MCP server — Coinbase's public API needs no key. Node.js 18 or higher and npm 9 or higher; from a clone, `npm install` in the workspaces and `npm run build` in `mcp-server`, then point the client at `mcp-server/dist/index.js` with `COINBASE_API_URL` set to `https://api.coinbase.com/v2`. The separate web frontend needs `VITE_OPENAI_API_KEY` for its chat and voice features, but that is not part of the MCP path. Coinbase's public API rate-limits some endpoints at 60 requests per hour.
