Drag Race
FreeNot checkedAn MCP server for Drag Race knowledge, enabling search of queens, seasons, episodes, winners, and comparisons. It provides structured information through commun
About
An MCP server for Drag Race knowledge, enabling search of queens, seasons, episodes, winners, and comparisons. It provides structured information through community-maintained data.
README
An unofficial, community-driven MCP (Model Context Protocol) server for Drag Race knowledge.
drag-race-mcp gives AI assistants structured access to queens, seasons, episodes, and fan lore through MCP tools.
Disclaimer
This is an unofficial fan project and is not affiliated with, endorsed by, or sponsored by RuPaul, World of Wonder, or the Drag Race franchise.
Features
Ready / in progress
- Typed knowledge model (seasons, queens, episodes, lore)
- MCP server skeleton + example tool (
welcome_user) - Cursor-friendly local MCP config
Coming next
- JSON knowledge base + Zod validation
- Tools: search queens, get season/episode, compare queens, search lore
- Stats, recommendations, optional RAG later
Example questions
- Who are the Porkchop queens?
- Which queens competed on both Season 5 and All Stars?
- Compare Jinkx Monsoon and Bianca Del Rio.
- Which queens have the most challenge wins?
- Recommend a season with lots of comedy.
- Explain the rivalry between Alyssa Edwards and Coco Montrese.
Data model (for agents & contributors)
IDs and catalogs live in src/kb/catalogs.ts; entity shapes are Zod schemas in src/kb/schemas/ (types via z.infer). Designed so models can navigate facts without burning tokens on repeated prose.
Hard facts
| Type | Where | What it stores |
|---|---|---|
Season |
kb/schemas/season.ts |
Franchise season metadata, cast IDs, winner, prize, hosts/judges |
Queen |
kb/schemas/queen.ts |
Drag name, aliases, per-season appearances & wins |
Episode |
kb/schemas/episode.ts |
Week-by-week challenges, runway, lip sync, eliminations |
Money |
kb/schemas/money.ts |
Amount + currency enum |
PersonRef |
kb/schemas/person.ts |
Host/judge { name, queenId? } |
SeasonId / Currency / LoreTag |
kb/catalogs.ts |
Closed catalogs + string ID aliases |
These are the source of truth for placements, wins, cast lists, and episode outcomes.
IDs keep tokens small
Everywhere possible we link by stable IDs, not full nested objects:
| ID | Example | Notes |
|---|---|---|
SeasonId |
US-S17, AS-S10, CVTW-S02 |
Closed enum of known seasons |
EpisodeId |
US-S17-E05 |
{SeasonId}-E{NN} |
QueenId |
jinkx-monsoon |
Kebab-case slug (open set; validated from data later) |
LoreId |
alyssa-coco-rivalry |
Kebab-case slug |
Why IDs?
- Smaller payloads in tool responses (pass
castIds, expand only when needed) - Safer LLM contributions (reference
US-S06instead of rewriting season text) - Easy joins: season → queen IDs → look up queen; queen win →
episodeId→ look up episode
A season stores castIds and episodeIds. A queen stores appearance stats that point at episodeIds. Tools (and later list_queen_ids) help the model discover valid IDs instead of inventing them.
Lore expands the model’s power
Hard facts answer what happened. Lore answers why it matters and how things connect:
Lore {
id, title, summary, tags,
queenIds?, seasonIds?, episodeIds?
}
Add lore entries to teach rivalries, iconic moments, comedy seasons, drag families, controversies, and more — tagged (rivalry, drama, comedy, iconic, …) and linked back to the fact catalogs via IDs.
Contribution loop for LLMs / humans:
- Prefer existing IDs when linking
- Add or fix hard-fact records when something is missing or wrong
- Add lore when you want narrative, correlation, or fan context
That’s how the KB grows without duplicating full queen/season blobs everywhere.
Data coverage
Track what data exists for each SeasonId. Flip — → ✅ when that slice is in the knowledge base.
| Column | Meaning |
|---|---|
| Season | Season record (meta, cast IDs, winner, prize, hosts/judges) |
| Queens | Queen records for the cast (appearances, wins) |
| Episodes | Episode records for the season |
| Lore | At least one lore entry linked to this season |
Everything starts empty — this is the contribution map. Pick any — and fill it.
US — RuPaul's Drag Race
| SeasonId | Season | Queens | Episodes | Lore |
|---|---|---|---|---|
US-S01 |
✅ | ✅ | ✅ | ✅ |
US-S02 |
✅ | ✅ | ✅ | ✅ |
US-S03 |
✅ | ✅ | ✅ | ✅ |
US-S04 |
✅ | ✅ | ✅ | ✅ |
US-S05 |
✅ | ✅ | ✅ | ✅ |
US-S06 |
✅ | ✅ | ✅ | ✅ |
US-S07 |
✅ | ✅ | ✅ | ✅ |
US-S08 |
— | — | — | — |
US-S09 |
— | — | — | — |
US-S10 |
— | — | — | — |
US-S11 |
— | — | — | — |
US-S12 |
— | — | — | — |
US-S13 |
— | — | — | — |
US-S14 |
— | — | — | — |
US-S15 |
— | — | — | — |
US-S16 |
— | — | — | — |
US-S17 |
— | — | — | — |
US-S18 |
— | — | — | — |
AS — All Stars
| SeasonId | Season | Queens | Episodes | Lore |
|---|---|---|---|---|
AS-S01 |
✅ | ✅ | ✅ | ✅ |
AS-S02 |
✅ | ✅ | ✅ | ✅ |
AS-S03 |
— | — | — | — |
AS-S04 |
— | — | — | — |
AS-S05 |
— | — | — | — |
AS-S06 |
— | — | — | — |
AS-S07 |
— | — | — | — |
AS-S08 |
— | — | — | — |
AS-S09 |
— | — | — | — |
AS-S10 |
— | — | — | — |
AS-S11 |
— | — | — | — |
UK
| SeasonId | Season | Queens | Episodes | Lore |
|---|---|---|---|---|
UK-S01 |
— | — | — | — |
UK-S02 |
— | — | — | — |
UK-S03 |
— | — | — | — |
UK-S04 |
— | — | — | — |
UK-S05 |
— | — | — | — |
UK-S06 |
— | — | — | — |
Canada
| SeasonId | Season | Queens | Episodes | Lore |
|---|---|---|---|---|
CA-S01 |
— | — | — | — |
CA-S02 |
— | — | — | — |
CA-S03 |
— | — | — | — |
CA-S04 |
— | — | — | — |
CA-S05 |
— | — | — | — |
CA-S06 |
— | — | — | — |
CVTW-S01 |
— | — | — | — |
CVTW-S02 |
— | — | — | — |
CAS-S01 |
— | — | — | — |
Europe
| SeasonId | Season | Queens | Episodes | Lore |
|---|---|---|---|---|
ES-S01 |
— | — | — | — |
ES-S02 |
— | — | — | — |
ES-S03 |
— | — | — | — |
ES-S04 |
— | — | — | — |
ES-S05 |
— | — | — | — |
ESAS-S01 |
— | — | — | — |
ESAS-S02 |
— | — | — | — |
FR-S01 |
— | — | — | — |
FR-S02 |
— | — | — | — |
FR-S03 |
— | — | — | — |
FR-S04 |
— | — | — | — |
IT-S01 |
— | — | — | — |
IT-S02 |
— | — | — | — |
IT-S03 |
— | — | — | — |
DE-S01 |
— | — | — | — |
NL-S01 |
— | — | — | — |
NL-S02 |
— | — | — | — |
BE-S01 |
— | — | — | — |
BE-S02 |
— | — | — | — |
SE-S01 |
— | — | — | — |
Latin America
| SeasonId | Season | Queens | Episodes | Lore |
|---|---|---|---|---|
MX-S01 |
— | — | — | — |
MX-S02 |
— | — | — | — |
MX-S03 |
— | — | — | — |
MXLR-S01 |
— | — | — | — |
BR-S01 |
— | — | — | — |
BR-S02 |
— | — | — | — |
Asia–Pacific & global
| SeasonId | Season | Queens | Episodes | Lore |
|---|---|---|---|---|
TH-S01 |
— | — | — | — |
TH-S02 |
— | — | — | — |
TH-S03 |
— | — | — | — |
PH-S01 |
— | — | — | — |
PH-S02 |
— | — | — | — |
PH-S03 |
— | — | — | — |
PH-S04 |
— | — | — | — |
PHSR-S01 |
— | — | — | — |
GAS-S01 |
— | — | — | — |
DUVTW-S01 |
— | — | — | — |
Project structure
├── src/
│ ├── index.ts # MCP entry (stdio)
│ ├── server.ts # Server + tool registration
│ ├── data/ # JSON only (no TypeScript)
│ │ ├── queens/ # One JSON file per QueenId
│ │ └── seasons/
│ │ └── US-S01/ … US-S07/, AS-S01/, AS-S02/
│ │ ├── season.json
│ │ ├── episodes.json
│ │ └── lore.json
│ ├── kb/ # Typed knowledge layer
│ │ ├── catalogs.ts # SeasonId, Currency, LoreTag, …
│ │ ├── schemas/ # Zod per entity + z.infer types
│ │ ├── load.ts # Read data/ → validated Maps
│ │ ├── accessors.ts # getQueen / getSeason / …
│ │ └── index.ts # Public re-exports
│ └── tools/
│ └── general/
│ ├── welcome_user.ts
│ └── index.ts
│
├── .cursor/
│ ├── mcp.json # Local Cursor MCP config ADD WHEN YOU NEED IT.
│ └── skills/
│ ├── drag-race-data/ # How to contribute season/queen JSON
│ └── typescript-style/ # Arrow-const functions + TS conventions
│
├── package.json
├── tsconfig.json
└── README.md
JSON facts live under src/data/ (queens global; seasons as src/data/seasons/<SeasonId>/). The src/kb/ layer validates and indexes them via Zod + Maps. See .cursor/skills/drag-race-data/ when contributing with an agent.
Validating data
After adding or editing anything under src/data/, run:
pnpm test
That loads every JSON file through Zod, rejects bad fields and duplicate IDs, and fails with file + field paths. git commit runs the same check via a Husky pre-commit hook — still run the test yourself while editing so you catch issues before commit. After a fresh clone, run pnpm install once so Husky installs the hook.
Test locally with Cursor
This is how an Agent chat (like this one) can see and call tools from drag-race-mcp.
1. Install & run prerequisites
pnpm install
You do not need to keep a terminal process running yourself. Cursor starts the MCP server using .cursor/mcp.json.
2. Project MCP config
This repo already includes .cursor/mcp.json:
{
"mcpServers": {
"drag-race-mcp": {
"command": "pnpm",
"args": [
"--dir",
"/ABS/PATH/TO/drag-race-mcp",
"exec",
"tsx",
"src/index.ts"
]
}
}
}
Update the --dir path to your machine’s clone path if it differs.
Cursor loads project MCP config from .cursor/mcp.json when the workspace is open. You can also add the same server under Cursor Settings → MCP (user-level) if you prefer.
3. Enable / refresh the server
- Open Cursor Settings → MCP
- Find
drag-race-mcp - Confirm it connects (no error state). Use refresh/restart if you changed code or config
- Open a new Agent chat in this workspace so it picks up the tool list
4. Smoke-test a tool
Ask the agent something like:
Call the
welcome_usertool with my name.
If MCP is wired correctly, the agent will invoke welcome_user and return a welcome string from this server.
That’s the same path used in development: Cursor discovers the server’s tools over MCP, then the model can call them (list tools → choose one → run with args → read the result).
5. After you add tools
- Register the tool on the server (see
src/tools/general/welcome_user.ts) - Restart/refresh the MCP server in Cursor
- Start a new Agent chat
- Ask the agent to use the new tool by name or describe the task and let it pick the tool
Tips
- Tool
descriptionand Zod.describe(...)text are what the model reads — keep them clear - If tools don’t show up: check MCP error logs, path in
mcp.json, and thatpnpm exec tsx src/index.tsruns cleanly in a terminal - Prefer a new chat after MCP restarts so the tool catalog is fresh
Planned MCP tools
| Tool | Description |
|---|---|
welcome_user |
Smoke-test / hello (exists) |
list_season_ids / list_queen_ids |
Discover valid IDs |
search_queens |
Search queens by name or alias |
get_queen |
Full queen record |
get_season |
Season record + linked IDs |
get_episode |
Episode detail |
compare_queens |
Compare two or more queens |
search_lore |
Search lore by tag, queen, or season |
recommend_season |
Recommend seasons from preferences |
Roadmap
v1
- Stable TypeScript interfaces (IDs + hard facts + lore)
- JSON data + Zod schemas
- Core read tools (queen / season / episode / lore)
- Local Cursor workflow documented
v2
- Richer search & stats
- Recommendations
- Broader franchise coverage in data
v3
- Semantic search (RAG)
- Community ratings / richer metadata
Contributing
Contributions welcome — especially filling gaps in Data coverage:
- Fix incorrect hard facts
- Add missing queens / seasons / episodes (use ID conventions)
- Add lore that links existing IDs
- Mark the matching cell
✅in this README when a slice is done - New MCP tools & docs
Pull requests & commits
Do not push straight to main (branch protection). Work on a branch and open a PR.
Branch names
feat/...— new capability (types, tools, data for a season)fix/...— bug fixdocs/...— README / comments onlychore/...— tooling, deps, cleanup
Commit / PR titles (Conventional Commits style)
| Prefix | Use for |
|---|---|
feat: |
New feature or data/types that unlock new agent behavior |
fix: |
Bug fix |
docs: |
Documentation only |
chore: |
Maintenance (deps, config, formatting) |
refactor: |
Code change with no behavior change |
Examples:
feat: add Season and SeasonId typesfeat: add US-S06 season + cast datafix: correct porkchopId for US-S01docs: update data coverage checklist
PR body — short summary of why, plus a tiny test plan (e.g. tsc, which coverage cells flipped, MCP tool smoke test).
Open an issue or PR.
License
MIT
Acknowledgements
Built by the community, for the community. Drag Race fans, MCP builders, and AI enthusiasts — you’re welcome here.
Disclaimer: Drag Race MCP is an unofficial fan project. It is not affiliated with, endorsed by, or sponsored by RuPaul, World of Wonder, or the Drag Race franchise.
Installing Drag Race
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/tkalejandro/drag-race-mcpFAQ
Is Drag Race MCP free?
Yes, Drag Race MCP is free — one-click install via Unyly at no cost.
Does Drag Race need an API key?
No, Drag Race runs without API keys or environment variables.
Is Drag Race hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Drag Race in Claude Desktop, Claude Code or Cursor?
Open Drag Race on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectCompare Drag Race with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
