Skip to main content
skill CX Codex GP ChatGPT official · OpenAI

building-mcp-server-on-cloudflare — Claude skill: MCP servers

A skill that walks the agent through building a remote MCP server on Cloudflare Workers: tools, OAuth, deployment. Useful when you need to expose your own functions over MCP.

Install into Codex · Skills CLI (Vercel) All methods and platforms ↓
npx skills add openai/plugins --skill building-mcp-server-on-cloudflare -a codex
Open on GitHub

What building-mcp-server-on-cloudflare does

The skill kicks in when you ask to build an MCP server, add OAuth, or deploy one to Workers. Inside is a step-by-step path: define tools with server.tool(), wire up the entry point, test locally in MCP Inspector, ship with npx wrangler deploy, then connect a client via codex mcp add.

Input validation runs on Zod — types, enums, ranges. A separate section covers bindings like D1 and KV through this.env, plus a minimal wrangler.toml with durable objects and migrations. For authenticated servers the skill points to references/oauth-setup.md, listing GitHub, Google, Auth0, Stytch, WorkOS and any OAuth 2.0 provider.

You need a Cloudflare account with Workers enabled, Node.js 18+ and the Wrangler CLI. The skill deliberately biases the agent toward reading Cloudflare docs and the MCP spec instead of pre-trained knowledge — SDK details go stale, so trusting memory here is a bad bet.

What it helps with

  • build a remote MCP server on Cloudflare Workers
  • define MCP tools with Zod-validated parameters
  • attach an OAuth provider to an MCP server
  • deploy the Worker and register it as an MCP client in Claude
  • debug connection failures and OAuth redirect errors

Example prompts for the agent

  • build an MCP server on Cloudflare Workers with a weather tool
  • add GitHub OAuth to my MCP server
  • deploy my MCP server to Workers and connect it in Claude

How to install building-mcp-server-on-cloudflare

1Skills CLI (Vercel)

npx skills add openai/plugins --skill building-mcp-server-on-cloudflare -a codex

2Manually: put the files in place

.agents/skills/building-mcp-server-on-cloudflare/SKILL.md

For all projects use ~/.agents/skills/

Step by step, with commands for each platform: Codex skills: how to install, where they live, how to call them

Questions about building-mcp-server-on-cloudflare

How do I install building-mcp-server-on-cloudflare in Claude?

Run npx skills add openai/plugins --skill building-mcp-server-on-cloudflare, then npx skills add openai/plugins --skill building-mcp-server-on-cloudflare -a codex. The skill then lives at .agents/skills/building-mcp-server-on-cloudflare/SKILL.md.

What does building-mcp-server-on-cloudflare do?

It guides you through building a remote MCP server on Cloudflare Workers: generating tool code, configuring an OAuth provider, testing locally and deploying. It pulls current Cloudflare docs rather than relying on pre-trained knowledge.

What do I need before using this skill?

A Cloudflare account with Workers enabled, Node.js 18+ and the Wrangler CLI, installed with npm install -g wrangler. Authenticated servers also need an OAuth app configured.

Source text

SKILL.md · MIT
---
name: building-mcp-server-on-cloudflare
description: |
  Builds remote MCP (Model Context Protocol) servers on Cloudflare Workers
  with tools, OAuth authentication, and production deployment. Generates
  server code, configures auth providers, and deploys to Workers.

  Use when: user wants to "build MCP server", "create MCP tools", "remote
  MCP", "deploy MCP", add "OAuth to MCP", or mentions Model Context Protocol
  on Cloudflare. Also triggers on "MCP authentication" or "MCP deployment".
  Biases towards retrieval from Cloudflare docs over pre-trained knowledge.
---

# Building MCP Servers on Cloudflare

Your knowledge of the MCP SDK and Cloudflare Workers integration may be outdated. **Prefer retrieval over pre-training** for any MCP server task.

## Retrieval Sources

| Source | How to retrieve | Use for |
|--------|----------------|---------|
| MCP docs | `https://developers.cloudflare.com/agents/mcp/` | Server setup, auth, deployment |
| MCP spec | `https://modelcontextprotocol.io/` | Protocol spec, tool/resource definitions |
| Workers docs | Search tool or `https://developers.cloudflare.com/workers/` | Runtime APIs, bindings, config |

## When to Use

- User wants to build a remote MCP server
- User needs to expose tools via MCP
- User asks about MCP authentication or OAuth
- User wants to deploy MCP to Cloudflare Workers

## Prerequisites

- Cloudflare account with Workers enabled
- Node.js 18+ and npm/pnpm/yarn
- Wrangler CLI (`npm install -g wrangler`)

## Quick Start

### Option 1: Public Server (No Auth)

```bash
npm create cloudflare@latest -- my-mcp-server \
  --template=cloudflare/ai/demos/remote-mcp-authless
cd my-mcp-server
npm start
```

Server runs at `http://localhost:8788/mcp`

### Option 2: Authenticated Server (OAuth)

```bash
npm create cloudflare@latest -- my-mcp-server \
  --template=cloudflare/ai/demos/remote-mcp-github-oauth
cd my-mcp-server
```

Requires OAuth app setup. See [references/oauth-setup.md](references/oauth-setup.md).

## Core Workflow

### Step 1: Define Tools

Tools are functions MCP clients can call. Define them using `server.tool()`:

```typescript
import { McpAgent } from "agents/mcp";
import { z } from "zod";

export class MyMCP extends McpAgent {
  server = new Server({ name: "my-mcp", version: "1.0.0" });

  async init() {
    // Simple tool with parameters
    this.server.tool(
      "add",
      { a: z.number(), b: z.number() },
      async ({ a, b }) => ({
        content: [{ type: "text", text: String(a + b) }],
      })
    );

    // Tool that calls external API
    this.server.tool(
      "get_weather",
      { city: z.string() },
      async ({ city }) => {
        const response = await fetch(`https://api.weather.com/${city}`);
        const data = await response.json();
        return {
          content: [{ type: "text", text: JSON.stringify(data) }],
        };
      }
    );
  }
}
```

### Step 2: Configure Entry Point

**Public server** (`src/index.ts`):

```typescript
import { MyMCP } from "./mcp";

export default {
  fetch(request: Request, env: Env, ctx: ExecutionContext) {
    const url = new URL(request.url);
    if (url.pathname === "/mcp") {
      return MyMCP.serveSSE("/mcp").fetch(request, env, ctx);
    }
    return new Response("MCP Server", { status: 200 });
  },
};

export { MyMCP };
```

**Authenticated server** — See [references/oauth-setup.md](references/oauth-setup.md).

### Step 3: Test Locally

```bash
# Start server
npm start

# In another terminal, test with MCP Inspector
npx @modelcontextprotocol/inspector@latest
# Open http://localhost:5173, enter http://localhost:8788/mcp
```

### Step 4: Deploy

```bash
npx wrangler deploy
```

Server accessible at `https://[worker-name].[account].workers.dev/mcp`

### Step 5: Connect Clients

**Codex MCP client setup:**

```bash
codex mcp add my-server -- npx mcp-remote https://my-mcp.workers.dev/mcp
```

Restart Codex after updating the MCP configuration.

## Tool Patterns

### Return Types

```typescript
// Text response
return { content: [{ type: "text", text: "result" }] };

// Multiple content items
return {
  content: [
    { type: "text", text: "Here's the data:" },
    { type: "text", text: JSON.stringify(data, null, 2) },
  ],
};
```

### Input Validation with Zod

```typescript
this.server.tool(
  "create_user",
  {
    email: z.string().email(),
    name: z.string().min(1).max(100),
    role: z.enum(["admin", "user", "guest"]),
    age: z.number().int().min(0).optional(),
  },
  async (params) => {
    // params are fully typed and validated
  }
);
```

### Accessing Environment/Bindings

```typescript
export class MyMCP extends McpAgent<Env> {
  async init() {
    this.server.tool("query_db", { sql: z.string() }, async ({ sql }) => {
      // Access D1 binding
      const result = await this.env.DB.prepare(sql).all();
      return { content: [{ type: "text", text: JSON.stringify(result) }] };
    });
  }
}
```

## Authentication

For OAuth-protected servers, see [references/oauth-setup.md](references/oauth-setup.md).

Supported providers:
- GitHub
- Google
- Auth0
- Stytch
- WorkOS
- Any OAuth 2.0 compliant provider

## Wrangler Configuration

Minimal `wrangler.toml`:

```toml
name = "my-mcp-server"
main = "src/index.ts"
compatibility_date = "2024-12-01"

[durable_objects]
bindings = [{ name = "MCP", class_name = "MyMCP" }]

[[migrations]]
tag = "v1"
new_classes = ["MyMCP"]
```

With bindings (D1, KV, etc.):

```toml
[[d1_databases]]
binding = "DB"
database_name = "my-db"
database_id = "xxx"

[[kv_namespaces]]
binding = "KV"
id = "xxx"
```

## Common Issues

### "Tool not found" in Client

1. Verify tool name matches exactly (case-sensitive)
2. Ensure `init()` registers tools before connections
3. Check server logs: `wrangler tail`

### Connection Fails

1. Confirm endpoint path is `/mcp`
2. Check CORS if browser-based client
3. Verify Worker is deployed: `wrangler deployments list`

### OAuth Redirect Errors

1. Callback URL must match OAuth app config exactly
2. Check `GITHUB_CLIENT_ID` and `GITHUB_CLIENT_SECRET` are set
3. For local dev, use `http://localhost:8788/callback`

## References

- [references/examples.md](references/examples.md) — Official templates and production examples
- [references/oauth-setup.md](references/oauth-setup.md) — OAuth provider configuration
- [references/troubleshooting.md](references/troubleshooting.md) — Error codes and fixes

© Cloudflare · MIT · openai/plugins

Similar skills

All skills for Agent setup: memory, context, orchestration →

From the same set360

The whole set →
ngs-bulk-rnaseq A dispatcher for bulk RNA-seq work: it splits FASTQ-to-count processing from count-matrix statistics. Useful when you need expression counts and then differentially expressed genes. CX Codex GP ChatGPT 2installs ngs-bcl-to-fastq Validates an Illumina run folder and sample sheet, plans demultiplexing, and runs BCL-to-FASTQ conversion. Useful when the input is a sequencing run folder. CX Codex GP ChatGPT 2installs hyperframes A skill for building video in HTML: compositions, title cards, captions, narration and music-driven animation. Useful when the video should come out of code, not an editor. CX Codex GP ChatGPT 2installs upgrading-expo Walks the agent through an Expo SDK upgrade: install commands, diagnostics, cache cleanup and broken dependency fixes. CX Codex GP ChatGPT 2installs knowledge-update Injects up-to-date Vercel platform facts into the session and overrides stale model knowledge. Useful when your agent still reaches for Edge Functions or vercel.json. CX Codex GP ChatGPT 1installs twilio-messaging-overview A navigation skill for Twilio Messaging: pick between SMS, WhatsApp, RCS and Messenger, then follow the setup order from first message to production monitoring. CX Codex GP ChatGPT 1installs twilio-account-setup Walks you from Twilio signup to your first sent message: credentials, phone number, SDK, subaccounts. CX Codex GP ChatGPT 1installs shopify-storefront-graphql Writes GraphQL queries and mutations against the Shopify Storefront API, searching the docs first and validating the code before it reaches you. CX Codex GP ChatGPT 1installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor