TedTschopp/ttrpg-mcp-on-cloudflare
If you are the rightful owner of ttrpg-mcp-on-cloudflare and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
A Model Context Protocol server for tabletop RPG game masters, hosted on GitHub Pages using static JSON files and Jekyll.
TTRPG GM Tools MCP Server
A Model Context Protocol server for tabletop RPG game masters.
🏗️ Architecture
This project uses a two-part architecture:
- GitHub Pages - Hosts static data files (encounters, names, treasures, etc.) at
https://ttrpg-mcp.tedt.org/ - Cloudflare Worker - Implements the MCP protocol and executes tool logic at
https://ttrpg-mcp.tedt.org/mcp
Note: GitHub Pages can only serve static files. The MCP protocol requires a real server to handle dynamic requests, which is why we need the Cloudflare Worker.
🎲 Features
This MCP server provides tools for game masters:
- Random Encounter Generator - Generate random encounters based on difficulty and environment
- NPC Name Generator - Create character names for various fantasy races
- Location Name Generator - Generate tavern, city, and dungeon names
- Personality Trait Generator - Create NPC personalities and quirks
- Treasure Generator - Generate loot and treasure hoards
- Weather Generator - Create atmospheric weather descriptions
- Plot Hook Generator - Generate adventure hooks and quest ideas
🔧 Setup
Prerequisites
- Deploy the Cloudflare Worker (see
cloudflare-mcp-server/README.md) - Configure your MCP client
For MCP Clients (Claude Desktop, etc.)
Add this to your MCP client configuration:
{
"mcpServers": {
"ttrpg-gm-tools": {
"url": "https://ttrpg-mcp.tedt.org/mcp",
"transport": {
"type": "http"
}
}
}
}
Important:
- The URL is
https://ttrpg-mcp.tedt.org/mcp(notmcp.json) - Transport is Streamable HTTP (JSON responses), not SSE
- You must deploy the Cloudflare Worker first (see
cloudflare-mcp-server/folder)
Local Development
- Clone this repository
- Install Ruby 3.1+ (system Ruby 2.6/2.7 is often too old for
github-pages) - Install Bundler (if needed):
gem install bundler - Install site dependencies:
bundle install - Run locally (from the repo root):
bundle exec jekyll serve - Visit:
http://localhost:4000/
📁 Structure
├── _config.yml # Jekyll configuration
├── data/ # JSON data files for generators
│ ├── encounters.json # Encounter data
│ ├── names.json # NPC names by race
│ ├── locations.json # Location names
│ ├── traits.json # Personality traits
│ ├── treasure.json # Treasure tables
│ ├── weather.json # Weather descriptions
│ └── plot_hooks.json # Adventure hooks
├── cloudflare-mcp-server/ # Cloudflare Worker implementation
│ ├── src/index.ts # Worker entrypoint (/mcp)
│ ├── src/mcp/server.ts # MCP SDK server registration (tools/resources/prompts)
│ ├── src/tools/ # Central registry + per-tool modules
│ ├── src/data/fetch.ts # JSON fetch + Cloudflare caching
│ └── test/ # Vitest smoke tests
├── demo.md # Interactive demo page
└── index.md # Landing page
🚀 Usage
Once configured in your MCP client, you can use natural language to invoke tools:
- "Generate a random encounter for a level 5 party in a forest"
- "Give me a dwarf name for my NPC"
- "Create a tavern name"
- "Generate some personality traits for my villain"
🛠️ Technology Stack
- Jekyll/Liquid - Static site generation
- GitHub Pages - Hosting
- JSON - Data storage and API responses
- MCP SDK - MCP server implementation (
@modelcontextprotocol/sdk)
⚙️ Runtime Behavior
/mcpacceptsPOSTonly;GET /mcpreturns405- CORS is restricted via
ALLOWED_ORIGINS(missingOriginis allowed for non-browser clients) - Data reads are cached (in-memory + Cloudflare Cache API)
- The server supports
completion/completefor prompt args and for the resource template variable inttrpg://data/{dataset} - Tool results and prompt messages may include
resource_linkcontent blocks pointing at related datasets - The server and dataset resources include MCP
iconsmetadata (light/dark SVGs)
📝 License
MIT License - Feel free to use and modify for your campaigns!
🤝 Contributing
Contributions welcome! Add more:
- Encounter types
- Name lists for different cultures/races
- Treasure items
- Plot hooks
- New tool types