[!NOTE] 요약 (TL;DR)
- 동적 발견 및 컨테이너 샌드박싱: 하드코딩된 함수 호출을 넘어 MCP 기반의 런타임 발견, 엄격한 JSON Schema 유효성 검사, gVisor 컨테이너 격리를 향상시킵니다.
- 폐쇄 루프 자가 복구: 실행 트레이스백을 포착하고 구조화된 오류를 모델에 다시 피드하여 반추(reflection)하게 함으로써 도구 실행 성공률을 40% 이상 높입니다.
- 실행 가능한 코드베이스: 검증된 프로덕션 Python 예제를 포함하며, 경량 에이전트 프레임워크 구축하기와 함께 사용됩니다.
도구 카탈로그가 커짐에 따라 경계 기반 발견 및 실행
domain별, 권한별로 도구를 필터링한 후 후보 스키마를 선택합니다. Top-K 검색은 컨텍스트를 줄이지만, 작업을 승인하는 것은 아닙니다. 알 수 없는 카테고리는 전체 카탈로그를 노출하기보다 아무런 후보도 생성해야 합니다. 제어 흐름에 대한 내용은 경량 에이전트 프레임워크를 참조하십시오.
MCP 발견 및 라이프사이클
MCP 클라이언트는 도구를 나열하기 전에 세션을 초기화합니다. 도구 목록은 페이지네이션될 수 있으며, 채널은 알림과 서버 요청을 전달할 수 있습니다. 다음 JSON 라인을 읽는 것이 완전한 프로토콜 구현은 아닙니다. 이 예제는 공식 Python SDK를 사용하여 모든 도구 페이지를 순회하고 선택적 설명을 처리합니다. 신뢰할 수 있는 stdio 서버에서 도구를 발견하며, 원격 권한 부여는 별도의 통합입니다.
컨테이너 실행 및 타임아웃 정리
gVisor의 runsc를 설치하고 등록한 후 이미지를 준비하여 실행기를 실행합니다. Docker SDK의 wait(timeout=...)은 대기 API 요청을 제한할 뿐, 컨테이너를 종료하지는 않습니다. 따라서 정리는 finally에 속하며, 정리 실패는 호출자에게 보여야 합니다.
셸 예제는 각 연속 백슬래시를 줄 끝에 유지합니다. 이 기사 검증 중에는 Docker가 시작되지 않았습니다.
docker run --rm
--runtime=runsc
--network=none
...
Python 런타임 참고 자료
코드 다운로드. 검색(Retrieval)은 표준 라이브러리를 사용하며, MCP 및 Docker 작업에는 각각의 SDK가 필요합니다. 임베딩(embedding) 및 LLM 클라이언트는 이미 구성된 API 통합이 아니라 주입 인터페이스입니다.
"""Tool discovery and bounded sandbox execution. SDK imports are lazy."""
import asyncio
import math
...
python" in text:
return text.split("\n", 1)[1].split("", 1)[0].strip() if "" in text:
return text.split("", 1)[1].split("", 1)[0].strip()
return text.strip()
## 제한된 복구 및 비동기 실행
`max_retries=2`는 초기 시도와 두 번의 복구를 허용합니다. 최종 실패한 시도는 사용되지 않은 복구를 요청하지 않습니다. 반복되는 동일 오류는 조기에 중단됩니다. 차단(Blocking) Docker 호출은 이벤트 루프를 막지 않도록 `asyncio.to_thread`를 통해 실행됩니다.
고정된 로그 테일을 반환하는 것이 Docker의 온디스크 로그를 제한하지는 않습니다. 프로덕션 배포에서는 또한 로그 로테이션, 외부 워치독(watchdogs), 고정된 이미지 다이제스트(pinned image digests), 실행 승인(execution authorization), 취소(cancellation) 및 예산(budgets)이 필요합니다. `runsc`가 누락되면 조용히 호스트 실행으로 폴백하는 대신 실패해야 합니다. [MCP 가이드](https://blog.llmgo.top/en/articles/mcp-guide/)를 참조하십시오.
## 자주 묻는 질문 (FAQ)
### Q1: gVisor가 탈출(escape)이 불가능함을 보장합니까?
아닙니다. 호스트 커널에 대한 직접적인 노출을 줄여주지만, 여전히 런타임 업데이트, 최소 권한(least privilege), 호스트 격리(host isolation), 리소스 제한이 필요합니다.
### Q2: 5초 대기가 컨테이너를 자동으로 파괴합니까?
아닙니다. 실행기(executor)는 대기 오류 발생 후 중지하거나 강제 제거해야 합니다. 예제에서는 `finally`에서 정리하지만, 데몬 실패에는 여전히 별도의 워치독이 필요합니다.
### Q3: Top-K 검색이 권한을 강제합니까?
아닙니다. 승인(Authorization)은 실행 경계(execution boundary)에 속합니다. 부작용(Side effects) 역시 승인 또는 비즈니스 아이뎀포턴시(business idempotency) 제어가 필요합니다.
참고 자료: [MCP 라이프사이클](https://modelcontextprotocol.io/specification/2025-11-25/basic/lifecycle), [Python SDK](https://github.com/modelcontextprotocol/python-sdk), [Docker SDK wait](https://docker-py.readthedocs.io/en/stable/containers.html), [gVisor 보안 모델](https://gvisor.dev/docs/security/).
_원래는 blog.llmgo.top의 [LLM 시스템 아키텍처](https://blog.llmgo.top/en/articles/advanced-agent-tool-use-and-function-calling/)에 게시되었습니다._
```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26