drag-race-mcp
This server currently implements a single welcome_user tool—a smoke test that takes a name (1–20 characters) and returns a greeting. It plans to offer structured Drag Race knowledge via typed data models (Queen, Season, Episode, Lore) with unique IDs. Data coverage currently includes US seasons 1–7 and All Stars 1–2 (with plans for international franchises). Future tools will include listing IDs, searching queens, getting details, comparing queens, searching lore, and recommending seasons. The knowledge base uses Zod validation and is open to community contributions.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@drag-race-mcpCompare Jinkx Monsoon and Bianca Del Rio."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Drag Race MCP 👑
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.
Use as an MCP client
This package is a stdio MCP server. Your client spawns it as a child process and talks JSON-RPC over stdin/stdout — do not start the server yourself.
Launch command (pick one):
How | Command / args |
Published package |
|
Local clone (built) |
|
Local clone (dev) |
|
Hosts like Cursor can wire the same command in MCP config (see Test locally with Cursor). Below are minimal programmatic clients.
TypeScript
npm install @modelcontextprotocol/clientimport { Client } from "@modelcontextprotocol/client";
import { StdioClientTransport } from "@modelcontextprotocol/client/stdio";
const client = new Client({ name: "drag-race-client", version: "1.0.0" });
const transport = new StdioClientTransport({
command: "npx",
args: ["-y", "@tkalejandro/drag-race-mcp"],
// Local clone instead:
// command: "node",
// args: ["dist/index.js"],
// cwd: "/path/to/drag-race-mcp",
});
await client.connect(transport);
const { tools } = await client.listTools();
console.log(tools.map((t) => t.name));
const result = await client.callTool({
name: "search_queens",
arguments: { query: "jinkx", limit: 5 },
});
for (const block of result.content) {
if (block.type === "text") console.log(block.text);
}
await client.close();Python
pip install mcp
# or: uv add mcpimport asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main() -> None:
server = StdioServerParameters(
command="npx",
args=["-y", "@tkalejandro/drag-race-mcp"],
# Local clone instead:
# command="node",
# args=["dist/index.js"],
# cwd="/path/to/drag-race-mcp",
)
async with stdio_client(server) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
print([t.name for t in tools.tools])
result = await session.call_tool(
"search_queens",
arguments={"query": "jinkx", "limit": 5},
)
for block in result.content:
if block.type == "text":
print(block.text)
asyncio.run(main())Tool names and arguments match the table in MCP tools (e.g. get_queen, get_season, get_queen_earnings).
Related MCP server: Pokemon MCP Server
Features
Ready
Typed knowledge model (seasons, queens, episodes, lore) including queen
originJSON knowledge base + Zod validation + integrity checks
MCP read tools: discovery, rankings, stats, alumni hosts/judges, track records
Cursor-friendly local MCP config + workflow docs
Coming next
Broader franchise coverage; optional RAG later
recommend_seasonis skipped until ratings data exists (would be made-up)
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 |
|
| Franchise season metadata, cast IDs, winner, prize, hosts/judges |
|
| Drag name, aliases, |
|
| Week-by-week challenges, runway, lip sync, eliminations |
|
| Prize record: |
|
| Host/judge |
|
| Closed catalogs + string ID aliases |
|
| ISO countries used in origin + derived regions ( |
Queen origin is nationality/heritage from sources — not an ethnicity field. originRegion=latin_america excludes Spain (ES). Show geography (franchise=FR) is not queen origin. Regions are derived in the service from origin.countries; they are not stored on each JSON file.
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 |
|
| Closed enum of known seasons |
|
|
|
|
| Kebab-case slug (open set; validated from data later) |
|
| 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.
Challenge prizes (Money coverage)
Episodes ✅ means episode records exist — not that every mini/maxi prize is filled. Weekly prizes live on optional earnings (Money) on challenges and lip syncs; queen challengeWins / miniChallengeWins / lipSyncWins mirror those amounts. Season grand prizes use cashPrice (required on every season).
Source-first: omit
earningswhen public sources don’t list a prize (many UK RuPeter weeks have no cash bullet).Career totals: use MCP tool
get_queen_earnings(personal cash vs charity vs non-cashcontextprizes).
Roughly 70 / 82 season packs have at least some weekly earnings today.
No weekly earnings yet (12) — good contribution targets if Fandom or episode sources list prizes Wikipedia omitted:
AS-S01, CVTW-S01, CVTW-S02, ES-S05, UK-S02, UK-S03, UK-S04, UK-S05, UK-S07, UKVTW-S01, UKVTW-S02, UKVTW-S03
Thin / incomplete (patterns):
Early US minis often advantage-only (
US-S01–S08: maxis mostly filled; minis sparse)UK / UKVTW / CVTW generally sparse (badges or undocumented weekly cash)
Some All Stars tip/maxi holes remain (e.g.
AS-S04tips;AS-S07/AS-S09maxis)Several intl packs strong on maxi or mini but not both (e.g. FR minis empty; BR / MX / TH partial)
Do not add a Prize column to the franchise tables below — track prize depth here instead.
US — RuPaul's Drag Race
SeasonId | Season | Queens | Episodes | Lore |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
AS — All Stars
SeasonId | Season | Queens | Episodes | Lore |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
UK
SeasonId | Season | Queens | Episodes | Lore |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
Canada
SeasonId | Season | Queens | Episodes | Lore |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
Europe
SeasonId | Season | Queens | Episodes | Lore |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| — | — | — | — |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| — | — | — | — |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
Latin America
SeasonId | Season | Queens | Episodes | Lore |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| — | — | — | — |
| — | — | — | — |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
Asia–Pacific & global
SeasonId | Season | Queens | Episodes | Lore |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| — | — | — | — |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| ✅ | ✅ | ✅ | ✅ |
| — | — | — | — |
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/ # Data layer: catalogs, Zod, load, integrity
│ │ ├── catalogs.ts
│ │ ├── origin.ts # Country + OriginRegion catalogs
│ │ ├── schemas/
│ │ ├── load.ts
│ │ ├── integrity.ts
│ │ └── index.ts
│ ├── services/ # Utilities tools call (not MCP)
│ │ ├── accessors/ # accessors.ts → get* / list*Ids
│ │ ├── seasons/ # list_season_ids, list_catalogs, list_winners
│ │ ├── queens/ # search, earnings, ranks, stats, roles, track record
│ │ ├── episodes/ # search_episodes.ts
│ │ ├── lore/ # search_lore.ts
│ │ └── shared/ # limits.ts
│ └── tools/ # MCP registerTool wrappers only
│ ├── general/ # welcome_user.ts
│ ├── seasons/ # list_catalogs, list_season_ids, get_season, list_winners
│ ├── queens/ # search, get, ranks, stats, lists, track record
│ ├── episodes/ # get_episode, search_episodes
│ └── lore/ # get_lore.ts, search_lore.ts
│
├── .cursor/
│ ├── mcp.json # Local Cursor MCP config ADD WHEN YOU NEED IT.
│ └── skills/
│ ├── drag-race-data/ # How to contribute season/queen JSON
│ ├── mcp-tools/ # Tool layout, TDQS descriptions, annotations
│ └── typescript-style/ # Arrow-const functions + TS conventions
│
├── package.json
├── glama.json
├── tsconfig.json
└── README.mdJSON 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 testThat 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 installYou 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-mcpConfirm 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 clearIf tools don’t show up: check MCP error logs, path in
mcp.json, and thatpnpm exec tsx src/index.tsruns cleanly in a terminalPrefer a new chat after MCP restarts so the tool catalog is fresh
MCP tools
Call list_catalogs when mapping names like "france" or "latinas" to codes. France the show is franchise=FR. Latin American origin is originRegion=latin_america (not Spain). Rankings run inside the server — do not loop get_queen_earnings.
Tool | Description |
| Connectivity smoke test only — not for facts |
| Franchise / region / origin-region / currency codes + aliases |
| Loaded seasons; optional |
| Season record + linked IDs |
| Crowned winner ids + |
| Cast queen ids for one |
| Name/alias and/or |
| Full queen record (includes |
| One queen's prize breakdown |
| In-process cash ranking per currency (no FX) |
| Rank by challenge/mini/lip-sync wins or appearances |
| One queen: appearances, W-L, placements, cash by currency |
| Side-by-side stats for 2–4 queen ids |
| Queens with more than one contestant appearance |
| First-outs from |
| Alumni panel + guest judges ( |
| Alumni hosts ( |
| Weekly outcomes for one queen on one season |
| Episode detail |
| Substring on title, runway, challenge names |
| Lore entry by id |
| Search lore by query, tags, queen, and/or season |
Skipped: recommend_season — no ratings data.
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
Origin on every queen + origin-region filters (
latin_america≠ Spain)Rankings / compare / stats aggregations
Alumni host/judge lists; porkchops; track records
Broader franchise coverage in data
Recommendations only if ratings data exists
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
Fill missing challenge / lip-sync
earnings(and mirror queen win rows) for seasons listed under Challenge prizes (Money coverage); follow.cursor/skills/drag-race-data/SKILL.mdMoney rulesMark the matching cell
✅in this README when a slice is doneNew 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 |
| New feature or data/types that unlock new agent behavior |
| Bug fix |
| Documentation only |
| Maintenance (deps, config, formatting) |
| Code change with no behavior change |
Examples:
feat: add Season and SeasonId typesfeat: add US-S06 season + cast datafix: correct porkchopIds 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.
Maintenance
Tools
Related MCP Servers
- FlicenseBqualityDmaintenanceAn MCP server that provides detailed Pokémon information by integrating with the PokeAPI, allowing users to fetch comprehensive data about Pokémon and simulate battles.22
- FlicenseNot gradedqualityDmaintenanceAn MCP server that provides standardized access to Pokemon data, allowing users to search, compare, and retrieve detailed information about Pokemon through natural language tools.5
- AlicenseNot gradedqualityDmaintenanceMCP server providing tools to look up Pokémon, moves, abilities, items, locations, evolutions, and more from the PokéAPI via natural language.1663ISC
- AlicenseBqualityDmaintenanceAn MCP server that brings Star Trek knowledge from Memory Alpha into your AI sessions. Search articles, look up episodes, compare starships, and more.311MIT
Related MCP Connectors
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
This MCP server provides seamless access to Malaysia's government open data, including datasets, w…
An MCP server for deep research or task groups
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/tkalejandro/drag-race-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server