Tutorial: deploy a Cloudflare Worker with MultiTool

This tutorial walks through rolling out a simple Cloudflare Worker. You’ll simulate user traffic to the API, and the MultiTool agent will automatically decide whether to promote or roll out based on the observed error rate.

You will:

  1. Create and package sample Worker code
  2. Deploy to Cloudflare
  3. Connect to MultiTool and run a canary deployment

Tools

Prerequisites

Step 1: Create and package the Worker code

Create a new "Hello World" Cloudflare Worker

npm create cloudflare@latest -- multitool-quickstart --type hello-world --lang js --no-git -y true

Step 2: Create and package the Worker code

This tutorial simulates two versions of a Worker:

  • A “healthy” version that always returns a 200 HTTP status code
  • A “buggy” version that randomly fails with a 400 HTTP status code 50% of the time

We'll overwrite the index.js file and add a new file for the buggy version:

Create the healthy version

This version always returns a 200 HTTP status code response.

cat << EOF > multitool-quickstart/src/index.js
export default {
	async fetch(request, env, ctx) {
		return new Response('Hello World!', { status: 200 });
	},
};
EOF

Create the buggy version

This version introduces a simulated bug by returning a 400 HTTP status code 50% of the time.

cat << EOF > multitool-quickstart/src/index_errors.js
export default {
	async fetch(request, env, ctx) {
		const rand = Math.random();
		return new Response(rand < 0.5 ? 'Bad Request' : 'Hello World!', { status: rand < 0.5 ? 400 : 200 });
	},
};
EOF

Step 3: Create the Worker

Deploy the Worker:

npx wrangler deploy

Store the URL, replacing MY_ACCOUNT_URL:

MY_URL="https://multitool-quickstart.[MY_ACCOUNT_URL].workers.dev"

Save the URL to a file for later:

cat << EOF > url.txt
$MY_URL
EOF

Step 4: Test that the Worker is accepting traffic

Before moving on, make sure the Worker returns the expected response.

curl $MY_URL

You should see:

Hello World!

Step 5: Connect the application to MultiTool

Now that the Worker is deployed and accessible via its URL, create the application in MultiTool.

From the MultiTool app:

  1. Create a workspace
  2. Create an application named quickstart

After the application is set up, login to the MultiTool CLI if needed:

multi login

Step 6: Add your configuration file

Now that your workspace and application are set up in the MultiTool app, you’ll create a MultiTool.toml file. This file tells the CLI how to deploy your application.

If you’ve been using the sample values from this tutorial, you can use the configuration below. Be sure to replace the placeholder values with your actual workspace name and Cloudflare account ID.

cat << EOF > MultiTool.toml
workspace = "MY_WORKSPACE_NAME"
application = "quickstart"

[config.cloudflare]
worker-name = "multitool-quickstart"
account-id = "MY_CLOUDFLARE_ACCOUNT_ID"
main-module = "index.ts"
artifact-path = "src/"
EOF

Step 7: Deploy healthy code and simulate stable traffic

Start the rollout using index.ts as the main-module value in your MultiTool.toml file:

multi run --cloudflare-api-token $MY_CLOUDFLARE_TOKEN

In a separate terminal window, load the public URL from Step 6 to use in the next step:

MY_URL=$(cat url.txt)

Simulate traffic to the worker using one of these options:

Option A: Using curl

for i in $(seq 1 1500);do echo -n "Request $i completed with status: ";code=$(curl -s -o /dev/null -w "%{http_code}" "$MY_URL");echo "$code";sleep 1;done

Option B: Using Bombardier

bombardier -c 5 -n 20 ${MY_URL}

As traffic hits the new version, MultiTool will evaluate its behavior and promote it to 100% traffic once it confirms stability.

Step 8: Deploy buggy code and simulate errors

To test a broken rollout, use the index_errors.ts file.

Start the rollout using index_errors.ts as the main-module value in your MultiTool.toml file:

multi run --cloudflare-api-token $MY_CLOUDFLARE_TOKEN

In a separate terminal window, load the public URL from Step 6 to use in the next step:

MY_URL=$(cat url.txt)

Simulate traffic to the Worker using one of these options:

Option A: Using curl

for i in $(seq 1 1500);do echo -n "Request $i completed with status: ";code=$(curl -s -o /dev/null -w "%{http_code}" "$MY_URL");echo "$code";sleep 1;done

Option B: Using Bombardier

bombardier -c 5 -n 20 ${MY_URL}

MultiTool will detect the increase in errors and automatically trigger a rollback.

Step 9: Cleanup

After you've tested MultiTool, be sure to clean up the demo resources created as part of this guide.

Delete the Worker:

npx wrangler delete multitool-quickstart