A fully structured D&D 5e campaign played via GitHub Copilot Chat. Copilot acts as the Dungeon Master, using MCP servers for D&D rules lookup and persistent memory across sessions.
Character: Drak'Thar — Half-Orc Paladin (Oath of Vengeance), Level 3
World: Asverra — a dark fantasy homebrew setting
Primary Quest: Hunt down and destroy Garek Shatterbone before his ritual opens a portal to the plane of Acheron. 47-day countdown.
- Open a new GitHub Copilot Chat window in VS Code (not inline chat — use the Chat panel)
- Make sure the MCP servers are active (check
.vscode/mcp.json) - Copy the contents of
prompts/start-session.mdand paste it into chat - The DM (Copilot) will read the memory files, recap the last session, and drop you into the world
- Play by describing Drak'Thar's actions in plain English
- Actions: Just describe what you want to do. The DM will tell you what to roll and what the DC is.
- Dice: Use
node scripts/dice-roller.js 1d20+6for logged rolls, or say "roll for me" and Copilot will narrate - Rules questions: Ask the DM in-character or type
[DM mode: question]to step outside the narrative - Combat: paste
prompts/combat.mdto set up a fight properly - Resting: paste the relevant section from
prompts/rest.md
When you're done, paste the contents of prompts/end-session.md. Copilot will:
- Update all memory files
- Write a session log
- Confirm what changed in the world
Then use the automated session manager:
node scripts/end-session.jsThis will validate the character sheet, check memory updates, commit with proper format, and optionally push.
Or manually: git add -A && git commit -m "Session [N]: [brief description]" && git push
This campaign includes automation tools for validation and workflow management.
node scripts/end-session.jsAutomated workflow that:
- ✅ Validates character sheet
- ✅ Checks memory file updates
- ✅ Creates/verifies session log
- ✅ Commits with proper format
- ✅ Optionally pushes to remote
node scripts/validate-character.jsValidates Drak'Thar's character sheet against D&D 5e rules:
- Level/proficiency bonus match
- XP correct for level
- HP within range
- Spell slots match Paladin progression
# Basic roll
node scripts/dice-roller.js 2d6+4
# With advantage
node scripts/dice-roller.js 1d20 --advantage
# With context logging
node scripts/dice-roller.js 8d6 --context "Fireball damage"Features:
- Cryptographically secure RNG
- Advantage/disadvantage support
- Auto-logs all rolls to
rolls.jsonl - Natural 20/1 detection
GitHub Actions automatically validates on every commit:
- Character sheet rules
- Session numbering
- Memory files exist
- MCP server builds
See scripts/README.md for full documentation.
dnd/
├── .github/
│ └── copilot-instructions.md # DM persona, memory protocol, rules system
├── .vscode/
│ └── mcp.json # MCP server configuration
├── characters/
│ └── party/
│ └── drakthar.md # Full character sheet — update after every session
├── campaign/
│ ├── world/
│ │ ├── lore.md # World history, pantheon, The Sundering
│ │ ├── geography.md # Regions, cities, dungeon locations
│ │ └── factions.md # The four major factions and their goals
│ └── npcs/
│ ├── allies.md # Potential allies with motivations and secrets
│ └── antagonists.md # Garek Shatterbone and his lieutenants
├── sessions/
│ ├── session-000-prologue.md # Opening scene — start here for Session 1
│ └── [session logs added here]
├── memory/
│ ├── recent-events.md # Rolling log of last ~3 sessions (DM reads at session start)
│ ├── world-state.md # Current faction status, NPC locations, active threats
│ └── lessons-learned.md # Drak'Thar's injuries, oaths, relationships, DM continuity notes
├── rules/
│ ├── srd-reference.md # Key 5e rules cheat sheet
│ ├── paladin-oath-of-vengeance.md # Full subclass reference for Drak'Thar
│ └── house-rules.md # Deviations from RAW
├── prompts/
│ ├── start-session.md # Paste this to begin a session
│ ├── end-session.md # Paste this to close a session and save memory
│ ├── combat.md # Paste this when entering combat
│ ├── rest.md # Short/long rest procedures
│ └── level-up.md # Level 4 and Level 5 instructions
├── mcp-servers/
│ └── dnd-mcp/ # heffrey78/dnd-mcp — 40+ D&D tools via Open5e API
└── README.md
Three MCP servers are configured at .vscode/mcp.json:
| Server | Purpose |
|---|---|
| dnd-5e | 40+ tools: spell lookup, monster stat blocks, encounter builder, character tools. Uses Open5e API (no key required). |
| memory | Knowledge graph for persistent NPC, location, and event memory across sessions. Uses @modelcontextprotocol/server-memory. |
| filesystem | Read/write access to all campaign files. Uses @modelcontextprotocol/server-filesystem. |
The dnd-mcp server is pre-built at mcp-servers/dnd-mcp/dist/index.js. If you need to rebuild: cd mcp-servers/dnd-mcp && npm install && npm run build
| Current Level | 3 |
| Current XP | 900 / 2,700 (Level 4) |
| Days Until Ritual | 47 |
| Last Session | Prologue (not yet played) |
| Primary Threat | Garek Shatterbone — Fort Ashgrasp |
Asverra is a continent still recovering from the Sundering — a cataclysm 200 years ago when the Valdrian Empire tried to bind the god Acheron as a power source. Acheron destroyed himself to break free, cracking the sky (the Scar), vaporizing the capital (the Maw), and shattering divine contact for generations.
Drak'Thar's clan, the Skullmoor, were massacred three years ago by the Iron Claw Marauders, led by the half-fiend warlord Garek Shatterbone. Drak'Thar survived. He swore a divine Oath of Vengeance. He's been moving through the Ashfields hunting Claw soldiers ever since.
Now he's found out Garek is 47 days from opening a permanent portal to the plane of Acheron — an infinite army from a dimension of endless war.
The math is simple. Stop the ritual. Kill Garek. Finish the oath.
None of it is simple.
After each session:
git add -A
git commit -m "Session [N]: [one-line description of what happened]"
git pushThe session log created by prompts/end-session.md and all memory file updates will be included.