china-stock-mcp


Namechina-stock-mcp JSON
Version 0.1.7 PyPI version JSON
download
home_pageNone
SummaryMCP server that provides access to Chinese stock market data using akshare
upload_time2025-09-02 07:54:07
maintainerNone
docs_urlNone
authorpostback
requires_python>=3.12
licenseMIT
keywords akshare stock mcp mcp-server
VCS
bugtrack_url
requirements uvicorn starlette fastmcp akshare akshare-one pydantic pydantic-core annotated-types pandas numpy httpx httpcore h11 anyio sniffio rich pygments python-dotenv pyyaml requests email-validator jsonschema jsonschema-path jsonschema-specifications openapi-core openapi-pydantic openapi-schema-validator openapi-spec-validator rpds-py python-dateutil pytz typing-extensions beautifulsoup4 soupsieve html5lib webencodings lxml charset-normalizer idna certifi urllib3 tqdm tabulate openpyxl xlrd cryptography cffi cachetools authlib isodate decorator dnspython docstring-parser docutils more-itertools lazy-object-proxy markdown-it-py mdurl propcache pycparser pywin32 rfc3339-validator rich-rst six aiohttp aiosignal aiohappyeyeballs frozenlist yarl
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 1.70077s