Skip to main content

RPC(Remote Procedure Call)

공식 SDK에서는 최근의 신기능은 api.schema.json을 기반으로 한 자동 코드 생성으로 대응하고 있습니다. Laravel 버전에서는 생성 후의 타 언어 버전을 참고해 동일하게 구현하고 있습니다.

ServerRpc

Client에 연결된 RPC 클래스입니다.

연결·모델·도구·계정

ping()과 connect()로 연결을 확인·시작하고, registerExtensionLaunchProvider()로 확장 기능의 실행 프로바이더를 등록합니다. 모델 목록·가격 단위·내장 카탈로그는 models(), 사용 가능한 도구 목록은 tools()에서 가져올 수 있습니다. account()에서는 할당량, 인증 상태, 로그인 사용자 목록, 로그인·로그아웃을 다루며, accounts()에서는 Microsoft Entra ID 토큰을 취득합니다.

MCP·커넥터

mcp()는 MCP 설정의 목록·추가·업데이트·삭제, 활성화, 검출, 레지스트리 검색, 설치 계획과 적용을 제공합니다. connectors()에서는 커넥터 기능과 계정, 카탈로그를 확인할 수 있습니다. 서버 측 커넥터 조작은 계정 단위의 목록 취득·업데이트가 중심입니다.

Skills·Plugins·Agents·Instructions·Extensions

각 그룹에서 탐색, 사용 가능한 경로 취득, 설정 변경, 다시 불러오기를 할 수 있습니다. commands()는 내장 명령 목록, hooks()는 세션 시작 전 훅 탐색을 제공합니다. Skills와 Plugins는 활성화·비활성화와 설치 관리를 지원하며, Agents는 내장 에이전트 정보도 가져올 수 있습니다. Extensions는 영구 저장된 확장 기능을 탐색·활성화·비활성화합니다.

카탈로그와 설치

catalog()로 후보 검색·선택·피드 취득을 수행하고, Skills·Plugins·MCP의 각 API로 설치 계획 확인, 적용, 상태 조회 및 취소를 수행합니다. 계획과 적용은 별도의 작업입니다. 실제 설치 예시는 뒷부분의 각 항목을 참고하세요.

세션·호스트·실행 환경

sessions()는 영구 저장된 세션의 검색, 이벤트 읽기, 크기 확인, 삭제·정리, fork를 다룹니다. Workspace 생성·불러오기와 원격 제어도 사용할 수 있습니다. host()는 호스트 시작, 세션 공개·목록·공개 해제, 폐기를 수행하고, runtime()은 런타임의 라이프사이클을 다룹니다.

Git·환경·샌드박스·정책

git()에서 브랜치, 작업 디렉터리, Git remote 정보를 가져오고, gitHubRepository()와 gitHubOwners()에서 GitHub 저장소와 소유자를 탐색할 수 있습니다. environments()는 Mission Control 환경, sandbox()와 sandboxProxyCa()는 샌드박스 지원 상황과 Proxy CA, contentExclusion()은 제외 정책 검증, managedSettings()와 userSettings()는 설정을 다룹니다.

로컬 모델·HTTP 추론·파일 시스템

azureMl()은 로컬 모델의 카탈로그·해석·다운로드와 그 상태 확인·취소·삭제를 제공합니다. llmInference()는 모델 계층의 HTTP 요청을 클라이언트 측으로 중계하는 실험적 API입니다. sessionFs()는 세션의 파일 시스템/SQLite 콜백 프로바이더를 등록합니다.

기본 호출 예시

원래 SDK에 포함되어 있던 기능도 자동 코드 생성 버전으로 다시 추가되었습니다.

기능별 사용 예시

아래에 위 기능들의 대표적인 호출 예시를 정리했습니다.

Agent Plugin catalog 후보

catalog.search에서 agent-plugin-discovery를 요구하고 검색 대상 kinds에 plugin을 지정하면 Agent Plugin 후보를 가져올 수 있습니다. 표준 형식 application/vnd.github.copilot-plugin 이외의 application/vnd.anthropic.claude-plugin+json과 application/agent-plugin+json을 받으려면 agent-plugin-discovery에 더해 agent-plugin-formats를 요구하세요. agent-plugin-confirmed-installation은 설치 가능 여부와 검토용 플랜을 반환하는 capability로, 이것도 agent-plugin-discovery와 함께 요구합니다. 허용하면 후보에 installability가 포함되며, 값은 installable, install-data-unavailable, feature-disabled, not-installable-kind 중 하나입니다. installPlan은 installability가 installable인 경우에만 포함됩니다. 플랜은 확인용 데이터이며, 이 catalog RPC가 설치를 실행하지는 않습니다. 플랜의 sources는 우선순위 순으로 materialization, marketplace, repository 후보를 포함합니다. Marketplace에는 이름과 저장소, 직접 Repository에는 저장소와 선택적 경로가 기록됩니다. materialization만 있는 플랜에서는 pluginName이 생략되고 components는 비어 있습니다. 이름과 실제로 설치되는 내용은 plugins.planInstall()이 반환하는 검토 내용에서 확인하세요. 선택된 후보는 plugins.planInstall()로 부작용 없는 검증 포함 플랜을 만들 수 있습니다. plugins.applyInstall()은 사용자에게 명시적인 확인을 요청하고, 허용된 경우 플랜을 적용합니다. 적용 후 플러그인은 비활성 상태로 등록됩니다. 검토 내용의 mcpServers는 검증된 파일이 선언한 서버 이름, transport, 원격인 경우의 host를 나타냅니다. 이는 안전성을 보장하는 것이 아니므로, 사용자가 내용을 확인한 뒤 명시적으로 확인하도록 하세요. 설치된 플러그인의 description은 manifest에서 가져온 것입니다. verifiedSource는 GitHub 저장소와 고정된 commit을 나타내며, commit에 고정된 직접 설치에서만 존재합니다. iconUrl은 외부의 신뢰할 수 없는 콘텐츠이므로, 가져올 때 인증 정보나 GitHub 자격 증명을 보내지 마세요. 자격 증명 자체는 거부 사유로 반환되지 않습니다. 설치 결과의 network-failure에서는 CatalogNetworkFailureReason, HTTP statusCode, 선택적 retryAfterSeconds와 안전하게 표시할 수 있는 message를 확인할 수 있습니다.
Agent Finder의 materialisation reference에서 계획하는 경우에는 catalog.planInstallFromReference()를 사용합니다. 결과의 outcome->kind는 plugin-install-planned, skill-install-planned, refused 중 하나입니다. 플러그인 계획은 plugins.applyInstall()에, 스킬 계획은 skills.applyInstall()에 전달하세요.

contentExclusion

세션을 만들기 전에 콘텐츠 제외 정책 JSON을 검증할 수 있습니다.
policiesJson은 파싱되지 않은 JSON 문자열 그대로 CLI에 전달됩니다. JSON 파싱 또는 스키마 검증에 실패하면 CLI로부터 RPC 오류(JsonRpcException)가 발생합니다. 이것은 정책 자체를 검증하는 서버 스코프 RPC입니다. 세션 작업 디렉터리 내의 경로를 실제 제외 정책에 비추어 확인하려면 세션 스코프의 contentExclusion()->checkPaths()를 사용합니다.

managedSettings (experimental: 관리 설정)

관리 설정의 읽기, 정책 해석, 스키마 취득, 검증, 합성 미리보기, 캐시 폐기를 수행합니다.

Runtime·Host 라이프사이클(experimental)

host.unpublishSession()은 소유한 실행 중인 호스트에서 application publication을 철회합니다. 공개를 철회해도 원래 세션 기록, worktree, 실행 중인 작업은 삭제·중지되지 않습니다. 이미 공개되어 있지 않은 경우 unpublished가 false가 되며, application 이외의 publication은 오류가 됩니다.
host.dispose()는 hostId를 지정해 호스트 리스너를 폐기합니다.
SDK가 시작한 stdio 런타임에서는 Client::stop()이 세션을 끊은 뒤, JSON-RPC 연결과 프로세스를 닫기 전에 runtime.shutdown을 호출합니다. 런타임 정리 완료를 최대 10초 기다리며, 실패 시에는 오류를 반환값에 포함한 뒤 나머지 중지 처리를 계속합니다. cli_url 등 외부 런타임에 연결한 경우에는 공유 런타임을 종료하지 않도록 이 RPC를 호출하지 않습니다.

SessionRpc

Session에 연결된 RPC 클래스입니다. 이전 SDK에서는 불가능했던 플랜 모드 이용 등도 가능합니다.

모델·모드·이름·플랜

model()로 현재 모델 확인과 전환, reasoning effort·Auto tier·허용 모델 설정을 할 수 있습니다. mode()는 모드, name()은 세션 이름, plan()은 플랜 본문과 SQLite todo의 읽기·쓰기를 다룹니다.

워크스페이스·인스트럭션·LSP

workspaces()는 파일 목록·읽기·쓰기·이동·삭제와 디렉터리 조작을 제공합니다. instructions()로 인스트럭션 취득·다시 불러오기·탐색을, lsp()로 언어 서버 설정 초기화를 할 수 있습니다.

에이전트·Fleet·백그라운드 작업

agent()로 에이전트 목록·선택·다시 불러오기를, fleet()로 Fleet을 시작합니다. tasks()에서는 백그라운드 에이전트와 클라이언트 소유 작업의 등록, 진행 상황 취득·업데이트, 전환, 메시지 전송, 취소, 삭제를 다룹니다.

MCP·Plugins·Extensions·Workflow

mcp()는 서버 목록·시작·중지·다시 불러오기, 도구·프롬프트·리소스, OAuth, sampling, 동적 헤더 업데이트를 다룹니다. plugins()와 extensions()는 세션 내 상태를 관리하고, customizations()는 커스터마이즈를 다시 불러옵니다. workflow()로 워크플로를 실행·조회하고, diagnostics()와 connectors()로 진단 정보와 커넥터를 가져올 수 있습니다.

Tools·Permissions·Commands·UI

tools()와 permissions()는 이벤트로 전달된 보류 중 요청에 대한 응답과 설정을 다룹니다. commands()는 명령 목록·실행·이벤트 응답을, ui()는 사용자 입력·elicitation·플랜 승인 등의 요청에 대한 응답을 제공합니다. completions()는 입력 후보를 가져옵니다.

Accounts·인증·Providers

accounts()는 enumerate()를 통한 계정/프로바이더/로그인 계정 열거, get()·set(), begin()·advance()·cancel()을 통한 대화형 로그인을 다룹니다. gitHubAuth()는 세션의 인증 상태와 자격 증명, provider()와 providers()는 모델 연결 대상과 프로바이더 어댑터, connectors()는 세션의 커넥터 연결을 다룹니다.

기록·큐·로그·사용량

history()는 대화 압축·중단·인계 요약·잘라내기를, queue()는 보류 항목의 삽입·이동·편집·삭제·즉시 전송을 제공합니다. log(), eventLog(), usage(), quota(), limitPrediction()으로 로그와 이벤트, 사용량과 한도 정보를 다룹니다. schedule()에서는 예약된 프롬프트를 확인·중지할 수 있습니다.

라이프사이클·원격·호스트 연동

sendMessages()는 여러 메시지를 한 턴에서 실행하고, suspend()·shutdown()으로 세션을 중지합니다. interruptMainTurn()은 메인 턴을, cancelAllBackgroundAgents()는 백그라운드 에이전트를 개별적으로 제어합니다. remote()와 visibility()는 원격 공개·공유 상태, sandbox()는 세션의 샌드박스, managedSettings()는 세션 스코프의 관리 설정, contentExclusion()은 경로 판정, metadata()는 클라이언트 소유 메타데이터, canvas()는 Canvas 연동을 다룹니다.

debug (experimental)

debug()->collectLogs()로 세션의 이벤트 로그, 프로세스 로그, 셸 로그를 .tgz 아카이브 또는 디렉터리에 수집할 수 있습니다. 로그는 기본적으로 민감한 정보가 마스킹(redaction)됩니다. additionalEntries로 파일이나 디렉터리를 추가할 수 있으며, redaction에는 plain-text, events-jsonl, none을 지정할 수 있습니다. none을 지정하면 마스킹되지 않으므로 추가하는 내용에 주의하세요.
DebugCollectLogsDestination::directory('/tmp/copilot-debug')를 지정하면 스테이징 디렉터리에 출력할 수 있습니다. include에서는 수집할 로그와 참조 경로를 개별적으로 지정할 수 있으며, 결과의 entries와 skippedEntries에서 수집 내용을 확인할 수 있습니다. 대상·추가 항목의 경로는 CLI 서버 측 경로입니다. stdio로 CLI를 시작하는 표준 구성에서는 앱과 같은 호스트이지만, TCP로 다른 호스트의 CLI 서버에 연결한 경우에는 호출하는 쪽 머신이 아니라 서버 측 경로를 지정하세요.

contentExclusion (experimental)

세션 작업 디렉터리 내에 있는 로컬 절대 경로가 콘텐츠 제외 정책의 대상인지 확인할 수 있습니다. 파일 내용을 읽거나 첨부하기 전에 호출하세요.
checkPaths()는 절대 경로만 받으며, 경로는 세션 작업 디렉터리 안에 있어야 합니다. checks는 입력과 같은 순서로 반환되며, 중복된 경로도 그대로 유지됩니다. 지원되지 않는 경로나 파일 시스템이거나 정책 평가를 사용할 수 없는 경우에는 available: false와 빈 checks가 반환됩니다. 이 경우 isExcluded()는 항상 true를 반환하므로 모든 경로를 제외 대상으로 취급하세요. available: true라도 결과에 없는 경로는 안전한 쪽으로 판단해 제외 대상으로 판정합니다.

MCP Apps (experimental)

$session->rpc()->mcp()->apps()에서 MCP Apps용 RPC를 호출할 수 있습니다. listTools()와 callTool()에서는 호출 원본 MCP 서버 이름 originServerName이 필수입니다. callTool()의 결과는 자유 형식의 MCP 결과로 반환됩니다.
readResource()는 HTML 등의 리소스 데이터를 반환합니다. SDK는 브라우저 렌더링이나 iframe 조작을 하지 않으므로, 가져온 내용의 렌더링은 호출하는 애플리케이션의 책임입니다.

기능별 사용 예시

아래에 위 기능들의 대표적인 호출 예시를 정리했습니다.

remote (experimental: 원격 세션 지원)

자세한 내용은 Remote Sessions를 참고하세요.

sandbox (experimental: 샌드박스 제어)

권한 핸들러에서는 $request['sandboxPathGrant']가 있는 경우 대상 보류 중 요청의 requestId로 호출합니다. 이 RPC 자체가 허가 요청에 응답하므로, 성공한 경우에는 일반 응답을 보내지 않도록 PermissionDecision::noResult()를 반환합니다.

metadata (experimental: 클라이언트 소유 메타데이터)

Session canvas

Canvas RPC는 $session->rpc()->canvas()에서 호출합니다. list()는 CanvasList의 canvases에, listOpen()은 CanvasListOpenResult의 openCanvases에 목록을 반환합니다. open()은 OpenCanvasInstance를, action 호출은 CanvasActionInvokeResult를 반환합니다. close()의 반환값은 없습니다.
Canvas provider의 reverse-RPC(canvas.open / canvas.close / canvas.action.invoke)는 SessionConfig / ResumeSessionConfig의 canvasHandler에서 처리합니다. Canvas 렌더링은 호스트 UI의 책임입니다.

workflow

Copilot CLI 1.0.89 계열에서 추가된 워크플로, 커넥터, 진단 등의 실험적 RPC API도 SessionRpc에서 사용할 수 있습니다. 이러한 가변 프로토콜 payload는 JSON 호환 배열로 전달하며, 응답도 배열로 반환됩니다. 각 호출에는 현재 sessionId가 자동으로 추가됩니다.
workflow()는 CLI가 제공하는 저수준 RPC를 호출합니다. Node.js SDK처럼 PHP 클로저를 워크플로로 등록·실행하는 고수준 API는 이번 동기화에서 추가하지 않았습니다. 이 새로운 RPC 그룹들은 CLI 버전에 의존하며 실험적이므로, 지원하는 CLI에서만 사용하세요.

SessionFS 콜백 타입

세션 스코프의 파일 시스템 조작을 위한 콜백 타입(Request/Result)이 정의되어 있습니다. 이는 Copilot CLI가 클라이언트에 콜백할 때의 요청/응답 타입입니다. SessionFsStatResult / SessionFsReaddirResult / SessionFsReaddirWithTypesResult는 실패 시 사용하는 선택적 error(SessionFsError)를 가집니다.

SessionFs 핸들러

Client는 sessionFs.readFile / readFileBytes / writeFile / writeFileBytes에 더해 appendFile, exists, stat, mkdir, readdir, readdirWithTypes, rm, rename, sqliteQuery, sqliteTransaction, sqliteExists의 각 요청을 Session의 프로바이더로 분배합니다. 파일 조작 실패는 ENOENT(ENOENT 또는 errno 2) / UNKNOWN의 error로 반환합니다. exists는 예외 시 false를, stat은 실패 시 0 값과 error를 반환합니다. 프로바이더가 지원하지 않는 조작은 UNKNOWN 오류(SQLite 계열은 JSON-RPC 오류)가 됩니다. sqliteQuery/sqliteExists의 예외는 JSON-RPC 오류로, sqliteTransaction의 실패는 결과의 error(errorClass 포함)로 반환합니다. 프로바이더 측 인터페이스(SessionFsFilesystemProvider, SessionFsSqliteCapableProvider, SessionFsSqliteProvider, SessionFsSqliteTransactionProvider)는 기존 SessionFsProvider(2개 메서드)를 깨뜨리지 않도록 별도의 인터페이스로 추가되었습니다.

SQLite 콜백 타입

SQLite 지원을 활성화하려면 SessionFsSetProviderRequest의 capabilities에 SessionFsSetProviderCapabilities(sqlite: true)를 전달합니다.
보통은 이 RPC를 직접 호출하지 않으며, Client 옵션 sessionFs(또는 config/copilot.php의 session_fs)를 지정하면 Client::start()가 sessionFs.setProvider를 한 번만 전송합니다. 세션에는 createSessionFsProvider가 필요합니다(SessionConfig 참고). SessionFsSqliteQueryType enum(src/Enums/)은 쿼리 종류를 나타냅니다:
  • Exec: DDL/여러 문(결과 없음)
  • Query: SELECT(행을 반환)
  • Run: INSERT/UPDATE/DELETE(rowsAffected 를 반환)
이 타입 클래스들은 src/Types/Rpc/에 배치되어 있습니다.

배열로 인자 지정

인자도 반환값도 전용 클래스를 사용하지만, 인자는 배열로 지정할 수도 있습니다.

테스트

Copilot::fake()로의 목은 사용할 수 없으므로 Copilot::expects('client')나 Copilot::expects('start')로 목해 주세요.
최신 정보는 GitHub 저장소를 참고하세요.
마지막 수정일 2026년 10월 19일