VSCode MCP 服务器

1,701 阅读7分钟

mcp-server-vscode 是一个由 SemanticWorkbenchTeam (微软官方)开发、在 VS Code 市场发布的扩展程序。它的主要功能是将 VS Code 变成一个 MCP 服务器,从而让外部 AI 工具能够更深入地与 VS Code 交互,访问和操作代码、文件、调试等功能。

简单来说,mcp-server-vscode 扩展让 VS Code 成为一个 MCP 服务器。安装这个扩展后,AI 工具可以通过 MCP 协议“连接”到你的 VS Code,读取你的代码、编辑文件、运行命令,甚至进行调试,就像一个超级智能的编程助手直接在你的编辑器里工作。

换句话说,这个扩展就像一座桥梁,把 VS Code 的功能开放给外部 AI,让 AI 能更智能、更高效地帮助你编程。

image.png

概述

VSCode MCP 服务器是一个在 VSCode 中集成的扩展,它作为一个模型上下文协议(MCP)服务器,主要目的是暴露一个代码诊断工具——code_checker,该工具会聚合诊断信息(类似于 VSCode 的问题面板显示的内容),并通过服务器推送事件(SSE)使外部 AI 助手可以访问这些信息。这样,您的助手就可以调用 MCP 方法,及时从工作区中检索诊断信息。

特性

  • 自动启动:扩展在 VSCode 启动时自动激活(通过 activationEvents: ["*"] 配置),确保 MCP 服务器始终运行,无需手动干预。

  • MCP 服务器集成:基于 MCP TypeScript SDK(@modelcontextprotocol/sdk)构建,扩展实例化 MCP 服务器,注册诊断工具并处理 MCP 协议消息。

  • 诊断工具 (code_checker) :已注册的 code_checker 工具收集来自 VSCode 内置语言服务的诊断信息,过滤掉无错误的文件。被调用时,它会返回格式化的 JSON 对象,包含有问题的文件的诊断信息。

  • 焦点编辑器工具 (focus_editor) :打开指定文件,并导航到指定的行列。这对用户将文件展示到可视焦点中很有用,但不会将文件内容包括在工具调用结果中。

  • 符号搜索工具 (search_symbol) :在工作区中搜索符号,主要使用“转到定义”功能,若没有找到则回退到文本搜索(类似于 Ctrl+Shift+F)。可以选择使用 focus_editor 工具将搜索结果打开到编辑器中。

  • 调试会话管理工具:扩展提供了直接使用 MCP 管理 VSCode 调试会话的工具:

    • list_debug_sessions: 检索所有活动的调试会话。
    • start_debug_session: 使用指定配置启动新的调试会话。
    • stop_debug_session: 停止指定名称的调试会话。
    • restart_debug_session: 通过停止当前会话并使用指定配置重新启动调试会话(新功能)。
  • SSE 通信:一个基于 Express 的 HTTP 服务器运行在可配置端口(默认:6010)上,动态处理端口冲突。它暴露以下接口:

    • GET /sse:用于建立长期的 SSE 连接。如果默认端口(6010)不可用,用户可以通过 VSCode 设置配置新的端口(见动态端口配置)。
    • POST /messages:接收来自外部客户端(如 AI 助手)的 MCP 消息。特别注意正确处理请求体,避免流相关错误。
  • 详细日志:所有活动,包括服务器启动、SSE 连接状态和消息处理事件,都记录在一个名为“VSCode MCP 服务器”的输出通道,以帮助调试和透明化。

从 Claude Desktop 使用扩展(MCP 客户端)

要将 VSCode MCP 服务器与 Claude Desktop 配合使用,您需要配置 Claude Desktop 以连接到在 VSCode 中运行的 MCP 服务器。由于 MCP 服务器使用 SSE 传输,而 Claude Desktop 只支持 stdio 传输,因此需要使用 mcp-proxy 来桥接这两者之间的通信。

安装 MCP Proxy:

  • 选项 1:使用 uv(推荐)

    uv tool install mcp-proxy
    
  • 选项 2:使用 pipx(可选)

    pipx install mcp-proxy
    

配置 Claude Desktop:

  1. 打开 Claude Desktop,进入 文件 > 设置 > 开发者 标签。

  2. 点击 编辑配置 打开配置文件,使用您喜欢的编辑器修改配置文件内容。

  3. mcpServers 中添加以下条目:

    {
        "mcpServers": {
            "vscode": {
                "command": "mcp-proxy",
                "args": ["http://127.0.0.1:6010/sse"]
            }
        }
    }
    
  4. 重新启动 Claude Desktop:
    必须通过 文件 > 退出 选项重启 Claude Desktop,才能使更改生效。仅关闭窗口或使用 文件 > 关闭 不会停止应用程序。

重启后,Claude Desktop 应能成功连接到 VSCode 中运行的 MCP 服务器。

MCP 服务器管理

MCP 服务器的状态现在可以通过命令面板直接管理:

  • 停止 MCP 服务器mcpServer.stopServer):停止当前运行的 MCP 服务器。
  • 启动 MCP 服务器mcpServer.startServer):在配置的或下一个可用的端口上启动服务器。

这些命令有助于动态管理服务器生命周期,无需重启 VSCode。

动态端口配置

如果端口已经被占用,扩展将建议下一个可用的端口并动态应用。日志中会显示所选端口的相关信息。

用户可以在运行时通过命令面板配置或更改 MCP 服务器的端口:

  1. 打开命令面板(Ctrl+Shift+P 或 Cmd+Shift+P)。
  2. 搜索 Set MCP Server Port
  3. 输入所需的端口号并确认。

服务器将在新选择的端口上重新启动,并且配置将更新为未来的会话。

也可以通过 VSCode 设置来设置 HTTP 服务器端口:

  1. 打开 VSCode 设置(文件 > 首选项 > 设置 或 Ctrl+,)。
  2. 搜索 mcpServer.port
  3. 设置所需的端口号。

重启 VSCode 后更改将生效。

MCP 服务器自动启动

默认情况下,MCP 服务器会在 VSCode 激活时自动启动。若要禁用此功能:

  1. 打开 VSCode 设置(文件 > 首选项 > 设置 或 Ctrl+,)。
  2. 搜索 mcpServer.startOnActivate
  3. 将设置切换为 false

如果您更喜欢手动启动服务器,可以使用“启动 MCP 服务器”命令。

扩展开发

开发和调试扩展的步骤,源代码可在 GitHub 上找到。

先决条件

  1. 克隆仓库:

    git clone https://github.com/microsoft/semanticworkbench.git
    
  2. 导航到项目目录:

    cd semanticworkbench/mcp-servers/mcp-server-vscode
    
  3. 安装依赖:

    pnpm install
    
  4. 打包扩展:

    pnpm run package-extension
    

这将生成一个 .vsix 文件。

在本地安装扩展

  1. 打开主 VSCode 实例。

  2. 安装 VSIX 包:

    • Ctrl+Shift+P(或在 macOS 上按 Cmd+Shift+P)打开命令面板。
    • 输入并选择“扩展:从 VSIX 安装...”。
    • 导航并选择生成的 .vsix 文件。
  3. 重新加载并验证:

    • 安装后,重新加载 VSCode(通过“开发者:重新加载窗口”命令面板)。
    • 验证扩展是否已激活。检查“MCP 服务器日志”输出通道,确认 MCP 服务器已启动并监听配置的端口(默认为 6010)。

调试扩展

启动调试:打开项目并按 F5 启动扩展开发主机,这将根据 activationEvents: ["*"] 设置自动激活扩展。

MCP 服务器操作:扩展激活时:

  • 启动 MCP 服务器并注册 code_checker 工具。

  • 在 6010 端口启动 Express HTTP 服务器:

    • GET /sse:建立 SSE 连接(外部客户端连接此处)。
    • POST /messages:处理传入的 MCP 协议消息。
  • 所有活动都输出到“MCP 服务器日志”通道(将自动显示)。

测试 MCP 服务器

可以使用 curl 测试服务:

步骤 1:建立 SSE 连接
在终端 1 中运行:

curl -N http://127.0.0.1:6010/sse

您应该看到类似的输出:

event: endpoint
data: /messages?sessionId=your-session-id

步骤 2:发送初始化请求
在终端 2 中,使用从终端 1 获取的 session ID(如果需要),发送 POST 请求(包括必要的字段,如工作区):

curl -X POST "http://127.0.0.1:6010/messages?sessionId=your-session-id" \
-H "Content-Type: application/json" \
-d '{
  "jsonrpc": "2.0",
  "method": "initialize",
  "id": 0,
  "params": {
    "protocolVersion": "2024-11-05",
    "capabilities": {
      "roots": { "listChanged": true }
    },
    "clientInfo": {
      "name": "mcp",
      "version": "0.1.0"
    },
    "workspace": {
      "folders": []
    }
  }
}'

如果配置正确,MCP 服务器应该能够处理初始化消息而不出现错误。