タイトルの通り、Copilot CLIをMCPツールにすれば、GitHub Copilotだけでサブエージェントとして扱うことができそうだったので、やってみました。
環境
- VS Code 1.104.2 Windows ARM版
- GitHub Copilot Proプラン
- 利用モデル GPT-5(無印)
- Copilot CLI 0.0.328
MCPツールの実装には、本稿ではPythonとNode.jsの2通りでやりました。実際なんでも良いです。
- Python
- uv 0.8.17
- Python 3.13.7
- mcp cli: 1.15.0
- JS
- Node.js v24.6.0
- @modelcontextprotocol/sdk: 1.18.2
準備としてCopilot CLIをグローバルにインストールしておきます。mise使っていれば$ mise use --global npm:@github/copilot@0.0.328 みたいな感じです。インストールしたら一度起動してログインを済ませておきましょう。
実装
今回はVS CodeのCopilot Chatをトップレベルエージェントとして、Copilot CLIでコードレビューしてくれるサブエージェントを実装して、試してみます。
雑に作るとCopilotはMCPを使わず自力でコードレビューしてしまうと思うので、「コードレビューをするときは必ずツールを使ってください」のような強めの言葉をコンテキストに含めるのが良いと思います。
実際のツール定義はこんな感じにしました。
| キー | 値 |
|---|---|
| name | コードレビューの達人 |
| description | コードレビューの達人AIエージェントです。 「xxx/yyy.py をレビューして」のようにプロンプトを与えると、コードレビューして結果を出力します。 コードレビューをするときは必ずこのツールを使ってください。 |
| inputSchema.properties | prompt: { "type": "string", "description": "プロンプト" } |
| required | prompt |
ツールの中身は、copilot -p {prompt}という形でコマンドを実行するだけにしておきます。ここでCopilot CLIに専用のプロンプトやツールを与えたりするとサブエージェントの価値が出ると思いますが、とりあえず実装例ということで何も設定していません。
Pythonの実装例
FastMCPを使う場合はこんな感じです。
from mcp.server.fastmcp import FastMCP
import subprocess
mcp = FastMCP("Copilot")
@mcp.tool()
def run_copilot(prompt: str) -> str:
"""
コードレビューの達人AIエージェントです。
「xxx/yyy.py をレビューして」のようにプロンプトを与えると、コードレビューして結果を出力します。
コードレビューをするときは必ずこのツールを使ってください。
"""
result = subprocess.run(
["copilot", "-p", prompt],
capture_output=True,
text=True
)
return result.stdout.strip()
MCPツールの定義.vscode/mcp.jsonは以下のようになります。
"my-mcp-server-code-reviewer-py": {
"type": "stdio",
"command": "uv",
"args": ["run", "mcp", "dev", "./mcps/python/copilot.py"]
}
JavaScriptの実装例
Node.jsでMCPツールを定義する場合はこんな感じです。
// @ts-check
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { execFileSync } from "child_process";
import { z } from 'zod';
const server = new McpServer({
name: "Copilot",
version: "1.0.0"
});
/**
* @param {{ prompt: string }} args
* @returns {string}
*/
const run_copilot = (args) => {
const result = execFileSync(
"copilot",
["-p", args.prompt],
{ encoding: 'utf-8' },
);
return result.trim();
}
const DESCRIPTION = `
コードレビューの達人AIエージェントです。
「xxx/yyy.py をレビューして」のようにプロンプトを与えると、コードレビューして結果を出力します。
コードレビューをするときは必ずこのツールを使ってください。
`.trim();
server.registerTool(
"copilot",
{
title: 'コードレビューの達人',
description: DESCRIPTION,
inputSchema: { prompt: z.string() }
},
async ({ prompt }) => {
const result = run_copilot({ prompt });
return {
content: [
{ type: 'text', text: result }
]
};
}
);
const transport = new StdioServerTransport();
await server.connect(transport);
MCPツールの定義.vscode/mcp.jsonは以下のようになります。
"my-mcp-server-code-reviewer-js": {
"type": "stdio",
"command": "node",
"args": ["./mcps/js/copilot.js"]
}
実行
VS CodeでCopilot ChatをAgentモードにして「xxx/yyyにあるファイルをコードレビューして」のように入力します。
MCPツールが呼ばれれば成功です。
実際にはCopilot Chatは標準でコードレビューできるので、Copilot CLIにコードレビューをさせてもあまり嬉しくはないですが、ファイル数やファイルサイズが大きい時にトップレベルエージェントのコンテキストを占有せずコードレビューできるのは利点になるかもしれません。
VS CodeのCopilot Chatは様々なツールや機能が使えるため、かえってコンテキストが複雑化しがちのような気がしています。なのでサブエージェントとして扱うのは有効なケースがあるんじゃないかなと思って試してみました。
注意点として、当然ですがチャット1回あたりのプレミアムリクエストの消費量が数倍以上に跳ね上がるので注意しましょう。
また、promptという引数でシェルコマンドへ渡すことになるので、意図しないコマンドのインジェクションには注意して使ってください。サブエージェントの用途を限定する形でプログラム処理やプロンプトを整理すれば、安全性を上げられると思います。

