csharp语言mcp
通过MCP(模型上下文协议)为AI编码代理提供C#代码智能服务器,由Roslyn提供支持。
为什么使用这个?
使用C#的AI编码代理将代码视为文本——读取整个文件,查找模式,猜测类型。这对于动态语言来说还可以,但C#代码库会反击:深度类型层次结构、跨项目引用、泛型、隐式用法、分部类。一名武装特工 grep 正在盲目飞行。
csharp语言mcp 为代理提供了与IDE相同的智能——由Roslyn编译器平台提供支持:
C#导航
| 原始文件访问 | csharp语言mcp |
|---|---|
| 读取整个文件以查找类 | 直接跳到任何定义 |
| 查找方法名,忽略重载 | 获取所有具有读/写分类的引用 |
| 从上下文猜测类型 | 获取具有完整泛型解析的精确类型 |
| 缺少其他项目中的接口实现 | 查找整个解决方案中的所有具体实现 |
| 希望重命名不会破坏东西 | 在所有项目中预览和执行重命名 |
| 逐一读取文件以查找错误 | 立即获得项目范围或解决方案范围的诊断 |
纽吉特
特工们正在合作。NET需要找到包,了解它们的API,并阅读文档。此服务器允许代理直接访问本地NuGet缓存中的真实程序集元数据和XML文档,该缓存以JSON形式构建,大小适合LLM上下文窗口。
| 任务 | 没有此服务器 | 使用csharp语言mcp |
|---|---|---|
| 查找包裹 | 抓取nuget.org搜索HTML或从训练数据中猜测 | nuget_search --缓存优先,结构化结果 |
| 列出缓存的包 | 手动浏览文件系统 | nuget_packages --列出所有缓存的包或获取特定包的元数据 |
| 读取公共API表面 | 下载中心 .nupkg,提取DLL,尝试反编译——大多数代理根本无法做到这一点 | nuget_explore --实类型/成员签名通过 System.Reflection.Metadata |
| 阅读API文档 | 报废文档网站(如果有的话),希望格式解析干净 | nuget_explore 随着 includeDocs --包中的XML文档,可按类型筛选 |
| 代币成本 | 每页20-50k+标记的HTML/噪声,或0标记的幻觉答案 | 每次调用约1-5k标记的专注、结构化输出 |
Roslyn与文本搜索有何不同?
罗瑟琳 编译 你的代码。它解析类型、绑定符号并理解整个解决方案图。当代理询问“谁执行”时 IRepositoryRoslyn给出了真正的答案,而不是一个错过其他项目中实现或包含注释和字符串错误匹配的正则表达式近似值。
这对C#来说最重要,因为:
- 多项目解决方案 --引用、共享接口和NuGet包创建了文本搜索无法遵循的依赖关系图
- 丰富型系统 --泛型、继承、隐式转换和扩展方法对grep不可见
- 横切图案 --依赖注入、接口隔离和CQRS意味着符号的定义和使用很少在同一个文件中
需求
- .NET 9 SDK(包括MSBuild)
快速开始
MCP客户端配置
克劳德代码:
# Analyze the current directory
claude mcp add csharp -- dotnet run --project /src/CsharpMcp
# Analyze a specific project
claude mcp add csharp -- dotnet run --project /src/CsharpMcp -- 替换 `` 带有此仓库克隆的路径。
其他MCP客户端(Cline等):
{
"mcpServers": {
"csharp": {
"command": "dotnet",
"args": ["run", "--project", "/src/CsharpMcp", "--", "[your-csharp-repo]"]
}
}
}或者使用已发布的二进制文件:
{
"mcpServers": {
"csharp": {
"command": "/CsharpMcp",
"args": ["[your-csharp-repo]"]
}
}
}选项
| 选项 | 描述 | 默认值 |
|---|---|---|
[directory] | C#项目根目录的路径 | 当前工作目录 |
--name | 自定义服务器名称(用于多实例设置) | csharp-language-mcp |
--description | 附加到内置服务器描述的额外上下文 | _(无)_ |
--no-quality | 禁用质量/度量工具(保存2个工具) | _(已启用)_ |
--no-nuget | 禁用NuGet工具(保存3个工具) | _(已启用)_ |
多个实例 --使用 --name 和 --description 在每个repo运行一个服务器时区分服务器:
{
"mcpServers": {
"csharp-api": {
"command": "/CsharpMcp",
"args": ["--name", "csharp-api", "--description", "API layer", ""]
},
"csharp-core": {
"command": "/CsharpMcp",
"args": ["--name", "csharp-core", "--description", "Core domain", ""]
}
}
}服务器发现所有 .csproj 根路径下的文件,并将它们加载到单个Roslyn工作区中。所有职位均为 1-索引 (第1行第1列=第一个字符)。
工具(共21个)
| 类别 | 工具 | 描述 |
|---|---|---|
| 导航 | get_definition | 从使用跳转到声明 |
get_references | 查找具有读/写分类的所有用法 | |
get_implementations | 查找接口的具体实现 | |
get_call_hierarchy | 追踪呼叫者/被呼叫者;使用 maxDepth 用于深度使用跟踪 | |
get_type_hierarchy | 导航基本类型、接口和派生类型 | |
| 类型智能 | get_hover | 在某个位置键入信息、XML文档和参数签名 |
| 代码结构 | get_outline | 分层文件结构(使用 flat=true 用于平面符号列表) |
get_imports | 列出所有使用指令 | |
| 搜索 | find | 按名称模式、种类、项目搜索符号 |
| 补全 | get_completions | 在某个位置完成代码(成员、方法、类型、关键字) |
| 诊断 | get_diagnostics | 文件或整个工作区的错误/警告 |
| 重构 | rename | 在所有项目中预览或执行重命名(preview=true 默认情况下) |
format_document | 使用Roslyn格式化程序进行格式化 | |
get_code_actions | 诊断的快速修复(添加使用、实施界面等) | |
| 效率 | analyze_position | 在一次调用中组合悬停+诊断+符号 |
batch_analyze | 同时分析多个职位 | |
| 质量 | quality_hotspots | 综合质量评分——通过加权MI、重复、间接性来找到最差的代码 |
generate_iso5055_report | ISO 5055质量报告(安全性、可靠性、性能、可维护性) | |
| 纽吉特 | nuget_search | 缓存优先搜索,回退到远程 |
nuget_packages | 列出缓存的包,或获取特定包的元数据/deps | |
nuget_explore | 浏览缓存包中的程序集、类型和XML文档 |
质量热点
这 quality_hotspots 该工具通过加权三个质量维度来识别需要重构的代码:
- 可维护性 --MI、圈复杂度、LOC、耦合
- 重复 --精确、重命名和语义代码克隆
- 间接 --通过深层调用链实现隐藏耦合
默认权重大致相等(每个≈0.33)。覆盖权重以关注特定问题。
跟踪之前/之后:
- 呼叫
quality_hotspots(snapshotLabel: "before")在会话开始时 - 进行更改
- 呼叫
quality_hotspots(compareToSnapshot: "before")--显示每种类型的增量
ISO 5055支持(部分)
这 generate_iso5055_report 该工具提供了对 ISO/IEC 5055 自动化源代码质量标准。它根据四个ISO 5055质量特征分析您的解决方案:
- 安全 --检测CWE映射的漏洞(例如SQL注入、路径遍历)
- 可靠性 --检测易出现缺陷的模式(例如空解引用、空捕获块)
- 性能效率 --检测资源浪费模式
- 可维护性 --检测过于复杂或不透明的代码(例如深度嵌套、幻数)
该报告包括违规计数、每个KLOC的违规、每个类别的通过/失败、覆盖的CWE ID以及每个违规文件路径,并附有修复建议。
类别和当前覆盖范围:
| 类别 | 焦点 | 覆盖范围 |
|---|---|---|
| 安全 | 可利用漏洞 | 仅低模式匹配规则(不安全代码,CWE-242)。无污染分析。 |
| 可靠性 | 崩溃/损坏风险 | 中等——处置模式、堆栈跟踪破坏、事件泄漏、弱身份锁、构造函数中的虚拟调用 |
| 性能效率 | 资源浪费 | 低--异步检测同步(CWE-1049) |
| 可维护性 | 结构衰退 | 良好——圈复杂度、深度嵌套、大型类/方法、参数过多、缺乏内聚性、类不稳定、goto语句 |
限制: 这不是SAST的替代品。依赖于Taint分析的CWE(SQL注入、XSS、命令注入)需要专用工具,如CodeQL或Semgrep。报告包括 CoveredCweIds 因此消费者确切地知道哪些CWE在范围内。
配置CLAUDE.md
为了充分利用此服务器,请将以下说明添加到您的项目中 CLAUDE.md 文件:
## C# Code Intelligence
Always prefer csharp MCP tools over grep/bash/find for C# code:
- Use `get_definition` instead of grepping for class/method definitions
- Use `get_references` instead of grepping for usages
- Use `find` instead of find/grep for locating symbols
- Use `get_diagnostics` instead of running `dotnet build` to check errors
- Use `get_outline` instead of reading entire files to understand structure
- Use `get_hover` to check types instead of guessing from context
## Code Quality Tracking
- At the START of each coding session, call `quality_hotspots(snapshotLabel: "before")` to capture a baseline
- At the END of each session (before committing), call `quality_hotspots(compareToSnapshot: "before")` to review quality impact
- If quality_hotspots shows degraded types, address them before finishing为什么需要这个? AI代理默认使用熟悉的工具,如grep,find,以及cat如果没有明确的指令,即使MCP工具可用,他们也会忽略它们——浪费令牌读取整个文件并产生不太准确的结果。这CLAUDE.md指令会覆盖此默认行为。
构建
dotnet build src/CsharpMcp.sln测试
dotnet test src/CsharpMcp.sln许可证
麻省理工学院
