> ## Documentation Index
> Fetch the complete documentation index at: https://redop.useagents.site/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Deploy to Cloudflare Workers

> Deploy a Redop MCP server on Cloudflare Workers with the portable fetch adapter and ctx.waitUntil.

Redop ships a first-class Cloudflare Workers adapter at `@redopjs/redop/cloudflare`.

## Fit today

| Item                                     | Value                                             |
| ---------------------------------------- | ------------------------------------------------- |
| Recommended for built-in Bun `.listen()` | no — use the adapter                              |
| Recommended protocol                     | MCP `2026-07-28` (stateless)                      |
| `create-redop-app` preset                | `--deploy cloudflare`                             |
| Generated files                          | `wrangler.jsonc`, adapter entry in `src/index.ts` |
| `afterResponse`                          | wired through `ctx.waitUntil`                     |

## Minimal worker

```ts theme={null}
import { Redop, cloudflare } from "@redopjs/redop/cloudflare";

const app = new Redop({
  serverInfo: { name: "cf-mcp", version: "0.1.0" },
}).tool("ping", {
  handler: async () => ({ ok: true }),
});

export default cloudflare(app, { health: true });
```

## Wrangler config

`create-redop-app --deploy cloudflare` writes a `wrangler.jsonc` like this:

```jsonc theme={null}
{
  "$schema": "node_modules/wrangler/config-schema.json",
  "name": "my-cf-mcp",
  "main": "src/index.ts",
  "compatibility_date": "2026-08-07",
  "compatibility_flags": ["nodejs_compat"]
}
```

| Field                 | Purpose                                                     |
| --------------------- | ----------------------------------------------------------- |
| `main`                | Worker entry — Redop's `cloudflare(app)` default export     |
| `compatibility_date`  | Workers runtime feature set                                 |
| `compatibility_flags` | `nodejs_compat` for Node-built-ins some MCP tooling expects |

Local and production both use this file:

```sh theme={null}
bunx wrangler dev
bunx wrangler deploy
```

## Scaffold

```sh theme={null}
bunx create-redop-app my-cf-mcp --transport http --deploy cloudflare
cd my-cf-mcp
bun install
bun run dev
```

The preset also sets `"dev": "wrangler dev"` and `"deploy": "wrangler deploy"` in `package.json`.

## Capability notes

* Prefer stateless MCP (`2026-07-28`). Avoid relying on in-memory sessions or long-lived SSE across isolates.
* `afterResponse` / `onAfterResponse` are scheduled with `ctx.waitUntil`, so deferred work is not dropped when the response returns.
* For always-on sessioned MCP + Inspector-style SSE, use Bun on Railway/Fly instead.

## Next

* [Deploy to Production overview](/docs/guides/deploy/index)
* [Runtime adapters reference](/docs/reference/runtime-adapters)
* [Deploy to Vercel](/docs/guides/deploy/vercel)
