# china-stock-mcp
一款基于 [akshare-one](https://github.com/zwldarren/akshare-one) 构建的 MCP (Model Context Protocol) 服务器,为中国股市数据提供接口。提供了一系列工具,用于获取财务信息,包括历史股票数据、实时数据、新闻数据、财务报表等。
## 🚀 核心特性
- **双模式运行**: 支持 stdio 本地模式和 HTTP 网络模式
- **丰富的财务数据**: 涵盖 A/B/H 股数据的全方位获取
- **实时数据**: 支持实时股价、交易信息等
- **财务报表**: 资产负债表、利润表、现金流量表等
- **技术指标**: 30+ 种技术指标自动计算和添加
- **新闻数据**: 股票相关新闻和公告信息
- **易用性**: 简单配置即可集成到 AI 助手 (Claude、Cursor 等)
- **容器化**: 支持 Docker 部署
## 🛠️ 架构概览
### 主要组件
- `server.py`: MCP 服务器核心,定义所有工具和数据接口
- `__main__.py`: 命令行入口,支持多种运行模式
- FastMCP 框架: 处理 MCP 协议通信
- akshare-one 库: 提供底层的中国股市数据获取能力
### 支持的数据源
- 东方财富 (eastmoney, eastmoney_direct)
- 新浪财经 (sina)
- 雪球 (xueqiu)
## 📋 可用工具
### 1. `获取历史行情数据` (get_hist_data)
获取股票的历史行情数据,支持多种数据源和技术指标。
**参数:**
- `symbol` (string): 股票代码,如 '000001'
- `interval` (string): 时间周期 ('minute','hour','day','week','month','year'),默认为 'day'
- `interval_multiplier` (number): 时间周期乘数,默认为 1
- `start_date` (string): 开始日期,格式为 'YYYY-MM-DD',默认为 '1970-01-01'
- `end_date` (string): 结束日期,格式为 'YYYY-MM-DD',默认为 '2030-12-31'
- `adjust` (string): 复权类型 ('none', 'qfq', 'hfq'),默认为 'none'
- `source` (string): 数据源 ('eastmoney', 'eastmoney_direct', 'sina'),默认为 'eastmoney'
- `indicators_list` (list): 要添加的技术指标列表
- `recent_n` (number): 返回最近 N 条记录的数量,默认为 100
**支持的技术指标** (共 30+ 种):
SMA, EMA, RSI, MACD, BOLL, STOCH, ATR, CCI, ADX, WILLR, AD, ADOSC, OBV, MOM, SAR, TSF, APO, AROON, AROONOSC, BOP, CMO, DX, MFI, MINUS_DI, MINUS_DM, PLUS_DI, PLUS_DM, PPO, ROC, ROCP, ROCR, ROCR100, TRIX, ULTOSC
### 2. `获取实时行情数据` (get_realtime_data)
获取股票的实时行情数据,支持多种数据源。
**参数:**
- `symbol` (string, 可选): 股票代码
- `source` (string, 可选): 数据源 ('xueqiu', 'eastmoney', 'eastmoney_direct'),默认为 'eastmoney_direct'
### 3. `获取新闻数据` (get_news_data)
获取股票相关的新闻数据。
**参数:**
- `symbol` (string): 股票代码
- `recent_n` (number, 可选): 返回最近 N 条记录的数量,默认为 10
### 4. `获取资产负债表` (get_balance_sheet)
获取公司的资产负债表数据。
**参数:**
- `symbol` (string): 股票代码
- `recent_n` (number, 可选): 返回最近 N 条记录的数量,默认为 10
### 5. `获取利润表` (get_income_statement)
获取公司的利润表数据。
**参数:**
- `symbol` (string): 股票代码
- `recent_n` (number, 可选): 返回最近 N 条记录的数量,默认为 10
### 6. `获取现金流量表` (get_cash_flow)
获取公司的现金流量表数据。
**参数:**
- `symbol` (string): 股票代码
- `source` (string, 可选): 数据源,默认为 'sina'
- `recent_n` (number, 可选): 返回最近 N 条记录的数量,默认为 10
### 7. `获取内部交易数据` (get_inner_trade_data)
获取公司的内部交易数据。
**参数:**
- `symbol` (string): 股票代码
### 8. `获取财务指标` (get_financial_metrics)
获取三大财务报表的关键财务指标。
**参数:**
- `symbol` (string): 股票代码
- `recent_n` (number, 可选): 返回最近 N 条记录的数量,默认为 10
### 9. `获取时间信息` (get_time_info)
获取当前时间的ISO格式、时间戳和最近的交易日。
### 10. `获取股票基本概要信息` (get_stock_basic_info)
获取指定股票的基本概要信息。
**参数:**
- `symbol` (string): 股票代码,如 '000001' 代表A股, '00700' 代表港股
- `market_type` (string): 市场类型 ('A股', '港股'),默认为 'A股'
- `data_source` (string): 数据来源 ('eastmoney', 'xueqiu', 'cninfo', 'xq'),默认为 'eastmoney'
- `recent_n` (number, 可选): 返回最近 N 条记录的数量,仅适用于部分接口,默认为 None
### 11. `获取宏观经济数据` (get_macro_data)
获取宏观经济数据,包括货币供应量、GDP、CPI、PMI等指标。
**参数:**
- `indicator` (string): 宏观经济指标 ('money_supply', 'gdp', 'cpi', 'pmi', 'stock_summary')
- `data_source` (string): 数据来源 ('sina', 'eastmoney'),默认为 'sina'
- `recent_n` (number, 可选): 返回最近 N 条记录的数量,默认为 10
### 12. `分析散户和机构投资者投资情绪` (get_investor_sentiment)
分析散户和机构投资者的投资情绪,包括散户关注度、看涨情绪、北向资金流动、机构调研等。
**参数:**
- `symbol` (string): 股票代码,如 '000001'
- `indicator` (string): 情绪指标 ('retail_attention', 'retail_bullish', 'northbound_flow', 'institution_research', 'institution_participate'),默认为 'institution_participate'
- `data_source` (string): 数据来源 ('eastmoney'),默认为 'eastmoney'
- `recent_n` (number, 可选): 返回最近 N 条记录的数量,默认为 10
### 13. `获取股东情况` (get_shareholder_info)
获取指定股票的股东情况,包括十大流通股东、十大股东、股东户数、股权质押等。
**参数:**
- `symbol` (string): 股票代码,如 '000001'
- `shareholder_type` (string): 股东类型 ('shareholder_count'),默认为 'shareholder_count'
- `data_source` (string): 数据来源 ('eastmoney'),默认为 'eastmoney'
- `recent_n` (number, 可选): 返回最近 N 条记录的数量,默认为 10
### 14. `获取产品情况` (get_product_info)
获取指定股票公司的主要产品或业务构成,包括主营构成、产品类型、行业分类等。
**参数:**
- `symbol` (string): 股票代码,如 '000001'
- `info_type` (string): 信息类型 ('business_composition'),默认为 'business_composition'
- `data_source` (string): 数据来源 ('ths', 'eastmoney'),默认为 'ths'
- `recent_n` (number, 可选): 返回最近 N 条记录的数量,默认为 10
## 🚀 安装和运行
### 方法一: 使用 Smithery(推荐)
通过 [Smithery](https://smithery.ai/server/@xinkuang/china-stock-mcp) 自动安装到 Claude Desktop:
```bash
npx -y @smithery/cli install @xinkuang/china-stock-mcp --client claude
```
### 方法二: 使用 Docker
#### 1. 拉取镜像
```bash
docker pull ghcr.io/xinkuang/china-stock-mcp:latest
```
#### 2. 运行容器
```bash
docker run -p 8081:8081 ghcr.io/xinkuang/china-stock-mcp:latest
```
### 方法三: 本地源代码安装
#### 1. 环境要求
- Python 3.12+
- Git
- uv (推荐的 Python 包管理器)
#### 2. 克隆仓库
```bash
git clone https://github.com/xinkuang/china-stock-mcp
cd china-stock-mcp
```
#### 3. 安装依赖
```bash
# 推荐使用 uv 包管理器
uv sync
# 或者使用 pip
pip install -r requirements.txt
```
#### 4. 运行服务器
**stdio 模式 (默认,适用于本地 MCP 客户端):**
```bash
uv run -m china_stock_mcp
```
**HTTP 模式 (适用于远程访问):**
```bash
uv run -m china_stock_mcp --streamable-http --host 0.0.0.0 --port 8081
```
服务器将在 `http://localhost:8081/mcp` 提供服务。
## ⚙️ MCP 配置示例
### Claude Desktop 配置
编辑 `claude_desktop_config.json`:
**方式一: 本地源代码**
```json
{
"mcpServers": {
"china-stock-mcp": {
"command": "uv",
"args": [
"--directory",
"/path/to/china_stock_mcp",
"run",
"china-stock-mcp"
]
}
}
}
```
**方式二: 通过 uvx**
```json
{
"mcpServers": {
"china-stock-mcp": {
"command": "uvx",
"args": [
"china-stock-mcp"
]
}
}
}
```
**方式三: HTTP 模式**
```json
{
"mcpServers": {
"china-stock-mcp": {
"command": "uvx",
"args": ["china-stock-mcp", "--streamable-http", "--host", "0.0.0.0", "--port", "8081"],
"env": {
"MCP_BASE_URL": "http://localhost:8081/mcp"
}
}
}
}
```
### 其他 AI 客户端配置
**Cursor:**
```json
{
"mcpServers": {
"china-stock-mcp": {
"command": "uvx",
"args": [ "china-stock-mcp"]
}
}
}
```
**Clion with MCP:**
```json
{
"mcpServers": {
"china-stock-mcp": {
"command": "uvx",
"args": [ "china-stock-mcp"]
}
}
}
```
## 🏃♂️ 命令行参数
- `--streamable-http`: 启用 HTTP 可流式模式 (默认: stdio 模式)
- `--host`: HTTP 模式下的绑定主机 (默认: 0.0.0.0)
- `--port`: HTTP 模式下的监听端口 (默认: 8081)
## 📊 数据支持范围
### 股票市场
- A股 (上证、深证)
- B股
- H股 (港股)
- 中小板、创业板、新三板
### 数据类型
- 历史行情数据 (分钟级、小时级、日级、周级、月级、年级)
- 实时行情数据
- 技术指标计算
- 新闻资讯
- 财务报表 (资产负债表、利润表、现金流量表)
- 财务指标
- 内部交易数据
## 🔧 开发和贡献
### 开发环境设置
1. 克隆仓库
```bash
git clone https://github.com/xinkuang/china-stock-mcp
cd china-stock-mcp
```
2. 安装开发依赖
```bash
uv sync --dev
```
3. 进入开发模式
```bash
uv run -m china_stock_mcp
```
### 代码结构
```
src/china_stock_mcp/
├── __init__.py
├── __main__.py # 命令行入口,处理启动参数
├── server.py # MCP 服务器核心,定义所有工具
├── mcp.json # MCP 配置规范 (可选)
└── py.typed # 类型标注文件
```
### 添加新工具
在 `server.py` 中使用 `@mcp.tool` 装饰器添加新工具:
```python
@mcp.tool(name="工具中文名称", description="工具的中文描述")
def your_tool_name(param1: Annotated[str, Field(description="参数描述")]) -> str:
"""工具详情描述"""
# 实现逻辑
pass
```
## 📝 许可证
MIT License - 详见 [LICENSE](LICENSE) 文件
## 🤝 贡献
欢迎提交 Issue 和 Pull Request!
## 🙋♂️ 常见问题
**Q: 为什么无法获取数据?**
A: 请检查网络连接和数据源可用性。某些数据源可能有访问限制。
**Q: HTTP 模式下无法连接?**
A: 确认端口 8081 未被其他服务占用,且防火墙允许相应端口的访问。
**Q: 如何更新到最新版本?**
A: 使用 Smithery 安装的可以自动更新,手动安装的请重新拉取仓库代码。
## 🐞 调试
有关如何使用 @modelcontextprotocol/inspector 调试此服务器的详细信息,请参阅 [DEBUG.md](DEBUG.md)。
Raw data
{
"_id": null,
"home_page": null,
"name": "china-stock-mcp",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.12",
"maintainer_email": null,
"keywords": "akshare, stock, mcp, mcp-server",
"author": "postback",
"author_email": "postback <ssf@foxmail.com>",
"download_url": "https://files.pythonhosted.org/packages/3d/d8/2840edeb26b02d6ce862f496c0a6ad4be00ce8da6776eef626acd5af1243/china_stock_mcp-0.1.7.tar.gz",
"platform": null,
"description": "# china-stock-mcp\n\u4e00\u6b3e\u57fa\u4e8e [akshare-one](https://github.com/zwldarren/akshare-one) \u6784\u5efa\u7684 MCP (Model Context Protocol) \u670d\u52a1\u5668\uff0c\u4e3a\u4e2d\u56fd\u80a1\u5e02\u6570\u636e\u63d0\u4f9b\u63a5\u53e3\u3002\u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u5de5\u5177\uff0c\u7528\u4e8e\u83b7\u53d6\u8d22\u52a1\u4fe1\u606f\uff0c\u5305\u62ec\u5386\u53f2\u80a1\u7968\u6570\u636e\u3001\u5b9e\u65f6\u6570\u636e\u3001\u65b0\u95fb\u6570\u636e\u3001\u8d22\u52a1\u62a5\u8868\u7b49\u3002\n\n\n\n## \ud83d\ude80 \u6838\u5fc3\u7279\u6027\n\n- **\u53cc\u6a21\u5f0f\u8fd0\u884c**: \u652f\u6301 stdio \u672c\u5730\u6a21\u5f0f\u548c HTTP \u7f51\u7edc\u6a21\u5f0f\n- **\u4e30\u5bcc\u7684\u8d22\u52a1\u6570\u636e**: \u6db5\u76d6 A/B/H \u80a1\u6570\u636e\u7684\u5168\u65b9\u4f4d\u83b7\u53d6\n- **\u5b9e\u65f6\u6570\u636e**: \u652f\u6301\u5b9e\u65f6\u80a1\u4ef7\u3001\u4ea4\u6613\u4fe1\u606f\u7b49\n- **\u8d22\u52a1\u62a5\u8868**: \u8d44\u4ea7\u8d1f\u503a\u8868\u3001\u5229\u6da6\u8868\u3001\u73b0\u91d1\u6d41\u91cf\u8868\u7b49\n- **\u6280\u672f\u6307\u6807**: 30+ \u79cd\u6280\u672f\u6307\u6807\u81ea\u52a8\u8ba1\u7b97\u548c\u6dfb\u52a0\n- **\u65b0\u95fb\u6570\u636e**: \u80a1\u7968\u76f8\u5173\u65b0\u95fb\u548c\u516c\u544a\u4fe1\u606f\n- **\u6613\u7528\u6027**: \u7b80\u5355\u914d\u7f6e\u5373\u53ef\u96c6\u6210\u5230 AI \u52a9\u624b (Claude\u3001Cursor \u7b49)\n- **\u5bb9\u5668\u5316**: \u652f\u6301 Docker \u90e8\u7f72\n\n## \ud83d\udee0\ufe0f \u67b6\u6784\u6982\u89c8\n\n### \u4e3b\u8981\u7ec4\u4ef6\n\n- `server.py`: MCP \u670d\u52a1\u5668\u6838\u5fc3\uff0c\u5b9a\u4e49\u6240\u6709\u5de5\u5177\u548c\u6570\u636e\u63a5\u53e3\n- `__main__.py`: \u547d\u4ee4\u884c\u5165\u53e3\uff0c\u652f\u6301\u591a\u79cd\u8fd0\u884c\u6a21\u5f0f\n- FastMCP \u6846\u67b6: \u5904\u7406 MCP \u534f\u8bae\u901a\u4fe1\n- akshare-one \u5e93: \u63d0\u4f9b\u5e95\u5c42\u7684\u4e2d\u56fd\u80a1\u5e02\u6570\u636e\u83b7\u53d6\u80fd\u529b\n\n### \u652f\u6301\u7684\u6570\u636e\u6e90\n\n- \u4e1c\u65b9\u8d22\u5bcc (eastmoney, eastmoney_direct)\n- \u65b0\u6d6a\u8d22\u7ecf (sina)\n- \u96ea\u7403 (xueqiu)\n## \ud83d\udccb \u53ef\u7528\u5de5\u5177\n\n### 1. `\u83b7\u53d6\u5386\u53f2\u884c\u60c5\u6570\u636e` (get_hist_data)\n\n\u83b7\u53d6\u80a1\u7968\u7684\u5386\u53f2\u884c\u60c5\u6570\u636e\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u6e90\u548c\u6280\u672f\u6307\u6807\u3002\n\n**\u53c2\u6570:**\n- `symbol` (string): \u80a1\u7968\u4ee3\u7801\uff0c\u5982 '000001'\n- `interval` (string): \u65f6\u95f4\u5468\u671f ('minute','hour','day','week','month','year')\uff0c\u9ed8\u8ba4\u4e3a 'day'\n- `interval_multiplier` (number): \u65f6\u95f4\u5468\u671f\u4e58\u6570\uff0c\u9ed8\u8ba4\u4e3a 1\n- `start_date` (string): \u5f00\u59cb\u65e5\u671f\uff0c\u683c\u5f0f\u4e3a 'YYYY-MM-DD'\uff0c\u9ed8\u8ba4\u4e3a '1970-01-01'\n- `end_date` (string): \u7ed3\u675f\u65e5\u671f\uff0c\u683c\u5f0f\u4e3a 'YYYY-MM-DD'\uff0c\u9ed8\u8ba4\u4e3a '2030-12-31'\n- `adjust` (string): \u590d\u6743\u7c7b\u578b ('none', 'qfq', 'hfq')\uff0c\u9ed8\u8ba4\u4e3a 'none'\n- `source` (string): \u6570\u636e\u6e90 ('eastmoney', 'eastmoney_direct', 'sina')\uff0c\u9ed8\u8ba4\u4e3a 'eastmoney'\n- `indicators_list` (list): \u8981\u6dfb\u52a0\u7684\u6280\u672f\u6307\u6807\u5217\u8868\n- `recent_n` (number): \u8fd4\u56de\u6700\u8fd1 N \u6761\u8bb0\u5f55\u7684\u6570\u91cf\uff0c\u9ed8\u8ba4\u4e3a 100\n\n**\u652f\u6301\u7684\u6280\u672f\u6307\u6807** (\u5171 30+ \u79cd):\nSMA, EMA, RSI, MACD, BOLL, STOCH, ATR, CCI, ADX, WILLR, AD, ADOSC, OBV, MOM, SAR, TSF, APO, AROON, AROONOSC, BOP, CMO, DX, MFI, MINUS_DI, MINUS_DM, PLUS_DI, PLUS_DM, PPO, ROC, ROCP, ROCR, ROCR100, TRIX, ULTOSC\n\n### 2. `\u83b7\u53d6\u5b9e\u65f6\u884c\u60c5\u6570\u636e` (get_realtime_data)\n\n\u83b7\u53d6\u80a1\u7968\u7684\u5b9e\u65f6\u884c\u60c5\u6570\u636e\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u6e90\u3002\n\n**\u53c2\u6570:**\n- `symbol` (string, \u53ef\u9009): \u80a1\u7968\u4ee3\u7801\n- `source` (string, \u53ef\u9009): \u6570\u636e\u6e90 ('xueqiu', 'eastmoney', 'eastmoney_direct')\uff0c\u9ed8\u8ba4\u4e3a 'eastmoney_direct'\n\n### 3. `\u83b7\u53d6\u65b0\u95fb\u6570\u636e` (get_news_data)\n\n\u83b7\u53d6\u80a1\u7968\u76f8\u5173\u7684\u65b0\u95fb\u6570\u636e\u3002\n\n**\u53c2\u6570:**\n- `symbol` (string): \u80a1\u7968\u4ee3\u7801\n- `recent_n` (number, \u53ef\u9009): \u8fd4\u56de\u6700\u8fd1 N \u6761\u8bb0\u5f55\u7684\u6570\u91cf\uff0c\u9ed8\u8ba4\u4e3a 10\n\n### 4. `\u83b7\u53d6\u8d44\u4ea7\u8d1f\u503a\u8868` (get_balance_sheet)\n\n\u83b7\u53d6\u516c\u53f8\u7684\u8d44\u4ea7\u8d1f\u503a\u8868\u6570\u636e\u3002\n\n**\u53c2\u6570:**\n- `symbol` (string): \u80a1\u7968\u4ee3\u7801\n- `recent_n` (number, \u53ef\u9009): \u8fd4\u56de\u6700\u8fd1 N \u6761\u8bb0\u5f55\u7684\u6570\u91cf\uff0c\u9ed8\u8ba4\u4e3a 10\n\n### 5. `\u83b7\u53d6\u5229\u6da6\u8868` (get_income_statement)\n\n\u83b7\u53d6\u516c\u53f8\u7684\u5229\u6da6\u8868\u6570\u636e\u3002\n\n**\u53c2\u6570:**\n- `symbol` (string): \u80a1\u7968\u4ee3\u7801\n- `recent_n` (number, \u53ef\u9009): \u8fd4\u56de\u6700\u8fd1 N \u6761\u8bb0\u5f55\u7684\u6570\u91cf\uff0c\u9ed8\u8ba4\u4e3a 10\n\n### 6. `\u83b7\u53d6\u73b0\u91d1\u6d41\u91cf\u8868` (get_cash_flow)\n\n\u83b7\u53d6\u516c\u53f8\u7684\u73b0\u91d1\u6d41\u91cf\u8868\u6570\u636e\u3002\n\n**\u53c2\u6570:**\n- `symbol` (string): \u80a1\u7968\u4ee3\u7801\n- `source` (string, \u53ef\u9009): \u6570\u636e\u6e90\uff0c\u9ed8\u8ba4\u4e3a 'sina'\n- `recent_n` (number, \u53ef\u9009): \u8fd4\u56de\u6700\u8fd1 N \u6761\u8bb0\u5f55\u7684\u6570\u91cf\uff0c\u9ed8\u8ba4\u4e3a 10\n\n### 7. `\u83b7\u53d6\u5185\u90e8\u4ea4\u6613\u6570\u636e` (get_inner_trade_data)\n\n\u83b7\u53d6\u516c\u53f8\u7684\u5185\u90e8\u4ea4\u6613\u6570\u636e\u3002\n\n**\u53c2\u6570:**\n- `symbol` (string): \u80a1\u7968\u4ee3\u7801\n\n### 8. `\u83b7\u53d6\u8d22\u52a1\u6307\u6807` (get_financial_metrics)\n\n\u83b7\u53d6\u4e09\u5927\u8d22\u52a1\u62a5\u8868\u7684\u5173\u952e\u8d22\u52a1\u6307\u6807\u3002\n\n**\u53c2\u6570:**\n- `symbol` (string): \u80a1\u7968\u4ee3\u7801\n- `recent_n` (number, \u53ef\u9009): \u8fd4\u56de\u6700\u8fd1 N \u6761\u8bb0\u5f55\u7684\u6570\u91cf\uff0c\u9ed8\u8ba4\u4e3a 10\n\n### 9. `\u83b7\u53d6\u65f6\u95f4\u4fe1\u606f` (get_time_info)\n\n\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u7684ISO\u683c\u5f0f\u3001\u65f6\u95f4\u6233\u548c\u6700\u8fd1\u7684\u4ea4\u6613\u65e5\u3002\n### 10. `\u83b7\u53d6\u80a1\u7968\u57fa\u672c\u6982\u8981\u4fe1\u606f` (get_stock_basic_info)\n\n\u83b7\u53d6\u6307\u5b9a\u80a1\u7968\u7684\u57fa\u672c\u6982\u8981\u4fe1\u606f\u3002\n\n**\u53c2\u6570:**\n- `symbol` (string): \u80a1\u7968\u4ee3\u7801\uff0c\u5982 '000001' \u4ee3\u8868A\u80a1, '00700' \u4ee3\u8868\u6e2f\u80a1\n- `market_type` (string): \u5e02\u573a\u7c7b\u578b ('A\u80a1', '\u6e2f\u80a1')\uff0c\u9ed8\u8ba4\u4e3a 'A\u80a1'\n- `data_source` (string): \u6570\u636e\u6765\u6e90 ('eastmoney', 'xueqiu', 'cninfo', 'xq')\uff0c\u9ed8\u8ba4\u4e3a 'eastmoney'\n- `recent_n` (number, \u53ef\u9009): \u8fd4\u56de\u6700\u8fd1 N \u6761\u8bb0\u5f55\u7684\u6570\u91cf\uff0c\u4ec5\u9002\u7528\u4e8e\u90e8\u5206\u63a5\u53e3\uff0c\u9ed8\u8ba4\u4e3a None\n\n### 11. `\u83b7\u53d6\u5b8f\u89c2\u7ecf\u6d4e\u6570\u636e` (get_macro_data)\n\n\u83b7\u53d6\u5b8f\u89c2\u7ecf\u6d4e\u6570\u636e\uff0c\u5305\u62ec\u8d27\u5e01\u4f9b\u5e94\u91cf\u3001GDP\u3001CPI\u3001PMI\u7b49\u6307\u6807\u3002\n\n**\u53c2\u6570:**\n- `indicator` (string): \u5b8f\u89c2\u7ecf\u6d4e\u6307\u6807 ('money_supply', 'gdp', 'cpi', 'pmi', 'stock_summary')\n- `data_source` (string): \u6570\u636e\u6765\u6e90 ('sina', 'eastmoney')\uff0c\u9ed8\u8ba4\u4e3a 'sina'\n- `recent_n` (number, \u53ef\u9009): \u8fd4\u56de\u6700\u8fd1 N \u6761\u8bb0\u5f55\u7684\u6570\u91cf\uff0c\u9ed8\u8ba4\u4e3a 10\n\n### 12. `\u5206\u6790\u6563\u6237\u548c\u673a\u6784\u6295\u8d44\u8005\u6295\u8d44\u60c5\u7eea` (get_investor_sentiment)\n\n\u5206\u6790\u6563\u6237\u548c\u673a\u6784\u6295\u8d44\u8005\u7684\u6295\u8d44\u60c5\u7eea\uff0c\u5305\u62ec\u6563\u6237\u5173\u6ce8\u5ea6\u3001\u770b\u6da8\u60c5\u7eea\u3001\u5317\u5411\u8d44\u91d1\u6d41\u52a8\u3001\u673a\u6784\u8c03\u7814\u7b49\u3002\n\n**\u53c2\u6570:**\n- `symbol` (string): \u80a1\u7968\u4ee3\u7801\uff0c\u5982 '000001'\n- `indicator` (string): \u60c5\u7eea\u6307\u6807 ('retail_attention', 'retail_bullish', 'northbound_flow', 'institution_research', 'institution_participate')\uff0c\u9ed8\u8ba4\u4e3a 'institution_participate'\n- `data_source` (string): \u6570\u636e\u6765\u6e90 ('eastmoney')\uff0c\u9ed8\u8ba4\u4e3a 'eastmoney'\n- `recent_n` (number, \u53ef\u9009): \u8fd4\u56de\u6700\u8fd1 N \u6761\u8bb0\u5f55\u7684\u6570\u91cf\uff0c\u9ed8\u8ba4\u4e3a 10\n\n### 13. `\u83b7\u53d6\u80a1\u4e1c\u60c5\u51b5` (get_shareholder_info)\n\n\u83b7\u53d6\u6307\u5b9a\u80a1\u7968\u7684\u80a1\u4e1c\u60c5\u51b5\uff0c\u5305\u62ec\u5341\u5927\u6d41\u901a\u80a1\u4e1c\u3001\u5341\u5927\u80a1\u4e1c\u3001\u80a1\u4e1c\u6237\u6570\u3001\u80a1\u6743\u8d28\u62bc\u7b49\u3002\n\n**\u53c2\u6570:**\n- `symbol` (string): \u80a1\u7968\u4ee3\u7801\uff0c\u5982 '000001'\n- `shareholder_type` (string): \u80a1\u4e1c\u7c7b\u578b ('shareholder_count')\uff0c\u9ed8\u8ba4\u4e3a 'shareholder_count'\n- `data_source` (string): \u6570\u636e\u6765\u6e90 ('eastmoney')\uff0c\u9ed8\u8ba4\u4e3a 'eastmoney'\n- `recent_n` (number, \u53ef\u9009): \u8fd4\u56de\u6700\u8fd1 N \u6761\u8bb0\u5f55\u7684\u6570\u91cf\uff0c\u9ed8\u8ba4\u4e3a 10\n\n### 14. `\u83b7\u53d6\u4ea7\u54c1\u60c5\u51b5` (get_product_info)\n\n\u83b7\u53d6\u6307\u5b9a\u80a1\u7968\u516c\u53f8\u7684\u4e3b\u8981\u4ea7\u54c1\u6216\u4e1a\u52a1\u6784\u6210\uff0c\u5305\u62ec\u4e3b\u8425\u6784\u6210\u3001\u4ea7\u54c1\u7c7b\u578b\u3001\u884c\u4e1a\u5206\u7c7b\u7b49\u3002\n\n**\u53c2\u6570:**\n- `symbol` (string): \u80a1\u7968\u4ee3\u7801\uff0c\u5982 '000001'\n- `info_type` (string): \u4fe1\u606f\u7c7b\u578b ('business_composition')\uff0c\u9ed8\u8ba4\u4e3a 'business_composition'\n- `data_source` (string): \u6570\u636e\u6765\u6e90 ('ths', 'eastmoney')\uff0c\u9ed8\u8ba4\u4e3a 'ths'\n- `recent_n` (number, \u53ef\u9009): \u8fd4\u56de\u6700\u8fd1 N \u6761\u8bb0\u5f55\u7684\u6570\u91cf\uff0c\u9ed8\u8ba4\u4e3a 10\n\n\n## \ud83d\ude80 \u5b89\u88c5\u548c\u8fd0\u884c\n\n### \u65b9\u6cd5\u4e00: \u4f7f\u7528 Smithery\uff08\u63a8\u8350\uff09\n\n\u901a\u8fc7 [Smithery](https://smithery.ai/server/@xinkuang/china-stock-mcp) \u81ea\u52a8\u5b89\u88c5\u5230 Claude Desktop\uff1a\n\n```bash\nnpx -y @smithery/cli install @xinkuang/china-stock-mcp --client claude\n```\n\n### \u65b9\u6cd5\u4e8c: \u4f7f\u7528 Docker\n\n#### 1. \u62c9\u53d6\u955c\u50cf\n```bash\ndocker pull ghcr.io/xinkuang/china-stock-mcp:latest\n```\n\n#### 2. \u8fd0\u884c\u5bb9\u5668\n```bash\ndocker run -p 8081:8081 ghcr.io/xinkuang/china-stock-mcp:latest\n```\n\n### \u65b9\u6cd5\u4e09: \u672c\u5730\u6e90\u4ee3\u7801\u5b89\u88c5\n\n#### 1. \u73af\u5883\u8981\u6c42\n- Python 3.12+\n- Git\n- uv (\u63a8\u8350\u7684 Python \u5305\u7ba1\u7406\u5668)\n\n#### 2. \u514b\u9686\u4ed3\u5e93\n```bash\ngit clone https://github.com/xinkuang/china-stock-mcp\ncd china-stock-mcp\n```\n\n#### 3. \u5b89\u88c5\u4f9d\u8d56\n```bash\n# \u63a8\u8350\u4f7f\u7528 uv \u5305\u7ba1\u7406\u5668\nuv sync\n\n# \u6216\u8005\u4f7f\u7528 pip\npip install -r requirements.txt\n```\n\n#### 4. \u8fd0\u884c\u670d\u52a1\u5668\n\n**stdio \u6a21\u5f0f (\u9ed8\u8ba4\uff0c\u9002\u7528\u4e8e\u672c\u5730 MCP \u5ba2\u6237\u7aef):**\n```bash\nuv run -m china_stock_mcp\n```\n\n**HTTP \u6a21\u5f0f (\u9002\u7528\u4e8e\u8fdc\u7a0b\u8bbf\u95ee):**\n```bash\nuv run -m china_stock_mcp --streamable-http --host 0.0.0.0 --port 8081\n```\n\n\u670d\u52a1\u5668\u5c06\u5728 `http://localhost:8081/mcp` \u63d0\u4f9b\u670d\u52a1\u3002\n\n## \u2699\ufe0f MCP \u914d\u7f6e\u793a\u4f8b\n\n### Claude Desktop \u914d\u7f6e\n\n\u7f16\u8f91 `claude_desktop_config.json`\uff1a\n\n**\u65b9\u5f0f\u4e00: \u672c\u5730\u6e90\u4ee3\u7801**\n```json\n{\n \"mcpServers\": {\n \"china-stock-mcp\": {\n \"command\": \"uv\",\n \"args\": [\n \"--directory\",\n \"/path/to/china_stock_mcp\",\n \"run\",\n \"china-stock-mcp\"\n ]\n }\n }\n}\n```\n\n**\u65b9\u5f0f\u4e8c: \u901a\u8fc7 uvx**\n```json\n{\n \"mcpServers\": {\n \"china-stock-mcp\": {\n \"command\": \"uvx\",\n \"args\": [\n \"china-stock-mcp\"\n ]\n }\n }\n}\n```\n\n**\u65b9\u5f0f\u4e09: HTTP \u6a21\u5f0f**\n```json\n{\n \"mcpServers\": {\n \"china-stock-mcp\": {\n \"command\": \"uvx\",\n \"args\": [\"china-stock-mcp\", \"--streamable-http\", \"--host\", \"0.0.0.0\", \"--port\", \"8081\"],\n \"env\": {\n \"MCP_BASE_URL\": \"http://localhost:8081/mcp\"\n }\n }\n }\n}\n```\n\n### \u5176\u4ed6 AI \u5ba2\u6237\u7aef\u914d\u7f6e\n\n**Cursor:**\n```json\n{\n \"mcpServers\": {\n \"china-stock-mcp\": {\n \"command\": \"uvx\",\n \"args\": [ \"china-stock-mcp\"]\n }\n }\n}\n```\n\n**Clion with MCP:**\n```json\n{\n \"mcpServers\": {\n \"china-stock-mcp\": {\n \"command\": \"uvx\",\n \"args\": [ \"china-stock-mcp\"]\n }\n }\n}\n```\n\n## \ud83c\udfc3\u200d\u2642\ufe0f \u547d\u4ee4\u884c\u53c2\u6570\n\n- `--streamable-http`: \u542f\u7528 HTTP \u53ef\u6d41\u5f0f\u6a21\u5f0f (\u9ed8\u8ba4: stdio \u6a21\u5f0f)\n- `--host`: HTTP \u6a21\u5f0f\u4e0b\u7684\u7ed1\u5b9a\u4e3b\u673a (\u9ed8\u8ba4: 0.0.0.0)\n- `--port`: HTTP \u6a21\u5f0f\u4e0b\u7684\u76d1\u542c\u7aef\u53e3 (\u9ed8\u8ba4: 8081)\n\n## \ud83d\udcca \u6570\u636e\u652f\u6301\u8303\u56f4\n\n### \u80a1\u7968\u5e02\u573a\n- A\u80a1 (\u4e0a\u8bc1\u3001\u6df1\u8bc1)\n- B\u80a1\n- H\u80a1 (\u6e2f\u80a1)\n- \u4e2d\u5c0f\u677f\u3001\u521b\u4e1a\u677f\u3001\u65b0\u4e09\u677f\n\n### \u6570\u636e\u7c7b\u578b\n- \u5386\u53f2\u884c\u60c5\u6570\u636e (\u5206\u949f\u7ea7\u3001\u5c0f\u65f6\u7ea7\u3001\u65e5\u7ea7\u3001\u5468\u7ea7\u3001\u6708\u7ea7\u3001\u5e74\u7ea7)\n- \u5b9e\u65f6\u884c\u60c5\u6570\u636e\n- \u6280\u672f\u6307\u6807\u8ba1\u7b97\n- \u65b0\u95fb\u8d44\u8baf\n- \u8d22\u52a1\u62a5\u8868 (\u8d44\u4ea7\u8d1f\u503a\u8868\u3001\u5229\u6da6\u8868\u3001\u73b0\u91d1\u6d41\u91cf\u8868)\n- \u8d22\u52a1\u6307\u6807\n- \u5185\u90e8\u4ea4\u6613\u6570\u636e\n\n## \ud83d\udd27 \u5f00\u53d1\u548c\u8d21\u732e\n\n### \u5f00\u53d1\u73af\u5883\u8bbe\u7f6e\n\n1. \u514b\u9686\u4ed3\u5e93\n```bash\ngit clone https://github.com/xinkuang/china-stock-mcp\ncd china-stock-mcp\n```\n\n2. \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56\n```bash\nuv sync --dev\n```\n\n3. \u8fdb\u5165\u5f00\u53d1\u6a21\u5f0f\n```bash\nuv run -m china_stock_mcp\n```\n\n### \u4ee3\u7801\u7ed3\u6784\n\n```\nsrc/china_stock_mcp/\n\u251c\u2500\u2500 __init__.py\n\u251c\u2500\u2500 __main__.py # \u547d\u4ee4\u884c\u5165\u53e3\uff0c\u5904\u7406\u542f\u52a8\u53c2\u6570\n\u251c\u2500\u2500 server.py # MCP \u670d\u52a1\u5668\u6838\u5fc3\uff0c\u5b9a\u4e49\u6240\u6709\u5de5\u5177\n\u251c\u2500\u2500 mcp.json # MCP \u914d\u7f6e\u89c4\u8303 (\u53ef\u9009)\n\u2514\u2500\u2500 py.typed # \u7c7b\u578b\u6807\u6ce8\u6587\u4ef6\n```\n\n### \u6dfb\u52a0\u65b0\u5de5\u5177\n\n\u5728 `server.py` \u4e2d\u4f7f\u7528 `@mcp.tool` \u88c5\u9970\u5668\u6dfb\u52a0\u65b0\u5de5\u5177\uff1a\n\n```python\n@mcp.tool(name=\"\u5de5\u5177\u4e2d\u6587\u540d\u79f0\", description=\"\u5de5\u5177\u7684\u4e2d\u6587\u63cf\u8ff0\")\ndef your_tool_name(param1: Annotated[str, Field(description=\"\u53c2\u6570\u63cf\u8ff0\")]) -> str:\n \"\"\"\u5de5\u5177\u8be6\u60c5\u63cf\u8ff0\"\"\"\n # \u5b9e\u73b0\u903b\u8f91\n pass\n```\n\n## \ud83d\udcdd \u8bb8\u53ef\u8bc1\n\nMIT License - \u8be6\u89c1 [LICENSE](LICENSE) \u6587\u4ef6\n\n## \ud83e\udd1d \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4 Issue \u548c Pull Request\uff01\n\n## \ud83d\ude4b\u200d\u2642\ufe0f \u5e38\u89c1\u95ee\u9898\n\n**Q: \u4e3a\u4ec0\u4e48\u65e0\u6cd5\u83b7\u53d6\u6570\u636e\uff1f**\nA: \u8bf7\u68c0\u67e5\u7f51\u7edc\u8fde\u63a5\u548c\u6570\u636e\u6e90\u53ef\u7528\u6027\u3002\u67d0\u4e9b\u6570\u636e\u6e90\u53ef\u80fd\u6709\u8bbf\u95ee\u9650\u5236\u3002\n\n**Q: HTTP \u6a21\u5f0f\u4e0b\u65e0\u6cd5\u8fde\u63a5\uff1f**\nA: \u786e\u8ba4\u7aef\u53e3 8081 \u672a\u88ab\u5176\u4ed6\u670d\u52a1\u5360\u7528\uff0c\u4e14\u9632\u706b\u5899\u5141\u8bb8\u76f8\u5e94\u7aef\u53e3\u7684\u8bbf\u95ee\u3002\n\n**Q: \u5982\u4f55\u66f4\u65b0\u5230\u6700\u65b0\u7248\u672c\uff1f**\nA: \u4f7f\u7528 Smithery \u5b89\u88c5\u7684\u53ef\u4ee5\u81ea\u52a8\u66f4\u65b0\uff0c\u624b\u52a8\u5b89\u88c5\u7684\u8bf7\u91cd\u65b0\u62c9\u53d6\u4ed3\u5e93\u4ee3\u7801\u3002\n## \ud83d\udc1e \u8c03\u8bd5\n\n\u6709\u5173\u5982\u4f55\u4f7f\u7528 @modelcontextprotocol/inspector \u8c03\u8bd5\u6b64\u670d\u52a1\u5668\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605 [DEBUG.md](DEBUG.md)\u3002\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "MCP server that provides access to Chinese stock market data using akshare",
"version": "0.1.7",
"project_urls": {
"Homepage": "https://github.com/xinkuang/china-stock-mcp",
"Repository": "https://github.com/xinkuang/china-stock-mcp.git"
},
"split_keywords": [
"akshare",
" stock",
" mcp",
" mcp-server"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "a2fe8e145b98a0ccb6cccadeb23f38c9c09ad4d438f7ffc13f4ef38927caeda7",
"md5": "3927522c7826dc8584026cb7bc2b9e18",
"sha256": "cd8b7cb96cabf0f49fdcb31e77dd4d9adf88edebd356cc1a8386c991b88b5de6"
},
"downloads": -1,
"filename": "china_stock_mcp-0.1.7-py3-none-any.whl",
"has_sig": false,
"md5_digest": "3927522c7826dc8584026cb7bc2b9e18",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.12",
"size": 11777,
"upload_time": "2025-09-02T07:54:06",
"upload_time_iso_8601": "2025-09-02T07:54:06.602765Z",
"url": "https://files.pythonhosted.org/packages/a2/fe/8e145b98a0ccb6cccadeb23f38c9c09ad4d438f7ffc13f4ef38927caeda7/china_stock_mcp-0.1.7-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3dd82840edeb26b02d6ce862f496c0a6ad4be00ce8da6776eef626acd5af1243",
"md5": "c3dcfa307a5d681427c81e0b9938a2b9",
"sha256": "94fd0f34f1dcf35045d28bd35d3a65ce83d355cc574bcdab91916ce88327a025"
},
"downloads": -1,
"filename": "china_stock_mcp-0.1.7.tar.gz",
"has_sig": false,
"md5_digest": "c3dcfa307a5d681427c81e0b9938a2b9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.12",
"size": 9565,
"upload_time": "2025-09-02T07:54:07",
"upload_time_iso_8601": "2025-09-02T07:54:07.555860Z",
"url": "https://files.pythonhosted.org/packages/3d/d8/2840edeb26b02d6ce862f496c0a6ad4be00ce8da6776eef626acd5af1243/china_stock_mcp-0.1.7.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-02 07:54:07",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "xinkuang",
"github_project": "china-stock-mcp",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "uvicorn",
"specs": [
[
"==",
"0.35.0"
]
]
},
{
"name": "starlette",
"specs": [
[
"==",
"0.47.3"
]
]
},
{
"name": "fastmcp",
"specs": [
[
"==",
"2.11.3"
]
]
},
{
"name": "akshare",
"specs": [
[
"==",
"1.17.42"
]
]
},
{
"name": "akshare-one",
"specs": [
[
"==",
"0.3.10"
]
]
},
{
"name": "pydantic",
"specs": [
[
"==",
"2.11.7"
]
]
},
{
"name": "pydantic-core",
"specs": [
[
"==",
"2.33.2"
]
]
},
{
"name": "annotated-types",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "pandas",
"specs": [
[
"==",
"2.3.2"
]
]
},
{
"name": "numpy",
"specs": [
[
"==",
"1.26.4"
]
]
},
{
"name": "httpx",
"specs": [
[
"==",
"0.28.1"
]
]
},
{
"name": "httpcore",
"specs": [
[
"==",
"1.0.9"
]
]
},
{
"name": "h11",
"specs": [
[
"==",
"0.16.0"
]
]
},
{
"name": "anyio",
"specs": [
[
"==",
"4.10.0"
]
]
},
{
"name": "sniffio",
"specs": [
[
"==",
"1.3.1"
]
]
},
{
"name": "rich",
"specs": [
[
"==",
"14.1.0"
]
]
},
{
"name": "pygments",
"specs": [
[
"==",
"2.19.2"
]
]
},
{
"name": "python-dotenv",
"specs": [
[
"==",
"1.1.1"
]
]
},
{
"name": "pyyaml",
"specs": [
[
"==",
"6.0.2"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.32.5"
]
]
},
{
"name": "email-validator",
"specs": [
[
"==",
"2.3.0"
]
]
},
{
"name": "jsonschema",
"specs": [
[
"==",
"4.25.1"
]
]
},
{
"name": "jsonschema-path",
"specs": [
[
"==",
"0.3.4"
]
]
},
{
"name": "jsonschema-specifications",
"specs": [
[
"==",
"2025.4.1"
]
]
},
{
"name": "openapi-core",
"specs": [
[
"==",
"0.19.5"
]
]
},
{
"name": "openapi-pydantic",
"specs": [
[
"==",
"0.5.1"
]
]
},
{
"name": "openapi-schema-validator",
"specs": [
[
"==",
"0.6.3"
]
]
},
{
"name": "openapi-spec-validator",
"specs": [
[
"==",
"0.7.2"
]
]
},
{
"name": "rpds-py",
"specs": [
[
"==",
"0.27.0"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
"==",
"2.9.0.post0"
]
]
},
{
"name": "pytz",
"specs": [
[
"==",
"2025.2"
]
]
},
{
"name": "typing-extensions",
"specs": [
[
"==",
"4.15.0"
]
]
},
{
"name": "beautifulsoup4",
"specs": [
[
"==",
"4.13.5"
]
]
},
{
"name": "soupsieve",
"specs": [
[
"==",
"2.7"
]
]
},
{
"name": "html5lib",
"specs": [
[
"==",
"1.1"
]
]
},
{
"name": "webencodings",
"specs": [
[
"==",
"0.5.1"
]
]
},
{
"name": "lxml",
"specs": [
[
"==",
"6.0.1"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"3.4.3"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.10"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2025.8.3"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"2.5.0"
]
]
},
{
"name": "tqdm",
"specs": [
[
"==",
"4.67.1"
]
]
},
{
"name": "tabulate",
"specs": [
[
"==",
"0.9.0"
]
]
},
{
"name": "openpyxl",
"specs": [
[
"==",
"3.1.5"
]
]
},
{
"name": "xlrd",
"specs": [
[
"==",
"2.0.2"
]
]
},
{
"name": "cryptography",
"specs": [
[
"==",
"45.0.6"
]
]
},
{
"name": "cffi",
"specs": [
[
"==",
"1.17.1"
]
]
},
{
"name": "cachetools",
"specs": [
[
"==",
"6.2.0"
]
]
},
{
"name": "authlib",
"specs": [
[
"==",
"1.6.3"
]
]
},
{
"name": "isodate",
"specs": [
[
"==",
"0.7.2"
]
]
},
{
"name": "decorator",
"specs": [
[
"==",
"5.2.1"
]
]
},
{
"name": "dnspython",
"specs": [
[
"==",
"2.7.0"
]
]
},
{
"name": "docstring-parser",
"specs": [
[
"==",
"0.17.0"
]
]
},
{
"name": "docutils",
"specs": [
[
"==",
"0.22"
]
]
},
{
"name": "more-itertools",
"specs": [
[
"==",
"10.7.0"
]
]
},
{
"name": "lazy-object-proxy",
"specs": [
[
"==",
"1.12.0"
]
]
},
{
"name": "markdown-it-py",
"specs": [
[
"==",
"4.0.0"
]
]
},
{
"name": "mdurl",
"specs": [
[
"==",
"0.1.2"
]
]
},
{
"name": "propcache",
"specs": [
[
"==",
"0.3.2"
]
]
},
{
"name": "pycparser",
"specs": [
[
"==",
"2.22"
]
]
},
{
"name": "pywin32",
"specs": [
[
"==",
"311"
]
]
},
{
"name": "rfc3339-validator",
"specs": [
[
"==",
"0.1.4"
]
]
},
{
"name": "rich-rst",
"specs": [
[
"==",
"1.3.1"
]
]
},
{
"name": "six",
"specs": [
[
"==",
"1.17.0"
]
]
},
{
"name": "aiohttp",
"specs": [
[
"==",
"3.12.15"
]
]
},
{
"name": "aiosignal",
"specs": [
[
"==",
"1.4.0"
]
]
},
{
"name": "aiohappyeyeballs",
"specs": [
[
"==",
"2.6.1"
]
]
},
{
"name": "frozenlist",
"specs": [
[
"==",
"1.7.0"
]
]
},
{
"name": "yarl",
"specs": [
[
"==",
"1.20.1"
]
]
}
],
"lcname": "china-stock-mcp"
}