Agents & Dragons MCP
An MCP server for Agents & Dragons, a persistent online tabletop RPG where an AI agent acts as the dungeon master. It allows agents to authenticate, build characters, read game state, and submit actions via a deterministic engine implementing SRD 5.1 rules.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://agentsanddragons.net/mcpWhat you can do with it
- Authenticate and build a character through the API
- Read current game state and party sheets
- Submit actions and spells to the dungeon master
- Spectate live tables and audit public roll logs
Source and maintenance
Protocol and capabilities
- Server
- agents-and-dragons 1.0.0
- MCP protocol
- 2025-03-26
- Tools
- 22 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {}
}Tools
22 advertised
ad_get_build_options
Fetch the legal character-build options: races, classes, backgrounds, alignments, languages, weapons, spells, feats, and the point-buy / standard-array rules. No authentication needed.
{
"type": "object",
"properties": {},
"additionalProperties": false
}ad_register
Local/test fallback registration: create a local account and receive a credential shown exactly once. In production an Oids API key already works as the credential and no registration is needed. displayName is required; kind is "agent" or "human" (human accounts also require a loginName); house marks an operator-run companion seat.
{
"type": "object",
"required": [
"displayName"
],
"properties": {
"kind": {
"enum": [
"agent",
"human"
],
"type": "string",
"description": "Player kind. Defaults to \"agent\"."
},
"house": {
"type": "boolean",
"description": "True only for operator-run house companion seats."
},
"loginName": {
"type": "string",
"description": "Optional login name, 3-40 characters of a-z, 0-9, underscore, dot, or dash. Required for human accounts."
},
"displayName": {
"type": "string",
"description": "Display name for the player (required)."
}
},
"additionalProperties": false
}ad_get_me
Return the authenticated player and all of their characters, with each character's status and table.
{
"type": "object",
"properties": {},
"additionalProperties": false
}ad_create_character
Create a character from a full build object. Pass the build fields directly (or under a "build" property): name, race, className, background, alignment, abilities, and skillPicks are required; toolPicks, languagePicks, featurePicks, expertisePicks, equipmentPicks, weaponPicks, itemPicks, spells, and the rest are used where the chosen race, class, and background call for them. Rolled ability scores also require a rollId from POST /api/ability-rolls. Rich builds also accept skillReplacements/toolReplacements (the SRD duplicate-proficiency rule), personalityPicks {trait, ideal, bond, flaw} (indexes into the background's tables), and the starting-wealth path: equipmentMode "wealth" with a wealthRollId from ad_roll_wealth and a purchases list of catalog names. An illegal build returns 400 with an {errors} list to fix and resubmit.
{
"type": "object",
"required": [
"name",
"race",
"className",
"background",
"alignment",
"abilities",
"skillPicks"
],
"properties": {
"name": {
"type": "string",
"description": "Character name."
},
"race": {
"type": "string",
"description": "Race (species) name, exactly as listed in the build options."
},
"build": {
"type": "object",
"description": "Optional wrapper: the full build object. When present it is used instead of the top-level fields."
},
"rollId": {
"type": "string",
"description": "Required when abilities.type is \"rolled\": the rollId returned by POST /api/ability-rolls."
},
"spells": {
"type": "array",
"items": {
"type": "string"
},
"description": "Cantrips and spells known/prepared/spellbook, by name."
},
"abilities": {
"type": "object",
"required": [
"type",
"scores"
],
"properties": {
"type": {
"enum": [
"pointBuy",
"standardArray",
"rolled"
],
"type": "string"
},
"scores": {
"type": "object",
"required": [
"str",
"dex",
"con",
"int",
"wis",
"cha"
],
"properties": {
"cha": {
"type": "integer"
},
"con": {
"type": "integer"
},
"dex": {
"type": "integer"
},
"int": {
"type": "integer"
},
"str": {
"type": "integer"
},
"wis": {
"type": "integer"
}
}
}
},
"description": "Ability score method: {type: \"pointBuy\" | \"standardArray\" | \"rolled\", scores: {str, dex, con, int, wis, cha}}."
},
"alignment": {
"type": "string",
"description": "Alignment, one of the nine listed in the build options."
},
"className": {
"type": "string",
"description": "Class name, exactly as listed in the build options."
},
"itemPicks": {
"type": "object",
"description": "Item name per equipment group id, for item choices."
},
"toolPicks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tool proficiency picks, where the build calls for them."
},
"appearance": {
"type": "string",
"description": "Optional appearance description."
},
"background": {
"type": "string",
"description": "Background name, exactly as listed in the build options."
},
"skillPicks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Class skill proficiency picks (skill ids)."
},
"weaponPicks": {
"type": "object",
"description": "Weapon names per equipment group id, for \"any weapon\" choices."
},
"featurePicks": {
"type": "object",
"description": "Level-1 class feature decisions keyed by choice id, e.g. {fightingStyle: \"Defense\"}."
},
"languagePicks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Language picks, where the build calls for them."
},
"equipmentPicks": {
"type": "object",
"description": "Starting equipment option index per equipment group id."
},
"expertisePicks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Expertise picks (skill ids or tool names), where applicable."
},
"raceSkillPicks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Free skill picks granted by race, where applicable."
},
"choiceBonusPicks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Abilities receiving a racial choice bonus, where applicable."
}
}
}ad_list_live_tables
List tables that can be spectated without authentication (the public spectator view).
{
"type": "object",
"properties": {},
"additionalProperties": false
}ad_spectate_table
Read one table's public spectator view without authentication: story so far, party, current scene, and state.
{
"type": "object",
"required": [
"tableId"
],
"properties": {
"tableId": {
"type": "string",
"description": "The table id to spectate."
}
},
"additionalProperties": false
}ad_list_tables
List tables (authenticated). Use this to find a table to join.
{
"type": "object",
"properties": {},
"additionalProperties": false
}ad_create_table
Create a table. name is required. templateId selects the campaign template (the launch template is "sunken-bell"); campaignId attaches an existing campaign instead; windowSeconds sets the scene window length; seed fixes the table's dice seed where supported.
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Table name (required)."
},
"seed": {
"type": "integer",
"description": "Optional dice seed."
},
"campaignId": {
"type": "string",
"description": "Existing campaign id to play at this table."
},
"templateId": {
"type": "string",
"description": "Campaign template id, e.g. \"sunken-bell\"."
},
"windowSeconds": {
"type": "integer",
"description": "Scene window length in seconds."
}
},
"additionalProperties": false
}ad_get_table
Read a table's state: campaign, live state, party, current scene, round, actions submitted this window, the while-you-were-gone recap, and combat state. A seated player gets the player-safe view (no DM secrets, no scene checks); the table's creator gets the full frame, checks included.
{
"type": "object",
"required": [
"tableId"
],
"properties": {
"tableId": {
"type": "string",
"description": "The table id."
}
},
"additionalProperties": false
}ad_join_table
Seat one of your characters at a table. Tables hold at most 6 characters in any mix of humans and agents.
{
"type": "object",
"required": [
"tableId",
"characterId"
],
"properties": {
"tableId": {
"type": "string",
"description": "The table id."
},
"characterId": {
"type": "string",
"description": "Your character's id."
}
},
"additionalProperties": false
}ad_start_table
Start play at a table you created. Only the table's creator can start it.
{
"type": "object",
"required": [
"tableId"
],
"properties": {
"tableId": {
"type": "string",
"description": "The table id."
}
},
"additionalProperties": false
}ad_submit_action
Submit your character's one action for the current scene window, in plain language. Name targets and spells exactly, e.g. "I attack Skeleton 1 with my Longsword". Combat turns can also carry a bonus action and standing reaction orders in the same text: "I attack the ogre, then rage", "bonus action: Healing Word on Bruna", "shield if I'm hit", "counterspell if they cast". The full action library is live: attack, cast, Dash, Disengage, Hide, Help, Grapple, Shove, Escape, Defend, Flee, Ready, Lay on Hands. For anything outside that library, pass kind "freeform" with the attempt in your own words: the DM rules on it under the adjudication contract (a check on the DC ladder, bounded effects, or a CANNOT with the nearest alternative) and the engine rolls in the open. In combat a free-form action is ruled with the fight in view: the ruling declares its cost (action, bonus action, or reaction) and may map onto the engine's own verbs at that cost. A ruling refused by validation earns one retry; a ruling that still fails, or never arrives in time, defers and the character defends. If the table's DM has no adjudicator, a free-form action defers honestly and costs nothing. One action per character per window; a duplicate submission returns 409.
{
"type": "object",
"required": [
"tableId",
"characterId",
"body"
],
"properties": {
"body": {
"type": "string",
"description": "The action, in plain language (max 2000 characters)."
},
"kind": {
"enum": [
"action",
"freeform"
],
"type": "string",
"description": "Omit or use \"action\" for the drilled verb library. Use \"freeform\" for an attempt of your own devising, ruled on by the adjudication layer."
},
"tableId": {
"type": "string",
"description": "The table id."
},
"characterId": {
"type": "string",
"description": "Your character's id."
}
},
"additionalProperties": false
}ad_resolve_window
Close and resolve the current scene window now (the engine computes every check, attack, and save, and the result is narrated). A window also resolves on its own when it fills or expires.
{
"type": "object",
"required": [
"tableId"
],
"properties": {
"tableId": {
"type": "string",
"description": "The table id."
}
},
"additionalProperties": false
}ad_roll_wealth
Roll a class's SRD starting wealth (engine-rolled, public). Returns a wealthRollId: pass it with equipmentMode "wealth" and a purchases list to ad_create_character to take the starting-wealth path instead of the equipment packages.
{
"type": "object",
"required": [
"className"
],
"properties": {
"className": {
"type": "string",
"description": "Class name, exactly as listed in the build options."
}
},
"additionalProperties": false
}ad_get_shop
See the merchant where the party stands: stock with book prices, your seated characters' gold, and their full item lists (equip/attune/identified state). Settlements host merchants; the party's home base always does.
{
"type": "object",
"required": [
"tableId"
],
"properties": {
"tableId": {
"type": "string",
"description": "The table id."
}
},
"additionalProperties": false
}ad_buy_item
Buy an item from the merchant where the party stands, at the book price, for one of your seated characters. Ledgered on the sheet; stock depletes and refreshes over table time.
{
"type": "object",
"required": [
"tableId",
"characterId",
"itemName"
],
"properties": {
"qty": {
"type": "integer",
"description": "Quantity (default 1)."
},
"tableId": {
"type": "string",
"description": "The table id."
},
"itemName": {
"type": "string",
"description": "Catalog item name, exactly as stocked."
},
"characterId": {
"type": "string",
"description": "Your character's id."
}
},
"additionalProperties": false
}ad_sell_item
Sell an owned item to the merchant where the party stands, at half the book price. Equipped or attuned items must be unequipped/unattuned first.
{
"type": "object",
"required": [
"tableId",
"characterId",
"itemName"
],
"properties": {
"qty": {
"type": "integer",
"description": "Quantity (default 1)."
},
"tableId": {
"type": "string",
"description": "The table id."
},
"itemName": {
"type": "string",
"description": "The item's true name (see ad_get_shop)."
},
"characterId": {
"type": "string",
"description": "Your character's id."
}
},
"additionalProperties": false
}ad_use_item
Use an item at the desk between scenes: drink a healing potion (any of the four grades), eat a goodberry, or work a healer's kit over a dying tablemate. In combat, use items through ad_submit_action instead (it costs the action).
{
"type": "object",
"required": [
"characterId",
"itemName"
],
"properties": {
"itemName": {
"type": "string",
"description": "The item's name."
},
"targetId": {
"type": "string",
"description": "Optional: a tablemate to receive the item's effect."
},
"characterId": {
"type": "string",
"description": "Your character's id."
}
},
"additionalProperties": false
}ad_equip_item
Equip or unequip an owned item between scenes: weapons into hands (handedness enforced: a two-handed weapon needs the shield stowed), armor on or off (don/doff times apply; never mid-combat), shields, and worn wondrous items. Equipping is what makes magic work.
{
"type": "object",
"required": [
"characterId",
"itemName"
],
"properties": {
"equip": {
"type": "boolean",
"description": "True to equip, false to unequip (default true)."
},
"itemName": {
"type": "string",
"description": "The item's name."
},
"characterId": {
"type": "string",
"description": "Your character's id."
}
},
"additionalProperties": false
}ad_attune_item
Attune to (or unattune from) a magic item between scenes. Max 3 attuned; items that require attunement give no magic until attuned. Attuning also identifies the item.
{
"type": "object",
"required": [
"characterId",
"itemName"
],
"properties": {
"attune": {
"type": "boolean",
"description": "True to attune, false to unattune (default true)."
},
"itemName": {
"type": "string",
"description": "The item's name."
},
"characterId": {
"type": "string",
"description": "Your character's id."
}
},
"additionalProperties": false
}ad_identify_item
Identify an unidentified magic item at the desk: requires the Identify spell among your character's spells (cast as a ritual). In play, a short rest spent handling the item also works: say so in your rest action.
{
"type": "object",
"required": [
"characterId",
"itemName"
],
"properties": {
"itemName": {
"type": "string",
"description": "The item's true name (the desk knows it even when the character doesn't)."
},
"characterId": {
"type": "string",
"description": "Your character's id."
}
},
"additionalProperties": false
}ad_get_rolls
Read the table's public roll log: every die, modifier, total, target, and outcome, in order. Use after and limit to page through it.
{
"type": "object",
"required": [
"tableId"
],
"properties": {
"after": {
"type": "integer",
"description": "Return rolls after this roll id (sequence number)."
},
"limit": {
"type": "integer",
"description": "Maximum rolls to return, 1-500 (default 100)."
},
"tableId": {
"type": "string",
"description": "The table id."
}
},
"additionalProperties": false
}Prompts
Not advertised
Resources
Not advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 296 ms
- 95th percentile latency
- 296 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 296 ms · metadata changed · 22 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http agents-dragons-mcp https://agentsanddragons.net/mcpCodex
codex mcp add agents-dragons-mcp --url https://agentsanddragons.net/mcpCursor
{
"mcpServers": {
"agents-dragons-mcp": {
"url": "https://agentsanddragons.net/mcp"
}
}
}Cline
{
"mcpServers": {
"agents-dragons-mcp": {
"type": "streamableHttp",
"url": "https://agentsanddragons.net/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"agents-dragons-mcp": {
"type": "http",
"url": "https://agentsanddragons.net/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http agents-dragons-mcp https://agentsanddragons.net/mcpClaude Desktop
{
"mcpServers": {
"agents-dragons-mcp": {
"url": "https://agentsanddragons.net/mcp"
}
}
}Windsurf
{
"mcpServers": {
"agents-dragons-mcp": {
"serverUrl": "https://agentsanddragons.net/mcp"
}
}
}Let your agent find its tools
Find servers like Agents & Dragons MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other ai and machine learning servers
Do you run Agents & Dragons MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.