TTRPG MCP Server - Cloudflare Worker
This Cloudflare Worker implements a real MCP (Model Context Protocol) server that connects to the static data hosted on GitHub Pages.
Problem It Solves
GitHub Pages can only serve static files. The MCP protocol requires a real server that can:
- Handle dynamic requests
- Execute tool logic
- Return formatted responses
This worker bridges that gap.
Setup
1. Install Dependencies
cd cloudflare-mcp-server
npm install
2. Configure Wrangler
Make sure you’re logged into Cloudflare:
npx wrangler login
3. Test Locally
npm run dev
Run tests:
npm test
4. Deploy to Cloudflare
npm run deploy
5. Configure Custom Domain
In Cloudflare Dashboard:
- Go to Workers & Pages
- Select your worker
- Go to Settings → Triggers
- Add custom domain route:
ttrpg-mcp.tedt.org/mcp
MCP Client Configuration
Update your MCP client configuration to use the worker endpoint:
{
"mcpServers": {
"ttrpg-gm-tools": {
"url": "https://ttrpg-mcp.tedt.org/mcp",
"transport": {
"type": "http"
}
}
}
}
This Worker uses Streamable HTTP transport in JSON response mode (no SSE).
How It Works
- Worker receives MCP protocol requests
- Fetches necessary data from GitHub Pages JSON files
- Executes tool logic (random selection, dice rolling, etc.)
- Returns formatted MCP responses
Configuration
Configured via wrangler.toml / Cloudflare environment variables:
DATA_BASE_URL(default:https://ttrpg-mcp.tedt.org/data)SITE_BASE_URL(optional; default: derived fromDATA_BASE_URLby stripping/data)DATA_CACHE_TTL_SECONDS(default:3600)ALLOWED_ORIGINS(default:https://ttrpg-mcp.tedt.org, comma-separated)
Deployment Fingerprint (Optional)
The Worker can include build/version metadata on every response so you can confirm what is currently deployed.
Headers:
X-TTRPG-MCP-VersionX-TTRPG-MCP-CommitX-TTRPG-MCP-Build-Time
Env vars:
BUILD_VERSION(default:dev)BUILD_COMMIT(optional)BUILD_TIME(optional)
Verify from your terminal:
curl -I https://ttrpg-mcp.tedt.org/mcp
Available Tools
All 7 tools are implemented:
- ✅ generate_encounter
- ✅ generate_npc_name
- ✅ generate_location_name
- ✅ generate_personality
- ✅ generate_treasure
- ✅ generate_weather
- ✅ generate_plot_hook
Resources
This server exposes the underlying JSON datasets as MCP resources.
resources/listreturns concrete dataset URIs likettrpg://data/encounters,ttrpg://data/names, etc.resources/readreads any dataset URI and returnsapplication/json.
Example resources/read request (JSON-RPC over Streamable HTTP):
{
"jsonrpc": "2.0",
"id": 1,
"method": "resources/read",
"params": {
"uri": "ttrpg://data/names"
}
}
Resource Templates
Datasets are also registered via a resource template:
- Template URI:
ttrpg://data/{dataset}
Clients can discover templates via resources/templates/list and then use resources/read with a filled-in URI.
Completions
The server supports completion/complete for:
- Prompt arguments (e.g.,
quick_npc.role,dungeon_room.difficulty,session_prep.session_theme) - Resource template variables (the
{dataset}variable inttrpg://data/{dataset})
Example: complete a prompt argument:
{
"jsonrpc": "2.0",
"id": 2,
"method": "completion/complete",
"params": {
"ref": { "type": "ref/prompt", "name": "quick_npc" },
"argument": { "name": "role", "value": "g" }
}
}
Example: complete a resource template variable:
{
"jsonrpc": "2.0",
"id": 3,
"method": "completion/complete",
"params": {
"ref": { "type": "ref/resource", "uri": "ttrpg://data/{dataset}" },
"argument": { "name": "dataset", "value": "tr" }
}
}
Resource Links in Results
Tool results and prompt messages may include resource_link content blocks that point at the relevant dataset URI (for example, the encounter generator links to ttrpg://data/encounters). This helps MCP clients surface “open the underlying data” affordances without the user needing to guess URIs.
Icons
The server implementation and dataset resources include MCP icons metadata (light/dark SVGs) served from the GitHub Pages site under /assets/icons/.
Cost
Cloudflare Workers Free Tier:
- 100,000 requests per day
- More than enough for personal use!