Cloudflare MCP (Code-Mode)

Offizieller Cloudflare-MCP-Server unter https://mcp.cloudflare.com/mcp. Erreichbar als stdio via mcp-remote-Wrapper. Code-Mode-Pattern: kein granulares Tool pro Endpoint, sondern zwei Meta-Tools — Suche in der OpenAPI-Spec und Ausfuehrung von JavaScript gegen die Cloudflare-API.

Setup

Status (Stand 2026-05-17): Registration ✅, OAuth-Flow ✅, Smoke-Test ✅. Account Hello@marvinkuehlmann.com's Account (ID bf395d62cc6a9117564c0712fa9e3ad2) ist verbunden — sichtbar als pre-eingesetzte accountId in der execute-Tool-Description.

Registration (~/.claude.json mcpServers-Block):

{
  "mcpServers": {
    "cloudflare": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.cloudflare.com/mcp"]
    }
  }
}

Beim ersten Start oeffnet mcp-remote automatisch den Browser zum OAuth-Consent. Token-Cache liegt unter ~/.mcp-auth/mcp-remote-0.1.37/ (4 Files: *_client_info.json, *_code_verifier.txt, *_lock.json, *_tokens.json). Solange *_tokens.json ein gueltiges Refresh-Token enthaelt, ist kein erneuter Browser-Flow noetig.

Smoke-Test: Wenn mcp__cloudflare__execute als Tool gelistet ist UND die Tool-Description die echte Account-ID enthaelt, ist Auth aktiv. Wenn die Description „accountId is not pre-set” sagt oder das Tool ueberhaupt fehlt, ist der Token kaputt — ~/.mcp-auth/mcp-remote-0.1.37/ loeschen und Claude Code neu starten, dann laeuft der OAuth-Flow erneut.

Tools (nur zwei)

ToolZweck
mcp__cloudflare__searchOpenAPI-Spec von Cloudflare nach Endpoints durchsuchen. JavaScript-Arrow-Function bekommt spec.paths (Record<path, PathItem>) und gibt Treffer zurueck. Refs sind pre-resolved.
mcp__cloudflare__executeJavaScript-Arrow-Function gegen die Cloudflare-API. cloudflare.request({method, path, query?, body?, contentType?, rawBody?}) schiesst HTTP-Calls. accountId ist als globale Variable vorbelegt.

Coverage: 137 Cloudflare-Produkte laut Spec — u.a. workers, r2, dns, access, magic, stream, vectorize, ai, ai-gateway, gateway, email, email-security, pages (via Builds), rulesets, firewall, load_balancers, logpush, logs, addressing, browser-rendering, realtime, devices, intel, cloudforce-one, dlp, ai-search, brand-protection, api_gateway, dex, builds, security-center, settings.

Code-Mode-Pattern — Beispiele

Endpoints fuer ein Produkt finden:

async () => {
  const results = [];
  for (const [path, methods] of Object.entries(spec.paths)) {
    for (const [method, op] of Object.entries(methods)) {
      if (op.tags?.some(t => t.toLowerCase() === 'workers')) {
        results.push({ method: method.toUpperCase(), path, summary: op.summary });
      }
    }
  }
  return results;
}

Endpoint-Schema lesen (mit aufgeloesten $refs):

async () => {
  const op = spec.paths['/accounts/{account_id}/d1/database']?.post;
  return { summary: op?.summary, requestBody: op?.requestBody };
}

API-Call ausfuehren (Liste aller DNS-Zonen im Account):

async () => {
  const res = await cloudflare.request({
    method: "GET",
    path: "/zones",
    query: { "account.id": accountId, per_page: 50 }
  });
  return res.result.map(z => ({ id: z.id, name: z.name, status: z.status }));
}

Worker mit Bindings deployen (multipart/form-data — Sonderfall):

async () => {
  const code = `addEventListener('fetch', e => e.respondWith(new Response('hi')));`;
  const metadata = { body_part: "script", bindings: [] };
  const b = `--F${Date.now()}`;
  const body = [
    `--${b}`, 'Content-Disposition: form-data; name="metadata"', 'Content-Type: application/json', '',
    JSON.stringify(metadata),
    `--${b}`, 'Content-Disposition: form-data; name="script"', 'Content-Type: application/javascript', '',
    code,
    `--${b}--`
  ].join("\r\n");
  return cloudflare.request({
    method: "PUT",
    path: `/accounts/${accountId}/workers/scripts/my-worker`,
    body,
    contentType: `multipart/form-data; boundary=${b}`,
    rawBody: true
  });
}

Workflow-Konvention

  1. Erst search, dann execute. Cloudflare-API ist gross und Endpoint-Pfade aendern sich pro Produkt-Bereich. Erst Spec durchsuchen statt Pfad raten.
  2. Pruef-vor-Schreib. Vor POST/PUT/DELETE einen GET auf die Ressource — verhindert Duplikate oder unbeabsichtigte Overrides (z.B. DNS-Records).
  3. accountId nutzen, nicht hardcoden. Die Variable wird vom Server vorbelegt. Bei mehreren Cloudflare-Accounts (kommt bei AV bisher nicht vor) optional via account_id-Parameter des Tool-Calls ueberschreiben.
  4. Response-Shape: CloudflareResponse<T> mit { success, status, result, errors, messages, result_info? }. result_info enthaelt Pagination (page, per_page, total_pages, count, total_count).
  5. Rate-Limits: Cloudflare-API hat 1200 req / 5min pro User-Token. Bei Bulk-Operations selber drosseln, MCP macht das nicht.

Use-Cases bei AV

  • DNS-Records pflegen fuer agenticventures.de (Tunnel-Subdomains wie mcp-whatsapp.agenticventures.de, mcp-vf.agenticventures.de) — bisher manuell im Dashboard, kann jetzt via MCP.
  • Tunnel-Inventar abfragen (cloudflared-Tunnels, die Fargate-Sidecars terminieren — siehe mcp-hosting-fargate-tunnel).
  • Worker / Pages deployen falls AV irgendwann Edge-Logik braucht (z.B. Receptionist-Pre-Filter vor Lambda).
  • R2-Buckets als optionale zweite Spur zu S3 + Hetzner Object Storage (DSGVO-strikt, EU-only).
  • Analytics-Reads fuer Hugo-Sites (agenticventures.de, marvinkuehlmann.com) statt Dashboard-Klicks.

Rotation / Re-Auth

OAuth-Token laeuft irgendwann ab (Cloudflare-Default: 1h Access-Token, Refresh-Token laenger). Wenn mcp-remote den Refresh nicht mehr durchbekommt:

  1. ~/.mcp-auth/mcp-remote-0.1.37/ loeschen (oder zumindest die 6244cf5467a6f706b7b55d5e88d4e4c4_*-Files)
  2. Claude Code neu starten
  3. Beim naechsten Connect oeffnet sich der Browser fuer den OAuth-Consent
  4. Im Cloudflare-Dashboard pruefen welcher Account ausgewaehlt wird (muss Hello@marvinkuehlmann.com's Account sein)

Pruefen ob noch autorisiert ohne Re-Auth: Tool-Description von mcp__cloudflare__execute muss die echte Account-ID bf395d62cc6a9117564c0712fa9e3ad2 enthalten. Wenn da nur Platzhalter steht, ist der Token down.

Bewusst nicht abgedeckt

  • Wrangler-CLI-Workflows. Cloudflare hat eine eigene CLI fuer lokale Worker-Entwicklung. MCP ist fuer Ops-Reads + einfache API-Mutations, nicht fuer Worker-Dev-Loop.
  • Stream-Upload (grosse Files). Multipart-Uploads gehen technisch ueber execute, sind aber unhandlich. Besser direkt via Stream-API mit Wrangler oder curl.