β¨ A reusable template for building streamable HTTP transport MCP servers that can be quickly deployed to Cloudflare Workers free tier. This template provides a complete foundation for creating Model Context Protocol (MCP) servers with real-time streaming capabilities and dual deployment support.
- π§ Complete MCP Implementation: Full Model Context Protocol server implementation using the official
@modelcontextprotocol/sdk
- β‘ Streamable HTTP Transport: Server-Sent Events (SSE) support for real-time client notifications
- βοΈ Cloudflare Workers Integration: Optimized for deployment to Cloudflare Workers free tier
- π Dual Runtime Support: Works in both Node.js development environment and Cloudflare Workers production
- π₯ Multi-session Handling: Supports multiple simultaneous client connections
- π» TypeScript Foundation: Fully typed codebase with proper configuration
- π Example Implementation: Working example to demonstrate usage patterns
# Clone this template (replace with your repo URL)
git clone <your-template-repo-url>
cd your-mcp-server
# Install dependencies
npm install
# Copy the example environment file
cp .env.example .env
# Edit .env with your configuration
# Update API keys, database URLs, and other settings as needed
# Build the project
npm run build
# Run locally with Node.js
node build/index.js
# Or specify a custom port
node build/index.js --port=9000
π The server will start at http://localhost:8123
by default (or the port specified in your .env
file).
# Start local Workers development server
npm run dev:worker
# Build for Workers deployment
npm run build:worker
# Deploy to Cloudflare Workers (free tier)
npm run deploy
β Success! Your MCP server is now live on the edge! π
This template is designed to work in both environments:
- π» Node.js: Full Express.js server for local development and traditional hosting
- βοΈ Cloudflare Workers: Optimized worker implementation for edge deployment
βββ src/
β βββ index.ts # π» Node.js Express server entry point
β βββ worker.ts # βοΈ Cloudflare Workers entry point
β βββ worker-transport.ts # β‘ Workers-optimized HTTP transport
β βββ server.ts # π§ Core MCP server implementation
βββ example-client.js # π§ͺ Example client for testing
βββ wrangler.toml # βοΈ Cloudflare Workers configuration
βββ tsconfig.json # π» Node.js TypeScript config
βββ tsconfig.worker.json # βοΈ Workers TypeScript config
Edit src/server.ts
to implement your specific MCP tools:
// Add your custom tools
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
{
name: "your-custom-tool",
description: "Description of what your tool does",
inputSchema: {
type: "object",
properties: {
// Define your tool's parameters
},
},
},
],
};
});
// Implement your tool logic
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
switch (name) {
case "your-custom-tool":
// Implement your tool logic here
return {
content: [
{
type: "text",
text: "Your tool response"
}
]
};
default:
throw new McpError(ErrorCode.MethodNotFound, `Tool not found: ${name}`);
}
});
Update wrangler.toml
:
name = "your-mcp-server-name"
main = "src/worker.ts"
compatibility_date = "2024-12-06"
[vars]
# Add your environment variables
API_KEY = "your-api-key"
Modify package.json
:
{
"name": "your-mcp-server",
"description": "Your MCP server description",
"version": "1.0.0"
}
The server exposes a single MCP endpoint at /mcp
:
- π€ POST /mcp: Handle MCP JSON-RPC requests
- π‘ GET /mcp: Establish Server-Sent Events (SSE) stream for real-time notifications
{
"jsonrpc": "2.0",
"id": "1",
"method": "tools/call",
"params": {
"name": "your-tool-name",
"arguments": {
"param1": "value1"
}
}
}
- π Optional API Key Authentication: Secure your MCP server with configurable API key authentication
- ποΈ Flexible Authentication Formats: Support for both
Bearer <token>
and direct API key formats - π Environment-Controlled: Enable/disable authentication via environment variables
- π CORS-Compatible: Proper CORS headers for cross-origin authentication
- β‘ Real-time Notifications: Server-Sent Events for live updates
- π₯ Multi-session Support: Handle multiple concurrent client connections
- π Dynamic Updates: Real-time tool and resource updates with client notifications
- π° Free Tier Compatible: Designed to work within Cloudflare Workers free tier limits
- π Edge Performance: Global edge deployment for low latency
- ποΈ Serverless Architecture: Pay-per-request pricing model
- β‘ Zero Cold Start: Optimized for fast startup times
- π» TypeScript Support: Full type safety and IntelliSense
- π₯ Hot Reload: Fast development iteration with
wrangler dev
- π¨ Error Handling: Comprehensive error handling and logging
- π§ͺ Example Client: Ready-to-use client for testing with authentication examples
Use the included example client to test your implementation:
# Start your server
npm run build && node build/index.js
# In another terminal, test with the example client
node example-client.js
The example client demonstrates:
- π MCP connection initialization
- π Tool discovery and listing
- βοΈ Tool execution with parameters
- π¨ Error handling
- π Authentication examples (configure
USE_AUTH
andAPI_KEY
in the client)
π‘ Note: If you enable authentication on your server (MCP_AUTH_REQUIRED=true
), make sure to update the authentication configuration in example-client.js
by setting USE_AUTH=true
and providing your API_KEY
.
- π° Free tier: 100,000 requests/day
- π Global edge: Low latency worldwide
- π§ Zero maintenance: Serverless infrastructure
- π» Node.js: Deploy to any Node.js hosting platform
- π Express.js: Full HTTP server capabilities
- π― Custom domains: Complete control over deployment
For local Node.js development, copy .env.example
to .env
and configure:
# Copy the example file
cp .env.example .env
PORT
: Server port (default: 8123)ENVIRONMENT
: Current environment (development/production)
MCP_SERVER_NAME
: Name of your MCP server (default: "mcp-server")MCP_SERVER_VERSION
: Version of your MCP server (default: "1.0.0")MCP_SESSION_HEADER_NAME
: Header name for session ID (default: "mcp-session-id")
MCP_AUTH_REQUIRED
: Enable/disable API key authentication (true/false, default: false)MCP_API_KEY
: API key for client authentication (required if MCP_AUTH_REQUIRED=true)MCP_AUTH_HEADER_NAME
: Header name for API key (default: "Authorization")
WEATHER_API_BASE_URL
: Weather API base URL (default: "https://api.weather.gov")USER_AGENT
: User agent string for API requests (default: "weather-app/1.0")
WEATHER_API_KEY
: Weather service API keyOPENAI_API_KEY
: OpenAI API keyGOOGLE_API_KEY
: Google services API keyANTHROPIC_API_KEY
: Anthropic API key
DATABASE_URL
: Database connection stringREDIS_URL
: Redis connection stringEXTERNAL_API_URL
: External API base URL
CORS_ORIGIN
: Allowed origins (default: "*")CORS_METHODS
: Allowed HTTP methods (default: "GET, POST, OPTIONS")CORS_HEADERS
: Allowed headers (default: "Content-Type, mcp-session-id")
ENABLE_LOGGING
: Enable detailed logging (true/false)ENABLE_DEBUG_MODE
: Enable debug mode (true/false)
For Cloudflare Workers development, copy .dev.vars.example
to .dev.vars
and configure similarly.
π‘ Note: The .env
file is for Node.js development, while .dev.vars
is for Cloudflare Workers. Both files are ignored by git for security.
This MCP server supports optional API key authentication to secure access to your server endpoints.
Authentication is controlled by environment variables and is disabled by default. To enable authentication:
- Set authentication environment variables in your
.env
file (Node.js) or.dev.vars
file (Cloudflare Workers):
# Enable authentication
MCP_AUTH_REQUIRED=true
# Set your API key (keep this secure!)
MCP_API_KEY=your-secure-api-key-here
# Optional: customize the header name (default: Authorization)
MCP_AUTH_HEADER_NAME=Authorization
- Restart your server after updating the environment variables.
The server supports two authentication formats:
Authorization: Bearer your-api-key-here
Authorization: your-api-key-here
When authentication is enabled, clients must include the API key in their requests:
// Example client code with authentication
const headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-api-key-here' // or just 'your-api-key-here'
};
const response = await fetch('http://localhost:8123/mcp', {
method: 'POST',
headers: headers,
body: JSON.stringify(mcpRequest)
});
- β 200 OK: Request successful (valid API key or authentication disabled)
- β 401 Unauthorized: Invalid or missing API key when authentication is required
Example error response:
{
"jsonrpc": "2.0",
"error": {
"code": -32600,
"message": "Unauthorized: Invalid or missing API key"
},
"id": null
}
- π Keep API keys secure: Never commit API keys to version control
- π Use environment variables: Store API keys in
.env
files that are gitignored - π Use HTTPS in production: Always use HTTPS when deploying to production
- π Rotate keys regularly: Change API keys periodically for better security
- π·οΈ Use Bearer format: The
Bearer <token>
format is the recommended standard
To disable authentication (default behavior):
# In .env or .dev.vars
MCP_AUTH_REQUIRED=false
# or simply omit the MCP_AUTH_REQUIRED variable
When authentication is disabled, the server will accept all requests without checking for API keys.
ISC
- π§ Customize Tools: Replace the example tools with your specific functionality
- βοΈ Configure Deployment: Update
wrangler.toml
with your project details - π§ͺ Test Locally: Use the example client to verify your implementation
- π Deploy: Push to Cloudflare Workers free tier
- π Connect: Integrate with MCP-compatible clients
π This template provides everything you need to build, test, and deploy production-ready MCP servers with minimal setup time! β¨
Built with β€οΈ for the MCP community
π Get Started β’ π Documentation β’ π οΈ Features β’ π§ Customization