728x90

배경과 문제 정의
- MCP(Model Context Protocol) 는 에이전트가 외부 시스템(Drive, Salesforce, Slack, GitHub, DB 등)에 연결하는 표준 프로토콜입니다. 도구가 늘수록 “도구 정의(스키마/설명)”와 “중간 결과”가 컨텍스트를 잠식해 비용·지연이 급증합니다.
- Anthropic은 “도구를 직접 호출하지 말고, 도구를 코드 API로 노출한 뒤 모델이 코드를 작성·실행”하도록 구조를 바꾸면, 150K → 2K 토큰(≈98.7% 절감) 이 가능하다고 설명합니다.
왜 느려지고 비싸지는가?
- 도구 정의 오염: 수백·수천 개 도구의 스키마/설명이 컨텍스트를 선점.
- 중간 데이터 왕복: 대용량 결과(예: 5만 토큰 문서)를 모델 컨텍스트로 가져왔다가 다음 도구 호출 파라미터로 다시 밀어 넣는 과정이 반복.
해결책 개요: “도구 → 파일시스템의 코드 API”
핵심 아이디어는 세 줄 요약됩니다.
- MCP 서버를 파일/모듈 트리의 코드 API 로 노출한다.
- 모델은 필요한 파일 일부만 읽고 짧은 코드를 작성한다.
- 코드 실행 환경(sandbox) 에서 대용량 데이터 처리를 끝내고, 모델 컨텍스트에는 요약/결과만 전달한다.
효과: 도구 정의 대량 로드 제거 + 중간 데이터 비노출 처리 → 토큰/지연/오류 모두 감소.
아키텍처와 예시

1. 디렉터리 구조(예: TypeScript)
/workspace/
├─ servers/
│ ├─ google-drive/ (getDocument.ts, updateDocument.ts, ...)
│ ├─ salesforce/ (updateRecord.ts, queryRecords.ts, ...)
│ ├─ slack/ (postMessage.ts, getChannels.ts, ...)
│ └─ wazuh/ (getAlerts.ts, getAgents.ts, getRules.ts, ...)
└─ agent_workspace/ (에이전트가 작성·실행하는 코드)
모델은 servers/*의 필요 파일만 read_file로 열람 후 agent_workspace/*.ts에 실행 코드를 생성합니다. 중간 대용량 데이터는 코드 변수/메모리에서만 흐르고, 모델은 결과 요약만 받습니다.
2. 코드 API 래퍼(간단 예)
// servers/google-drive/getDocument.ts
export async function getDocument(params: { documentId: string; format?: 'text'|'html'|'json' }) {
const { documentId, format = 'text' } = params;
// 내부적으로는 MCP 서버 호출(or SDK)
return mcpClient.callTool('google-drive', 'get_document', { documentId, format });
}
3. 에이전트가 작성하는 실행 스크립트
// agent_workspace/transfer_meeting_notes.ts
import { getDocument } from '../servers/google-drive/getDocument';
import { updateRecord } from '../servers/salesforce/updateRecord';
async function run() {
const doc = await getDocument({ documentId: 'abc123', format: 'text' });
// transcript는 컨텍스트로 안 나감(모델은 내용 미열람)
await updateRecord({ objectType: 'Lead', recordId: 'xyz789', data: { Notes: doc.content } });
console.log('회의록 전송 완료');
}
run();
4. 토큰 절감 감각치
- 전통 방식: (도구정의 80K) + (중간결과 50K × 2) ≈ 180K
- 코드 방식: 디렉터리 탐색·파일 일부 읽기·짧은 코드·요약 결과 ≈ ~1K
- 절감률 ≈ 98%+ (Anthropic 블로그 수치와 부합)
300x250
고급 활용: 대용량·반복·프라이버시
- 대용량 필터링: 로그/스프레드시트를 코드에서 전처리 → 요약만 모델에 보고 → 99%대 절감.
- 폴링/반복 제어: 배포 완료 메시지 감시를 코드 루프로 수행(5초 주기) → 모델 반복 호출 제거.
- 프라이버시: 민감값(PII)은 실행 환경 내부에서만 처리·전송, 모델에는 통계/토큰화된 값만 노출.
유사 연구도 “도구 증가 시 토큰 비용 폭증” 문제를 지적하고, 능동적 도구 탐색/점진 로딩으로 ≈98% 절감을 보고합니다. (개념적 근접성)
설계·운영 체크리스트
1. 샌드박스·격리
- 프로세스 격리/네임스페이스: 컨테이너/VM, seccomp/AppArmor(리눅스), Windows Job Object.
- 리소스 제한: CPU 시간, 메모리, 실행시간, 동시 실행 수.
- 네트워크 제어: 허용 도메인 allowlist, 호출 수/폭 제한, egress 로깅.
- 파일시스템 금지/허용 경로:
/workspace/agent_workspace만 RW, 나머지 RO 혹은 차단. - 위험 API 차단:
eval, 동적 import, 로컬 쉘 실행 금지 등. - 시크릿 관리: Vault/KMS에서 임시 토큰 발급(최소권한, 만료, 회전).
2. 로깅·가시성
- 3계층 로깅: (A) 모델 프롬프트/툴 선택 로그(민감값 마스킹), (B) 코드 실행 감사(입출력 크기·도메인·지연), (C) 외부 API 감사(HTTP 4xx/5xx, 재시도).
- 데이터류 구분: PII/고객데이터는 컨텍스트 금지 정책·탐지(정규식·DLP 룰) 적용.
3. 정책·통제
- 승인된 서버/모듈 카탈로그:
servers/*에 등록된 것만 import 허용. - 리뷰·배포 게이트: 코드 API PR 리뷰(보안 리뷰 템플릿), 서명된 아티팩트만 로드.
- 레이트리밋 & 쿼터: MCP→외부 API 호출 상한, burst 제어.
- 컴플라이언스: 로그 보존/암호화, 운영자 행위 추적, 변경관리 기록(ISO 27001/ISMS-P 대응).
4. 탐지·대응
- 행위 기반 룰: 과도한 파일 읽기, 비인가 경로 접근, 비정상 네트워크 시도 탐지.
- 자동 격리/차단: 룰 히트 시 실행 샌드박스 중단, 토큰 폐기, 보안 채널 알림.
보안 운영 시나리오
1. Wazuh SIEM 연계(대용량 요약 패턴)
servers/wazuh/*모듈로 알림 수십만 건을 코드에서 필터·집계(MITRE/호스트별 Top-N).- 모델에는
총합/심각건수/Top 룰/영향 호스트만 보고 → 컨텍스트 오염 제로. - 운영 효과: 알림 폭주 시에도 비용·지연 안정.
2. 취약점·컴플라이언스
- 증분 스캔 결과를 파일로 누적 저장(상태 관리) → 다음 날 이어서 처리.
- ISMS-P/ISO27001 점검 항목을 코드 유틸로 표준화(
lib/security_helpers.ts) 해 재사용/자동보고.
6-3. 인시던트 대응(반복 제어)
- 배포/탐지 이벤트 Slack 감시를 코드 루프로 처리, 조건별 자동 알림/롤백 훅 실행.
구축 절차(예시)
1. 베이스 러너 이미지(리눅스)
# 최소 런타임 컨테이너(예: Node 20)
FROM node:20-alpine
RUN adduser -D agent && mkdir -p /workspace && chown -R agent:agent /workspace
USER agent
WORKDIR /workspace
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
# 실행: node agent_workspace/orchestrator.js
2. 실행 정책(샌드박스 파라미터 예)
export const sandbox = {
maxMemoryMB: 512,
maxCpuSec: 30,
maxExecSec: 300,
allowedDomains: ['api.wazuh.internal','slack.com','salesforce.com'],
allowedPaths: ['/workspace/agent_workspace','/workspace/servers'],
maxFileMB: 100,
disableDangerousAPIs: true,
isolateProcess: true
};
3. 관측성(지표·로그)
// 성능 측정 래퍼
await monitor.measure('wazuh.getAlerts', () =>
getAlerts({ timeRange: '24h', level: 'all' })
);
// 측정치(p50/p95)와 실패율을 주기적으로 Slack 전송
4. 실패 대응(재시도·폴백)
await withRetry(async () => runDailyChecks(), { retries: 3, backoff: 'exp' })
.catch(async () => useCachedReportOrFailSafe());
벤치마크/레퍼런스 포인트
- Anthropic 공식 글: 두 가지 병목(도구 정의 오염, 중간 결과 왕복) 문제와 코드 실행 패턴 설명.
- 요약·해설: 한국어 기사/커뮤니티에서 98.7% 절감 수치와 구현 요지를 정리.
- 커뮤니티 구현/데모는 “점진 로딩으로 98%대 절감”을 재현한 예가 공유됩니다. (아이디어 확인용)
도입 판단 가이드
- 코드 방식이 유리: 대용량 데이터, 반복·폴링, 다단계 워크플로, 상태 저장, 민감정보 처리.
- 기존 MCP 호출이 간편: 단발성 조회, 즉석 대화형 상호작용, 샌드박스 인프라가 아직 없을 때.
보안 점검 포인트
- 권한 최소화: 각 서버 모듈(API 키/스코프) 분리, 단일 키 재사용 금지.
- 네트워크 Egress 제어: 목적지 화이트리스트·DNS 고정·TLS 검증·프록시 감사.
- 비밀 관리: 런타임 주입(환경변수 금지 권고)·짧은 TTL·회전 자동화.
- 데이터 경계: 컨텍스트/로그/리포트에서 PII 마스킹·샘플링 제한.
- 실행 가드: 파일/프로세스/시스템콜 제한(seccomp/AppArmor)·위험 모듈 차단.
- 감사·보존: 코드 변경 서명/리뷰, 실행/호출 감사로 컴플라이언스 충족.
- 탐지/대응: 이상 징후 룰(대량 읽기·네트워크 편향·실패 급증)과 자동 중단.
- 성능 SLO: 토큰/지연/성공률/오류율 대시보드, 회귀 감지 알람.
“도구를 코드로” 전환해 모델이 코드를 읽고(일부 파일만) 쓰고 실행하게 하면, 토큰과 지연을 근본적으로 줄이며(≈98% 절감), 프라이버시도 강화됩니다. 이점(대용량/반복/민감데이터)에 맞춰 샌드박스·권한·가시성을 갖추면, SIEM·취약점·컴플라이언스·IR 자동화 전반에 즉시 효과가 납니다.
728x90
그리드형(광고전용)
댓글