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)
| Tool | Zweck |
|---|---|
mcp__cloudflare__search | OpenAPI-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__execute | JavaScript-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
- Erst
search, dannexecute. Cloudflare-API ist gross und Endpoint-Pfade aendern sich pro Produkt-Bereich. Erst Spec durchsuchen statt Pfad raten. - Pruef-vor-Schreib. Vor
POST/PUT/DELETEeinenGETauf die Ressource — verhindert Duplikate oder unbeabsichtigte Overrides (z.B. DNS-Records). accountIdnutzen, nicht hardcoden. Die Variable wird vom Server vorbelegt. Bei mehreren Cloudflare-Accounts (kommt bei AV bisher nicht vor) optional viaaccount_id-Parameter des Tool-Calls ueberschreiben.- Response-Shape:
CloudflareResponse<T>mit{ success, status, result, errors, messages, result_info? }.result_infoenthaelt Pagination (page,per_page,total_pages,count,total_count). - 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 wiemcp-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:
~/.mcp-auth/mcp-remote-0.1.37/loeschen (oder zumindest die6244cf5467a6f706b7b55d5e88d4e4c4_*-Files)- Claude Code neu starten
- Beim naechsten Connect oeffnet sich der Browser fuer den OAuth-Consent
- Im Cloudflare-Dashboard pruefen welcher Account ausgewaehlt wird (muss
Hello@marvinkuehlmann.com's Accountsein)
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 odercurl.
Related
- _index — alle MCPs
- web-properties — welche Cloudflare-Zonen AV faehrt
- mcp-hosting-fargate-tunnel — Fargate + cloudflared-Sidecar (Standard ab Mai 2026)
- _index — Cloudflare als Edge vor AWS-Origins