Skip to main content
Glama

Embers: Tabletop RPG Toolkit

Build a monster

vault_build_monster

Create a complete monster character in one call, in a ruleset the monster builder supports (the ruleset field's list; list_rulesets gives each code's label). Replaces the vault_create_character + multiple vault_update_character pattern for monster authoring — fully typed input schema, so structured fields cannot be silently stringified. Caller passes source-text values (final AC, skill bonuses, attack bonuses); vault computes the stored base values, derives proficient / expertise / misc flags, formats spell-list markdown, creates recharge trackables, generates the challenge, legendary-intro, and alternate-form speed notes. Sets type: 'monster', settings.autoPassiveBonuses: false, and the derived core.experience automatically. The authoring guide at vault_get_authoring_guide({ rulesetCode: <the monster's ruleset>, entityType: 'monster' }) documents every field's source-text meaning and is the conventions reference for what shape to send. Returns the created character document.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
acYesAC block. `total` is the value the sheet should display (the source-text number). Vault computes the stored base from it, the `armorWeight` given, and any shield/magic/misc bonuses, per the guide Rule 1.
crYesChallenge Rating as a number, a fraction as its decimal (e.g. 0.125 for CR 1/8); vault answers an error for a value that is not a challenge rating. Vault looks up XP reward + level-equivalent XP + proficiency bonus.
hpYesMaximum hit points.
gearNoGear listed on the stat block, source text. Each becomes an items[] entry with `equipped: false` (monsters don't use equip slots) per Rule 19. Server-side template fill adds the currency items separately.
nameYesDisplay name. Required.
sizeYesSize text, source-exact: a single value or the variable form ('X or Y') per the guide Rule 18. Stored verbatim in `core.size`.
savesNoSaving throw bonuses for the proficient ones only. Vault derives `attributes[].proficient = true` and a `misc` adjustment so the sheet total lands on the source bonus.
speedYesSpeed block, in feet. `walk` is the base walking speed; the other modes become rules[] entries with the listed range. `alternateForm` carries a stat block's parenthetical alternate-form speed text, source-exact, per the guide Rule 5; lands in notes[].
sensesNoThe stat block's senses other than the passive one the sheet derives, each as `name` and `detail` (the source text after the name). Each becomes a rules[] entry. The monster authoring guide covers which senses to author.
skillsNoSkill bonuses for proficient / expertise skills only. Vault derives the proficient + expertise flags + misc so the sheet total matches the source bonus per the guide Rule 6.
traitsNoTrait entries, source text. Use `summary` for a parenthetical usage limit per the guide Rule 14, and `detail` for a short qualifier per Rule 17; senses go under `senses`.
actionsNoAction entries. `type` per the guide Rule 3. For attacks, pass `attackBonus` + `attackAttribute` + `damageDice` + `damageType` + `damageAttribute`; vault back-derives `attack.misc`. The guide Rule 3 gives `attackAttribute` for a spell attack. `recharge` takes the source's recharge text and creates a matching trackables[] checkbox the sheet renders as a cooldown; the guide gives the form.
rulesetNoA ruleset the monster builder supports. The authoring guide and the conversion math are ruleset-specific; other rulesets will land via their own build tools.
abilitiesYesAbility scores as numbers, one per ability score key. Vault computes modifiers, attack/damage/save/skill/initiative derivations.
alignmentYesAlignment text, source-exact.
languagesNoLanguages text, source-exact. Stored in `core.languages`.
immunitiesNoCombined immunities row, source-exact, damage and condition entries as the source writes them. Use this when the source has one combined immunities row.
hitDiceSizeNoHit-die size from the stat block. Omitted, the app chooses the die.
resistancesNoResistances row, source-exact text.
creatureTypeYesCreature type, source text. Preserved verbatim into `core.race` per the guide Rule 16 'preserve original text'.
hitDiceCountYesNumber of hit dice (the count, e.g. 12 for a creature with 12d8 listed in HP).
spellcastingNoInnate spellcasting block per the guide Rule 4: the casting ability, save DC, and the spells grouped by their source frequency text. Vault formats the spell list as markdown per that rule and lands it as a single rules[] entry.
legendaryIntroNoIntro paragraph of the stat block's legendary section (the prose about how those actions work for this creature). Lands in notes[] under the name the guide Rule 8 gives. Individual legendary entries go in `actions[]` with the matching `type`.
additionalNotesNoAny free-form notes[] entries the LLM wants to author beyond the auto-generated challenge, legendary-intro, and alternate-form speed rows. Use sparingly — most stat-block content has a dedicated structured field above.
initiativeBonusNoThe listed initiative bonus. Pass it only if it differs from the bonus the sheet derives; vault keeps the difference in `offense.initiative.misc` per the guide Rule 17.
vulnerabilitiesNoVulnerabilities row.
damageImmunitiesNoSplit form: damage-only immunities, source-exact. Use only if the source has a separate damage immunities row.
damageResistancesNoSplit form: damage-only resistances, source-exact. Use only if the source has a separate damage resistances row.
conditionImmunitiesNoSplit form: condition-only immunities, source-exact. Use only if the source has a separate condition immunities row.
damageVulnerabilitiesNoSplit form: damage-only vulnerabilities, source-exact.
sourceProficiencyBonusNoOverride the PB derived from CR. Use only when the source stat block explicitly lists a PB other than the one its CR gives. A PB larger than the sheet's keeps the difference in misc automatically, per the guide Rule 15.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed30 schema fields changed
    • changedInput schema / properties / abilities / description
      Previous value: -"Six ability scores as numbers. Gateway computes modifiers, attack/damage/save/skill/initiative derivations."New value: +"Ability scores as numbers, one per ability score key. Vault computes modifiers, attack/damage/save/skill/initiative derivations."
    • changedInput schema / properties / ac / description
      Previous value: -"AC block. `total` is the value the sheet should display (source-text value, like '16'). Gateway computes the stored base by subtracting DEX modifier (with medium/heavy armor weight caps) and any shield/magic/misc bonuses. Per the guide Rule 1."New value: +"AC block. `total` is the value the sheet should display (the source-text number). Vault computes the stored base from it, the `armorWeight` given, and any shield/magic/misc bonuses, per the guide Rule 1."
    • changedInput schema / properties / actions / description
      Previous value: -"Action entries. `type` per the guide Rule 3 (Melee / Range / Special / Reaction / Legendary / Bonus). For attacks, pass `attackBonus` + `attackAttribute` + `damageDice` + `damageType` + `damageAttribute`; gateway back-derives `attack.misc`. For ranged spell attacks (Hurl Flame etc.) use the spellcasting attribute, not strength/dexterity. `recharge: '5-6'` (or '6', '4-6') creates a matching trackables[] checkbox the sheet renders as a cooldown."New value: +"Action entries. `type` per the guide Rule 3. For attacks, pass `attackBonus` + `attackAttribute` + `damageDice` + `damageType` + `damageAttribute`; vault back-derives `attack.misc`. The guide Rule 3 gives `attackAttribute` for a spell attack. `recharge` takes the source's recharge text and creates a matching trackables[] checkbox the sheet renders as a cooldown; the guide gives the form."
    • changedInput schema / properties / actions / items / properties / type / enum
      Previous value: -[
      -  "Melee",
      -  "Range",
      -  "Special",
      -  "Reaction",
      -  "Legendary",
      -  "Bonus"
      -]New value: +[
      +  "Melee",
      +  "Range",
      +  "Special",
      +  "Bonus",
      +  "Reaction",
      +  "Legendary",
      +  "Lair"
      +]
    • changedInput schema / properties / additionalNotes / description
      Previous value: -"Any free-form notes[] entries the LLM wants to author beyond the auto-generated Challenge / Legendary Actions / Speed-alternate-form rows. Use sparingly — most stat-block content has a dedicated structured field above."New value: +"Any free-form notes[] entries the LLM wants to author beyond the auto-generated challenge, legendary-intro, and alternate-form speed rows. Use sparingly — most stat-block content has a dedicated structured field above."
    • changedInput schema / properties / alignment / description
      Previous value: -"Alignment text, e.g. 'Unaligned' or 'Neutral Evil'."New value: +"Alignment text, source-exact."
    • changedInput schema / properties / conditionImmunities / description
      Previous value: -"5e split form: condition-only immunities. Use only if the source says 'Condition Immunities' as a separate row."New value: +"Split form: condition-only immunities, source-exact. Use only if the source has a separate condition immunities row."
    • changedInput schema / properties / cr / description
      Previous value: -"Challenge Rating. Must be one of the canonical 5e24 values: 0, 0.125 (CR 1/8), 0.25 (CR 1/4), 0.5 (CR 1/2), or any integer 1-30. Gateway looks up XP reward + level-equivalent XP + proficiency bonus."New value: +"Challenge Rating as a number, a fraction as its decimal (e.g. 0.125 for CR 1/8); vault answers an error for a value that is not a challenge rating. Vault looks up XP reward + level-equivalent XP + proficiency bonus."
    • changedInput schema / properties / creatureType / description
      Previous value: -"Creature type — source text, e.g. 'Elemental', 'Humanoid', 'Dragon (Chromatic)'. Preserved verbatim into `core.race` per the guide Rule 16 'preserve original text'."New value: +"Creature type, source text. Preserved verbatim into `core.race` per the guide Rule 16 'preserve original text'."
    • changedInput schema / properties / damageImmunities / description
      Previous value: -"5e (2014) split form: damage-only immunities. Use only if the source says 'Damage Immunities' as a separate row."New value: +"Split form: damage-only immunities, source-exact. Use only if the source has a separate damage immunities row."
    • changedInput schema / properties / damageResistances / description
      Previous value: -"5e split form: damage-only resistances. Use only if the source says 'Damage Resistances'."New value: +"Split form: damage-only resistances, source-exact. Use only if the source has a separate damage resistances row."
    • changedInput schema / properties / damageVulnerabilities / description
      Previous value: -"5e split form: damage-only vulnerabilities."New value: +"Split form: damage-only vulnerabilities, source-exact."
    • changedInput schema / properties / gear / description
      Previous value: -"Gear listed on the stat block ('Greatsword, Splint Armor'). Each becomes an items[] entry with `equipped: false` (monsters don't use equip slots) per Rule 19. Server-side template fill adds the four currency items separately."New value: +"Gear listed on the stat block, source text. Each becomes an items[] entry with `equipped: false` (monsters don't use equip slots) per Rule 19. Server-side template fill adds the currency items separately."
    • changedInput schema / properties / hitDiceSize / description
      Previous value: -"Hit-die size mapped from creature size per 5e24 MM: Tiny d4, Small d6, Medium d8, Large d10, Huge d12, Gargantuan d20. Defaults to d8 when omitted (Medium creatures, by far the common case)."New value: +"Hit-die size from the stat block. Omitted, the app chooses the die."
    • changedInput schema / properties / hitDiceSize / enum
      Previous value: -[
      -  "d4",
      -  "d6",
      -  "d8",
      -  "d10",
      -  "d12",
      -  "d20"
      -]New value: +[
      +  "d4",
      +  "d6",
      +  "d8",
      +  "d10",
      +  "d12",
      +  "d20",
      +  "d100"
      +]
    • changedInput schema / properties / immunities / description
      Previous value: -"5e24 combined Immunities text (damage + condition, semicolon-separated): 'Fire, Poison; Frightened, Poisoned'. Use this when the source says 'Immunities'."New value: +"Combined immunities row, source-exact, damage and condition entries as the source writes them. Use this when the source has one combined immunities row."
    • changedInput schema / properties / initiativeBonus / description
      Previous value: -"Override the initiative bonus only if the listed value differs from the DEX modifier. Per the guide Rule 17, gateway sets `offense.initiative.misc = listed − DEX-mod`."New value: +"The listed initiative bonus. Pass it only if it differs from the bonus the sheet derives; vault keeps the difference in `offense.initiative.misc` per the guide Rule 17."
    • changedInput schema / properties / languages / description
      Previous value: -"Languages text, source-exact (e.g. '—' or 'Common, Draconic, telepathy 60 ft.'). Stored in `core.languages`."New value: +"Languages text, source-exact. Stored in `core.languages`."
    • changedInput schema / properties / legendaryIntro / description
      Previous value: -"Legendary Actions intro paragraph (the prose about how legendary actions work for this creature). Per the guide Rule 8, lands in notes[] under name 'Legendary Actions'. Individual legendary action entries go in `actions[]` with `type: 'Legendary'`."New value: +"Intro paragraph of the stat block's legendary section (the prose about how those actions work for this creature). Lands in notes[] under the name the guide Rule 8 gives. Individual legendary entries go in `actions[]` with the matching `type`."
    • removedInput schema / properties / ruleset / const
      Removed value: -"5e24"
    • changedInput schema / properties / ruleset / description
      Previous value: -"Only '5e24' is supported. The authoring guide and the conversion math are 5e24-specific; other rulesets will land via their own build tools."New value: +"A ruleset the monster builder supports. The authoring guide and the conversion math are ruleset-specific; other rulesets will land via their own build tools."
    • addedInput schema / properties / ruleset / enum
      Added value: +[
      +  "5e24"
      +]
    • changedInput schema / properties / saves / description
      Previous value: -"Saving throw bonuses for the proficient ones only. Gateway derives `attributes[].proficient = true` and a `misc` adjustment so the sheet's `ability + PB + misc` lands on the source bonus."New value: +"Saving throw bonuses for the proficient ones only. Vault derives `attributes[].proficient = true` and a `misc` adjustment so the sheet total lands on the source bonus."
    • changedInput schema / properties / senses / description
      Previous value: -"Senses other than passive perception: darkvision, blindsight, tremorsense, truesight. Each becomes a rules[] Ability entry with `name` ('Darkvision') and `detail` ('120 ft.'). Passive Perception is NOT authored — sheet derives it from the Perception skill."New value: +"The stat block's senses other than the passive one the sheet derives, each as `name` and `detail` (the source text after the name). Each becomes a rules[] entry. The monster authoring guide covers which senses to author."
    • changedInput schema / properties / size / description
      Previous value: -"Size text — single value ('Medium') or variable form ('Medium or Small') per the guide Rule 18. Stored verbatim in `core.size`."New value: +"Size text, source-exact: a single value or the variable form ('X or Y') per the guide Rule 18. Stored verbatim in `core.size`."
    • changedInput schema / properties / skills / description
      Previous value: -"Skill bonuses for proficient / expertise skills only. Gateway derives the proficient + expertise flags + misc so the sheet total matches the source bonus per the guide Rule 6."New value: +"Skill bonuses for proficient / expertise skills only. Vault derives the proficient + expertise flags + misc so the sheet total matches the source bonus per the guide Rule 6."
    • changedInput schema / properties / sourceProficiencyBonus / description
      Previous value: -"Override the PB derived from CR. Use only when the source stat block explicitly lists a non-standard PB (e.g. a CR-low legendary creature with PB +5). For PB +7 and above the high-PB misc compensation per the guide Rule 15 kicks in automatically."New value: +"Override the PB derived from CR. Use only when the source stat block explicitly lists a PB other than the one its CR gives. A PB larger than the sheet's keeps the difference in misc automatically, per the guide Rule 15."
    • changedInput schema / properties / speed / description
      Previous value: -"Speed block. `walk` is the base walking speed in feet. Non-walking modes (climb / fly / swim / burrow) become rules[] Ability entries with the listed range. `alternateForm` carries the parenthetical text from lycanthrope-style stat blocks ('40 ft. in boar form') per the guide Rule 5; lands in notes[]."New value: +"Speed block, in feet. `walk` is the base walking speed; the other modes become rules[] entries with the listed range. `alternateForm` carries a stat block's parenthetical alternate-form speed text, source-exact, per the guide Rule 5; lands in notes[]."
    • changedInput schema / properties / spellcasting / description
      Previous value: -"Innate spellcasting block per the guide Rule 4. Gateway formats the spell list as markdown with two-space hard breaks between frequency rows and italic spell names: `**At will:** *detect evil and good*  \\n**1/day each:** *commune*, *raise dead*`. Lands as a single rules[] Ability entry named 'Innate Spellcasting'."New value: +"Innate spellcasting block per the guide Rule 4: the casting ability, save DC, and the spells grouped by their source frequency text. Vault formats the spell list as markdown per that rule and lands it as a single rules[] entry."
    • changedInput schema / properties / traits / description
      Previous value: -"Trait entries (Web-Dweller, Molten Body, Pack Tactics, etc.). Use `summary` for parenthetical usage limits per Rule 14 (e.g. 'Legendary Resistance' name + '3/Day, or 4/Day in Lair' summary + body description). Use `detail` for the kind of short qualifier on entries like Darkvision (but darkvision itself goes under `senses`)."New value: +"Trait entries, source text. Use `summary` for a parenthetical usage limit per the guide Rule 14, and `detail` for a short qualifier per Rule 17; senses go under `senses`."
  2. First observed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses that the vault back-derives base values and proficiency/expertise/misc flags, formats spell-list markdown, creates recharge trackables, generates challenge/legendary-intro/alternate-form notes, and auto-sets type, settings.autoPassiveBonuses and core.experience. It also states the input convention (caller passes source-text finals, vault computes stored bases), which is the key behavioral contract.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the replaced pattern, then the conversion behavior, then the guide pointer. Some clauses are long and dense, but each carries information an agent needs before calling; no filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 31-parameter, deeply nested, non-idempotent creation tool with an output schema, the description supplies the workflow, the replacement guidance, the derivation contract, the side effects, and a pointer to the authoritative field guide. Nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all 31 parameters (baseline 3). The description adds a cross-cutting semantic layer the schema cannot: the source-text-in / derived-value-out convention for AC, skills and attack bonuses, plus the pointer to the authoring guide as the per-field meaning reference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a complete monster character in one call') and immediately distinguishes itself from the vault_create_character + vault_update_character sibling pattern. An agent can tell it is the monster-authoring entry point without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the pattern it replaces (create_character + multiple update_character calls) and routes the agent to list_rulesets for ruleset codes and vault_get_authoring_guide for field conventions. It stops short of an explicit 'do not use for PCs, use vault_build_pc instead' exclusion, which the dense sibling set would have benefited from.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources