2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Copilot CLIをMCPにして、GitHub Copilotでサブエージェントとして扱う

Posted at

タイトルの通り、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を使う場合はこんな感じです。

./mcps/python/copilot.py
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は以下のようになります。

.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ツールを定義する場合はこんな感じです。

mcps/js/copilot.js
// @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は以下のようになります。

.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にあるファイルをコードレビューして」のように入力します。

image.png

MCPツールが呼ばれれば成功です。

image.png

実際にはCopilot Chatは標準でコードレビューできるので、Copilot CLIにコードレビューをさせてもあまり嬉しくはないですが、ファイル数やファイルサイズが大きい時にトップレベルエージェントのコンテキストを占有せずコードレビューできるのは利点になるかもしれません。
VS CodeのCopilot Chatは様々なツールや機能が使えるため、かえってコンテキストが複雑化しがちのような気がしています。なのでサブエージェントとして扱うのは有効なケースがあるんじゃないかなと思って試してみました。

注意点として、当然ですがチャット1回あたりのプレミアムリクエストの消費量が数倍以上に跳ね上がるので注意しましょう。
また、promptという引数でシェルコマンドへ渡すことになるので、意図しないコマンドのインジェクションには注意して使ってください。サブエージェントの用途を限定する形でプログラム処理やプロンプトを整理すれば、安全性を上げられると思います。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?