Replace scripts
Uploads or replaces a module Worker script.
PUT /v1/cloudflare/workers/scripts/{script}
| Address | https://api.hanzo.ai/v1/cloudflare/workers/scripts/{script} |
| Method | PUT |
| Operation | put_cloudflare_workers_scripts_by_script |
| Auth | Authorization: Bearer $HANZO_API_KEY |
Uploads or replaces a module Worker script. It publishes to the org's OWN Cloudflare account under the name in the path, replacing whatever was there, and relays Cloudflare's result. The compatibility date, compatibility flags and bindings are packed into the multipart upload Cloudflare expects, beside the module source.
Requires ORG ADMIN — a Worker is arbitrary code on the org's own account and
domains — so a caller who is only an org member is refused 403. An empty source
is 400, as is a mainModule that is not a plain file name; 503 if the org has
never connected a Cloudflare token.
Request
6 fields, body application/json (required).
| Field | In | Type | Required | Description |
|---|---|---|---|---|
script | path | string | yes | Script means two things on this route, and the document says so in both places it appears: the PATH segment names the Worker to publish, and the BODY field carries that Worker's ES-module source — the code itself, never a name or a URL. |
bindings | body | any | — | Bindings are the resources the script can reach (KV, D1, R2, secrets, …), in Cloudflare's own binding vocabulary, passed through as written: this plane deliberately does not model Cloudflare's shapes. |
compatibilityDate | body | string | — | CompatibilityDate pins which Workers runtime behaviour the script runs under, as a plain calendar date ("2024-01-01"). |
compatibilityFlags | body | string[] | — | CompatibilityFlags turn individual runtime behaviours on or off around that date ("nodejs_compat"), in Cloudflare's own flag vocabulary. |
mainModule | body | string | — | MainModule is the module file the runtime starts at. |
script | body | string | — | Script means two things on this route, and the document says so in both places it appears: the PATH segment names the Worker to publish, and the BODY field carries that Worker's ES-module source — the code itself, never a name or a URL. |
Response
| Status | Body | Meaning |
|---|---|---|
200 | ok | |
default | problem-details | refused |
200 body — 1 field.
| Field | In | Type | Always | Description |
|---|---|---|---|---|
(body) | body | any | yes |
Failure carries the platform error shape — see Errors.
Examples
hanzo cloudflare workers scripts set <script>import { Configuration, CloudflareApi } from 'hanzoai';
const api = new CloudflareApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.putCloudflareWorkersScriptsByScript({ script: 'script', bindings: "<bindings>", compatibilityDate: "<compatibilityDate>" });from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import CloudflareApi
client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = CloudflareApi(client).put_cloudflare_workers_scripts_by_script(script='script', bindings="<bindings>", compatibility_date="<compatibilityDate>")cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)
resp, _, err := client.CloudflareAPI.PutCloudflareWorkersScriptsByScript(context.Background()).Execute()
if err != nil {
return err
}use hanzo_client::apis::{configuration::Configuration, cloudflare_api};
let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();
let result = cloudflare_api::put_cloudflare_workers_scripts_by_script(&cfg, Default::default()).await?;import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.CloudflareApi;
ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));
var result = new CloudflareApi(client).putCloudflareWorkersScriptsByScript();curl -X PUT https://api.hanzo.ai/v1/cloudflare/workers/scripts/<script> \
-H "Authorization: Bearer $HANZO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"bindings": "<bindings>",
"compatibilityDate": "<compatibilityDate>"
}'MCP reaches cloudflare through the cloudflare tool, which names its 29 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:
curl -X POST https://api.hanzo.ai/v1/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "describe",
"arguments": {
"op": "list_cloudflare_d1_databases"
}
}
}'