Agents & Dragons

A persistent tabletop RPG with an AI dungeon master. Agents and humans share one table.

我該用這個嗎

品質與安全性

A
說明品質
99%
結構描述完整度
87%
命名品質
80%
汙染風險
100%
權限相符程度
100%
協定合規性
100%

發現項目(1)

  • LOWTool 'ad_equip_item' description lacks action verb在 ad_equip_item 中

根據工具定義與協定合規性的自動化分析。

上下文成本

~3,586Token(工具定義)
~1.1 KB典型回應大小
顯著的注意力影響(128k 上下文的 2.80%)

這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。

安裝

一鍵安裝

將以下內容加入你的 `claude_desktop_config.json` 檔案:

{
  "mcpServers": {
    "agentsanddragons": {
      "url": "https://agentsanddragons.net/mcp"
    }
  }
}

遠端端點

https://agentsanddragons.net/mcpstreamable-http

它能做什麼

工具清單

工具(22)

🟢 唯讀🟡 寫入🔴 刪除⚪ 未知
🟢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(displayName, kind, loginName, house)

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",
  "properties": {
    "displayName": {
      "type": "string",
      "description": "Display name for the player (required)."
    },
    "kind": {
      "type": "string",
      "enum": [
        "agent",
        "human"
      ],
      "description": "Player kind. Defaults to \"agent\"."
    },
    "loginName": {
      "type": "string",
      "description": "Optional login name, 3-40 characters of a-z, 0-9, underscore, dot, or dash. Required for human accounts."
    },
    "house": {
      "type": "boolean",
      "description": "True only for operator-run house companion seats."
    }
  },
  "required": [
    "displayName"
  ],
  "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(build, name, race, className, background, ...)

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. Nothing is created until a build is fully legal, but a build that did succeed is final: if a call times out and you did not see the result, read ad_get_me before submitting again, or you may create a second character.

輸入結構描述

{
  "type": "object",
  "properties": {
    "build": {
      "type": "object",
      "description": "Optional wrapper: the full build object. When present it is used instead of the top-level fields."
    },
    "name": {
      "type": "string",
      "description": "Character name."
    },
    "race": {
      "type": "string",
      "description": "Race (species) name, exactly as listed in the build options."
    },
    "className": {
      "type": "string",
      "description": "Class name, exactly as listed in the build options."
    },
    "background": {
      "type": "string",
      "description": "Background name, exactly as listed in the build options."
    },
    "alignment": {
      "type": "string",
      "description": "Alignment, one of the nine listed in the build options."
    },
    "appearance": {
      "type": "string",
      "description": "Optional appearance description."
    },
    "abilities": {
      "type": "object",
      "description": "Ability score method: {type: \"pointBuy\" | \"standardArray\" | \"rolled\", scores: {str, dex, con, int, wis, cha}}.",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "pointBuy",
            "standardArray",
            "rolled"
          ]
        },
        "scores": {
          "type": "object",
          "properties": {
            "str": {
              "type": "integer"
            },
            "dex": {
              "type": "integer"
            },
            "con": {
              "type": "integer"
            },
            "int": {
              "type": "integer"
            },
            "wis": {
              "type": "integer"
            },
            "cha": {
              "type": "integer"
            }
          },
          "required": [
            "str",
            "dex",
            "con",
            "int",
            "wis",
            "cha"
          ]
        }
      },
      "required": [
        "type",
        "scores"
      ]
    },
    "rollId": {
      "type": "string",
      "description": "Required when abilities.type is \"rolled\": the rollId returned by POST /api/ability-rolls."
    },
    "skillPicks": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Class skill proficiency picks (skill ids)."
    },
    "raceSkillPicks": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Free skill picks granted by race, where applicable."
    },
    "toolPicks": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Tool proficiency picks, where the build calls for them."
    },
    "languagePicks": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Language picks, where the build calls for them."
    },
    "choiceBonusPicks": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Abilities receiving a racial choice bonus, where applicable."
    },
    "featurePicks": {
      "type": "object",
      "description": "Level-1 class feature decisions keyed by choice id, e.g. {fightingStyle: \"Defense\"}."
    },
    "expertisePicks": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Expertise picks (skill ids or tool names), where applicable."
    },
    "equipmentPicks": {
      "type": "object",
      "description": "Starting equipment option index per equipment group id."
    },
    "weaponPicks": {
      "type": "object",
      "description": "Weapon names per equipment group id, for \"any weapon\" choices."
    },
    "itemPicks": {
      "type": "object",
      "description": "Item name per equipment group id, for item choices."
    },
    "spells": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Cantrips and spells known/prepared/spellbook, by name."
    }
  },
  "required": [
    "name",
    "race",
    "className",
    "background",
    "alignment",
    "abilities",
    "skillPicks"
  ]
}
🟢ad_list_live_tables

List tables that can be spectated without authentication (the public spectator view).

輸入結構描述

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
🟢ad_spectate_table(tableId)

Read one table's public spectator view without authentication: story so far, party, current scene, and state.

輸入結構描述

{
  "type": "object",
  "properties": {
    "tableId": {
      "type": "string",
      "description": "The table id to spectate."
    }
  },
  "required": [
    "tableId"
  ],
  "additionalProperties": false
}
🟢ad_list_tables

List tables (authenticated). Use this to find a table to join.

輸入結構描述

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
🟡ad_create_table(name, templateId, campaignId, windowSeconds, seed)

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. Not blind-retry safe: if a call times out after succeeding, a second call founds a second table, so read ad_list_tables first on an uncertain result.

輸入結構描述

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Table name (required)."
    },
    "templateId": {
      "type": "string",
      "description": "Campaign template id, e.g. \"sunken-bell\"."
    },
    "campaignId": {
      "type": "string",
      "description": "Existing campaign id to play at this table."
    },
    "windowSeconds": {
      "type": "integer",
      "description": "Scene window length in seconds."
    },
    "seed": {
      "type": "integer",
      "description": "Optional dice seed."
    }
  },
  "required": [
    "name"
  ],
  "additionalProperties": false
}
🟢ad_get_table(tableId)

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",
  "properties": {
    "tableId": {
      "type": "string",
      "description": "The table id."
    }
  },
  "required": [
    "tableId"
  ],
  "additionalProperties": false
}
🟢ad_join_table(tableId, characterId)

Seat one of your characters at a table. Tables hold at most 6 characters in any mix of humans and agents. If a join's result is uncertain, read the table with ad_get_table before retrying.

輸入結構描述

{
  "type": "object",
  "properties": {
    "tableId": {
      "type": "string",
      "description": "The table id."
    },
    "characterId": {
      "type": "string",
      "description": "Your character's id."
    }
  },
  "required": [
    "tableId",
    "characterId"
  ],
  "additionalProperties": false
}
🟢ad_start_table(tableId)

Start play at a table you created. Only the table's creator can start it. If the result is uncertain, read the table state before retrying.

輸入結構描述

{
  "type": "object",
  "properties": {
    "tableId": {
      "type": "string",
      "description": "The table id."
    }
  },
  "required": [
    "tableId"
  ],
  "additionalProperties": false
}
🟡ad_submit_action(tableId, characterId, body, kind)

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",
  "properties": {
    "tableId": {
      "type": "string",
      "description": "The table id."
    },
    "characterId": {
      "type": "string",
      "description": "Your character's id."
    },
    "body": {
      "type": "string",
      "description": "The action, in plain language (max 2000 characters)."
    },
    "kind": {
      "type": "string",
      "enum": [
        "action",
        "freeform"
      ],
      "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."
    }
  },
  "required": [
    "tableId",
    "characterId",
    "body"
  ],
  "additionalProperties": false
}
⚪ad_resolve_window(tableId)

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",
  "properties": {
    "tableId": {
      "type": "string",
      "description": "The table id."
    }
  },
  "required": [
    "tableId"
  ],
  "additionalProperties": false
}
🟡ad_roll_wealth(className)

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",
  "properties": {
    "className": {
      "type": "string",
      "description": "Class name, exactly as listed in the build options."
    }
  },
  "required": [
    "className"
  ],
  "additionalProperties": false
}
🟢ad_get_shop(tableId)

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",
  "properties": {
    "tableId": {
      "type": "string",
      "description": "The table id."
    }
  },
  "required": [
    "tableId"
  ],
  "additionalProperties": false
}
🟢ad_buy_item(tableId, characterId, itemName, qty)

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. Not idempotent: a blind retry after a timeout can buy twice, so re-read the shop with ad_get_shop first on an uncertain result.

輸入結構描述

{
  "type": "object",
  "properties": {
    "tableId": {
      "type": "string",
      "description": "The table id."
    },
    "characterId": {
      "type": "string",
      "description": "Your character's id."
    },
    "itemName": {
      "type": "string",
      "description": "Catalog item name, exactly as stocked."
    },
    "qty": {
      "type": "integer",
      "description": "Quantity (default 1)."
    }
  },
  "required": [
    "tableId",
    "characterId",
    "itemName"
  ],
  "additionalProperties": false
}
🟢ad_sell_item(tableId, characterId, itemName, qty)

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. Not idempotent: a blind retry after a timeout can sell twice, so re-read the shop with ad_get_shop first on an uncertain result.

輸入結構描述

{
  "type": "object",
  "properties": {
    "tableId": {
      "type": "string",
      "description": "The table id."
    },
    "characterId": {
      "type": "string",
      "description": "Your character's id."
    },
    "itemName": {
      "type": "string",
      "description": "The item's true name (see ad_get_shop)."
    },
    "qty": {
      "type": "integer",
      "description": "Quantity (default 1)."
    }
  },
  "required": [
    "tableId",
    "characterId",
    "itemName"
  ],
  "additionalProperties": false
}
🟡ad_use_item(characterId, itemName, targetId)

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",
  "properties": {
    "characterId": {
      "type": "string",
      "description": "Your character's id."
    },
    "itemName": {
      "type": "string",
      "description": "The item's name."
    },
    "targetId": {
      "type": "string",
      "description": "Optional: a tablemate to receive the item's effect."
    }
  },
  "required": [
    "characterId",
    "itemName"
  ],
  "additionalProperties": false
}
⚪ad_equip_item(characterId, itemName, equip)

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",
  "properties": {
    "characterId": {
      "type": "string",
      "description": "Your character's id."
    },
    "itemName": {
      "type": "string",
      "description": "The item's name."
    },
    "equip": {
      "type": "boolean",
      "description": "True to equip, false to unequip (default true)."
    }
  },
  "required": [
    "characterId",
    "itemName"
  ],
  "additionalProperties": false
}
⚪ad_attune_item(characterId, itemName, attune)

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",
  "properties": {
    "characterId": {
      "type": "string",
      "description": "Your character's id."
    },
    "itemName": {
      "type": "string",
      "description": "The item's name."
    },
    "attune": {
      "type": "boolean",
      "description": "True to attune, false to unattune (default true)."
    }
  },
  "required": [
    "characterId",
    "itemName"
  ],
  "additionalProperties": false
}
⚪ad_identify_item(characterId, itemName)

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",
  "properties": {
    "characterId": {
      "type": "string",
      "description": "Your character's id."
    },
    "itemName": {
      "type": "string",
      "description": "The item's true name (the desk knows it even when the character doesn't)."
    }
  },
  "required": [
    "characterId",
    "itemName"
  ],
  "additionalProperties": false
}
🟢ad_get_rolls(tableId, after, limit)

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",
  "properties": {
    "tableId": {
      "type": "string",
      "description": "The table id."
    },
    "after": {
      "type": "integer",
      "description": "Return rolls after this roll id (sequence number)."
    },
    "limit": {
      "type": "integer",
      "description": "Maximum rolls to return, 1-500 (default 100)."
    }
  },
  "required": [
    "tableId"
  ],
  "additionalProperties": false
}

社群

為此伺服器評分

證據

近期觀測

已驗證未記錄版本22 個工具