使用工具配合代理

工具在Visual Studio Code中扩展了代理,提供专门功能以完成特定任务,如搜索代码、运行命令、获取网页内容或调用API。VS Code 支持三种工具类型:内置工具、模型上下文协议(MCP)工具和扩展工具。

本文介绍了 VS Code 中可用的不同类型工具,如何在聊天提示中使用它们,以及如何管理工具调用和批准。

工具类型

VS Code 支持三种你可以在聊天中使用的工具:

内置工具

VS Code 提供了一套全面的内置工具,这些工具会自动在聊天中可用。这些工具涵盖常见的开发任务,并针对您的工作空间进行了优化。

内置工具无需安装或配置,一旦开始使用聊天即可使用。

有关内置工具的完整列表及其描述,请参见聊天工具参考文献

MCP 工具

模型上下文协议(MCP)是一个开放标准,使人工智能模型能够通过统一界面使用外部工具和服务。MCP服务器提供了你可以添加到VS Code中,扩展聊天功能的工具。

你需要先安装并配置MCP服务器,才能在聊天中使用他们的工具。MCP服务器可以在你的机器上本地运行,也可以远程托管。MCP 工具还可以通过 MCP 应用返回交互式 UI 组件。

了解更多关于在VS Code中配置MCP服务器的方法。

重要

你的组织可能已经禁用了VS Code中MCP服务器的使用,或者限制了你能使用的MCP服务器。如需更多信息,请联系您的管理层。

扩展工具

VS Code 扩展可以贡献与编辑器深度集成的工具。扩展工具使用语言模型工具 API,在访问全系列 VS Code 扩展 API 的同时提供专用功能。

当你安装了贡献扩展工具的扩展时,这些工具会自动可用。用户不需要单独安装或配置,只需安装扩展本身。

对于想要创建扩展工具的开发者,请参阅语言模型工具 API 指南

启用聊天工具

在使用聊天工具之前,你需要先在聊天视图中启用它们。你可以使用工具选择器,按请求开启或禁用工具。你可以通过安装MCP服务器扩展来添加更多工具。

提示

只选择与提示相关的工具,以提升效果。

要访问工具选择器:

  1. 打开聊天视图,从代理选择器中选择“代理”。

  2. 在聊天输入栏中选择配置工具按钮。

    截图显示聊天视图,在聊天输入中高亮“配置工具”按钮。

  3. 选择或取消选择工具以控制当前请求可用的工具。

    使用搜索框筛选工具列表。

当你用提示文件自定义代理自定义聊天时,可以指定针对特定提示或模式可用的工具。了解更多关于工具清单优先顺序的信息。

在提示词中使用工具

使用Agent时,代理会根据你的提示和请求上下文,自动从启用的工具中决定使用哪些工具。代理会自主选择并调用相关工具以完成任务。

你也可以在提示中明确引用工具,方法是输入“工具”后跟工具名称。当你想确保使用特定工具时,这非常有用。在聊天输入栏输入,查看可用工具列表,包括内置工具、已安装服务器的MCP工具、扩展工具和工具集。##

显式工具引用示例:

  • “总结一下 #fetch https://code.visualstudio.com/updates 的内容”
  • “Next.js的路由是怎么运作的?#githubRepo vercel/next.js”
  • “解决 #problems 的问题”
  • “请解释认证流程 #codebase”

有些工具直接在提示中接受参数。例如,#fetch需要一个网址和#githubRepo需要一个仓库名称。

提示

默认情况下,工具调用详情会在聊天对话中收缩。你可以通过在聊天中选择工具摘要行来恢复它们的折叠,或者用

chat.agent.thinking.collapsedTools
  • 在VS代码中打开
  • 在VS Code Insiders中开放
环境(实验)。

工具审批

有些工具需要你的批准才能运行。这是一种安全措施,因为工具可以执行修改文件、环境或通过恶意工具输出进行提示注入攻击的作。

当工具需要批准时,会弹出确认对话框,显示工具详情。在批准工具前,请仔细审查信息。你可以批准该工具用于一次性使用、当前会话、当前工作区,或所有未来的调用。

工具确认对话框的截图,显示工具详情和审批选项。

工具和代理作可能导致文件修改。了解如何防止对工作区敏感文件的意外编辑。

重要

在批准前一定要仔细审查工具参数,尤其是那些修改文件、运行命令或访问外部服务的工具。请参见在VS Code中使用AI的安全考虑

启用或禁用工具自动批准(实验阶段)

默认情况下,你可以选择自动批准任何工具。为了防止意外批准,你可以用以下方式禁用特定工具的自动批准

chat.tools.eligible自动批准
  • 在VS代码中打开
  • 在VS Code Insiders中开放
组织设置。将值设为错误总是需要人工批准该工具。

组织还可以使用设备管理策略来强制特定工具进行人工审批。更多信息请参阅企业文档

URL 审核

当工具尝试访问某个URL,例如通过取球工具,采用两步审批流程来保护您免受恶意或意外内容的影响。VS Code 会在聊天视图显示一个确认对话框,并显示你的评论网址详情。

  • 预批准:批准对该URL的请求

    这一步确保你信任被联系的域名,并能防止敏感数据被发送到不受信任的网站。

    URL 审核对话框的截图,显示了 URL 详情和批准选项。

    你可以选择一次性批准,或者自动批准未来对特定URL或域名的请求。选择自动批准不会影响复审结果的需求。当你选择“允许请求”时,你可以选择配置该URL或域名的预审和发布审批。

    注释

    预批准会尊重“受信任域名”功能。如果域名被列入,你会自动被批准对该域名提出请求,并推迟回复审核步骤。

  • 审核批准:批准从URL获取的响应内容

    这一步确保你在获取内容添加到聊天或传递给其他工具之前先审查,防止潜在的提示注入攻击。

    例如,你可能批准从知名网站获取内容的请求,比如 GitHub.com。但由于内容,如议题描述或评论,是用户生成的,可能包含有害内容,从而控模型的行为。

    你可以选择一次性批准,或者自动批准来自特定网址或域名的未来回复。

    重要

    审核后步骤不与“受信任域名”功能关联,且始终需要您的审核。这是一种安全措施,旨在防止你本可信任的域名出现不受信任内容的问题。

chat.tools.urls.autoApprove
  • 在VS代码中打开
  • 在VS Code Insiders中开放
设置用于存储你的自动批准URL模式。设置值要么是布尔,用于启用或禁用请求和响应的自动批准,要么是具有批准请求以及批准回应用于细粒控制的属性。你可以使用精确的网址、球状模式或万用符。

URL自动批准示例:

{
"chat.tools.urls.autoApprove": {
    "https://www.example.com": false,
    "https://*.contoso.com/*": true,
    "https://example.com/api/*": {
        "approveRequest": true,
        "approveResponse": false
    }
}

重置工具确认

要清除所有保存的工具审批,请使用命令面板中的聊天:重置工具确认命令(⇧⌘P(Windows,Linux Ctrl+Shift+P)。

编辑工具参数

你可以在工具运行前审查并编辑输入参数:

  1. 当工具确认对话框出现时,选择工具名称旁的倒V形以展开其详细信息。

  2. 根据需要编辑工具输入参数。

  3. 选择允许运行带有修改参数的工具。

终端命令

代理可能会使用终端命令作为其工作流程的一部分来完成任务。当代理决定运行终端命令时,它会使用内置的终端工具在 VS Code 内的集成终端中执行。

在聊天对话中,代理会显示它执行的命令。你可以在聊天中内联查看命令输出,方法是选择命令旁边的“显示输出”()。您也可以选择“显示终端”,在集成终端中查看完整输出。>

聊天中终端命令输出的截图。

使用实验性

chat.tools.terminal.outputLocation
  • 在VS代码中打开
  • 在VS Code Insiders中开放
设置以配置终端命令输出出现在哪里:在聊天中内嵌,集成终端中。

在终端面板中,你可以看到代理用于聊天会话的终端列表。你也可以通过终端列表中的聊天图标来区分代理终端。

截图显示集成终端和多个代理终端。

在后台继续终端命令

当代理运行一个长期运行的终端命令时,比如启动开发服务器或在观察模式下运行构建,你可以将该命令推送到后台。这使得代理能够在不等待命令完成的情况下继续执行其他任务。

当命令运行时,聊天对话中终端命令旁边会出现一个“后台继续”按钮。点击此按钮将命令移到后台。命令继续运行,代理可以稍后检查输出或使用终端执行其他任务。

代理还可以在运行终端命令时指定超时。当超时结束时,代理停止等待命令,返回目前收集的输出。使用该

chat.tools.terminal.enforceTimeoutFromModel
  • 在VS代码中打开
  • 在VS Code Insiders中开放
设置以控制是否强制执行代理指定的超时值。

自动批准终端命令

你可以通过使用

chat.tools.terminal.autoApprove
  • 在VS代码中打开
  • 在VS Code Insiders中开放
设置。你可以指定允许和拒绝的命令:

  • 将命令设置为确实如此自动批准
  • 将命令设置为错误总是需要批准
  • 通过在字符中包裹模式来使用正则表达式/

例如:

{
  // Allow the `mkdir` command
  "mkdir": true,
  // Allow `git status` and commands starting with `git show`
  "/^git (status|show\\b.*)$/": true,

  // Block the `del` command
  "del": false,
  // Block any command containing "dangerous"
  "/dangerous/": false
}

默认情况下,模式会与单个子命令匹配。要让命令自动批准,所有子命令必须匹配确实如此条目 且 不得匹配错误入口。

对于高级场景,可以使用带有匹配命令行属性可以与整个命令行匹配,而不是单个子命令。

相关设定:

  • chat.tools.terminal.enableAutoApprove
    • 在VS代码中打开
    • 在VS Code Insiders中开放
    组织
    : 永久禁用自动批准功能
  • chat.tools.terminal.block检测文件写入
    • 在VS代码中打开
    • 在VS Code Insiders中开放
    (实验性):文件写入检测(实验性)
  • chat.tools.terminal.ignoreDefaultAutoApproveRules
    • 在VS代码中打开
    • 在VS Code Insiders中开放
    (实验性):禁用所有默认规则(允许和阻止),完全控制所有规则。
注意

自动批准终端命令提供了尽力而为的保护,并假设代理没有恶意行为。启用终端自动批准时,保护自己免受即时注入非常重要,因为某些命令可能会漏网。以下是检测可能失效的一些例子:

  • VS Code 使用 PowerShell 和 bash tree sitter 文法来提取子命令,所以如果这些文法检测不到模式,也不会检测到它们。
  • VS Code 使用 bash 语法是因为没有 zsh 或 fish 语法,所以某些子命令无法检测到。
  • 目前文件写入检测极少,因此可能可以通过终端写入文件,而使用文件编辑代理工具则无法做到。
  • 通过多种技术(如报价串接)可以颠覆自动审批。例如:查找 -exec通常被阻塞,但查找 -e“x”ec不是,尽管做了同样的事情。

如果可以进行提示注入,或者你处于高风险环境,可以考虑启用终端沙箱或在容器中运行 VS Code。

沙盒终端命令(实验性)

终端沙箱限制了代理执行的文件系统和网络访问。当沙箱启用时,终端命令自动批准,无需用户确认,因为它们运行在受控环境中。

要启用终端沙箱,请设置

chat.tools.terminal.sandbox.enabled
  • 在VS代码中打开
  • 在VS Code Insiders中开放
设置为确实如此.

当沙箱启用时:

  • 命令默认可以读写当前工作目录
  • 默认情况下,所有域名的网络访问都被阻断
  • 命令运行时不会使用标准确认对话框
注释

目前仅支持macOS和Linux的终端沙箱。在Windows上,沙箱设置没有影响。

配置文件系统访问

使用该

chat.tools.terminal.sandbox.linuxFileSystem
  • 在VS代码中打开
  • 在VS Code Insiders中开放
chat.tools.terminal.sandbox.macFileSystem
  • 在VS代码中打开
  • 在VS Code Insiders中开放
设置以控制文件系统访问:

{
  "chat.tools.terminal.sandbox.macFileSystem": {
    // Allow writes to the working directory
    "allowWrite": ["."],
    // Block writes to specific subdirectories
    "denyWrite": ["./secrets/"],
    // Block reads from specific paths
    "denyRead": ["/etc/passwd"]
  }
}

拒绝写以及拒绝阅读规则优先于规则允许写入规则。

配置网络访问

使用该

chat.tools.terminal.sandbox.network
  • 在VS代码中打开
  • 在VS Code Insiders中开放
允许特定域名的设置:

{
  "chat.tools.terminal.sandbox.network": {
    // Allow network access to specific domains
    "allowedDomains": ["api.github.com", "*.npmjs.org"]
  }
}

默认情况下,当启用沙箱时,所有域名的网络访问都会被阻挡。

工具组与工具集

工具集是一组工具,你可以在提示词中作为一个实体引用。工具集帮助你组织相关工具,使其更易于在聊天提示、提示文件自定义聊天代理中使用。部分内置工具是预定义工具集的一部分,例如#edit以及#search.

创建工具集

创建工具集:

  1. 从命令面板中执行“聊天:配置工具集”命令,选择创建新工具集文件

    或者,在聊天视图>工具集中选择配置聊天>创建新工具集文件

    截图显示聊天视图和配置聊天菜单,突出显示配置聊天按钮。

  2. .jsonc打开的文件。

    工具集的结构如下:

    {
      "reader": {
        "tools": ["changes", "codebase", "problems", "usages"],
        "description": "Tools for reading and gathering context",
        "icon": "book"
      }
    }
    

    工具集属性:

    • 工具: 工具名称数组(内置工具、MCP工具或扩展工具)
    • 描述:工具选拔器中显示简要描述
    • 图标工具集图标(参见产品图标参考))

使用工具集

在提示中输入工具集,然后输入工具集名称:#

  • “分析代码库中的安全问题 #reader”
  • “数据库连接字符串在哪里定义?#search”

在工具选择器中,工具集以相关工具的可折叠组合形式提供。你可以选择或取消整个工具集,以快速启用或禁用多个相关工具。

常见问题解答

我怎么知道有哪些工具可用?

在聊天输入栏输入,可以看到所有可用工具的列表。你也可以在聊天中使用工具选择器来查看和管理正在使用的工具列表。#

我收到一个错误,说“每个请求不能超过128个工具”。

聊天请求一次最多可启用128个工具。如果你看到关于每次请求超过128个工具的错误:

  • 在聊天视图中打开工具选择器,取消选择部分工具或整个MCP服务器,以减少数量。

  • 或者,启用带有

    GitHub.copilot.chat.virtualTools.threshold
    • 在VS代码中打开
    • 在VS Code Insiders中开放
    设置以自动管理大型工具集。

为什么代理没有把命令提示符当作终端壳?

代理会使用你配置的 shell 作为终端的默认,除非是 cmd。这是因为命令提示符不支持shell集成,这意味着代理对终端内部的可见性非常有限。代理不能直接接收命令正在运行或已完成的指令,而是依赖超时和观察终端空闲以继续。这导致游戏体验缓慢且不稳定。

你仍然可以配置代理使用命令提示符

chat.tools.terminal.terminalProfile.windows
  • 在VS代码中打开
  • 在VS Code Insiders中开放
但这会导致使用体验不如使用 PowerShell。

"chat.tools.terminal.terminalProfile.windows": {
  "path": "C:\\WINDOWS\\System32\\cmd.exe"
}

我能自动批准所有工具和终端命令吗?

注意

该设置禁用所有手动批准,包括可能具有破坏性的作。它会移除关键的安全防护,使攻击者更容易攻破机器。只有在你理解其影响后才启用此设置。更多细节请参见安全文档

为了让所有工具和终端命令在不提示用户确认的情况下运行,请启用chat.tools.global.autoApprove环境。这个设置适用于你所有工作区的全局!

工具和聊天参与者有什么区别?

聊天参与者是专门的助手,可以让你在聊天中提问特定领域的问题。想象一下,聊天参与者是域名专家,你把聊天请求交给他,剩下的就由他处理。

工具作为代理流程的一部分被调用,以贡献和执行特定任务。你可以在一个聊天请求中包含多个工具,但一次只能激活一个聊天参与者。

我能自己创造工具吗?

是的。你可以用两种方式创建工具: