search
Search the Cloudflare OpenAPI spec. All $refs are pre-resolved inline.
Products: ai, cloudforce-one, access, magic, workers, realtime, devices, dlp, email-security, stream, ai-search, brand-protection, gateway, intel, email, api_gateway, addressing, browser-rendering, dex, rulesets, ai-gateway, builds, logpush, vectorize, firewall, load_balancers, settings, logs, secondary_dns, urlscanner... (134 total)
Types:
interface OperationInfo {
summary?: string;
description?: string;
tags?: string[];
parameters?: Array<{ name: string; in: string; required?: boolean; schema?: unknown; description?: string }>;
requestBody?: { required?: boolean; content?: Record<string, { schema?: unknown }> };
responses?: Record<string, { description?: string; content?: Record<string, { schema?: unknown }> }>;
}
interface PathItem {
get?: OperationInfo;
post?: OperationInfo;
put?: OperationInfo;
patch?: OperationInfo;
delete?: OperationInfo;
}
declare const spec: {
paths: Record<string, PathItem>;
};
Examples:
// Find endpoints by product
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;
}
// Get endpoint with requestBody schema (refs are resolved)
async () => {
const op = spec.paths['/accounts/{account_id}/d1/database']?.post;
return { summary: op?.summary, requestBody: op?.requestBody };
}
// Get endpoint parameters
async () => {
const op = spec.paths['/accounts/{account_id}/workers/scripts']?.get;
return op?.parameters;
}
execute
Execute JavaScript code against the Cloudflare API. First use the 'search' tool to find the right endpoints, then write code using the cloudflare.request() function.
Available in your code:
interface CloudflareRequestOptions {
method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
path: string;
query?: Record<string, string | number | boolean | undefined>;
body?: unknown;
contentType?: string; // Custom Content-Type header (defaults to application/json if body is present)
rawBody?: boolean; // If true, sends body as-is without JSON.stringify
}
interface CloudflareResponse<T = unknown> {
success: boolean;
status: number;
result: T;
errors: Array<{ code: number; message: string }>;
messages: Array<{ code: number; message: string }>;
result_info?: {
page: number;
per_page: number;
total_pages: number;
count: number;
total_count: number;
};
}
declare const cloudflare: {
request<T = unknown>(options: CloudflareRequestOptions): Promise<CloudflareResponse<T>>;
};
// IMPORTANT: This token has access to multiple Cloudflare accounts.
// The accountId variable will be set based on the account_id parameter you pass to this tool.
// Available accounts:
// "803f233d0412e126cfeaf342557f82a0" —
[email protected]'s Account
// "c4cf21d8a5e8878bc3c92708b1f80193" — Smithery
// Ask the user which account to use if unclear, then pass it as the account_id parameter.
declare const accountId: string; // Set from your account_id parameter
Your code must be an async arrow function that returns the result.
Example: Worker with bindings (requires multipart/form-data):
async () => {
const code = `addEventListener('fetch', e => e.respondWith(MY_KV.get('key').then(v => new Response(v || 'none'))));`;
const metadata = { body_part: "script", bindings: [{ type: "kv_namespace", name: "MY_KV", namespace_id: "your-kv-id" }] };
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 });
}