Skip to main content
Glama
jarvislee90s-dot

local-datasource

README.md
# Local Datasource

一个**本地运行的 MCP(Model Context Protocol)数据服务器**。它让任何支持 MCP 的 Agent(Claude Code、Codex、Cursor、OpenCode 等)都能直接查询金融市场、宏观经济和学术论文数据,而无需第三方账号、不消耗云额度、不经过外部中继。

---

## 一句话介绍

`local-datasource` 把 `akshare`、`yfinance`、`wbgapi`、`arxiv` 等免费公开接口封装成 16 个标准 MCP tool,覆盖 A股/港股/美股/ETF/期货/指数/期权行情、债券与可转债、全球利率与波动率(美债收益率/美联储利率/美元指数/VIX)、汇率、商品现货、带生效区间的交易规则参数表、多序列对齐合并、世界银行宏观指标与 arXiv 论文,Agent 只需要像调用本地函数一样请求数据,即可获得结构化 CSV 输出。

---

## 为什么需要这个项目

在日常投研、尽调、学术检索或自动化报告生成中,Agent 经常需要实时数据:

- 查一只股票过去一年的走势
- 对比黄金、美股、A股等多资产表现
- 拉取某个国家的 GDP/CPI 数据
- 检索某个领域的 arXiv 论文

这些需求本身并不复杂,但常见方案要么需要登录某个平台并消耗额度,要么把查询请求发到云端。`local-datasource` 希望提供一种**透明、可控、低成本**的替代方案:

- **数据请求不出本机**:适合对合规、隐私敏感的场景。
- **无需账号和额度**:基于公开接口,安装完就能用。
- **标准 MCP 协议**:不绑定任何特定 Agent,可被多家产品复用。
- **源码可见、可扩展**:增加新数据源或调整输出格式都很直接。

---

## 核心特点

- ✅ **A股 / 港股 / 美股**:日线行情,支持前复权/后复权。
- ✅ **美股 / 美股 ETF / 全球资产**:默认 `akshare` 美股接口,可回退 `yfinance`(A股场内 ETF 见 `query_etf`)。
- ✅ **世界银行宏观指标**:GDP、CPI、人口等。
- ✅ **arXiv 论文搜索**:标题、作者、摘要、PDF 链接结构化输出。
- ✅ **中国境内债券**:国债收益率曲线、信用债发行信息(按代码或发行人查)、交易所行情。
- ✅ **可转债**:一览含溢价率、强赎/回售条款、历史K线、发行人正股财务报表。
- ✅ **国内期货**:单合约(全历史)/主连日线与分钟、品种挂牌合约清单。
- ✅ **国内指数**:沪深指数(2014 起)与中证系列日线,沪深指数分钟。
- ✅ **A股场内 ETF**:日线(2012 起全历史)与分钟。
- ✅ **期权**:ETF 期权与股指期权(IO/HO/MO)的到期月份、合约清单、单合约日线。
- ✅ **A股个股分钟**:`query_stock(period=min)`,与日线同一入口。
- ✅ **全球利率与波动率**:美债收益率曲线、美联储 EFFR、美元指数(东财失败回退 Yahoo)、VIX(CBOE 直连)。
- ✅ **汇率**:央行官方中间价、中行牌价、离岸 USDCNH、主要货币对交叉盘。
- ✅ **商品现货**:上金所贵金属日线、生意社大宗现货(含主力合约价与基差)。
- ✅ **对齐合并**:多份本库产出的 CSV 按日期合并成宽表(支持周/月重采样),纯本地计算。
- ✅ **交易规则参数表**:印花税/过户费/涨跌幅/保证金/T+1 等参数按 `as_of` 取当日生效值(含生效区间、来源与四档置信度标注);商品期货参数不入表、返回查交易所当日结算参数的引导。
- ✅ **金融输入归一化**:股票/债券的名称、简称、全称、发行人 → 统一代码(`resolve_stock_code` + `bond_issue`)。
- ✅ **统一 CSV 输出**:每个 tool 都把结果写到 `file_path`,并返回前 5 行预览。
- ✅ **零 API Key**:所有默认数据源均免费使用。
- ✅ **跨 Agent 复用**:标准 MCP Server,配置一条 `command` 即可接入。

---

## 适用人群

- 需要在 Agent 工作流里频繁查数据的投研、分析师、开发者。
- 不希望把查询请求发送到云端的本地优先用户。
- 想学习/定制 MCP 数据服务器实现的开发者。

---

## 快速开始

要求:Python >= 3.10。

```bash
# 1. 克隆并安装
git clone https://github.com/jarvislee90s-dot/local-datasource.git
cd local-datasource
pip install -e .

# 2. 启动 MCP 服务
local-datasource

# 3. 在 Agent 的 MCP 配置中添加
{
  "mcpServers": {
    "local-datasource": {
      "command": "local-datasource"
    }
  }
}
```

---

## 覆盖范围

| 数据类型 | 工具 | 底层接口 | 是否需 API Key |
|---|---|---|---|
| A股(日线含换手率/流通股本/成交额,分钟)/ 港股 / 美股 历史行情 | `query_stock` | `akshare` | 否 |
| 美股 / 美股 ETF / 全球资产 | `query_yfinance` | `akshare`(默认)/ `yfinance`(备选) | 否 |
| 世界银行宏观指标 | `query_worldbank` | `wbgapi` | 否 |
| arXiv 学术论文 | `query_arxiv` | `arxiv` | 否 |
| 中国境内债券(国债收益率曲线/信用债发行信息/交易所行情) | `query_bond` | `akshare` | 否 |
| 可转债(一览/条款/历史K线/发行人财务) | `query_convertible_bond` | `akshare` | 否 |
| 股票名称(简称/全称)→ 代码候选 | `resolve_stock_code` | 新浪 suggest API / `akshare` | 否 |
| 国内期货(单合约/主连行情、合约清单) | `query_futures` | `akshare`(新浪/交易所官方) | 否 |
| 国内指数(沪深/中证系列,日线/分钟) | `query_index` | `akshare`(新浪/腾讯/中证官网) | 否 |
| A股场内 ETF(日线/分钟) | `query_etf` | `akshare`(新浪/腾讯) | 否 |
| 期权(ETF期权/股指期权:月份/清单/日线) | `query_options` | `akshare`(新浪/上交所/CFFEX) | 否 |
| 美债收益率/美联储 EFFR/美元指数/VIX(全球利率与波动率) | `query_global_rates` | 东财数据中心 / 新浪 / 纽约联储 / CBOE / yfinance(回退) | 否 |
| 汇率(官方中间价/中行牌价/离岸 USDCNH/主要货币对) | `query_fx` | 外汇局 / 新浪 / yfinance | 否 |
| 商品现货(上金所贵金属/生意社大宗含基差) | `query_spot` | `akshare`(上金所/生意社 100ppi) | 否 |
| 多序列对齐合并(宽表/重采样,纯本地) | `align_series` | 本地 `pandas` 计算(不联网) | 否 |
| 交易规则参数(税费/涨跌幅/保证金/T+1 等,按生效区间) | `query_trading_rules` | 包内静态表(附录 B 调研) | 否 |

---

## 金融输入归一化

用户给金融标的时可能贴代码、简称、全称或发行人名。本服务支持先把输入归一化为统一代码再查询:

- **股票**:公司简称/全称 → `resolve_stock_code` → 代码候选 → `query_stock`(新浪 suggest API 支持全称反查)
- **标债**:发行人名 → `query_bond(kind=issue_info, bond_issue=...)` → 最新一只债代码 → 继续查基本信息/财务
- **可转债**:正股简称 → `query_convertible_bond(kind=overview, keyword=...)` → 该公司转债
- **发行人财务**:任意债代码/发行人名 → 先归一化到代码 → `query_convertible_bond(kind=issuer_finance, ...)`
- **期货**:直接给合约/主连代码(`IM2612`/`IM0`/`IM主连` 自动归一);查挂牌合约用 `query_futures(kind=contracts, symbol=品种如IM)`(合约清单走交易所官方挂牌表,DCE/GFEX 品种忽略 `trade_date`,返回当前挂牌)
- **指数**:`000852`/`sh000300` 自动补交易所前缀走新浪;中证系列 `930xxx/950xxx` 自动走中证官网源(慢约 10 秒,无分钟)
- **ETF**:`510300` 按首位自动补 `sh`/`sz` 前缀
- **期权**:先 `query_options(kind=months/contracts, underlying=...)` 拿到期月份/合约代码,再 `kind=hist` 查日线;合约代码宽容格式(`IO2706-P-5600` 与 `io2706p5600` 等价)

城投/非上市发行人无上市股票,`resolve_stock_code` 返回空候选;其债券的 `issuer_finance` 返回引导性提示(免费层无财务,建议查 Wind/企业预警通)。

---

## 架构

```
Agent(Claude Code / Codex / Cursor / OpenCode 等)
        ↓ MCP stdio
local-datasource(本仓库)
        ↓ 直接调用
akshare / yfinance / wbgapi / arxiv / requests(HTTP 直连)
        ↓ 原始数据源
新浪 / 腾讯 / 东财数据中心 / 交易所官网 / 中证指数 / 同花顺 / 外汇局 / 上金所 / 生意社 / 纽约联储 / CBOE / Yahoo Finance / World Bank / arxiv.org
```

---

## 文件结构

```
.
├── SKILL.md                        # Agent 执行手册
├── README.md                       # 项目介绍(本文档)
├── CHANGELOG.md                    # 里程碑变更记录
├── pyproject.toml                  # Python 包配置与依赖
├── config.yaml                     # 可选配置文件
├── src/local_datasource/           # MCP server 源码
│   ├── server.py                   # 服务入口:注册 tools、处理调用
│   ├── cli.py                      # download 批量下载子命令(唯一写缓存的入口)
│   ├── cache.py                    # 下载缓存纯函数:key/路径/manifest/新鲜度
│   ├── config.py                   # 加载 config.yaml / 环境变量
│   ├── formatters.py               # 统一 CSV 输出与预览
│   ├── assets/
│   │   └── trading_rules.yaml      # 交易规则参数静态表(附录 B 调研,随包分发)
│   └── providers/                  # 各数据源适配器
│       ├── common.py               # 共享工具:日期过滤、分钟深度守卫、腾讯分钟路径
│       ├── stock.py                # A/HK/US 股票(日线/A股分钟)+ resolve_stock_code 名称反查
│       ├── yahoo.py                # 美股/全球资产
│       ├── worldbank.py            # 世界银行
│       ├── arxiv.py                # arXiv 论文
│       ├── bond.py                 # 中国境内债券(国债收益率/信用债发行/交易所行情)
│       ├── convertible_bond.py     # 可转债(一览/条款/历史K线/发行人财务)
│       ├── futures.py              # 国内期货(行情/合约清单)
│       ├── index.py                # 国内指数(沪深/中证系列)
│       ├── etf.py                  # A股场内 ETF
│       ├── options.py              # 期权(ETF/股指:月份/清单/日线)
│       ├── global_rates.py         # 全球利率(美债收益率/美联储 EFFR/美元指数/VIX)
│       ├── fx.py                   # 外汇(中间价/中行牌价/离岸 USDCNH/交叉盘)
│       ├── spot.py                 # 现货(上金所贵金属/生意社大宗含基差)
│       ├── align.py                # 多序列对齐合并(宽表/重采样,纯本地)
│       └── rules.py                # 交易规则参数表(按 as_of 取生效值,纯本地)
└── demos/                          # 示例脚本
    └── mcp_query_demo.py           # 多资产查询 + 归一化走势图
```

---

## 依赖

- Python >= 3.10
- `mcp`:MCP 服务器框架
- `akshare`:A股/港股/美股/ETF/债券/可转债 行情
- `yfinance`:Yahoo Finance 备选接口
- `wbgapi`:世界银行数据
- `arxiv`:arXiv 论文搜索
- `pandas`:数据处理
- `pyyaml`:配置文件解析
- `requests`:新浪 suggest API(股票名称反查)

可选:
- `matplotlib`:运行 `demos/mcp_query_demo.py` 绘图

---

## 安装

```bash
pip install -e .
```

安装完成后,`local-datasource` 命令会被加入 PATH。

---

## 启动 MCP 服务

```bash
local-datasource
```

服务通过标准输入输出(stdio)与 Agent 通信。可以用以下命令快速验证是否启动成功:

```bash
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' | local-datasource
```

若返回初始化结果,说明服务正常。

---

## 批量下载(download 命令)

除了作为 MCP 服务被 Agent 调用,本库还提供一个**批量下载子命令**,把常用数据在本地预取成 CSV 缓存,供回测、研究复用:

```bash
local-datasource download --config FILE [--data-dir DIR] [--force]
```

- `--config`(必填):清单 YAML 路径
- `--data-dir`:缓存根目录;优先级 **CLI `--data-dir` > 清单顶层 `data_dir` > `config.yaml` 的 `cache.data_dir`**
- `--force`:忽略"当天已拉取"的新鲜度判断,强制重新下载

清单 YAML 格式(`assets` 列表,每条 `{tool, args, start_date?, end_date?}`):

```yaml
# batch.yaml
data_dir: ./datasource-cache   # 顶层可选;CLI --data-dir 优先
assets:
  - tool: query_global_rates
    args: {kind: us_treasury, tenure: all}
  - tool: query_stock
    args: {ticker: "600519", market: a, adjust: qfq, period: daily}
    start_date: "2025-01-01"   # 可选:合并进 args;与 args 内同名值同时存在时,这里优先
    end_date: "2025-12-31"
  - tool: query_fx
    args: {kind: mid, currency: usd,eur}
```

支持的 `tool` 白名单为 13 个查询工具(`query_stock`/`query_yfinance`/`query_worldbank`/`query_arxiv`/`query_bond`/`query_convertible_bond`/`query_futures`/`query_index`/`query_etf`/`query_options`/`query_global_rates`/`query_fx`/`query_spot`)。`resolve_stock_code`(名称反查)、`align_series`(本地对齐)、`query_trading_rules`(M4 静态规则表)**不支持**出现在清单中——它们不产出待缓存的行情序列。未知 tool 名、缺 `args` 会在启动时一次性报错并列出合法 tool 名,校验全部通过后才开始下载。

每条目输出一行状态:

- `SKIP <tool>/<key>`:当天已拉取过(manifest 的 `last_fetched` 为今天)且未 `--force`,直接复用缓存
- `FETCH <tool>/<key> <rows> rows`:调用 provider 下载并写入缓存
- `FAIL <tool>/<key> <error>`:该条目失败;**单条失败不中断整批**,全部条目跑完后只要存在失败,退出码为 `1`(全部成功 `0`,清单/用法错误 `2`)

缓存目录布局:每条目落在 `<data_dir>/<tool>/<key>.csv`,旁边有同名的 `<key>.manifest.json` 元信息(含 args、行数、首末日期、`last_fetched`)。`key` 由工具名与参数生成,可读且末尾带 8 位哈希,例如:

```
datasource-cache/
└── query_global_rates/
    ├── query_global_rates-kind-us_treasury-tenure-all-1a2b3c4d.csv
    └── query_global_rates-kind-us_treasury-tenure-all-1a2b3c4d.manifest.json
```

> **架构说明**:MCP 查询路径**不做任何缓存**,永远直连数据源;`download` 是唯一写缓存的入口。缓存仅供用户显式预取/复用,不会让 Agent 拿到过期数据。

---

## Agent 配置示例

任何支持 MCP 的 Agent 都可以通过 `command` 方式调用本服务。

### Claude Code

`claude_mcp_settings.json`:

```json
{
  "mcpServers": {
    "local-datasource": {
      "command": "local-datasource"
    }
  }
}
```

### Codex

`.codex/config.json`:

```json
{
  "mcpServers": {
    "local-datasource": {
      "command": "local-datasource"
    }
  }
}
```

### Cursor / Windsurf / OpenCode

在对应 MCP 配置中添加:

```json
{
  "mcpServers": {
    "local-datasource": {
      "command": "local-datasource"
    }
  }
}
```

---

## 调用数据案例

### 查询 A 股:贵州茅台

```json
{
  "ticker": "600519",
  "market": "a",
  "start_date": "2025-06-01",
  "end_date": "2026-06-24",
  "file_path": "/tmp/moutai.csv"
}
```

Tool:`query_stock`

### 查询港股:腾讯

```json
{
  "ticker": "00700",
  "market": "hk",
  "start_date": "2025-06-01",
  "end_date": "2026-06-24",
  "file_path": "/tmp/tencent.csv"
}
```

Tool:`query_stock`

### 查询美股/ETF:黄金 GLD

```json
{
  "ticker": "GLD",
  "period": "1y",
  "file_path": "/tmp/gld.csv"
}
```

Tool:`query_yfinance`

默认使用 `akshare` 的美股日线接口;若需要 Yahoo Finance 数据,添加 `"use_yfinance": true`:

```json
{
  "ticker": "AAPL",
  "period": "1y",
  "use_yfinance": true,
  "file_path": "/tmp/aapl_yahoo.csv"
}
```

### 查询世界银行:中国 GDP 现价

```json
{
  "indicator": "NY.GDP.MKTP.CD",
  "country": "CHN",
  "start_year": 2020,
  "end_year": 2023,
  "file_path": "/tmp/china_gdp.csv"
}
```

Tool:`query_worldbank`

### 搜索 arXiv 论文

```json
{
  "query": "large language model retrieval augmented generation",
  "max_results": 10,
  "sort_by": "relevance",
  "file_path": "/tmp/llm_rag.csv"
}
```

Tool:`query_arxiv`

### 查询国债收益率曲线

```json
{
  "kind": "yield_curve",
  "start_date": "2025-01-01",
  "end_date": "2025-06-30",
  "file_path": "/tmp/bond_yield.csv"
}
```

Tool:`query_bond`(kind=`yield_curve`)

### 查询信用债发行信息

```json
{
  "kind": "issue_info",
  "bond_code": "2180495.IB",
  "file_path": "/tmp/bond_issue.csv"
}
```

Tool:`query_bond`(kind=`issue_info`,`bond_code` 精确匹配单只,支持 `2180495.IB` / `2180495` 格式,避免子串误命中)

### 按发行人查最新一只债

```json
{
  "kind": "issue_info",
  "bond_issue": "成都东方广益",
  "file_path": "/tmp/bond_by_issuer.csv"
}
```

Tool:`query_bond`(kind=`issue_info`,`bond_issue` 按发行人查,返回发行日期最新的一只债代码;与 `bond_code` 互斥)

### 查询可转债一览

```json
{
  "kind": "overview",
  "file_path": "/tmp/cb_overview.csv"
}
```

Tool:`query_convertible_bond`(kind=`overview`,返回全市场转债含转股溢价率/评级/规模,可选 `keyword` 按简称过滤)

### 查询发行人财务报表

```json
{
  "kind": "issuer_finance",
  "stock_code": "sh603938",
  "report_type": "资产负债表",
  "file_path": "/tmp/issuer_finance.csv"
}
```

Tool:`query_convertible_bond`(kind=`issuer_finance`,`bond_code`/`stock_code` 二选一;城投/非上市发行人返回引导性提示而非报错)

### 股票名称反查代码

```json
{
  "keyword": "贵州茅台酒股份有限公司",
  "file_path": "/tmp/resolve_stock.csv"
}
```

Tool:`resolve_stock_code`(首选新浪 suggest API,简称精确命中、全称从关联字段提取代码;城投/非上市发行人返回空候选;多候选时择一再调 `query_stock`)

### 查询期货:IM 主连日线

```json
{
  "symbol": "IM0",
  "period": "daily",
  "start_date": "2026-06-01",
  "end_date": "2026-08-28",
  "file_path": "/tmp/im_main.csv"
}
```

Tool:`query_futures`(单合约改 `symbol: IM2612` 得全历史;分钟加 `period: min`,深度约 4 个交易日,超覆盖报错并给补数指引)

### 查询指数:中证1000 日线

```json
{
  "symbol": "000852",
  "period": "daily",
  "start_date": "2014-10-17",
  "end_date": "2026-08-28",
  "file_path": "/tmp/csi1000.csv"
}
```

Tool:`query_index`(中证系列 `930xxx` 走中证官网源,慢约 10 秒、无分钟数据)

### 查询 ETF:沪深300ETF 分钟

```json
{
  "symbol": "510300",
  "period": "min",
  "freq": "1",
  "start_date": "2026-08-25",
  "end_date": "2026-08-27",
  "file_path": "/tmp/etf_min.csv"
}
```

Tool:`query_etf`(日线去 `period/freq` 加日期区间;日线源无复权)

### 查询期权:IO 到期月份 → 单合约日线

```json
{
  "kind": "months",
  "underlying": "IO",
  "file_path": "/tmp/io_months.csv"
}
```

Tool:`query_options`(合约清单 `kind: contracts`;日线 `kind: hist, symbol: "IO2706-P-5600"`)

### 查询美债收益率

```json
{
  "kind": "us_treasury",
  "tenure": "all",
  "file_path": "/tmp/us_treasury.csv"
}
```

Tool:`query_global_rates`(kind=`us_treasury`,`tenure: all` 返回 2/5/10/30 年及 10Y-2Y 利差,1990 年起;短端期限如 `3m` 仅近 1000 交易日;kind=`fed_rate`/`dxy`/`vix` 分别查美联储 EFFR、美元指数(东财失败自动回退 Yahoo)、VIX(CBOE 直连,1990 起))

### 查询汇率中间价

```json
{
  "kind": "mid",
  "currency": "usd,eur",
  "file_path": "/tmp/fx_mid.csv"
}
```

Tool:`query_fx`(kind=`mid` 外汇局官方中间价,1994 年起,单位为 100 外币 = X 人民币;kind=`bochina` 中行牌价需 `symbol` 如"美元"且起止日期必填;kind=`usdcnh`/`cross` 走 Yahoo,不可达时明确报错)

### 查询现货黄金:上金所 Au99.99

```json
{
  "kind": "sge",
  "symbol": "Au99.99",
  "file_path": "/tmp/au9999.csv"
}
```

Tool:`query_spot`(kind=`sge` 上金所贵金属日线,2016-12 起约 10 年深度;kind=`sy` 生意社大宗现货含主力合约价与基差,需 `symbols: ["CU","RB"]` 且起止日期必填、单次区间最长 1 年)

### 对齐合并多份行情 CSV 为宽表

```json
{
  "file_paths": ["/tmp/moutai.csv", "/tmp/gld.csv"],
  "columns": ["close", "close"],
  "names": ["moutai", "gld"],
  "align": "outer",
  "fill": "ffill",
  "file_path": "/tmp/merged.csv"
}
```

Tool:`align_series`(纯本地合并不联网;`columns`/`names` 与 `file_paths` 一一对应,缺省各取 `close`、列名用文件名;`resample: "week"/"month"` 重采样时每期取最后一个实际交易日)

### 查询交易规则参数:A 股某历史日期的印花税

```json
{
  "market": "a",
  "as_of": "2021-06-01",
  "file_path": "/tmp/rules_a.csv"
}
```

Tool:`query_trading_rules`(纯本地读包内静态表;不传 `as_of` 取现行值;`market: "commodity_futures"` 返回查交易所当日结算参数的引导性提示而非报错;输出含生效区间/来源/置信度等 12 个字段,可选 `parameter: "印花税"` 子串过滤)

---

参考 `demos/mcp_query_demo.py`:它通过 MCP 调用多个工具,读取生成的 CSV,计算归一化价格,并绘制对比图。

```bash
python demos/mcp_query_demo.py
```

输出:
- `demos/outputs/*.csv`:各资产原始行情
- `demos/outputs/normalized_returns.png`:归一化走势图
- `demos/outputs/summary.csv`:汇总表

---

## 配置

项目根目录的 `config.yaml`:

```yaml
providers:
  yahoo:
    # 默认使用 akshare。设为 true 则默认使用 yfinance。
    use_yfinance: false
cache:
  # download 批量下载的缓存根目录(默认 ./datasource-cache)。
  # 仅 download CLI 使用;MCP 查询不读写缓存。
  data_dir: ./datasource-cache
```

`cache.data_dir` 只影响 `local-datasource download`(见上文"批量下载");清单顶层 `data_dir` 与 CLI `--data-dir` 都比它优先。

也可通过环境变量指定配置文件:

```bash
LOCAL_DATASOURCE_CONFIG=/path/to/config.yaml local-datasource
```

---

## 扩展新数据源

`src/local_datasource/providers/` 下的每个文件都是一个独立适配器,新增数据源的步骤:

1. 在 `providers/` 新增一个 Python 文件,实现 `query_xxx(...)` 函数,返回 `tuple[str, str]`(文件路径 + 预览文本)。
2. 在 `server.py` 新增一个 `@mcp.tool(structured_output=False)` 薄工具函数:参数注解(`Annotated`/`Literal`/`Field`)即客户端可见 schema,docstring 即工具描述;函数体一行转发 `_safe_summary`。
3. 在 `_summary_for()` 中增加对应路由分支。
4. 更新 `SKILL.md` 和 `README.md` 的 tool 说明。

---

## 测试

测试随仓库分发(`tests/` 目录)。离线单测不连网;联网冒烟默认开启,设 `SKIP_INTEGRATION=1` 跳过:

```bash
python -m pytest tests/ -v              # 全量(含联网冒烟)
SKIP_INTEGRATION=1 python -m pytest tests/ -q   # 仅离线
```

包含配置加载、格式化、缓存与 CLI、15 个 provider 的测试、MCP server 工具注册(16 个 tool)。

---

## 网络环境已知风险

以下为在本机实测(2026-09)确认的数据源网络情况,也是本轮海外数据源选型的依据(CBOE、纽约联储直连可达):

- **东财非 A 股端点部分网络被拒**:东财的全球指数/期货 K 线等非 A 股端点在部分网络环境下不可达(A 股相关端点不受影响)。美元指数已内置 Yahoo 自动回退。
- **金十美联储决议源 2025-09 起停更**:美联储利率已改用纽约联储官方 EFFR API(免 key 直连)。
- **FRED / treasury.gov / stooq 在本机实测不可用**:美债收益率走东财全表(1990 起,短端走新浪),VIX 走 CBOE 官方 CSV 直连,不依赖上述源。

---

## 注意事项

- **分钟数据深度有限**(免费源天花板):期货分钟约 4 个交易日,腾讯源(个股/指数/ETF)约 8 个交易日。请求区间超出覆盖时会**明确报错并提示从 Wind/终端导出 Excel 补数**,不会静默返回残缺数据。
- **慢源与已知限制**:中证系列指数日线走中证官网(约 10 秒,无分钟);ETF 日线无复权(原始价);期权仅日线。期货主连日线为全历史:自品种上市日(或 2005-01-04,取较早)至今,共 83 个主连品种(IF0 特例仅自 2017-01-17 起)。
- **`query_bond(kind=issue_info)` 走中国货币网直连**(akshare 未适配其改版):站点按 IP 限窗口内请求数,单次查询约 75 秒(30 个债券类型节流遍历);触发限流(HTTP 421)时自动退避 4 分钟重试一次,仍限流则如实报错。同一发行人的重复查询建议走 `download` 缓存。
- `yfinance` 容易被 Yahoo Finance 限流,因此默认优先使用 `akshare`。
- `akshare` 的接口可能随时间变化,建议定期更新到较新版本。
- World Bank 和 arXiv 通常稳定且无需 API key。

---

## 与 kimi-datasource 的异同

| 维度 | local-datasource | kimi-datasource |
|---|---|---|
| 运行位置 | 本机 | Kimi Code 云端 |
| 登录/账号 | 不需要 | 需要 Kimi Code 账号 |
| 费用 | 免费(受公开接口限额影响) | 消耗 Kimi Code 额度 |
| 数据源 | A/HK/US 股票、境内债券/可转债、期货、指数、A股 ETF、期权、美股/全球资产、全球利率与波动率(美债/EFFR/美元指数/VIX)、汇率、商品现货(贵金属/大宗含基差)、交易规则参数表、多序列对齐合并、World Bank、arXiv | 更多,包括天眼查、Google Scholar、元典法律等 |
| 数据链路 | Agent → 本地 Server → 公开接口 | Agent → Kimi 云服务 → 后端数据源 |
| 可定制性 | 源码本地可见,可修改/扩展 | 黑盒,只能使用官方暴露的 tool |
| 跨 Agent 复用 | 标准 MCP Server,可被多家 Agent 复用 | 仅限 Kimi Code 内部 |

本项目的设计思路是:把常见的免费/公开数据查询能力做成一个本地、透明、可扩展的 MCP 服务。它并不复制 kimi-datasource 的具体实现(其接口实现并不公开),而是基于公开库重新组合出一套可用的本地替代方案。

TDQS

A3.9/5.0

Scored across 16 tools

Disambiguation4/5

Each tool targets a distinct data domain (e.g., stocks, bonds, futures, FX, spot, rates), and descriptions clearly differentiate overlapping areas like bond vs. convertible_bond. Minor potential confusion exists between query_bond and query_convertible_bond or query_stock and query_yfinance, but the descriptions resolve these ambiguities.

Naming Consistency4/5

The vast majority of tools follow the consistent query_<domain> pattern, making the API predictable. The single exception is align_series, which breaks the pattern but is still intuitive and clearly named.

Tool Count4/5

With 16 tools, the server is slightly above the typical 3-15 range, but the count is justified by the breadth of financial and economic data sources covered. Each tool represents a meaningful asset class or data category, so the size feels deliberate rather than bloated.

Completeness5/5

The tool surface comprehensively covers the data-retrieval needs implied by a local financial datasource: equities, bonds, futures, FX, rates, spot commodities, options, ETFs, indices, and macroeconomic data. It also includes a utility tool for aligning series, avoiding a common workflow gap. No obvious dead ends or missing core operations are apparent for a read-only query server.

Maintenance

ActivityMaintained
ResponsivenessResponsive