본문 바로가기
서버구축 (WEB,DB)

MCP 도구를 코드로 토큰 98% 절감, Anthropic 방식 컨텍스트 오염 제거

by 날으는물고기 2025. 11. 12.

MCP 도구를 코드로 토큰 98% 절감, Anthropic 방식 컨텍스트 오염 제거

728x90

Code execution with MCP: building more efficient AI agents – Anthropic Engineering Blog

배경과 문제 정의

  • MCP(Model Context Protocol) 는 에이전트가 외부 시스템(Drive, Salesforce, Slack, GitHub, DB 등)에 연결하는 표준 프로토콜입니다. 도구가 늘수록 “도구 정의(스키마/설명)”와 “중간 결과”가 컨텍스트를 잠식해 비용·지연이 급증합니다.
  • Anthropic은 “도구를 직접 호출하지 말고, 도구를 코드 API로 노출한 뒤 모델이 코드를 작성·실행”하도록 구조를 바꾸면, 150K → 2K 토큰(≈98.7% 절감) 이 가능하다고 설명합니다.

왜 느려지고 비싸지는가?

  1. 도구 정의 오염: 수백·수천 개 도구의 스키마/설명이 컨텍스트를 선점.
  2. 중간 데이터 왕복: 대용량 결과(예: 5만 토큰 문서)를 모델 컨텍스트로 가져왔다가 다음 도구 호출 파라미터로 다시 밀어 넣는 과정이 반복.

해결책 개요: “도구 → 파일시스템의 코드 API”

핵심 아이디어는 세 줄 요약됩니다.

  1. MCP 서버를 파일/모듈 트리의 코드 API 로 노출한다.
  2. 모델은 필요한 파일 일부만 읽고 짧은 코드를 작성한다.
  3. 코드 실행 환경(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

고급 활용: 대용량·반복·프라이버시

  1. 대용량 필터링: 로그/스프레드시트를 코드에서 전처리 → 요약만 모델에 보고 → 99%대 절감.
  2. 폴링/반복 제어: 배포 완료 메시지 감시를 코드 루프로 수행(5초 주기) → 모델 반복 호출 제거.
  3. 프라이버시: 민감값(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 호출이 간편: 단발성 조회, 즉석 대화형 상호작용, 샌드박스 인프라가 아직 없을 때.

보안 점검 포인트

  1. 권한 최소화: 각 서버 모듈(API 키/스코프) 분리, 단일 키 재사용 금지.
  2. 네트워크 Egress 제어: 목적지 화이트리스트·DNS 고정·TLS 검증·프록시 감사.
  3. 비밀 관리: 런타임 주입(환경변수 금지 권고)·짧은 TTL·회전 자동화.
  4. 데이터 경계: 컨텍스트/로그/리포트에서 PII 마스킹·샘플링 제한.
  5. 실행 가드: 파일/프로세스/시스템콜 제한(seccomp/AppArmor)·위험 모듈 차단.
  6. 감사·보존: 코드 변경 서명/리뷰, 실행/호출 감사로 컴플라이언스 충족.
  7. 탐지/대응: 이상 징후 룰(대량 읽기·네트워크 편향·실패 급증)과 자동 중단.
  8. 성능 SLO: 토큰/지연/성공률/오류율 대시보드, 회귀 감지 알람.

 

“도구를 코드로” 전환해 모델이 코드를 읽고(일부 파일만) 쓰고 실행하게 하면, 토큰과 지연을 근본적으로 줄이며(≈98% 절감), 프라이버시도 강화됩니다. 이점(대용량/반복/민감데이터)에 맞춰 샌드박스·권한·가시성을 갖추면, SIEM·취약점·컴플라이언스·IR 자동화 전반에 즉시 효과가 납니다.

728x90
그리드형(광고전용)

댓글