holonovel
Holonovel turns rulebooks into a playable, rule-enforced holodeck-style tabletop server.
Ingest & build rulesets — convert PDFs/HTML to Markdown, build declarative ruleset packages, install/remove/search/bind them, and add supplementary Wisdom.
Run a persistent world — create rooms, things, exits, and containment; navigate and take objects with a real spatial parser (execute, resolve, suggest, visibility, audibility).
Track objective cause and effect — propose, admit, reject, and inspect causal transitions, including external event ingress.
Stage scenes and casts — set scene description, directives, choices, oracle rolls, presence, autonomy sliders, and multi-NPC speaker order.
Play characters and NPCs — create/import/stage PCs and NPCs, edit sheets and voices, manage GM-only NPC minds, and track durable identity facets.
Run combat and mechanics — initialize/advance encounters, apply conditions, and resolve Fate, Ironsworn, Forged, and generic ruleset rolls.
Model narrative state — lore and secrets, factions, relationships, vows with milestones, countdown clocks, beliefs/perceptions, and a knowledge corpus with access control.
Record the story — typed story journal, scratch notes, session recaps, save/restore context, and turn handles.
Configure the game — badge roles (Player, GM, Observer, Editor) enforced server-side, autonomy/confirmation/safety/creativity settings, player signals, and narrative directives.
Deepen play via synthesis — run/revert synthesis, activate guidance, author player items, verify citations, and keep a GM ruling ledger.
Manage campaigns — create/resume/switch/end Novels, export/import, clone/branch, archive, and checkpoint/roll back.
Reuse content — a cross-Novel codex library for NPCs, scenes, encounters, lore, templates, and adventures.
Stay auditable — health diagnostics, event log, verify/replay, visibility checks, undo/redo history, and audit compaction.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@holonovelHelp me run my D&D campaign as an interactive story"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Holonovel
The Holodeck for your rulebooks — rules enforced, worlds remembered.
Start with the project wiki — it routes players, Game Masters, and builders by task.
A holonovel is a Star Trek holodeck program — an interactive story where you step inside as a character and the rules govern. Holonovel builds the server (the Holodeck). Your campaign is the program (the Novel). Your rulebooks become the engine — D&D 5e, Starfinder, or the game on your shelf. Your books. Your server. Your Holodeck.
Table of contents
Run a server — operators
How it works — evaluators
How it compares — evaluators
License — reference
Related MCP server: rpg-mcp
Run a server
Install
A fresh install is playable without a rulebook. On first start the server creates
Torre Nosferatu, a tutorial Novel, and opens it; set TTRPG_STARTER_NOVEL=off
to start with an empty world instead.
The base server runs the Holodeck. Rooms, objects, exits, and containment form a real state graph, while scenes, NPCs, lore, and a story journal layer on top, so narration is grounded in stored facts rather than prior chat turns. Requires Node.js 22+.
npx -y holonovelAdd to your MCP client:
"holonovel": {
"type": "local",
"command": ["npx", "-y", "holonovel"],
"enabled": true
}From a source checkout, run cd holonovel && npm install && npm run start, then
point the client at npx tsx src/index.ts in that directory.
Campaign data defaults to the operating system's user-data directory:
~/.local/share/holonovel on Linux, ~/Library/Application Support/holonovel
on macOS, or %LOCALAPPDATA%\holonovel on Windows. Set TTRPG_DATA_DIR to
override it. An existing .holonovel-state/ beside the server is preserved.
Setup details and first-run checks: Getting Started guide.
Install a ruleset
A ruleset package is a declarative bundle produced by the Build workflow. Copy it into the server's ruleset install directory and the server registers it. That directory is inside the state directory — by default the per-user data location described above.
Packages load lazily: a ruleset's tools and index are read only when you open a campaign bound to it, so unused packages cost nothing at startup. Install, remove, and list packages from the server's own tools, or move files and restart.
Campaign data and installed packages stay in the state directory, outside the server tree, so updating Holonovel leaves both intact. The Building a Server guide covers packaging a rulebook.
How it works
Holonovel is one pipeline — Convert, Build, Holodeck, Novel, Synthesis — that turns a rulebook into a running table.
Convert
Convert takes PDFs, HTML, and web scrapes and turns them into clean Markdown. Multi-column pages are read in the right order, and tables split across page breaks are reassembled. Scanned pages fall back to OCR. The output is structurally sound — headings resolve and references trace.
"Convert the files in
ruleset/dnd5e/to Markdown for the D&D 5e ruleset." "Convert the HTML export inruleset/starfinder/for the Starfinder ruleset."
Clean, indexed Markdown ready for the build.
Build
Build reads that Markdown and extracts the mechanics. Dice procedures, combat systems, spell catalogues, equipment tables, condition tracks — modeled elements become tools, resources, or prompts in a declarative ruleset package, while anything that can't be modeled stays searchable. Guidance prose becomes narrative material. The discovery engine reads the source in chunks, measures extraction confidence, and works until the mechanical sections are accounted for. Nothing is fabricated to fill a gap.
"Build the Markdown in
ruleset/dnd5e/into a holonovel." "Packageruleset/starfinder/as a second ruleset alongside D&D 5e."
One spec reads any rulebook, and the build produces zero hand-written code.
Holodeck
The Holodeck is the narrative world model — the core engine that drives the simulation. It turns a saved Novel into a running game. Every part of a campaign is structured state: rooms, objects, exits, and containment in the spatial model; scenes, NPCs, lore, factions, secrets, vows, countdowns, relationships, decisions, and the story journal in the narrative model; mechanics and ruleset voice alongside them. None is decoration. Each has a defined effect on the others.
That effect is what makes it an engine. A scene sets the place and cast and activates lore whose triggers match its text. An NPC carries identity, disposition, relationships, and a location, so moving them changes who is present and who can speak. A secret stays hidden until knowledge and trigger conditions allow it to surface. A vow creates a decision the Game Master must honor. A countdown advances on schedule and fires its result into the world. A mechanical outcome — damage, a destroyed object, a doused light — mutates the state it touches. The story journal records the consequence, and later scenes can recall it.
The server evaluates these couplings. The AI narrates the result. Nothing is left to a "remember this" instruction, and nothing drifts between turns.
Parser commands act on the spatial model with real containment logic. Go north. Take the lantern. The room, the object, and the inventory are stored records, not claims in narration. Exits connect in both directions, containers hold what they hold, and doors stay locked until something unlocks them. The spatial conventions are drawn from Inform, the interactive-fiction language behind decades of text-adventure classics.
"Go north into the flooded ossuary." "Set the scene here — the ossuary reeks of stale incense and old water." "Have Sister Mora follow me into the ossuary." "Ask Sister Mora what she knows about the buried order." "Advance the reliquary countdown by one day."
The Holodeck is the live simulation; the Novel is its save file.
Novel
A Novel is the save file for a Holodeck game, and it stores the configuration that shapes that game. Server settings supply defaults; each Novel overrides them where the setting is campaign-scoped, and every change is saved with the campaign.
Who plays is configurable. A badge sets your seat at the table and what that seat can see: Player is in the story as a character, Game Master sees and controls the world, Observer watches while the AI runs both roles, and Editor steps outside the story to manage the save. The server enforces the boundary, so GM-only secrets do not leak to the Player badge. Each Novel carries its own active badge, and four autonomy sliders decide how much the AI handles alongside it: level (auto-play, prompt on mechanical actions, or manual), confirmation (execute, confirm, or prompt), safety (safe, moderate, or hardcore), and creativity (predictable, standard, or chaotic). The sliders compose with any badge, so a human can hand off one character, all NPCs, or the whole table without changing seats. The Game Mastering guide covers running the world from the opposite side.
How the story behaves is configurable. Player signals set pace, difficulty, tone, focus, and boundaries. A narrative directive tunes pacing, autonomy, world reactivity, and synthesis in plain language; matching keywords take effect mechanically, and anything else becomes guidance for the narrator. Behavioral settings cover whether the world reacts, whether NPCs and factions pursue goals on their own, when synthesis refreshes, how much memory each tier retains, and whether moments record automatically. Point of view can lock to the active character or stay omniscient, and social scenes can use a manual, natural, list, or pooled speaker order.
What content appears is configurable. A Novel binds to one ruleset at creation and can add supplementary rulesets without changing that binding. The categories used to organize available actions can be reassigned per Novel, and briefing order, enabled action patterns, and journal detail decide which guidance surfaces during play.
Export as JSON or Markdown. Import with merge, replace, or dry-run. Clone, checkpoint, and roll back. A clone carries the full configuration.
"Let the AI run all NPCs and player characters, but pause for mechanical decisions." "Make the game faster and darker, with harder fights." "Let the world react and NPCs act independently; use the rulebook's voice patterns." "Run synthesis whenever the scene changes." "Clone this Novel with its settings."
Every Novel-scoped setting is saved with the Novel, so a clone or checkpoint preserves the exact game you configured.
Synthesis
Synthesis deepens the Holodeck beyond mechanics. Ruleset Wisdom comes from the rulebook and any vendor package during Build — voice examples from example-of-play dialogue, lore templates from setting descriptions, action patterns from resolution sequences, and narrative voice profiles from inspirational media citations. It is build output, active by default, and survives every rebuild and synthesis reversion.
The Synthesis run adds two layers on demand. External research collects web-sourced GM advice, actual-play breakdowns, and designer notes, tagged with source URLs, confidence scores, and freshness timestamps. Internal synthesis reads the Novel itself for patterns the table has already produced. Both are inert by default: the Game Master activates what fits and deactivates what does not, and that activation state is saved with the Novel. Re-running synthesis replaces inactive items and preserves active ones. Reverting removes the synthesis layers; Ruleset Wisdom and player-authored items persist.
Synthesis can run on demand, at the start of a session, or after a scene change.
"Research horror one-shot pacing and actual-play examples, tagged with sources." "Enable the horror pacing guidance that fits this campaign." "Run synthesis after every scene change."
Ruleset Wisdom, synthesis layers, and player-authored items coexist in the Novel without replacing one another.
How it compares
Category | What you're used to | How Holonovel differs |
AI storytelling apps | Narrative-first apps with no rule engine — conditions drift, dice are improvised, the world is whatever the model remembers | The server holds the rules, dice, and world state; the AI narrates outcomes it cannot invent. |
Generic LLM chat | General-purpose chat with no durable state — forgets conditions mid-combat, invents spells, drifts toward safe outcomes | Mechanics resolve deterministically, state survives restarts, and the game keeps its consequences. |
Rules MCP servers | Server-side mechanics and durable saves, but a fixed ruleset or a single SRD seed. | Any rulebook, a containment-based world, and badge-enforced roles in one server. |
Rules engines serve one system. Storytellers improvise mechanics. Holonovel does neither: any rulebook becomes enforced mechanics, a spatial world, and a saved campaign. Across the TTRPG MCP servers reviewed in October 2026, no other reviewed server combined rulebook ingestion, spatial containment, and server-side role enforcement — for D&D 5e, Starfinder, or your own book. Questions about a specific table's setup? See the FAQ.
License
Canonical origin: git.gay/flukeatzerocool/Holonovel.
Holonovel is MIT-licensed. Built from:
D&D 5e SRD v5.1 (CC BY 4.0 + OGL 1.0a, Wizards of the Coast)
Graham Nelson's Inform (Artistic License 2.0, Graham Nelson)
if-craft-corpus (CC BY 4.0, pvliesdonk)
dmcp (MIT, Shawn Rushefsky)
lonelog (CC BY-SA 4.0, zeruhur)
BitD SRD (CC BY 3.0, John Harper)
Ironsworn: Starforged SRD (CC BY 4.0, Shawn Tomkin)
Sly Flourish Lazy GM Resource Document (CC BY 4.0, Mike Shea)
The Alexandrian (CC BY 4.0, Justin Alexander)
Dungeon World SRD (CC BY 3.0, Sage LaTorra, Adam Koebel)
Fate SRD (CC BY 3.0, Evil Hat Productions)
Ironsworn SRD (CC BY 4.0, Shawn Tomkin)
RSS. Last updated: 2026-10-26.
Available Tools
36 toolsclose_sessionClose Play SessionADestructive
Close a play session by returning a recap and saving the current context. The close seals the session's recap and saved context but does not archive or export the Novel; resume it later with open_session. Context and recap state persist and are audited; revert with manage_history (action: undo). Use when: ending a session or checkpointing the narrative context. Do NOT use when: archiving or exporting a Novel — use manage_archive.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true / readOnlyHint=false / idempotent=false; the description goes further, clarifying that close seals but does not archive or export the Novel, that recap and context persist and are audited, and giving an explicit undo path via manage_history (action: undo). That is exactly the extra behavioral context annotations cannot convey.
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?
Front-loaded with what the tool does, followed by effect boundaries, then structured Use when / Do NOT use when clauses. Every sentence carries distinct information with no redundancy.
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?
Covers side effects, persistence semantics, reversibility, and sibling routing, which is everything an agent needs for a zero-parameter mutation; the existing output schema handles return-shape concerns.
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 takes zero parameters, so there is nothing parameter-level to document; baseline 4 applies. The only parameter-like reference is the sibling call manage_history (action: undo), which is clearly specified.
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?
Specific verb (close) plus resource (play session) and both effects (returning a recap, saving context). It explicitly distinguishes itself from open_session for resumption and manage_archive for archiving/exporting.
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 'Use when' (ending a session, checkpointing narrative context) and 'Do NOT use when' (archiving/exporting a Novel — use manage_archive) clauses, plus names open_session as the resume path. Alternatives and exclusions are stated outright.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_adventureAdventure ManagementADestructive
Generate, load, or list adventure content. generate writes an adventure scaffold into the target store (novel by default when one is active; a !force prefix bypasses the guard) and generate_encounter writes one encounter; both persist to the Novel, appear in the audit log, and the most recent write is undoable via manage_history (action: undo). load and list are read-only, and list accepts an optional genre filter. Use when: the GM wants a new adventure scaffold, a single encounter, or to load a prepared module. Do NOT use when: recording a story beat — use manage_story (action: record).
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Adventure module slug (load). | |
| action | Yes | generate, generate_encounter, load, or list. | |
| filter | No | Optional genre filter (list). | |
| target | No | novel, codex, or both (generate). | |
| context | No | Scene context (generate_encounter). | |
| premise | No | Adventure premise (generate). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag the tool as non-read-only and destructive, but the description adds important context beyond them: generate writes scaffolds into a target store, generate_encounter writes one encounter, writes persist and appear in the audit log, and the most recent write is undoable via manage_history. It also clarifies that load and list are read-only, which materially distinguishes action behavior.
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 definition is dense but front-loaded: it starts with the action modes, then side effects, then usage boundaries. Most sentences earn their place, though the parenthetical about the guard and the phrase 'both persist to the Novel' make some parts tighter and less immediately clear than they could be.
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 four-action tool with six parameters, the description explains the main action modes, write side effects, audit/undo behavior, and when to use an alternative. Output values need not be explained because an output schema exists, but the target/codex/both semantics are slightly muddied by the statement that 'both persist to the Novel'.
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%, so the baseline is 3, but the description adds action-level meaning: target defaults to novel, a !force prefix bypasses the guard, list accepts an optional genre filter, and slug is for load. It does not fully restate premise/context semantics, but those are covered by 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 specific verbs and resources: generate, load, and list adventure content, with generate_encounter explicitly called out as a distinct action. It also distinguishes the tool from manage_story for recording story beats, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit positive usage guidance ('Use when: the GM wants...') and an explicit exclusion ('Do NOT use when: recording a story beat — use manage_story'). This is exactly the when/when-not/alternative structure that helps tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_agentAgent Task ManagementADestructive
Manage durable NPC/agent tasks and their action lifecycle. create reads goal and optional source_goal; advance appends description; complete, fail, and cancel settle the task and terminal tasks are immutable; autonomy defaults to TTRPG_AGENT_AUTONOMY. Mutating actions persist to the Novel and are audited; list/get are read-only. Use when: creating, starting, advancing, settling, or inspecting tasks. Do NOT use when: surfacing an advisory suggestion — use manage_scene (action: oracle); managing NPC identity — use manage_npc. Revert with manage_history (action: undo).
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | Task goal text (create). | |
| action | Yes | create, list, get, start, advance, complete, fail, or cancel. | |
| detail | No | Return full agent tasks instead of summary entries (list). | |
| subject | No | Entity or NPC that owns the task (create/list). | |
| task_id | No | Task id (get/start/advance/complete/fail/cancel). | |
| autonomy | No | advisory, prompt, or auto (create; default the TTRPG_AGENT_AUTONOMY setting). | |
| description | No | Action description (advance). | |
| source_goal | No | Originating goal-pursuit suggestion (create). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive and non-idempotent behavior, but the description adds that mutating actions persist to the Novel and are audited, that terminal tasks are immutable, and that list/get are read-only. It also gives the revert path via manage_history. It stops short of detailing permissions or the exact effects of cancel/fail on stored data, so 4 rather than 5.
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?
Dense but front-loaded; every clause carries routing, lifecycle, or persistence information with no filler. It could be split for readability, but nothing is wasted.
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 an output schema present, return values need not be explained. For a complex 8-action mutation tool, the description covers lifecycle, defaults, persistence, audit, usage, and alternatives completely enough to call 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?
Schema coverage is 100%, so the schema already documents each parameter's associated action. The description adds a useful 'advance appends description' semantic and reiterates the autonomy default, but most of its create/source_goal mapping duplicates schema parentheticals.
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?
Names a specific verb (manage) and resource (durable NPC/agent tasks) and scopes it to the action lifecycle, making it clearly distinct from siblings like manage_npc and manage_scene. An agent can identify the tool's domain 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit 'Use when' and 'Do NOT use when' clauses with named alternatives and action paths (manage_scene action: oracle, manage_npc, manage_history undo). This is exactly the routing guidance needed to choose this tool over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_archiveNovel Archive ManagementADestructive
Manage Novel archival and checkpoint surfaces. Export writes a file; import writes Novel state and mode selects dry-run (validate only), merge (keep existing entries), or replace (discard current Novel state), while strict aborts on unresolved references. archive is reversible with unarchive; checkpoint_restore replaces the live Novel with the stored checkpoint and is itself undoable; checkpoint subscriptions persist. Use when: exporting or importing a Novel, archiving/unarchiving, cloning/branching, or managing checkpoints. Do NOT use when: creating, resuming, renaming, or ending a Novel — use manage_novel. Revert the most recent mutation with manage_history (action: undo); checkpoint_list is read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Exported Novel JSON (import). | |
| mode | No | dry-run, merge, or replace (import). | |
| slug | No | Novel slug (resume/switch/archive/unarchive/info). | |
| label | No | Checkpoint label (checkpoint_set/list/restore/remove). | |
| scope | No | Export scope (export). | |
| action | Yes | export, import, archive, unarchive, clone, branch, checkpoint_set, checkpoint_list, checkpoint_restore, checkpoint_remove. | |
| format | No | Output format (export). | |
| strict | No | Fail on any cross-reference mismatch (import). | |
| new_name | No | Name for the copy or branch (clone/branch). | |
| from_event | No | Event-log ordinal to branch from (branch; default latest). | |
| source_slug | No | Novel to copy or branch from (clone/branch). | |
| include_checkpoints | No | Include checkpoints in export (default false; export). | |
| trim_audit_sessions | No | Keep only the most recent N sessions' audit entries in the clone (clone; default full copy). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotent, but the description adds real substance: export writes a file, import writes Novel state, 'replace' discards current Novel state, strict aborts on unresolved references, archive is reversible via unarchive, and checkpoint_restore is undoable. It stops short of stating permission/auth requirements or what validate-only dry-run returns.
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?
Information is front-loaded with operation semantics first, then the Use/Do-NOT-Use routing, and every clause carries new information. The middle sentence is long and packs four mode behaviors plus strict into one run-on, which costs some scannability.
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 10-action, 13-parameter tool with an output schema and safety annotations, the description covers the risky paths (import modes, replace, checkpoint_restore) and the sibling routing well. Gaps are minor: clone/branch semantics (what actually gets copied, how trim_audit_sessions interacts with a full copy) and export scope/format options live only in the schema.
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 100%, so the baseline is 3; the description earns above that by explaining the semantics of 'mode' beyond the enum labels (dry-run = validate only, merge = keep existing entries, replace = discard current state) and by clarifying what 'strict' aborts on. Clone/branch parameters such as trim_audit_sessions and from_event are left entirely to 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 enumerates the concrete operations (export, import, archive/unarchive, clone/branch, checkpoint_*) it covers on Novel state, and explicitly separates itself from manage_novel. The opening verb 'Manage ... surfaces' is an umbrella phrase, but the following clauses supply the specific verbs the name alone would obscure.
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 an explicit 'Use when' list (export/import, archive/unarchive, cloning/branching, checkpoints) and a 'Do NOT use when' clause routing Novel CRUD to manage_novel. It also names two further alternatives with their roles: manage_history (action: undo) for reverting mutations and checkpoint_list as the read-only counterpart.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_beliefBelief ManagementADestructive
Manage per-entity evidence, reconciled belief stances, the perception ledger, and a one-entity knowledge query. admit records a subject/predicate/object proposition with a 0..1 weight and does not change a stance until reconcile recomputes it; retract removes the cited evidence and reconciles; the perception ledger is append-only, so correct a mistaken perception with a new record. Mutating actions persist to the Novel; reads are read-only. knowledge_query returns perceptions, beliefs, and known secrets with event provenance, optionally filtered by topic. Use when: inspecting or recording what an entity learned or believes. Do NOT use when: recording objective truth — use manage_causality; recording shared lore — use manage_lore.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Optional topic filter applied to knowledge_query perceptions, beliefs, and secrets. | |
| action | Yes | Belief: list, get, evidence, admit, retract, conflicts, or reconcile. Perception ledger: perception_record, perception_list, perception_for_entity, or perception_for_event. Knowledge: knowledge_query. | |
| detail | No | Return full belief records instead of summary entries (list). | |
| object | No | Proposition object (admit). | |
| source | No | Source key used to correlate duplicate evidence (admit; default the active badge). | |
| status | No | active, unresolved, or suppressed (admit; default active). | |
| weight | No | Evidence support weight 0..1 (admit; default 1). | |
| subject | No | Proposition subject (admit). | |
| polarity | No | positive or negative (admit). | |
| question | No | Belief question key, or subject|predicate|object (get/evidence). | |
| entity_id | No | Entity whose beliefs are queried or mutated. | |
| predicate | No | Proposition predicate (admit). | |
| evidence_id | No | Evidence record id (retract). | |
| source_ordinal | No | Contributing event-log ordinal (admit; default the latest event ordinal). | |
| perception_kind | No | message, scene, or observation (perception_record; default observation). | |
| perception_sense | No | Sense that produced the perception (perception_record; default null; REQ-594). | |
| perception_room_id | No | Room identifier for the perception (perception_record; defaults to the entity's room). | |
| perception_summary | No | What was perceived (perception_record). | |
| perception_witness | No | Witness kind (perception_record; default inferred; REQ-594). | |
| perception_entity_id | No | Entity that perceived (perception_record/perception_for_entity). | |
| perception_confidence | No | 0..1 confidence (perception_record; default 0; REQ-594). | |
| perception_event_ordinal | No | Contributing event-log ordinal (perception_record/perception_for_event; defaults to the latest event). | |
| perception_source_entity | No | Entity the perception came from (perception_record; default null). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the evidence-then-reconcile dependency (admit does not change a stance until reconcile runs), that retract removes evidence and reconciles, that the perception ledger is append-only so corrections require a new record, and that mutations persist to the Novel while reads are read-only. No contradiction with destructiveHint=true / readOnlyHint=false.
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?
Front-loaded with the resource scope, then behavioral rules, then use/don't-use routing — a logical order. Dense but nearly every clause carries information; the opening sentence is a slightly long noun pile-up that could be trimmed.
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 12 actions and 23 parameters, the description covers the mutating flow, the append-only constraint, persistence, and alternative tools, and an output schema exists so return values need not be described. Missing only a mapping of which parameters belong to which of the less-mentioned actions (list/get/conflicts), which the schema partially supplies.
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 100% with per-parameter descriptions bound to specific actions, so the schema carries the parameter burden. The description adds a little semantic context (weight being a 0..1 support value, the reconcile gating) but does not explain the 23 parameters or which are required per action, so baseline 3 applies.
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 names the resources clearly — evidence, reconciled belief stances, perception ledger, and knowledge query — and enumerates the key verbs (admit, retract, reconcile, knowledge_query). It omits the read verbs (list, get, evidence, conflicts, perception_list) that appear in the schema enum, so an agent must open the schema to see the full action set.
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?
Explicit 'Use when: inspecting or recording what an entity learned or believes' plus a 'Do NOT use when' clause that routes to manage_causality for objective truth and manage_lore for shared lore. This is exactly the sibling-disambiguation an agent needs for a crowded toolset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_causalityCausality ManagementADestructive
Manage objective causal state and transition proposals. causal_propose records a proposal without applying it; causal_admit applies the proposal and causal_reject discards it; causal_expected_version guards optimistic concurrency and causal_from records the expected prior value; causal_ingress admits an external event without a proposal. Proposals persist and are audited; list and state are read-only. Use when: proposing, admitting, rejecting, listing, or inspecting causal transitions, or ingressing an external event. Do NOT use when: changing rooms, things, or exits — use manage_world. Revert with manage_history (action: undo).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | causal_propose, causal_admit, causal_reject, causal_list, causal_state, causal_ingress. | |
| causal_key | No | State key within the entity (causal_propose). | |
| causal_from | No | Expected prior value (causal_propose). | |
| causal_scope | No | Scope coordinate (causal_propose; default the active Novel slug). | |
| causal_value | No | Proposed value (causal_propose/causal_ingress). | |
| causal_domain | No | location or scalar (causal_propose; default location). | |
| causal_entity | No | Entity whose objective state is proposed (causal_propose). | |
| causal_proposal_id | No | Recorded proposal id (causal_admit/causal_reject). | |
| causal_origin_source | No | narrative, machine, or ruleset (causal_propose). | |
| causal_source_ordinal | No | Contributing event-log ordinal (causal_propose; default the latest event). | |
| causal_expected_version | No | Optimistic version guard (causal_propose). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds important context: proposals persist and are audited, causal_propose records without applying, causal_admit applies, causal_reject discards, and list/state are read-only. It stops short of describing audit retention or rejection consequences in depth, but the key behavioral traits are disclosed.
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 dense but front-loaded: purpose, action semantics, usage conditions, exclusions, and revert path all appear in sequence. It is slightly run-on with multiple clauses packed into single sentences, but every sentence carries actionable information.
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 11 parameters, an output schema, and annotations covering safety, the description fills the remaining gaps: action semantics, proposal lifecycle, optimistic concurrency, read-only operations, sibling exclusions, and revert guidance. An agent has enough to select and invoke 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?
Schema coverage is 100%, so the baseline is 3, but the description adds role-level meaning beyond field descriptions: causal_expected_version guards optimistic concurrency, causal_from records the expected prior value, and causal_ingress admits an external event without a proposal. This helps an agent understand how parameters relate to the action workflow.
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+resource ('Manage objective causal state and transition proposals') and then enumerates every action and its effect. An agent can distinguish this tool from manage_world and manage_history without consulting the schema.
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 explicitly names when to use ('proposing, admitting, rejecting, listing, or inspecting causal transitions, or ingressing an external event') and when not to use ('changing rooms, things, or exits — use manage_world'), and it routes reverts to manage_history with the exact action. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_characterPlayer Character ManagementADestructive
Manage player characters: create (quick or step-by-step), stage to roster, import, render a sheet, set the active entity, set personality/voice, patch mechanical stats, send player signals, remove, or list roster characters. sheet and roster_list are read-only; Novel mutations persist, are audited, and are undoable via manage_history (action: undo). update merges provided fields in place (stats shallow-merge; omitted fields are preserved) so one sheet field can change without re-creating the character. The personality{} object aliases description/voice/background/goals, and details{} aliases ability_scores/skills/feats/talents/equipment; a top-level value overrides its grouped alias. stage and roster_remove are exact inverses on the roster; remove deletes the Novel entity and is undoable. Use when: creating or importing a PC, staging or activating one for play, editing its sheet or voice, or handling player feedback. Do NOT use when: managing an NPC — use manage_npc.
| Name | Required | Description | Default |
|---|---|---|---|
| pov | No | Point-of-view mode (set_active). | |
| name | No | Character name; omit (create) to begin step-by-step. | |
| seed | No | Deterministic seed (create). | |
| feats | No | Feats (create). | |
| goals | No | Character goals (create/personality). | |
| stats | No | Mechanical stat keys to shallow-merge into the entity's stats (update). | |
| value | No | Feedback text (signal). | |
| voice | No | Voice and speech pattern (create/personality). | |
| action | Yes | create, stage, import, sheet, set_active, personality, voice, signal, update, remove, roster_remove, or roster_list. | |
| format | No | Output format (sheet). | |
| signal | No | Feedback category (signal). | |
| skills | No | Trained skills (create). | |
| classes | No | Class levels (create). | |
| details | No | Grouped mechanical details (create). | |
| species | No | Species (create). | |
| talents | No | Talents (create). | |
| examples | No | Voice examples (voice). | |
| entity_id | No | Entity identifier (stage/sheet/set_active/personality/voice/remove). | |
| equipment | No | Starting equipment (create). | |
| inventory | No | Replace the entity's inventory (update). | |
| roster_id | No | Roster identifier (import/roster_remove). | |
| background | No | Backstory (create/personality). | |
| description | No | Narrative description (create/personality). | |
| personality | No | Grouped personality fields (create). | |
| stat_method | No | Stat-generation method (create). | |
| ability_scores | No | Ability scores (create). | |
| stage_to_roster | No | Also stage into the roster (create). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it identifies which actions are read-only (sheet, roster_list), states that mutations persist, are audited, and are undoable via manage_history (action: undo), explains that update shallow-merges stats and preserves omitted fields, and notes that stage and roster_remove are exact inverses. This is exactly the mutation/undo/reversibility context that destructiveHint=true alone does not convey.
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?
Four sentences, front-loaded with the action inventory, then mutation/undo semantics, then alias precedence, then when/when-not. Dense but no filler; the aliasing sentence is packed tightly and could be slightly more scannable given 27 params.
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 12-action, 27-param tool with an output schema (so return shapes needn't be explained), the description covers persistence, audit, undo, roster inverses, aliasing, and sibling exclusion. It does not clarify the distinction between stage and set_active, or what import expects from roster_id — minor residual gaps.
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 100%, so baseline is 3; the description earns extra credit by explaining the personality{} and details{} alias groups and the precedence rule (top-level value overrides the grouped alias) plus stats shallow-merge behavior, none of which the schema states. Several params (seed, stat_method, format, pov, examples) are left entirely to the schema, so it stops short of a 5.
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?
Names a specific resource (player characters) and enumerates the concrete operations: create, stage, import, render sheet, set active, personality/voice, patch stats, signal, remove, roster_list. It also explicitly distinguishes itself from manage_npc, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains an explicit 'Use when:' list (creating/importing a PC, staging or activating one, editing sheet or voice, handling player feedback) and an explicit 'Do NOT use when:' with the named alternative manage_npc. Both selection conditions are stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_codexCodex Library ManagementADestructive
Manage the server-level codex library of reusable, cross-Novel content (NPCs, characters, scenes, encounters, lore, factions, rooms, things, templates, voice profiles, adventures). Entries persist to .holonovel-state/codex.json outside every Novel and survive restarts; mutations are audited. Out-of-play and badge-free: requires the Editor or Game Master badge, a Player mid-adventure gets [FORBIDDEN], and reads are not badge-filtered. When no Novel is active, the codex is the default store; import and capture require an active Novel. set needs kind + name (the id derives from them); merge=true shallow-merges content. Revert the most recent mutation with manage_history (action: undo). Use when: storing reusable content for later import, or enumerating/reading/deleting it. Do NOT use when: storing Novel-scoped content — use manage_lore (action: set) or manage_note (action: set).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Entry identifier or array of identifiers (for import/get/delete). | |
| kind | No | Entry kind (for set/list/capture). | |
| name | No | Entry name (for set). | |
| tags | No | Optional tags (for set). | |
| merge | No | For set: when true and the entry exists, shallow-merge the provided content into the stored content instead of replacing it. | |
| action | Yes | set (create/update), list, get, capture (Novel artifact per kind), import (into active Novel), or delete. | |
| content | No | Entry content (for set); when omitted on an existing entry, the stored content is preserved. | |
| entry_id | No | Entry identifier (for get/import/delete); alias of `id`. | |
| entity_id | No | Entity whose voice to capture (for capture, voice_profile kind). | |
| source_id | No | Novel artifact key/name/entity id to capture (for capture). Defaults per kind. | |
| description | No | Optional description (for set). | |
| update_source | No | When true, update the source Codex entry in place (for capture). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the mutation/destructive profile, and the description adds substantial context beyond them: persistence to .holonovel-state/codex.json, audit of mutations, the Editor/Game Master badge requirement, the [FORBIDDEN] outcome for an in-play Player, and the fact that reads are not badge-filtered. It also clarifies the default-store behavior when no Novel is active and the merge=true shallow-merge semantics.
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 dense but front-loads the resource and scope before the badge/behavioral details and the use/don't-use routing. Every sentence carries load for a 12-parameter, multi-action tool; it is longer than ideal but not padded.
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 complexity, an output schema is present (so return values need not be described), and the description supplies the missing scope, auth, persistence, and action-specific preconditions an agent needs to call it correctly. Nothing material is left out.
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 100%, so the baseline is 3, but the description adds value the schema lacks: that `set` requires `kind` + `name` and the id derives from them, plus how merge=true shallow-merges content. It does not attempt to explain the remaining 12 parameters, but the schema already documents those adequately.
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?
States a specific verb (manage) plus the exact resource (the server-level codex library of reusable, cross-Novel content) and enumerates the entry kinds it holds. It explicitly distinguishes itself from siblings by naming manage_lore and manage_note as the tools for Novel-scoped content.
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 'Use when' (storing reusable content for later import, or enumerating/reading/deleting it) and 'Do NOT use when' (Novel-scoped content — use manage_lore or manage_note). It also preconditions import/capture on an active Novel and routes undo to manage_history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_combatCombat Encounter ManagementADestructive
Manage combat encounters in the active Novel — encounter turn order, participants, and lifecycle, not per-entity conditions. Mutating actions persist to the Novel and are audited; read-only actions do not mutate state. Revert the most recent mutation with manage_history (action: undo). init's seed only reorders the danger set; participants keep their given order. Use when: starting, advancing, ending a fight, or changing its participants. Do NOT use when: applying a status effect — use manage_condition (action: apply).
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | Optional deterministic seed (init). | |
| action | Yes | init, advance, end, add_participant, remove_participant, or status. | |
| dangers | No | Optional non-entity combatants (init). | |
| outcome | No | Optional text describing how combat ended (end). | |
| participants | No | Entity identifiers participating (init). | |
| participant_id | No | Entity identifier (add_participant/remove_participant). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructive=true, non-idempotent), it discloses that mutating actions persist and are audited, that read-only actions do not mutate state, that the last mutation can be reverted with manage_history undo, and the subtle seed rule (seed only reorders the danger set; participants keep their given order). That is exactly the behavioral context a destructive-but-revertible tool needs.
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?
Four tightly packed sentences, front-loaded with purpose and scope, then mutation/audit semantics, then seed nuance, then explicit use/do-not-use directives. No filler and no repetition of the enum list already in 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 6-parameter mutation tool with an output schema, the description supplies everything the schema cannot: scope, mutation/audit behavior, undo path, a non-obvious seed semantic, and a sibling routing rule. Nothing an agent needs before calling it appears 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?
Schema description coverage is 100%, so the baseline is 3, but the description adds semantics the schema cannot: the deterministic seed's actual effect on ordering and the fact that participants retain their supplied order on init. It doesn't touch outcome/dangers, but those are adequately documented inline.
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?
States a specific verb and resource ("Manage combat encounters in the active Novel") and immediately bounds the scope as encounter-level turn order, participants, and lifecycle "not per-entity conditions." This scope boundary lets an agent separate it from manage_condition without opening either schema.
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?
Explicit "Use when: starting, advancing, ending a fight, or changing its participants" and "Do NOT use when: applying a status effect — use manage_condition (action: apply)." It also names the recovery path via manage_history (action: undo), so both the trigger and the alternatives are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_conditionCondition ManagementADestructive
Manage mechanical or narrative conditions on entities. apply attaches a named condition to one entity; rounds is a positive round count, and omitting it (or passing 0) leaves the condition without an expiry. Re-applying an active condition warns instead of duplicating it, and remove deletes the condition and its round counter. apply and remove require the GM or Editor badge, persist to the Novel, and are undoable via manage_history (action: undo); list is read-only. Use when: applying, removing, or listing conditions. Do NOT use when: recording damage or combat state — use manage_combat (action: init/advance).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | apply, remove, or list. | |
| rounds | No | Optional duration in rounds (apply). | |
| condition | No | The condition name (apply/remove). | |
| entity_id | No | The entity to affect (apply/remove). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavior: re-applying an active condition warns instead of duplicating it, remove deletes the condition and its round counter, apply/remove require GM or Editor badge, changes persist to the Novel, and they are undoable via manage_history. It also clarifies that list is read-only. These details are consistent with the destructive mutation annotations.
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 and front-loaded: it starts with the tool's purpose, then operation details, permissions, persistence, undo behavior, and finally explicit use/exclusion guidance. Every sentence contributes information needed to select and invoke the tool correctly.
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 mutable condition-management tool with an output schema and annotations already present, the description covers the critical operational context: permissions, persistence, undo path, re-application warning, round-expiry behavior, read-only listing, and the main sibling alternative. Nothing essential for correct invocation appears to be 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?
Schema description coverage is 100%, so the schema already defines the four parameters at a baseline level. The description meaningfully supplements that by explaining that rounds is a positive round count and that omitting it or passing 0 leaves the condition without expiry, which is behavioral semantics not fully captured by 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 and resource ('Manage mechanical or narrative conditions on entities') and enumerates the supported operations: apply, remove, and list. It also distinguishes the tool from manage_combat, which handles damage or combat state, so an agent can identify its scope 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('Use when: applying, removing, or listing conditions') and an explicit exclusion with an alternative ('Do NOT use when: recording damage or combat state — use manage_combat'). This directly routes the agent between sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_corpusKnowledge CorpusADestructive
Manage the cold-reference knowledge corpus. corpus_register indexes a document; route derives its domain from a trusted source profile; grant and deny set per-entity access with the latest decision winning; consume records a read; access checks an entity against the recorded grants. Mutating actions persist access state and are audited; list, get, access, and acquisitions are read-only. Use when: registering, listing, reading, routing, granting/denying access, consuming, or inspecting acquisitions of corpus documents. Do NOT use when: writing Novel lore entries or secrets — use manage_lore. Revert the most recent mutation with manage_history (action: undo).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | corpus_register, corpus_list, corpus_get, corpus_route, corpus_grant, corpus_deny, corpus_access, corpus_consume, corpus_acquisitions. | |
| corpus_body | No | Document reference text (corpus_register). | |
| corpus_mode | No | read, research, taught, or import (corpus_consume; default read). | |
| corpus_title | No | Document title (corpus_register). | |
| corpus_denies | No | Entity ids explicitly denied access (corpus_register). | |
| corpus_domain | No | Knowledge domain (corpus_register/corpus_route/corpus_list). | |
| corpus_grants | No | Entity ids explicitly granted access (corpus_register). | |
| corpus_domains | No | Knowledge domains the entity may access (corpus_access). | |
| corpus_entity_id | No | Entity acquiring or inspected (corpus_consume/corpus_acquisitions/corpus_access/corpus_grant/corpus_deny). | |
| corpus_document_id | No | Corpus document id (corpus_get/corpus_route/corpus_grant/corpus_deny/corpus_consume). | |
| corpus_access_public | No | Whether every entity may consume it (corpus_register; default false). | |
| corpus_access_domains | No | Knowledge domains granted access (corpus_register). | |
| corpus_source_profile | No | Trusted source profile the domain is routed from (corpus_register; default manual). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only say destructiveHint=true and readOnlyHint=false for the whole tool, so the description adds real value by partitioning the nine actions: list, get, access, and acquisitions are read-only while the rest persist state and are audited. It also discloses the conflict rule ('latest decision winning') and points to undo. It stops short of saying what a deny or unregister actually removes or whether access decisions are reversible outside manage_history.
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 opening purpose line is front-loaded and the use-when / do-not-use-when structure is easy to scan. The middle action-gloss sentence is dense but each clause carries distinct information; no filler or restated title.
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 13-parameter, nine-action tool with full schema coverage, annotations, and an output schema, the description supplies the action semantics, the mutating/read-only split, and the sibling routing an agent needs. The remaining gap is the access-model detail (how per-entity grants, domains, and access_public combine), which the description only gestures at.
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 100%, so the baseline is 3, and the description genuinely adds meaning beyond the enum names: 'route derives its domain from a trusted source profile', 'consume records a read', 'access checks an entity against the recorded grants'. That clarifies the intent of corpus_route and corpus_access, which the schema only labels. It does not explain the grants/denies vs access_domains vs access_public interplay explicitly.
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 resource ('cold-reference knowledge corpus') and then enumerates what each of the nine actions does, so an agent can tell corpus operations apart from other 'manage_*' siblings without opening the schema. It explicitly contrasts itself with manage_lore for Novel lore/secrets, which pins down the boundary.
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 has an explicit 'Use when:' list covering all intended actions, an explicit 'Do NOT use when:' routing to manage_lore, and a third pointer to manage_history (action: undo) for reversals. Both the positive cases and the exclusion are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_countdownCountdown ManagerADestructive
Manage countdown timers in the active Novel. set accepts a starting tick count and optional total; advance fires the configured world_effect when the countdown reaches its threshold, and on_scene_transition advances it automatically; direction shifts NPC dispositions only when scope is also set. Mutating actions persist to the Novel and are audited; list is read-only. Use when: starting, advancing, removing, or listing clocks. Do NOT use when: tracking a vow's progress — use manage_vow (action: milestone). Revert with manage_history (action: undo).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Countdown name (set/advance/remove). | |
| type | No | round or narrative (set). | |
| scope | No | Optional scope name (set). | |
| ticks | No | Starting ticks (set). | |
| total | No | Optional capacity for decrement refills (set; defaults to ticks). | |
| action | Yes | set, advance, remove, or list. | |
| triggers | No | Optional world-model triggers (set). | |
| direction | No | Optional direction: increment or decrement (set). | |
| world_effect | No | Optional world-model effect applied when the countdown fires (set). | |
| on_scene_transition | No | When true, advance on each scene transition (set). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false at tool level, so the bar is lower; the description adds valuable per-action nuance that annotations cannot — 'Mutating actions persist to the Novel and are audited; list is read-only' — and clarifies that advance fires world_effect and on_scene_transition auto-advances. It stops short of describing what 'remove' discards or any auth/permission requirements, so not a 5.
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?
Front-loads the core purpose, then uses labeled 'Use when / Do NOT use / Revert' segments that scan well. The middle behavioral clause is densely packed but every sentence carries distinct information, so only minor tightening is possible.
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 10-parameter tool with a nested world_effect object and an output schema (so return values needn't be explained), the description covers actions, per-action mutations, dependency rules, and routing to alternatives. It is essentially complete, with only the destructive 'remove' semantics left unstated.
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 100%, so baseline is 3, but the description adds cross-parameter semantics the schema lacks: 'intention' advances on scene transition, and 'direction shifts NPC dispositions only when scope is also set' — a real dependency rule. The set/advance/remove action-per-parameter mapping (name, ticks, total) is also clarified.
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?
States a specific verb+resource ('Manage countdown timers in the active Novel') and then enumerates every action (set/advance/remove/list) with its distinct behavior, so an agent knows exactly what the tool does and how each action differs. It also explicitly names the sibling it is not (manage_vow).
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?
Uses explicit 'Use when: starting, advancing, removing, or listing clocks' and 'Do NOT use when: tracking a vow's progress — use manage_vow (action: milestone)', plus a revert path via manage_history (action: undo). Alternatives and exclusions are both spelled out, nothing left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_diagnosticsSession DiagnosticsADestructive
Manage session diagnostics and maintenance surfaces separate from play-facing session controls. compress summarizes the audit log while compact prunes it irreversibly; verify compares live state with recorded hashes and replay reads the retained log, and both are read-only; visibility_check records its decision in the audit log while visibility_audit reads recent decisions; health, subscribe, and category reassignment do not change Novel content. compact is GM-only. Use when: reporting health, summarizing or compacting the audit log, subscribing, reassigning a category, appending/reading the event log, verifying or replaying state, or scanning a draft for GM-only disclosure. Do NOT use when: recapping play, setting verbosity, or reordering the briefing — use manage_session.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | normal or terse (verbosity). | |
| text | No | Observation text (event). | |
| tier | No | Compression tier to assemble (recap; REQ-592). | |
| query | No | Optional search term matched against tool name, description, and title (discover). | |
| action | Yes | health, context_report, compress, compact, subscribe, category, event, history, verify, replay, visibility_check, or visibility_audit. | |
| detail | No | discover response detail: summary (default) or schema (live input schemas for the matches; requires query; REQ-609). | |
| source | No | Event source classification (event). | |
| topics | No | Notification topics to subscribe to (subscribe). | |
| audience | No | Audience badge for a visibility check (visibility_check; default the active badge). | |
| category | No | New category label, or null/empty to restore the default (category). | |
| gm_notes | No | GM-only free-text notes returned only to the Game Master badge (recap). | |
| ordinals | No | Exact event ordinals to return in order (history; REQ-591). | |
| sections | No | Ordered list of briefing sections (briefing_order). | |
| sessions | No | Number of recent sessions to retain live; triggers irreversible compaction (compact; default TTRPG_AUDIT_RETENTION_SESSIONS). | |
| to_event | No | Target event ordinal for replay inspection (replay; default the newest retained entry). | |
| supersede | No | Ordinal of an event this observation replaces (event). | |
| tool_name | No | Registered tool name to reassign (category). | |
| session_id | No | Archived session id to include in recap (recap). | |
| max_entries | No | Positive integer; returns a non-mutating summarize prompt over the most recent entries (compress). | |
| budget_tokens | No | Positive token budget for tier assembly (recap; REQ-592) or for ledger packing (context_report; REQ-610). | |
| through_ordinal | No | Return events up to and including this ordinal (history). | |
| include_superseded | No | Include superseded events (history; default true). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag the whole tool as destructive and non-idempotent, which alone would be alarming and uninformative; the description disambiguates per action — compact's pruning is 'irreversible' and GM-only, verify and replay are read-only, visibility_check writes to the audit log while visibility_audit does not, and health/subscribe/category do not change Novel content. It also discloses the authorization constraint (GM-only) that no annotation carries.
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?
Front-loaded with purpose, then per-action semantics, then the use/don't-use routing — the right order for a dispatcher tool. The per-action clauses are chained into long run-on sentences ('...and both are read-only; ...while visibility_audit reads...'), which costs some scannability, but for a 12-action tool the length is earned rather than padded.
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?
Output schema and rich annotations are present, so return values need no explanation. The description covers 11 of the 12 actions with at least a behavioral note — `context_report` is the one action never described, and it is also one of the more obscure ones. Otherwise an agent has enough to call any of these actions safely.
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 100% schema description coverage across 22 parameters, the schema already documents each field's meaning and the action it belongs to, so the baseline is 3. The description adds marginal value by tying actions to behaviors (e.g. compact retaining `sessions`, verify comparing hashes), but it gives no syntax, defaults, or interaction detail beyond what the schema states.
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 framing — 'session diagnostics and maintenance surfaces separate from play-facing session controls' — and then enumerates what nearly every action does (compress summarizes, compact prunes, verify compares hashes, replay reads, visibility_check records, visibility_audit reads). It also names the sibling it is not (manage_session), so an agent can route without opening the schema. The only slight weakness is that a 12-action grab-bag (health, subscribe, category reassignment, visibility audit) doesn't map cleanly onto a single 'diagnostics' noun, so the boundary is a little fuzzy.
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?
Explicitly structured as 'Use when:' with a full enumeration of triggering tasks, plus a 'Do NOT use when:' clause that names recapping, setting verbosity, and reordering the briefing and redirects to manage_session. This is exactly the when/when-not/alternative pattern that lets an agent choose correctly without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_factionFaction ManagementADestructive
Manage organizations in the active Novel: create, update, remove, or list factions, each carrying a name, description, goals, resources, and optional territory room names. name is required to create and faction_id targets an existing faction; the progress clock is Novel-internal and not set directly. create, update, and remove require the GM or Editor badge, persist to the Novel, and are undoable via manage_history (action: undo); remove deletes the faction permanently unless undone, and list is read-only. Use when: creating, revising, removing, or listing factions. Do NOT use when: tracking a faction's territory rooms — use manage_world (action: create_room).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Faction name (create). | |
| goals | No | Optional goals. | |
| action | Yes | create, update, remove, or list. | |
| detail | No | Return full faction records instead of summary entries (list). | |
| resources | No | Optional resources. | |
| territory | No | Optional territory names. | |
| faction_id | No | Faction identifier (update/remove). | |
| description | No | Optional description. |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: states the GM/Editor badge requirement, that changes persist to the Novel, that they're undoable via manage_history (action: undo), that remove is permanent unless undone, that list is read-only, and that the progress clock is Novel-internal and not settable. Annotations confirm destructiveHint=true and this adds the recovery path.
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?
Front-loads the operation set, then permissions/undo behavior, then usage routing. Dense but nearly every clause carries information; the only mild waste is restating 'create, update, remove, or list' inside the 'Use when' clause.
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?
Multi-action mutation tool with an output schema and rich annotations, yet the description still covers authorization, persistence, undo, and destructive semantics. Nothing an agent needs 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.
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 action-parameter pairing ('name is required to create', 'faction_id targets an existing faction') and an explicit exclusion (progress clock not set directly) that the per-field schema strings do not convey.
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?
States specific verbs (create, update, remove, list) against a specific resource (factions in the active Novel) and enumerates the fields carried. An agent can distinguish it from manage_world/manage_novel based on the description alone.
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?
Explicit 'Use when' clause enumerates the four triggering actions, and a 'Do NOT use when' clause names the alternative (manage_world action: create_room) for territory-room tracking. Both positive and negative routing are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_historyUndo and Redo HistoryADestructive
Undo or redo the most recent state mutation for the active badge, restoring the prior per-badge snapshot and clearing the redo stack on a new mutation. Both directions mutate Novel state and persist immediately (readOnlyHint false). The stack is per badge and capped by TTRPG_MAX_SNAPSHOT_DEPTH, and a pending workflow decision blocks both until resolved with respond_decision. Use when: reverting the last mutation (undo) or restoring an undone one (redo). Do NOT use when: an older change is the target — re-run the owning tool (for example manage_story), because only the most recent mutation is stacked.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | Which direction to move: undo (revert the last mutation) or redo (re-apply the last undone mutation). Defaults to undo. |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and non-idempotence, so the safety profile is covered. The description earns credit for adding genuinely non-obvious behavior: immediate persistence, per-badge stack scope, a cap via TTRPG_MAX_SNAPSHOT_DEPTH, redo-stack clearing on a new mutation, and blocking by a pending workflow decision. It does not, however, describe what a restored snapshot affects or what the response reports.
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?
Front-loads the action and scope, then behavior, then use/do-not-use routing — a sensible order with no filler. The opening sentence is long and packs several constraints together, which costs a little readability but nothing is redundant.
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?
An output schema exists, so return values are covered, and annotations cover the mutation safety profile. The description supplies the remaining gaps an agent needs (stack scope, depth cap, decision blocking, alternative for older changes) for a two-direction, destructive undo 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?
Schema coverage is 100% and the single enum parameter's description already defines both values and the undo default. The description adds the conceptual constraint that only the most recent mutation is in play, which sharpens interpretation of the 'undo' value but does not add syntax or format detail 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?
States a specific verb pair (undo/redo) plus the exact resource scope: the most recent state mutation for the active badge. The scope ('most recent', 'per-badge') is what distinguishes it from sibling tools like manage_story that also mutate Novel state.
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 'Use when' (reverting the last mutation, restoring an undone one) and 'Do NOT use when' (an older change is the target), naming the correct alternative behavior: re-run the owning tool such as manage_story. It also names respond_decision as the unblocking prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_identityIdentity ManagementADestructive
Manage a roster character's durable identity: staged candidates, accepted facets, and the versioned compiled kernel. stage imports or authors identity material; accept replaces a facet, retains the displaced value in an internal history, and bumps the identity version; reject marks a candidate rejected without touching accepted facets; revert restores the most recently displaced facet. bootstrap seeds from a character card; accept's perspective defaults to the candidate's stored perspective. Mutation persists the roster and is audited; list and snapshot are read-only and report current facets only. Use when: staging, accepting, rejecting, reverting, or reading identity material. Do NOT use when: recording what a character knows or believes — use manage_belief; editing narrative personality — use manage_character (action: personality).
| Name | Required | Description | Default |
|---|---|---|---|
| card | No | Character-card fields to stage (bootstrap). | |
| facet | No | Identity facet key, e.g. name or calling (stage). | |
| value | No | Identity facet value (stage). | |
| action | Yes | stage, accept, reject, revert, list, snapshot, or bootstrap. | |
| source | No | Provenance label for the candidate (stage; default manual). | |
| stability | No | structural, constitutional, core, or developmental (stage; default core). | |
| perspective | No | self, biographical, public_reputation, secret, or unknown (stage/accept; default self). | |
| candidate_id | No | Identity candidate id (accept/reject). | |
| character_id | Yes | Roster character id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that accept retains the displaced value in internal history and bumps the identity version, that reject leaves accepted facets untouched, that revert restores the most recently displaced facet, that mutation persists the roster and is audited, and that list/snapshot are read-only despite the tool-level readOnlyHint=false. This resolves the annotation ambiguity for a destructive-flagged multi-action 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?
Front-loaded with the resource, then per-action semantics, then the use-when/do-not-use routing; nearly every clause supplies decision-relevant information. It is dense and somewhat run-on, but the only mild redundancy is restating the action list twice.
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 9 parameters, enums, a nested card object, and an output schema that covers return values, the description supplies exactly what the structured fields cannot: per-action behavior, side effects, audit persistence, and sibling routing. Nothing needed to invoke it correctly 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?
Schema coverage is 100%, so the baseline is 3, but the description adds real value by mapping parameters to actions (stage imports/authors, accept/reject use candidate_id, bootstrap seeds from a card) and by clarifying that accept's perspective defaults to the candidate's stored perspective rather than the schema's stated 'self' default. It does not explain the stability tiers (structural/core/developmental) or what a provenance source label is used for.
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?
States a specific verb and resource — managing a roster character's durable identity (staged candidates, accepted facets, versioned kernel) — and enumerates every action in the enum. It also explicitly names the sibling tools it is not, so an agent can separate it from manage_belief and manage_character without opening schemas.
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?
Has an explicit 'Use when' clause enumerating staging, accepting, rejecting, reverting, and reading, plus a 'Do NOT use when' clause that names the correct alternatives (manage_belief for knowledge/beliefs, manage_character with action: personality). This is the full when/when-not/alternative pattern.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_knowledgeDerived KnowledgeADestructive
Manage derived, in-memory knowledge over Novel sources: a semantic index for advisory text ranking and a typed knowledge graph. index_build and graph_build are audited, replace the prior projection in one step, and do not persist a separate copy; they are safe to rebuild from the authoritative Novel file, which is never modified. The read actions never mutate state. Use when: building or rebuilding the index or graph, checking staleness, ranking indexed items, or reading relations and graph structure. Do NOT use when: searching a bound ruleset's index — use manage_ruleset (action: search); recording knowledge — use manage_corpus; recording a relationship — use manage_relationship.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum candidates to return (index_search; default 5). | |
| query | No | Query text to rank candidates against (index_search). | |
| action | Yes | index_* actions operate the semantic index; graph_* actions operate the knowledge graph. | |
| item_id | No | Indexed item id to filter relations (index_relations). | |
| node_id | No | Graph node id (graph_neighbors). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, which alone would make an agent wary; the description resolves that by explaining exactly what is replaced (the prior projection), what is not created (no persisted copy), and that the authoritative Novel file is never modified — so the 'destructive' act is a safe rebuild. It also segregates read actions as non-mutating, which the annotations' tool-level flags cannot express since they are a single set for eleven actions.
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?
Purpose, then behavioral guarantees, then positive and negative routing — a sensible order with no filler. The second sentence is long and compound ('audited, replace the prior projection in one step, and do not persist a separate copy'), which costs a little scannability.
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 an eleven-action tool with a rich enum and an existing output schema, the description covers the things the schema cannot: which action families mutate, that rebuilds are safe and reversible from source, and where to go for the three neighboring intents. Return shapes are correctly left to the output schema.
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% and each parameter already names its owning action (index_search, index_relations, graph_neighbors), so the schema carries the load. The description adds no format, default, or constraint detail beyond what is structured, which is the baseline-3 case.
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?
States a specific verb and resource — derived, in-memory knowledge over Novel sources — and immediately decomposes it into the two concrete artifacts it manages: a semantic index and a typed knowledge graph. The action families (index_*/graph_*) are named in prose, so an agent knows the tool's surface 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'Use when' list covers all four legitimate intents (build/rebuild, staleness check, ranking, relation/graph reads), and the 'Do NOT use when' block routes three distinct wrong turns to manage_ruleset, manage_corpus, and manage_relationship by name. Nothing about selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_loreLore ManagementADestructive
Manage the active Novel's lore entries — shared, durable world facts every caller recalls. set/update writes a keyed entry with recall triggers, priority, sticky weight, and a badge_scope (game_master hides it from the Player badge); set_secret, reveal, secret_list, and knowledge control Player-visible knowledge. import defaults to a non-mutating dry-run, while merge and replace write. Lore mutations require the GM or Editor badge, persist to the Novel, and are undoable via manage_history (action: undo); list, get, export, secret_list, and knowledge are read-only. Use when: creating, revising, removing, toggling, grouping, suggesting, listing, exporting, or importing lore, or controlling what an entity knows. Do NOT use when: recording one entity's beliefs or perceptions — use manage_belief; handling cold-reference corpus documents — use manage_corpus.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Lore key (set/update/remove/toggle/group/get). | |
| data | No | JSON or Markdown lorebook data (import). | |
| mode | No | dry-run, merge, or replace (import). | |
| group | No | Group name, or null to clear (set/update/group). | |
| action | Yes | set, update, remove, toggle, group, suggest, list, get, export, import, set_secret, reveal, secret_list, or knowledge. | |
| detail | No | Return full lore entries instead of summary entries (list). | |
| format | No | Optional output format (export). | |
| sticky | No | Optional sticky weight (set/update). | |
| content | No | Lore content (set/update). | |
| priority | No | Optional priority (set/update). | |
| triggers | No | Optional recall triggers (set/update). | |
| entity_id | No | Entity to reveal to / whose knowledge to read (reveal/knowledge). | |
| badge_scope | No | game_master or shared (set/update). | |
| world_target | No | Optional world-model target reference (set/set_secret). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint=true annotation, the description discloses the GM/Editor badge requirement for mutations, that mutations persist to the Novel, the undo path via manage_history (action: undo), that import defaults to a non-mutating dry-run while merge/replace write, and that game_master badge_scope hides entries from the Player badge. It also enumerates the read-only subset (list, get, export, secret_list, knowledge), which matters because the tool's aggregate annotation is destructive. Idempotency is unaddressed but the disclosure burden is otherwise well covered.
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?
Front-loaded with purpose first, then action families, then behavior, then use/avoid routing — a sensible order for a 14-action mega-tool. It is dense but nearly every clause carries information; the only mild redundancy is restating the read-only action list after already naming them in the action walkthrough.
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 14-parameter, multi-mode tool with an output schema and destructive annotation, the description covers scope, permissions, dry-run defaults, and undo. Gaps are minor: idempotency of set vs. update, and what happens when import merge collides with an existing key.
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 100%, so baseline is 3, but the description adds real meaning: badge_scope's game_master value hides the entry from the Player badge (a visibility rule not present in the enum description), and it names the recall triggers/priority/sticky weight fields as write-time concepts. It doesn't explain how triggers actually fire or what sticky weight governs.
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 opening sentence names a specific verb and resource ("Manage the active Novel's lore entries — shared, durable world facts") and immediately enumerates the action families it covers. It explicitly names the siblings it is not (manage_belief, manage_corpus), so an agent can separate it from adjacent tools without opening either schema.
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 an explicit "Use when:" list and an explicit "Do NOT use when:" clause that routes to named alternatives (manage_belief for entity beliefs, manage_corpus for cold-reference documents). The condition that selects each alternative is stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_noteNote ManagementADestructive
Manage Novel-scoped scratch notes, badge-scoped to game_master (default), player, or shared. set replaces the note content; badge_scope defaults to game_master and controls which badge can read it; set_server stores a server-level note with an optional narrative_tag, and list_server returns summaries unless detail is set. Mutations persist to the Novel and are audited. Use when: storing scratch state the caller will reuse. Do NOT use when: recording durable world facts — use manage_lore (action: set). Revert with manage_history (action: undo).
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | The note key (set/remove/set_server/remove_server). | |
| action | Yes | set, remove, list, set_server, remove_server, or list_server. | |
| detail | No | Return full server notes instead of summary entries (list_server). | |
| content | No | The note content (set/set_server). | |
| badge_scope | No | game_master, player, or shared (set). | |
| narrative_tag | No | Optional narrative tag (set_server). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false; the description adds real context on top: mutations persist to the Novel, are audited, 'set replaces the note content', and badge_scope governs which badge can read the note. It stops short of explaining the remove/remove_server destructive paths, which is the main gap given destructiveHint=true.
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?
Front-loaded with the resource and scope, then action semantics, then use/don't-use rules. Dense but every sentence carries information; the middle sentence is somewhat packed with several action behaviors at once.
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 an output schema and annotations covering safety, the description only needs to carry usage, scoping, and mutation semantics, which it does. The remove and list actions of a six-action tool are never mentioned, leaving a small completeness gap.
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 100% so the baseline is 3, but the description adds genuine semantics beyond the schema: badge_scope defaults to game_master and controls read access, set_server takes an optional narrative_tag, and list_server returns summaries unless detail is set. Only remove/list action behavior is left to 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?
Names a concrete resource ('Novel-scoped scratch notes') plus its scoping dimension (badge-scoped to game_master/player/shared), so the agent knows exactly what this tool owns. It also distinguishes itself from manage_lore and manage_history, which is more than most siblings do.
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?
Explicit 'Use when: storing scratch state the caller will reuse' and 'Do NOT use when: recording durable world facts — use manage_lore (action: set)', plus a revert path via manage_history (action: undo). Both the inclusion and exclusion conditions plus named alternatives are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_novelNovel Save ManagementADestructive
Manage Novel save files: create, resume, switch, end, rename, description, info, genre, complete_session_zero, save_context, get_context, and list. list returns one line per Novel unless detail is set, and filter selects active, archived, or all. create and save_context persist to the Novel; list, info, and get_context are read-only. Lifecycle changes are not reversible via manage_history, so clone a Novel with manage_archive before a risky change. Use when: handling a campaign's lifecycle or returning to saved context. Do NOT use when: managing content inside the Novel — use the entity tools; use manage_archive for export, import, archive/unarchive, clone/branch, and checkpoints.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Exported Novel JSON (import). | |
| mode | No | dry-run, merge, or replace (import). | |
| name | No | Novel name (create). | |
| slug | No | Novel slug (resume/switch/archive/unarchive/info). | |
| genre | No | Genre tag (create/genre). | |
| label | No | Checkpoint label (checkpoint_set/list/restore/remove). | |
| scope | No | Export scope (export). | |
| action | Yes | create, resume, switch, end, export, import, rename, description, list, archive, unarchive, info, genre, complete_session_zero, clone, branch, save_context, get_context, checkpoint_set, checkpoint_list, checkpoint_restore, or checkpoint_remove. | |
| detail | No | Return full metadata (list). | |
| filter | No | active, archived, or all (list). | |
| format | No | Output format (export). | |
| strict | No | Fail on any cross-reference mismatch (import). | |
| ruleset | No | Ruleset slug (create). | |
| new_name | No | Name for the copy or branch (clone/branch). | |
| new_slug | No | New slug (rename). | |
| from_event | No | Event-log ordinal to branch from (branch; default latest). | |
| description | No | Description (create/description). | |
| source_slug | No | Novel to copy or branch from (clone/branch). | |
| player_goals | No | Player goals (save_context). | |
| current_scene | No | Current-scene summary (save_context). | |
| codex_adventure | No | Codex adventure to seed from (create). | |
| long_term_plans | No | Long-term plans (save_context). | |
| short_term_plans | No | Short-term plans (save_context). | |
| immediate_situation | No | Immediate situation (save_context). | |
| include_checkpoints | No | Include checkpoints in export (default false; export). | |
| trim_audit_sessions | No | Keep only the most recent N sessions' audit entries in the clone (clone; default full copy). | |
| pending_player_action | No | Pending player action (save_context). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, and the description goes beyond them by stating which actions persist (create, save_context) versus read-only (list, info, get_context) and that lifecycle changes are not reversible via manage_history, with the mitigation of cloning first. The remaining gap is that it never clarifies whether the destructive enum actions (import, clone, checkpoint_restore) are actually callable here or hard-routed to manage_archive.
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?
Front-loaded with the action scope, then behavior (read-only vs persisting), then a risk warning, then use/do-not-use. It is dense but every sentence carries routing or safety information. The opening enumeration of twelve action names partially duplicates the action enum, which is the main redundancy.
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?
An output schema exists so return values need no explanation, and the description covers routing, mutation semantics, and irreversibility for a 27-parameter tool. However, with the action enum listing export/import/clone/branch/checkpoint actions that the prose delegates to manage_archive, an agent cannot fully resolve whether those are callable here — a meaningful ambiguity for a destructive 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?
Schema coverage is 100% and each of the 27 parameters is annotated with its owning action, so the schema carries most of the load. The description adds real meaning for `detail` ('list returns one line per Novel unless detail is set') and `filter` (active/archived/all), but says nothing about the remaining parameters beyond the action-level split. Baseline 3 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 names the resource (Novel save files) and enumerates the concrete actions (create, resume, switch, end, rename, info, save_context, get_context, list), so an agent can tell it handles campaign lifecycle rather than content. It explicitly separates itself from the entity tools and manage_archive. The only blur is that the schema's action enum still lists export/import/clone/branch/checkpoint_* actions the description tells the agent to route elsewhere.
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 'Use when: handling a campaign's lifecycle or returning to saved context' and 'Do NOT use when: managing content inside the Novel — use the entity tools', plus a named alternative (manage_archive) for export/import/archive/clone/checkpoints. Both the positive trigger and the exclusion are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_npcNPC ManagementADestructive
Manage non-player characters in the active Novel. create requires a name; ruleset_reference links a stat block without copying it; mind is GM-only and never returned to the Player badge; remove deletes the NPC permanently. create, update, and remove require the GM or Editor badge, persist to the Novel, are audited, and are undoable via manage_history (action: undo); list and get are read-only. Use when: introducing, revising, removing, listing, or reading NPCs. Do NOT use when: managing player characters — use manage_character (action: create/import/sheet).
| Name | Required | Description | Default |
|---|---|---|---|
| card | No | Character Card V3 JSON object or string (import_card). | |
| mind | No | Optional GM-only NPC mind (create/update). | |
| name | No | NPC name (create). | |
| goals | No | Optional goals. | |
| action | Yes | create, update, remove, list, get, import_card, or export_card. | |
| detail | No | Return full NPC records instead of summary entries (list). | |
| npc_id | No | NPC identifier (update/remove/get/export_card). | |
| source | No | Import provenance URL or description (import_card). | |
| license | No | Import license attestation (import_card). | |
| persona | No | Optional values, traits, and mannerisms (create/update). | |
| location | No | Optional location. | |
| description | No | Optional description. | |
| disposition | No | Optional disposition. | |
| confirm_lore | No | Import the card's character_book as lore entries (import_card). | |
| talkativeness | No | Optional 0-100 social-scene speaking weight; default 50 (create/update). | |
| ruleset_reference | No | Optional ruleset stat-block reference (create). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: states that create requires a name, that ruleset_reference links a stat block without copying it, that mind is GM-only and never returned to the Player badge, that remove is permanent deletion, and that writes require GM/Editor badge, persist, are audited, and are undoable via manage_history. The destructiveHint=true annotation is corroborated rather than contradicted.
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?
Dense semicolon-delimited clauses with zero filler; purpose comes first, per-action semantics next, then when/when-not routing. Everything stated is decision-relevant for a 16-parameter tool.
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?
Covers permissions, persistence, audit/undo, visibility, and destructive behavior for the core actions, and an output schema exists so return values need no explanation. Minor gaps: import_plan/import/export operations (card, source, license, detail) get no behavioral framing such as where card data lands or what confirm_lore does.
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 100%, so baseline is 3; the description adds real value on top by explaining the semantics of name (required on create), ruleset_reference (reference, not copy), and mind (GM-only, hidden from players), which the schema only labels. It does not add meaning for import_card parameters like license/source or confirm_lore.
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?
Opens with a specific verb+resource ("Manage non-player characters in the active Novel") and then enumerates the action surface (create/update/remove/list/get plus card import/export). It explicitly distinguishes itself from the nearest sibling, manage_relationship-style confusion avoided by calling out 'use manage_relationship' equivalent for NPCs.
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?
Contains an explicit "Use when:" list and a "Do NOT use when:" exclusion that names the alternative (manage_character with its create/import/sheet actions). An agent can route between NPC and PC management without opening either schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_relationshipRelationship ManagementADestructive
Manage directed relationships between entities, NPCs, or factions. set is keyed by the ordered (entity_a, entity_b) pair and updates type, value, or description in place rather than duplicating; type is one of ally, rival, neutral, mentor, dependent, or suspicious, and value is an optional numeric strength. get returns outgoing and incoming edges separately. set requires the GM or Editor badge, persists to the Novel, and is undoable via manage_history (action: undo); get is read-only. Use when: setting or reading how two parties relate. Do NOT use when: tracking faction standing or progress — use manage_faction (action: update).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Relationship type (set). | |
| value | No | Optional relationship strength (set). | |
| action | Yes | set or get. | |
| entity_a | No | The source entity (set). | |
| entity_b | No | The target entity (set). | |
| entity_id | No | Entity whose relationships to list (get). | |
| description | No | Optional description (set). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses that set requires the GM or Editor badge, persists to the Novel, is undoable via manage_history (action: undo), and that get is read-only. It also explains the in-place (non-duplicating) update semantics, which reconciles with destructiveHint=true rather than contradicting it.
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?
Dense and front-loaded, with the use/do-not-use routing at the end serving a clear purpose. Minor redundancy in restating the enum list that the schema already provides keeps it from a top score.
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 an output schema and full annotation coverage present, the description still covers permissions, persistence, undo path, and get's return shape. An agent has everything needed to invoke it correctly and unsafely-avoid mistakes.
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 100% so the baseline is 3, but the description adds genuine meaning: the relationship key is the ordered (entity_a, entity_b) pair, value is an optional numeric strength, and get returns outgoing and incoming edges separately. It slightly repeats the enum values already in the schema, which keeps it from a 5.
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?
States specific verbs (set/get) against a specific resource (directed relationships between entities/NPCs/factions) and explicitly differentiates from the sibling manage_faction. An agent can select this 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains an explicit 'Use when: setting or reading how two parties relate' and a 'Do NOT use when: tracking faction standing or progress — use manage_faction (action: update)', naming the alternative and its action. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_rulesetRuleset Package ManagementADestructive
Manage ruleset packages: search an installed ruleset's index, install or remove a package, list installed packages, bind a Novel to a ruleset, or import/remove supplementary Wisdom. search accepts an optional slug, works with no active Novel, and is read-only; install, remove, import_supplementary, and remove_supplementary mutate state, are audited, and are reversible via the paired action. install of an existing slug conflicts, and remove refuses while a Novel is bound to that slug. binding scopes only Novel-dependent features; import_supplementary uses inline wisdom when present and reads source only when absent. Table rolls are resolve_mechanic (action: roll). Use when: searching rules content, managing packages, binding a Novel, or adding/removing supplementary Wisdom. Do NOT use when: the ruleset name is unknown — use manage_session (action: discover).
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | Deterministic seed (roll). | |
| slug | No | Ruleset slug (install/remove/bind/import_supplementary/remove_supplementary). | |
| index | No | Search index (install). | |
| model | No | Extraction model (install). | |
| query | No | Search query (search). | |
| table | No | Generation table to roll on (roll). | |
| tools | No | Tool schemas (install). | |
| action | Yes | search, install, remove, list, bind, import_supplementary, or remove_supplementary. | |
| source | No | Supplementary Markdown source path (import_supplementary). | |
| wisdom | No | Inline supplementary Wisdom items (import_supplementary). | |
| prompts | No | Prompts (install). | |
| manifest | No | Package manifest (install). | |
| resources | No | Resources (install). | |
| max_results | No | Maximum results (search). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses per-action safety: search is read-only and needs no active Novel; mutating actions are audited and reversible via the paired action; install of an existing slug conflicts; remove refuses while a Novel is bound; binding scopes only Novel-dependent features. These are exactly the behavioral traits annotations cannot express per-action, and they do not contradict the tool-level destructiveHint.
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?
Despite covering seven actions and fourteen params, it is tightly organized: purpose first, then per-action behavior and constraints, then Use-when/Do-not-use routing. Every sentence carries actionable information with no filler.
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 an output schema handling return values and annotations covering the safety profile, the description fills the remaining gaps: per-action semantics, mutation/audit/reversibility, conflict and refusal conditions, and routing to siblings. An agent has everything needed to pick the right action 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?
Schema coverage is 100%, so the schema already documents each parameter and its target action, warranting a baseline 3. The description adds genuine value beyond that by noting that search accepts an optional slug (info not present in the schema's slug description), though it does not clarify the remaining install-specific params.
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 enumerates the concrete actions verb+resource (search, install, remove, list, bind, import/remove supplementary Wisdom) in one front-loaded sentence, so an agent can map the tool to its tasks precisely. It also distinguishes itself from resolve_mechanic (rolls) and manage_session (discovery).
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 an explicit 'Use when:' list and a 'Do NOT use when:' exclusion that names the alternative ('the ruleset name is unknown — use manage_session (action: discover)'). It further routes table rolls to resolve_mechanic, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_sceneScene ManagementADestructive
Manage the active scene and its narrative framing — scene description, directive, choices, and oracle rolls, distinct from the world model's rooms and things. set overwrites the scene's description and metadata and derives the description from location only when description is omitted; directive replaces the active directive; choices replaces the offered options; oracle resolves a chance question and records the roll. set and directive require the GM or Editor badge, persist to the Novel, are audited, and are undoable via manage_history (action: undo). Use when: setting scene state, issuing a directive, offering choices, or consulting the oracle. Do NOT use when: recording a story beat — use manage_story (action: record); staging presence or autonomy — use manage_staging.
| Name | Required | Description | Default |
|---|---|---|---|
| beat | No | Story-beat tag (set): setup, escalation, turning_point, climax, resolution, denouement. | |
| seed | No | Deterministic seed (oracle). | |
| action | Yes | set, directive, presence, autonomy, choices, or oracle. | |
| prompt | No | Choice prompt (choices). | |
| choices | No | List of choices (choices). | |
| context | No | Context for the choice (choices). | |
| location | No | Scene location (set). | |
| question | No | Question to resolve (oracle). | |
| directive | No | Narrative directive (directive). | |
| atmosphere | No | Atmosphere (set). | |
| likelihood | No | Likelihood tier (oracle). | |
| scene_type | No | Scene-type tag or array (set). | |
| description | No | Scene description (set). | |
| time_of_day | No | Time of day (set). | |
| fast_forward | No | Narrative fast-forward (set). | |
| allow_freeform | No | Allow free-form response (choices). | |
| adventure_scene | No | Adventure-scene waypoint anchor; empty or null clears (set). | |
| skip_transition_hook | No | Skip the scene-transition hook (set). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: set and directive require the GM or Editor badge, persist to the Novel, are audited, and are reversible via manage_history (action: undo). It also discloses that set overwrites existing description/metadata, which corroborates destructiveHint=true. It stops short of noting non-idempotency or the additive side effects of oracle rolls, so it is strong but not complete.
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?
Dense but front-loaded: the purpose leads, per-action semantics follow, then permissions, then explicit use/do-not-use routing. Every sentence carries distinct information, and the 'Use when' / 'Do NOT use when' scaffolding makes it scannable despite the 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 an 18-parameter destructive tool, it covers the four actions, the permission model, persistence/audit behavior, and undo path, and the output schema means return values need not be described. The gap is fast_forward and its nested changes/skip_countdowns semantics, which an agent must infer entirely from the schema.
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 100%, so the baseline is 3, but the description adds a genuine rule not in the schema: description is derived from location only when description is omitted. It also maps parameters to actions (directive replaces the active directive, choices replaces the offered options). The notable omission is fast_forward, a nested object controlling time skips and NPC changes, which is never explained.
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?
Names a specific verb+resource ('Manage the active scene and its narrative framing') and enumerates the four sub-operations it covers: description, directive, choices, and oracle rolls. It explicitly separates the tool from the world model's 'rooms and things' and from the staging siblings, so an agent can discriminate it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'Use when:' list (setting scene state, issuing a directive, offering choices, consulting the oracle) and a 'Do NOT use when:' list that routes to named alternatives — manage_story for recording a beat and manage_staging for presence/autonomy. This is exactly the when/when-not/alternative structure a routing agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_sessionSession ManagementADestructive
Manage play-facing session controls: recap, verbosity, briefing_order, and tool discovery, distinct from story content and Novel lifecycle. recap accepts an archived session_id, GM-only gm_notes, and an optional compression tier; gm_notes are never returned to a non-GM badge. discover searches names, descriptions, and titles, and detail schema requires query. verbosity is session-scoped; briefing_order persists to the Novel and requires the GM or Editor badge. recap and discover are read-only; a setting is restored by setting it again (no undo snapshot is taken). Use when: recapping play, tuning output verbosity, reordering the briefing, or finding a tool. Do NOT use when: health, audit compaction, event-log, or category operations — use manage_diagnostics; recording story content — use manage_story (action: record).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | normal or terse (verbosity). | |
| tier | No | Compression tier to assemble (recap; REQ-592). | |
| query | No | Optional search term matched against tool name, description, and title (discover). | |
| action | Yes | recap, verbosity, briefing_order, compress (non-mutating audit summary prompt), compact (GM-only irreversible audit-log compaction), health, context_report (per-section token ledger), subscribe, discover (list/search tools), category (reassign a tool's category), event (append an observation), history (read the event log), verify (compare live state to recorded hashes), replay (read-only event-log inspection), visibility_check (scan a draft for GM-only disclosure), or visibility_audit (recent visibility decisions). | |
| detail | No | discover response detail: summary (default) or schema (live input schemas for the matches; requires query; REQ-609). | |
| gm_notes | No | GM-only free-text notes returned only to the Game Master badge (recap). | |
| sections | No | Ordered list of briefing sections (briefing_order). | |
| session_id | No | Archived session id to include in recap (recap). | |
| budget_tokens | No | Positive token budget for tier assembly (recap; REQ-592) or for ledger packing (context_report; REQ-610). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal that the overall tool is mutating and destructive, and the description adds useful behavioral detail: GM-only gm_notes visibility, session-scoped verbosity, briefing_order persistence to the Novel, badge requirements, read-only recap/discover subactions, and the absence of an undo snapshot. It still does not reconcile the destructive 'compact' action that appears in the schema with the instruction to avoid audit compaction, leaving some per-action side effects unclear.
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 dense but appropriately structured for a multi-action tool: it front-loads the purpose, then gives use and do-not-use routing. Some clauses are run-on and the long action list creates slight redundancy, but most sentences carry useful information.
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 complex tool with nine parameters and an output schema, the description covers the main play-facing actions and the most important exclusions, so it is minimally viable. However, it leaves several actions present in the schema, such as compress, context_report, subscribe, verify, replay, and the visibility actions, effectively unexplained, which creates a completeness gap.
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%, so the schema already documents all nine parameters. The description adds meaningful semantics beyond the schema, especially that gm_notes are GM-only and never returned to a non-GM badge, that detail schema requires query, and that briefing_order persists while verbosity is session-scoped.
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 names a specific resource and enumerates four play-facing actions (recap, verbosity, briefing_order, discover), and it distinguishes this tool from story content, Novel lifecycle, and manage_diagnostics. However, the action schema includes many additional actions not covered by the description, so the stated purpose is clearer for a subset than for the full tool.
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 'Use when' and 'Do NOT use when' guidance, naming alternatives such as manage_diagnostics for health/audit/event-log/category operations and manage_story for recording story content. The routing conditions are concrete enough that an agent can choose between this tool and its siblings without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_stagingScene Staging ManagementADestructive
Manage scene presence, autonomy, and social-cast staging. presence replaces the present set; cast sets the multi-NPC speaker strategy with mute/unmute adjusting its pool; next_speaker runs manual, forced, or pooled selection, where force overrides select; autonomy changes apply to the current scene only. Presence, autonomy, and cast state persist to the Novel and are audited. Use when: setting who is present, adjusting scene autonomy, choosing a speaker strategy, or selecting the next speaker. Do NOT use when: setting the scene, issuing a directive, offering choices, or consulting the oracle — use manage_scene. Revert the most recent mutation with manage_history (action: undo).
| Name | Required | Description | Default |
|---|---|---|---|
| mute | No | NPC muted from speaker selection (cast). | |
| force | No | NPC forced as the next speaker (cast/next_speaker). | |
| level | No | Autonomy level (autonomy). | |
| action | Yes | presence, autonomy, cast, or next_speaker. | |
| safety | No | Safety tier (autonomy). | |
| select | No | NPC selected as the manual speaker (cast/next_speaker). | |
| unmute | No | NPC restored to speaker selection (cast). | |
| strategy | No | Speaker-selection strategy (cast). | |
| after_user | No | Reset the pooled spoken-set for a new user turn (next_speaker). | |
| creativity | No | Creativity (autonomy). | |
| entity_ids | No | Entities present (presence). | |
| confirmation | No | Confirmation mode (autonomy). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: presence replaces the present set, cast adjusts the speaker pool via mute/unmute, next_speaker supports manual/forced/pooled selection, force overrides select, and autonomy changes apply only to the current scene. It also discloses that presence, autonomy, and cast state persist to the Novel and are audited, which is key for a destructive, non-idempotent mutation 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 dense but well organized: purpose first, action semantics next, then explicit use/avoid guidance and undo routing. Every sentence contributes operational information, and the semicolon structure keeps it front-loaded despite the 12-parameter surface area.
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 complexity, 12 parameters, destructive annotations, and an existing output schema, the description covers the important missing context: action behavior, current-scene scope, persistence/auditing, sibling routing, and undo. Nothing essential for correct invocation appears to be omitted.
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%, so the schema already documents all 12 parameters. The description adds meaningful action-to-parameter semantics, such as presence replacing the present set, cast using mute/unmute, next_speaker with force overriding select, and autonomy being scene-local, which goes beyond the field descriptions even though not every autonomy sub-parameter is elaborated.
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 and resources: 'Manage scene presence, autonomy, and social-cast staging,' then clarifies each action's role. It explicitly distinguishes itself from manage_scene with a 'Do NOT use when' clause, so an agent can select it confidently.
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 positive triggers ('Use when: setting who is present, adjusting scene autonomy, choosing a speaker strategy, or selecting the next speaker') and explicit exclusions that route to manage_scene. It also names manage_history (action: undo) for reverting the most recent mutation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_storyStory Journal ManagementADestructive
Manage the story journal — typed narrative memories (decision, moment, revelation, bond, consequence). record appends an entry and consumes the turn_handle minted by take_turn; update edits a mutable entry; decision and consequence entries are immutable and refuse update or promotion; remove deletes an entry by index; promote copies an entry into lore under a derived or supplied key. list filters by type and paginates with offset and limit, returning previews unless detail is set. Mutations require the GM or Editor badge, persist to the Novel, and are undoable via manage_history (action: undo); list is read-only. Use when: recording, editing, removing, listing, or promoting story beats. Do NOT use when: recording a durable world fact — use manage_lore (action: set).
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Optional lore key (promote). | |
| type | No | Story entry type (record/update). | |
| entry | No | Story entry text (record/update). | |
| index | No | Story entry index (update/remove/promote). | |
| limit | No | Optional page size (list). | |
| action | Yes | record, update, remove, list, or promote. | |
| filter | No | Optional type filter (list). | |
| offset | No | Optional pagination offset (list). | |
| turn_handle | No | Turn handle minted by take_turn (record); consumed on success. |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the crude profile (destructiveHint=true, non-idempotent). The description adds far more: decision and consequence entries are immutable and refuse update/promotion, mutations require the GM or Editor badge, changes persist to the Novel, and they are undoable via manage_history (action: undo), while list is read-only. It also discloses that record consumes the turn_handle minted by take_turn — a hidden side effect no annotation conveys.
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?
It is front-loaded on the resource, then the per-action inventory, then the when/when-not routing — a sensible order with no filler sentences. The single dense paragraph is slightly run-on for nine parameters, but every clause carries information.
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 nine-parameter, five-action mutation tool the description covers action semantics, immutability constraints, permissions, side effects, undo path, and sibling exclusion; return values are covered by the existing output schema, so nothing an agent needs 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?
Schema coverage is 100%, so the baseline is 3, but the description goes further by binding parameters to actions: turn_handle is consumed on record, index applies to update/remove/promote, and list uses filter with offset/limit returning previews unless detail is set. It doesn't cover formatting expectations for entry text, so it stops short of a 5.
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 names a specific resource (the story journal) and then defines each of the five actions — record, update, remove, list, promote — with concrete semantics. It distinguishes itself from siblings by naming manage_lore for durable world facts, so an agent can route correctly 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit "Use when: recording, editing, removing, listing, or promoting story beats" and "Do NOT use when: recording a durable world fact — use manage_lore (action: set)." That is a named alternative plus the condition that selects it, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_synthesisSynthesis ManagementADestructive
Manage synthesis content (voice examples, lore templates, action patterns, and other Ruleset Wisdom). Mutating actions (run, revert, activate, deactivate, toggle, toggle_action, player_add, player_remove, record_ruling, revert_ruling) persist to the Novel and are audited; read-only actions (list, player_list, verify) do not mutate state. verify checks each item's stored citation locally and reports pass/weak/unsupported; it never fetches and never changes state. record_ruling writes a ruling and its verified citations to the GM-only ruling ledger; revert_ruling marks a ledger entry reverted; ruling_list reads the ledger newest-first. Undo the latest mutation with manage_history. activate/deactivate with key omitted act on the whole module. Use when: running, reverting, listing, activating, deactivating, toggling, verifying, recording or reading rulings, or player-authoring items. Do NOT use when: browsing the codex — use manage_codex (action: list).
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | Item key (activate: number; player_add/player_remove/verify/record_ruling: string). | |
| force | No | Re-run even if unchanged (run). | |
| query | No | Question the ruling answers (record_ruling). | |
| action | Yes | run, revert, list, activate, deactivate, toggle, toggle_action, player_add, player_remove, player_list, verify, record_ruling, revert_ruling, or ruling_list. | |
| detail | No | Return full entries (list). | |
| module | No | Synthesis module (activate/deactivate/toggle/player_*/list/verify/record_ruling). | |
| ruling | No | Ruling text to record (record_ruling). | |
| content | No | Item content (player_add). | |
| enabled | No | Enable or disable (toggle). | |
| triggers | No | Recall triggers (player_add). | |
| ruling_id | No | Ledger entry id (revert_ruling). | |
| badge_scope | No | shared or player (player_add). | |
| max_entries | No | Maximum rulings to return, newest first (ruling_list; default 20). | |
| include_reverted | No | Include reverted rulings (ruling_list; default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag a destructive, non-idempotent, non-read-only tool, and the description goes well beyond that by splitting the action enum into mutating vs read-only sets, stating mutations are audited and persist to the Novel, clarifying that verify is purely local and never fetches, and describing the GM-only ruling ledger lifecycle (record/revert/list newest-first). It even discloses the edge case that activate/deactivate with key omitted act on the whole module.
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?
Front-loaded with purpose, then the mutation/read-only split, then per-action clarifications, then the when/when-not block — a good information hierarchy. It is dense and slightly sprawling for a single sentence-chain, but nearly every clause carries distinct operational information, so waste is minimal.
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 14-parameter, 14-action multiplexed tool with an output schema already present, the description supplies everything an agent needs to pick the right action, understand side effects, and know where to go for undo or adjacent resources. Return-value detail is correctly omitted since the output schema covers it.
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 100% and each parameter already names its owning action, so the schema does the bulk of the work. The description still adds value the schema lacks: the whole-module behavior when key is omitted, ruling_list ordering (newest-first), and the verify pass/weak/unsupported outcome vocabulary.
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?
Opens with a specific verb+resource ('Manage synthesis content') and names the concrete content types (voice examples, lore templates, action patterns, Ruleset Wisdom). It routes away from the nearest lookalike sibling twice (manage_history for undo, manage_codex for browsing), so an agent can distinguish it without opening any schema.
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?
Explicit 'Use when:' enumeration covers every intent the tool serves, and 'Do NOT use when: browsing the codex — use manage_codex (action: list)' names the alternative and the condition selecting it. Undo routing to manage_history is also spelled out, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_vowVow ManagementADestructive
Track narrative vows, quests, and obligations with milestones. set creates a vow and links a countdown whose ticks follow the difficulty rank track (scope defaults to shared); milestone advances progress; resolve and forsake close the vow with distinct outcomes (fulfilled vs abandoned). Mutations require the GM or Editor badge, persist to the Novel, and are undoable via manage_history (action: undo); resolve and forsake are terminal in the forward direction. Use when: setting, advancing, resolving, forsaking, or listing vows. Do NOT use when: starting a clock timer — use manage_countdown (action: set).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Vow name (set). | |
| scope | No | game_master, shared, faction, or party (set). | |
| action | Yes | set, milestone, resolve, forsake, or list. | |
| reason | No | The reason for abandoning (forsake). | |
| outcome | No | The resolution outcome (resolve). | |
| parties | No | Parties bound by the vow (set). | |
| vow_name | No | Vow name (milestone/resolve/forsake). | |
| difficulty | No | troublesome, dangerous, formidable, extreme, or epic (set). | |
| description | No | Vow description (set). | |
| consequences | No | Optional consequences (resolve). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint=true annotation: it states the auth requirement (GM or Editor badge), persistence target (the Novel), the recovery path (undoable via manage_history action: undo), and the asymmetry that resolve/forsake are terminal forward-only. The one gap is that 'destructiveHint' is not reconciled — the description never says what milestone/forsake destroy or whether they overwrite prior state, which matters for a destructive 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?
Front-loaded with purpose, then action semantics, then auth/undo, then use/don't-use routing — a logical order with no filler sentences. The action-semantics clause is dense enough that a skimming agent could miss the resolve/forsake distinction, keeping it just under a 5.
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 10-parameter, 5-action mutation tool with an output schema, the description covers everything an agent needs to call it correctly: permissions, terminality, undo route, action-level effects, and the sibling it must not be confused with. Return values are correctly left to the output schema.
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 100%, so baseline 3 applies, and the description earns a bump by tying parameters to actions (name/difficulty/scope/parties for set; outcome/consequences for resolve; reason for forsake) and by disclosing the undocumented default that scope defaults to 'shared'. It still doesn't explain the difficulty→countdown-tick mapping concretely or why both 'name' and 'vow_name' exist.
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?
Opens with a specific verb+resource ('Track narrative vows, quests, and obligations with milestones') and then enumerates what each action value does — set creates and links a countdown, milestone advances, resolve/forsake close with distinct outcomes. An agent can distinguish this from the many sibling 'manage_*' tools 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'Use when:' list covers all five actions, and 'Do NOT use when:' names the confusable sibling and the exact alternative call (manage_countdown, action: set) for the timer case. This is the highest tier of routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_worldWorld Model ManagementADestructive
Manage the world model — rooms, things, exits, and their spatial properties. create and update mutate in place and persist to the Novel; all mutations are audited; remove is permanent and requires re-creation; convert replaces the described subtree; generate creates rooms from installed table pools bounded by TTRPG_WORLD_GEN_MAX_ROOMS. create_exit links both directions; create_thing honors location_type only when location is set, and kind forces property defaults. There are no read-only actions here; inspect state with run_command (action: execute). Use when: creating, updating, removing, bulk-converting, or generating locations and objects. Do NOT use when: navigating the world — use run_command (action: execute); proposing objective-state transitions — use manage_causality; recording what an entity believes — use manage_belief.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Destination room alias for room_b (create_exit). | |
| key | No | Bound key thing name required to unlock or lock this thing when lockable (create_thing/update_thing). | |
| lit | No | When true the thing is lit (create_thing/update_thing). | |
| from | No | Source room alias for room_a (create_exit). | |
| kind | No | Optional thing kind (create_thing). | |
| name | No | Room/thing name (create/update/remove). | |
| room | No | Source room (create_exit/remove_exit). | |
| seed | No | Deterministic seed (generate). | |
| fixed | No | When true the thing cannot be taken (create_thing/update_thing). | |
| noise | No | Auditory cue text reported by listen (create_thing/update_thing). | |
| scent | No | Olfactory cue text reported by smell (create_thing/update_thing). | |
| action | Yes | World: create_room, update_room, remove_room, create_thing, update_thing, remove_thing, create_exit, remove_exit, convert, or generate. Causal: causal_propose, causal_admit, causal_reject, causal_list, causal_state, or causal_ingress. | |
| edible | No | When true the thing can be eaten (create_thing/update_thing). | |
| locked | No | When true the thing starts locked (create_thing/update_thing). | |
| room_a | No | Source room (create_exit). | |
| room_b | No | Destination room (create_exit). | |
| source | No | Hybrid world-model source text (convert). | |
| options | No | Generation options (generate): roles maps installed table names to room, objects, persons, or hazards pools; rooms requests a count bounded by TTRPG_WORLD_GEN_MAX_ROOMS. | |
| location | No | Optional containing room or thing (create_thing/update_thing). | |
| lockable | No | When true the thing can be locked (create_thing/update_thing). | |
| openable | No | When true the thing can be opened (create_thing/update_thing). | |
| readable | No | When true the thing can be read (create_thing/update_thing). | |
| wearable | No | When true the thing can be worn (create_thing/update_thing). | |
| climbable | No | When true the thing can be climbed (create_thing/update_thing). | |
| direction | No | Direction (create_exit/remove_exit). | |
| drinkable | No | When true the thing can be drunk (create_thing/update_thing). | |
| enterable | No | When true the thing can be entered (create_thing/update_thing). | |
| read_text | No | Text revealed when the thing is read (create_thing/update_thing). | |
| switchable | No | When true the thing can be switched (create_thing/update_thing). | |
| description | No | Optional description (create/update). | |
| switched_on | No | When true the thing is switched on (create_thing/update_thing). | |
| transparent | No | When true the thing is transparent (create_thing/update_thing). | |
| location_type | No | Where the thing is placed (create_thing). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantial context: mutations are audited and persisted, remove requires re-creation, convert replaces the described subtree, generate is bounded by TTRPG_WORLD_GEN_MAX_ROOMS, create_exit links both directions, and create_thing honors location_type only when location is set. These are non-obvious behavioral traits beyond the annotation flags.
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?
Front-loaded with purpose, then behavior, then routing. Dense but every clause carries decision-relevant information (audit, permanence, env bound, conditional param rules). Semicolon-separated clauses make it slightly harder to scan than ideal, but the length is justified by 10 sub-actions and 33 parameters.
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?
Output schema exists and annotations cover the safety profile, so the description does not need to explain return values. Combined with 100% schema coverage and the explicit use/when-not routing, an agent has everything needed to pick this tool and the correct action.
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 100%, so baseline is 3. The description adds cross-parameter semantics the schema does not: location_type is only honored when location is provided, and kind forces property defaults. It does not clarify most of the 33 parameters, but it adds real conditional meaning for a few high-value ones.
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?
Explicit verb-plus-resource: 'Manage the world model — rooms, things, exits', and it enumerates the semantics of each sub-action (create/update mutate in place, remove is permanent, convert replaces subtree, generate pulls from table pools). It also names the exact sibling tools it is not (run_command, manage_causality, manage_belief), so an agent can distinguish it without opening schemas.
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?
Contains explicit 'Use when:' and 'Do NOT use when:' blocks with alternatives for each exclusion. Navigation goes to run_command (action: execute), objective-state transitions to manage_causality, entity beliefs to manage_belief. This is the strongest kind of routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_sessionOpen Play SessionADestructive
Open a play session by resuming a Novel, activating a badge, and returning a recap. novel selects the slug and badge the seat; both are optional and fall back to the active Novel and current badge; resume and badge changes persist and are audited. Use when: starting or resuming a session, especially after a restart. Do NOT use when: creating a Novel — use manage_novel (action: create); running a turn — use take_turn. Revert with manage_history (action: undo).
| Name | Required | Description | Default |
|---|---|---|---|
| badge | No | Badge to activate (open_session). | |
| novel | No | Novel slug to resume (open_session). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, and the description adds real context beyond that: changes persist, are audited, and both parameters silently fall back to active defaults. It does not explain what the destructive behavior actually overwrites (e.g., whether an existing badge or session state is clobbered), which is the one thing an agent calling a destructive tool most needs.
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?
Front-loaded with the action, then defaults, then use/don't-use routing and the revert path – every clause carries information. Slightly dense in places (the long compound first sentence, jargon like 'badge the seat'), but no wasted sentences.
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?
Strong coverage for a mutation tool: output schema handles the recap return value and annotations carry the safety profile, so the description only needs routing and default behavior, which it supplies. The remaining gap is the unexplained destructive consequence, which would matter more if annotations were absent.
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 100% schema coverage the baseline is 3, and the description earns a step up by explaining that both parameters are optional and default to the active Novel and current badge. That fallback semantics is behavior the schema's per-field descriptions do not convey.
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?
States a specific verb and resource with its composite effects: opening a session by resuming a Novel, activating a badge, and returning a recap. This is clearly distinguishable from siblings like take_turn, manage_novel, and close_session without opening any schema.
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?
Explicit 'Use when' (starting/resuming a session, especially after a restart) and 'Do NOT use when' clauses route to named alternatives: manage_novel (action: create) for creating, take_turn for running a turn, and manage_history (action: undo) as the revert path. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_mechanicResolve MechanicsADestructive
Resolve uncertain actions across the host's base mechanics: Fate Fudge dice, aspects, Fate points, and stress; Ironsworn momentum, moves, and progress; Forged action rolls, stress, trauma, and downtime; and generic ruleset table rolls. Rolls and state changes persist to the Novel and are audited; a roll with no following write is flagged as an uncommitted roll. Revert the most recent mutation with manage_history (action: undo). fate_roll uses dF, ironsworn_move compares an action die against two challenge dice, and forged_action_roll takes the highest of a d6 pool. Use when: resolving a Fate, Ironsworn, or Forged mechanic, or rolling on a ruleset generation table. Do NOT use when: resolving a ruleset skill check — use the bound ruleset's roll tools; managing vows — use manage_vow (action: set).
| Name | Required | Description | Default |
|---|---|---|---|
| op | No | Sub-operation for aspect, fate_point, stress, momentum, progress, or downtime. | |
| adds | No | Stat and bonuses added to the action die (ironsworn_move). | |
| burn | No | Burn momentum to replace the action score (ironsworn_move). | |
| cost | No | Stress cost to resist (forged_stress); defaults to 2. | |
| dice | No | Fudge dice notation (fate_roll) or dice pool size (forged_action_roll). | |
| name | No | Aspect name, progress-track name, move name, action name, or consequence label. | |
| rank | No | Progress-track rank (ironsworn_progress). | |
| seed | No | Deterministic seed (fate_roll, ironsworn_move, ironsworn_progress, forged_action_roll, roll). | |
| slug | No | Ruleset slug for a Novel-independent roll (roll). | |
| skill | No | Skill name for the roll label (fate_roll). | |
| table | No | Generation table to roll on (roll). | |
| ticks | No | Progress to mark (ironsworn_progress); defaults to 1. | |
| track | No | Stress track to mark or clear (fate_stress). | |
| action | Yes | roll (ruleset table), fate_* (Fate), ironsworn_* (Ironsworn), or forged_* (Forged in the Dark). | |
| amount | No | Fate points (fate_point), stress (fate_stress, forged_stress, forged_downtime), or momentum (ironsworn_momentum); defaults to 1. | |
| effect | No | Effect (forged_action_roll); defaults to standard. | |
| shifts | No | Shifts to mark on a stress track (fate_stress); defaults to 1. | |
| target | No | Aspect target: 'scene' or an entity/NPC id (fate_aspect); defaults to 'scene'. | |
| modifier | No | Skill rating added to the roll (fate_roll). | |
| position | No | Position (forged_action_roll); defaults to risky. | |
| entity_id | No | Entity or NPC id (fate_aspect, fate_point, fate_stress, ironsworn_momentum, ironsworn_move, forged_stress, forged_downtime). | |
| difficulty | No | Opposition to beat (fate_roll); defaults to 0. | |
| consequence | No | Consequence to record or clear (fate_stress). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite the annotations only giving a generic destructive/non-idempotent profile, the description discloses the concrete behavioral contract: rolls and state changes persist to the Novel, are audited, and a roll with no following write is flagged as an uncommitted roll. It also supplies the recovery path (revert the most recent mutation via manage_history with action: undo), which is exactly the context an agent needs before making an irreversible mutation.
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?
Purpose, persistence/audit behavior, undo path, dice mechanics, and use/exclusion guidance are all front-loaded with no filler sentences. The paragraph is dense — a single block packing four distinct concerns — but every sentence carries information an agent needs.
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 an 11-action, 23-parameter mutation tool the description covers the family taxonomy, the audit/undo contract, and the notable roll mechanics; an output schema exists so return values need no explanation. It stops short of explaining the 'op' sub-operation axis or what each of the state-mutating actions (fate_aspect, ironsworn_momentum, forged_downtime) does, leaving that to the schema.
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 100%, so the baseline is 3, but the description adds real meaning at the dispatch level: it explains that fate_roll uses dF, ironsworn_move compares an action die against two challenge dice, and forged_action_roll takes the highest of a d6 pool. It does not add per-parameter guidance (e.g., how 'op' sub-operations interact with 'action'), which caps this below 5.
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 opening sentence names a specific verb ('Resolve') and enumerates the exact resources covered: Fate Fudge dice/aspects/Fate points/stress, Ironsworn momentum/moves/progress, Forged action rolls/stress/trauma/downtime, and generic table rolls. It explicitly distinguishes itself from the sibling ruleset roll tools and manage_vow, so an agent can route correctly without opening any schema.
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 contains an explicit 'Use when' clause (resolving a Fate, Ironsworn, or Forged mechanic, or rolling on a ruleset generation table) and an explicit 'Do NOT use when' clause naming two alternatives with the sibling and action to use instead (ruleset roll tools; manage_vow action: set). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
respond_decisionRespond to Workflow DecisionADestructive
Answer a pending workflow decision, atomically draining it and persisting the outcome to the Novel. option must match one of the emitted choices; 'cancel' aborts the workflow and restores its pre-workflow snapshot, while any applied outcome is not reversible. The drain is mutating and audited, and a second call with no pending decision returns STATE_CONFLICT. Use when: the server emitted a [NEED_INPUT] prompt and the caller must choose. Do NOT use when: no decision is pending — use set_badge or a state tool instead.
| Name | Required | Description | Default |
|---|---|---|---|
| option | Yes | The chosen option, or 'cancel' to abort the workflow and restore its snapshot. | |
| decision | Yes | The canonical decision text the workflow is waiting on. |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, but the description adds substantial context beyond them: the drain is atomic and audited, 'cancel' restores the pre-workflow snapshot, an applied outcome is not reversible, and a second call returns STATE_CONFLICT. These are the exact behavioral facts an agent needs before committing.
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?
Effect-first opening sentence, then constraints, then explicit Use/Do-NOT-use blocks — all front-loaded with no filler. Every clause carries either a selection rule or a behavioral consequence.
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 destructive, non-idempotent mutation with two required params, the description covers prerequisites (pending decision), irreversibility, snapshot restore, and the STATE_CONFLICT failure mode; an output schema exists so return values need no 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 100%, so the baseline is 3, but the description adds a real constraint the schema lacks: option must match one of the emitted choices, and the cancel path's snapshot-restore semantics. It stops short of describing the 'decision' parameter's matching rules, so it is not a 5.
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?
States a specific verb and resource ('Answer a pending workflow decision'), plus the effects (atomic drain, persist to Novel). It clearly distinguishes itself from siblings by naming set_badge and a state tool as the alternative when nothing is pending.
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 'Use when: the server emitted a [NEED_INPUT] prompt' and 'Do NOT use when: no decision is pending', and names the concrete alternatives. There is no inference required to select this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_commandParser CommandADestructive
Run the spatial parser: execute a parsed command, resolve a movement outcome, or map an intent to tool calls. execute accepts free-form text, mutates world and entity state, persists, and is audited; a mistaken move is reversed by issuing the inverse command because no undo snapshot is taken. resolve computes the same movement without mutating, and suggest returns recommended calls without executing them; source and target apply only to perception queries. On a ruleset-bound Novel the parser is GM-only for navigation and mutation, while the Player badge keeps read-only perception commands. Use when: a player or narrator takes a physical action, needs a movement outcome without mutating, or wants intent mapped to tools. Do NOT use when: the GM creates or edits the model — use manage_world; durable world facts — use manage_lore.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | execute (parser), resolve (non-mutating intent), suggest (intent → tool calls), visibility (can one actor see another or a thing), or audibility (can one actor hear another). Defaults to execute. | |
| intent | No | The intent to resolve or map (resolve/suggest). | |
| source | No | Observing actor for visibility/audibility (defaults to the active entity). | |
| target | No | Actor or thing being seen or heard (visibility/audibility). | |
| command | No | The natural-language command (execute). | |
| entity_id | No | Optional entity context (suggest). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that execute mutates world and entity state, persists, and is audited; that no undo snapshot is taken so a mistaken move must be reversed with the inverse command; and that resolve/suggest are non-mutating. It also states an authorization rule (GM-only navigation/mutation on a ruleset-bound Novel, Player badge limited to read-only perception) that no annotation conveys. This is consistent with destructiveHint=true and readOnlyHint=false.
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?
Front-loaded with the mode breakdown before the operational caveats, and every sentence carries content (mutation/persistence, no undo, permission model, use/don't-use). It is dense and long for a description, but the density is justified by five distinct modes; splitting the permission sentence out would improve scannability.
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?
An output schema exists, so return values need no explanation; the description instead covers the dimensions that matter for a destructive, multi-mode, permission-gated tool: which action mutates, how to recover from a bad mutation, and who is allowed to call it. Nothing material is missing for correct invocation.
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 100%, so baseline would be 3, but the description adds cross-parameter meaning the schema does not: which modes consume free-form text ('execute accepts free-form text') and the scoping rule that 'source and target apply only to perception queries'. That conditional applicability is genuinely useful for avoiding wasted arguments on resolve/suggest.
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?
Opens with a specific verb and resource ('Run the spatial parser') and then enumerates the three primary modes - execute, resolve, suggest - plus the perception modes visibility/audibility. It explicitly separates itself from manage_world and manage_lore, so an agent can pick it out of a crowded 34-tool sibling list 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains explicit 'Use when:' triggers (a player or narrator takes a physical action, needs a movement outcome without mutating, wants intent mapped to tools) and explicit 'Do NOT use when:' exclusions that name the correct alternatives (manage_world for model creation/editing, manage_lore for durable world facts). This is the when/when-not/alternatives pattern at full strength.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_badgeSet Active BadgeADestructive
Switch the active badge to player, game_master, observer, or none (Editor), gating tool access server-side for the active Novel; always callable. The badge is per Novel and switching re-filters tools/list immediately, so a narrower badge can revoke tools mid-task and switching back restores them; badge changes are mutating session state, audited, and reversible by switching back. Use when: entering the story, spectating, or stepping away to edit. Do NOT use when: answering a pending workflow decision — use respond_decision.
| Name | Required | Description | Default |
|---|---|---|---|
| badge | Yes | The badge to activate: player, game_master, observer, or none (Editor). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses that access is gated server-side for the active Novel, that tools/list is re-filtered immediately, that a narrower badge can revoke tools mid-task, and that changes are audited and reversible. This meaningfully expands on destructiveHint=true, which alone would not tell an agent that the 'destruction' is revocable tool-access loss.
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?
Front-loads the core action and the value list, then layers usage and exclusion in tight labeled clauses; the density is high but nearly every clause carries operational information, though the single opening sentence is long.
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?
Covers scope, side effects, reversibility, auditability, timing of the tools/list re-filter, and an explicit exclusion; with an output schema present, no return-value explanation is needed. Nothing an agent needs to call it safely 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?
Schema coverage is 100% and the enum is fully documented, so the baseline is 3; the description's only added nuance is the per-Novel scoping of the badge, which is about behavior rather than the parameter itself.
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?
States a precise verb+resource ("Switch the active badge") and enumerates the exact target values plus per-Novel scope, so it is unmistakable against siblings like manage_session or respond_decision.
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?
Explicit "Use when: entering the story, spectating, or stepping away to edit" and an explicit exclusion routing pending workflow decisions to respond_decision -- a named alternative with the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_turnTake Play TurnARead-onlyIdempotent
Resolve a player intent through the parser and mint a turn handle for the story record. The turn is read-only and non-persistent: no Novel state is mutated; the handle is session-scoped, single-use, and consumed by manage_story (action: record), though recording without it still works. Use when: taking a turn before recording its outcome. Do NOT use when: resolving a specific combat round — use manage_combat (action: advance); rolling a ruleset check — use resolve_mechanic (action: roll).
| Name | Required | Description | Default |
|---|---|---|---|
| intent | Yes | Player intent to resolve (take_turn). | |
| entity_id | No | Acting entity id (take_turn). |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a). |
| status | Yes | Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real value beyond the annotations: non-persistent, no Novel state mutated, handle is session-scoped and single-use, consumed by manage_story (action: record), and recording works even without it. Slight tension with idempotentHint=true, since each call mints a fresh single-use handle; the description does not reconcile repeated-call behavior, which keeps it from a 5.
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?
Front-loaded with the core action, then lifecycle, then use/don't-use routing — every clause carries distinct information. Slightly dense, with the handle-consumption detail packed mid-sentence, but no filler.
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 2-parameter tool with full schema coverage, an output schema, and complete annotations, the description supplies the missing pieces: persistence semantics, handle lifecycle, the downstream consumer, and graceful degradation if the handle is skipped. Nothing an agent needs to call it correctly is absent.
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%, so 'intent' and 'entity_id' are already documented; the description only adds the notion that intent is fed to the parser. Baseline 3 applies since the schema carries the parameter burden.
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?
States a specific verb chain and resource: resolve a player intent through the parser and mint a turn handle for the story record. It also explicitly distinguishes itself from manage_combat and resolve_mechanic, so an agent can route between them without opening any schema.
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?
Gives an explicit 'Use when: taking a turn before recording its outcome' plus two named 'Do NOT use when' cases with the exact alternative tool and action (manage_combat advance, resolve_mechanic roll). This is the strongest form of routing guidance.
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.
3 tool updates
v2026.10.16- Changed
manage_identity2 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"stage, accept, reject, list, snapshot, or bootstrap."New value: +"stage, accept, reject, revert, list, snapshot, or bootstrap." - changed
Input schema / properties / action / enumPrevious value: -[ - "stage", - "accept", - "reject", - "list", - "snapshot", - "bootstrap" -]New value: +[ + "stage", + "accept", + "reject", + "revert", + "list", + "snapshot", + "bootstrap" +]
- Changed
manage_scene11 fields changed- removed
Input schema / properties / after_userRemoved value: -{ - "description": "Reset the pooled spoken-set for a new user turn (next_speaker).", - "type": "boolean" -} - removed
Input schema / properties / confirmationRemoved value: -{ - "description": "Confirmation mode (autonomy).", - "enum": [ - "auto", - "confirm", - "prompt" - ], - "type": "string" -} - removed
Input schema / properties / creativityRemoved value: -{ - "description": "Creativity (autonomy).", - "enum": [ - "predictable", - "standard", - "chaotic" - ], - "type": "string" -} - removed
Input schema / properties / entity_idsRemoved value: -{ - "description": "Entities present (presence).", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / forceRemoved value: -{ - "description": "NPC forced as the next speaker (cast/next_speaker).", - "type": "string" -} - removed
Input schema / properties / levelRemoved value: -{ - "description": "Autonomy level (autonomy).", - "enum": [ - "full", - "mechanical_prompt", - "manual" - ], - "type": "string" -} - removed
Input schema / properties / muteRemoved value: -{ - "description": "NPC muted from speaker selection (cast).", - "type": "string" -} - removed
Input schema / properties / safetyRemoved value: -{ - "description": "Safety tier (autonomy).", - "enum": [ - "safe", - "moderate", - "hardcore" - ], - "type": "string" -} - removed
Input schema / properties / selectRemoved value: -{ - "description": "NPC selected as the manual speaker (cast/next_speaker).", - "type": "string" -} - removed
Input schema / properties / strategyRemoved value: -{ - "description": "Speaker-selection strategy (cast).", - "enum": [ - "manual", - "natural", - "list", - "pooled" - ], - "type": "string" -} - removed
Input schema / properties / unmuteRemoved value: -{ - "description": "NPC restored to speaker selection (cast).", - "type": "string" -}
- Changed
manage_world10 fields changed- removed
Input schema / properties / causal_domainRemoved value: -{ - "description": "location or scalar (causal_propose; default location).", - "enum": [ - "location", - "scalar" - ], - "type": "string" -} - removed
Input schema / properties / causal_entityRemoved value: -{ - "description": "Entity whose objective state is proposed (causal_propose).", - "type": "string" -} - removed
Input schema / properties / causal_expected_versionRemoved value: -{ - "description": "Optimistic version guard (causal_propose).", - "type": "number" -} - removed
Input schema / properties / causal_fromRemoved value: -{ - "description": "Expected prior value (causal_propose).", - "type": [ - "string", - "number", - "boolean", - "null" - ] -} - removed
Input schema / properties / causal_keyRemoved value: -{ - "description": "State key within the entity (causal_propose).", - "type": "string" -} - removed
Input schema / properties / causal_origin_sourceRemoved value: -{ - "description": "narrative, machine, or ruleset (causal_propose).", - "enum": [ - "narrative", - "machine", - "ruleset" - ], - "type": "string" -} - removed
Input schema / properties / causal_proposal_idRemoved value: -{ - "description": "Recorded proposal id (causal_admit/causal_reject).", - "type": "string" -} - removed
Input schema / properties / causal_scopeRemoved value: -{ - "description": "Scope coordinate (causal_propose; default the active Novel slug).", - "type": "string" -} - removed
Input schema / properties / causal_source_ordinalRemoved value: -{ - "description": "Contributing event-log ordinal (causal_propose; default the latest event).", - "type": "number" -} - removed
Input schema / properties / causal_valueRemoved value: -{ - "description": "Proposed value (causal_propose/causal_ingress).", - "type": [ - "string", - "number", - "boolean", - "null" - ] -}
8 tool updates
v2026.10.15- Changed
manage_causality4 fields changed- removed
Input schema / properties / causal_from / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Input schema / properties / causal_from / typeAdded value: +[ + "string", + "number", + "boolean", + "null" +] - removed
Input schema / properties / causal_value / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Input schema / properties / causal_value / typeAdded value: +[ + "string", + "number", + "boolean", + "null" +]
- Changed
manage_diagnostics2 fields changed- removed
Input schema / properties / category / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / category / typeAdded value: +[ + "string", + "null" +]
- Changed
manage_lore2 fields changed- removed
Input schema / properties / group / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / group / typeAdded value: +[ + "string", + "null" +]
- Changed
manage_ruleset2 fields changed- removed
Input schema / properties / wisdom / items / properties / key / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / wisdom / items / properties / key / typeAdded value: +[ + "string", + "number" +]
- Changed
manage_scene2 fields changed- removed
Input schema / properties / adventure_scene / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / adventure_scene / typeAdded value: +[ + "string", + "null" +]
- Changed
manage_synthesis2 fields changed- removed
Input schema / properties / key / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / key / typeAdded value: +[ + "string", + "number" +]
- Changed
manage_world4 fields changed- removed
Input schema / properties / causal_from / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Input schema / properties / causal_from / typeAdded value: +[ + "string", + "number", + "boolean", + "null" +] - removed
Input schema / properties / causal_value / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } -] - added
Input schema / properties / causal_value / typeAdded value: +[ + "string", + "number", + "boolean", + "null" +]
- Changed
resolve_mechanic2 fields changed- removed
Input schema / properties / dice / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / dice / typeAdded value: +[ + "string", + "number" +]
18 tool updates
v2026.10.13- Changed
manage_agent1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "Return full agent tasks instead of summary entries (list).", + "type": "boolean" +}
- Changed
manage_archive14 fields changed- removed
Input schema / properties / codex_adventureRemoved value: -{ - "description": "Codex adventure to seed from (create).", - "type": "string" -} - removed
Input schema / properties / current_sceneRemoved value: -{ - "description": "Current-scene summary (save_context).", - "type": "string" -} - removed
Input schema / properties / descriptionRemoved value: -{ - "description": "Description (create/description).", - "type": "string" -} - removed
Input schema / properties / detailRemoved value: -{ - "description": "Return full metadata (list).", - "type": "boolean" -} - removed
Input schema / properties / filterRemoved value: -{ - "description": "active, archived, or all (list).", - "enum": [ - "active", - "archived", - "all" - ], - "type": "string" -} - removed
Input schema / properties / genreRemoved value: -{ - "description": "Genre tag (create/genre).", - "type": "string" -} - removed
Input schema / properties / immediate_situationRemoved value: -{ - "description": "Immediate situation (save_context).", - "type": "string" -} - removed
Input schema / properties / long_term_plansRemoved value: -{ - "description": "Long-term plans (save_context).", - "type": "string" -} - removed
Input schema / properties / nameRemoved value: -{ - "description": "Novel name (create).", - "type": "string" -} - removed
Input schema / properties / new_slugRemoved value: -{ - "description": "New slug (rename).", - "type": "string" -} - removed
Input schema / properties / pending_player_actionRemoved value: -{ - "description": "Pending player action (save_context).", - "type": "string" -} - removed
Input schema / properties / player_goalsRemoved value: -{ - "description": "Player goals (save_context).", - "type": "string" -} - removed
Input schema / properties / rulesetRemoved value: -{ - "description": "Ruleset slug (create).", - "type": "string" -} - removed
Input schema / properties / short_term_plansRemoved value: -{ - "description": "Short-term plans (save_context).", - "type": "string" -}
- Changed
manage_belief9 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Belief: list, get, evidence, admit, retract, conflicts, or reconcile. Perception ledger: perception_record, perception_list, perception_for_entity, or perception_for_event."New value: +"Belief: list, get, evidence, admit, retract, conflicts, or reconcile. Perception ledger: perception_record, perception_list, perception_for_entity, or perception_for_event. Knowledge: knowledge_query." - changed
Input schema / properties / action / enumPrevious value: -[ - "list", - "get", - "evidence", - "admit", - "retract", - "conflicts", - "reconcile", - "perception_record", - "perception_list", - "perception_for_entity", - "perception_for_event" -]New value: +[ + "list", + "get", + "evidence", + "admit", + "retract", + "conflicts", + "reconcile", + "knowledge_query", + "perception_record", + "perception_list", + "perception_for_entity", + "perception_for_event" +] - added
Input schema / properties / detailAdded value: +{ + "description": "Return full belief records instead of summary entries (list).", + "type": "boolean" +} - added
Input schema / properties / perception_confidenceAdded value: +{ + "description": "0..1 confidence (perception_record; default 0; REQ-594).", + "maximum": 1, + "minimum": 0, + "type": "number" +} - added
Input schema / properties / perception_room_idAdded value: +{ + "description": "Room identifier for the perception (perception_record; defaults to the entity's room).", + "type": "string" +} - added
Input schema / properties / perception_senseAdded value: +{ + "description": "Sense that produced the perception (perception_record; default null; REQ-594).", + "enum": [ + "sight", + "sound", + "telling" + ], + "type": "string" +} - added
Input schema / properties / perception_source_entityAdded value: +{ + "description": "Entity the perception came from (perception_record; default null).", + "type": "string" +} - added
Input schema / properties / perception_witnessAdded value: +{ + "description": "Witness kind (perception_record; default inferred; REQ-594).", + "enum": [ + "saw", + "heard", + "inferred", + "told" + ], + "type": "string" +} - added
Input schema / properties / topicAdded value: +{ + "description": "Optional topic filter applied to knowledge_query perceptions, beliefs, and secrets.", + "type": "string" +}
- Changed
manage_causality29 fields changed- removed
Input schema / properties / climbableRemoved value: -{ - "description": "When true the thing can be climbed (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / descriptionRemoved value: -{ - "description": "Optional description (create/update).", - "type": "string" -} - removed
Input schema / properties / directionRemoved value: -{ - "description": "Direction (create_exit/remove_exit).", - "type": "string" -} - removed
Input schema / properties / drinkableRemoved value: -{ - "description": "When true the thing can be drunk (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / edibleRemoved value: -{ - "description": "When true the thing can be eaten (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / enterableRemoved value: -{ - "description": "When true the thing can be entered (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / fixedRemoved value: -{ - "description": "When true the thing cannot be taken (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / fromRemoved value: -{ - "description": "Source room alias for room_a (create_exit).", - "type": "string" -} - removed
Input schema / properties / keyRemoved value: -{ - "description": "Bound key thing name required to unlock or lock this thing when lockable (create_thing/update_thing).", - "type": "string" -} - removed
Input schema / properties / kindRemoved value: -{ - "description": "Optional thing kind (create_thing).", - "type": "string" -} - removed
Input schema / properties / litRemoved value: -{ - "description": "When true the thing is lit (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / locationRemoved value: -{ - "description": "Optional containing room or thing (create_thing/update_thing).", - "type": "string" -} - removed
Input schema / properties / location_typeRemoved value: -{ - "description": "Where the thing is placed (create_thing).", - "enum": [ - "room", - "container", - "supporter" - ], - "type": "string" -} - removed
Input schema / properties / lockableRemoved value: -{ - "description": "When true the thing can be locked (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / lockedRemoved value: -{ - "description": "When true the thing starts locked (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / nameRemoved value: -{ - "description": "Room/thing name (create/update/remove).", - "type": "string" -} - removed
Input schema / properties / openableRemoved value: -{ - "description": "When true the thing can be opened (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / read_textRemoved value: -{ - "description": "Text revealed when the thing is read (create_thing/update_thing).", - "type": "string" -} - removed
Input schema / properties / readableRemoved value: -{ - "description": "When true the thing can be read (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / roomRemoved value: -{ - "description": "Source room (create_exit/remove_exit).", - "type": "string" -} - removed
Input schema / properties / room_aRemoved value: -{ - "description": "Source room (create_exit).", - "type": "string" -} - removed
Input schema / properties / room_bRemoved value: -{ - "description": "Destination room (create_exit).", - "type": "string" -} - removed
Input schema / properties / seedRemoved value: -{ - "description": "Deterministic seed (generate).", - "type": "string" -} - removed
Input schema / properties / sourceRemoved value: -{ - "description": "Hybrid world-model source text (convert).", - "type": "string" -} - removed
Input schema / properties / switchableRemoved value: -{ - "description": "When true the thing can be switched (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / switched_onRemoved value: -{ - "description": "When true the thing is switched on (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / toRemoved value: -{ - "description": "Destination room alias for room_b (create_exit).", - "type": "string" -} - removed
Input schema / properties / transparentRemoved value: -{ - "description": "When true the thing is transparent (create_thing/update_thing).", - "type": "boolean" -} - removed
Input schema / properties / wearableRemoved value: -{ - "description": "When true the thing can be worn (create_thing/update_thing).", - "type": "boolean" -}
- Changed
manage_corpus12 fields changed- removed
Input schema / properties / badge_scopeRemoved value: -{ - "description": "game_master or shared (set/update).", - "enum": [ - "game_master", - "shared" - ], - "type": "string" -} - removed
Input schema / properties / contentRemoved value: -{ - "description": "Lore content (set/update).", - "type": "string" -} - removed
Input schema / properties / dataRemoved value: -{ - "description": "JSON or Markdown lorebook data (import).", - "type": "string" -} - removed
Input schema / properties / entity_idRemoved value: -{ - "description": "Entity to reveal to / whose knowledge to read (reveal/knowledge).", - "type": "string" -} - removed
Input schema / properties / formatRemoved value: -{ - "description": "Optional output format (export).", - "type": "string" -} - removed
Input schema / properties / groupRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Group name, or null to clear (set/update/group)." -} - removed
Input schema / properties / keyRemoved value: -{ - "description": "Lore key (set/update/remove/toggle/group/get).", - "type": "string" -} - removed
Input schema / properties / modeRemoved value: -{ - "description": "dry-run, merge, or replace (import).", - "enum": [ - "dry-run", - "merge", - "replace" - ], - "type": "string" -} - removed
Input schema / properties / priorityRemoved value: -{ - "description": "Optional priority (set/update).", - "type": "number" -} - removed
Input schema / properties / stickyRemoved value: -{ - "description": "Optional sticky weight (set/update).", - "type": "number" -} - removed
Input schema / properties / triggersRemoved value: -{ - "description": "Optional recall triggers (set/update).", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / world_targetRemoved value: -{ - "description": "Optional world-model target reference (set/set_secret).", - "type": "string" -}
- Changed
manage_countdown2 fields changed- changed
Input schema / properties / ticks / minimumPrevious value: -1New value: +0 - added
Input schema / properties / totalAdded value: +{ + "description": "Optional capacity for decrement refills (set; defaults to ticks).", + "minimum": 1, + "type": "number" +}
- Changed
manage_diagnostics8 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"health, compress, compact, subscribe, category, event, or history."New value: +"health, context_report, compress, compact, subscribe, category, event, history, verify, replay, visibility_check, or visibility_audit." - changed
Input schema / properties / action / enumPrevious value: -[ - "health", - "compress", - "compact", - "subscribe", - "category", - "event", - "history" -]New value: +[ + "health", + "context_report", + "compress", + "compact", + "subscribe", + "category", + "event", + "history", + "verify", + "replay", + "visibility_check", + "visibility_audit" +] - added
Input schema / properties / audienceAdded value: +{ + "description": "Audience badge for a visibility check (visibility_check; default the active badge).", + "enum": [ + "player", + "game_master", + "observer", + "none" + ], + "type": "string" +} - added
Input schema / properties / budget_tokensAdded value: +{ + "description": "Positive token budget for tier assembly (recap; REQ-592) or for ledger packing (context_report; REQ-610).", + "type": "number" +} - added
Input schema / properties / detailAdded value: +{ + "description": "discover response detail: summary (default) or schema (live input schemas for the matches; requires query; REQ-609).", + "enum": [ + "summary", + "schema" + ], + "type": "string" +} - added
Input schema / properties / ordinalsAdded value: +{ + "description": "Exact event ordinals to return in order (history; REQ-591).", + "items": { + "type": "number" + }, + "type": "array" +} - added
Input schema / properties / tierAdded value: +{ + "description": "Compression tier to assemble (recap; REQ-592).", + "enum": [ + "recent", + "session", + "arc", + "campaign" + ], + "type": "string" +} - added
Input schema / properties / to_eventAdded value: +{ + "description": "Target event ordinal for replay inspection (replay; default the newest retained entry).", + "type": "number" +}
- Changed
manage_faction1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "Return full faction records instead of summary entries (list).", + "type": "boolean" +}
- Changed
manage_lore14 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Lore: set, update, remove, toggle, group, suggest, list, get, export, import, set_secret, reveal, secret_list, or knowledge. Corpus: corpus_register, corpus_list, corpus_get, corpus_route, corpus_grant, corpus_deny, corpus_access, corpus_consume, or corpus_acquisitions."New value: +"set, update, remove, toggle, group, suggest, list, get, export, import, set_secret, reveal, secret_list, or knowledge." - removed
Input schema / properties / corpus_access_domainsRemoved value: -{ - "description": "Knowledge domains granted access (corpus_register).", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / corpus_access_publicRemoved value: -{ - "description": "Whether every entity may consume it (corpus_register; default false).", - "type": "boolean" -} - removed
Input schema / properties / corpus_bodyRemoved value: -{ - "description": "Document reference text (corpus_register).", - "type": "string" -} - removed
Input schema / properties / corpus_deniesRemoved value: -{ - "description": "Entity ids explicitly denied access (corpus_register).", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / corpus_document_idRemoved value: -{ - "description": "Corpus document id (corpus_get/corpus_route/corpus_grant/corpus_deny/corpus_consume).", - "type": "string" -} - removed
Input schema / properties / corpus_domainRemoved value: -{ - "description": "Knowledge domain (corpus_register/corpus_route/corpus_list).", - "type": "string" -} - removed
Input schema / properties / corpus_domainsRemoved value: -{ - "description": "Knowledge domains the entity may access (corpus_access).", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / corpus_entity_idRemoved value: -{ - "description": "Entity acquiring or inspected (corpus_consume/corpus_acquisitions/corpus_access/corpus_grant/corpus_deny).", - "type": "string" -} - removed
Input schema / properties / corpus_grantsRemoved value: -{ - "description": "Entity ids explicitly granted access (corpus_register).", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Input schema / properties / corpus_modeRemoved value: -{ - "description": "read, research, taught, or import (corpus_consume; default read).", - "enum": [ - "read", - "research", - "taught", - "import" - ], - "type": "string" -} - removed
Input schema / properties / corpus_source_profileRemoved value: -{ - "description": "Trusted source profile the domain is routed from (corpus_register; default manual).", - "type": "string" -} - removed
Input schema / properties / corpus_titleRemoved value: -{ - "description": "Document title (corpus_register).", - "type": "string" -} - added
Input schema / properties / detailAdded value: +{ + "description": "Return full lore entries instead of summary entries (list).", + "type": "boolean" +}
- Changed
manage_note1 field changed- added
Input schema / properties / detailAdded value: +{ + "description": "Return full server notes instead of summary entries (list_server).", + "type": "boolean" +}
- Changed
manage_npc12 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"create, update, remove, list, or get."New value: +"create, update, remove, list, get, import_card, or export_card." - changed
Input schema / properties / action / enumPrevious value: -[ - "create", - "update", - "remove", - "list", - "get" -]New value: +[ + "create", + "update", + "remove", + "list", + "get", + "import_card", + "export_card" +] - added
Input schema / properties / cardAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + ], + "description": "Character Card V3 JSON object or string (import_card)." +} - added
Input schema / properties / confirm_loreAdded value: +{ + "description": "Import the card's character_book as lore entries (import_card).", + "type": "boolean" +} - added
Input schema / properties / detailAdded value: +{ + "description": "Return full NPC records instead of summary entries (list).", + "type": "boolean" +} - added
Input schema / properties / licenseAdded value: +{ + "description": "Import license attestation (import_card).", + "type": "string" +} - added
Input schema / properties / mind / properties / identity_coreAdded value: +{ + "description": "Stable values, bonds, and taboos (GM only).", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / mind / properties / shared_notesAdded value: +{ + "description": "Always-known facts (GM only).", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / npc_id / descriptionPrevious value: -"NPC identifier (update/remove/get)."New value: +"NPC identifier (update/remove/get/export_card)." - added
Input schema / properties / personaAdded value: +{ + "description": "Optional values, traits, and mannerisms (create/update).", + "type": "string" +} - added
Input schema / properties / sourceAdded value: +{ + "description": "Import provenance URL or description (import_card).", + "type": "string" +} - added
Input schema / properties / talkativenessAdded value: +{ + "description": "Optional 0-100 social-scene speaking weight; default 50 (create/update).", + "maximum": 100, + "minimum": 0, + "type": "number" +}
- Changed
manage_ruleset3 fields changed- added
Input schema / properties / wisdom / items / properties / quoted_excerptAdded value: +{ + "type": "string" +} - added
Input schema / properties / wisdom / items / properties / source_snapshotAdded value: +{ + "type": "string" +} - added
Input schema / properties / wisdom / items / properties / source_urlAdded value: +{ + "type": "string" +}
- Changed
manage_scene6 fields changed- added
Input schema / properties / after_userAdded value: +{ + "description": "Reset the pooled spoken-set for a new user turn (next_speaker).", + "type": "boolean" +} - added
Input schema / properties / forceAdded value: +{ + "description": "NPC forced as the next speaker (cast/next_speaker).", + "type": "string" +} - added
Input schema / properties / muteAdded value: +{ + "description": "NPC muted from speaker selection (cast).", + "type": "string" +} - added
Input schema / properties / selectAdded value: +{ + "description": "NPC selected as the manual speaker (cast/next_speaker).", + "type": "string" +} - added
Input schema / properties / strategyAdded value: +{ + "description": "Speaker-selection strategy (cast).", + "enum": [ + "manual", + "natural", + "list", + "pooled" + ], + "type": "string" +} - added
Input schema / properties / unmuteAdded value: +{ + "description": "NPC restored to speaker selection (cast).", + "type": "string" +}
- Changed
manage_session14 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"recap, verbosity, briefing_order, compress (non-mutating audit summary prompt), compact (GM-only irreversible audit-log compaction), health, subscribe, discover (list/search tools), category (reassign a tool's category), event (append an observation), or history (read the event log)."New value: +"recap, verbosity, briefing_order, compress (non-mutating audit summary prompt), compact (GM-only irreversible audit-log compaction), health, context_report (per-section token ledger), subscribe, discover (list/search tools), category (reassign a tool's category), event (append an observation), history (read the event log), verify (compare live state to recorded hashes), replay (read-only event-log inspection), visibility_check (scan a draft for GM-only disclosure), or visibility_audit (recent visibility decisions)." - added
Input schema / properties / budget_tokensAdded value: +{ + "description": "Positive token budget for tier assembly (recap; REQ-592) or for ledger packing (context_report; REQ-610).", + "type": "number" +} - removed
Input schema / properties / categoryRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "New category label, or null/empty to restore the default (category)." -} - added
Input schema / properties / detailAdded value: +{ + "description": "discover response detail: summary (default) or schema (live input schemas for the matches; requires query; REQ-609).", + "enum": [ + "summary", + "schema" + ], + "type": "string" +} - removed
Input schema / properties / include_supersededRemoved value: -{ - "description": "Include superseded events (history; default true).", - "type": "boolean" -} - removed
Input schema / properties / max_entriesRemoved value: -{ - "description": "Positive integer; returns a non-mutating summarize prompt over the most recent entries (compress).", - "type": "number" -} - removed
Input schema / properties / sessionsRemoved value: -{ - "description": "Number of recent sessions to retain live; triggers irreversible compaction (compact; default TTRPG_AUDIT_RETENTION_SESSIONS).", - "type": "number" -} - removed
Input schema / properties / sourceRemoved value: -{ - "description": "Event source classification (event).", - "enum": [ - "player", - "game_master", - "system", - "machine" - ], - "type": "string" -} - removed
Input schema / properties / supersedeRemoved value: -{ - "description": "Ordinal of an event this observation replaces (event).", - "type": "number" -} - removed
Input schema / properties / textRemoved value: -{ - "description": "Observation text (event).", - "type": "string" -} - removed
Input schema / properties / through_ordinalRemoved value: -{ - "description": "Return events up to and including this ordinal (history).", - "type": "number" -} - added
Input schema / properties / tierAdded value: +{ + "description": "Compression tier to assemble (recap; REQ-592).", + "enum": [ + "recent", + "session", + "arc", + "campaign" + ], + "type": "string" +} - removed
Input schema / properties / tool_nameRemoved value: -{ - "description": "Registered tool name to reassign (category).", - "type": "string" -} - removed
Input schema / properties / topicsRemoved value: -{ - "description": "Notification topics to subscribe to (subscribe).", - "items": { - "type": "string" - }, - "type": "array" -}
- Changed
manage_staging25 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"presence, autonomy."New value: +"presence, autonomy, cast, or next_speaker." - changed
Input schema / properties / action / enumPrevious value: -[ - "presence", - "autonomy" -]New value: +[ + "presence", + "autonomy", + "cast", + "next_speaker" +] - removed
Input schema / properties / adventure_sceneRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Adventure-scene waypoint anchor; empty or null clears (set)." -} - added
Input schema / properties / after_userAdded value: +{ + "description": "Reset the pooled spoken-set for a new user turn (next_speaker).", + "type": "boolean" +} - removed
Input schema / properties / allow_freeformRemoved value: -{ - "description": "Allow free-form response (choices).", - "type": "boolean" -} - removed
Input schema / properties / atmosphereRemoved value: -{ - "description": "Atmosphere (set).", - "type": "string" -} - removed
Input schema / properties / beatRemoved value: -{ - "description": "Story-beat tag (set): setup, escalation, turning_point, climax, resolution, denouement.", - "enum": [ - "setup", - "escalation", - "turning_point", - "climax", - "resolution", - "denouement" - ], - "type": "string" -} - removed
Input schema / properties / choicesRemoved value: -{ - "description": "List of choices (choices).", - "items": { - "properties": { - "description": { - "type": "string" - }, - "id": { - "type": "string" - }, - "label": { - "type": "string" - } - }, - "required": [ - "id", - "label" - ], - "type": "object" - }, - "type": "array" -} - removed
Input schema / properties / contextRemoved value: -{ - "additionalProperties": {}, - "description": "Context for the choice (choices).", - "propertyNames": { - "type": "string" - }, - "type": "object" -} - removed
Input schema / properties / descriptionRemoved value: -{ - "description": "Scene description (set).", - "type": "string" -} - removed
Input schema / properties / directiveRemoved value: -{ - "description": "Narrative directive (directive).", - "type": "string" -} - removed
Input schema / properties / fast_forwardRemoved value: -{ - "description": "Narrative fast-forward (set).", - "properties": { - "changes": { - "description": "NPC changes during the skip.", - "items": { - "properties": { - "condition": { - "type": "string" - }, - "disposition": { - "type": "string" - }, - "location": { - "type": "string" - }, - "npc_id": { - "type": "string" - } - }, - "required": [ - "npc_id" - ], - "type": "object" - }, - "type": "array" - }, - "interval": { - "description": "The time interval to skip.", - "type": "string" - }, - "skip_countdowns": { - "description": "Do not advance countdowns during the skip.", - "type": "boolean" - } - }, - "required": [ - "interval" - ], - "type": "object" -} - added
Input schema / properties / forceAdded value: +{ + "description": "NPC forced as the next speaker (cast/next_speaker).", + "type": "string" +} - removed
Input schema / properties / likelihoodRemoved value: -{ - "description": "Likelihood tier (oracle).", - "enum": [ - "almost_certain", - "likely", - "50_50", - "unlikely", - "small_chance" - ], - "type": "string" -} - removed
Input schema / properties / locationRemoved value: -{ - "description": "Scene location (set).", - "type": "string" -} - added
Input schema / properties / muteAdded value: +{ + "description": "NPC muted from speaker selection (cast).", + "type": "string" +} - removed
Input schema / properties / promptRemoved value: -{ - "description": "Choice prompt (choices).", - "type": "string" -} - removed
Input schema / properties / questionRemoved value: -{ - "description": "Question to resolve (oracle).", - "type": "string" -} - removed
Input schema / properties / scene_typeRemoved value: -{ - "anyOf": [ - { - "enum": [ - "combat", - "social", - "exploration", - "neutral" - ], - "type": "string" - }, - { - "items": { - "enum": [ - "combat", - "social", - "exploration", - "neutral" - ], - "type": "string" - }, - "type": "array" - } - ], - "description": "Scene-type tag or array (set)." -} - removed
Input schema / properties / seedRemoved value: -{ - "description": "Deterministic seed (oracle).", - "type": "string" -} - added
Input schema / properties / selectAdded value: +{ + "description": "NPC selected as the manual speaker (cast/next_speaker).", + "type": "string" +} - removed
Input schema / properties / skip_transition_hookRemoved value: -{ - "description": "Skip the scene-transition hook (set).", - "type": "boolean" -} - added
Input schema / properties / strategyAdded value: +{ + "description": "Speaker-selection strategy (cast).", + "enum": [ + "manual", + "natural", + "list", + "pooled" + ], + "type": "string" +} - removed
Input schema / properties / time_of_dayRemoved value: -{ - "description": "Time of day (set).", - "type": "string" -} - added
Input schema / properties / unmuteAdded value: +{ + "description": "NPC restored to speaker selection (cast).", + "type": "string" +}
- Changed
manage_synthesis9 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"run, revert, list, activate, deactivate, toggle, toggle_action, player_add, player_remove, or player_list."New value: +"run, revert, list, activate, deactivate, toggle, toggle_action, player_add, player_remove, player_list, verify, record_ruling, revert_ruling, or ruling_list." - changed
Input schema / properties / action / enumPrevious value: -[ - "run", - "revert", - "list", - "activate", - "deactivate", - "toggle", - "toggle_action", - "player_add", - "player_remove", - "player_list" -]New value: +[ + "run", + "revert", + "list", + "activate", + "deactivate", + "toggle", + "toggle_action", + "player_add", + "player_remove", + "player_list", + "verify", + "record_ruling", + "revert_ruling", + "ruling_list" +] - added
Input schema / properties / include_revertedAdded value: +{ + "description": "Include reverted rulings (ruling_list; default false).", + "type": "boolean" +} - changed
Input schema / properties / key / descriptionPrevious value: -"Item key (activate: number; player_add/player_remove: string)."New value: +"Item key (activate: number; player_add/player_remove/verify/record_ruling: string)." - added
Input schema / properties / max_entriesAdded value: +{ + "description": "Maximum rulings to return, newest first (ruling_list; default 20).", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Input schema / properties / module / descriptionPrevious value: -"Synthesis module (activate/deactivate/toggle/player_*/list)."New value: +"Synthesis module (activate/deactivate/toggle/player_*/list/verify/record_ruling)." - added
Input schema / properties / queryAdded value: +{ + "description": "Question the ruling answers (record_ruling).", + "type": "string" +} - added
Input schema / properties / rulingAdded value: +{ + "description": "Ruling text to record (record_ruling).", + "type": "string" +} - added
Input schema / properties / ruling_idAdded value: +{ + "description": "Ledger entry id (revert_ruling).", + "type": "string" +}
- Changed
manage_world3 fields changed- added
Input schema / properties / noiseAdded value: +{ + "description": "Auditory cue text reported by listen (create_thing/update_thing).", + "type": "string" +} - added
Input schema / properties / optionsAdded value: +{ + "description": "Generation options (generate): roles maps installed table names to room, objects, persons, or hazards pools; rooms requests a count bounded by TTRPG_WORLD_GEN_MAX_ROOMS.", + "properties": { + "roles": { + "properties": { + "hazards": { + "items": { + "type": "string" + }, + "type": "array" + }, + "objects": { + "items": { + "type": "string" + }, + "type": "array" + }, + "persons": { + "items": { + "type": "string" + }, + "type": "array" + }, + "room": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "rooms": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "type": "object" +} - added
Input schema / properties / scentAdded value: +{ + "description": "Olfactory cue text reported by smell (create_thing/update_thing).", + "type": "string" +}
- Changed
run_command4 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"execute (parser), resolve (non-mutating intent), or suggest (intent → tool calls). Defaults to execute."New value: +"execute (parser), resolve (non-mutating intent), suggest (intent → tool calls), visibility (can one actor see another or a thing), or audibility (can one actor hear another). Defaults to execute." - changed
Input schema / properties / action / enumPrevious value: -[ - "execute", - "resolve", - "suggest" -]New value: +[ + "execute", + "resolve", + "suggest", + "visibility", + "audibility" +] - added
Input schema / properties / sourceAdded value: +{ + "description": "Observing actor for visibility/audibility (defaults to the active entity).", + "type": "string" +} - added
Input schema / properties / targetAdded value: +{ + "description": "Actor or thing being seen or heard (visibility/audibility).", + "type": "string" +}
19 tool updates
- Added
close_session - Added
manage_archive - Added
manage_causality - Added
manage_corpus - Added
manage_diagnostics - Changed
manage_lore1 field changed- changed
Input schema / properties / action / enumPrevious value: -[ - "set", - "update", - "remove", - "toggle", - "group", - "suggest", - "list", - "get", - "export", - "import", - "set_secret", - "reveal", - "secret_list", - "knowledge", - "corpus_register", - "corpus_list", - "corpus_get", - "corpus_route", - "corpus_grant", - "corpus_deny", - "corpus_access", - "corpus_consume", - "corpus_acquisitions" -]New value: +[ + "set", + "update", + "remove", + "toggle", + "group", + "suggest", + "list", + "get", + "export", + "import", + "set_secret", + "reveal", + "secret_list", + "knowledge" +]
- Changed
manage_novel1 field changed- changed
Input schema / properties / action / enumPrevious value: -[ - "create", - "resume", - "switch", - "end", - "export", - "import", - "rename", - "description", - "list", - "archive", - "unarchive", - "info", - "genre", - "complete_session_zero", - "clone", - "branch", - "save_context", - "get_context", - "checkpoint_set", - "checkpoint_list", - "checkpoint_restore", - "checkpoint_remove" -]New value: +[ + "create", + "resume", + "switch", + "end", + "rename", + "description", + "list", + "info", + "genre", + "complete_session_zero", + "save_context", + "get_context" +]
- Changed
manage_ruleset2 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"search, install, remove, list, bind, roll, import_supplementary, or remove_supplementary."New value: +"search, install, remove, list, bind, import_supplementary, or remove_supplementary." - changed
Input schema / properties / action / enumPrevious value: -[ - "search", - "install", - "remove", - "list", - "bind", - "roll", - "import_supplementary", - "remove_supplementary" -]New value: +[ + "search", + "install", + "remove", + "list", + "bind", + "import_supplementary", + "remove_supplementary" +]
- Changed
manage_scene1 field changed- changed
Input schema / properties / action / enumPrevious value: -[ - "set", - "directive", - "presence", - "autonomy", - "choices", - "oracle" -]New value: +[ + "set", + "directive", + "choices", + "oracle" +]
- Changed
manage_session1 field changed- changed
Input schema / properties / action / enumPrevious value: -[ - "recap", - "verbosity", - "briefing_order", - "compress", - "compact", - "health", - "subscribe", - "discover", - "category", - "event", - "history" -]New value: +[ + "recap", + "verbosity", + "briefing_order", + "discover" +]
- Added
manage_staging - Changed
manage_story1 field changed- added
Input schema / properties / turn_handleAdded value: +{ + "description": "Turn handle minted by take_turn (record); consumed on success.", + "type": "string" +}
- Changed
manage_world1 field changed- changed
Input schema / properties / action / enumPrevious value: -[ - "create_room", - "update_room", - "remove_room", - "create_thing", - "update_thing", - "remove_thing", - "create_exit", - "remove_exit", - "convert", - "generate", - "causal_propose", - "causal_admit", - "causal_reject", - "causal_list", - "causal_state", - "causal_ingress" -]New value: +[ + "create_room", + "update_room", + "remove_room", + "create_thing", + "update_thing", + "remove_thing", + "create_exit", + "remove_exit", + "convert", + "generate" +]
- Added
open_session - Removed
resolve_fate - Removed
resolve_forged - Removed
resolve_ironsworn - Added
resolve_mechanic - Added
take_turn
1 tool update
v2026.10.12- Changed
manage_novel2 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"create, resume, switch, end, export, import, rename, description, list, archive, unarchive, info, genre, clone, branch, save_context, get_context, checkpoint_set, checkpoint_list, checkpoint_restore, or checkpoint_remove."New value: +"create, resume, switch, end, export, import, rename, description, list, archive, unarchive, info, genre, complete_session_zero, clone, branch, save_context, get_context, checkpoint_set, checkpoint_list, checkpoint_restore, or checkpoint_remove." - changed
Input schema / properties / action / enumPrevious value: -[ - "create", - "resume", - "switch", - "end", - "export", - "import", - "rename", - "description", - "list", - "archive", - "unarchive", - "info", - "genre", - "clone", - "branch", - "save_context", - "get_context", - "checkpoint_set", - "checkpoint_list", - "checkpoint_restore", - "checkpoint_remove" -]New value: +[ + "create", + "resume", + "switch", + "end", + "export", + "import", + "rename", + "description", + "list", + "archive", + "unarchive", + "info", + "genre", + "complete_session_zero", + "clone", + "branch", + "save_context", + "get_context", + "checkpoint_set", + "checkpoint_list", + "checkpoint_restore", + "checkpoint_remove" +]
8 tool updates
v1.0.5- Changed
manage_belief6 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"list, get, evidence, admit, retract, conflicts, or reconcile."New value: +"Belief: list, get, evidence, admit, retract, conflicts, or reconcile. Perception ledger: perception_record, perception_list, perception_for_entity, or perception_for_event." - changed
Input schema / properties / action / enumPrevious value: -[ - "list", - "get", - "evidence", - "admit", - "retract", - "conflicts", - "reconcile" -]New value: +[ + "list", + "get", + "evidence", + "admit", + "retract", + "conflicts", + "reconcile", + "perception_record", + "perception_list", + "perception_for_entity", + "perception_for_event" +] - added
Input schema / properties / perception_entity_idAdded value: +{ + "description": "Entity that perceived (perception_record/perception_for_entity).", + "type": "string" +} - added
Input schema / properties / perception_event_ordinalAdded value: +{ + "description": "Contributing event-log ordinal (perception_record/perception_for_event; defaults to the latest event).", + "type": "number" +} - added
Input schema / properties / perception_kindAdded value: +{ + "description": "message, scene, or observation (perception_record; default observation).", + "enum": [ + "message", + "scene", + "observation" + ], + "type": "string" +} - added
Input schema / properties / perception_summaryAdded value: +{ + "description": "What was perceived (perception_record).", + "type": "string" +}
- Removed
manage_causal - Changed
manage_character4 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"create, stage, import, sheet, set_active, personality, voice, signal, remove, roster_remove, or roster_list."New value: +"create, stage, import, sheet, set_active, personality, voice, signal, update, remove, roster_remove, or roster_list." - changed
Input schema / properties / action / enumPrevious value: -[ - "create", - "stage", - "import", - "sheet", - "set_active", - "personality", - "voice", - "signal", - "remove", - "roster_remove", - "roster_list" -]New value: +[ + "create", + "stage", + "import", + "sheet", + "set_active", + "personality", + "voice", + "signal", + "update", + "remove", + "roster_remove", + "roster_list" +] - added
Input schema / properties / inventoryAdded value: +{ + "description": "Replace the entity's inventory (update).", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / statsAdded value: +{ + "additionalProperties": {}, + "description": "Mechanical stat keys to shallow-merge into the entity's stats (update).", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Changed
manage_codex3 fields changed- changed
Input schema / properties / content / descriptionPrevious value: -"Entry content (for set)."New value: +"Entry content (for set); when omitted on an existing entry, the stored content is preserved." - added
Input schema / properties / mergeAdded value: +{ + "description": "For set: when true and the entry exists, shallow-merge the provided content into the stored content instead of replacing it.", + "type": "boolean" +} - removed
Input schema / properties / visibilityRemoved value: -{ - "description": "library, shared, or private (for set).", - "enum": [ - "library", - "shared", - "private" - ], - "type": "string" -}
- Removed
manage_corpus - Changed
manage_lore14 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"set, update, remove, toggle, group, suggest, list, get, export, import, set_secret, reveal, secret_list, or knowledge."New value: +"Lore: set, update, remove, toggle, group, suggest, list, get, export, import, set_secret, reveal, secret_list, or knowledge. Corpus: corpus_register, corpus_list, corpus_get, corpus_route, corpus_grant, corpus_deny, corpus_access, corpus_consume, or corpus_acquisitions." - changed
Input schema / properties / action / enumPrevious value: -[ - "set", - "update", - "remove", - "toggle", - "group", - "suggest", - "list", - "get", - "export", - "import", - "set_secret", - "reveal", - "secret_list", - "knowledge" -]New value: +[ + "set", + "update", + "remove", + "toggle", + "group", + "suggest", + "list", + "get", + "export", + "import", + "set_secret", + "reveal", + "secret_list", + "knowledge", + "corpus_register", + "corpus_list", + "corpus_get", + "corpus_route", + "corpus_grant", + "corpus_deny", + "corpus_access", + "corpus_consume", + "corpus_acquisitions" +] - added
Input schema / properties / corpus_access_domainsAdded value: +{ + "description": "Knowledge domains granted access (corpus_register).", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / corpus_access_publicAdded value: +{ + "description": "Whether every entity may consume it (corpus_register; default false).", + "type": "boolean" +} - added
Input schema / properties / corpus_bodyAdded value: +{ + "description": "Document reference text (corpus_register).", + "type": "string" +} - added
Input schema / properties / corpus_deniesAdded value: +{ + "description": "Entity ids explicitly denied access (corpus_register).", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / corpus_document_idAdded value: +{ + "description": "Corpus document id (corpus_get/corpus_route/corpus_grant/corpus_deny/corpus_consume).", + "type": "string" +} - added
Input schema / properties / corpus_domainAdded value: +{ + "description": "Knowledge domain (corpus_register/corpus_route/corpus_list).", + "type": "string" +} - added
Input schema / properties / corpus_domainsAdded value: +{ + "description": "Knowledge domains the entity may access (corpus_access).", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / corpus_entity_idAdded value: +{ + "description": "Entity acquiring or inspected (corpus_consume/corpus_acquisitions/corpus_access/corpus_grant/corpus_deny).", + "type": "string" +} - added
Input schema / properties / corpus_grantsAdded value: +{ + "description": "Entity ids explicitly granted access (corpus_register).", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / corpus_modeAdded value: +{ + "description": "read, research, taught, or import (corpus_consume; default read).", + "enum": [ + "read", + "research", + "taught", + "import" + ], + "type": "string" +} - added
Input schema / properties / corpus_source_profileAdded value: +{ + "description": "Trusted source profile the domain is routed from (corpus_register; default manual).", + "type": "string" +} - added
Input schema / properties / corpus_titleAdded value: +{ + "description": "Document title (corpus_register).", + "type": "string" +}
- Removed
manage_perception - Changed
manage_world12 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"create_room, update_room, remove_room, create_thing, update_thing, remove_thing, create_exit, remove_exit, convert, or generate."New value: +"World: create_room, update_room, remove_room, create_thing, update_thing, remove_thing, create_exit, remove_exit, convert, or generate. Causal: causal_propose, causal_admit, causal_reject, causal_list, causal_state, or causal_ingress." - changed
Input schema / properties / action / enumPrevious value: -[ - "create_room", - "update_room", - "remove_room", - "create_thing", - "update_thing", - "remove_thing", - "create_exit", - "remove_exit", - "convert", - "generate" -]New value: +[ + "create_room", + "update_room", + "remove_room", + "create_thing", + "update_thing", + "remove_thing", + "create_exit", + "remove_exit", + "convert", + "generate", + "causal_propose", + "causal_admit", + "causal_reject", + "causal_list", + "causal_state", + "causal_ingress" +] - added
Input schema / properties / causal_domainAdded value: +{ + "description": "location or scalar (causal_propose; default location).", + "enum": [ + "location", + "scalar" + ], + "type": "string" +} - added
Input schema / properties / causal_entityAdded value: +{ + "description": "Entity whose objective state is proposed (causal_propose).", + "type": "string" +} - added
Input schema / properties / causal_expected_versionAdded value: +{ + "description": "Optimistic version guard (causal_propose).", + "type": "number" +} - added
Input schema / properties / causal_fromAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Expected prior value (causal_propose)." +} - added
Input schema / properties / causal_keyAdded value: +{ + "description": "State key within the entity (causal_propose).", + "type": "string" +} - added
Input schema / properties / causal_origin_sourceAdded value: +{ + "description": "narrative, machine, or ruleset (causal_propose).", + "enum": [ + "narrative", + "machine", + "ruleset" + ], + "type": "string" +} - added
Input schema / properties / causal_proposal_idAdded value: +{ + "description": "Recorded proposal id (causal_admit/causal_reject).", + "type": "string" +} - added
Input schema / properties / causal_scopeAdded value: +{ + "description": "Scope coordinate (causal_propose; default the active Novel slug).", + "type": "string" +} - added
Input schema / properties / causal_source_ordinalAdded value: +{ + "description": "Contributing event-log ordinal (causal_propose; default the latest event).", + "type": "number" +} - added
Input schema / properties / causal_valueAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Proposed value (causal_propose/causal_ingress)." +}
5 tool updates
v1.0.4- Removed
manage_graph - Removed
manage_index - Added
manage_knowledge - Changed
manage_scene1 field changed- changed
Input schema / properties / beat / descriptionPrevious value: -"Story-beat tag (set)."New value: +"Story-beat tag (set): setup, escalation, turning_point, climax, resolution, denouement."
- Changed
manage_world3 fields changed- added
Input schema / properties / fromAdded value: +{ + "description": "Source room alias for room_a (create_exit).", + "type": "string" +} - added
Input schema / properties / keyAdded value: +{ + "description": "Bound key thing name required to unlock or lock this thing when lockable (create_thing/update_thing).", + "type": "string" +} - added
Input schema / properties / toAdded value: +{ + "description": "Destination room alias for room_b (create_exit).", + "type": "string" +}
61 tool updates
v1.0.3- Removed
adventure - Removed
character - Removed
codex - Removed
combat - Removed
command - Removed
condition - Removed
countdown - Removed
faction - Removed
fate - Removed
forged - Removed
help - Removed
ironsworn - Removed
lore - Added
manage_adventure - Added
manage_agent - Added
manage_belief - Added
manage_causal - Added
manage_character - Added
manage_codex - Added
manage_combat - Added
manage_condition - Added
manage_corpus - Added
manage_countdown - Added
manage_faction - Added
manage_graph - Added
manage_history - Added
manage_identity - Added
manage_index - Added
manage_lore - Added
manage_note - Added
manage_novel - Added
manage_npc - Added
manage_perception - Added
manage_relationship - Added
manage_ruleset - Added
manage_scene - Added
manage_session - Added
manage_story - Added
manage_synthesis - Added
manage_vow - Added
manage_world - Removed
note - Removed
novel - Removed
npc - Removed
redo - Removed
relationship - Added
resolve_fate - Added
resolve_forged - Added
resolve_ironsworn - Removed
respond - Added
respond_decision - Removed
ruleset - Added
run_command - Removed
scene - Removed
session - Changed
set_badge1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "status": { + "description": "Machine-readable result status: OK, NEED_INPUT, WARNING, PARTIAL, or an error category (REQ-002, REQ-548c).", + "type": "string" + }, + "text": { + "description": "Human-readable text envelope mirroring the structured result (REQ-001, REQ-548a).", + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" +}
- Removed
story - Removed
synthesis - Removed
undo - Removed
vow - Removed
world
6 tool updates
v1.0.2- Added
fate - Added
forged - Added
ironsworn - Changed
npc1 field changed- added
Input schema / properties / mindAdded value: +{ + "description": "Optional GM-only NPC mind (create/update).", + "properties": { + "auto_play": { + "description": "When true, the narrator plays this NPC from the directive on initiative.", + "type": "boolean" + }, + "directive": { + "description": "Narrator-facing directive describing how to play this NPC (GM only).", + "type": "string" + }, + "private_journal": { + "description": "Private journal entries (GM only).", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
session4 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"recap, verbosity, briefing_order, compress, or health."New value: +"recap, verbosity, briefing_order, compress, health, or subscribe." - changed
Input schema / properties / action / enumPrevious value: -[ - "recap", - "verbosity", - "briefing_order", - "compress", - "health" -]New value: +[ + "recap", + "verbosity", + "briefing_order", + "compress", + "health", + "subscribe" +] - added
Input schema / properties / gm_notesAdded value: +{ + "description": "GM-only free-text notes returned only to the Game Master badge (recap).", + "type": "string" +} - added
Input schema / properties / topicsAdded value: +{ + "description": "Notification topics to subscribe to (subscribe).", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
world3 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"create_room, update_room, remove_room, create_thing, update_thing, remove_thing, create_exit, remove_exit, or convert."New value: +"create_room, update_room, remove_room, create_thing, update_thing, remove_thing, create_exit, remove_exit, convert, or generate." - changed
Input schema / properties / action / enumPrevious value: -[ - "create_room", - "update_room", - "remove_room", - "create_thing", - "update_thing", - "remove_thing", - "create_exit", - "remove_exit", - "convert" -]New value: +[ + "create_room", + "update_room", + "remove_room", + "create_thing", + "update_thing", + "remove_thing", + "create_exit", + "remove_exit", + "convert", + "generate" +] - added
Input schema / properties / seedAdded value: +{ + "description": "Deterministic seed (generate).", + "type": "string" +}
142 tool updates
- Removed
activate_synthesis_item - Removed
add_combat_participant - Removed
advance_combat - Removed
advance_countdown - Added
adventure - Removed
apply_condition - Removed
archive_novel - Removed
ask_oracle - Removed
bind_novel_ruleset - Added
character - Removed
character_sheet - Removed
clone_novel - Added
codex - Removed
codex_capture - Removed
codex_import - Removed
codex_list - Removed
codex_set - Added
combat - Changed
command5 fields changed- added
Input schema / properties / actionAdded value: +{ + "description": "execute (parser), resolve (non-mutating intent), or suggest (intent → tool calls). Defaults to execute.", + "enum": [ + "execute", + "resolve", + "suggest" + ], + "type": "string" +} - changed
Input schema / properties / command / descriptionPrevious value: -"The natural-language command, e.g. 'go north', 'look', 'take torch', 'open door'."New value: +"The natural-language command (execute)." - added
Input schema / properties / entity_idAdded value: +{ + "description": "Optional entity context (suggest).", + "type": "string" +} - added
Input schema / properties / intentAdded value: +{ + "description": "The intent to resolve or map (resolve/suggest).", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "command" -]
- Removed
compact_audit_log - Removed
compress_audit - Added
condition - Removed
convert_source - Added
countdown - Removed
create_character - Removed
create_exit - Removed
create_faction - Removed
create_novel - Removed
create_npc - Removed
create_room - Removed
create_thing - Removed
deactivate_synthesis_item - Removed
end_combat - Removed
end_novel - Removed
export_lorebook - Removed
export_novel - Added
faction - Removed
forsake_vow - Removed
generate_adventure - Removed
generate_encounter - Removed
get_knowledge - Removed
get_pause_context - Removed
get_relationships - Changed
help3 fields changed- added
Input schema / properties / actionAdded value: +{ + "description": "list (default) or category (reassign a tool's category).", + "enum": [ + "list", + "category" + ], + "type": "string" +} - added
Input schema / properties / categoryAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "New category label, or null/empty to restore default (category)." +} - added
Input schema / properties / tool_nameAdded value: +{ + "description": "Registered tool name to reassign (category).", + "type": "string" +}
- Removed
import_character - Removed
import_lorebook - Removed
import_novel - Removed
init_combat - Removed
install_ruleset - Removed
list_adventures - Removed
list_checkpoints - Removed
list_notes - Removed
list_novels - Removed
list_roster_characters - Removed
list_rulesets - Removed
list_server_notes - Removed
list_stories - Removed
list_synthesis_items - Removed
load_adventure - Added
lore - Removed
mark_milestone - Added
note - Added
novel - Removed
novel_info - Added
npc - Removed
player_list_synthesis - Removed
player_remove_synthesis - Removed
player_signal - Removed
player_synthesize - Removed
present_choices - Removed
promote_story_to_lore - Removed
record_story - Added
relationship - Removed
remove_checkpoint - Removed
remove_combat_participant - Removed
remove_condition - Removed
remove_countdown - Removed
remove_entity - Removed
remove_exit - Removed
remove_faction - Removed
remove_lore_entry - Removed
remove_note - Removed
remove_npc - Removed
remove_room - Removed
remove_roster_character - Removed
remove_ruleset - Removed
remove_server_note - Removed
remove_story - Removed
remove_thing - Removed
rename_novel - Removed
resolve_intent - Removed
resolve_vow - Removed
restore_checkpoint - Removed
resume_novel - Removed
reveal_secret - Removed
revert_synthesis - Removed
roll_on_table - Added
ruleset - Added
scene - Removed
search_rules - Added
session - Removed
session_recap - Removed
set_active_entity - Removed
set_autonomy - Removed
set_briefing_order - Removed
set_checkpoint - Removed
set_countdown - Removed
set_genre - Removed
set_help_category - Removed
set_lore_entry - Removed
set_lore_group - Removed
set_narrative_directive - Removed
set_note - Removed
set_party_presence - Removed
set_pause_context - Removed
set_personality - Removed
set_relationship - Removed
set_scene_state - Removed
set_secret - Removed
set_server_note - Removed
set_verbosity - Removed
set_voice_examples - Removed
set_vow - Removed
spec_health - Removed
stage_character - Added
story - Removed
suggest_actions - Removed
suggest_lore - Removed
switch_novel - Added
synthesis - Removed
synthesize - Removed
toggle_action_patterns - Removed
toggle_lore_entry - Removed
toggle_synthesis_module - Removed
unarchive_novel - Removed
update_faction - Removed
update_lore_entry - Removed
update_novel_description - Removed
update_npc - Removed
update_story - Added
vow - Added
world
127 tool updates
v1.0.0- First observed
activate_synthesis_item - First observed
add_combat_participant - First observed
advance_combat - First observed
advance_countdown - First observed
apply_condition - First observed
archive_novel - First observed
ask_oracle - First observed
bind_novel_ruleset - First observed
character_sheet - First observed
clone_novel - First observed
codex_capture - First observed
codex_import - First observed
codex_list - First observed
codex_set - First observed
command - First observed
compact_audit_log - First observed
compress_audit - First observed
convert_source - First observed
create_character - First observed
create_exit - First observed
create_faction - First observed
create_novel - First observed
create_npc - First observed
create_room - First observed
create_thing - First observed
deactivate_synthesis_item - First observed
end_combat - First observed
end_novel - First observed
export_lorebook - First observed
export_novel - First observed
forsake_vow - First observed
generate_adventure - First observed
generate_encounter - First observed
get_knowledge - First observed
get_pause_context - First observed
get_relationships - First observed
help - First observed
import_character - First observed
import_lorebook - First observed
import_novel - First observed
init_combat - First observed
install_ruleset - First observed
list_adventures - First observed
list_checkpoints - First observed
list_notes - First observed
list_novels - First observed
list_roster_characters - First observed
list_rulesets - First observed
list_server_notes - First observed
list_stories - First observed
list_synthesis_items - First observed
load_adventure - First observed
mark_milestone - First observed
novel_info - First observed
player_list_synthesis - First observed
player_remove_synthesis - First observed
player_signal - First observed
player_synthesize - First observed
present_choices - First observed
promote_story_to_lore - First observed
record_story - First observed
redo - First observed
remove_checkpoint - First observed
remove_combat_participant - First observed
remove_condition - First observed
remove_countdown - First observed
remove_entity - First observed
remove_exit - First observed
remove_faction - First observed
remove_lore_entry - First observed
remove_note - First observed
remove_npc - First observed
remove_room - First observed
remove_roster_character - First observed
remove_ruleset - First observed
remove_server_note - First observed
remove_story - First observed
remove_thing - First observed
rename_novel - First observed
resolve_intent - First observed
resolve_vow - First observed
respond - First observed
restore_checkpoint - First observed
resume_novel - First observed
reveal_secret - First observed
revert_synthesis - First observed
roll_on_table - First observed
search_rules - First observed
session_recap - First observed
set_active_entity - First observed
set_autonomy - First observed
set_badge - First observed
set_briefing_order - First observed
set_checkpoint - First observed
set_countdown - First observed
set_genre - First observed
set_help_category - First observed
set_lore_entry - First observed
set_lore_group - First observed
set_narrative_directive - First observed
set_note - First observed
set_party_presence - First observed
set_pause_context - First observed
set_personality - First observed
set_relationship - First observed
set_scene_state - First observed
set_secret - First observed
set_server_note - First observed
set_verbosity - First observed
set_voice_examples - First observed
set_vow - First observed
spec_health - First observed
stage_character - First observed
suggest_actions - First observed
suggest_lore - First observed
switch_novel - First observed
synthesize - First observed
toggle_action_patterns - First observed
toggle_lore_entry - First observed
toggle_synthesis_module - First observed
unarchive_novel - First observed
undo - First observed
update_faction - First observed
update_lore_entry - First observed
update_novel_description - First observed
update_npc - First observed
update_story
TDQS
Scored across 36 tools
Many near-neighbor tools exist (manage_lore vs manage_corpus vs manage_knowledge vs manage_belief vs manage_note; manage_session vs manage_diagnostics; manage_novel vs manage_archive vs open_session/close_session; manage_scene vs manage_world vs manage_staging). The descriptions do substantial work with explicit 'Do NOT use when' cross-references, so an agent can usually disambiguate, but the sheer density of overlapping knowledge/memory tools means misselection remains plausible.
The dominant pattern is manage_<noun> (17 tools) with a small set of verb_noun outliers (run_command, take_turn, open_session, close_session, set_badge, respond_decision, resolve_mechanic). The convention is mostly predictable, though the heavy use of an 'action' parameter inside manage_* tools makes the tool names less informative than they could be.
36 tools is well above the workable range for a single server; many manage_* tools bundle a dozen actions each, so the effective surface is far larger than 36 implies. Several tools (manage_synthesis, manage_knowledge, manage_codex, manage_diagnostics) feel like separate subsystems that could be split or trimmed.
Coverage is unusually broad: world, PCs, NPCs, combat, conditions, factions, relationships, lore, beliefs, knowledge, story, vows, countdowns, sessions, archives, rulesets, codex, and synthesis all have lifecycle support. Minor gaps exist (e.g. entity lookup/search is scattered across manage_session.discover and manage_knowledge, with no first-class entity search), but core workflows are covered.
Maintenance
Related MCP Connectors
D&D and TTRPG campaign manager for GMs: your AI reads and writes a live, typed campaign database.
Mess in, magic out: your D&D and TTRPG notes become a private world store any AI app can read.
Characters, campaigns, adventures & worlds for D&D 5e/5.5e, Pathfinder, Savage Worlds, Fate, & more.
Manage your tabletop RPG campaign from any MCP client: worlds, sessions, quests, lore, recaps.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables creation and management of structured game worlds for text adventures and RPGs with character creation, world generation, and natural language interaction through AI integration.1MIT
- AlicenseCqualityAmaintenanceRPG game engine that lets AI run tabletop sessions without hallucinating mechanics. SQLite-backed persistence, D\&D 5e-style combat, procedural world generation, and deterministic dice.1004 npm44MIT
- AlicenseNot gradedqualityFmaintenanceEnables AI-powered campaign management for Foundry Virtual Tabletop through natural language, supporting multiple RPG systems with tools for quest creation, character management, combat resolution, and more.MIT
- FlicenseBqualityDmaintenanceAn MCP server that provides 18 tools for dice rolling, luck tests, character management, world state, combat, and save/load, enabling an AI game master to run a solo-play gamebook entirely through deterministic game logic.181-