在 VS Code 中尝试

MCP 服务器

模型上下文协议 (MCP) 是一种开放标准,它允许 AI 模型通过统一的接口与外部工具和服务进行交互。Visual Studio Code 可以作为 MCP 客户端,使用户能够在代理模式下访问 MCP 工具。本文将指导你如何在 VS Code 扩展中注册 MCP 服务器。

VS Code 从工作区文件夹中的 .vscode/mcp.json 文件以及工作区、远程和用户设置的 mcp 部分中检索 MCP 服务器配置。它还可以从其他工具(包括 Claude Desktop)的配置中自动发现它们。

VS Code 扩展还可以通过编程方式注册 MCP 服务器配置,以避免用户需要手动配置它们。如果你已经有一个 MCP 服务器并希望将其作为扩展激活的一部分进行注册,或者你的扩展依赖于 MCP 服务器,这将非常有用。

除了使用 MCP 服务器来扩展聊天功能之外,你还可以直接在扩展中贡献语言模型工具。如果你想通过使用扩展 API 与 VS Code 深度集成,或者避免用户必须在单独的进程中安装和运行 MCP 服务器,这种方法会很有用。

重要

VS Code 中的 MCP 支持目前处于预览阶段。

注册 MCP 服务器

要在扩展中注册 MCP 服务器,请使用 vscode.lm.registerMcpServerDefinitionProvider API 为服务器提供 MCP 配置。此 API 接受一个 providerId 字符串和一个 McpServerDefinitionProvider 对象。

在调用此方法之前,扩展必须在 package.json 中通过提供程序的 id 贡献 contributes.mcpServerDefinitionProviders 扩展点。

McpServerDefinitionProvider 对象有三个属性

  • onDidChangeMcpServerDefinitions: 当 MCP 服务器配置更改时触发的事件。
  • provideMcpServerDefinitions: 返回 MCP 服务器配置数组(vscode.McpServerDefinition[])的函数。
  • resolveMcpServerDefinition: 当 MCP 服务器需要启动时,编辑器调用的函数。使用此函数执行可能需要用户交互的额外操作,例如身份验证。

McpServerDefinition 对象可以是以下类型之一

  • vscode.McpStdioServerDefinition: 表示通过运行本地进程并在其标准输入和标准输出流上操作而可用的 MCP 服务器。
  • vscode.McpHttpServerDefinition: 表示使用可流式传输的 HTTP 传输而可用的 MCP 服务器。

以下示例演示了如何在扩展中注册 MCP 服务器,并在启动服务器时提示用户输入 API 密钥。

import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
    const didChangeEmitter = new vscode.EventEmitter<void>();

    context.subscriptions.push(vscode.lm.registerMcpServerDefinitionProvider('exampleProvider', {
        onDidChangeMcpServerDefinitions: didChangeEmitter.event,
        provideMcpServerDefinitions: async () => {
            let servers: vscode.McpServerDefinition[] = [];

            // Example of a simple stdio server definition
            servers.push(new vscode.McpStdioServerDefinition(
            {
                label: 'myServer',
                command: 'node',
                args: ['server.js'],
                cwd: vscode.Uri.file('/path/to/server'),
                env: {
                    API_KEY: ''
                },
                version: '1.0.0'
            });

            // Example of an HTTP server definition
            servers.push(new vscode.McpHttpServerDefinition(
            {
                label: 'myRemoteServer',
                uri: 'http://localhost:3000',
                headers: {
                    'API_VERSION': '1.0.0'
                },
                version: '1.0.0'
            }));

            return servers;
        },
        resolveMcpServerDefinition: async (server: vscode.McpServerDefinition) => {

            if (server.label === 'myServer') {
                // Get the API key from the user, e.g. using vscode.window.showInputBox
                // Update the server definition with the API key
            }

            // Return undefined to indicate that the server should not be started or throw an error
            // If there is a pending tool call, the editor will cancel it and return an error message
            // to the language model.
            return server;
        }
    }));
}

package.json 文件应包含相应的 contributes/mcpServerDefinitionProviders 部分

{
    ...
    "contributes": {
        "mcpServerDefinitionProviders": [
            {
                "id": "exampleProvider",
                "label": "Example MCP Server Provider"
            }
        ]
    }
    ...
}

开始

通过完整的示例了解如何在 VS Code 扩展中注册 MCP 服务器