모델이 파일 읽기 명령을 내보내도 파일이 자동으로 열리지 않게 하고, 이 명령을 해석하고 도구를 실행하며 결과를 모델 시스템으로 다시 전달하는 시스템을 'harness'라고 합니다. 이는 일종의 모델 실행 기반(execution base)이라고 이해할 수 있습니다. T3 Code의 저자 Theo가 작성한 장문 《What is a "harness"?》에서는 우리가 자주 언급하는 Agent, 인터페이스(interface), MCP, 그리고 harness를 매우 명확하게 분해하여 설명합니다.
- 사람이 인터페이스로 소프트웨어를 조작하고, 모델은 harness를 통해 작업을 수행한다
사람들은 컴퓨터를 사용할 때 매번 코드를 직접 작성할 필요가 없습니다. Chrome이나 ChatGPT 데스크톱 버전, 터미널 등은 근본적인 코드 패키지를 버튼, 단축키, 명령어로 포장했습니다. 사람은 이 인터페이스 계층과만 상호작용합니다.
대규모 언어 모델(LLM)은 키보드를 직접 치지 못하며 기본적으로 텍스트만 출력할 수 있습니다. 만약 파일 읽기를 시키려면, 먼저 시스템이 인식할 수 있는 특정 텍스트 호출 형식을 지정해 주어야 합니다. 예를 들어, <read_file name="README.md">와 같이 출력하도록 하는 것입니다.
하지만 이 문장 자체는 프로그램에 의해 실행되어야 합니다. Theo는 harness를 다섯 가지 요소로 분해했습니다:
- 도구 자체 (예: read_file, edit_file, bash, search)
- 모델에게 도구를 어떻게 사용하는지 알려주는 도구 목록 및 설명
- 모델이 도구를 호출하는 형식
- 이 형식을 인식하고 실제 코드를 실행하는 시스템
- 실행 결과를 모델로 다시 전달하는 통로. 모델은 파일 내용을 받아야만 다음 작업을 계속 처리할 수 있습니다.
- 평소에 열어보는 터미널이나 데스크톱 창은 그저 외피일 뿐이다
Claude Code는 인터페이스와 harness 두 부분으로 구성되어 있습니다. 사용자가 터미널에서 'claude'를 입력하여 나타나는 터미널 사용자 인터페이스(TUI)이든, Claude 데스크톱 버전의 코드 탭에서 보는 그래픽 사용자 인터페이스(GUI)든, 이들은 모두 사람에게 보여주기 위한 인터페이스일 뿐입니다.
한 단계 더 깊이 들어가면, Claude Code는 Anthropic Agent SDK를 통해 하위 레벨의 agent 실행 능력을 연결합니다. ChatGPT와 Codex 데스크톱 버전은 명령어 라인 도구에 내장된 Codex App Server와 연동됩니다. 공식적으로 인터페이스와 기반 시스템을 함께 패키징했기 때문에 사용 시 혼동하기 쉽습니다.
하지만 이 기반 시스템 자체는 분리되어 다른 소프트웨어에서 재사용될 수 있습니다. Grok Bot은 Cursor의 harness를 재사용했고, OpenClaw는 Pi를 사용했으며, T3 Code는 Anthropic Agent SDK와 Codex App Server의 실행 능력을 연결했습니다.
- 모델에 harness가 추가되어야 비로소 글에서 언급된 Agent가 완성된다
Theo의 정의에 따르면, Agent란 LLM에 harness가 결합된 형태입니다. 모델은 harness를 통해 하위 도구를 호출하고, 사용자는 프론트엔드 인터페이스를 통해 도구 실행 상황을 확인합니다.
각 기반 시스템이 자체적으로 보유한 기능의 깊이는 다릅니다. Codex와 Claude Code는 기본적으로 많은 내장 도구를 탑재했지만, Pi의 내장 도구는 훨씬 간소화되어 있습니다.
내장 도구 외에도 성숙한 harness는 외부 확장(plugin)을 허용합니다. 예를 들어 TypeScript 플러그인을 연결하여 모델이 코드를 검사하게 하거나, 컴퓨터 조작 플러그인(CUA)을 연결하여 클릭이나 입력을 수행하게 할 수 있습니다. 사용자 정의 도구, 명령, 또는 외부 서비스 구성을 변경하면, 동일한 모델이라도 다른 Agent가 실행됩니다.
- MCP는 harness에 도구를 제공하는 통일된 프로토콜이다
harness는 자체 도구를 가지고 있거나 플러그인을 통해 확장할 수 있습니다. 이메일이나 웹사이트 분석 같은 다른 시스템을 연결할 때, MCP(Model Context Protocol)가 통합 통신 프로토콜을 제공하여 harness가 사용 가능한 능력을 얻고 호출을 시작하며 결과를 받을 수 있게 합니다.
여기서 경계 지점을 보충해야 합니다. Theo는 브라우저 확장과 웹사이트를 비유로 들었지만, MCP 서비스는 로컬 프로세스로도 실행될 수 있으므로 '로컬인지 원격인지'로 도구와 MCP를 구분할 수 없습니다. MCP는 연결을 담당하며, 호출의 실행 및 결과 반환은 여전히 harness가 필요합니다.
- T3 Code는 기존 harness에 접속하여 MCP로 능력을 확장한다
T3 Code 자체적으로 harness를 구현하지 않았기 때문에, 기존 harness에 연결하지 않으면 아예 작동할 수 없습니다. T3 Code가 하는 일은 크로스 기반(cross-base) 프록시 에이전트와 같은 새로운 기능을 간단한 MCP 서비스로 패키징하여 모델에게 노출하는 것입니다. 예를 들어 Claude Code의 스레드 내에서 Codex 하위 에이전트를 직접 실행할 수 있게 하는 식입니다 (Herdr, Orca, Superset 등에도 유사한 설계가 있습니다).
이렇게 하면 핵심 코드는 T3 Code 내부에서 유지보수만 하면 되므로, Claude Code, Codex, Antigravity, Pi, Cursor, Muse 각각에 별도의 플러그인을 다시 작성할 필요가 없습니다.
Theo의 주방 비유로 설명하자면, 모델은 요리사이고, harness는 냄비와 그릇이 갖춰진 주방이며, T3 Code는 사용자가 자체 주방을 가져올 수 있도록 허용하는 레스토랑입니다. 여기에 크로스 기반 기능을 담은 레시피(MCP)를 주방에 놓아둔 것과 같습니다. 레시피가 테이블 위에 있다고 해서 자동으로 적용되는 것은 아니며, 모델이 펼쳐보지 않으면 기존 기반 시스템의 작동 방식은 전혀 변하지 않습니다.
이 글을 읽고 나니, 저는 도구 선택 시 검사 범위를 모델, 내장 도구, 시스템 명령어, 그리고 MCP 구성에 두게 되었습니다. 작업이 막혔을 때도 이 호출 체인을 따라 문제를 추적할 수 있습니다. 즉, 모델이 호출을 보내지 않았는지, 도구 실행에 오류가 있었는지, 아니면 결과가 제대로 반환되지 않았는지를 확인할 수 있습니다.