mcp-language-server
MCP-LSP 协议桥接器:让 AI 编程助手具备 IDE 级代码语义理解能力
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
MCP-LSP 协议桥接器:让 AI 编程助手具备 IDE 级代码语义理解能力
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你让 Claude 帮你修改一段 Go 代码,Claude 准确地说出了函数在哪个文件、第几行——但当你让它直接编辑时,它却跳到了错误的位置,或者干脆找不到那个函数。这就是当前 AI 编程工具面临的一个核心矛盾:AI 能读代码,但"看不懂"代码结构。
mcp-language-server 正是为解决这一痛点而生。它不是一个面向人类的代码编辑器插件,而是一座桥:让 AI 助手(通过 Model Context Protocol)能够真正理解代码的语义结构——函数定义在哪、变量被哪些地方引用了、符号重命名会影响哪些文件——从而给出精确到符号级别的编辑操作。

图1:MCP Language Server 接入 Claude Desktop 后的工作演示,AI 可以直接执行 goto definition、find references 等语义操作。
这个项目由独立开发者 isaacphi 创建,GitHub 获得 1544 颗星,被标记为 AI、MCP、Model Context Protocol、language-server-protocol 等主题。代码完全使用 Go 语言编写,采用 BSD-3-Clause 开源许可证。
Model Context Protocol(MCP)是 Anthropic 在 2024 年底推出的开放协议,旨在让 AI 助手能够安全、可扩展地连接外部数据源和工具。Language Server Protocol(LSP)则是微软主导的代码编辑器协议标准,为数十种编程语言提供统一的语义分析接口。这两个协议各有分工:MCP 是 AI 与工具/数据之间的通信总线,LSP 是编辑器与语言分析器之间的语义引擎。
mcp-language-server 的核心创意在于:它同时实现了两端协议——作为 MCP 服务器接收 AI 的工具调用请求,作为 LSP 客户端驱动底层语言服务器(如 gopls、rust-analyzer),再将语义分析结果通过 MCP 返回给 AI。整个链路是:Claude(或其他 MCP 客户端)→ MCP 协议 → mcp-language-server → LSP 协议 → gopls/rust-analyzer 等语言服务器。
项目实现了完整的 LSP 语义工具集,并通过 MCP 接口暴露给 AI:
Read Definition(读取定义):给定一个符号(函数、变量、类型),定位其定义位置。不仅仅是文本搜索,而是基于 AST 的精确查找,支持嵌套命名空间(如 pkg.Type.Method)的精确匹配。
Find References(查找引用):找出代码库中所有引用了指定符号的位置。这对于重构和安全审计至关重要——AI 在修改某个函数前,可以先列出所有调用点。
Hover(悬停信息):获取符号的类型签名、文档注释等 hover 信息。这让 AI 在生成代码时能够参考准确的类型约束。
Rename Symbol(重命名):LSP 级别的原子重命名,自动处理同名变量的作用域隔离,避免误改非目标符号。
Get Diagnostics(诊断信息):实时获取 LSP 编译/静态分析诊断结果,帮助 AI 发现代码中的潜在错误。
Edit File(编辑文件):基于 LSP 的 textDocument 编辑接口,支持增量修改而非全文覆盖。
internal/watcher/ 模块实现了文件系统监听(基于 fsnotify),当工作区文件发生变化时,自动通知 LSP 重新分析,确保 AI 获取的语义信息始终是最新的。
项目代码结构非常清晰,采用标准 Go 包布局:
| 包 | 职责 |
|---|---|
cmd/generate | 代码生成工具,自动从 LSP 规范生成协议类型代码 |
internal/lsp | LSP 协议客户端实现:进程管理、JSON-RPC 传输、消息分发 |
internal/protocol | LSP 协议数据类型和接口定义 |
internal/tools | MCP 工具实现:definition、references、hover、rename 等 |
internal/watcher | 文件系统监控,触发增量重分析 |
internal/logging | 分层日志(Core / LSP / MCP / Watcher) |
internal/utilities | 通用工具函数 |
internal/lsp/client.go 是整个系统的核心引擎。它通过标准输入/输出管道启动 LSP 服务器进程(以 gopls 为例),实现完整的 JSON-RPC 通信:
进程管理:用 exec.Command 启动 LSP 服务器,通过 StdinPipe/StdoutPipe 建立双向通信通道。
消息分发:LSP 使用 JSON-RPC 2.0,handlers map[string]chan *Message 实现请求-响应的一对一匹配,notificationHandlers 处理无需响应的通知消息。
诊断缓存:diagnostics map[DocumentUri][]Diagnostic 缓存每个文件的最新诊断结果,避免重复请求。
打开文件追踪:openFiles map[string]*OpenFileInfo 记录当前通过 LSP 打开的文件,支持增量文本编辑。
main.go 中的 registerTools() 将每个 LSP 能力封装为独立的 MCP 工具函数,通过 mcp-go 库(github.com/mark3labs/mcp-go v0.25.0)注册到 MCP 服务器。整个项目依赖非常精简,主要依赖项仅有:
github.com/mark3labs/mcp-go:MCP 协议实现golang.org/x/text:文本处理github.com/fsnotify/fsnotify:文件监听github.com/stretchr/testify:测试框架cmd/generate 是项目的一个亮点:它从 LSP 规范文档自动生成 Go 协议类型代码(internal/protocol/),而非手动编写。这样当 LSP 规范更新时,只需运行 go run ./cmd/generate 即可同步更新协议定义,保证了与官方规范的一致性。

图2:项目作者 isaacphi 的 GitHub 头像。
项目没有提供 Docker 镜像,仅支持源码编译安装:
go install github.com/isaacphi/mcp-language-server@latest
前置依赖:
go install golang.org/x/tools/gopls@latest(Go)、rustup component add rust-analyzer(Rust)等以 Claude Desktop 为例,在 claude_desktop_config.json 中添加:
{
"mcpServers": {
"language-server": {
"command": "mcp-language-server",
"args": ["--workspace", "/path/to/your/project/", "--lsp", "gopls"],
"env": {
"PATH": "/usr/local/bin:/Users/you/go/bin"
}
}
}
}
配置时需要将 LSP 服务器路径加入 PATH,并可能需要设置 GOPATH、GOCACHE 等 Go 环境变量。不同客户端配置方式类似但略有差异,项目 README 提供了 Claude Desktop 和其他客户端的配置示例。
项目使用 just 作为任务运行器(justfile):
just build # 编译
just install # 本地安装
just test # 运行测试(含 snapshot 测试)
just check # 代码质量检查(gofmt, staticcheck, errcheck, govulncheck)
just snapshot # 更新 snapshot 测试数据
项目包含 integrationtests/ 目录,通过 snapshot 测试验证 LSP 协议交互的正确性。
这是最大的架构限制:mcp-language-server 本身只做协议转发,不包含任何语言分析逻辑。用户必须自行安装对应语言的 LSP 服务器。对于小众语言或没有成熟 LSP 的语言,该工具无法使用。
虽然安装简单,但 MCP 客户端配置环节对非专业用户并不友好。需要手动指定工作区路径、LSP 命令、PATH 环境变量,Windows/macOS/Linux 的路径格式各不相同,配置错误时缺乏友好报错。
当前设计是每个 MCP 服务器实例对应单一 LSP 服务器(单一语言)。如果工作区包含多语言代码(如 Go + TypeScript),需要同时运行多个 mcp-language-server 实例并分别配置,工作量成倍增加。
项目目前有 64 个 open issues,较为活跃。issues 中反映的问题包括:多语言工作区支持不足、Windows 兼容性、某些 LSP 服务器的特殊行为等,说明该项目仍处于快速迭代阶段。
mcp-language-server 代表了一个重要趋势:AI 编程工具正在从"文本补全"进化到"语义理解"。
随着 Claude Code、Cursor、Copilot 等工具将 MCP 集成作为扩展生态的核心策略,能够将 LSP 语义能力引入 AI 工作流的中间件将成为标配。类似 mcp-language-server 的项目正在构建 AI 与现有开发者工具链的兼容层,让 AI 无需重新发明轮子就能继承 IDE 数十年的语义分析积累。
未来,这一模式可能会进一步演进:从单一 LSP 服务器扩展到多语言、多服务协同;从被动等待 AI 请求到主动推送诊断和代码质量信息;甚至可能将 LSP 与 RAG(检索增强生成)结合,为 AI 提供更深层的代码库结构知识。
对于希望让 AI 编程助手更"懂"代码的开发者而言,mcp-language-server 是一个值得关注的技术选型——它用最少的依赖、最直接的架构,解决了 AI 与代码语义之间的关键断层。