Pluck:让 AI 编程 Agent 减少 84% 代码读取 Token 的 MCP-native 检索引擎
当 AI 编程 Agent 用 cat 和 grep 读取代码时,上下文窗口在一次次文件 dump 中悄然耗尽——重复的 import 声明、相邻函数、工具输出里的堆栈噪声,每一字节都在吃 Token。pluck 做的事很简单:把 cat 和 grep 替换为一套 MCP-native 的代码检索引擎,让 Agent 只获取它真正需要的那段代码。核心数字非常直接:Smart Outline 模式减少 84-88% 的读取 Token,CI 日志压缩 71%,热搜索延迟 0.07ms——所有数据均对标基准测试文件,无虚构百分比。
功能与原则
pluck 是一个本地 Rust 守护进程,通过 Model Context Protocol(MCP)向 AI 编程 Agent 暴露一套符号感知的代码读取和搜索接口。设计原则只有一条:Agent 发起的每一次检索调用默认走 pluck,Bash 是 fallback 而非默认。
核心能力矩阵:
- Smart Outline(pluck.read):不再一股脑 dump 整个文件,只返回符号签名 + 迷你内联辅助体,Agent 按需获取大函数体
- Session Dedup:同一会话中跨查询重叠的代码块替换为
[already-shown: ...]单 Token 占位符 - Lossless Default:不去注释、不丢类型,所有精简模式均为显式 opt-in
- 100% 能力保证:每个工具均提供
--rawfallback,与原始 cat/grep 字节等价
检索工具集:
| MCP 工具 | 替代 | 使用场景 |
|---|---|---|
mcp__pluck__read |
cat | 读取代码文件(智能大纲模式) |
mcp__pluck__search |
— | BM25 + 语义混合排名检索 |
mcp__pluck__grep |
grep/rg | 精确字符串、正则、TODO |
mcp__pluck__symbol |
cat + 滚动 | 只读某个函数/类体 |
mcp__pluck__peek |
— | 签名 + 直接调用者 |
mcp__pluck__expand |
多次 cat | 符号 + N 跳调用链 |
mcp__pluck__impact |
grep + 读每个调用者 | 逆向调用图 |
mcp__pluck__deps |
grep imports + 读每个文件 | 文件级依赖图 |
mcp__pluck__digest |
管道式 cat | 压缩 cargo/npm/pytest 日志 |
mcp__pluck__plan |
推测性搜索/读取循环 | 任务规划推荐 |
认可度
截至 2026-09-02,GitHub 数据:
- Stars:40(创建于 2026-05-15)
- Forks:0
- 语言:Rust
- License:MIT
- 最新版本:v0.2.0(crates.io 首版发布)、v0.3.0(语义搜索)、v0.4.0(进行中,Java 支持)
- MCP crates.io 包(pluck-mcp)已有 1.6K SLoC,51.4 KiB
pluck 目前 star 数量有限,但属于极具技术护城河的早期项目,进入了 aidev-index 等 AI 开发者工具目录的代码检索垂直分类(40 AI 信号排名),crates.io 有稳定下载量。技术 benchmark 质量远超市面大多数同类工具。
链接
GitHub:https://github.com/hunhee98/pluck
crates.io:https://crates.io/crates/pluck-mcp
原作者
hunhee98(GitHub:https://github.com/hunhee98),独立开发者,专注 Rust + AI 基础设施。
介绍
AI 编程 Agent 在真实代码库里做检索时,标准 cat 和 grep 暴露了一个系统性问题:每一次文件读取都是全量输出,Agent 为找到目标代码要反复穿越无关区域,重复为 import 块、标准库声明、中等大小辅助函数支付 Token——这被作者称为”cat tax”。
pluck 的解决方案建立在 AST(抽象语法树)分块之上。使用 Tree-sitter 对 20+ 语言(Rust、TypeScript、Python、Go、Java、Swift、Ruby、PHP、C、C++、HTML、CSS、JSON、YAML、TOML、SQL 等)做语法树级分块,而非简单按行切割。分块后,检索层采用 BM25F 关键词匹配 + 语义向量混合排名(两阶段 cascade),query 膨胀技术用嵌入空间最近邻扩展自然语言 query 的词汇覆盖,保证”payment flow”这类概念搜索也能召回精确符号。
Session Dedup 是另一个关键创新:同一个任务会话内,Agent 先后搜索”auth”和”token”时,重叠的代码块在第二次被替换为 1 Token 占位符。benchmark 显示,5-query 场景下可节省 23% 的 Token。
特点
- Token 节省可量化:Smart Outline 在真实场景(5 函数 / 120 行)下从 929 Token 降至 116 Token(-88%),大场景(25 函数 / 600 行)从 4,549 降至 556(-88%),均有 benchmark JSON 文件可查
- 热搜索 < 0.07ms:持久化守护进程 + 内存映射索引,中型代码库热搜索 P50 仅 0.07ms
- 无损保真:所有
--raw模式与原始 cat/grep 字节等价,Agent 永远不会因降级丧失能力 - 增量化索引:文件变更后 171ms P50 即可搜索,无需全量重建
- CI 日志压缩:pluck.digest 压缩 cargo build / pytest / GitHub Actions 日志,保留错误/panic 原文,进度行折叠,节省 71% 长度
- 多 Agent 支持:官方支持 Claude Code、Codex、Cursor,通过
pluck init --target <name>一键配置 MCP 连接和检索策略
使用方法
安装(Rust 生态 / Homebrew):
# via Cargo
cargo install pluck-mcp pluck-cli
# via Homebrew
brew tap hunhee98/pluck && brew install pluck
初始化到 Claude Code:
pluck init --target claude --mode aggressive
# 等价:claude mcp add --transport stdio --scope project pluck -- pluckd --repo .
初始化到 Cursor:
pluck init --target cursor --mode strong
初始化到 Codex:
pluck init --target codex --mode strong
手动 MCP 配置示例(Claude Code project config):
{
"mcpServers": {
"pluck": {
"command": "pluckd",
"args": ["--repo", "."]
}
}
}
核心命令速查:
# 索引仓库
pluck index .
# 语义检索
pluck search "auth flow" --repo .
# 智能读取(默认 outline 模式)
pluck read src/auth/login.ts
# 原始读取(= cat)
pluck read src/auth/login.ts --raw
# 查看符号调用者
pluck impact validate_token --depth 3
# 压缩 CI 日志
pluck digest < cargo-build.log
使用场景与人群
适用场景:
- 大型代码库(500+ 文件)的 AI 编程 Agent 上下文管理
- 多 Agent 并行开发中的 Token 预算控制
- CI/CD 日志分析和 Agent 对接
- 需要跨文件调用链追踪的重构任务
目标用户:
- 使用 Claude Code、Codex、Cursor 等编程 Agent 的开发者
- AI 工程团队,需要优化 Agent Token 消耗
- MCP 工具链开发者,构建 Agent 基础设施
- Rust/Tree-sitter 爱好者
输入与输出案例
案例 1:fix-auth-token-expiry 任务
同一 JIRA 风格任务,对比两种工作流:
| 工作流 | Token 消耗 |
|---|---|
| bash(rg -l + 多轮 cat) | 1,248 tokens |
| pluck(search + read + symbol) | 931 tokens(−25%) |
两者最终修复代码完全一致。
案例 2:读取中型代码库文件
| 读取方式 | Token 消耗 | 节省 |
|---|---|---|
| cat(5 函数 / 120 行文件) | 929 | — |
| pluck.read outline 模式 | 116 | −88% |
Agent 获取文件符号地图 + 小辅助函数体,直接决定是否需要按需拉取大函数体,无需处理整个文件上下文。
评论区
登录后可评论。