LLM에게 “이 폴더의 테스트를 고쳐줘”라고 하면, 모델 자체는 파일을 읽지도 명령을 실행하지도 못한다. 모델이 하는 일은 오직 텍스트를 받아 다음 텍스트를 예측하는 것뿐이다. 그런데도 Claude Code 같은 도구는 실제로 파일을 고치고 테스트를 돌린다. 그 사이를 메우는 바깥 프로그램이 하네스(harness) 다.
모델은 두뇌, 하네스는 몸
비유하자면 모델은 판단만 하는 두뇌고, 하네스는 그 판단을 실제 행동으로 옮기는 손발이자 신경계다. 모델이 “npm test를 실행하겠다”는 의도를 텍스트로 내놓으면, 그 텍스트를 실제 셸 명령으로 바꿔 실행하고 결과를 다시 모델에게 먹이는 쪽이 하네스다.
핵심 구조는 루프다.
1. 모델에게 지금까지의 대화 + 도구 목록을 보낸다
2. 모델이 "이 도구를 이 인자로 부르겠다"고 답한다
3. 하네스가 그 도구를 실제로 실행한다
4. 실행 결과를 대화에 덧붙인다
5. 다시 1로 — 모델이 "다 됐다"고 할 때까지 반복
이 루프가 돌기 때문에 모델이 한 번에 끝내지 못하는 일도, 여러 단계에 걸쳐 스스로 관찰하고 다음 수를 두며 진행할 수 있다. 이 반복 구조가 “에이전트”를 에이전트답게 만드는 정체다.
하네스가 실제로 맡는 일
단순히 도구를 대신 실행해주는 데 그치지 않는다.
- 도구 제공과 실행: 파일 읽기·쓰기, 셸 실행, 검색 같은 능력을 모델에게 목록으로 알려주고, 호출을 받아 실제로 돌린다.
- 컨텍스트 관리: 대화가 길어지면 모델의 입력 한도를 넘는다. 오래된 내용을 요약하거나 잘라내 한도 안에 유지하는 것도 하네스 몫이다.
- 권한과 안전장치: 위험한 명령 앞에서 사용자에게 확인을 받고, 허용되지 않은 작업을 막는다.
- 결과 정리: 모델이 낸 출력을 사람이 보기 좋은 형태로 다듬어 화면에 보여준다.
MCP는 어디에 끼는가
그럼 MCP는 이 그림에서 어디일까. MCP는 하네스가 도구를 얻어오는 표준 통로다. 하네스가 쓸 수 있는 도구를 코드에 전부 박아 넣는 대신, MCP 서버를 붙이면 그 서버가 노출한 도구·리소스·프롬프트가 하네스의 도구 목록에 얹힌다. 즉 위 루프의 1단계에서 모델에게 알려줄 “도구 목록”을 확장하는 규격이 MCP다.
정리하면, 좋은 에이전트는 똑똑한 모델 하나만으로 되지 않는다. 그 모델을 어떤 루프로 돌리고, 어떤 도구를 쥐여주고, 컨텍스트와 권한을 어떻게 관리하느냐 — 이 껍데기의 설계가 에이전트의 실제 성능을 좌우한다. 그리고 그 껍데기에 도구를 꽂는 표준 구멍이 MCP다.
이 글에 대한 의견은 아래 댓글로 남겨주세요 (GitHub 계정 필요). 로그인 없이 남기고 싶다면