Skip to main content

Copilot CLI ACP サーバー

GitHub Copilot CLI(コマンドラインインターフェース) のエージェントクライアントプロトコルサーバーについて学ぶ。

メモ

GitHub Copilot CLI(コマンドラインインターフェース) での ACP のサポートはパブリック プレビュー にあり、変更される可能性があります。

概要

エージェント クライアント プロトコル (ACP) は、クライアント (コード エディターや IDE など) とコーディング エージェント (Copilot CLI など) 間の通信を標準化するプロトコルです。 このプロトコルの詳細については、 公式の概要を参照してください。

ACP サーバーの起動

GitHub Copilot CLI(コマンドラインインターフェース) は、 --acp フラグを使用して ACP サーバーとして起動できます。 サーバーは、 stdioTCPの 2 つのモードをサポートしています。

既定では、 --acp フラグを指定すると、 stdio モードが推論されます。 --stdio フラグは、あいまいさを解消するためにも指定できます。

copilot --acp --stdio

TCP モード

          `--port` フラグが `--acp` フラグと組み合わせて指定されている場合、サーバーは TCP モードで開始されます。
copilot --acp --port 3000

ACP サーバーとの統合

ACP サーバーとプログラムで対話するためのライブラリのエコシステムが増えています。 GitHub Copilot CLI(コマンドラインインターフェース) が正しくインストールされ、認証されていることを考えると、次の例では 、typescript クライアントを使用して 1 つのプロンプトを送信し、AI 応答を出力します。

import * as acp from "@agentclientprotocol/sdk";
import { spawn } from "node:child_process";
import { Readable, Writable } from "node:stream";

async function main() {
  const executable = process.env.COPILOT_CLI_PATH ?? "copilot";

  // ACP uses standard input/output (stdin/stdout) for transport; we pipe these for the NDJSON stream.
  const copilotProcess = spawn(executable, ["--acp", "--stdio"], {
    stdio: ["pipe", "pipe", "inherit"],
  });

  if (!copilotProcess.stdin || !copilotProcess.stdout) {
    throw new Error("Failed to start Copilot ACP process with piped stdio.");
  }

  // Create ACP streams (NDJSON over stdio)
  const output = Writable.toWeb(copilotProcess.stdin) as WritableStream<Uint8Array>;
  const input = Readable.toWeb(copilotProcess.stdout) as ReadableStream<Uint8Array>;
  const stream = acp.ndJsonStream(output, input);

  const client: acp.Client = {
    async requestPermission(params) {
      // This example should not trigger tool calls; if it does, refuse.
      return { outcome: { outcome: "cancelled" } };
    },

    async sessionUpdate(params) {
      const update = params.update;

      if (update.sessionUpdate === "agent_message_chunk" && update.content.type === "text") {
        process.stdout.write(update.content.text);
      }
    },
  };

  const connection = new acp.ClientSideConnection((_agent) => client, stream);

  await connection.initialize({
    protocolVersion: acp.PROTOCOL_VERSION,
    clientCapabilities: {},
  });

  const sessionResult = await connection.newSession({
    cwd: process.cwd(),
    mcpServers: [],
  });

  process.stdout.write("Session started!\n");
  const promptText = "Hello ACP Server!";
  process.stdout.write(`Sending prompt: '${promptText}'\n`);

  const promptResult = await connection.prompt({
    sessionId: sessionResult.sessionId,
    prompt: [{ type: "text", text: promptText }],
  });

  process.stdout.write("\n");

  if (promptResult.stopReason !== "end_turn") {
    process.stderr.write(`Prompt finished with stopReason=${promptResult.stopReason}\n`);
  }

  // Best-effort cleanup
  copilotProcess.stdin.end();
  copilotProcess.kill("SIGTERM");
  await new Promise<void>((resolve) => {
    copilotProcess.once("exit", () => resolve());
    setTimeout(() => resolve(), 2000);
  });
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

詳細については、次を参照してください。

  •         [ACP の公式ドキュメント](https://agentclientprotocol.com/protocol/overview)