构建 Context7 本地替代方案
耗时约一周,为 AI 代理打造的本地优先文档工具。无云端、无速率限制、查询延迟低于 10 毫秒。
梯形图转SCL | AI模型价格对比 | AI工具导航 | ONNX模型库 | Vibe Coding教程 | PLC在线仿真器 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo
我使用 Context7 作为 MCP 服务器已有数月。这个想法很棒:AI 代理向云服务查询最新的库文档,而非依赖陈旧的训练数据。它大部分时候都能正常工作——直到它失效。
2026 年 1 月,Context7 将免费层从每月约 6000 次请求大幅削减至 1000 次,并新增了每小时 60 次请求的速率限制。我在第一周就触及了这些限制。突然间,在编码过程中,我的 AI 助手变得……毫无用处。当我需要 Next.js 16 的内容时,它开始幻觉出 Next.js 14 的模式;当我需要 AI SDK v6 完全不同的代理循环 API(内置工具编排)时,它却建议使用旧版 AI SDK v4 的 streamText 回调风格。这正是 Context7 本应解决的问题。
于是我构建了自己的版本。耗时约一周,大部分时间与 Claude Code 结对编程。成果是 Context ——一个 AI 代理的本地优先文档工具。无云端、无速率限制、查询延迟低于 10 毫秒。文档是可移植的 .db 文件,构建一次即可与整个团队共享。
以下是它的实现过程和我的心得。
1、"顿悟时刻":为何不直接将文档存储在本地?
核心洞察出奇地简单。Context7 和 Deepcon 等云端文档服务做三件事:
- 克隆库的文档仓库
- 将 Markdown 索引为可搜索的分块
- 通过 API 提供结果
步骤 1 和 2 只需每个库版本执行一次。但这些服务在服务器上运行它们,并为步骤 3 按次收费。每一次。每一次。
为何不将步骤 1 和 2 在本地执行,将结果存储为文件,完全跳过网络?
这就是全部理念。context add https://github.com/vercel/next.js 会克隆仓库、解析文档、将所有内容索引到 SQLite 数据库,并将其存储在 ~/.context/packages/nextjs@16.0.db。完成。该 .db 文件现在包含 Next.js 16 的每一篇文档,预索引并准备好即时查询。无需互联网、无速率限制、无月度账单。
2、使用 Claude Code 构建
我使用 Claude Code 作为主要开发伙伴构建了整个项目。不是作为“生成样板代码并修复它”的助手——而是作为架构决策、实现和调试的真正协作者。
2.1 技术栈
这是一个 TypeScript 单仓库项目。以下是底层技术:
better-sqlite3— 嵌入式数据库。无服务器、无配置、仅一个文件。这是使整个系统运作的关键选择。- SQLite FTS5 — 全文搜索,支持 BM25 排名和 Porter 词干提取。对于本质上仅几行 SQL 的代码,搜索质量出奇地好。
@modelcontextprotocol/sdk— MCP 服务器 SDK。这使得 Claude、Cursor、VS Code Copilot 等能够查询文档。remark-parse+unified— Markdown AST 解析。用于智能分块而非简单的文本分割。commander+@inquirer/prompts— 带有交互式标签选择提示的 CLI 框架。
2.2 构建管道的工作原理
当您运行 context add <repo> 时,实际发生以下步骤:
1. 源检测。 CLI 会判断您提供的是 Git URL、本地目录还是预构建的 .db 文件。Git URL 解析本身支持 GitHub、GitLab、Bitbucket、Codeberg、SSH 简写(git@host:user/repo)和单仓库 URL 模式。
2. 浅克隆。 git clone --depth 1 ——我们只需要文档,而非完整历史。CLI 会获取可用标签并让您交互式选择版本,或通过 --tag v16.0.0 实现自动化。
3. 文档文件夹检测。 自动扫描 docs/、documentation/ 或 doc/ 目录。尊重 .gitignore。按语言过滤——默认为英语,但支持 --lang all 以处理多语言仓库。
4. Markdown 解析和分块。 这是有趣的部分。解析器:
- 提取 YAML 前置元数据中的标题和描述
- 按 H2 标题分块(文档的自然单元)
- 目标为每块约 800 个 token,硬性限制为 1200
- 超大节首先在代码块边界处分割,然后在段落边界处分割
- 过滤目录节(通过链接比例 >50% 检测)
- 剥离 MDX 特定的 React 标签(
<AppOnly>、<PagesOnly>等) - 使用内容哈希对相同节进行去重
5. SQLite 打包。 所有内容都放入单个 .db 文件:
CREATE TABLE chunks (
id INTEGER PRIMARY KEY,
doc_path TEXT NOT NULL,
doc_title TEXT NOT NULL,
section_title TEXT NOT NULL,
content TEXT NOT NULL,
tokens INTEGER NOT NULL,
has_code INTEGER DEFAULT 0
);
CREATE VIRTUAL TABLE chunks_fts USING fts5(
doc_title, section_title, content,
content='chunks', content_rowid='id',
tokenize='porter unicode61'
);
带有 Porter 词干提取的 FTS5 虚拟表意味着“authentication middleware”无需任何花哨的 NLP 即可匹配“authenticating in middleware”。BM25 排名将节标题的权重设为正文内容的 10 倍,文档标题设为 5 倍,这使得结果感觉相关,无需嵌入向量。
2.3 搜索管道:保持简单
当 Claude(或任何 MCP 客户端)调用 get_docs({ library: "nextjs@16.0", topic: "middleware" }) 时,搜索管道完全在进程内运行:
FTS5 查询 → BM25 排名 → 相关性过滤 → Token 预算 → 合并相邻 → 格式化
相关性过滤器会丢弃任何得分低于顶部结果 50% 的内容。Token 预算将输出限制在 2000 个 token——足够有用而不会淹没上下文窗口。来自同一文档的相邻块会重新合并,以便 AI 看到连贯的节而非片段。
总延迟:低于 10 毫秒。相比之下,云端往返需要 100-500 毫秒,加上 AI 代理等待才能继续推理的时间。
这比听起来更重要。AI 编码代理每次会话会进行数十次工具调用。如果每次文档查找增加 300 毫秒的网络延迟,那么每次交互就会有数秒的死时间。在本地,这实际上是免费的。
2.4 真正的胜利:构建一次,随处共享
这是我最兴奋的功能,也是我认为云端服务根本无法匹配的功能。
当您构建文档包时,结果是单个 .db 文件。该文件是完全自包含的——元数据、内容、搜索索引、一切。您可以:
# 构建并导出
context add https://github.com/your-org/design-system \
--name design-system --pkg-version 3.1 --save ./packages/
# 结果:可移植文件
ls -la packages/design-system@3.1.db
# 2.4 MB - 您的整个设计系统文档,已索引并准备就绪
现在以任何方式共享该文件。上传到 S3 存储桶。提交到仓库。放在共享驱动器上。您的队友使用以下命令安装:
context add https://your-cdn.com/design-system@3.1.db
他们端无需构建步骤、无需克隆仓库、无需等待索引。预构建的包会立即安装,因为它已经索引过。
这是本地优先的关键架构优势。 使用云服务时,每个用户都支付查询成本。使用本地包时,您只需支付一次构建成本并分发结果。这与编译二进制文件与解释脚本的原理相同——提前完成昂贵的工作。
对于内部库来说,这意义重大。您可以记录内部 API,在 CI 中构建包,将其与 npm 包一起发布,团队中的每个开发者都能即时、私密、离线地访问最新文档。没有云服务能看到您的专有 API 查询。
2.5 使用 Claude Code 的心得
以下是我使用 Claude Code 作为主要开发工具的一些诚实观察:
它确实擅长管道代码。 Git URL 解析、CLI 参数处理、SQLite 模式设计——这些繁琐但需要正确的代码类型。Claude Code 快速而准确地完成了这些工作。git 模块处理了我没想到的边缘情况:单仓库标签格式如 @ai-sdk/gateway@1.2.3、SSH 简写 URL、从仓库名称中剥离 -docs 后缀。
它在“品味”决策上挣扎。 例如:分块大小应该是多少?我们应该多积极地过滤低相关性结果?哪些 BM25 权重感觉合适?这些需要人类判断和迭代。我会尝试数值、针对真实文档测试、调整、重复。Claude Code 帮助快速实现了每个变体,但哪个感觉合适的决定权在我。
迭代速度是真正的超能力。 整个项目——CLI、构建管道、搜索引擎、MCP 服务器、测试——在约一周内完成。不是因为代码简单(仅 Markdown 解析就处理了十多个边缘情况),而是因为反馈循环紧凑。描述您想要什么、审查您得到什么、调整、继续。
测试驱动的提示效果良好。 我经常以测试用例的形式描述我想要的行为:“此 Markdown 输入应产生这些分块。”Claude Code 会同时编写实现和测试。当它们不匹配时,我们会共同找出原因。
2.6 数据对比
以下是 Context 与云端替代方案的对比:

3、设置方法
如果您想尝试:
# 安装
npm install -g @neuledge/context
# 添加一些文档
context add https://github.com/vercel/next.js
context add https://github.com/vercel/ai
# 连接到您的 AI 代理(Claude Code 示例)
claude mcp add context -- context serve
它适用于 Claude Desktop、Cursor、VS Code Copilot、Windsurf、Zed 和 Goose。实际上任何兼容 MCP 的代理都可以。MCP 服务器公开单个 get_docs 工具,带有已安装库的动态枚举——AI 可以准确看到可用内容并在相关时查询。
4、未来计划
搜索目前基于关键词(FTS5 + BM25)。它对于直接查询如“middleware authentication”或“ai sdk agent loop”效果良好,但它不理解语义相似性。“我如何保护路由?”不会匹配标题为“Authentication Guards”的节,除非词语重叠。
我计划添加本地嵌入向量用于语义搜索——仍然完全离线,可能使用 ONNX Runtime 配合小型模型。SQLite 架构使这变得简单:添加嵌入表,在构建时计算向量,在搜索时使用余弦相似性查询。
我还在考虑类似 GraphRAG 的关系表,用于遍历连接的文档。当您询问中间件时,您可能还想知道身份验证、路由和错误处理。关系图可以自动显示这些内容。
以及一个包注册表——基于 GitHub 的索引,社区可以发现和共享预构建的文档包。而不是每个人独立构建相同的 Next.js 文档,构建一次并发布。
5、要点
这个项目的核心教训:并非一切都需要成为云服务。
AI 代理的文档是本地优先的完美案例。数据变化不频繁(每个库版本),查询需要快速(代理进行大量查询),隐私很重要(您在询问代码库),“构建一次,永久使用”的模型非常合适。
如果您对速率限制、延迟或为本应是静态文件的内容支付月费感到沮丧——试试看。它是开源的(Apache-2.0)、免费的,并且可以离线工作。
原文链接:I Built a Context7 Local-First Alternative With Claude Code
汇智网翻译整理,转载请标明出处