使用说明
加密货币市场数据MCP服务器
一个生产就绪的Python MCP(模型上下文协议)服务器,用于使用CCXT库从主要交易所检索实时和历史加密货币市场数据。 现在有了现代的Flask网络界面!
特性
- 实时价格数据:获取当前价格、买卖价差和24小时统计数据
- 历史OHLCV数据:使用可定制的时间范围(1m到1m)获取烛台数据
- 多交换支持:与币安、Coinbase、Kraken、Bybit和OKX合作
- 订单簿和交易:访问当前订单簿和最近的交易历史
- 市场信息:浏览可用的交易对和交易所信息
- 现代Web界面:基于Flask的漂亮仪表板,可可视化所有数据
- 智能高速缓存:使用基于TTL的缓存减少API调用(实时30秒,历史5分钟)
- 稳健的错误处理:网络故障恢复、速率限制管理和优雅降级
- 综合测试:单元和集成测试的测试覆盖率超过80%
安装和设置
需求
- Python 3.8或更高版本
- pip包管理器
安装步骤
- 创建并激活虚拟环境:
python -m venv venv
.\venv\Scripts\Activate.ps1
- 安装依赖项:
pip install -r requirements.txt
- 在开发模式下安装软件包:
pip install -e .
用法
选项1:Flask Web界面(推荐)
运行Flask web应用程序:
python app.py
然后打开浏览器并导航到:
http://127.0.0.1:5000
Web界面中可用的功能:
- 📊 主要加密货币的快速价格仪表板
- 🔍 24小时详细统计的符号查找
- 📈 历史烛台数据可视化
- 📖 带有买卖价差的实时订单簿
- 💱 最近的交易流具有自动刷新功能
- 🏪 浏览所有可用的交易对
- 🔄 在交易所之间切换(币安、Coinbase、Kraken等)
- ⚡ 具有自动刷新选项的实时更新
选项2:MCP服务器
直接运行MCP服务器:
python -m src
选项3:演示客户端
运行命令行演示客户端:
python demo_client.py
从以下选项中选择:
- 快速价格查询(5种主要硬币)
- 全功能演示(全部8个工具)
- 两者
API终点(烧瓶)
Flask应用程序提供RESTful API端点:
| 端点 | 方法 | 描述 |
|---|---|---|
/ |
GET | 主仪表板(HTML) |
/api/price/<symbol> |
GET | 获取当前价格 |
/api/historical/<symbol> |
GET | 获取历史OHLCV数据 |
/api/ticker/<symbol> |
GET | 获取24小时股票行情统计信息 |
/api/orderbook/<symbol> |
GET | 获取订单簿 |
/api/trades/<symbol> |
GET | 获取最近的交易 |
/api/markets |
获取 | 获取市场信息 |
/api/exchanges |
GET | 列出支持的交易所 |
/api/exchange-status/<exchange> |
GET | 检查交换状态 |
查询参数:
exchange:Exchange名称(默认值:binance)timeframe:蜡烛时间框架(用于历史数据)limit:要获取的结果数
API调用示例:
curl "http://127.0.0.1:5000/api/price/BTC/USDT?exchange=binance"
测试
运行所有测试:
pytest
运行覆盖率报告:
pytest --cov=src --cov-report=html --cov-report=term
运行特定测试文件:
pytest tests/test_server.py -v
测试覆盖率
测试套件包括:
- 单元测试:使用模拟依赖关系进行单个功能测试
- 集成测试:端到端流量测试
- 边缘情况:无效输入、网络故障、速率限制
- 覆盖:所有模块80%以上
架构概述
设计决策
CCXT库:因其全面的交易所支持、100多个交易所的统一API和强大的错误处理而被选中。
Flask Web框架:简单、轻量级的框架,非常适合构建RESTful API和提供web界面。易于扩展和维护。
缓存策略:
- 实时数据(价格、交易):5-30秒TTL,以平衡新鲜度和API限制
- 历史数据:5分钟TTL,因为历史数据更改频率较低
- 市场信息:5分钟TTL,因为可用配对不经常更改
- 使用基于TTL的过期使用简单的内存缓存实现
现代UI设计:
- 深色主题搭配渐变色调,减轻眼部疲劳
- 适用于所有屏幕尺寸的响应式网格布局
- 使用AJAX进行实时更新,实现无缝体验
- 颜色编码的买入/卖出指标,用于快速视觉分析
项目结构
crypto_mcp_server/
├── app.py # Flask web application
├── demo_client.py # Command-line demo client
├── setup.py # Package configuration
├── requirements.txt # Python dependencies
├── README.md # This file
├── .gitignore # Git ignore patterns
├── src/
│ ├── __init__.py # Package initialization
│ ├── __main__.py # MCP server entry point
│ ├── server.py # MCP server and tool definitions
│ ├── exchange_client.py # CCXT wrapper and exchange logic
│ ├── cache.py # Caching utilities
│ └── utils.py # Helper functions and validation
├── templates/
│ └── index.html # Flask web interface template
├── static/
│ ├── style.css # CSS styling
│ └── script.js # JavaScript for interactivity
└── tests/
├── __init__.py # Test package initialization
├── conftest.py # Pytest fixtures
├── test_server.py # Server tool tests
├── test_exchange_client.py # Exchange client tests
├── test_cache.py # Caching tests
└── test_utils.py # Utility function tests
MCP工具参考
| 工具 | 描述 | 缓存TTL |
|---|---|---|
get_current_price |
实时价格和24小时统计 | 30秒 |
get_historical_data |
OHLCV烛台数据 | 5分钟 |
get_market_info |
可用交易对 | 5分钟 |
get_ticker_24h |
24小时综合统计 | 30s |
get_order_book |
当前出价和要价 | 10s |
get_recent_trades |
最近的交易历史 | 5s |
list_supported_exchanges |
可用交换 | 无缓存 |
check_exchange_status |
Exchange运行状况检查 | 无缓存 |
假设与限制
假设
- API费率限制:缓存策略假定标准汇率限制(币安为1200 req/min)
- 网络可靠性:实现了基本重试逻辑;假设网络总体稳定
- 数据新鲜度:用于实时数据的30秒缓存平衡了新鲜度和性能
- 现货市场:主要关注现货交易对(非期货/衍生品)
局限性
- 交易所覆盖范围:仅限于5个主要交易所(易于扩展)
- 认证:没有专用API端点(仅公开市场数据)
- 速率限制:基本费率限额处理;没有复杂的节流
- 持久性:仅限内存缓存;重启时数据丢失
- 并发:单线程缓存;可能需要锁来实现高并发
支持的交易所
- 币安(默认)
- Coinbase
- 海妖
- Bybit
- 欧易
数据新鲜度权衡
- 实时价格缓存30秒(新鲜度和API限制之间的平衡)
- 历史数据缓存5分钟(历史数据很少更改)
- 订单簿缓存10秒(反映快速的市场变化)
- 最近交易缓存5秒(时间最敏感的数据)
截图
web界面功能:
- 黑暗现代主题:渐变色调,易于入眼
- 响应式设计:适用于台式机、平板电脑和移动设备
- 实时更新:具有自动刷新功能的实时价格卡
- 交互式图表:历史数据可视化
- 订单簿可视化:并排出价/要价显示
- 贸易流:颜色编码的买入/卖出指标
- 市场浏览器:浏览所有可用的交易对
许可证
本项目按原样提供,用于教育和示范目的。
贡献
这是一个示范项目。对于生产使用,请考虑:
- 为私有端点添加身份验证
- 实现Redis分布式缓存
- 为实时流媒体添加WebSocket支持
- 加强限速处理
- 使用Chart.js或D3.js添加更复杂的图表
