内容
# dotnet-mcp-starter
**.NET 的最小化 Roslyn MCP 服务器,为 Claude Code 和其他 AI 代理提供编译器级别的代码智能。**
仅凭文本的 AI 代理在处理 C# 时是基于模式匹配的,无论其流畅程度如何。该服务器为其提供编译器的答案:符号搜索、引用查找和通过 [模型上下文协议](https://modelcontextprotocol.io) 的实时诊断,因此“什么实现了 `IPaymentProvider`?”返回带有 `文件:行号` 证据的已验证事实 —— 而不是 grep 猜测。
这是 [A Roslyn MCP server is the cheat code for AI on .NET](https://codemajesty.tech/blog/roslyn-mcp-server-the-1m-line-of-context-trick) 中描述的服务器的故意最小化启动版本。没有 SDK 依赖 —— 整个 MCP 协议表面是一个可读的文件。
## 工具
| 工具 | 答案 | 备注 |
|------|---------|-------|
| `find_symbol` | 哪里有名为 X 的东西? | 不区分大小写的包含匹配(代理记住名称的一半),每个项目最多 20 个 |
| `find_references` | 谁使用了这个符号? | 通过 `SymbolFinder` 验证编译器 —— 包括文本搜索遗漏的内容 |
| `get_compilation_errors` | 当前有什么问题? | 每个项目的诊断信息,无需支付完整的 `dotnet build` 费用 |
每个结果都带有 `文件:行号` —— 服务器的工作不是取代阅读代码,而是使每次阅读 *成为正确的阅读*。
## 快速入门
需要 .NET 10 SDK。
编译一次服务器,然后将编译后的 DLL 指向 Claude Code:
```bash
git clone https://github.com/Code-Majesty-Tech/dotnet-mcp-starter.git
cd dotnet-mcp-starter
dotnet build -c Release
```
将其连接到解决方案的 `.mcp.json`(Claude Code)。服务器从 **其工作目录** 向上遍历以找到您的 `.sln`/`.slnx`,因此它会自动发现正确的解决方案:
```json
{
"mcpServers": {
"roslyn": {
"command": "dotnet",
"args": ["/absolute/path/to/dotnet-mcp-starter/bin/Release/net10.0/RoslynMcpStarter.dll"],
"timeout": 30000
}
}
}
```
**调用编译后的 DLL,而不是 `dotnet run --project`。** Claude Code 启动 MCP 服务器时,工作目录设置为 *您的* 仓库。如果您的仓库通过 `global.json` 固定 SDK(例如 .NET 8 项目迁移中),`dotnet run` 解析该固定的 SDK 并失败构建此 net10.0 服务器 —— 服务器永远不会启动,Claude Code 会无限循环 `-32000: Connection closed`。调用编译后的 DLL(`dotnet path/to/x.dll`)使用运行时解析,**忽略 `global.json`**,并近乎瞬间启动,无需每个连接进行 MSBuild 传递。
30 秒的超时不是装饰:第一次联系需要支付 MSBuild *工作区* 加载和 *您的* 解决方案的第一次编译费用。较短的超时会在服务器预热中途终止 —— 之后代理会无声地回落到 grep 进行整个会话,您会想知道为什么质量会倒退。
## 设计规则
- **限制每个结果集** —— 代理的上下文窗口是此服务器存在的稀缺资源。无限制的引用查询比其替换的 grep 更耗费上下文。
- **`MSBuildLocator.RegisterDefaults()` 在加载任何 Roslyn 类型之前** —— 经典的陷阱。运行时 MSBuild 程序集来自定位的 SDK,而不是 NuGet(参见 csproj 中的 `ExcludeAssets="runtime"` 注释)。
- **最小限定签名** —— `CancelAsync(CancelCommand)` 一目了然;完全限定的怪物会烧掉令牌来说更少的内容。
- **编译缓存** —— 每个项目第一次调用需要几秒钟;缓存调用在毫秒内返回。每次调用都重新编译的服务器会训练代理停止调用它。
- **无状态工具,有状态工作区** —— 可在会话中重启,因为 MSBuild 工作区有情绪。
## 已知限制(启动诚实)
- **工作区在启动时加载一次。** 结构更改(新项目,csproj 编辑)需要重启服务器;正在进行的实时文件编辑不会被重新读取到已加载的编译中。生产模式每调用一次都会重新读取 —— 为清晰起见在此省略。
- 三个工具,而不是九个。自然而然的下一个工具 —— `get_implementations`、`get_type_hierarchy`、`get_dependency_graph`、`find_unused_code`、`analyze_usings`、`get_project_dependencies` —— 遵循已发布的三个工具的确切形状;[配套帖子](https://codemajesty.tech/blog/roslyn-mcp-server-the-1m-line-of-context-trick) 描述了每个工具应该返回的内容和原因。
- 按设计,每个服务器实例只有一个解决方案。
## 适用场景
语义基本事实是运行生产 .NET 代理的一个层面的较大防护措施栈的一部分 —— 调查关口、构建关口、振荡检测等:
- [.NET 的 Claude Code 防护措施的十二层](https://codemajesty.tech/blog/twelve-layers-of-claude-code-guardrails-for-dotnet)
- [CLAUDE.md + hooks 启动器仓库](https://github.com/Code-Majesty-Tech/dotnet-claude-template)
- [我们在 5 名开发人员的 .NET 团队上如何运行 Claude Code](https://codemajesty.tech/blog/claude-code-for-dotnet-teams-the-honest-setup)
## 许可证
[MIT](LICENSE) —— 使用它,扩展它,告诉我们它破坏了什么。