エージェントでツールを使用する
ツールは、Visual Studio Codeのエージェントを拡張し、コード検索、コマンド実行、Webコンテンツの取得、APIの呼び出しといった特定のタスクをこなすための専門的な機能を提供します。VS Codeは、組み込みツール、Model Context Protocol (MCP) ツール、拡張機能ツールの3種類のツールをサポートしています。
ツールタイプとエージェントループ内でのツールの仕組みに関する背景については、「ツールコンセプト」を参照してください。
この記事では、チャットプロンプトでツールを使用する方法と、ツールの呼び出しや承認を管理する方法について説明します。
チャット用ツールの有効化
チャットでツールを使用するには、まず「チャット」ビューで有効にする必要があります。ツールピッカーを使用すると、リクエストごとにツールを有効または無効にできます。また、MCPサーバーのインストールやツールを提供する拡張機能の追加によって、利用可能なツールを増やすことができます。
結果を向上させるために、プロンプトに関連するツールのみを選択してください。
ツールピッカーにアクセスするには
-
「チャット」ビューを開き、エージェントピッカーからエージェントを選択します。
-
チャット入力フィールドにあるツールを構成ボタンを選択します。

-
ツールを選択または選択解除して、現在のリクエストで使用可能なツールを制御します。
検索ボックスを使用してツールリストを絞り込みます。
プロンプトファイルやカスタムエージェントでチャットをカスタマイズする際、特定のプロンプトやモードで使用できるツールを指定できます。ツールリストの優先順位の詳細をご覧ください。
プロンプトでのツールの使用
エージェントを使用する場合、エージェントはプロンプトとリクエストのコンテキストに基づいて、有効なツールの中から使用すべきツールを自動的に決定します。エージェントは、タスクを達成するために必要に応じて関連するツールを選択し、自律的に呼び出します。
また、#に続けてツール名を入力することで、プロンプト内で明示的にツールを参照することもできます。これは、特定のツールが確実に使用されるようにしたい場合に便利です。チャット入力フィールドで#を入力すると、組み込みツール、インストール済みサーバーからのMCPツール、拡張機能ツール、ツールセットを含む利用可能なツールのリストが表示されます。
明示的なツール参照の例
「Node.jsの最新バージョンは何ですか #web」「Next.jsでルーティングはどう機能しますか? #web」「#problems の問題を修正して」「認証フローについて説明して #codebase」
デフォルトでは、ツール呼び出しの詳細はチャットの会話内で折りたたまれています。チャット内のツール概要行を選択することで展開できるほか、 chat.agent.thinking.collapsedTools ... 設定(実験的機能)でデフォルトの動作を変更できます。
権限レベル
「チャット」ビューの権限ピッカーは、セッション中のエージェントの自律性を制御します。チャット入力エリアの権限ドロップダウンから権限レベルを選択し、ツール呼び出しと承認がどのように処理されるかを選択してください。
| 権限レベル | 説明 |
|---|---|
| デフォルトの承認 | 構成された承認設定を使用します。承認が必要なツールは、実行前に確認ダイアログを表示します。必要に応じて、エージェントが確認のための質問をすることがあります。 |
| 承認をバイパス | 確認ダイアログを表示せずにすべてのツール呼び出しを自動承認し、エラー時に自動的に再試行します。必要に応じて、エージェントが確認のための質問をすることがあります。 |
| Autopilot (プレビュー) | 確認ダイアログを表示せずにすべてのツール呼び出しを自動承認し、確認の質問にも自動応答します。エージェントはタスクが完了するまで自律的に作業を続けます。 |
承認をバイパスおよび自動操縦 (Autopilot) は、ファイルの編集、ターミナルコマンド、外部ツール呼び出しなど、破壊的な可能性のあるアクションを含め、手動承認プロンプトをスキップします。これらのレベルを初めて有効にする際には、確認を求める警告ダイアログが表示されます。セキュリティへの影響を理解している場合にのみ、これらのレベルを使用してください。詳細はセキュリティの考慮事項を参照してください。
権限レベルは現在のチャットセッションに適用されます。セッション中にいつでも権限ピッカーから別のレベルを選択して変更可能です。停止ボタンを選択すると、いつでもエージェントを停止できます。
自動操縦 (Autopilot) の仕組み
自動操縦は現在プレビュー段階です。
自動操縦権限レベルを選択すると、標準のエージェントセッションとは異なる動作をします:
- 継続的な反復: エージェントはタスクが完了したと判断するまで自律的に作業を続けます。
- 全ツールの自動承認: 承認をバイパスレベルと同様に、すべてのツール呼び出しが自動的に承認されます。
- エラー時の自動再試行: エージェントはエラーに遭遇すると自動的に再試行します。
- 質問への自動応答: 確認のための質問など、通常はブロックして入力を求めるツールに対しても、エージェントが停止しないよう自動応答します。この動作は自動操縦固有のものであり、承認をバイパスには適用されません。
自動操縦は、 chat.autopilot.enabled ... 設定(デフォルトでオン)が有効な場合にチャットビューで使用できます。
ツールの承認
一部のツールは、実行前に承認を必要とします。これは、ツールがファイルや環境を変更したり、悪意のあるツール出力を通じてプロンプトインジェクション攻撃を試みたりする可能性があるため、セキュリティ対策として導入されています。
ツールが承認を必要とする場合、ツール詳細を示す確認ダイアログが表示されます。承認する前に情報を注意深く確認してください。ツールは、1回のみ、現在のセッション中、現在のワークスペース内、または将来のすべての呼び出しに対して承認できます。

ツールやエージェントのアクションは、ファイル変更を伴う場合があります。ワークスペース内の機密ファイルへの意図しない編集を防ぐ方法を確認してください。
特にファイルを変更する、コマンドを実行する、外部サービスにアクセスするツールについては、承認前にツールパラメータを必ず注意深く確認してください。VS CodeでAIを使用するためのセキュリティの考慮事項を参照してください。
ツール承認の管理
コマンドパレット (⇧⌘P) からチャット: ツール承認の管理コマンドを使用して、ツール承認を一元的にレビューおよび構成します。クイックピックには、MCPサーバーや拡張機能など、ソース別にグループ化されたすべてのツールが表示されます。
各ツールに対して、2種類の承認を構成できます:
- 事前承認(「承認なし」): ツール実行前の確認ダイアログをスキップします。
- 事後承認(「結果をレビューせずに」): ツールの出力をチャットコンテキストに追加する前のレビューをスキップします。これは、コンテンツにプロンプトインジェクションの試みが含まれている可能性がある、外部データを返すツールに関連しています。
ソースを展開して個々のツールの承認を構成するか、トップレベルのチェックボックスを選択して、特定のMCPサーバーや拡張機能からのすべてのツールを一括で信頼します。
ツールの自動承認を有効または無効にする (実験的機能)
デフォルトでは、任意のツールを自動承認するように選択できます。意図しない承認を防ぐには、 chat.tools.eligibleForAutoApproval ... 設定を使用して、特定のツールに対する自動承認を無効にします。値をfalseに設定すると、そのツールは常に手動承認が必要になります。
組織では、デバイス管理ポリシーを使用して特定のツールの手動承認を強制することもできます。詳細はEnterpriseドキュメントをご覧ください。
URLの承認
#web/fetchツールなどでツールがURLにアクセスしようとすると、悪意のある、または予期しないコンテンツから保護するために、2段階の承認プロセスが使用されます。VS Codeは、レビュー用にURLの詳細を含む確認ダイアログをチャットビューに表示します。
-
事前承認:URLへのリクエストの承認
このステップでは、接続先ドメインを信頼していることを確認し、機密データが信頼できないサイトに送信されるのを防ぎます。

1回限りの承認、または特定のURLやドメインへの将来のリクエストを自動承認するオプションがあります。自動承認を選択しても、結果のレビューが必要かどうかに影響はありません。~へのリクエストを許可を選択すると、そのURLやドメインに対する事前承認と事後承認の両方を構成できます。
注意事前承認は「信頼済みドメイン」機能を尊重します。ドメインがそこにリストされている場合、そのドメインへのリクエストは自動的に承認され、応答のレビュー手順が省略されます。
-
事後承認:URLから取得した応答コンテンツの承認
このステップでは、取得したコンテンツがチャットに追加されたり他のツールに渡されたりする前にレビューし、潜在的なプロンプトインジェクション攻撃を防ぎます。
例えば、GitHub.comのようなよく知られたサイトからコンテンツを取得するリクエストを承認するとします。しかし、Issueの説明やコメントのようなユーザー生成コンテンツが含まれている場合、それがモデルの動作を操作する有害なコンテンツである可能性があります。
1回限りの承認、または特定のURLやドメインからの将来の応答を自動承認するオプションがあります。
重要事後承認ステップは「信頼済みドメイン」機能とはリンクしておらず、常にレビューが必要です。これは、信頼できるはずのドメイン上の信頼できないコンテンツによる問題を回避するためのセキュリティ対策です。
chat.tools.urls.autoApprove ... 設定は、自動承認するURLパターンを保存するために使用されます。設定値は、リクエストと応答の両方の自動承認を有効/無効にするブール値、またはapproveRequestとapproveResponseプロパティを持つオブジェクト(詳細な制御用)のいずれかです。正確なURL、globパターン、またはワイルドカードを使用できます。
URL自動承認の例
{
"chat.tools.urls.autoApprove": {
"https://www.example.com": false,
"https://*.contoso.com/*": true,
"https://example.com/api/*": {
"approveRequest": true,
"approveResponse": false
}
}
ツール確認のリセット
保存されたすべてのツール承認をクリアするには、コマンドパレット (⇧⌘P) でチャット: ツール確認のリセットコマンドを使用します。
すべてをクリアするのではなく、個々のツール承認をレビューして選択的に変更するには、チャット: ツール承認の管理コマンドを使用します。
ツールパラメータの編集
ツールが実行される前に、入力パラメータをレビューおよび編集できます。
-
ツール確認ダイアログが表示されたら、ツール名の横にあるシェブロンを選択して詳細を展開します。
-
必要に応じて、ツール入力パラメータを編集します。
-
許可を選択して、変更されたパラメータでツールを実行します。
ターミナルコマンド
エージェントはタスクを達成するために、ワークフローの一環としてターミナルコマンドを使用することがあります。エージェントがターミナルコマンドの実行を決定すると、組み込みのターミナルツールを使用して、VS Code内の統合ターミナルで実行します。
チャットの会話内で、エージェントは実行したコマンドを表示します。コマンドの横にある出力を表示 (>) を選択すると、チャット内でインラインに出力を表示できます。また、ターミナルを表示を選択すると、統合ターミナルで完全な出力を表示できます。

実験的な chat.tools.terminal.outputLocation ... 設定を使用して、ターミナルコマンドの出力表示場所(チャット内インライン、または統合ターミナル)を構成します。
ターミナルペインでは、エージェントがチャットセッションで使用したターミナルのリストを確認できます。ターミナルリスト内のチャットアイコンで見分けることも可能です。

ターミナルコマンドをバックグラウンドで継続する
エージェントが開発サーバーの起動やウォッチモードでのビルドなど、実行時間の長いターミナルコマンドを実行する場合、そのコマンドをバックグラウンドに移動できます。これにより、エージェントはコマンドの完了を待たずに他のタスクを続行できます。
コマンド実行中、チャットの会話内のターミナルコマンドの横にバックグラウンドで継続ボタンが表示されます。このボタンを選択すると、コマンドはバックグラウンドへ移動します。コマンドは実行され続け、エージェントは後でその出力を確認したり、別のタスクにターミナルを使用したりできます。
エージェントはターミナルコマンド実行時にタイムアウトを指定することもあります。タイムアウトに達すると、エージェントはコマンドの待機を停止し、それまでに収集された出力を返します。エージェントが指定したタイムアウト値を強制するかどうかを制御するには、 chat.tools.terminal.enforceTimeoutFromModel ... 設定を使用します。
ターミナルコマンドを自動承認する
chat.tools.terminal.autoApprove ... 設定を使用して、どのターミナルコマンドを自動承認するか構成できます。許可および拒否するコマンドの両方を指定可能です。
- コマンドを
trueに設定すると自動的に承認されます - コマンドを
falseに設定すると常に承認が必要になります - パターンを
/文字で囲むことで正規表現を使用できます
例えば
{
// 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
}
デフォルトでは、パターンは個々のサブコマンドに対してマッチングされます。コマンドが自動承認されるには、すべてのサブコマンドがtrueエントリーにマッチし、かつfalseエントリーにマッチしてはなりません。
高度なシナリオでは、matchCommandLineプロパティを持つオブジェクト構文を使用して、個々のサブコマンドではなくコマンドライン全体に対してマッチングを行います。
関連する設定
- chat.tools.terminal.enableAutoApprove ... : 自動承認機能を永続的に無効にする
- chat.tools.terminal.blockDetectedFileWrites ... (実験的): ファイル書き込みの検出(実験的)
- chat.tools.terminal.ignoreDefaultAutoApproveRules ... (実験的): すべてのデフォルトルール(許可とブロックの両方)を無効にし、ルールに対する完全な制御権を提供する。
ターミナルコマンドの自動承認は「最善努力」の保護を提供するものであり、エージェントが悪意を持って行動していないことを前提としています。ターミナルの自動承認を有効にする際は、コマンドがすり抜ける可能性があるため、プロンプトインジェクションから自分自身を守ることが重要です。以下は検出が機能しなくなる可能性のある例です。
- VS CodeはPowerShellおよびbashツリーシッター文法を使用してサブコマンドを抽出するため、これらの文法で検出されないパターンは検出されません。
- zshやfishの文法が存在しないためVS Codeはbash文法を使用しており、一部のサブコマンドは検出されません。
- ファイル書き込みの検出は現在最小限であるため、ファイル編集エージェントツールを使用した場合では不可能なファイル書き込みがターミナルで実行できてしまう可能性があります。
- クォート結合などの様々な手法を通じて自動承認を回避することが可能です。例えば、
find -execは通常ブロックされますが、同じ動作をするfind -e"x"ecはブロックされません。
プロンプトインジェクションの可能性がある場合や、リスクの高い環境にいる場合は、エージェントのサンドボックス化を有効にするか、コンテナ内でVS Codeを実行することを検討してください。
エージェントコマンドのサンドボックス化
エージェントのサンドボックス化は現在プレビュー段階であり、今後さらに進化する可能性があります。
サンドボックス化の仕組み、保護対象、およびOSレベルの実装詳細の概要については、エージェントのサンドボックス化を参照してください。
エージェントのサンドボックス化は、エージェントによって実行されるコマンドのファイルシステムおよびネットワークアクセスを制限します。サンドボックス化が有効な場合、コマンドは管理された環境で実行されるため、ユーザーの確認を必要とせずに自動承認されます。
エージェントのサンドボックス化を有効にするには、 chat.agent.sandbox ... 設定をtrueに設定します。
サンドボックス化が有効な場合
- コマンドはファイルシステム全体への読み取りアクセス権を持ちます
- コマンドは現在の作業ディレクトリとそのサブディレクトリへの書き込みアクセス権のみを持ちます
- すべてのドメインに対してネットワークアクセスがブロックされます
- コマンドはユーザー確認プロンプトなしで実行されます
サンドボックス化に必要なOS依存関係がインストールされていない場合、VS Codeは必要なコンポーネントのインストールを提案します。インストールしないことを選択した場合、サンドボックス化は有効になりません。
ファイルシステムアクセスの構成
chat.agent.sandboxFileSystem.linux ... または chat.agent.sandboxFileSystem.mac ... 設定を使用して、ファイルシステムアクセスを制御します。
書き込みアクセスの許可ルールと、読み取りおよび書き込みアクセスの両方の拒否ルールを指定できます。これらのルールはglobパターンをサポートしていません。denyWriteおよびdenyReadルールは、allowWriteルールよりも優先されます。
{
"chat.agent.sandboxFileSystem.mac": {
// Allow writes to the working directory
"allowWrite": ["."],
// Block writes to specific subdirectories
"denyWrite": ["./secrets/"],
// Block reads from specific paths
"denyRead": ["/etc/passwd"]
}
}
ネットワークアクセスの構成
デフォルトでは、サンドボックス化が有効な場合、すべてのドメインに対してネットワークアクセスがブロックされます。 chat.agent.sandboxNetwork.allowedDomains ... および chat.agent.sandboxNetwork.deniedDomains ... 設定を使用して、特定のドメインを許可します。
{
"chat.agent.sandboxNetwork.allowedDomains": [
"api.github.com"
],
"chat.agent.sandboxNetwork.deniedDomains": [
"example.com"
]
}
ツールセットによるツールのグループ化
ツールセットは、プロンプト内で単一のエンティティとして参照できるツールのコレクションです。ツールセットは関連するツールを整理し、チャットプロンプト、プロンプトファイル、カスタムチャットエージェントでの使用を容易にします。組み込みツールの一部は、#editや#searchなどの定義済みツールセットの一部となっています。
ツールセットを作成する
ツールセットを作成するには
-
コマンドパレットからチャット: ツールセットの構成コマンドを実行し、新しいツールセットファイルを作成を選択します。
または、チャットビューの省略記号 (...) メニューからツールセットを選択し、新しいツールセットファイルを作成を選択します。
-
開いた
.jsoncファイル内でツールセットを定義します。ツールセットは以下の構造を持ちます
{ "reader": { "tools": ["search/changes", "search/codebase", "read/problems", "search/usages"], "description": "Tools for reading and gathering context", "icon": "book" } }ツールセットのプロパティ
tools: ツール名の配列(組み込みツール、MCPツール、または拡張機能ツール)description: ツールピッカーに表示される簡単な説明icon: ツールセットのアイコン(製品アイコンリファレンスを参照)
ツールセットを使用する
プロンプトで#に続けてツールセット名を入力することで、ツールセットを参照します。
「コードベースを分析してセキュリティの問題がないか確認して #reader」「DB接続文字列はどこで定義されていますか? #search」
ツールピッカーでは、ツールセットは関連するツールの折りたたみ可能なグループとして利用可能です。ツールセット全体を選択または選択解除することで、関連する複数のツールを一度に有効または無効にできます。
よくある質問
利用可能なツールを知るには?
チャット入力フィールドに#を入力すると、利用可能なすべてのツールのリストが表示されます。また、チャットのツールピッカーを使用して、アクティブなツールのリストを表示・管理することもできます。
「リクエストごとに128個を超えるツールを持つことはできません」というエラーが出ます。
チャットリクエストで一度に有効にできるツールは最大128個までです。リクエストごとのツール数が128個を超えたというエラーが表示された場合
-
チャットビューのツールピッカーを開き、一部のツールまたはMCPサーバー全体を選択解除して、カウントを減らしてください。
-
または、 github.copilot.chat.virtualTools.threshold ... 設定で仮想ツールを有効にし、大規模なツールセットを自動的に管理します。
なぜエージェントが構成したターミナルシェルを使用しないのですか?
エージェントは、Windowsのcmd (コマンドプロンプト) とmacOS/Linuxのshを除き、ターミナルのデフォルトとして構成したシェルを使用します。これは、これらのシェルではシェル統合がサポートされておらず、エージェントがターミナル内部で何が起きているかをほとんど把握できないためです。コマンドが実行されているか、完了したかの直接的な信号を得る代わりに、エージェントはタイムアウトやターミナルのアイドル状態を監視することに頼る必要があり、これでは遅く不安定な体験になってしまいます。
ターミナルプロファイル設定でこれらのシェルを使用するように構成することも可能ですが、WindowsでのPowerShellやmacOS/Linuxでのbash/zshを使用する場合と比較すると、体験の質は低下します。
- chat.tools.terminal.terminalProfile.windows ... - Windows上のシェルをオーバーライド
- chat.tools.terminal.terminalProfile.osx ... - macOS上のシェルをオーバーライド
- chat.tools.terminal.terminalProfile.linux ... - Linux上のシェルをオーバーライド
すべてのツールとターミナルコマンドを自動承認できますか?
ツール呼び出しの自動承認にはいくつか選択肢があります。
- 権限レベル: 権限ピッカーから承認をバイパスまたは自動操縦権限レベルを選択し、現在のセッション内のすべてのツールを自動承認します。
- グローバル設定: chat.tools.global.autoApprove ... 設定を有効にして、すべてのワークスペース全体でツールを自動承認します。チャットから直接
/yoloまたは/autoApproveスラッシュコマンドを使用してこれを切り替えることも可能で、/disableYoloまたは/disableAutoApproveで無効にできます。グローバル自動承認を初めて有効にする際には、確認を求める警告ダイアログが表示されます。
どちらのアプローチも、破壊的な可能性のあるアクションを含め、手動承認プロンプトを無効にします。これらは重要なセキュリティ保護を取り除き、攻撃者がマシンを侵害しやすくします。意味を理解している場合にのみこれらのオプションを使用してください。詳細はセキュリティドキュメントを参照してください。
chat.tools.global.autoApprove ... 設定は、すべてのワークスペースにわたってグローバルに適用されます。自動承認を現在のセッションに限定したい場合は、セッションスコープの権限レベルを使用してください。
ツールとチャット参加者の違いは何ですか?
チャット参加者は、チャットでドメイン固有の質問を可能にする専門的なアシスタントです。チャット参加者を、あなたがチャットリクエストを引き渡し、後はすべて任せられるドメインの専門家として考えてください。
ツールは、特定のタスクに貢献し実行するためにエージェントフローの一部として呼び出されます。単一のチャットリクエストに複数のツールを含めることはできますが、アクティブにできるチャット参加者は一度に1人だけです。
独自のツールを作成できますか?
はい。2つの方法で作成できます。
- VS Code拡張機能を開発し、Language Model Tools APIを使用してツールを提供する
- ツールを提供するMCPサーバーを作成する。詳細はMCP開発者ガイドを参照してください
関連リソース
- チャットツールリファレンス
- エージェントフック - ツールライフサイクルイベントでカスタムコマンドを実行
- VS Code で AI を使用するためのセキュリティに関する考慮事項