Stacklok Toolhive MCP Server
Markdown 格式使用说明
项目简介
- 该仓库实现一个基于 MCP 协议的后端服务器,围绕 Stacklok Toolhive 文档构建知识上下文服务。核心能力包括:向 LLM 客户端提供文档检索、获取文档片段(chunk)、以及与外部功能的调用能力;同时集成了本地嵌入模型、向量检索、缓存的文档源同步等完整工作流。
主要功能点
- MCP 服务端实现
- 提供 MCP 工具(Tools),目前实现了 query_docs(文档检索/查询)和 get_chunk(按 Chunk ID 获取完整内容)两项核心能力。
- 通过 FastMCP 框架暴露接口,支持 Streamable HTTP 传输,便于与 LLM 客户端进行 JSON-RPC 交互。
- 错误与遥测处理:结合 McpError、OpenTelemetry 日志与可观测性输出。
- 文档源同步与处理
- 支持网站爬取与 GitHub 仓库中文档的抓取、解析和缓存。
- 解析阶段使用 HTML Parser 与 Markdown Parser,提取主内容、标题、代码块、链接、元数据等信息。
- Chunker 根据设置的 token/块策略将文本分块,便于嵌入与向量检索。
- 本地嵌入与向量检索
- 使用本地嵌入模型(fastembed)生成嵌入向量,存储在 SQLite + sqlite_vec 的向量表中。
- 向量检索支持 semantic、keyword、hybrid 三种查询模式,以及基于 BM25 的关键词检索。
- 提供 get_chunk、query_docs 的检索结果输出结构,包含分块信息、分数、元数据等。
- 向量存储与元数据
- 以 SQLite 数据库保存 chunks、向量、以及元数据;提供健康检查、数据库完整性校验、原子交换等实现。
- 服务器管理与刷新
- 支持后台刷新(RefreshOrchestrator),在服务器启动时自动初始化(如配置允许时)。
- 提供启动/关闭的清理与调度逻辑,确保服务器与数据库之间的并发安全。
- 可观测性与监控
- 集成 OpenTelemetry 日志/追踪能力,支持日志/追踪端点地址配置,默认启用。
- 配置与扩展
- 通过 YAML 配置文件 sources.yaml 控制网站与 GitHub 的数据源,以及抓取参数、重试、并发等行为。
- 配置加载、校验、环境变量覆盖等机制完善,确保在不同环境中可灵活使用。
安装步骤
- 准备环境
- 安装 Python 3.13+(或按项目实际要求的版本)。
- 安装并配置 uv(项目示例中以「uv」作为任务/启动工具)。
- 安装依赖与准备
- 通过 uv(或等效工具)安装依赖,确保数据库、嵌入模型、以及向量检索所需库就绪。
- 获取与配置
- 将示例配置拷贝并修改为实际环境使用:sources.yaml(网站与 GitHub 来源、抓取参数等)。
- 如需开启遥测,按环境变量配置 OTEL_ENABLED、OTEL_ENDPOINT、OTEL_SERVICE_NAME、OTEL_SERVICE_VERSION 等。
- 启动 MCP 服务器
- 运行命令:uv run python src/mcp_server.py
- 服务器默认监听端口 8080,允许跨域和多传输协议(streamable-http)。
- 运行后端服务的快速检查
- 访问健康端点,检查服务是否正常启动。
- 通过 MCP 客户端对 query_docs、get_chunk 等工具发起请求,验证 JSON-RPC 的响应结构。
服务器配置参考(MCP 客户端需要的最小信息) JSON 配置示例(仅为客户端参考,不需要额外代码) { "server_name": "toolhive-doc-mcp", "command": "uv", "args": ["run", "python", "src/mcp_server.py"], "host": "0.0.0.0", "port": 8080 } 配置注释与要点
- server_name: MCP 服务器的名称,需与服务器实际用途一致,便于客户端管理与日后追踪。
- command: 服务器启动命令的主程序(此处为 uv)。
- args: 启动时传递给命令的参数集合,按仓库约定应包含启动 MCP 服务的子命令与入口脚本。
- host/port: 服务器监听地址与端口,默认 0.0.0.0:8080,与代码中配置一致(port 由 config.mcp_port 控制,默认 8080)。
- 备注:MCP 客户端通过该配置知道如何启动并连接到服务器;客户端本身不需要理解服务器内部实现细节。
基本使用方法
- 启动服务器
- 使用 MCP 客户端通过配置中的命令启动服务器(示例已给出)。
- 发送请求请参考 MCP 协议
- 通过客户端向服务器发送 JSON-RPC 请求,调用工具 query_docs 获取文档检索结果,或调用 get_chunk 获取指定 Chunk 的详细内容。
- 请求参数包含 query、limit、query_type、min_score 等,响应返回结构包含检索结果、分数、元数据等。
- 典型工作流程
- 服务器启动后,客户端发送 JSON-RPC 请求调用 query_docs,携带查询文本与可选参数,服务器返回带分数的 Chunk 列表。
- 客户端也可通过 get_chunk 按 Chunk ID 获取完整内容,便于在 LLM 的上下文中嵌入具体文本段落。
- 常见运维操作
- 监控日志与遥测端点,确保 OTLP 日志/追踪正常输出。
- 如需更新文档源,调整 sources.yaml 并触发构建/同步流程,确保向量数据库与元数据保持一致。
- 如遇数据库热更新,系统支持原子交换与回滚,确保服务不中断。
关键词 文档检索、向量检索、本地模型、嵌入、服务器端 API
category_id 5