beyond-mcp
beyond-mcp
D&D Beyond MCP 服务器:角色卡、怪物数据块、战役名册、实时游戏日志掷骰流,以及需选择启用的角色卡写入。从 roll20-dm-mcp 按其 issue #171 提取,从而让 DDB 拥有自己的 MCP 接口层——dm-whisper gem 和 Claude Code 通过配置选择它,与可互换的 VTT 原语服务器并列(目前为 roll20-dm-mcp,后续为 forge-mcp/ddb-maps-mcp)。
本服务器对 Roll20 或任何 VTT 一概不知,并且从不打开浏览器。读取始终开启;写入为选择启用(DDB_WRITES=enabled)。
原名为
ddb-mcp;为避免与不相关的公开仓库 ddb-mcp/ddb-mcp 冲突而更名。旧仓库 URL 会重定向。
工具
工具 | 功能 |
| 握手: |
| 按数字 ID 获取角色卡 — 紧凑的 HP/AC/状态快照; |
| 按名称或 ID 获取怪物图鉴条目 — 紧凑的 HP/AC/CR 快照; |
| 账户所在的每个战役,以及其 ID。 |
| 战役的 |
| 订阅战役的游戏日志 WebSocket;将已完成的掷骰捕获到有界缓冲区。默认跳过 Beyond20 桥接的掷骰(补隙模式)。 |
| 基于游标排空已捕获的掷骰(原始消息 + 单行摘要)。消费方直接采用实际的骰子数值 — 绝不重新掷骰。 |
| 停止掷骰泵 / 报告连接健康状态(CONNECTED 与 RETRYING、失败次数、最后错误)。 |
工具名称和默认输出形状与 roll20-dm-mcp 提供的保持一致,因此现有调用方只需指向本服务器即可迁移。掷骰泵在设计上有所不同:它缓冲而不是发布到 Roll20——gem 会排空它,并通过 roll20-dm-mcp 的 post_roll_as_character 桥接掷骰。
写入工具(选择启用——DDB_WRITES=enabled)
读取始终可用;这些变更工具仅在部署设置 DDB_WRITES=enabled 时注册,因此准备阶段和默认安装保持只读。它们是原语——对给定的任意角色 ID 精确实施所要求的变更,不涉及角色卡所有权的任何策略。由于 DDB 的 PC HP 也由 Beyond20 和玩家自身的编辑驱动,写入会与这些操作竞争(最后写入者胜),并旨在作为 DM 的刻意行为。
工具 | 功能 |
| 按绝对数值设置当前和/或临时 HP(限制在 |
| 按名称添加/移除 5e 状态(exhaustion 需要一个等级)。 |
Related MCP server: dndbeyond-mcp
认证
读取使用 D&D Beyond 的 CobaltSession cookie 进行认证(该 cookie 会换取短期 JWT;参见 docs/ddb-browserless-protocol.md)。此 cookie 只被消费,绝不采集:在环境中提供 DDB_COBALT,或将 DDB_DATA_DIR 指向 gem 写入 ddb-cobalt.json 的目录。缺少或过期的 cookie ⇒ 每次读取都会明确失败,并附上重新采集说明。
配置
环境变量 | 含义 |
| CobaltSession cookie 的值(覆盖数据文件)。 |
| 存放 |
|
|
| 设置为 |
| 仅用于 HTTP 入口(默认 39210 / 127.0.0.1 / 自动生成到 |
运行
npm install
npm run build
npm start # stdio MCP server (Claude Code .mcp.json, gem supervised spawn)
npm run serve # HTTP MCP server on /mcp + rolls SSE on /events (bearer-authed)Claude Code 的 .mcp.json:
{
"mcpServers": {
"ddb": { "command": "node", "args": ["E:/personalProjects/beyond-mcp/dist/index.js"] }
}
}开发
npm test # vitest run
npx vitest run src/bridge/ddb-gamelog.test.ts # one file
npm run lint
npm run dev # tsx watch, stdioNode 20+、TypeScript(NodeNext ESM)、vitest — 与 roll20-dm-mcp 相同的约定。
Available Tools
10 toolsddb_get_characterA
Fetch a character sheet from D&D Beyond by numeric ID. Default: a compact HP/AC/conditions snapshot. full:true adds the parsed sheet (ability scores/mods, saves, skills, initiative, speed).
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Include the full parsed stat sheet (default false — compact snapshot only). | |
| ddbCharId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It explains the two output modes (compact vs. full), which is useful, but it does not disclose read-only nature, error behavior, authentication requirements, or side effects. This is a gap, though partially mitigated by the simple read-like nature of the operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences that front-load the primary purpose and then clarify the optional full mode. No filler or redundant phrasing; every word contributes to understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two parameters and no output schema, the description adequately describes what the agent will receive (HP/AC/conditions snapshot, or full sheet). It could mention error handling or prerequisites (e.g., character access), but these are minor gaps given the simplicity and clear parameter explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: the `full` parameter already has a description, and the description adds a bit more detail (listing the parsed fields). The `ddbCharId` parameter lacks schema description but is self-explanatory (numeric ID) and the description reiterates it. The description adds marginal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch') and resource ('character sheet') with a clear scope (by numeric ID). It naturally distinguishes from siblings like ddb_get_monster (monster data) and ddb_list_campaign_characters (list of characters) by focusing on a single character sheet.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when you need a character sheet by ID) and clarifies the full parameter, but it does not explicitly mention alternatives or when not to use this tool in favor of siblings. Guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ddb_get_monsterA
Get monster stats from the D&D Beyond compendium by name or numeric id. Default: a compact HP/AC/CR snapshot. full:true returns the whole statblock (ability scores, speed, traits/actions/reactions, resistances/immunities, art URL).
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Return the full statblock (default false — compact snapshot only). | |
| nameOrId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It explains the two output modes (compact vs full) and lists what the full statblock includes, which is useful. However, it does not disclose what happens on lookup failure (e.g., monster not found), any authentication/rate-limit considerations, or explicitly confirm that this is a read-only operation. The description gives good detail on output but omits error handling and side-effect guarantees.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The purpose and default behavior are front-loaded, and the optional expansion is explained in the second sentence. Every word adds value, and it is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple lookup tool with only two parameters and no output schema, the description is largely complete. It tells the agent exactly what it returns in both modes and how to specify the target. It does not cover error cases or edge behavior, but these are minor for a straightforward get operation. The absence of an output schema increases the need to describe return contents, which the description does well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50% (nameOrId has no schema description). The description compensates by clarifying that nameOrId can be a name or numeric id. It also explains the default behavior of the 'full' parameter and what 'full' returns. This adds meaningful context beyond the schema's minimal info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Get') and resource ('monster stats from the D&D Beyond compendium'), and specifies the lookup mechanism ('by name or numeric id'). It unambiguously distinguishes itself from sibling tools like ddb_get_character or ddb_get_party_snapshot by focusing on monsters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it: whenever you need monster stats. It provides clear context (monster lookup) but does not explicitly name alternatives or state when not to use it. The distinction from siblings is implicit but strong enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ddb_get_party_snapshotA
Precomputed combat snapshot for a whole party in one call, via D&D Beyond's SCDS service. Returns each character's COMPUTED armor class and max/current/temp HP (which the plain character sheet does not carry pre-derived), plus named conditions, death saves, initiative, passives and level. This is the authoritative AC/maxHP source — prefer it over ddb_get_character for live party status. full:true adds resolved attacks (to-hit + damage dice), casting info, abilities, skills, senses, resistances/immunities. Pass characterIds, or a campaignId (defaults to DDB_CAMPAIGN_ID) to snapshot its whole roster.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Include resolved attacks, casting, abilities, skills, senses, resistances (default false — combat vitals only). | |
| campaignId | No | Snapshot every character in this campaign. Defaults to DDB_CAMPAIGN_ID. | |
| characterIds | No | Explicit DDB character ids. Overrides campaignId. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It implies a read-only operation via 'snapshot' and lists return data, but it does not explicitly state that the tool makes no modifications, nor does it disclose any failure modes, rate limits, or authentication needs. It does add context about being the 'authoritative' source, but for a read tool this is a marginal improvement. A 3 is appropriate given the clear but implicit safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tightly packed sentences with zero filler. It front-loads the core purpose, explains the key differentiator, and then details parameter behavior. Every sentence earns its place and avoids redundancy with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only snapshot tool with 3 parameters, no output schema, and no nested objects, the description fully covers the return values, the two call modes, defaults, and the optional full expansion. An agent has everything needed to invoke it correctly without additional inference. No gaps that would cause mis-calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter already described (full, campaignId, characterIds) including defaults and override behavior. The description reiterates these points but does not add meaning beyond what the schema provides; it does weave the params into a usage narrative, but that is overlap, not augmentation. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Precomputed combat snapshot for a whole party in one call' and enumerates the exact computed fields returned (AC, max/current/temp HP, conditions, death saves, etc.). It explicitly differentiates from the sibling ddb_get_character by declaring itself 'the authoritative AC/maxHP source' and directing the agent to prefer it for live party status. This is a specific verb+resource with strong sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use this tool over an alternative: 'prefer it over ddb_get_character for live party status.' It also explains the two invocation modes (characterIds or campaignId with default to DDB_CAMPAIGN_ID) and the effect of the full parameter. No explicit 'when not to use' is given, but the directive plus the mode explanations are sufficient for an agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ddb_list_campaign_charactersA
List all player characters in a DDB campaign. campaignId defaults to the DDB_CAMPAIGN_ID env var.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It adds a useful behavioral detail (campaignId default), but does not explicitly indicate that this is a read-only operation (though 'list' implies it), nor does it disclose error handling, response format, or authentication. This is a minor gap for a simple list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the action. The default behavior is stated succinctly, with no unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description provides the core behavior and the parameter default. It does not mention the return format or error cases, but these are not essential for an agent to successfully invoke the tool. It is minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameter. It mentions the default value of campaignId, adding context, but does not explicitly state what campaignId refers to (though the tool name and context make it obvious). The description partially compensates for the missing schema guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List') and resource ('player characters in a DDB campaign'). It clearly differentiates from siblings like ddb_get_character (single character) and ddb_list_campaigns (campaigns) by specifying 'all' characters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides usage context by noting the campaignId default to the DDB_CAMPAIGN_ID env var, but does not explicitly mention when to use this tool versus alternatives or any exclusion conditions. The use case is implied by 'all player characters' but not contrasted with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ddb_list_campaignsA
List all DnD Beyond campaigns the account is in (as DM or player), with IDs and player counts
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. While the verb 'List' implies a read-only operation, the description does not explicitly state that it is non-destructive, whether authentication is required, or any error/rate-limit behavior. It adds scope (as DM/player) but fails to disclose other relevant traits for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundancy. It immediately states the action and resource, and the qualifying details ('as DM or player', 'with IDs and player counts') are packed efficiently. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless list tool with no output schema, the description provides the essential information: what it lists, the scope, and the returned fields. It does not mention pagination or error handling, but these are less critical for a simple read operation. The description is sufficient for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, the baseline is 4 per the rubric. The description does not need to explain parameter meanings since there are none. Schema coverage is 100% implicitly, and no parameter documentation is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List'), a specific resource ('DnD Beyond campaigns'), and the exact scope ('the account is in (as DM or player)') plus what is returned ('IDs and player counts'). It clearly distinguishes itself from sibling ddb_list_campaign_characters, which lists characters rather than campaigns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (when you need campaign listings), but does not explicitly state alternatives or exclusions. It does not say 'use this before calling ddb_list_campaign_characters' or any other routing guidance. The use case is reasonably obvious but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ddb_pingA
Handshake: returns this server's name, semver version, and capability flags. Call it on connect and assert version meets your expected minimum (semver) before relying on newer tools; read capabilities to see whether writes are enabled and which optional surfaces (rollPump, partySnapshot) exist. Fields are additive-only across versions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does well: it discloses that this is a stateless handshake (no write side effects implied), explains the version-assertion semantics, the meaning of the capabilities flags (writes enabled, optional rollPump/partySnapshot surfaces), and the additive-only field guarantee across versions. It could spell out the exact return shape, but the behavior is substantially transparent for a zero-parameter ping.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each earning its place: the core purpose is front-loaded in the first sentence, usage instructions follow, and the additive-only behavioral guarantee closes. There is zero filler or repetition of schema content, and the most decision-relevant information (what it returns, when to call it) appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description is the sole source of runtime contract information, and it covers the essentials completely: return fields (name, version, capabilities), how to act on them (assert version, gate on capabilities), and version stability guarantees. For a zero-parameter handshake, nothing an agent needs to call it correctly and interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4 — there is nothing to document on the input side. The description correctly spends no space on parameters and instead clarifies the return-value semantics (version, capabilities), which is the appropriate focus. No information deficit exists here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Handshake: returns this server's name, semver version, and capability flags') and the purpose is unmistakable as a connection-status probe. It naturally distinguishes itself from all siblings — none of which perform a version/capability handshake, since the others fetch domain data (monsters, characters, campaigns) or drive the rollPump surface.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Call it on connect' and instructs the agent to assert the version minimum before relying on newer tools, and to read capabilities to determine whether writes are enabled and which optional surfaces exist. It does not name specific sibling alternatives, but for a handshake this is inherent — the guidance clearly establishes it as the gating prerequisite to the other tool surfaces.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ddb_poll_rollsA
Drain dice rolls the pump has captured since a cursor. Returns each roll's seq (the cursor), a one-line summary, and the raw DDB game-log message (mirror its actual dice values when bridging — never re-roll). Pass the previous response's cursor as after; start with 0 (or omit) for everything buffered.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Return only rolls with seq > after. Use the `cursor` from the previous poll. Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and meets it well. It says the tool 'drains' rolls, implying it consumes the buffer (a state-changing behavior), and warns 'never re-roll' to prevent incorrect use of the returned dice values. It also specifies the return structure (seq, summary, raw message), giving the agent a clear expectation of the output without an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact—two sentences—with no filler. The core purpose is front-loaded, followed by the return format, then a usage guidance sentence that also carries the vital 'never re-roll' warning. Every sentence earns its place, and the structure is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter, no output schema, and straightforward behavior, the description is fully complete. It covers the purpose, the return structure, the parameter semantics, and the critical behavioral constraint (never re-roll). There is no missing information an agent would need to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides a thorough description of `after` (return rolls with seq > after, use the previous cursor, default 0) with 100% coverage. The description adds a small but useful nuance by clarifying that omitting `after` returns everything buffered, which reinforces the default behavior. This goes slightly beyond the schema without being redundant, so it merits a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('drain') and resource ('dice rolls the pump has captured'), and clarifies the scope ('since a cursor'). It also states what the tool returns, making the purpose unambiguous. It clearly differentiates from sibling tools like start/stop_ddb_roll_pump and ddb_roll_pump_status, which manage or report pump state rather than drain rolls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit instructions on how to use the tool: pass the previous response's cursor as `after`, start with 0 (or omit) for everything buffered. It also provides a critical usage directive for the bridging scenario: 'mirror its actual dice values when bridging — never re-roll.' This directly tells the agent when and how to use it, leaving no ambiguity about the polling workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ddb_roll_pump_statusA
Report the D&D Beyond roll pump's connection health (CONNECTED vs RETRYING, consecutive failures, last error) and how many rolls it has captured. RETRYING with a climbing failure count means the socket keeps dropping — usually an expired DDB session cookie; re-harvest and restart the pump.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses the tool's behavior: it reports connection status, consecutive failures, last error, and roll count. It also interprets RETRYING state and suggests a remediation step. This is a read-only status tool, and the description implies no side effects. It goes beyond a bare 'status' statement by explaining what the status means and what to do.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the main action and then adds essential diagnostic context. Every clause adds value—status metrics, failure interpretation, and a recommended action—with no fluff. It is concise yet comprehensive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a status-reporting tool with no parameters and no output schema, the description is complete. It tells the agent what data will be reported, what the key status indicator means, and what course of action to take. The sibling tools are distinct in purpose, and this description fully covers the tool's role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema covers 100% of them trivially. According to the rubric, a 0-parameter tool gets a baseline of 4. The description adds no parameter details because there are none, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Report the D&D Beyond roll pump's connection health ... and how many rolls it has captured.' It identifies the specific resource (roll pump) and the metrics reported. This distinguishes it from sibling tools like start/stop/poll, which perform actions rather than report status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides actionable guidance when RETRYING with climbing failure count indicates a dropped socket and suggests 're-harvest and restart the pump.' This implicitly refers to related tools (e.g., start_ddb_roll_pump) but does not explicitly name them or state when NOT to use this tool. It gives clear context but lacks explicit exclusion of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_ddb_roll_pumpA
Capture live D&D Beyond dice rolls from a campaign's game log. Subscribes (browserless) to the DDB game-log WebSocket and buffers each fulfilled roll — drain with ddb_poll_rolls and bridge into your VTT yourself (this server posts nothing anywhere; rolls MUST be mirrored, never re-rolled). By default it SKIPS rolls Beyond20 already bridged to the table (data.b20Override), so what you drain is exactly the gap a flaky Beyond20 left — safe to arm table-wide (omit characterNames) or per-player without double-posting downstream.
| Name | Required | Description | Default |
|---|---|---|---|
| gameId | No | D&D Beyond game/campaign id to read. Defaults to the DDB_CAMPAIGN_ID env var. | |
| characterNames | No | DDB character names to capture, e.g. ["Broo Zbaaner"]. Omit to cover EVERY character. | |
| includeBeyond20 | No | Default false. Leave false to skip rolls Beyond20 already bridged (the gap-fill behavior). Set true ONLY to capture EVERY roll regardless — bridging then double-posts anything Beyond20 also delivers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full burden. It discloses that the tool subscribes to a WebSocket, buffers rolls, posts nothing itself, and mandates mirroring (never re-rolling). It explains the skip behavior for Beyond20 overrides and the consequence of includeBeyond20=true. This is comprehensive behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is rich but every sentence adds value. It front-loads the core purpose, then explains the buffering, the no-posting policy, the default skip behavior, and safe usage patterns. It is well-structured and not wasteful despite length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a subscription-based tool with no output schema, this description explains the full workflow: how to start, what happens to rolls (buffered), how to retrieve them (via ddb_poll_rolls), and the integration implication (must mirror). It also addresses edge cases (Beyond20 override and includeBeyond20). An agent has everything needed to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Though schema coverage is 100%, the description adds substantial meaning beyond the schema: gameId defaults to env var, characterNames omitted covers every character, and includeBeyond20 explains the gap-fill vs. capture-all tradeoff. This clearly explains the intent and caveats of each parameter, exceeding the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool captures live D&D Beyond dice rolls, subscribes to the game-log WebSocket, and buffers rolls. It explicitly names the drain mechanism (ddb_poll_rolls) and distinguishes itself from siblings by noting it does not post anywhere. The verb 'capture' plus resource ('live dice rolls from a campaign game log') is specific and differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use: to capture rolls that Beyond20 may have missed, safe to arm table-wide or per-player. It instructs to drain with ddb_poll_rolls and warns about includeBeyond20 causing double-posting. This gives clear context and implicit exclusions (e.g., don't use if you want to bridge directly, or if you need all rolls without gap-filling behavior).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_ddb_roll_pumpA
Stop the D&D Beyond roll pump (disconnect the game-log WebSocket). Buffered rolls remain drainable until the next start.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the primary effect (disconnect WebSocket) and an important side effect (buffered rolls remain drainable until next start). This gives the agent a good sense of what happens and what persists. It does not mention return values or error handling, but for a 0-parameter stop action, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, with the core action front-loaded ('Stop the D&D Beyond roll pump') followed by a clarifying explanation of the WebSocket disconnect and the buffered-roll behavior. Every sentence adds value, with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no output schema), the description provides sufficient context for correct invocation. It explains the action, the underlying mechanism, and the state that persists after stopping. It could mention that calling it repeatedly is idempotent or what happens if already stopped, but those are minor gaps for a low-complexity tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema fully covers any input. The description doesn't need to explain parameters, and it doesn't. The baseline of 4 for 0-parameter tools is appropriate; the description adds nothing extra but none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Stop') and resource ('D&D Beyond roll pump'), and clarifies the mechanism ('disconnects the game-log WebSocket'). This clearly differentiates it from sibling tools like start_ddb_roll_pump and ddb_roll_pump_status. An agent can immediately understand what the tool does and that it's the inverse of start_ddb_roll_pump.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (when you want to stop the pump) and provides essential context about buffered rolls remaining drainable until the next start, which hints at the start tool as the alternative. However, it does not explicitly state 'use start_ddb_roll_pump to resume' or mention any conditions for when not to use it. The guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.4.1- First observed
ddb_get_character - First observed
ddb_get_monster - First observed
ddb_get_party_snapshot - First observed
ddb_list_campaign_characters - First observed
ddb_list_campaigns - First observed
ddb_ping - First observed
ddb_poll_rolls - First observed
ddb_roll_pump_status - First observed
start_ddb_roll_pump - First observed
stop_ddb_roll_pump
TDQS
Scored across 10 tools
Tools are generally distinct: monster lookup, character lookup, campaign listing, party snapshot, and roll pump management each serve clear purposes. Some overlap exists between ddb_get_character and ddb_get_party_snapshot, but the party snapshot is clearly positioned as the authoritative source for live combat stats, and the descriptions resolve ambiguity.
Most tools follow the ddb_verb_noun pattern (ddb_get_monster, ddb_list_campaigns, ddb_poll_rolls). Minor deviation: start_ddb_roll_pump and stop_ddb_roll_pump put the verb first, breaking the prefix convention. Still, the pattern is predictable overall.
With 10 tools, the server is well-scoped for its purpose: a few core read operations (monster, character, campaigns), a party snapshot, and a roll pump subsystem with start/stop/status/poll. Each tool has a clear role with no redundancy or bloat.
The surface covers the expected read-only operations for a D&D Beyond integration: retrieving monsters, characters, campaigns, and party combat data, plus the roll pump lifecycle. Missing write operations (e.g., updating characters) are not implied by the domain, and the roll pump is fully supported with start, stop, status, and polling.
Maintenance
Related MCP Connectors
D&D 5e MCP — wraps the D&D 5th Edition API (free, no auth)
Connect any AI to your Foundry VTT world: actors, combat, dice, journals, tokens, compendiums.
Manage your tabletop RPG campaign from any MCP client: worlds, sessions, quests, lore, recaps.
Read and update your SekkeiFlow life boards, counters and AI coach from any MCP client.
Related MCP Servers
- FlicenseNot gradedqualityAmaintenanceConnects Claude Desktop to Foundry VTT for AI-powered campaign management, enabling natural language interaction with game data including quest creation, character management, compendium searches, and dice rolling. Provides 20 MCP tools for seamless integration between Claude and your tabletop RPG sessions.73-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage D&D Beyond characters, access campaigns, and look up spells, monsters, items, and more through a reverse-engineered API.MIT
- FlicenseNot gradedqualityDmaintenanceA local MCP server that provides access to D&D Beyond character sheets, SRD content (spells, monsters, items), a dice roller, and optional campaign tools via undocumented endpoints.-
- AlicenseNot gradedqualityCmaintenanceEnables MCP-compatible clients to read D&D Beyond characters, campaigns, and game reference data, with optional opt-in tools for session tracking and character building.MIT