C# 评审MCP服务器
一个模型上下文协议(MCP)服务器,它为大型语言模型(LLMs)提供访问官方C#和.NET文档的权限,并支持基于Roslyn的代码分析,以进行专业代码审查。
概述
这个MCP服务器提供了:
- MCP Resources(公司名,可译为)“MCP资源公司”微软官方的C#和.NET文档
- MCP 工具用于搜索和获取特定文档的工具
- Roslyn 代码分析带有诊断、指标和建议的静态代码分析
- 智能缓存本地缓存,用于快速访问并减少网络使用
特点/特性
资源(随时可用)
csharp://coding-conventions- 官方C#编码规范csharp://design-guidelines。.NET 设计指南csharp://language-reference- C# 语言参考csharp://fundamentals。.NET 基础知识
文档工具
fetch_csharp_documentation- 获取特定的C#或.NET文档search_best_practices- 在特定领域寻找最佳实践:
- 安全 - 演出 - 例外情况 - \async\(在编程中通常与 \await\ 一起使用)翻译为中文是“异步”。 - LINQ(Language Integrated Query,语言集成查询) - 将军
Roslyn分析工具
analyze_csharp_code- 使用Roslyn分析C#代码,提供:
- 编译错误和警告(包括StyleCop分析器) - 代码度量(类的数量、方法的数量、行数、圈复杂度) - 安全分析SQL注入、硬编码秘密、不安全的文件操作、弱随机数生成 - 性能分析在循环中进行字符串连接,不必要的实体化,ConfigureAwait 的使用 - LINQ 优化计数与任意比较,位置链式查询,OrderBy优化 - 改进建议(方法冗长、文档缺失、命名问题等)
check_roslyn_status- 检查Roslyn分析器是否已构建并准备就绪build_roslyn_analyzer- 构建 Roslyn 分析器(首次使用前必需)
安装
快速入门(推荐)
# Clone or navigate to the project
cd /path/to/csharp-review-mcp
# Run the setup script (installs everything)
npm run setup安装脚本将:
- 安装npm依赖项
- 构建TypeScript项目
- 检查是否已安装.NET SDK
- 构建 Roslyn 分析器(如果已安装 .NET SDK)
手动安装
# Install npm dependencies
npm install
# Build TypeScript project
npm run build
# (Required for Roslyn) Install .NET SDK 8.0+
# https://dotnet.microsoft.com/download
# Build Roslyn analyzer
npm run build-roslyn
# (Optional) Pre-populate cache with important documentation
npm run prepopulate系统要求
- Node.js 18+(必需)
- npm(Node Package Manager) (必填)
- .NET SDK 8.0及以上版本 (可选,用于Roslyn分析)
- 如果未安装.NET SDK,服务器仍可运行,但将不具备Roslyn功能
使用方法
作为MCP服务器
在您的MCP客户端配置(例如,Claude Desktop)中添加:
{
"mcpServers": {
"csharp-review": {
"command": "node",
"args": ["/absolute/path/to/csharp-review-mcp/build/index.js"]
}
}
}预填充缓存
为了提高性能并支持离线使用,请运行:
npm run prepopulate这将会:
- 从Microsoft Learn获取所有重要文档
- 将其转换为Markdown格式
- 本地缓存于
src/documents/ - 缓存有效期为7天
建筑学
文档来源
服务器从以下官方来源获取文档:
- C# 编码规范https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions 翻译为中文是:https://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/coding-style/coding-conventions(注:实际网址可能保持英文,但这里按照翻译要求给出了中文表述的网址结构,实际使用时网址仍应保持原样)。不过,通常网址不会翻译,这里是为了说明翻译的内容,实际应用中网址应保持不变。简洁来说,就是该网址链接指向的是关于C#编程规范的文档页面
- C# 语言参考https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/ 的中文翻译是:“https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/”(注:实际网址在中文环境下可能仍保留英文,但此处按翻译要求给出中文表述)。不过,更常见的做法是直接使用英文网址,因为技术文档和资源通常以英文为主。所以,直接表述为“https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/”即可,无需翻译成中文网址形式
- .NET 基础知识https://learn.microsoft.com/zh-cn/dotnet/fundamentals/(注:原链接为英文版,此处提供中文版的对应链接,实际翻译时需根据具体情况调整,因为网址本身是技术性的,不直接翻译,但可说明其为中文版的微软.NET基础知识页面)
- .NET 设计指南https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/ 翻译为中文是:https://learn.microsoft.com/zh-cn/dotnet/standard/design-guidelines/(注:实际网址在中文环境下可能仍保持原英文形式,但此处按照翻译要求给出了中文表述的网址结构示例,实际使用时应保持原英文网址不变)。不过,更准确的表述是,该网址指向的是微软官方文档中关于.NET 标准设计指南的部分,中文环境下访问时,页面内容会以中文呈现,但网址本身仍为英文
缓存策略
- 缓存被放置在
src/documents/ - 缓存有效期为7天
- 如果缓存已过期,可根据请求自动更新
- 在网络错误时回退到占位符
- 使用 Turndown 库进行专业的 HTML 到 Markdown 转换,具有更好的代码块处理能力
文件结构
/path/to/csharp-review-mcp/
├── src/
│ ├── index.ts # MCP server implementation
│ ├── docFetcher.ts # Documentation fetcher
│ ├── roslynAnalyzer.ts # Roslyn analyzer wrapper
│ ├── prepopulateCache.ts # Cache population script
│ └── documents/ # Local cache for documentation
├── roslyn-analyzer/
│ ├── Program.cs # C# Roslyn analyzer application
│ ├── CSharpAnalyzer.csproj # .NET project file
│ └── bin/ # Compiled .NET binary
├── build/ # Compiled TypeScript
├── setup.sh # Setup script
├── package.json
├── tsconfig.json
└── README.md使用示例
1. 大语言模型(LLM)阅读编码规范
LLM: *reads resource csharp://coding-conventions*
→ Gets access to official Microsoft C# coding standards2. 大语言模型(LLM)寻找最佳实践
LLM: *uses tool search_best_practices with area="async"*
→ Gets recommendations about async/await best practices3. 大语言模型(LLM)获取特定文档
LLM: *uses tool fetch_csharp_documentation*
→ topic: "LINQ"
→ category: "language-reference"
→ Gets detailed LINQ documentation4. LLM使用Roslyn分析C#代码
LLM: *uses tool analyze_csharp_code*
→ code: "public class MyClass { public void MyMethod() { ... } }"
→ Returns:
- Diagnostics: compilation errors, warnings, StyleCop violations
- Metrics: 1 class, 1 method, 15 lines, complexity: 3
- Suggestions:
* "Method 'MyMethod' is missing XML documentation"
* "SECURITY: Potential SQL injection risk detected"
* "PERFORMANCE: String concatenation inside loop detected"
* "LINQ: Use Any() instead of Count() > 0 for better performance"5. 完整的代码审查工作流程
1. LLM reads csharp://coding-conventions for standards
2. LLM analyzes code with analyze_csharp_code
3. LLM compares results with coding conventions
4. LLM searches best practices for specific areas
5. LLM provides detailed feedback based on:
- Roslyn diagnostics and StyleCop Analyzers
- Security analysis (SQL injection, secrets, unsafe operations)
- Performance analysis (string handling, LINQ, async patterns)
- LINQ optimizations
- Microsoft's official guidelines
- Best practices发展
构建项目
npm run build监视模式(自动重建)
npm run watch直接启动服务器
npm startRoslyn 分析器功能
集成的Roslyn分析器提供了全面的代码分析,涵盖多个专门类别:
诊断
- 编译错误和警告
- StyleCop 分析器根据C#最佳实践进行自动样式检查
- 最佳实践违规
- 代码异味检测
指标
- 班级数量
- 方法的数量
- 代码行数
- 圈复杂度
基本建议
- 过长的方法(>50行)
- 缺少公共方法的XML文档
- 没有“Async”后缀的异步方法
- 大班(>20人)
- 圈复杂度高(>10)
安全分析 🔒
- SQL注入检测SQL查询中的字符串连接
- 硬编码的秘密(或硬编码的凭证)在代码中查找密码、API密钥、连接字符串
- 异常处理警告:使用无日志记录的通用处理程序
- 文件操作检测不安全的文件/目录操作
- 密码学在使用 System.Random 进行安全敏感操作时发出警告
性能分析 ⚡
- 字符串连接检测循环中的字符串拼接(建议使用StringBuilder)
- LINQ 物化发现 Count/Any 之前存在不必要的 ToList() 调用
- 延迟执行警告:对 IEnumerable 进行多次枚举
- 字符串格式化建议使用插值代替 string.Format
- 异步/等待(或“异步/await”)建议在库代码中使用 ConfigureAwait(false)
- LINQ 链式调用检测过度的方法链式调用
LINQ 优化 🚀
- Count() > 0 的意思是“计数大于0” → 使用 Any()
- \
Where().Count()\翻译成中文是:“在(满足条件的)那些……中计数”。不过,为了更贴合编程语境,也可以翻译为:“对满足条件的元素进行计数” → 使用 Count(predicate) - \
Where().Any()\翻译成中文可以是:“在……中是否存在(任何满足条件的元素)”。不过,为了更贴近编程语境,也可以翻译为:“在……中是否有(任何符合条件的项)”。这里,“Where”通常用于指定条件来筛选元素,“Any”则用于检查是否至少存在一个满足条件的元素 → 使用 Any(predicate) - \
Where().First()\在中文中可以翻译为:“在(满足条件的)其中,取第一个(元素)”。不过,这个翻译可能根据上下文有所调整,以更贴合具体的编程或数据查询语境。在编程中,\Where()\通常用于筛选满足特定条件的元素,而 \First()\则用于从筛选结果中获取第一个元素。所以,更简洁的翻译可能是:“筛选后取第一个符合条件的元素” → 使用 First(predicate) - \
Select(x => x)\翻译成中文可以是:“选择(或映射)每个元素为自身”。这里,\Select\是一个常见的 LINQ(Language Integrated Query,语言集成查询)操作符,用于从集合中选择元素,而 \x => x\是一个 lambda 表达式,表示将每个元素 \x\映射为其自身。因此,整个表达式的意思是“选择(或映射)集合中的每个元素为它自己” 冗余操作 - \
OrderBy().First()\翻译成中文是:“按排序顺序取第一个元素” → 使用 MinBy/MaxBy - \
ToList().Where()\翻译成中文可以是:“转换为列表后进行筛选”。不过,具体翻译可能根据上下文有所不同,但基本意思是先将数据转换为列表形式,然后使用 \Where\方法进行条件筛选 在 ToList() 之前应用 Where()
最新更新
2.0版本 - 增强的代码分析 ✨
StyleCop 集成 ✅
- 集成StyleCop分析器以自动进行样式检查
- 根据行业标准强制实施一致的C#代码风格
- 在代码审查过程中提供详细的风格建议
增强版的Roslyn分析器 ✅(对号,表示正确、确认或完成)
- 安全分析器检测SQL注入、硬编码秘密、不安全的文件操作、弱加密
- 性能分析器识别循环中的字符串连接、不必要的LINQ实体化以及异步模式
- LINQ 优化器为常见的 LINQ 反模式提出优化建议
改进的HTML解析 ✅
- 实现了用于专业HTML转Markdown的Turndown库
- 通过语言识别更好地保存代码块
- 在解析 Microsoft Learn 文档时提高了结构保留性
贡献
这是一个正在进行的项目。欢迎提出改进建议和贡献!
许可证
ISC(互联网标准委员会/互联网安全中心/等,具体含义根据上下文确定)
