Skip to content

Tool Index

面向 AI Agent 的 OpenAPI 文档知识库与混合检索服务。

CI Python MCP License

Tool Index 把多个系统中分散的 OpenAPI 文档整理成一个统一的 API 知识库。AI Agent 不需要一次加载全部工具定义,只需要先搜索,再按需取得目标 API 的完整文档。

Tool Index 架构图

一句话理解

你提供 OpenAPI 文档源,Tool Index 负责采集、结构化、建立索引并提供检索接口;Agent 负责搜索 API、阅读完整文档,并在确认参数后调用真实业务系统。

OpenAPI 文档 → Tool Index 建立知识库 → Agent 搜索并获取 API 文档 → Agent 调用业务 API

Tool Index 的职责到“发现 API 和返回文档”为止,不会代替 Agent 执行业务 API

它是怎么工作的

一次完整使用通常分为两个阶段:

  1. 建立索引:Tool Index 从一个或多个 OpenAPI 文档源拉取数据,统一整理 API 名称、路径、参数、请求体、响应、示例等信息,并写入 SQLite 知识库。
  2. Agent 检索:Agent 通过 MCP 或 HTTP 提交自然语言问题,先用 search_tools 找到候选 API 和证据片段,再用 get_api_doc 获取选中 API 的完整结构化文档。

例如,当用户提出“查询某个用户最近 30 天的订单”时:

  1. Agent 调用 search_tools 搜索与用户订单相关的 API。
  2. Tool Index 综合向量检索和 BM25,返回最相关的候选 API。
  3. Agent 调用 get_api_doc 获取目标 API 的路径、参数、鉴权和响应结构。
  4. Agent 根据文档调用真实订单系统;这一步不经过 Tool Index。

为什么需要 Tool Index

当 Agent 可使用的 API 从几十个增长到几百甚至几千个时,把全部工具定义直接塞进上下文会带来明显问题:

  • 上下文快速膨胀,推理成本增加。
  • 相似 API 难以区分,工具选择准确率下降。
  • API 文档更新后,客户端配置容易失效。
  • 多个系统的接口文档缺少统一发现入口。

Tool Index 把“预先加载所有工具”转换为“按需检索工具”:

用户意图 → 搜索候选 API → 获取完整文档 → Agent 调用真实 API

核心能力

  • 多知识库管理:通过一个 TOML 文件管理多个具名 OpenAPI 文档源。
  • 结构化索引:提取 operation、请求、响应、示例和层级元数据。
  • 混合检索:融合文档向量、可选章节向量和 SQLite FTS5 BM25。
  • 跨库全局排序:候选在统一空间内融合,Query Embedding 只计算一次。
  • 证据片段:返回命中的文档章节,便于 Agent 判断相关性。
  • 完整文档回查:通过 operation_id 获取结构化 API 文档。
  • MCP 与 HTTP:支持 MCP stdio、MCP Streamable HTTP 和 REST。
  • 异步索引重建:按单个知识库或全部知识库触发重建并查询状态。
  • 本地优先存储:使用 SQLite 保存文档、向量和全文索引。

架构说明

架构图中的两条链路分别对应:

  • 索引构建链路:OpenAPI 文档源 → 采集与标准化 → 结构化索引 → SQLite 知识库。
  • Agent 检索链路:用户意图 → MCP / HTTP → 混合检索 → 候选 API 与证据 → 完整 API 文档。

更完整的组件边界、异常路径和 Mermaid 源码见 架构文档

快速开始

1. 准备环境

2. 配置 OpenAPI 文档源

编辑 tool-index.toml。当前文档源协议是:向配置的 URL 发送 JSON POST 请求,并接收 OpenAPI JSON 对象。

[storage]
db_path = ".runtime/tool_index/tools.db"

[service]
require_writer_auth = true

[retrieval]
default_scope = "global"

[knowledge_bases.example_api]
name = "Example API"
url = "https://your-api-doc-service.example.com/openapi/export"
extractor = "standard"
body = { type = "openapi", version = "3.0" }

知识库 key 必须使用小写字母、数字和下划线,并以字母开头。

3. 配置运行环境

默认示例使用本地 Embedding。首次运行会下载模型:

TOOL_INDEX_EMBED_BACKEND=local
TOOL_INDEX_EMBED_MODEL=BAAI/bge-base-zh-v1.5
TOOL_INDEX_EMBED_DIM=768

TOOL_INDEX_SERVICE_ROLE=writer
TOOL_INDEX_AUTH_TOKEN=replace-with-a-strong-token

使用 OpenAI-compatible Embedding 服务时:

TOOL_INDEX_EMBED_BACKEND=openai_compatible
TOOL_INDEX_EMBED_API_BASE_URL=http://127.0.0.1:8001
TOOL_INDEX_EMBED_API_KEY=your-api-key
TOOL_INDEX_EMBED_API_MODEL=your-embedding-model
TOOL_INDEX_EMBED_DIM=1024

模型实际输出维度必须与 TOOL_INDEX_EMBED_DIM 一致。

4. 启动并构建索引

scripts/tool-index start --entry http-service

触发异步重建:

curl -X POST "http://127.0.0.1:8090/v1/index/rebuild?knowledge_base=example_api" \
  -H "Authorization: Bearer replace-with-a-strong-token"

接口返回 job_id 后查询状态:

curl "http://127.0.0.1:8090/v1/jobs/<job_id>" \
  -H "Authorization: Bearer replace-with-a-strong-token"

5. 搜索 API

curl -X POST "http://127.0.0.1:8090/v1/search/tools" \
  -H "Content-Type: application/json" \
  -d '{"query":"查询用户订单","top_k":5}'

指定知识库时,在请求体中增加:

"knowledge_base": "example_api"

MCP 接入

stdio

客户端配置示例:

{
  "mcpServers": {
    "tool-index": {
      "command": "/absolute/path/to/tool_index/scripts/tool-index",
      "args": ["--entry", "mcp-stdio"]
    }
  }
}

Streamable HTTP

scripts/tool-index start --entry mcp-streamable-http

MCP 地址:

http://127.0.0.1:8090/mcp

MCP 工具

工具 作用 权限
list_knowledge_bases 列出可用知识库 读取
search_tools 根据自然语言搜索 API 读取
get_api_doc 按 operation_id 获取完整文档 读取
index_rebuild 异步重建单库或全部索引 Writer
get_job 查询异步任务状态 Writer

HTTP API

方法 路径 说明
GET /v1/health 存活检查
GET /v1/ready 就绪状态与服务角色
POST /v1/search/tools 搜索 API
GET /v1/api-docs/{operation_id} 获取完整 API 文档
POST /v1/index/rebuild 触发异步索引重建
GET /v1/jobs/{job_id} 查询重建任务

完整 HTTP 契约位于 OpenAPI 文件

检索策略

默认启用两条路线:

  • Route B — 文档向量:先召回 operation 文档;可选章节二次排序。
  • Route C — BM25:利用 API 名称、参数和描述中的精确关键词。

Route A 章节向量可通过环境变量启用。多个活跃路线通过加权 RRF 融合;全局搜索会先汇总所有知识库候选,再生成统一 Top K。

TOOL_INDEX_ENABLE_ROUTE_A=false
TOOL_INDEX_ENABLE_ROUTE_B=true
TOOL_INDEX_ENABLE_ROUTE_B_SECTION_RERANK=false
TOOL_INDEX_ENABLE_ROUTE_C=true
TOOL_INDEX_INCLUDE_DEBUG=false

开发与测试

uv run --project apps/python pytest -q
bash scripts/ci/check_contracts.sh
bash -n scripts/tool-index

贡献前请阅读 CONTRIBUTING.md

当前限制

  • OpenAPI 文档源目前需要支持 JSON POST 请求。
  • 异步任务状态保存在进程内存中,服务重启后不会保留。
  • SQLite 适合单机和中等规模知识库;大规模部署需要替换存储适配器。
  • Tool Index 负责发现与文档回查,不直接执行检索到的业务 API。

路线图

  • 支持 OpenAPI GET URL 与本地文件。
  • 增量索引与文档变更检测。
  • 可持久化任务队列。
  • 检索评测集与 Recall@K / MRR 报告。
  • 更多存储与向量数据库适配器。

安全

Writer 接口默认要求 Bearer Token。不要将真实密钥提交到仓库;安全问题请按照 SECURITY.md 私下报告。

许可证

本项目采用 Apache License 2.0

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages