使用说明
MCP服务器
一个紧凑的FastAPI微服务,公开市场数据端点(股票代码、OHLCV、订单簿、交易),由可插拔的 MarketService 以及异步Redis缓存。
它使用可插拔 MarketService 后端(包括ccxt适配器)和用于短期缓存的异步Redis缓存。
本自述文件记录了项目结构、如何在本地设置和运行、配置环境变量、API详细信息、模式类型、测试、已知兼容性说明以及开发过程中所做的假设。
目标和方法
- 在市场数据服务之上提供精简的HTTP API(
MarketService)因此,客户可以请求股票行情、OHLCV、订单簿和最近的交易。 - 保持HTTP层最小化:端点仅支持GET,并将请求转发到服务层,在服务错误时返回502。
- 使用异步Redis客户端(
redis.asyncio)缓存响应并在工作进程之间共享状态。 - 使用
ccxt作为从交易所获取市场数据的适配器;适配器被包裹在app/adapters/ccxt_adapter.py并被使用app/services/market_service.py.
快速摘要
- 基本URL(dev):http://localhost:8000
- API前缀:
/api/v1 - 主要特点:
- 调用异步的FastAPI端点
MarketService(ccxt适配器) - 异步Redis缓存(
redis.asyncio)inapp/cache/redis_cache.py - Pydantic模式
app/schemas.py用于验证和文档
- 调用异步的FastAPI端点
存储库布局
mcp_server/
├─ app/
│ ├─ api/v1/endpoints.py # FastAPI routes (mounted at /api/v1)
│ ├─ cache/redis_cache.py # async redis helper (init/get/set/close)
│ ├─ services/market_service.py # business logic, caching orchestration
│ ├─ adapters/ccxt_adapter.py # ccxt wrapper to fetch exchange data
│ ├─ config.py # pydantic settings and env defaults
│ ├─ schemas.py # Pydantic response/request schemas
│ └─ main.py # FastAPI app, startup/shutdown hooks
├─ requirements.txt
├─ run_server.sh # convenience script to start uvicorn
├─ Dockerfile
├─ docker-compose.yml
└─ tests/unit/ # unit tests
API端点
所有端点都是GET,并挂载在 /api/v1.
-
获取
/--健康检查。退货:{ "status": "ok" }. -
获取
/api/v1/ticker- 查询参数:
symbol(必填,例如。BTC/USDT),exchange(可选,例如。binance) - 返回该交易品种的股票代码对象(请参见
app/schemas.py->TickerModel).
- 查询参数:
-
获取
/api/v1/ohlcv- 查询参数:
symbol(必填),exchange(可选),timeframe(默认值1m),since(可选,ms epoch),limit(默认值为100) - 返回OHLCV列表(参见
OHLCVModel).
- 查询参数:
-
获取
/api/v1/orderbook- 查询参数:
symbol(必填),exchange(可选),limit(默认值50) - 退货订单簿(请参阅
OrderBookModel).
- 查询参数:
-
获取
/api/v1/trades- 查询参数:
symbol(必填),exchange(可选),limit(默认值50) - 返回最近的交易(请参阅
TradeModel/TradesModel).
- 查询参数:
示例卷曲(股票代码):
curl 'http://localhost:8000/api/v1/ticker?symbol=BTC%2FUSDT&exchange=binance'
错误行为
- 如果服务层引发异常,端点将返回HTTP 502和异常消息
detail. - API从客户端的角度来看是同步的,但使用异步处理程序实现。
模式
Pydantic模型在 app/schemas.py.主要型号包括:
TickerModel--诸如符号、时间戳、最后一次、出价、要价、基本交易量等字段。OHLCVModel--OHLCV阵列列表:[timestamp, open, high, low, close, volume].OrderBookModel—bids,asks,时间戳。TradeModel/TradesModel--个人交易和列表。
这些模式用于标准化API输出,并出现在以下位置的OpenAPI文档中 /docs 当应用程序运行时。
配置(环境变量)
配置存在于 app/config.py (Pydantic Settings).重要的环境变量和默认值:
REDIS_HOST(默认值:localhost)REDIS_PORT(默认值:6379)REDIS_DB(默认值:0)REDIS_URL(默认值:redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB})DEFAULT_EXCHANGE(默认值:binance)--当exchange省略查询参数。
在运行服务器之前,在shell或容器编排中设置它们。
要求和兼容性
项目依赖关系位于 requirements.txt.关键问题:
- FastAPI
- uvicorn[标准]
- 仓储管理系统
- redis(redis-py)——通过使用
redis.asyncio - aioredis(历史;代码使用
redis.asyncio) - 坚韧
- httpx
- pytest,pytest-asyncio(测试)
兼容性说明(重要):
- 此仓库中的测试使用
httpx.AsyncClient(app=app, ...)其依赖于较旧的httpx API行为。较新的httpx版本(0.28+)删除了app=kwarg。如果你运行测试并看到以下失败:TypeError: AsyncClient.__init__() got an unexpected keyword argument 'app'那么任一引脚httpx到旧版本(例如httpx==0.23.3)或更新测试以使用现代ASGI测试方法。
建议快速安装(项目venv调用 menv 在此回购中):
# from repo root
python -m venv menv
source menv/bin/activate
python -m pip install -r requirements.txt
如果你喜欢钉 httpx 添加到兼容版本 httpx==0.23.3 到 requirements.txt 并重新安装。
在本地运行(开发)
- 如果你还没有Redis,请启动Redis(本地):
docker run -p 6379:6379 -d --name redis redis:7
- 使用便利脚本或uvicorn启动应用程序:
./run_server.sh
# or
python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
打开 http://localhost:8000/docs 用于交互式OpenAPI UI。
测试
从项目根运行单元测试,以便 app 可导入:
# ensure venv is activated and deps installed
python -m pytest -q tests/unit
如果你击中 AsyncClient(..., app=app) TypeError,任一引脚 httpx 或更新测试以使用ASGI传输/寿命管理器。
码头工人
此回购包含 Dockerfile 和 docker-compose.yml.典型的本地组合用法:
docker-compose up --build
确保compose文件连接Redis服务并设置任何所需的env变量(或使用外部Redis并设置 REDIS_URL).
故障排除
- ModuleNotFoundError:没有名为“redis”的模块——在用于运行uvicorn的同一Python环境中安装要求。
- Pydantic模型错误——确保中的属性
app/config.py类型正确(非字段属性应注释为ClassVar). - 缩进错误/语法错误--运行
python -m py_compile <file>查找语法问题。 - Httpx AsyncClient TypeError——请参阅上面的兼容性说明。
假设和设计说明
MarketService方法是异步的,返回交换规范化的数据。该服务协调从CCXTAdapter,在Redis中缓存,并返回结构化响应。- Redis用于响应的短期缓存(JSON序列化),以减少外部交换调用。
- OpenAPI模式通过以下方式提供
app/schemas.py以记录响应形状。 - 该项目主要是面向开发者的服务;生产强化(身份验证、速率限制、连接池、监控)超出了此存储库的范围。
下一步去哪里看
app/services/market_service.py--缓存和编排逻辑。app/adapters/ccxt_adapter.py--交换层实现。app/cache/redis_cache.py--Redis客户端帮助程序(init/get/set/close)。tests/unit/--如何在测试中执行端点和适配器的示例。