Skip to main content
Glama
TedTschopp

MCP Server on Cloudflare Workers & Azure Functions

by TedTschopp
README.md
# MCP Server on Cloudflare Workers & Azure Functions

A [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server that can be deployed to **Cloudflare Workers** or **Azure Functions**. This server provides tools, prompts, and resources that can be accessed via the MCP protocol, enabling AI assistants to interact with your deployed services.

## Features

- šŸš€ Deployed on Cloudflare Workers (edge computing)
- šŸ”§ Example tools: `get_time`, `echo`, `add`
- 🌐 HTTP endpoints for health checks and MCP requests
- šŸ“¦ TypeScript with full type safety
- šŸ”„ Local development with Wrangler

## Prerequisites

- Node.js 18+ installed
- A Cloudflare account (free tier works)
- npm or yarn package manager

## Installation

Install dependencies:

```bash
npm install
```

## Development

Run the development server locally:

```bash
npm run dev
```

This will start a local Cloudflare Workers environment at `http://localhost:8787`

## Available Endpoints

### Health Check
```bash
GET http://localhost:8787/health
```

Returns server status and version information.

### MCP Protocol Endpoint
```bash
POST http://localhost:8787/mcp
Content-Type: application/json

{
  "method": "tools/list"
}
```

### Available Capabilities

#### Tools

The server includes three example tools with change notifications:

1. **get_time**: Returns the current server time
2. **echo**: Echoes back your message
3. **add**: Adds two numbers together

#### Prompts

The server includes five prompt templates with change notifications:

1. **code_review**: Get assistance reviewing code
2. **explain_concept**: Get explanations of technical concepts
3. **debug_helper**: Get help debugging issues
4. **api_design**: Get guidance on API design
5. **refactor_suggestion**: Get suggestions for refactoring code

#### Resource Access

The server provides contextual information through resources:

1. **config://server/info**: Server metadata and configuration
2. **config://server/status**: Current server status and metrics
3. **docs://mcp/getting-started**: Getting started guide

Resources support:

- **Subscriptions**: Clients can subscribe to resource changes
- **Templates**: Parameterized resources (e.g., `log://{level}/{message}`)
- **Multiple MIME types**: JSON and Markdown content

#### Logging

Configurable logging with support for standard log levels:

- debug, info, notice, warning, error, critical, alert, emergency

## Deployment

### Option 1: Cloudflare Workers (Recommended for Edge)

#### 1. Login to Cloudflare

```bash
npx wrangler login
```

#### 2. Deploy to Cloudflare Workers

```bash
npm run deploy
```

Your MCP server will be deployed and you'll receive a URL like:
`https://mcp-server.<your-subdomain>.workers.dev`

### Option 2: Azure Functions (Recommended for Azure Ecosystem)

For detailed Azure deployment instructions, see [AZURE_DEPLOYMENT.md](./AZURE_DEPLOYMENT.md).

#### Quick Start

```bash
# Install dependencies
npm install

# Login to Azure
az login

# Deploy to Azure Functions
npm run deploy:azure
```

Your MCP server will be available at:
`https://<your-function-app>.azurewebsites.net`

## Testing Deployed Server

```bash
# Health check
curl https://mcp-server.<your-subdomain>.workers.dev/health

# Test MCP endpoint
curl -X POST https://mcp-server.<your-subdomain>.workers.dev/mcp \
  -H "Content-Type: application/json" \
  -d '{"method": "tools/list"}'
```

## Project Structure

```
.
ā”œā”€ā”€ src/
│   └── index.ts          # Main server implementation
ā”œā”€ā”€ .github/
│   └── copilot-instructions.md
ā”œā”€ā”€ package.json          # Dependencies and scripts
ā”œā”€ā”€ tsconfig.json         # TypeScript configuration
ā”œā”€ā”€ wrangler.toml         # Cloudflare Workers config
└── README.md            # This file
```

## Adding New Tools

To add a new tool, edit `src/index.ts`:

1. Add tool definition in `ListToolsRequestSchema` handler
2. Add tool implementation in `CallToolRequestSchema` handler

Example:

```typescript
// In ListToolsRequestSchema handler
{
  name: 'my_tool',
  description: 'Description of what it does',
  inputSchema: {
    type: 'object',
    properties: {
      param1: {
        type: 'string',
        description: 'Parameter description',
      },
    },
    required: ['param1'],
  },
}

// In CallToolRequestSchema handler
case 'my_tool':
  return {
    content: [
      {
        type: 'text',
        text: `Result: ${args.param1}`,
      },
    ],
  };
```

## Configuration

### Cloudflare Workers Settings

Edit `wrangler.toml` to configure:
- Worker name
- Compatibility date
- KV namespaces (for storage)
- D1 databases (for SQL)
- Environment variables

## Troubleshooting

### Build Errors

Check TypeScript types:
```bash
npm run types
```

### Deployment Issues

View deployment logs:
```bash
npx wrangler tail
```

## Resources

- [Model Context Protocol](https://modelcontextprotocol.io)
- [Cloudflare Workers Docs](https://developers.cloudflare.com/workers/)
- [Wrangler CLI Docs](https://developers.cloudflare.com/workers/wrangler/)
- [MCP SDK](https://github.com/modelcontextprotocol/typescript-sdk)

## License

MIT