诊断会话MCP服务器
用于分析.diagsession存档中的Windows ETL跟踪文件的生产级模型上下文协议(MCP)服务器。基于干净的架构原则和企业最佳实践构建。
特性
- ETL跟踪分析:使用CPU采样数据分析Windows性能记录器跟踪
- 呼叫树生成:构建显示包容性/排他性CPU时间的分层调用树
- 符号分辨率:与Microsoft符号服务器集成,用于函数名称解析
- .diagsession支持:自动从.diagsession ZIP存档中提取ETL文件
- 流程过滤:按特定进程ID筛选分析
- 深度控制:限制调用树深度以实现高效响应
- MCP协议:通过标准MCP工具界面显示分析
建筑
服务器遵循严格分离关注点的分层架构:
┌─────────────────────────────────────┐
│ MCP Protocol Layer │ Tool handlers, schemas
├─────────────────────────────────────┤
│ Application Layer │ Use cases, DTOs
├─────────────────────────────────────┤
│ Domain Layer │ Business logic, models
├─────────────────────────────────────┤
│ Infrastructure Layer │ TraceEvent adapter, ZIP extraction
└─────────────────────────────────────┘关键组件
- 领域模型:
CallTreeNode,FunctionStats,AnalysisResult,AnalysisOptions - 域接口:
IEtlAnalyzer,IDiagSessionExtractor - 应用:
AnalyzeDiagSessionUseCaseDTO,RequestContext - 基础设施:
TraceEventEtlAnalyzer,DiagSessionArchiveExtractor - 主控程序:
AnalyzeCallTreeTool
安装
先决条件
- .NET 8.0 SDK或更高版本
- Windows操作系统(TraceEvent库需要)
构建
dotnet restore
dotnet build跑
dotnet run --project DiagSession-Mcp.csproj服务器将启动并通过stdio传输监听MCP请求。
MCP工具:analyze_call_tree
参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
diagsession_path | string | 是 | .diagsession或.etl文件的路径 |
max_depth | integer | 否 | 最大调用树深度(默认值:10,最大值:50) |
process_id | integer | 否 | 按特定进程ID筛选 |
symbol_path | string | 否 | 符号服务器路径 |
timeout_seconds | integer | 否 | 符号加载超时(默认值:30,最大值:300) |
max_symbol_size_mb | number | 否 | 跳过大于此大小的符号 |
verbose | boolean | 否 | 启用详细日志记录 |
响应架构
{
"callTrees": {
"4036": {
"functionName": "InterruptEstimator (PID: 4036)",
"moduleName": null,
"inclusiveSamples": 246,
"exclusiveSamples": 0,
"inclusivePercent": 100.0,
"exclusivePercent": 0.0,
"inclusiveTimeMs": 246.0,
"exclusiveTimeMs": 0.0,
"children": [...]
}
},
"processNames": {
"4036": "InterruptEstimator"
},
"totalSamples": 246,
"profileIntervalMs": 1.0,
"analysisTimestamp": "2025-11-25T07:36:00Z",
"correlationId": "abc123",
"topFunctionsByExclusive": [...],
"topFunctionsByInclusive": [...]
}错误代码
FILE_NOT_FOUND:指定的文件不存在INVALID_PARAMS:提供的参数无效TIMEOUT:分析超时INTERNAL_ERROR:意外的服务器错误
配置
配置从加载 appsettings.json 以及环境变量。
应用程序参数
{
"DiagSessionMcp": {
"SymbolPath": "srv*c:\\symbols*https://msdl.microsoft.com/download/symbols",
"DefaultTimeoutSeconds": 30,
"MaxConcurrentAnalyses": 2,
"MaxMemoryMB": 4096,
"AllowedDirectories": ["C:\\DiagSessions"],
"LogLevel": "Information"
}
}环境变量
_NT_SYMBOL_PATH:覆盖符号服务器路径DIAGSESSION_MCP__SYMBOLPATH:通过配置覆盖符号路径
发展
项目结构
DiagSession-Mcp/
├── src/
│ ├── Domain/
│ │ ├── Models/ # Domain entities
│ │ └── Interfaces/ # Domain contracts
│ ├── Application/
│ │ ├── UseCases/ # Application logic
│ │ ├── DTOs/ # Data transfer objects
│ │ └── Common/ # Cross-cutting concerns
│ ├── Infrastructure/
│ │ └── Adapters/ # External system adapters
│ ├── Mcp/
│ │ └── Tools/ # MCP tool implementations
│ └── Program.cs # Entry point
├── appsettings.json
└── DiagSession-Mcp.csproj测试
# Run all tests
dotnet test
# Run specific test category
dotnet test --filter Category=Unit
dotnet test --filter Category=Integration设计原则
此服务器遵循企业架构最佳实践:
- 限界上下文:专注于ETL跟踪分析
- 端口和适配器:接口背后的外部依赖关系
- 领域驱动设计:具有业务逻辑的丰富域模型
- 关注点分离:严格分层,责任明确
- 依赖注入:通过构造函数注入的所有依赖项
- 不变性:DTO和域模型在可能的情况下是不可变的
- 明确合同:对工具模式进行版本控制和记录
- 可观测性:带有关联ID的结构化日志记录
- 错误处理:域错误与技术故障分开
- 可测试性:每一层都可以独立测试
许可证
麻省理工学院
鸣谢
内置:
