Skip to main content

Copilot CLI ACP 서버

GitHub Copilot 명령줄 인터페이스 (CLI)의 에이전트 클라이언트 프로토콜 서버에 대해 알아봅니다.

이 문서의 내용

참고 항목

GitHub Copilot 명령줄 인터페이스 (CLI)에서의 ACP 지원은 공개 미리 보기 단계에 있으며, 변경될 수 있습니다.

개요

ACP(에이전트 클라이언트 프로토콜)는 클라이언트(예: 코드 편집기 및 IDE)와 코딩 에이전트(예: Copilot CLI) 간의 통신을 표준화하는 프로토콜입니다. 이 프로토콜에 대한 자세한 내용은 공식 소개를 참조하세요.

사용 사례

  •         **IDE 통합:** 모든 편집기 또는 개발 환경에 Copilot 지원을 구축합니다.
    
  •         **CI/CD 파이프라인:** 자동화된 워크플로에서 에이전트 코딩 작업을 오케스트레이션합니다.
    
  •         **사용자 지정 프런트 엔드:** 특정 개발자 워크플로에 대한 특수 인터페이스를 만듭니다.
    
  •         **다중 에이전트 시스템:** 표준 프로토콜을 사용하여 Copilot를 다른 AI 에이전트들과 조정합니다.
    

ACP 서버 시작

GitHub Copilot 명령줄 인터페이스 (CLI)은(는) --acp 플래그를 사용하여 ACP 서버로 시작할 수 있습니다. 서버는 두 가지 모드를 지원합니다stdio. TCP

기본적으로 플래그 --acp를 제공하면 모드 stdio가 유추됩니다. --stdio 명확성을 위해 플래그를 제공할 수도 있습니다.

copilot --acp --stdio

TCP 모드

플래그가 --port 플래그와 --acp 함께 제공되면 서버가 TCP 모드에서 시작됩니다.

copilot --acp --port 3000

ACP 서버와 통합

ACP 서버와 프로그래밍 방식으로 상호 작용하는 라이브러리 에코시스템이 증가하고 있습니다. GitHub Copilot 명령줄 인터페이스 (CLI)이 올바르게 설치되고 인증된 경우 다음 예제에서는 typescript 클라이언트를 사용하여 단일 프롬프트를 보내고 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)