SuperAPI AI 工具集

mcp-csharp-debug

编程与开发

查看项目

更新于 10-15 18:31

技能介绍

用途

mcp-csharp-debug 用于在本地运行、调试和交互式测试 C# MCP 服务器。它覆盖本地执行、IDE 断点调试、MCP Inspector 协议级测试以及 GitHub Copilot Agent Mode 集成。

适用时机包括:首次在本地运行 MCP 服务器;配置 VS Code 或 Visual Studio 调试 MCP 服务器;使用 MCP Inspector 交互式测试工具;验证工具是否出现在 GitHub Copilot Agent Mode 中;诊断工具未被发现、协议错误、服务器崩溃等问题;设置 mcp.json 或 .mcp.json 配置。

停止信号:尚无项目时,应先使用 mcp-csharp-create;需要自动化测试时,应使用 mcp-csharp-test;生产部署问题应使用 mcp-csharp-publish。

输入

  • 项目路径(必需):.csproj 文件或项目目录的路径。
  • 传输类型(推荐):stdio 或 http;未指定时从 .csproj 检测。
  • IDE(推荐):VS Code 或 Visual Studio;未指定时从环境检测。

代理行为:通过检查 .csproj 中是否存在对 ModelContextProtocol.AspNetCore 的 PackageReference 来判断传输类型。存在则为 HTTP,否则为 stdio。

工作流程

第 1 步:本地运行服务器

stdio 传输:

cd <ProjectDir>
dotnet run

进程启动并在 stdin 上等待 JSON-RPC 消息。stdout 无输出表示运行正常。

HTTP 传输:

cd <ProjectDir>
dotnet run
# 服务器监听 http://localhost:3001(或配置的端口)

第 2 步:生成 MCP 配置

检测 IDE 和传输类型,然后创建相应的配置文件。

VS Code:创建 .vscode/mcp.json。

stdio:

{
  "servers": {
    "<ProjectName>": {
      "type": "stdio",
      "command": "dotnet",
      "args": ["run", "--project", "<path/to/ProjectFile.csproj>"]
    }
  }
}

HTTP:

{
  "servers": {
    "<ProjectName>": {
      "type": "http",
      "url": "http://localhost:3001"
    }
  }
}

Visual Studio:在解决方案根目录创建 .mcp.json(JSON 结构相同)。

详细的 IDE 特定配置(launch.json、环境变量、密钥)参见 references/ide-config.md。

第 3 步:使用 MCP Inspector 测试

MCP Inspector 提供用于测试工具、查看 schema 和检查协议消息的 UI。

stdio 服务器:

npx @modelcontextprotocol/inspector dotnet run --project <path/to/ProjectFile.csproj>

HTTP 服务器:

启动服务器:dotnet run

运行 Inspector:npx @modelcontextprotocol/inspector

连接到 http://localhost:3001

详细的 Inspector 能力、用法和故障排除参见 references/mcp-inspector.md。

第 4 步:使用 GitHub Copilot Agent Mode 测试

  1. 打开 GitHub Copilot Chat → 切换到 Agent 模式。
  2. 点击 Select Tools(扳手图标)→ 验证服务器和工具已列出。
  3. 使用应触发工具提示词进行测试。
  4. 在提示时批准工具执行。

如果工具未出现,排查工具发现:

先重新构建——过期的构建是首要原因:

dotnet build

然后重启 MCP 服务器(在 VS Code 中点击 Stop → Start,或重启 dotnet run)。

检查特性和注册:

  • 验证类上的 [McpServerToolType] 和每个公共方法上的 [McpServerTool]。
  • 方法可以是静态或实例(实例类型需要 DI 注册)。
  • 验证 Program.cs 中的 .WithTools<T>() 或 .WithToolsFromAssembly()。
  • 检查 mcp.json 指向正确的项目路径。

如果仍未出现,显式引用工具:Using #tool_name, do X。

第 5 步:设置断点调试

  1. 在工具方法中设置断点。
  2. 使用调试器启动:
    • VS Code:F5(需要 launch.json,参见 references/ide-config.md)。
    • Visual Studio:F5 或右键项目 → Debug → Start。
  3. 触发工具(通过 Inspector、Copilot 或测试客户端)。
  4. 执行在断点处暂停。

关键:在 Debug 配置中构建。Release 构建中断点不会命中。

诊断工具错误

当工具单独运行正常但通过 MCP 失败时,逐项检查:

  • 检查 MCP 输出通道——VS Code:View → Output → 选择 MCP 服务器名称,显示协议错误和服务器 stderr。Visual Studio:检查 Output 窗口中的 MCP 相关消息。
  • 附加调试器——在失败的工具方法中设置断点并单步执行(见第 5 步)。检查异常是否被吞掉或参数值异常。
  • 使用 MCP Inspector 测试——通过 Inspector 直接调用工具,以隔离问题在工具代码还是客户端集成:npx @modelcontextprotocol/inspector dotnet run --project <path>。
  • 检查 stdout 污染(仅 stdio)——任何 Console.WriteLine() 或输出到 stdout 的日志都会破坏 JSON-RPC 协议。将所有输出重定向到 stderr(见第 6 步)。
  • 检查常见原因:
    • 序列化错误——返回类型必须可 JSON 序列化,避免循环引用。
    • DI 注册——缺少服务注册会导致运行时异常,检查 Program.cs。
    • 参数绑定——确保参数名称和类型与工具 schema 匹配。
    • 未处理异常——将工具逻辑包裹在 try-catch 中并记录到 stderr 或文件。
  • 启用文件日志——用于事后分析,记录到文件:
builder.Logging.AddFile("mcp-debug.log"); // 或使用 Serilog/NLog

第 6 步:配置日志

对 stdio 传输至关重要:任何输出到 stdout(包括 Console.WriteLine)都会破坏 MCP JSON-RPC 协议,导致响应乱码或崩溃。所有日志和诊断输出必须发送到 stderr。

stdio 传输——仅记录到 stderr:

builder.Logging.AddConsole(options =>
    options.LogToStandardErrorThreshold = LogLevel.Trace);

HTTP 传输——HTTP 传输日志配置参见 references/ide-config.md。

在工具方法中——通过构造函数注入 ILogger<T> 并使用 logger.LogDebug() / logger.LogError()。通过 ILogger 记录日志会遵循上述 stderr 配置。

验证清单

  • 服务器通过 dotnet run 启动无错误。
  • MCP Inspector 连接并列出所有预期工具。
  • 通过 Inspector 调用工具返回预期结果。
  • 在 IDE 中调试时断点命中。
  • 工具出现在 GitHub Copilot Agent Mode 工具列表中。
  • stdio:stdout 无日志输出(仅 stderr)。

常见陷阱

  • 工具未出现或更改后过期:先重新构建 dotnet build,然后重启服务器。若仍缺失,验证类上的 [McpServerToolType]、方法上的 [McpServerTool] 以及 Program.cs 中的 WithTools<T>() 或 WithToolsFromAssembly()。
  • stdio 服务器产生乱码输出:Console.WriteLine() 或日志写入 stdout。所有输出必须到 stderr。在控制台日志记录器上设置 LogToStandardErrorThreshold = LogLevel.Trace。
  • HTTP 服务器在 MCP 端点返回 404:Program.cs 中缺少 app.MapMcp()。
  • 断点未命中:以 Release 模式构建。在 Debug 中重新构建:dotnet build -c Debug,然后重启。
  • 环境变量未传递给服务器:在 mcp.json 中添加 "env" 部分。VS Code 中的密钥使用 "${input:var_id}" 语法。
  • MCP Inspector 无法连接 HTTP 服务器:服务器未运行或端口错误。检查 dotnet run 输出中的监听 URL。

相关技能

  • mcp-csharp-create——创建新的 MCP 服务器项目。
  • mcp-csharp-test——自动化测试和评估。
  • mcp-csharp-publish——NuGet、Docker、Azure 部署。

参考文件

  • references/mcp-inspector.md——详细的 MCP Inspector 用法:安装、连接服务器、功能演练、故障排除。加载时机:用户需要详细的 Inspector 指导或遇到连接问题。
  • references/ide-config.md——完整的 VS Code 和 Visual Studio 配置:mcp.json 模板、launch.json、环境变量、条件断点。加载时机:设置 IDE 调试或配置环境特定设置。

更多信息

  • MCP Inspector——MCP 服务器的交互式调试工具。
  • VS Code MCP 文档——在 VS Code 中配置 MCP 服务器。