mcpls - 把语言服务器的代码理解能力接给 AI agent
AI coding agent 在改代码时最容易犯的错之一,是把代码库当成一堆文本。它可以 grep,可以读文件,也可以猜函数名背后的意图;但真正的 IDE 不是这样工作的。IDE 会问 language server:这个符号的类型是什么、定义在哪里、有哪些引用、当前位置有哪些诊断、重命名会影响哪些地方。
今天推荐的 bug-ops/mcpls 就是把这条 IDE 路径接给 AI agent 的工具。它是一个 Rust 编写的 MCP to LSP bridge,把 Language Server Protocol 的能力包装成 Model Context Protocol tools。GitHub 搜索结果当前显示项目约 38 stars、8 forks,主要语言是 Rust;仓库创建于 2025 年 12 月,最近在 2026 年 6 月仍然活跃。Cargo.toml 中的 workspace 版本是 0.3.6,git ls-remote 也能看到最新 tag v0.3.6。
项目概览
| 属性 | 详情 |
|---|---|
| 仓库 | bug-ops/mcpls |
| 定位 | 通用 MCP to LSP bridge |
| Stars | 约 38 |
| Forks | 8 |
| 主要语言 | Rust |
| 许可 | MIT OR Apache-2.0 |
| 当前版本 | 0.3.6 |
| 安装方式 | cargo install mcpls 或 GitHub Releases |
它解决的是 agent 的“语义盲区”
大多数 agent workflow 现在已经能很好地读写文件、运行测试、调用 shell,但“理解代码”这一层还经常退回到文本匹配。比如它想知道 process_request 的返回类型,常见做法是打开定义附近的文件,顺着 import、trait、type alias 一路读下去。这能工作,但成本高,也容易漏掉语言本身已经知道的信息。
LSP 原本就是为这个问题存在的。rust-analyzer、pyright、typescript-language-server、gopls 这些工具已经能回答很多结构化问题:hover 信息、定义跳转、引用查找、诊断、补全、code action、format、rename、call hierarchy。mcpls 的价值,是把这些能力变成 MCP tools,让 Claude Code 这类 MCP client 可以直接调用。
这不是“让 AI 更聪明”的魔法,而是把它接到更可靠的数据源上。类型、引用和诊断如果来自 language server,agent 就少一点猜测,多一点证据。
能提供哪些 MCP tools
README 把工具按场景分得比较清楚。代码理解相关的工具包括:
get_hover:读取当前位置的类型签名、文档和推断类型。get_definition:跳到符号定义。get_references:查找 workspace 内所有引用。get_completions:获取基于类型和作用域的补全。get_document_symbols:获取文件结构大纲。workspace_symbol_search:跨 workspace 查找符号。
诊断和重构相关的工具也很实用:
get_diagnostics和get_cached_diagnostics:读取 language server 的真实错误和警告。get_code_actions:获取 quick fix、refactor、source action。rename_symbol:基于引用跟踪做 workspace-wide rename。format_document:调用语言对应的 formatter。prepare_call_hierarchy、get_incoming_calls、get_outgoing_calls:查看函数调用关系。
这些工具组合起来,刚好覆盖 agent 改代码前最应该问的几类问题:我改的是谁?谁在用它?现在有没有编译器或类型检查错误?这个重命名是否会漏掉调用点?
对 Rust 项目是零配置起步
mcpls 当前对 Rust 项目给了比较顺的默认路径。README 里写到,只要安装 mcpls 和 rust-analyzer,Rust 项目可以零配置使用。安装方式也很直接:
cargo install mcpls
然后在 MCP client 里配置 server。README 以 Claude Code 配置为例:
{
"mcpServers": {
"mcpls": {
"command": "mcpls",
"args": []
}
}
}
它不是只服务 Rust。README 列出的默认 heuristics 会根据项目标记启动对应 language server:Rust 看 Cargo.toml,Python 看 pyproject.toml、setup.py、requirements.txt,TypeScript 看 package.json、tsconfig.json,Go 看 go.mod,C/C++ 看 CMakeLists.txt、compile_commands.json、Makefile,Zig 看 build.zig。
这个设计很重要。一个 monorepo 里可能同时有后端、前端、脚本和工具链代码,agent 不应该为所有语言无脑启动所有 server。按项目标记做启发式启动,能减少资源浪费,也让失败更容易隔离。
为什么它比纯 grep 更适合改代码
文本搜索仍然有用,尤其适合找字符串、配置和不在 AST 里的约定。但当 agent 要做结构化修改时,LSP 的优势很明显。
举几个场景:
- 改公共函数签名前,先用
get_references看所有调用点。 - 不确定变量类型时,用
get_hover而不是从上下文猜。 - 遇到报错时,用
get_diagnostics读取 language server 的诊断。 - 重命名符号时,用
rename_symbol而不是全局替换。 - 拆函数前,用 call hierarchy 看调用链是否过深。
这类信息对人类开发者来说早就藏在 IDE 里,但对 terminal-first agent 来说通常并不稳定。mcpls 的思路是把 IDE 的语义层抽出来,通过 MCP 放进 agent workflow。
边界也很清楚
mcpls 不是一个完整的代码索引平台,也不是 review 工具。它依赖语言服务器本身的质量;如果某个语言的 LSP 配置不完整、项目无法正确加载、依赖没有安装,返回结果也会受影响。README 里也提醒,至少需要一个 language server 可用。
另外,LSP 能告诉 agent “这里的类型是什么”和“这里有哪些引用”,但不能替代测试、构建和 code review。一个安全的 workflow 仍然应该是:先用 LSP 缩小不确定性,再修改代码,再运行项目自己的验证命令。
我会把它放在 agent 工具箱的基础设施层,而不是最终判断层。它负责把事实拉出来,agent 和人类 reviewer 仍然负责做决策。
适合哪些人
mcpls 适合这些场景:
- 你正在使用 Claude Code、Codex、Cursor 或其他支持 MCP 的 coding agent。
- 你希望 agent 少做文本猜测,多问 language server。
- 你的项目已经有可用的 LSP 配置,比如 rust-analyzer、pyright、typescript-language-server、gopls。
- 你经常让 agent 做跨文件修改、重命名、调用点分析或诊断修复。
- 你在维护多语言 workspace,希望用统一的 MCP interface 暴露代码语义能力。
如果你的项目本身还没有稳定的语言服务器配置,第一步应该先让 IDE 和 LSP 正常工作。mcpls 接的是这条链路的上层;底层不稳时,上层工具也很难稳定。
总结
bug-ops/mcpls 的亮点在于方向很基础,也很实用:不要让 AI coding agent 只靠文本读代码,而是把 language server 已经拥有的语义信息交给它。hover、definition、references、diagnostics、rename、call hierarchy 这些能力不新,但通过 MCP 进入 agent workflow 后,能明显降低跨文件修改时的猜测成本。
我尤其喜欢它的定位克制。它没有试图重新发明代码理解引擎,而是把成熟的 LSP 生态接到 MCP。对正在把 AI agent 放进日常开发流程的团队来说,这类桥接工具可能比又一个“全能 agent”更值得关注。