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 stars8 forks,主要语言是 Rust;仓库创建于 2025 年 12 月,最近在 2026 年 6 月仍然活跃。Cargo.toml 中的 workspace 版本是 0.3.6git ls-remote 也能看到最新 tag v0.3.6

项目概览

属性详情
仓库bug-ops/mcpls
定位通用 MCP to LSP bridge
Stars约 38
Forks8
主要语言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-analyzerpyrighttypescript-language-servergopls 这些工具已经能回答很多结构化问题: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_diagnosticsget_cached_diagnostics:读取 language server 的真实错误和警告。
  • get_code_actions:获取 quick fix、refactor、source action。
  • rename_symbol:基于引用跟踪做 workspace-wide rename。
  • format_document:调用语言对应的 formatter。
  • prepare_call_hierarchyget_incoming_callsget_outgoing_calls:查看函数调用关系。

这些工具组合起来,刚好覆盖 agent 改代码前最应该问的几类问题:我改的是谁?谁在用它?现在有没有编译器或类型检查错误?这个重命名是否会漏掉调用点?

对 Rust 项目是零配置起步

mcpls 当前对 Rust 项目给了比较顺的默认路径。README 里写到,只要安装 mcplsrust-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.tomlsetup.pyrequirements.txt,TypeScript 看 package.jsontsconfig.json,Go 看 go.mod,C/C++ 看 CMakeLists.txtcompile_commands.jsonMakefile,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”更值得关注。

项目地址:https://github.com/bug-ops/mcpls