Skip to main content
Glama

ChatRPG

D&D 5e MCP Server for AI Dungeon Masters

A Model Context Protocol (MCP) server providing 30+ D&D 5e tools for LLM-powered tabletop gaming. Features real-time combat tracking, character persistence, ASCII art rendering, and a web client interface.

Build TypeScript License


Features

  • 30+ D&D 5e Tools - Character creation, combat encounters, spell tracking, dice rolling

  • ASCII Art Output - Retro-style box drawing for immersive terminal/chat display

  • Dual Transport - stdio for Claude Desktop, SSE for web client

  • Real-time Sync - WebSocket broadcasting for encounter updates

  • Persistent Storage - Characters and encounters saved to AppData

  • Web Client - Browser-based interface with typing indicators


Quick Start

1. Build & Run

npm install npm run build # Run with stdio (for Claude Desktop) npm start # Run with SSE (for web client, port 3001) node dist/index.js --sse

2. Configure Claude Desktop

Add to your Claude Desktop config:

Windows: %APPDATA%\Claude\claude_desktop_config.json macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

{ "mcpServers": { "chatrpg": { "command": "node", "args": ["C:\\path\\to\\ChatRPG\\dist\\index.js"] } } }

3. Web Client

The web client connects to the SSE endpoint:

# Start server with SSE node dist/index.js --sse # Open web-client/index.html in browser

Available Tools

Character Management

Tool

Description

create_character

Full D&D 5e character creation with auto-calculated stats

get_character

Retrieve by ID/name, supports listing and filtering

update_character

Modify stats with before/after comparison

delete_character

Remove with cascade cleanup, batch support

level_up

Level progression with HP rolls, spell slots

take_rest

Short/long rest with hit dice and recovery

manage_spell_slots

Full/half/third casters, warlock pact magic

roll_check

Skill checks, saves, attacks, initiative

Combat System

Tool

Description

create_encounter

Initialize combat with participants and terrain

get_encounter

Retrieve state with verbosity levels

execute_action

Attack, dash, dodge, disengage, grapple, shove, cast

advance_turn

Turn management with condition ticking

end_encounter

Close with outcome tracking

roll_death_save

D&D 5e death save mechanics

manage_condition

Apply/remove conditions with duration

manage_encounter

Composite operations with state sync

render_battlefield

ASCII tactical map

modify_terrain

Hazards, obstacles, difficult terrain

Magic System

Tool

Description

manage_concentration

Concentration checks and tracking

manage_aura

Spirit Guardians, Paladin auras, etc.

use_scroll

Spell scroll mechanics

synthesize_spell

Improvised magic with Arcana checks

Spatial Mechanics

Tool

Description

measure_distance

Grid-based distance (5e rules)

calculate_aoe

Sphere, cone, line, cube, cylinder

check_line_of_sight

Obstacle detection

check_cover

Half, three-quarters, full cover

place_prop

Interactive battlefield objects

calculate_movement

Pathfinding with terrain

World & Session

Tool

Description

manage_location

Location graph for navigation

move_party

Travel between locations

manage_party

Party composition and roles

manage_inventory

Item management and equipping

manage_notes

Session notes with tagging

get_session_context

Comprehensive state snapshot

Dice

Tool

Description

roll_dice

Standard notation, advantage/disadvantage, batch rolls


Project Structure

ChatRPG/ ├── src/ │ ├── index.ts # MCP server (stdio + SSE transports) │ ├── registry.ts # Tool registration (30+ tools) │ ├── types.ts # Shared Zod schemas │ ├── fuzzy-enum.ts # Fuzzy enum matching │ ├── websocket.ts # Real-time broadcasting │ └── modules/ │ ├── ascii-art.ts # Box drawing, formatting │ ├── characters.ts # Character CRUD, leveling │ ├── combat.ts # Encounters, conditions, actions │ ├── data.ts # Locations, party, inventory, notes │ ├── dice.ts # Dice parsing and rolling │ ├── magic.ts # Spells, concentration, auras │ └── spatial.ts # Distance, AoE, movement ├── web-client/ # Browser-based interface ├── tests/ # Vitest test suites ├── dist/ # Compiled output └── design docs/ # ADRs and documentation

Development

Commands

# Development with auto-rebuild npm run dev # Type check npx tsc --noEmit # Build npm run build # Run tests npm test # Run tests once npm test -- --run

Adding a New Tool

  1. Define Zod schema in src/modules/[module].ts

  2. Write handler function

  3. Export schema from module

  4. Register in src/registry.ts

  5. Add tests in tests/[module]/

Git Workflow

  • main - Production-ready, auto-deploys to Railway

  • development - Active development branch


Data Storage

Character and session data is stored in:

  • Windows: %APPDATA%\rpg-lite-mcp\

  • macOS/Linux: ~/.config/rpg-lite-mcp/

rpg-lite-mcp/ ├── characters/ # Character JSON files ├── encounters/ # Active encounter state ├── locations/ # Location graph ├── party/ # Party composition └── notes/ # Session notes

Example Usage

Ask Claude:

"Create a level 5 halfling rogue named Finn with high dexterity"

Response:

╔═══════════════════════ CHARACTER SHEET ════════════════════════╗ ║ Finn ║ ║ PC - Halfling Rogue (Level 5) ║ ║ ║ ║ HP: [████████████████] 35/35 ║ ║ ║ ║ ────────────────────────────────────────────────────────────── ║ ║ ║ ║ AC │ Speed │ Initiative │ Prof Bonus ║ ║ 15 │ 25 ft │ +4 │ +3 ║ ╚════════════════════════════════════════════════════════════════╝

Other commands:

  • "Roll 4d6 drop lowest for ability scores"

  • "Start a combat encounter with 3 goblins"

  • "Cast fireball centered at position 5,5"

  • "Move the party to the tavern"


Deployment

The server is deployed on Railway and auto-deploys from the main branch.

SSE Endpoint: https://chatrpg-production.up.railway.app/


Troubleshooting

Server Won't Start

  1. Verify build: npm run build

  2. Check path in config is absolute

  3. Test manually: node dist/index.js

Tool Calls Failing

  1. Rebuild: npm run build

  2. Run tests: npm test -- --run

  3. Check TypeScript: npx tsc --noEmit

Encoding Issues

If ASCII art displays as garbled text (e.g., ââ€â‚¬ instead of ), ensure:

  • Source files are UTF-8 encoded

  • Terminal/client supports Unicode

  • No double-encoding in transport layer


Architecture

MCP Protocol

  • Transports: stdio, SSE (Server-Sent Events)

  • Format: JSON-RPC 2.0

  • Capabilities: Tools (30+)

Design Principles

  1. ASCII Art First - All output uses box drawing for terminal aesthetics

  2. Zod Validation - Strict input schemas with fuzzy enum matching

  3. Stateful Persistence - JSON files in AppData

  4. D&D 5e Accurate - SRD-compliant mechanics

  5. Real-time Updates - WebSocket broadcasting for encounters


Contributing

This project follows TDD:

  1. Write failing tests

  2. Implement minimal code to pass

  3. Refactor

PRs must:

  • Include tests

  • Pass TypeScript strict mode

  • Follow existing patterns


License

Proprietary - Personal, non-commercial use permitted. See LICENSE.


Credits

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Mnehmos/ChatRPG'

If you have feedback or need assistance with the MCP directory API, please join our Discord server