Skip to main content
Glama

Embers: Tabletop RPG Toolkit

Record a class-less character's existing classes

vault_record_pc_classes

The class-less on-ramp to the level-up flow. A hand-made character with no Class entries on its sheet can't level up (vault rejects the plan and the apply) — this tool records the class(es) and level(s) the character is ALREADY playing so the wizard can take over at the next level. It stamps identity snapshots ONLY: no features, proficiencies, HP, or trackables are granted — the sheet is trusted to already carry everything. Call vault_get_levelup_options first: RECORD mode (needsClassRecord: true) ships recordOptions[] (base classes with subclasses[] and subclassLevel) and totalLevel, the character's XP-derived level. The recorded levels must sum to EXACTLY that totalLevel (XP is the authority; vault never rewrites it) and a row may carry a subclass only at/above the option's subclassLevel. Rejected once any class entry exists. On success vault sets each class snapshot's stored level, attaches subclasses, updates core.class, appends a note, and returns { character, summary } — then call vault_get_levelup_options again for the normal chooser.

Input Schema

NameRequiredDescriptionDefault
classesYesOne row per class the character already has, distinct classes only. The levels MUST sum to exactly the RECORD-mode chooser's `totalLevel` (the character's XP-derived level) — vault rejects any other split and never rewrites XP.
characterIdYes`_id` of the class-less character (owned by the calling user, or any character for an admin with Admin Mode on).

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / characterId / description
      Previous value: -"`_id` of the class-less character (must belong to the calling user)."New value: +"`_id` of the class-less character (owned by the calling user, or any character for an admin with Admin Mode on)."
  2. Changed5 schema fields changed
    • addedInput schema / $schema
      Added value: +"http://json-schema.org/draft-07/schema#"
    • addedInput schema / additionalProperties
      Added value: +{}
    • addedInput schema / properties / characterId
      Added value: +{
      +  "description": "`_id` of the class-less character (must belong to the calling user).",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / classes
      Added value: +{
      +  "description": "One row per class the character already has, distinct classes only. The levels MUST sum to exactly the RECORD-mode chooser's `totalLevel` (the character's XP-derived level) — vault rejects any other split and never rewrites XP.",
      +  "items": {
      +    "additionalProperties": {},
      +    "properties": {
      +      "classRuleId": {
      +        "description": "A base Class rule `_id` from the RECORD-mode chooser's `recordOptions[]._id`.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "level": {
      +        "description": "The level the character already has in this class.",
      +        "maximum": 20,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "subclassRuleId": {
      +        "description": "Optional: the subclass already picked, from the option's `subclasses[]._id`. Valid only when this row's level has reached the option's `subclassLevel` (a class picks its subclass at that level; null = no gate).",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "classRuleId",
      +      "level"
      +    ],
      +    "type": "object"
      +  },
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / required
      Added value: +[
      +  "characterId",
      +  "classes"
      +]
  3. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: states exactly what is and is not mutated (identity snapshots only — no features, proficiencies, HP, or trackables), the rejection condition, the post-write side effects (sets stored levels, attaches subclasses, updates core.class, appends a note), and the response shape. This is unusually rich disclosure for a non-destructive write.

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?

Dense but front-loaded: the purpose and the gag rule come first, then the sequencing, then the write semantics and follow-up call. Some sentences are long and pack multiple constraints, but none are filler and all information is actionable.

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?

An output schema exists so return values needn't be spelled out, yet the description still names { character, summary } and the required follow-up call. Between the description, the 100%-covered schema, and the preconditions, an agent has everything needed to call this correctly.

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 baseline is 3, but the description adds real meaning: levels must sum to exactly the XP-derived totalLevel, a row may carry a subclass only at/above the option's subclassLevel, and rows must be distinct classes sourced from recordOptions. Slightly redundant with the schema's own class-field descriptions, which caps it at 4.

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 (record), resource (classes/levels), and the precise situation it exists for: the 'class-less on-ramp to the level-up flow.' It is clearly distinguishable from vault_level_up_pc and vault_get_levelup_options, both of which it references by name.

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

Usage Guidelines5/5

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

Explicit sequencing: call vault_get_levelup_options first, read RECORD mode/recordOptions/totalLevel, then call this tool, then call vault_get_levelup_options again for the normal chooser. It also names the exclusion condition (rejected once any class entry exists) and the prerequisite state (character with no Class entries).

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