구독해서 새 게시물에 대한 알림을 받으세요.

코드 모드: 에이전트에 1,000개의 토큰으로 전체 API 제공

2026-02-20

6분 읽기
이 게시물은 English, 繁體中文, Italiano, 日本語, Tiếng Việt简体中文로도 이용할 수 있습니다.

본 콘텐츠는 사용자의 편의를 고려해 자동 기계 번역 서비스를 사용하였습니다. 영어 원문과 다른 오류, 누락 또는 해석상의 미묘한 차이가 포함될 수 있습니다. 필요하시다면 영어 원문을 참조하시기를 바랍니다.

모델 컨텍스트 프로토콜(MCP) 은 AI 에이전트가 외부 도구를 사용하는 표준 방법이 되었습니다. 하지만 그 중심에는 긴장이 존재합니다. 에이전트가 유용한 작업을 수행하려면 많은 도구가 필요하지만, 추가되는 모든 도구는 모델의 컨텍스트 창을 채워 실제 작업을 위한 공간이 줄어들기 때문입니다.

코드 모드 는 에이전트 도구를 사용하는 동안 컨텍스트 창 사용을 줄이기 위해 저희가 처음 도입한 기술입니다. 모든 작업을 별도의 도구로 설명하는 대신 모델이 입력된 SDK에 대해 코드를 작성하고 동적 Worker 로더에서 코드를 안전하게 실행하도록 하세요. 이 강령은 컴팩트 요금제 역할을 합니다. 모델은 도구 작업을 탐색하고, 여러 호출을 작성하며, 필요한 데이터만 반환할 수 있습니다. Anthropic은 MCP를 사용한 코드 실행 게시물에서 동일한 패턴을 독립적으로 탐색했습니다.

오늘 DNSZero Trust에서 WorkersR2에 이르기까지 Cloudflare API 전체를 위한 새로운 MCP 서버를 소개합니다. 이는 코드 모드를 사용합니다. 두 가지 도구, search() 및 execute()만 사용하면 서버는 약 1,000개의 토큰만 소비하면서 MCP를 통해 전체 Cloudflare API에 대한 액세스를 제공할 수 있습니다. API 엔드포인트가 얼마나 많이 있든, 그 범위는 고정되어 있습니다.

Cloudflare API와 같은 대규모 API의 경우 코드 모드는 사용되는 입력 토큰의 수를 99.9% 줄입니다. 코드 모드가 없는 MCP 서버의 경우 117만 개의 토큰을 소비하게 되며, 이는 가장 고급 파운데이션 모델의 전체 컨텍스트 윈도우보다 큽니다.

Images/BLOG-3184 3

tiktoken으로측정한 네이티브 MCP 대비 코드 모드 절감

여러분은 지금 이 새로운 Cloudflare MCP 서버의 사용을 시작할 수 있습니다. 또한 Code Mode SDKCloudflare Agents SDK에서 오픈 소싱하고 있으므로 자체 MCP 서버 및 AI 에이전트에서 동일한 접근 방식을 사용할 수 있습니다.

서버측 코드 모드

Images/BLOG-3184 2

이 새로운 MCP 서버는 서버 측에서 코드 모드를 적용합니다. 수천 개의 도구 대신 서버는 search()execute() 두 가지 도구만 내보냅니다. 둘 다 코드 모드를 기반으로 합니다. 모델 컨텍스트로 로드되는 전체 도구 표면 영역은 다음과 같습니다.

[
  {
    "name": "search",
    "description": "Search the Cloudflare OpenAPI spec. All $refs are pre-resolved inline.",
    "inputSchema": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "description": "JavaScript async arrow function to search the OpenAPI spec"
        }
      },
      "required": ["code"]
    }
  },
  {
    "name": "execute",
    "description": "Execute JavaScript code against the Cloudflare API.",
    "inputSchema": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "description": "JavaScript async arrow function to execute"
        }
      },
      "required": ["code"]
    }
  }
]

에이전트는 무엇을 할 수 있는지 확인하기 위해 search()를 호출합니다. OpenAPI 사양의 유형화된 표현에 대해 JavaScript를 작성합니다. 이 에이전트는 제품, 경로, 태그, 기타 메타데이터별로 엔드포인트를 필터링하고 수천 개의 엔드포인트를 필요한 소수로 좁힐 수 있습니다. 전체 OpenAPI 사양은 모델 컨텍스트에 들어가지 않습니다. 에이전트는 코드를 통해서만 에이전트와 상호 작용합니다.

에이전트가 작동할 준비가 되면 execute()를 호출합니다. 이 에이전트는 한 번의 실행으로 Cloudflare API 요청을 하고, 페이지 나누기를 처리하며, 응답을 확인하고, 작업을 체인화하는 코드를 작성합니다. 

두 도구 모두 파일 시스템이 없고, 프롬프트 삽입으로 유출될 환경 변수가 없으며, 외부 가져오기가 기본적으로 비활성화되어 있는 경량 V8 샌드박스인 Dynamic Worker 격리 내에서 생성된 코드를 실행합니다. 아웃바운드 요청은 필요할 때 아웃바운드 가져오기 핸들러를 사용하여 명시적으로 제어할 수 있습니다.

예: DDoS 공격으로부터 원본 보호

사용자가 에이전트에게 "DDoS 공격으로부터 원본을 보호하세요"라고 이야기한다고 가정해 보겠습니다. 에이전트의 첫 번째 단계는 문서를 참조하는 것입니다. Cloudflare Docs MCP 서버를 호출하거나, Cloudflare 기술을 사용하거나, 웹을 직접 검색할 수 있습니다. 문서를 통해 학습: Cloudflare WAFDDoS 보호 규칙을 오리진 앞에 배치합니다.

1단계: 올바른 엔드포인트 검색 검색 도구는 모델에 사양 개체(모든 $refs 가 미리 확인된 전체 Cloudflare OpenAPI 사양)를 제공합니다. 모델은 이 모델에 대해 JavaScript를 작성합니다. 여기에서 에이전트는 영역에서 WAF 및 규칙 집합 엔드포인트를 찾습니다.

async () => {
  const results = [];
  for (const [path, methods] of Object.entries(spec.paths)) {
    if (path.includes('/zones/') &&
        (path.includes('firewall/waf') || path.includes('rulesets'))) {
      for (const [method, op] of Object.entries(methods)) {
        results.push({ method: method.toUpperCase(), path, summary: op.summary });
      }
    }
  }
  return results;
}

서버에서 이 코드가 Workers 격리에서 실행되고 다음이 반환됩니다.

[
  { "method": "GET",    "path": "/zones/{zone_id}/firewall/waf/packages",              "summary": "List WAF packages" },
  { "method": "PATCH",  "path": "/zones/{zone_id}/firewall/waf/packages/{package_id}", "summary": "Update a WAF package" },
  { "method": "GET",    "path": "/zones/{zone_id}/firewall/waf/packages/{package_id}/rules", "summary": "List WAF rules" },
  { "method": "PATCH",  "path": "/zones/{zone_id}/firewall/waf/packages/{package_id}/rules/{rule_id}", "summary": "Update a WAF rule" },
  { "method": "GET",    "path": "/zones/{zone_id}/rulesets",                           "summary": "List zone rulesets" },
  { "method": "POST",   "path": "/zones/{zone_id}/rulesets",                           "summary": "Create a zone ruleset" },
  { "method": "GET",    "path": "/zones/{zone_id}/rulesets/phases/{ruleset_phase}/entrypoint", "summary": "Get a zone entry point ruleset" },
  { "method": "PUT",    "path": "/zones/{zone_id}/rulesets/phases/{ruleset_phase}/entrypoint", "summary": "Update a zone entry point ruleset" },
  { "method": "POST",   "path": "/zones/{zone_id}/rulesets/{ruleset_id}/rules",        "summary": "Create a zone ruleset rule" },
  { "method": "PATCH",  "path": "/zones/{zone_id}/rulesets/{ruleset_id}/rules/{rule_id}", "summary": "Update a zone ruleset rule" }
]

전체 Cloudflare API 사양에는 2,500개 이상의 엔드포인트가 있습니다. 이 모델은 컨텍스트 창에 어떤 사양도 입력하지 않고 모델에 필요한 WAF 및 규칙 세트 엔드포인트로 이를 좁혔습니다. 

또한 모델은 특정 엔드포인트를 호출하기 전에 해당 엔드포인트의 스키마를 드릴 드릴(drill in)할 수 있습니다. 여기에서는 영역 규칙 집합에서 어떤 단계를 사용할 수 있는지 검사합니다.

async () => {
  const op = spec.paths['/zones/{zone_id}/rulesets']?.get;
  const items = op?.responses?.['200']?.content?.['application/json']?.schema;
  // Walk the schema to find the phase enum
  const props = items?.allOf?.[1]?.properties?.result?.items?.allOf?.[1]?.properties;
  return { phases: props?.phase?.enum };
}

{
  "phases": [
    "ddos_l4", "ddos_l7",
    "http_request_firewall_custom", "http_request_firewall_managed",
    "http_response_firewall_managed", "http_ratelimit",
    "http_request_redirect", "http_request_transform",
    "magic_transit", "magic_transit_managed"
  ]
}

이제 에이전트는 필요한 정확한 단계를 파악합니다. DDoS 방어의 경우 ddos_l7 , WAF의 경우 http_request_firewall_managed 입니다.

2단계: API에 조치를 취합니다. 에이전트가 실행을 사용하도록 전환합니다. 샌드박스는 cloudflare.request() 를 가져옵니다. Cloudflare API에 대한 인증된 호출을 수행할 수 있는 클라이언트입니다. 먼저 에이전트는 영역에 이미 존재하는 규칙 집합을 확인합니다.

async () => {
  const response = await cloudflare.request({
    method: "GET",
    path: `/zones/${zoneId}/rulesets`
  });
  return response.result.map(rs => ({
    name: rs.name, phase: rs.phase, kind: rs.kind
  }));
}

[
  { "name": "DDoS L7",          "phase": "ddos_l7",                        "kind": "managed" },
  { "name": "Cloudflare Managed","phase": "http_request_firewall_managed", "kind": "managed" },
  { "name": "Custom rules",     "phase": "http_request_firewall_custom",   "kind": "zone" }
]

에이전트는 관리형 DDoS 및 WAF 규칙 집합이 이미 존재함을 확인합니다. 이제 한 번의 실행으로 호출을 연결하여 규칙을 검사하고 민감도 수준을 업데이트할 수 있습니다.

async () => {
  // Get the current DDoS L7 entrypoint ruleset
  const ddos = await cloudflare.request({
    method: "GET",
    path: `/zones/${zoneId}/rulesets/phases/ddos_l7/entrypoint`
  });

  // Get the WAF managed ruleset
  const waf = await cloudflare.request({
    method: "GET",
    path: `/zones/${zoneId}/rulesets/phases/http_request_firewall_managed/entrypoint`
  });
}

사양 검색 및 스키마 검사부터 규칙 집합 나열, DDoS 및 WAF 구성 가져오기에 이르기까지 이 모든 작업은 네 번의 도구 호출이 필요했습니다.

Cloudflare MCP 서버

우리는 개별 제품에 대한 MCP 서버로 시작했습니다. DNS를 관리하는 에이전트를 원하십니까? DNS MCP 서버를 추가하세요. Workers 로그를 원하시나요? Workers Observability MCP 서버를 추가하세요. 각 서버는 API 작업에 매핑된 고정된 도구 세트를 내보냈습니다. 이는 도구 집합이 작았던 경우에 효과가 있었지만, Cloudflare API의 엔드포인트는 2,500개 이상이었습니다. 수동으로 유지하는 서버 컬렉션은 그 어떤 서버도 따라잡지 못했습니다.

Cloudflare MCP 서버는 이를 간소화합니다. 두 가지 도구, 약 1,000개의 토큰, API의 모든 엔드포인트 커버리지. 새로운 제품을 추가하면 동일한 search()execute() 코드 경로가 해당 제품을 검색하고 호출합니다. 새로운 도구 정의나 새로운 MCP 서버도 없습니다. GraphQL Analytics API도 지원합니다.

Cloudflare의 MCP 서버는 최신 MCP 사양을 기반으로 구축되었습니다. OAuth 2.1을 준수하며 Workers OAuth Provider 를 사용하여 연결 시 사용자가 승인한 선택된 권한으로 토큰 범위를 축소합니다. 에이전트는 사용자가 명시적으로 부여한 기능만 가져옵니다. 

개발자의 경우, 즉 간단한 에이전트 루프를 사용하면서도 에이전트에게 기본 제공 프로그레시브 기능 검색을 통해 전체 Cloudflare API에 대한 액세스 권한을 부여할 수 있습니다.

Images/BLOG-3184 4

컨텍스트 축소에 대한 접근 방식 비교

MCP 도구에서 소비하는 토큰 수를 줄이기 위해 몇 가지 접근법이 등장했습니다.

클라이언트 측 코드 모드 는 저희 첫 번째 실험이었습니다. 이 모델은 입력된 SDK에 대해 TypeScript를 작성하고 클라이언트의 동적 Worker 로더에서 실행합니다. 단점은 에이전트가 안전한 샌드박스 액세스와 함께 제공되어야 한다는 점입니다. 코드 모드는 Goose프로그래밍 방식 도구 호출로 Anthropics Claude SDK에 구현됩니다.

명령줄 인터페이스 도 있습니다. CLI는 자체적으로 문서화되며 에이전트가 탐색하는 대로 기능을 표시합니다. OpenClawMoltworker 와 같은 도구는 MCPorter 를 사용하여 MCP 서버를 CLI로 변환하여 에이전트에게 점진적 공개를 제공합니다. 한계는 분명합니다. 에이전트는 모든 환경에서 제공되는 것은 아니며 샌드박스를 적용한 격리보다 훨씬 더 넓은 공격면을 제공하는 셸을 필요로 합니다.

Anthropic이 Claude Code에서 사용하는 것처럼,동적 도구 검색은 현재 작업과 관련이 있으면서 작은 도구 집합만 표시합니다. 이에 따라 맥락 사용은 줄어들지만, 이제는 유지하고 평가해야 하는 검색 기능이 필요하며, 매칭된 각각의 도구는 여전히 토큰을 사용합니다.

Images/BLOG-3184 5

각각의 접근 방식은 실제 문제를 해결합니다. 하지만 특히 MCP 서버의 경우 서버측 코드 모드에는 API 크기와 관계없이 고정된 토큰 비용, 에이전트 측에서 수정할 필요가 없는 점, 내장된 프로그레시브 검색, 샌드박스를 적용한 격리 내에서 안전한 실행 등 각자의 강점이 결합되어 있습니다. 에이전트는 코드를 통해 두 가지 도구를 호출하기만 하면 됩니다. 다른 모든 작업은 서버에서 이루어집니다.

지금 시작하세요

이제 Cloudflare MCP 서버를 사용할 수 있습니다. MCP 클라이언트에 서버 URL을 지정하면 에이전트에 부여할 권한을 부여하고 선택할 수 있는 Cloudflare로 리디렉션됩니다. 다음 구성을 MCP 클라이언트에 추가하세요. 

{
  "mcpServers": {
    "cloudflare-api": {
      "url": "https://mcp.cloudflare.com/mcp"
    }
  }
}

CI/CD, 자동화 또는 토큰을 직접 관리하려는 경우 필요한 권한으로 Cloudflare API 토큰을 만드세요. 사용자 토큰과 계정 토큰이 모두 지원되며 Authorization 헤더에 무기명 토큰으로 전달할 수 있습니다.

다양한 MCP 설정 구성에 대한 자세한 내용은 Cloudflare MCP 리포지토리에서 확인할 수 있습니다.

앞으로의 전망

코드 모드는 단일 API의 컨텍스트 비용을 해결합니다. 하지만 에이전트가 하나의 서비스와 소통하는 경우는 드뭅니다. 개발자의 에이전트는 GitHub, 데이터베이스, 내부 문서 서버와 함께 Cloudflare API가 필요할 수 있습니다. MCP 서버가 추가될 때마다 처음 시작할 때와 동일한 컨텍스트 창 압력이 적용됩니다.

Cloudflare MCP 서버 포털 을 이용하면 단일 게이트웨이 뒤에 통합 인증 및 액세스 제어 기능을 갖춘 여러 MCP 서버를 구성할 수 있습니다. 저희는 모든 MCP 서버를 위한 최고 수준의 코드 모드 통합을 구축하고 있으며, 게이트웨이 뒤에 있는 서비스의 수와 관계없이 프로그레시브 검색이 기본 제공되고 고정 토큰 풋프린트가 동일한 에이전트에 서버를 노출하고 있습니다.

Cloudflare에서는 전체 기업 네트워크를 보호하고, 고객이 인터넷 규모의 애플리케이션을 효과적으로 구축하도록 지원하며, 웹 사이트와 인터넷 애플리케이션을 가속화하고, DDoS 공격을 막으며, 해커를 막고, Zero Trust로 향하는 고객의 여정을 지원합니다.

어떤 장치로든 1.1.1.1에 방문해 인터넷을 더 빠르고 안전하게 만들어 주는 Cloudflare의 무료 애플리케이션을 사용해 보세요.

더 나은 인터넷을 만들기 위한 Cloudflare의 사명을 자세히 알아보려면 여기에서 시작하세요. 새로운 커리어 경로를 찾고 있다면 채용 공고를 확인해 보세요.
개발자개발자 플랫폼AIWorkers AICloudflare WorkersOptimization오픈 소스

X에서 팔로우하기

Matt Carey|mattzcarey
Cloudflare|@cloudflare

관련 게시물

2026년 3월 11일 오후 1:00

이제 앱용 AI 보안을 누구나 이용할 수 있습니다

이제 모델이나 호스팅 공급자와 관계없이 AI 기반 애플리케이션을 검색하고 보호할 수 있는 보안 계층을 제공하는 Cloudflare AI Security for Apps가 정식 버전으로 제공됩니다. 또한 팀에서 섀도우 AI 배포를 찾고 보호할 수 있도록 모든 요금제에 AI 검색을 무료로 제공하고 있습니다....