返回市场
币安-MCP

币安-MCP

作者:tienan92it15 星标更新:2025-07-04

项目介绍

Binance MCP Server

这是一个通过Model Context Protocol (MCP)协议暴露Binance加密货币交易所数据给大型语言模型(LLM)代理的服务器。该服务器允许LLMs通过标准化接口访问Binance的实时和历史市场数据。

特性

  • 实时价格数据:获取Binance上任何交易对的当前价格
  • 订单簿访问:检索显示不同价格水平上的买卖兴趣的订单簿快照
  • 历史价格数据:获取任意时间段的OHLCV(开盘、最高、最低、收盘、成交量)蜡烛图数据
  • 实时WebSocket流:通过WebSocket订阅实时交易、行情和订单簿更新
  • 全面市场数据:访问交易记录、24小时统计数据、聚合交易、滚动窗口数据等
  • 交易所信息:访问交易规则、符号信息和费用结构
  • 只读操作:所有数据均通过Binance的公共REST API获取(无需API密钥)
  • 符合MCP标准:与任何兼容MCP的LLM客户端配合使用

要求

  • Python 3.8+
  • 包含CLI工具的mcp包 (mcp[cli])
  • 用于REST API的requests
  • 用于WebSocket流的websockets
  • 可选的uvicorn用于服务

安装

  1. 克隆此仓库:
git clone https://github.com/yourusername/binance_mcp_server.git
cd binance_mcp_server
  1. 安装依赖项:
pip install -r requirements.txt

使用方法

直接运行服务器

要以独立模式运行服务器:

python run_server.py

这将启动MCP服务器,监听通过STDIO的连接。

开发模式与MCP Inspector

对于开发和测试,使用MCP Inspector:

mcp dev run_server.py

这将打开MCP Inspector界面,在这里你可以交互式地测试服务器的工具。

在Claude Desktop中安装

要在Claude Desktop中使用此服务器:

  1. 如果尚未安装,请安装MCP CLI工具:
pip install "mcp[cli]"
  1. 在Claude Desktop中安装服务器:
mcp install run_server.py
  1. 现在你可以在Claude Desktop的对话中直接访问Binance数据。

示例客户端

提供了一个示例客户端脚本,演示程序化用法:

python example_client.py

此脚本连接到服务器并检索各种类型的市场数据。

可用工具

连接性和基本信息

  • ping_binance():测试与Binance API服务器的连接

    • 示例:ping_binance()
  • get_server_time():从Binance获取当前服务器时间

    • 示例:get_server_time()

市场数据

  • get_price(symbol):获取交易对的当前价格

    • 示例:get_price(symbol="BTCUSDT")
  • get_order_book(symbol, depth=10):获取当前订单簿

    • 示例:get_order_book(symbol="ETHUSDT", depth=5)
  • get_historical_prices(symbol, interval="1d", limit=100):获取历史OHLCV数据

    • 示例:get_historical_prices(symbol="BTCUSDT", interval="1h", limit=24)
    • 有效间隔:"1m", "3m", "5m", "15m", "30m", "1h", "2h", "4h", "6h", "8h", "12h", "1d", "3d", "1w", "1M"
  • get_ui_klines(symbol, interval="1d", limit=100):获取UI优化的蜡烛图数据

    • 示例:get_ui_klines(symbol="BTCUSDT", interval="1h", limit=24)
  • get_recent_trades(symbol, limit=20):获取某个符号的最新交易

    • 示例:get_recent_trades(symbol="BTCUSDT", limit=50)
  • get_historical_trades(symbol, limit=20, from_id=None):获取某个符号的旧交易

    • 示例:get_historical_trades(symbol="BTCUSDT", limit=100, from_id=12345)
  • get_aggregate_trades(symbol, limit=20):获取压缩/聚合交易

    • 示例:get_aggregate_trades(symbol="ETHUSDT", limit=30)
  • get_24hr_ticker(symbol):获取24小时价格变化统计

    • 示例:get_24hr_ticker(symbol="BNBUSDT")
  • get_all_24hr_tickers():获取所有符号的24小时统计

    • 示例:get_all_24hr_tickers()
  • get_trading_day_ticker(symbol, type="FULL"):获取交易日价格变化统计

    • 示例:get_trading_day_ticker(symbol="BTCUSDT", type="FULL")
  • get_all_trading_day_tickers(type="FULL"):获取所有符号的交易日统计

    • 示例:get_all_trading_day_tickers(type="MINI")
  • get_rolling_window_ticker(symbol, window_size="1d", type="FULL"):获取滚动窗口价格统计

    • 示例:get_rolling_window_ticker(symbol="BTCUSDT", window_size="4h")
  • get_all_rolling_window_tickers(window_size="1d", type="FULL"):获取所有符号的滚动窗口统计

    • 示例:get_all_rolling_window_tickers(window_size="4h", type="MINI")
  • get_average_price(symbol):获取当前平均价格(5分钟加权平均)

    • 示例:get_average_price(symbol="BTCUSDT")
  • get_book_ticker(symbol):获取最佳买入/卖出价格和数量

    • 示例:get_book_ticker(symbol="ETHBTC")
  • get_all_book_tickers():获取所有符号的最佳买入/卖出

    • 示例:get_all_book_tickers()

市场信息

  • get_exchange_info():获取包括交易规则和符号列表在内的综合交易所信息

  • get_trading_fees():获取默认交易费率(注意:为了演示目的,返回默认公共费用)

WebSocket流

  • subscribe_to_trade_stream(symbol):订阅实时交易事件

    • 示例:subscribe_to_trade_stream(symbol="BTCUSDT")
  • subscribe_to_kline_stream(symbol, interval="1m"):订阅蜡烛图/k线更新

    • 示例:subscribe_to_kline_stream(symbol="BTCUSDT", interval="5m")
  • subscribe_to_ticker_stream(symbol):订阅24小时行情更新

    • 示例:subscribe_to_ticker_stream(symbol="ETHUSDT")
  • subscribe_to_book_ticker_stream(symbol):订阅最佳买入/卖出更新

    • 示例:subscribe_to_book_ticker_stream(symbol="BNBUSDT")
  • subscribe_to_depth_stream(symbol, levels=10):订阅订单簿更新

    • 示例:subscribe_to_depth_stream(symbol="BTCUSDT", levels=5)
  • list_active_subscriptions():列出所有活动的WebSocket订阅

    • 示例:list_active_subscriptions()
  • get_latest_stream_data(stream_name):获取流的最新数据

    • 示例:get_latest_stream_data(stream_name="btcusdt@trade")
  • unsubscribe_from_stream(stream_name):取消订阅流

    • 示例:unsubscribe_from_stream(stream_name="btcusdt@kline_1m")
  • cleanup_all_streams():关闭所有WebSocket连接并清理资源

    • 示例:cleanup_all_streams()

项目结构

binance_mcp_server/
├── binance_api.py       # 核心REST API交互模块
├── binance_ws_api.py    # WebSocket连接管理
├── commands/            # MCP命令定义
│   ├── __init__.py
│   ├── market_data.py   # 价格/订单簿/历史数据命令
│   ├── market_info.py   # 交易所信息和元数据命令
│   └── websocket_streams.py  # WebSocket流命令
└── server.py            # 主MCP服务器设置和初始化

示例

基本连接

# 检查是否可以到达Binance API
is_connected = ping_binance()

# 获取当前服务器时间(自纪元以来的毫秒数)
server_time = get_server_time()

获取当前市场数据

# 获取比特币的当前价格
btc_price = get_price(symbol="BTCUSDT")

# 获取详细的24小时统计数据
btc_stats = get_24hr_ticker(symbol="BTCUSDT")
print(f"BTC价格变化: {btc_stats['priceChangePercent']}%")
print(f"BTC 24小时成交量: {btc_stats['volume']} BTC")

# 获取滚动窗口统计(4小时窗口)
btc_4h_stats = get_rolling_window_ticker(symbol="BTCUSDT", window_size="4h")
print(f"BTC 4小时价格变化: {btc_4h_stats['priceChangePercent']}%")

使用WebSocket流

# 订阅实时交易更新
trade_sub = subscribe_to_trade_stream(symbol="BTCUSDT")

# 一段时间后,获取最新的交易数据
latest_trade = get_latest_stream_data(stream_name="btcusdt@trade")
print(f"最新交易价格: {latest_trade['data']['p']}")

# 订阅图表数据的蜡烛图更新
kline_sub = subscribe_to_kline_stream(symbol="ETHUSDT", interval="5m")

# 完成后清理
unsubscribe_from_stream(stream_name="btcusdt@trade")
unsubscribe_from_stream(stream_name="ethusdt@kline_5m")

实现状态

有关已实现和计划的API端点的详细概述,请参阅API实现状态文档。

扩展服务器

添加新工具

要添加新工具,在Binance API模块中创建适当的功能,然后作为MCP工具注册到一个命令模块中。

支持私有API端点

要支持认证API调用:

  1. 修改binance_api.py以包含身份验证
  2. 创建额外的命令模块进行交易操作
  3. server.py中注册新的命令

故障排除

  • 连接问题:确保服务器正在运行后再尝试连接客户端
  • 速率限制:Binance可能会对过度的API调用进行速率限制;考虑在高流量部署中实现缓存
  • WebSocket稳定性:WebSocket连接可能在24小时后断开(Binance限制);服务器将自动尝试重新连接
  • 数据格式:不同的符号或间隔可能返回略有不同的数据格式

许可证

本项目根据MIT许可证发布 - 详情见LICENSE文件。

致谢

  • Binance提供了全面的公共API
  • MCP项目标准化了LLM工具交互