MCP 开发者指南
模型上下文协议 (MCP) 是一项开放标准,允许 AI 模型通过统一接口与外部工具和服务进行交互。Visual Studio Code 实现了完整的 MCP 规范,使您能够创建 MCP 服务器,提供工具、提示和资源,以扩展 VS Code 中 AI 代理的功能。
本指南涵盖了构建与 VS Code 和其他 MCP 客户端无缝协作的 MCP 服务器所需的一切知识。
VS Code 中的 MCP 支持目前处于预览阶段。
为什么要使用 MCP 服务器?
通过 MCP 服务器扩展 VS Code 中的聊天功能,并提供语言模型工具,具有以下优势:
- 扩展代理模式,使其具备专门的、特定领域的工具,这些工具会在响应用户提示时自动调用。例如,启用数据库搭建和查询,以动态地为大型语言模型提供相关上下文。
- 针对本地和远程场景的灵活部署选项。
- 在不同工具和平台之间重用您的 MCP 服务器。
在以下情况下,您可能会考虑使用语言模型 API 实现语言模型工具:
- 您希望通过使用扩展 API 与 VS Code 深度集成。
- 您希望通过 Visual Studio Marketplace 分发您的工具和更新。
VS Code 支持的 MCP 功能
VS Code 支持以下 MCP 功能:
-
传输:
- 本地标准输入/输出 (
stdio
) - 可流式传输 HTTP (
http
) - 服务器发送事件 (
sse
) - 传统支持。
- 本地标准输入/输出 (
-
功能:
- 工具:使用额外工具扩展代理模式
- 提示:将可重用提示添加为聊天中的斜杠命令
- 资源:提供用户可以添加为聊天上下文或直接在 VS Code 中进行交互的数据和内容
- 诱导:请求用户输入
- 采样:使用用户配置的模型和订阅进行语言模型请求
- 身份验证:使用 OAuth 授权访问 MCP 服务器
- 服务器指令
- 根目录:提供用户工作区根文件夹的信息
工具
工具定义
VS Code 在代理模式下支持 MCP 工具,根据任务需要调用它们。用户可以通过工具选择器启用和配置它们。工具描述与工具名称一起显示在工具选择器中,并在运行工具前请求确认的对话框中显示。
用户可以在工具确认对话框中编辑模型生成的输入参数。对于所有未标记为 readOnlyHint
注解的工具,将显示确认对话框。
动态工具发现
VS Code 还支持动态工具发现,允许服务器在运行时注册工具。例如,服务器可以根据工作区中检测到的框架或语言,或者响应用户的聊天提示来提供不同的工具。
工具注解
要提供有关工具行为的额外元数据,您可以使用工具注解
title
:工具的人类可读标题,在调用工具时显示在聊天视图中readOnlyHint
:可选提示,指示工具是只读的。VS Code 不会要求确认运行只读工具。
资源
资源使您能够以结构化方式向用户提供数据和内容。用户可以直接在 VS Code 中访问资源,或将其用作聊天提示中的上下文。例如,MCP 服务器可以生成屏幕截图并将其作为资源提供,或者提供对日志文件的访问权限,然后实时更新这些日志文件。
当您定义 MCP 资源时,资源名称会显示在 MCP 资源快速选择中。资源可以通过“MCP: 浏览资源”命令打开,或通过“添加上下文”并选择“MCP 资源”附加到聊天请求。资源可以包含文本或二进制内容。
VS Code 支持资源更新,使用户能够在编辑器中实时查看资源内容的更改。
资源模板
VS Code 还支持资源模板,允许用户在引用资源时提供输入参数。例如,数据库查询工具可以请求数据库表名。
访问带有模板的资源时,系统会在快速选择中提示用户输入所需的参数。您可以提供补全功能来建议参数值。
提示
提示是可重用的聊天提示模板,用户可以通过斜杠命令 (mcp.servername.promptname
) 在聊天中调用它们。提示对于通过突出显示各种工具或提供适应用户本地上下文和服务的内置复杂工作流来帮助用户熟悉您的服务器非常有用。
如果您定义了补全功能来为提示输入参数建议值,则 VS Code 会显示一个对话框以从用户收集输入。
server.prompt(
'teamGreeting',
'Generate a greeting for team members',
{
name: completable(z.string(), value => {
return ['Alice', 'Bob', 'Charlie'].filter(n => n.startsWith(value));
})
},
async ({ name }) => ({
messages: [
{
role: 'assistant',
content: { type: 'text', text: `Hello ${name}, welcome to the team!` }
}
]
})
);
用户可以在提示对话框中输入终端命令,并使用命令输出作为提示的输入。
当您在提示响应中包含资源类型时,VS Code 会将该资源作为上下文附加到聊天提示。
授权
VS Code 支持需要身份验证的 MCP 服务器,允许用户与代表其用户帐户进行操作的 MCP 服务器进行交互。
授权规范将 MCP 服务器作为资源服务器与授权服务器清晰地分开,允许开发人员将身份验证委托给现有身份提供商 (IdP),而不是从头开始构建自己的 OAuth 实现。
VS Code 内置了对 GitHub 和 Microsoft Entra 的身份验证支持。如果您的 MCP 服务器实现了最新规范并使用 GitHub 或 Microsoft Entra 作为授权服务器,用户可以通过“帐户菜单”>“管理受信任的 MCP 服务器”操作来管理哪些 MCP 服务器可以访问其帐户。
VS Code 支持使用 OAuth 2.1 标准和 2.0 标准对 GitHub 和 Microsoft Entra 以外的其他 IdP 进行授权。VS Code 首先通过动态客户端注册 (DCR) 握手开始,如果 IdP 不支持 DCR,则回退到客户端凭据工作流。这为各种 IdP 提供了更大的灵活性,可以为每个 MCP 服务器相应地创建静态客户端 ID 或特定的客户端 ID-密钥对。
用户还可以通过“帐户菜单”查看其身份验证状态。要删除动态客户端注册,用户可以使用命令面板中的“身份验证:删除动态身份验证提供程序”命令。
以下是一个清单,以确保您的 MCP 服务器和 VS Code 的 OAuth 工作流能够正常运行:
- MCP 服务器定义了MCP 授权规范。
- IdP 必须支持 DCR 或客户端凭据
- 重定向 URL 列表必须包含以下 URL:
http://127.0.0.1:33418
和https://vscode.dev/redirect
当 MCP 服务器不支持 DCR 时,用户将经历回退客户端凭据流程
VS Code 仍然支持充当授权服务器的 MCP 服务器,但建议新服务器使用最新规范。
采样
VS Code 为 MCP 服务器提供采样访问。这允许您的 MCP 服务器使用用户配置的模型和订阅进行语言模型请求。例如,使用采样来汇总大型数据集,在将其发送到客户端之前提取信息,或在工具中实现代理决策逻辑。
MCP 服务器首次执行采样请求时,系统会提示用户授权服务器访问其模型。
在使用特定模型进行采样请求时,请注意用户可以使用命令面板中的“MCP:列出服务器”>“配置模型访问”命令限制 MCP 服务器可以使用的模型。当您在 MCP 服务器中指定 modelPreferences
以提供有关用于采样的模型的提示时,VS Code 将从允许的模型中进行选择。
用户可以使用命令面板中的“MCP:列出服务器”>“显示采样请求”命令查看 MCP 服务器发出的采样请求。
工作区根目录
VS Code 向 MCP 服务器提供用户工作区根文件夹信息。
图标
VS Code 支持 MCP 服务器、资源和工具上提供的 icons
。MCP 图标具有 src
属性,该属性是图像的 URI
- 使用 HTTP 或 SSE 传输的 MCP 服务器可以从 MCP 服务器所在的相同权限提供图像。例如,配置在
https://example.com/mcp
的服务器可以从example.com
提供图像。 - 使用 stdio 传输的 MCP 服务器可以使用
file:///
URI 从文件系统提供图像。 - 任何 MCP 服务器都可以将图像嵌入为以
data:
开头的数据 URI。
将 MCP 服务器添加到 VS Code
用户可以通过多种方式在 VS Code 中添加 MCP 服务器:
- 直接从 Web 安装:在您的网站上使用特殊的 MCP 安装 URL (
vscode:mcp/install
)。 - 工作区配置:在工作区的
.vscode/mcp.json
文件中指定服务器配置。 - 全局配置:在用户配置文件中全局定义服务器。
- 自动发现:VS Code 可以从其他工具(如 Claude Desktop)发现服务器。
- 扩展:VS Code 扩展可以通过编程方式注册 MCP 服务器。
- 命令行:使用
--add-mcp
VS Code 命令行选项从命令行安装 MCP 服务器。
了解有关将 MCP 服务器添加到 VS Code 的更多信息。
管理 MCP 服务器
您可以在 VS Code 的扩展视图 (⇧⌘X (Windows, Linux Ctrl+Shift+X)) 中管理已安装的 MCP 服务器列表。
右键单击 MCP 服务器或选择齿轮图标以对服务器执行不同的管理操作。或者,从命令面板运行“MCP:列出服务器”命令以查看已配置的 MCP 服务器列表。然后,您可以选择一个服务器并对其执行操作。
当您打开 .vscode/mcp.json
文件时,VS Code 会在编辑器中显示直接从编辑器启动、停止或重新启动服务器的命令。
创建 MCP 安装 URL
VS Code 提供了一个用于从链接安装 MCP 服务器的 URL 处理程序:vscode:mcp/install?{json-configuration}
(Insiders: vscode-insiders:mcp/install?{json-configuration}
)。
以 {\"name\":\"server-name\",\"command\":...}
的形式提供 JSON 服务器配置,然后对其执行 JSON 字符串化和 URL 编码。例如,使用以下逻辑创建安装 URL:
// For Insiders, use `vscode-insiders` instead of `code`
const link = `vscode:mcp/install?${encodeURIComponent(JSON.stringify(obj))}`;
此链接可在浏览器中使用,或通过命令行打开,例如在 Linux 上通过 xdg-open $LINK
。
在您的扩展中注册 MCP 服务器
要在您的扩展中注册 MCP 服务器,您需要执行以下步骤:
- 在扩展的
package.json
文件中定义 MCP 服务器定义提供程序。 - 使用
vscode.lm.registerMcpServerDefinitionProvider
API 在您的扩展代码中实现 MCP 服务器定义提供程序。
您可以从一个基本的示例开始,了解如何在 VS Code 扩展中注册 MCP 服务器。
1. package.json
中的静态配置
希望注册 MCP 服务器的扩展必须在 package.json
中贡献 contributes.mcpServerDefinitionProviders
扩展点,并提供提供程序的 id
。此 id
应与实现中使用的 id
匹配。
{
...
"contributes": {
"mcpServerDefinitionProviders": [
{
"id": "exampleProvider",
"label": "Example MCP Server Provider"
}
]
}
...
}
2. 实现提供程序
要在您的扩展中注册 MCP 服务器,请使用 vscode.lm.registerMcpServerDefinitionProvider
API 为服务器提供 MCP 配置。该 API 接受一个 providerId
字符串和一个 McpServerDefinitionProvider
对象。
McpServerDefinitionProvider
对象具有三个属性:
onDidChangeMcpServerDefinitions
:当 MCP 服务器配置更改时触发的事件。provideMcpServerDefinitions
:返回 MCP 服务器配置数组 (vscode.McpServerDefinition[]
) 的函数。resolveMcpServerDefinition
:当 MCP 服务器需要启动时编辑器调用的函数。使用此函数执行可能需要用户交互的额外操作,例如身份验证。
一个 McpServerDefinition
对象可以是以下类型之一:
vscode.McpStdioServerDefinition
:表示通过运行本地进程并对其 stdin 和 stdout 流进行操作可用的 MCP 服务器。vscode.McpHttpServerDefinition
:表示使用可流式传输 HTTP 传输可用的 MCP 服务器。
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: 'https://: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;
}
}));
}
MCP 服务器故障排除和调试
VS Code 中的 MCP 开发模式
在开发 MCP 服务器时,您可以通过在 MCP 服务器配置中添加 dev
键来启用 MCP 服务器的开发模式。这是一个具有两个属性的对象:
-
watch
:一个文件 glob 模式,用于监视文件更改以重新启动 MCP 服务器。 -
debug
:允许您为 MCP 服务器设置调试器。目前,VS Code 支持调试 Node.js 和 Python MCP 服务器。Node.js MCP 服务器
要调试 Node.js MCP 服务器,请将
debug.type
属性设置为node
。{ "servers": { "my-mcp-server": { "type": "stdio", "command": "node", "cwd": "${workspaceFolder}", "args": ["./build/index.js"], "dev": { "watch": "src/**/*.ts", "debug": { "type": "node" } } } } }
Python MCP 服务器
要调试 Python MCP 服务器,请将
debug.type
属性设置为debugpy
,如果debugpy
模块未安装在默认的 Python 环境中,可以选择将debug.debugpyPath
属性设置为debugpy
模块的路径。{ "servers": { "my-python-mcp-server": { "type": "stdio", "command": "python", "cwd": "${workspaceFolder}", "args": ["./server.py"], "dev": { "watch": "**/*.py", "debug": { "type": "debugpy", "debugpyPath": "/path/to/debugpy" } } } } }
MCP 输出日志
当 VS Code 遇到 MCP 服务器问题时,它会在聊天视图中显示一个错误指示器。
选择聊天视图中的错误通知,然后选择“显示输出”选项以查看服务器日志。或者,从命令面板运行“MCP:列出服务器”,选择服务器,然后选择“显示输出”。
最佳实践
- 命名约定以确保唯一且具有描述性的名称
- 实施适当的错误处理和验证,并提供描述性错误消息
- 使用进度报告通知用户长时间运行的操作
- 保持工具操作集中和原子性以避免复杂的交互
- 清晰地记录您的工具,并提供帮助用户理解何时使用它们的描述
- 优雅地处理缺失的输入参数,通过提供默认值或清晰的错误消息
- 为资源设置 MIME 类型以确保在 VS Code 中正确处理不同的内容类型
- 使用资源模板允许用户在访问资源时提供输入参数
- 缓存资源内容以提高性能并减少不必要的网络请求
- 为采样请求设置合理的令牌限制以避免过度的资源使用
- 在使用采样响应之前验证采样响应
命名约定
建议对 MCP 服务器及其组件使用以下命名约定:
组件 | 命名约定指南 |
---|---|
工具名称 |
|
工具输入参数 |
|
资源名称 |
|
资源模板参数 |
|
提示名称 |
|
提示输入参数 |
|
开始创建 MCP 服务器
VS Code 拥有开发自己的 MCP 服务器所需的所有工具。虽然 MCP 服务器可以用任何能够处理 stdout
的语言编写,但 MCP 的官方 SDK 是一个很好的起点:
您可能还会发现MCP for Beginners 课程有助于您开始构建您的第一个 MCP 服务器。