holonovel
A persistent, rules-enforced tabletop roleplaying server — it turns your rulebooks into a running game with a real world model, campaign save state, and server-side badge gating.
Build a world — create rooms, things, and exits; navigate with parser commands (go, take, open, examine) backed by real containment logic.
Run a campaign (Novel) — track characters, NPCs, scenes, combat, conditions, factions, relationships, vows, countdowns, lore, secrets, story journal, and notes as structured save state; export, import, clone, branch, and checkpoint it.
Resolve mechanics — roll dice for Fate (Fudge dice, aspects, Fate points, stress), Ironsworn (momentum, moves, progress tracks), and Blades in the Dark (position/effect, stress, downtime), plus manage combat encounters and conditions.
Gate by badge — switch between Player, Game Master, Observer, and Editor; the server enforces what each role may see and do, so GM secrets never leak.
Convert and build rulesets — turn PDFs/HTML into clean Markdown, extract mechanics into declarative packages, bind a Novel to a ruleset, search its index, and roll on its tables.
Deepen play — Synthesis adds Ruleset Wisdom and on-demand external research (voice examples, lore templates, action patterns) that the GM can toggle on or off.
Model knowledge and truth — track per-entity beliefs, perceptions, objective causal transitions, a knowledge corpus, identity kernels, and a derived semantic index/knowledge graph.
Reuse and maintain — capture reusable content in a cross-Novels codex, run NPC/agent tasks, undo/redo any mutation, inspect session history, and check server health.
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.
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
Related MCP server: RPG Ledger MCP Server
Run a server
Install
The base server — a world-model MCP with rooms, things, exits, parser commands, narrative tools, and out-of-the-box mechanics from Fate, Ironsworn, and Blades in the Dark (Fudge dice, momentum, and stress tracks, no ruleset required). Install it, then install any number of ruleset packages — each drops in alongside the base and never modifies it. Node.js 24+ required.
cd holonovel
npm install
npm run startAdd to your MCP client:
"holonovel": {
"type": "local",
"command": ["npx", "tsx", "src/index.ts"],
"cwd": "<path>/holonovel",
"environment": {
"TTRPG_NOVEL": "default"
},
"enabled": true
}Install a ruleset
The Build workflow turns a rulebook into a declarative package. Drop the package
into the server's ruleset install directory and the running server registers it.
That directory lives inside the server's state directory, which defaults to a
per-user data location outside the project tree (or .holonovel-state/ when the
server runs outside one). Packages load lazily: a ruleset's tools and index
hydrate only when you open a campaign bound to that ruleset, so stacking many
packages costs you nothing up front. Install, remove, and list packages from the
server tools, or just move files and restart.
Your campaign data and installed packages live in that state directory, outside the server tree — updating holonovel never touches them.
How it works
Holonovel is one pipeline — Convert, Build, World, Novel, Synthesis — that turns a rulebook into a running table. Badge enforcement runs across all of it, server-side.
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.
"Take the Dungeon Master's Guide — every chapter, every table, every sidebar — and make it a clean source file the server can build from." "Convert this PDF to Markdown, and reassemble the tables that break across pages."
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 me a ruleset package from these files." "Extract every mechanic from this rulebook — the dice, the combat, the spells — into a ruleset package."
One spec reads any rulebook, and the build produces zero hand-written code.
World
The world model is a spatial simulation layer — rooms, exits, containers, supports, doors. Every object knows where it is and what it contains. The server maintains a real containment graph, not a paragraph of prose it hopes the AI remembers. Its conventions are drawn from Inform, the interactive-fiction language behind decades of text-adventure classics.
Parser commands navigate the world with real containment logic. Go north. The room is there. Take the lantern. It moves from the sarcophagus to your inventory. Open containers, lock doors, examine surroundings. Exits connect automatically in both directions.
"Go north." "Take the lantern from the sarcophagus." "Look around." "Open the iron door." "Examine the runes carved into the altar."
The map is real state, not narration.
Novel
A Novel is your entire campaign — party, NPCs, scenes, lore, combat state, world model, story journal, factions, secrets, everything. The narrative model gives your world depth: scenes set the stage, NPCs carry personality profiles and dialogue voice, lore entries fire automatically when keywords match, factions track standing, secrets gate knowledge, vows bind quests, countdowns escalate on schedule. The story journal records decisions, moments, and consequences — a narrative memory that survives every rebuild.
A Novel lives on the server. It survives restarts, rebuilds, and session breaks. Export as JSON or Markdown. Import with merge, replace, or dry-run modes. Clone to test a story branch. Set checkpoints before pivotal moments. Undo any mutation. A Novel is not a chat log — it is a structured save file. Other tools ask the AI to remember your world. Holonovel writes it to the server — structured, queryable, permanent.
Every Novel has four badge settings. Player. Game Master. Observer. Editor. Switch between them at any time — no restart, no reload. The AI takes the opposite role automatically: when you're the player, the AI is your GM. Badge gating is not a prompt instruction. It is enforced server-side — the GM's secrets, lore entries, and narrative directives never leak to the Player badge.
"Set the scene: a flooded ossuary beneath the old cathedral. The air is thick with stale incense and something older." "A figure emerges from the shadows — Sister Mora, an acolyte of the buried order. She's terrified, not hostile." "I swear a vow to recover the Saint's Reliquary before the next full moon." "Switch to the Game Master badge. I need to set up the next scene." "Pace: I want things to move faster."
The campaign persists on the server as structured, queryable state.
Synthesis
Synthesis deepens your campaign through two source categories. Ruleset Wisdom is extracted from your rulebooks during Build — voice examples from example-of-play dialogue, lore templates from setting descriptions, action patterns from resolution sequences, narrative voice profiles from inspirational media citations. It persists as first-class server behavior — the Holodeck renders your rulebook's own genre conventions mechanically. Ruleset Wisdom survives every rebuild and synthesis reversion.
External research runs on demand — web-sourced GM advice, actual-play breakdowns, designer notes. Tagged with source URLs, confidence scores, and freshness timestamps. Every synthesis item is inert by default. The GM toggles what matters on and off at runtime. Re-running synthesis replaces inactive items while preserving everything the GM has activated. Revert synthesis removes external research — Ruleset Wisdom persists.
"Find me GM advice and play examples for running horror one-shots." "Research how other tables handle horror pacing, and tag what you find with sources."
The game evolves without losing what you've built.
How it compares
Category | What you're used to | How Holonovel differs |
AI storytelling apps | Freeform AI storytellers — invent rules, forget consequences | Your rulebooks. Real dice. Real conditions. Not AI improv. |
Generic LLM chat | Forgets conditions mid-combat, invents spells, drifts from the ruleset | The server remembers every rule you gave it. Deterministic dice. Conditions that don't vanish mid-fight. |
First-generation rules MCP servers | Hand-built for one edition of one game. Rules lookup and nothing else. | Not locked to one system. One spec reads any rulebook — D&D 5e, Starfinder, or whatever's on your shelf. |
Every tool in this space asks you to pick. Rules engines serve one system and stop there. AI storytellers improvise mechanics as they go. Holonovel doesn't pick. The server enforces every mechanic. The AI narrates. The Novel preserves everything — D&D 5e, Starfinder, or your own rulebook.
Canonical origin: git.gay/flukeatzerocool/Holonovel. Guides for players, Game Masters, and builders live in the project wiki.
License: MIT. Built from: Graham Nelson's Inform (Artistic License 2.0), if-craft-corpus (CC BY 4.0), dmcp (MIT, Shawn Rushefsky), lonelog (CC BY-SA 4.0), BitD SRD (CC BY 3.0, John Harper), Ironsworn SRD (CC BY 4.0, Shawn Tomkin), Fate SRD (CC BY 3.0, Evil Hat Productions). RSS. Last updated: 2026-10-03.
Available Tools
33 toolsmanage_adventureAdventure ManagementADestructive
Generate, load, or list adventure content. 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). generate defaults target to novel when one is active; a !force prefix bypasses the guard. 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 declare destructive=true, non-idempotent, not read-only. The description adds real value beyond them: mutating actions 'persist to the Novel and are audited', read-only actions do not mutate, and the undo route is specified. It stops short of describing what persisted state looks like or what 'audited' implies operationally.
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 capability, then structured into mutation semantics, revert path, and explicit use/do-not-use guidance. Dense but each clause carries a distinct rule; no obvious filler, though it is longer than strictly necessary.
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. The description covers mutation persistence, undo, default target behavior, the force bypass, and sibling routing — everything an agent needs to invoke this multi-action 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 baseline is 3, but the description adds meaning the schema lacks: generate defaults target to novel when one is active, and a '!force' prefix bypasses the guard. Those are behavioral rules for parameters not encoded anywhere in 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?
Opens with a specific verb set and resource ('Generate, load, or list adventure content') and immediately scopes each action into mutating vs read-only. It also names the siblings it is distinct from (manage_history, manage_story), so an agent can route without opening other 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?
Explicitly provides 'Use when' (GM wants a scaffold, single encounter, or to load a module) and 'Do NOT use when' (recording a story beat → manage_story). It also names the revert path via manage_history, giving complete routing guidance.
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. Mutating actions (create, start, advance, complete, fail, cancel) persist to the Novel and are audited; list/get are read-only. Revert the most recent mutation with manage_history (action: undo); terminal tasks are immutable. Use when: creating a task (create), starting it (start), logging an action (advance), settling it (complete/fail/cancel), or inspecting tasks (list/get). Do NOT use when: surfacing an advisory suggestion — use manage_scene (action: oracle); managing NPC identity — use manage_npc.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | Task goal text (create). | |
| action | Yes | create, list, get, start, advance, complete, fail, or cancel. | |
| 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?
Beyond the annotations (readOnlyHint=false, destructiveHint=true), the description discloses that mutations persist to the Novel and are audited, that list/get are read-only, that the most recent mutation is revertible via manage_history undo, and that terminal tasks are immutable. These are non-obvious behavioral traits that an agent could not derive from the annotation flags alone.
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 sentence front-loads the core purpose, followed by mutability/audit facts, the undo path, and a compact when/when-not block. Every sentence carries distinct information with no filler, despite covering a large action surface.
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 7-parameter mutation tool with an output schema present, the description covers purpose, mutability, audit/persistence, undo, immutability constraints, and sibling routing. Return values need not be explained because the output schema exists, so nothing an agent needs to invoke this 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 lifecycle meaning to the action parameter by glossing how each value is used ('logging an action (advance)', 'settling it (complete/fail/cancel)'). This clarifies the operational intent of the enum beyond the bare schema listing, though it does not add syntax or format detail for the other parameters.
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 durable NPC/agent tasks and their action lifecycle') and enumerates the concrete operations (create, start, advance, complete, fail, cancel, list, get). It is clearly distinguishable from siblings like manage_scene, manage_npc, and manage_history, which are each named with a disambiguating condition.
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 explicit 'Use when' and 'Do NOT use when' sections, and routes the agent to alternatives with the exact call syntax: manage_history (action: undo), manage_scene (action: oracle), manage_npc. Both the positive triggers and the exclusions are 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_beliefBelief ManagementADestructive
Manage per-entity evidence and reconciled belief stances — one entity's subjective epistemic state, distinct from objective truth, shared lore, and raw observation. Mutating actions (admit, retract, reconcile) persist to the Novel and are audited; list/get/evidence/conflicts are read-only. Revert the most recent mutation with manage_history (action: undo). Use when: recording what an entity has learned or believes (admit), suppressing a piece of evidence (retract), inspecting current stances (list), reading one question (get), listing supporting evidence (evidence), finding unresolved contradictions (conflicts), or forcing recomputation (reconcile). Do NOT use when: recording objective world truth — use manage_causal or manage_world; recording shared lore — use manage_lore; recording raw observation — use manage_perception; recording consumed reference material — use manage_corpus.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | list, get, evidence, admit, retract, conflicts, or reconcile. | |
| 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). |
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 action-level transparency: mutating actions admit, retract, and reconcile persist to the Novel and are audited, while list/get/evidence/conflicts are read-only. It also notes that the most recent mutation can be reverted with manage_history. It stops short of detailing permissions or exact undo scope, but goes well beyond the 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 dense but well-structured: a definition, a mutating/read-only split, a revert note, and then explicitly labeled 'Use when' and 'Do NOT use when' sections. Every sentence serves routing or selection, and the most important distinctions are front-loaded.
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 a 12-parameter tool with an output schema and rich annotations, the description covers purpose, action semantics, mutability, alternates, and a revert path. Output values are left to the output schema, and safety hints are covered by annotations. Nothing critical for correct invocation 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 description coverage is 100%, so the schema already documents all 12 parameters in detail. The description adds meaning for the action enum by mapping each action to an intent (e.g., admit for recording what an entity believes, retract for suppressing evidence), but does not elaborate on the other parameters beyond what the schema provides. 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 states a specific verb and resource, defines the domain as per-entity subjective epistemic state, and explicitly distinguishes it from objective truth, shared lore, raw observation, and consumed reference material. It names the sibling tools for each contrasting domain, making it easy to route correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit 'Use when' guidance mapping each action to a concrete scenario and a 'Do NOT use when' section that names alternatives (manage_causal, manage_world, manage_lore, manage_perception, manage_corpus). The inclusion of the revert path via manage_history further clarifies the lifecycle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_causalCausal Transition ManagementADestructive
Validate objective-state transitions against committed history — what the world accepts as true, independent of any entity's belief. Proposals are recorded in a ledger before admission; a proposal is not truth until admitted, and refused proposals are preserved as evidence. Mutating actions (propose, admit, reject, ingress) persist to the Novel and are audited; list/state are read-only. origin_source is honored only by propose; ingress always records machine. Revert the most recent mutation with manage_history (action: undo). Use when: proposing an objective change (propose), admitting or refusing a recorded proposal (admit/reject), submitting machine-originated state (ingress), inspecting the transition ledger (list), or reading admitted objective state (state). Do NOT use when: recording what an entity believes — use manage_belief; recording raw observation — use manage_perception; editing the world model directly — use manage_world.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | State key within the entity. | |
| from | No | Expected prior value (proposal). | |
| scope | No | Scope coordinate (default the active Novel slug). | |
| value | No | Proposed value. | |
| action | Yes | propose, admit, reject, list, state, or ingress. | |
| domain | No | location or scalar (default location). | |
| entity | No | Entity whose objective state is proposed. | |
| proposal_id | No | Recorded proposal id (admit/reject). | |
| origin_source | No | narrative, machine, or ruleset (proposal). | |
| source_ordinal | No | Contributing event-log ordinal (default the latest event). | |
| expected_version | No | Optimistic version guard (proposal). |
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 this as a destructive, non-idempotent, non-read-only tool, and the description adds substantial context beyond that: proposals are ledgered before admission, unadmitted proposals are not truth, refused proposals are preserved as evidence, mutations are audited, and list/state are read-only. It also discloses the origin_source-vs-ingress override rule and points to manage_history (action: undo) for reverting the most recent 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?
It is a dense block rather than a short one, but it is front-loaded with the core semantic and each sentence carries distinct information (ledger behavior, action routing, exclusions, revert path). Slightly long, but no sentence is 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 an 11-parameter, six-action mutation tool with an output schema, the description covers the mutable lifecycle, read-only exceptions, action selection, and revert path. Nothing an agent needs to invoke it correctly 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 coverage is 100%, so the baseline is 3, but the description adds real semantics the schema does not: origin_source is honored only by propose, ingress always records machine-originated state, and undo lives in a separate tool. That said, several parameters (key, scope, from, expected_version, source_ordinal) get no added meaning.
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 verb+resource ('Validate objective-state transitions against committed history') and frames the tool's core semantic — objective truth vs. belief — which immediately separates it from manage_belief and manage_perception. It also enumerates the six actions so the agent knows the tool's full 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' clauses map each action (propose/admit/reject/ingress/list/state) to a scenario, and a 'Do NOT use when' section names three concrete alternatives (manage_belief, manage_perception, manage_world) with the condition that selects each. This is about as good as routing guidance gets.
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, send player signals, remove, or list roster characters. 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). 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. Use when: working with player characters. Do NOT use when: managing NPCs — 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). | |
| value | No | Feedback text (signal). | |
| voice | No | Voice and speech pattern (create/personality). | |
| action | Yes | create, stage, import, sheet, set_active, personality, voice, signal, 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). | |
| 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?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation profile is partly covered. The description adds real value beyond that: it separates mutating actions (which persist to the Novel and are audited) from read-only actions, and points to the undo route. It does not describe failure modes or per-action side effects, so it stops short of 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?
Given 25 parameters and 11 actions, the description is compact and front-loads the action inventory before the behavioral and aliasing notes. Every sentence carries weight (scope, audit/undo, alias precedence, sibling exclusion). Minor density in the alias 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 large multi-action tool with an output schema already present, the description covers what the schema cannot: the read/write split, audit behavior, undo routing, alias precedence, and the sibling boundary. It is close to complete; per-action return shapes are rightly deferred 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 is 3, but the description earns extra credit by explaining the aliasing rules: personality{} aliases description/voice/background/goals and details{} aliases ability_scores/skills/feats/talents/equipment, with a top-level value overriding its grouped alias. That precedence rule is not evident from the schema alone and materially affects how an agent should build the call.
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 player characters') and then enumerates the full action surface — create, stage, import, sheet, set_active, personality, voice, signal, remove, roster_list. It explicitly differentiates from the closest sibling ('Do NOT use when: managing NPCs — use 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?
It gives an explicit when-to-use ('working with player characters'), an explicit when-not ('managing NPCs'), names the alternative sibling, and additionally documents the undo path via manage_history (action: undo). 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_codexCodex Library ManagementADestructive
Manage the cross-Novels codex library of reusable content (NPCs, factions, rooms, spells, adventures, voice profiles). 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). capture's source_id falls back to entity_id; update_source requires artifact provenance. 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). | |
| action | Yes | set (create/update), list, get, capture (Novel artifact per kind), import (into active Novel), or delete. | |
| content | No | Entry content (for set). | |
| 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. | |
| visibility | No | library, shared, or private (for set). | |
| 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 already declare destructiveHint=true and non-idempotent, so safety is partly covered. The description adds valuable context beyond annotations: that mutations persist to the Novel and are audited while reads do not mutate, and that update_source requires artifact provenance and capture's source_id fallback. It could still note irreversibility of delete more explicitly, but the audit/persistence details are strong.
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 every clause earns its place: purpose, mutation/audit semantics, undo route, parameter fallbacks, and explicit when/when-not with alternatives. Front-loaded with the core purpose before routing guidance.
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 not be explained. Combined with annotations covering safety and the description covering scoping, persistence/audit, undo, parameter fallbacks, and sibling routing, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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: capture's source_id fallback to entity_id, and update_source requiring artifact provenance. These are behavioral constraints on parameters not spelled out in the schema descriptions.
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 cross-Novels codex library of reusable content, and enumerates the kinds (NPCs, factions, rooms, spells, adventures, voice profiles). It distinguishes itself from siblings by explicitly naming manage_lore and manage_note as the route 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 when-to-use (storing reusable content for later import, enumerating/reading/deleting) and when-not-to-use with concrete alternatives (manage_lore action:set, manage_note action:set). It also routes undo to manage_history and states provenance requirements for update_source.
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. 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?
Annotations already declare mutating, destructive, non-idempotent behavior; the description adds that mutations persist and are audited, and points to manage_history for undo. It also clarifies init seed semantics. This goes beyond annotations, though it doesn't detail all side effects (e.g., what data is lost on end).
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 usage guidance and caveats. Sentences are dense but each earns its place; no obvious filler, though it could be slightly tighter.
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 (6 params, multiple actions, destructive mutations) and the presence of an output schema, the description covers key operational context: audit trail, undo path, seed semantics, and action scope. It leaves minor gaps like all action prerequisites or full side effects, but is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are fully documented in the schema. The description adds behavioral nuance for seed and participant order but does not elaborate on outcome or participant_id beyond what the schema states. 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?
Description states a clear verb+resource ('Manage combat encounters in the active Novel') and mentions the mutating vs read-only distinction. It does not explicitly differentiate from sibling manage_condition beyond a do-not-use note, which is helpful but partial.
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 lists when to use ('starting, advancing, ending a fight, or changing its participants') and when NOT to use ('applying a status effect — use manage_condition (action: apply)'). Names the alternative tool directly.
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. 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). 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?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds real context: mutating actions persist to the Novel and are audited, read-only actions do not mutate state, and the undo path is manage_history. It stops short of stating what removal actually destroys or whether undo is time-limited, so a 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?
Four tightly packed sentences, each carrying distinct information (action scope, persistence/audit behavior, undo route, routing exclusions). The use/when-not framing is front-loaded and scannable.
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 annotations covering the safety profile and an output schema present, the description only needs to cover routing and behavioral quirks — which it does, including the audit/persistence trait and the undo alternative. Nothing an agent needs 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 description coverage is 100%, so the schema already documents action, condition, entity_id, and rounds. The description maps actions to use cases (apply/remove/list) but adds no syntax or format detail beyond the schema, making the baseline 3 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?
States a specific verb (manage) plus resource (mechanical/narrative conditions on entities) and explicitly contrasts itself with manage_combat for damage/combat state. An agent can distinguish this from its many siblings 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 when-to-use ('applying, removing, or listing conditions') and when-not ('recording damage or combat state — use manage_combat'), naming the alternative tool and action. It also routes undo to manage_history. 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_corpusKnowledge Corpus ManagementADestructive
Manage cold reference material and per-entity knowledge acquisition — what an entity has consumed from a registered document, distinct from belief and from lore. Registered documents create no knowledge until consumed; consumption records exactly what an entity acquired. Mutation (register, route, grant, deny, access, consume) persists to the Novel and is audited; list/get/acquisitions are read-only. Revert the most recent mutation with manage_history (action: undo). Use when: registering reference material (register), assigning its knowledge domain (route), opening or closing access (grant/deny), setting an entity's knowledge-domain profile (access), reading a document to acquire it (consume), or inspecting what an entity has acquired (acquisitions). Do NOT use when: recording beliefs — use manage_belief; recording shared world facts — use manage_lore; registering a reusable gameplay artifact — use manage_codex.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Document reference text (register). | |
| mode | No | read, research, taught, or import (consume; default read). | |
| title | No | Document title (register). | |
| action | Yes | register, list, get, route, grant, deny, access, consume, or acquisitions. | |
| denies | No | Entity ids explicitly denied access (register). | |
| domain | No | Knowledge domain (register/route/list). | |
| grants | No | Entity ids explicitly granted access (register). | |
| domains | No | Knowledge domains the entity may access (access). | |
| entity_id | No | Entity acquiring or inspected (consume/acquisitions/access/grant/deny). | |
| document_id | No | Corpus document id (get/route/grant/deny/consume). | |
| access_public | No | Whether every entity may consume it (register; default false). | |
| access_domains | No | Knowledge domains granted access (register). | |
| source_profile | No | Trusted source profile the domain is routed from (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?
Annotations only give a tool-wide destructiveHint/openWorldHint, but the description adds action-level resolution: register/route/grant/deny/access/consume persist to the Novel and are audited, while list/get/acquisitions are read-only. That action-level write/read split and the audit disclosure are exactly the context annotations cannot express.
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-dense and front-loaded, with the core definition first, then mutation/read split, then use/don't-use routing. It is a single long semicolon-chained paragraph, which slightly taxes scanning for the action-to-purpose mapping.
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 an output schema exists (so return values need not be explained), the description covers concept, per-action semantics, write/audit behavior, undo path, and sibling exclusions. Nothing needed to call a 13-param, enum-heavy tool 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; the description goes further by tying enum action values to their parameter roles (register, route, grant/deny, access, consume, acquisitions), which helps select the right action and its companion fields. It does not add syntax or format details for individual fields 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?
Names the resource (cold reference material / corpus documents) and the operations (register, route, grant/deny, access, consume, acquisitions), and crisply defines the concept: consumption records what an entity acquired, 'distinct from belief and from lore.' An agent can distinguish this from manage_belief/manage_lore/manage_codex 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?
Provides an explicit 'Use when' clause mapping each action to its intent, a 'Do NOT use when' clause naming three sibling alternatives, and routes undo to manage_history (action: undo). When-to-use, when-not-to-use, and alternatives are all present.
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. 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). set's direction shifts NPC dispositions only when scope is also set. Use when: starting, advancing, removing, or listing clocks. Do NOT use when: tracking a vow's progress — use manage_vow (action: milestone).
| 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). | |
| 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 flag destructiveHint=true and non-idempotent, but the description adds real context beyond them: mutating actions persist to the Novel and are audited while read-only actions do not mutate state, mutation is reversible via manage_history (action: undo), and set's direction only shifts NPC dispositions when scope is also set. That is a conditional side-effect rule and a recovery path an agent could not infer from structured fields.
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, zero filler, with the mutating/read-only distinction and the sibling exclusion front-loaded before the conditional detail. Each sentence adds 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?
With an output schema present and 100% schema coverage, the description need not restate returns or parameters. It covers scope of operation, mutation semantics, sibling disambiguation, and the undo path — everything needed to call this 9-parameter 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 description coverage is 100%, so the schema carries the per-parameter burden and baseline is 3. The description adds a genuine cross-parameter rule ('direction shifts NPC dispositions only when scope is also set') that the schema does not express, exceeding baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Manage countdown timers in the active Novel') and explicitly distinguishes itself from the closest sibling ('use manage_vow (action: milestone)' for vows). An agent can route correctly 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, removing, or listing clocks' and 'Do NOT use when: tracking a vow's progress' with the named alternative. Both the positive and negative conditions are stated.
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. 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). Use when: creating, revising, removing, or listing factions and their progress clocks. 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. | |
| 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?
Annotations already declare readOnlyHint=false and destructiveHint=true, but the description adds materially: mutating actions persist to the Novel and are audited, read-only actions do not mutate state, and the most recent mutation is revertible via manage_history. What's missing is any statement of permission/auth requirements or confirmation semantics for destructive removes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with zero filler: scope first, then mutation/audit behavior plus the undo path, then the use/don't-use routing. Every clause earns its place and the most decision-relevant information is front-loaded.
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 described. The description covers scope, mutation semantics, audit/persistence, revert path, and the sibling-boundary exclusion, leaving nothing an agent needs to select or 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 description coverage is 100% across all 7 parameters, including the action enum, so the schema carries parameter meaning and the baseline is 3. The description adds only indirect hints (factions and 'their progress clocks'), and notably 'progress clocks' is not represented in any parameter, so it does not extend parameter understanding.
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 resource (factions/organizations in the active Novel) and enumerates the concrete operations via the 'Use when' clause (creating, revising, removing, listing factions and their progress clocks). It distinguishes itself from sibling manage_world explicitly, so an agent can route 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?
Provides both inclusion ('Use when: creating, revising, removing, or listing factions') and exclusion ('Do NOT use when: tracking a faction's territory rooms — use manage_world (action: create_room)'), naming the alternative tool and action. It even routes undo operations to manage_history (action: undo), which is explicit alternative guidance.
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, restoring the prior per-badge snapshot. Undo reverts a mistaken or unwanted change; redo re-applies the most recently undone change. Both directions mutate Novel state and persist immediately (readOnlyHint false). Use when: reverting a mistaken change (action: undo) or restoring an undone change (action: redo). Do NOT use when: the target change is not the most recent mutation — use the entity tool that made it (e.g. manage_lore, manage_story, manage_world).
| 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, idempotentHint=false, so the safety profile is covered. The description still adds real value beyond them: both directions mutate and persist immediately, and the operation restores a per-badge snapshot limited to the most recent mutation. It does not explain the irreversibility/state-loss implied by destructiveHint, 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-loaded with the core verb and scope, and the when/when-not guidance is compact. However, the undo/redo definitions are stated twice (general sentence and again in the 'Use when' clause), and the '(readOnlyHint false)' parenthetical repeats the annotation verbatim, adding mild 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. For a single-enum-parameter tool, the description covers purpose, both action semantics, mutation/persistence behavior, and sibling routing — everything an agent needs to invoke 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 description coverage is 100% with a single enum parameter, so the schema already documents undo/redo fully. The description restates the same meanings ('undo reverts a mistaken or unwanted change; redo re-applies the most recently undone change') without adding syntax or format detail, matching the baseline for high-coverage schemas.
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 (undo/redo) plus the exact resource and scope: 'the most recent state mutation, restoring the prior per-badge snapshot.' This distinguishes it from all entity-management siblings, which the description names explicitly.
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' conditions mapped to each action value, plus a 'Do NOT use when' exclusion that routes the agent to the correct alternative tools (manage_lore, manage_story, manage_world) when the target change is not 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_identityIdentity ManagementADestructive
Manage a roster character's durable identity: staged candidates, accepted facets, and the versioned compiled kernel. Mutation (stage, accept, reject, bootstrap) persists the roster and is audited; list/snapshot are read-only. accept's perspective defaults to the candidate's stored perspective. Revert the most recent mutation with manage_history (action: undo); the compiled kernel is versioned. Use when: importing or authoring identity material (stage), accepting or rejecting a candidate (accept/reject), seeding from a character card (bootstrap), inspecting candidates and facets (list), or reading the compiled kernel (snapshot). 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, 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?
Annotations declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, and the description adds value beyond them: mutations persist the roster and are audited, list/snapshot are read-only, and the most recent mutation is revertible via manage_history (action: undo) with a versioned compiled kernel. It does not spell out precisely what a reject/overwrite destroys, if anything, which is the only remaining gap.
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 semantics (what it manages, which actions mutate), then usage routing, then exclusions. Some redundancy in restating the action list twice, but every sentence carries routing or behavioral 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 9-parameter, multi-action, nested-object tool with an output schema already present, the description covers the safety profile, persistence/audit behavior, undo path, and per-action routing. Nothing an agent needs in order to call it correctly is missing, and return values are appropriately 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 the baseline is 3, but the description adds meaning the schema doesn't: accept's perspective defaults to the candidate's stored perspective, and it groups parameters by the action that consumes them (stage vs accept/reject). This helps an agent pick the right action-parameter combination.
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 verb (manage) and resource (a roster character's durable identity), then enumerates the concrete sub-operations (stage, accept, reject, bootstrap, list, snapshot). It explicitly distinguishes itself from sibling tools manage_belief and manage_character, 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 explicit 'Use when' clauses mapping each action to a scenario (importing/authoring, accepting/rejecting, seeding from a card, inspecting, reading the kernel) and explicit 'Do NOT use when' clauses naming the alternative tools (manage_belief for knowledge/beliefs, manage_character action: personality for narrative personality). This is the full when/when-not/alternatives triad.
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 overwrite the prior in-memory projection and are audited; the Novel file stays authoritative and read-only actions never mutate Novel state. Use when: building or rebuilding the index (index_build) or the graph (graph_build); checking staleness (index_status/graph_status); listing indexed items (index_list); ranking candidates against a query (index_search); reading index relations (index_relations); reading the whole graph (graph_get), its nodes or edges (graph_nodes/graph_edges), or a node's neighbors (graph_neighbors). Do NOT use when: searching a bound ruleset's index — use manage_ruleset (action: search); recording knowledge — use manage_lore or 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 already declare destructiveHint=true and idempotentHint=false, and the description reinforces this with the key operational fact that index_build/graph_build overwrite the prior in-memory projection. It adds genuinely non-derivable context: builds are audited, the Novel file remains authoritative, and read-only actions never mutate Novel state. It stops short of describing lifetime/eviction of the in-memory projection or any permission requirements, so it is strong but not exhaustive.
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 is front-loaded, then the when/when-not blocks, with no filler sentences; every clause maps to an action or an alternative. It is dense and readable, though the run-on action list would scan faster as a bulleted or structured breakdown.
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, and annotations already carry the safety profile. For an 11-action multiplexed tool the description supplies purpose, per-action intent, mutation semantics, authoritative-source rules and sibling alternatives — nothing an agent needs in order to pick the right action 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 description coverage is 100%, so the baseline is 3, but the description goes beyond the schema's terse 'index_* actions operate the semantic index' by explaining what each action actually does, which is the primary discriminator among the five parameters. It does not add format or constraint detail for limit, query, item_id or node_id beyond the schema, so it earns 4 rather than 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+resource ('Manage derived, in-memory knowledge over Novel sources') and immediately decomposes it into two concrete subsystems: a semantic index for advisory text ranking and a typed knowledge graph. The per-action enumeration and named sibling redirects make it distinguishable from manage_lore, manage_corpus and manage_ruleset 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?
Contains an explicit 'Use when:' clause mapping each of the 11 actions to its task (build, staleness check, list, rank, read relations/graph/nodes/edges/neighbors) plus a 'Do NOT use when:' clause with three named alternatives and the exact alternate action (manage_ruleset action: search). This is the rare definition that routes rather than merely describes.
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. 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). import defaults mode to dry-run; merge or replace writes. Use when: creating, revising, removing, toggling, grouping, suggesting, listing, exporting, or importing lore. Do NOT use when: recording a story beat — use manage_story (action: record); recording one entity's beliefs — use manage_belief; recording one entity's perceptions — use manage_perception.
| 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. | |
| 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?
With annotations already declaring destructiveHint=true, readOnlyHint=false, and idempotentHint=false, the description adds useful context: mutating actions persist and are audited, read-only actions do not mutate state, and import defaults to dry-run unless merge or replace is chosen. It also explains that the most recent mutation can be reverted via manage_history. The description could go further by detailing specific destructive consequences or permission requirements, but it meaningfully supplements the 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 front-loaded with the core purpose and behavioral traits, then structured with clear 'Use when' and 'Do NOT use when' sections. The list of actions in the usage section is somewhat long but each item aids routing, and there is no redundant restatement of the title or schema. It is appropriately sized for a multi-action tool with many siblings.
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 13 parameters, an output schema, and full annotation coverage, the description provides sufficient context: it explains purpose, distinguishes from siblings, clarifies mutating versus read-only behavior, notes the audit and import defaults, and points to manage_history for undo. No additional return-value or parameter documentation is needed because the schema and output schema handle those details.
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. The description adds meaning beyond the schema by specifying that import defaults to dry-run mode and that merge or replace performs writes, which clarifies the mode parameter's default behavior. It also groups actions into mutating versus read-only categories, helping the agent interpret the action parameter without listing every enum value.
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: managing the active Novel's lore entries — shared, durable world facts. It distinguishes itself from siblings by explicitly naming manage_story, manage_belief, and manage_perception as alternatives for related but different tasks. An agent can identify exactly what this tool does 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?
The description provides explicit 'Use when' and 'Do NOT use when' sections, listing concrete actions (creating, revising, removing, etc.) and naming the correct alternatives for story beats, beliefs, and perceptions. It also directs the agent to manage_history for undo and notes the import default mode. This leaves no ambiguity about when to select this tool versus its siblings.
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. 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). set's badge_scope defaults to game_master. Use when: storing scratch state the caller will reuse. Do NOT use when: recording durable world facts — use manage_lore (action: set).
| 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. | |
| 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?
Adds real context beyond the annotations: mutations persist to the Novel and are audited, reads do not mutate state, and the most recent mutation is undoable via manage_history. The destructive/audited/reversible profile is consistent with destructiveHint=true and idempotentHint=false, though it doesn't spell out precisely what a remove destroys or permission requirements.
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: identity and scope first, then mutation/audit semantics, then undo routing, then use/don't-use. Every clause carries information; 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 multi-action mutating tool with an output schema, annotations, and full schema coverage, the description supplies the missing decision layer (scratch vs. lore, undo path, defaults). 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 the baseline is 3; the description earns an extra point by disclosing a behavior the schema does not — that set's badge_scope defaults to game_master — which materially affects correct invocation.
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 scope: Novel-scoped scratch notes, badge-scoped to game_master/player/shared. It explicitly differentiates itself from the closest sibling (manage_lore) by naming the boundary between scratch state and durable world facts.
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, names the alternative (manage_lore action: set) for durable facts, and routes the undo path to manage_history (action: undo). An agent has everything needed to choose between this and its alternatives.
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, export, import, rename, describe, list, archive, unarchive, info, genre, clone, branch, save_context, get_context, or checkpoint. 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). import defaults mode to dry-run; strict turns a reference-validation failure into a hard block. Use when: handling a campaign's lifecycle, interchange, return points, or branching a timeline. Do NOT use when: managing content inside the Novel — use the entity tools (manage_npc, manage_lore, manage_faction, manage_vow, manage_story, manage_note).
| 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, 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 declare destructiveHint=true, readOnlyHint=false, and non-idempotence, so the safety profile is largely covered; the description adds real value on top by stating that mutating actions persist and are audited while read-only actions do not mutate state, and that import defaults to dry-run with strict escalating a reference mismatch to a hard block. It stops short of saying what specifically is destroyed or how branching/clone interact with the source Novel.
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 operation list, then behavior, then the when/when-not routing, in four tight sentences with no filler. Size is justified for a 21-action multiplexed tool, and the action enumeration is compressed to a single clause rather than a bulleted expansion of the schema enum.
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-value explanation is unnecessary, and the description still covers mutation/audit semantics, the undo path, import safety modes, and scope exclusions. It is slightly thin on the checkpoint family, which is collapsed into the single word 'checkpoint' even though the schema exposes four distinct checkpoint actions.
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 per-parameter 'which action uses this' annotations already carry most semantic load and the baseline would be 3. The description earns above baseline by disambiguating two behavioral parameters: import defaults mode to dry-run, and strict converts a reference-validation failure into a hard block.
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 concrete verb and resource ('Manage Novel save files') and then enumerates the concrete lifecycle, interchange, branching, and checkpoint operations, so an agent knows this is the save-file lifecycle tool rather than a content tool. It also explicitly names the sibling entity tools it is not, letting an agent separate it from manage_npc/manage_lore 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: handling a campaign's lifecycle, interchange, return points, or branching a timeline' and 'Do NOT use when: managing content inside the Novel', naming six concrete alternative tools. It additionally routes undo to manage_history (action: undo), giving a clear when-to-use path for reversal.
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. 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). 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 |
|---|---|---|---|
| mind | No | Optional GM-only NPC mind (create/update). | |
| name | No | NPC name (create). | |
| goals | No | Optional goals. | |
| action | Yes | create, update, remove, list, or get. | |
| npc_id | No | NPC identifier (update/remove/get). | |
| location | No | Optional location. | |
| description | No | Optional description. | |
| disposition | No | Optional disposition. | |
| 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?
Annotations already declare readOnlyHint=false, destructiveHint=true and idempotentHint=false; the description goes beyond them by disclosing that mutating actions persist to the Novel and are audited while read-only actions do not mutate state, plus the undo path via manage_history. It stops short of saying what 'remove' actually destroys or whether operations require specific permissions, so it adds real value without being fully exhaustive.
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 short sentences, front-loaded with purpose, then behavior, then recoverability, then the use/don't-use rules. No sentence is redundant and no filler is present.
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?
The tool has annotations, a 100%-covered schema with a nested mind object, and an output schema, so return values and field semantics are already handled elsewhere. The description supplements that with persistence/audit behavior, an undo route, and sibling routing — enough 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 description coverage is 100% and each of the 9 parameters carries its own description including action-scoping hints (e.g. 'NPC identifier (update/remove/get)'), so the schema does the heavy lifting. The prose adds no parameter-level syntax, defaults, or format details beyond it, making baseline 3 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?
States a specific verb+resource with scope ('Manage non-player characters in the active Novel') and immediately separates itself from the closest sibling via the explicit 'Do NOT use when: managing player characters — use manage_character'. An agent can pick between manage_npc and manage_character 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?
Enumerates the activating cases ('introducing, revising, removing, listing, or reading NPCs'), names an exclusion with a redirect ('player characters — use manage_character'), and provides the recovery route ('Revert the most recent mutation with manage_history (action: undo)'). 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_perceptionPerception Ledger ManagementADestructive
Record and read what an entity perceived — messages, scene changes, and observations — as an append-only ledger distinct from belief. Mutation (record) persists to the Novel and is audited; list/for_entity/for_event are read-only. Use when: recording that an entity perceived something (record), listing perceptions (list), or reading an entity's or an event's perceptions (for_entity/for_event). Do NOT use when: recording what an entity believes — use manage_belief; recording shared world facts — use manage_lore; recording observations for provenance — use manage_session (action: event).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | message, scene, or observation (record; default observation). | |
| action | Yes | record, list, for_entity, or for_event. | |
| summary | No | What was perceived (record). | |
| entity_id | No | Entity that perceived (record/for_entity). | |
| event_ordinal | No | Contributing event-log ordinal (record/for_event; defaults to the latest event). |
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 meaningful context beyond the annotations: the ledger is append-only, the record action persists to the Novel and is audited, and the read actions are side-effect free. This tells the agent which of the four actions mutate and which are safe. The only gap is a mild tension with destructiveHint=true, which an append-only ledger framing does not explain.
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 separates 'Use when' from 'Do NOT use when' in a scannable structure. The list of alternatives is dense but every clause carries routing information; no filler 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?
With annotations covering the safety profile and an output schema present (so return values need no explanation), the description supplies all remaining decision-critical context: scope, per-action read/write behavior, and sibling routing. Complete for an agent to select and invoke 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 description coverage is 100%, so the baseline is 3, but the description adds semantic meaning by tying the action enum values to outcomes (record persists and is audited; list/for_entity/for_event are read-only) and by characterizing the kind values. This goes beyond restating the schema field docs.
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 set (record/read) applied to a concrete resource (what an entity perceived: messages, scene changes, observations) and explicitly positions it as a ledger distinct from belief. An agent can distinguish it from manage_belief and manage_lore 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?
Provides explicit 'Use when' routing for each action (record/list/for_entity/for_event) and explicit 'Do NOT use when' clauses naming the correct alternatives (manage_belief, manage_lore, manage_session action:event). 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_relationshipRelationship ManagementADestructive
Manage directed relationships between entities, NPCs, or factions. 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). Use when: setting or reading how two parties relate. Do NOT use when: tracking faction 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?
Annotations already declare destructiveHint=true and readOnlyHint=false; the description adds genuinely new context by explaining that mutating actions persist to the Novel and are audited, that read-only actions do not mutate state, and that the last mutation can be reverted through 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?
Four sentences, none wasted: scope, persistence/audit behavior, revert route, and use/do-not-use routing are all front-loaded and each earns its place.
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 so return values need no explanation, annotations cover safety, and the description supplies the missing behavioral and routing context (persistence, audit, undo, sibling disambiguation) needed to call this correctly among 30+ siblings.
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 two enums (action, type) are already documented in the schema, so the description adds little beyond restating that it sets or reads relationships. Baseline 3 is appropriate when the schema carries parameter meaning.
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) and resource (directed relationships between entities, NPCs, factions), plus names the sibling it must not be confused with (manage_faction). An agent can distinguish it from the 30+ other 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 when-to-use ('setting or reading how two parties relate') and when-not ('tracking faction progress — use manage_faction (action: update)'), plus an alternate recovery path via manage_history (action: undo). This is the full when/when-not/alternative triad.
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 a bound ruleset's index, install or remove a package, list installed packages, bind a Novel to a ruleset, roll on a generation table, or import/remove a supplementary ruleset. import_supplementary uses inline wisdom when present and reads source only when absent. install/remove are reversible via the paired action; roll and search are read-only. Use when: searching rules content, installing/removing/listing packages, binding a Novel, rolling a table (roll), or adding/removing supplementary Wisdom (import_supplementary/remove_supplementary). Do NOT use when: the Novel is ruleset-free — use run_command (action: suggest) or manage_session (action: health). install/remove/import_supplementary/remove_supplementary mutate state and are audited; search and roll are read-only.
| 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, roll, 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?
Annotations declare destructiveHint=true globally, which is misleading for a tool that mixes reads and writes; the description usefully corrects this by stating search and roll are read-only, install/remove are reversible via the paired action, and the mutating actions are audited. It stops short of describing failure modes or prerequisites for bind/install beyond the reversible pairing.
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 operation list and kept tight, but the first sentence's action enumeration is largely repeated in the 'Use when' clause, creating mild redundancy across an otherwise efficient block.
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, 8-action tool with an output schema and full annotation coverage, the description supplies everything an agent needs to choose the right action: action semantics, read vs write behavior, alternative tools for the excluded case, and the wisdom/source precedence rule. Return values are covered by the output schema, so nothing material 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 a genuine cross-parameter rule: import_supplementary prefers inline 'wisdom' and only reads 'source' when wisdom is absent. That behavior is not derivable from the per-parameter schema text, though the remaining 13 parameters get no added explanation.
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 (ruleset packages) and enumerates the concrete operations: search an index, install/remove a package, list installed packages, bind a Novel, roll a generation table, and import/remove supplementary rulesets. This lets an agent distinguish it from the many manage_* siblings 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 provides explicit 'Use when' conditions mapped to specific actions and a 'Do NOT use when' clause naming two concrete alternatives (run_command with action: suggest, manage_session with action: health) for the ruleset-free case. This is textbook when/when-not/alternative routing.
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. 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). set derives the description from location only when description is omitted. Use when: setting scene state (description, location, type), the narrative directive, party presence, AI autonomy, or when offering choices or resolving an oracle roll. Do NOT use when: recording a story beat — use manage_story (action: record).
| Name | Required | Description | Default |
|---|---|---|---|
| beat | No | Story-beat tag (set): setup, escalation, turning_point, climax, resolution, denouement. | |
| seed | No | Deterministic seed (oracle). | |
| level | No | Autonomy level (autonomy). | |
| action | Yes | set, directive, presence, autonomy, choices, or oracle. | |
| prompt | No | Choice prompt (choices). | |
| safety | No | Safety tier (autonomy). | |
| 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). | |
| creativity | No | Creativity (autonomy). | |
| entity_ids | No | Entities present (presence). | |
| 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). | |
| confirmation | No | Confirmation mode (autonomy). | |
| 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?
Annotations already declare destructiveHint=true and non-idempotent mutation, but the description adds real value: mutating actions persist to the Novel and are audited, read-only actions don't mutate, undo routes to manage_history, and 'set' derives description from location only when omitted. It stops short of describing auth/permission needs or what persistence means for overwritten scene fields.
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 and the persistence/audit rule before the routing clauses; four sentences with little waste. Slightly dense, but every clause earns its place.
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, full parameter descriptions, and annotations present, the description only needs to supply routing and mutation semantics, which it does. Minor gap: the choices/oracle resolution actions are named but their result flow isn't described.
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% across 23 parameters with per-parameter action tags, so the schema carries the load. The description adds only two semantic nuggets (description derivation from location, undo via manage_history); 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?
States a specific verb+resource ('Manage the active scene and its narrative framing') and enumerates the six action areas (set state, directive, presence, autonomy, choices, oracle). It clearly separates itself from manage_story and manage_history, though the multi-action umbrella means the individual actions are only briefly glossed.
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:' clauses, naming manage_story (action: record) as the alternative for story beats, plus the undo path via manage_history. An agent can route without inferring anything.
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 session-level surfaces, diagnostics, and tool discovery. event with supersede appends a replacement and marks that ordinal superseded. Use when: recapping recent activity (recap), setting output verbosity (verbosity), reordering briefing sections (briefing_order), summarizing the audit log (compress) or compacting it irreversibly (compact), reporting server health (health), discovering or searching the tool catalog (discover), reassigning a tool's category for the session (category), or appending and reading the Novel event log (event, history). Category reassignment, event append, and audit compaction mutate Novel-scoped state and persist; recap/verbosity/briefing_order/health/discover/history are read-only diagnostics or session-scoped settings. Do NOT use when: recording story content — use manage_story (action: record).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | normal or terse (verbosity). | |
| text | No | Observation text (event). | |
| 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, subscribe, discover (list/search tools), category (reassign a tool's category), event (append an observation), or history (read the event log). | |
| source | No | Event source classification (event). | |
| topics | No | Notification topics to subscribe to (subscribe). | |
| 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). | |
| 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). | |
| 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). | |
| 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 only flag the tool globally as destructive/non-idempotent, which is conservative for a multi-action tool; the description adds real value by partitioning the actions into mutating ('category reassignment, event append, and audit compaction mutate Novel-scoped state and persist') versus read-only ('recap/verbosity/briefing_order/health/discover/history'). It also calls out that compaction is irreversible and that supersede marks the replaced ordinal. No contradiction with 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?
Given eleven actions, the description is compact and front-loaded, moving from a one-line purpose to the mutation summary to 'Use when:' and 'Do NOT use when:'. The action-to-intent parentheticals keep it scannable. It is dense but each clause earns its place for a tool of this breadth.
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 usage, mutation semantics, irreversibility, and the sibling exclusion. The remaining gap is minimal: no guidance on permission requirements beyond the schema's GM-only note, but nothing an agent needs to invoke 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 description coverage is 100%, so the schema already documents all 16 parameters with per-action hints. The description maps some actions to their parameters but adds no syntax, format, or constraint detail beyond what the schema provides. Baseline 3 is appropriate when the schema carries the load.
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 (session-level surfaces, diagnostics, tool discovery) and enumerates the concrete actions it fronts (recap, verbosity, briefing_order, compress, compact, health, discover, category, event, history). It also distinguishes itself from a sibling by name (manage_story for recording story content). The verb 'Manage' is broad and the scope is sprawling, which keeps it out of 5 territory, but the action enumeration makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit 'Use when:' mapping each action to its intent (recapping activity, setting verbosity, reordering briefing sections, summarizing/compacting the audit log, health, discovery, category reassignment, event/history) and an explicit 'Do NOT use when:' clause naming the alternative (manage_story, action: record). This is textbook when/when-not/alternative guidance.
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). 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). promote uses index and writes lore under key (default derived). 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). |
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; the description reinforces this by separating mutating actions ('persist to the Novel and are audited') from read-only ones, and discloses the revert path via manage_history undo. It stops short of saying what remove actually destroys or whether edits are recoverable beyond the last mutation, so it adds context but leaves a gap.
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 usage rules — a sensible ordering with no filler. It is dense (six stacked clauses) but every clause carries actionable information; only the audit/persist detail is slightly incidental.
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 described, and annotations carry the safety profile. The description covers domain, mutation risk, undo routing, and the promote/key interaction; the only unaddressed area is pagination behavior for list, which the schema covers at the parameter level.
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 baseline is 3, but the description adds real semantics the schema does not: 'promote uses index and writes lore under key (default derived)', clarifying cross-parameter interaction and the default. Other params (filter, limit, offset, entry) are 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?
States a specific verb+resource ('Manage the story journal') and immediately qualifies the resource as typed narrative memories with the five enum types, so the agent knows exactly what domain this covers. It also names the sibling it is not (manage_lore) and the adjacent history tool, making it distinguishable from the ~30 sibling manage_* tools.
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 when-to-use ('recording, editing, removing, listing, or promoting story beats') and explicit when-not with the correct alternative ('recording a durable world fact — use manage_lore (action: set)'). It also routes the undo path to manage_history, which is a genuine alternative-selection rule.
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 persist to the Novel and are audited; read-only actions do not mutate state. Revert the most recent mutation with manage_history (action: undo). activate/deactivate with key omitted act on the whole module. Use when: running, reverting, listing, activating, deactivating, toggling, or player-authoring synthesis 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: string). | |
| force | No | Re-run even if unchanged (run). | |
| action | Yes | run, revert, list, activate, deactivate, toggle, toggle_action, player_add, player_remove, or player_list. | |
| detail | No | Return full entries (list). | |
| module | No | Synthesis module (activate/deactivate/toggle/player_*/list). | |
| content | No | Item content (player_add). | |
| enabled | No | Enable or disable (toggle). | |
| triggers | No | Recall triggers (player_add). | |
| badge_scope | No | shared or player (player_add). |
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 real context beyond them: mutating actions persist to the Novel and are audited, read-only actions leave state untouched, and omitting key on activate/deactivate acts on the whole module. It stops short of mapping each action to its individual destructive/read-only nature, which would be the full picture.
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 a compact behavioral clause, then explicit when/when-not guidance. Every sentence carries routing or behavioral information; the parenthetical content-type list is the only mildly expendable element.
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 no explanation. The description covers persistence, audit trail, whole-module semantics, revert path, and sibling exclusions — everything needed to invoke a 10-action, 9-parameter 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 baseline is 3, but the description adds a genuinely non-obvious semantic: activate/deactivate with key omitted operate on the whole module. It also points to manage_history (action: undo) as the revert mechanism, adding meaning beyond the enum listing.
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) and resource (synthesis content), then enumerates the concrete content types it covers (voice examples, lore templates, action patterns, Ruleset Wisdom). It explicitly routes non-matching cases to siblings (manage_codex, manage_history), so an agent can distinguish it without opening a 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 of actions and a 'Do NOT use when: browsing the codex — use manage_codex (action: list)' exclusion. It also names manage_history (action: undo) as the revert path, giving both positive and negative routing.
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. 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). set's difficulty sets the rank track and the linked countdown's ticks; scope defaults to shared. 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?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation profile is partly known. The description adds genuinely new context: mutating actions persist to the Novel and are audited, read-only actions do not mutate state, and the most recent mutation is reversible via manage_history. It stops short of noting irreversibility limits or auth requirements, so a 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: purpose first, then mutation semantics, then undo path, then when/when-not. Every sentence carries operational value, though the compound final clauses are slightly packed and could be split for readability.
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 an output schema exists and annotations plus 100% schema coverage are present, the description only needs to supply routing, mutation semantics, and the undo path — all of which it does. Nothing an agent needs to select or invoke this tool 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 meaning beyond the schema: 'difficulty' drives the rank track and the linked countdown's ticks, and 'scope' defaults to shared when omitted. That default-value and cross-field linkage information is not in 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 and resource ('Track narrative vows, quests, and obligations with milestones') and enumerates the supported operations. It clearly differentiates itself from siblings by naming manage_countdown and manage_history as the tools for adjacent concerns, so an agent can route 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?
Provides explicit 'Use when:' triggers (setting, advancing, resolving, forsaking, listing) and an explicit 'Do NOT use when:' exclusion that names the alternative tool and action ('use manage_countdown (action: set)'). It also routes the undo case to manage_history with the precise action, 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_worldWorld Model ManagementADestructive
Manage the world model — rooms, things, and exits. 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). create_thing honors location_type only when location is set; kind forces property defaults. Use when: creating, updating, removing, or bulk-converting locations and objects. Do NOT use when: navigating the world — use run_command (action: execute) or run_command (action: resolve).
| 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). | |
| action | Yes | create_room, update_room, remove_room, create_thing, update_thing, remove_thing, create_exit, remove_exit, convert, or generate. | |
| 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). | |
| 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?
Beyond the annotations (destructiveHint=true, readOnlyHint=false), it discloses that mutating actions persist to the Novel and are audited while read-only actions do not mutate state, and it names the exact undo route. That is meaningful behavioral context the annotations cannot express.
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?
Reasonably sized for a 10-action, 30-parameter tool, with purpose and persistence semantics front-loaded. Some clauses are dense run-ons ('create_thing honors location_type only when location is set; kind forces property defaults'), but every sentence 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?
An output schema exists so return values need no explanation, and the description covers mutation semantics, undo, and routing. It stops short of clarifying the convert/generate actions, which are the least self-explanatory members of the action enum.
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 adds real meaning on top by stating that create_thing honors location_type only when location is set and that kind forces property defaults. It does not explain the convert/generate semantics or the mutual exclusion of room_a/room_b/from/to pairs.
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 the specific resource ('the world model — rooms, things, and exits') and the operations (create, update, remove, bulk-convert). It explicitly contrasts itself with run_command for navigation, so an agent can separate it from siblings 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' clause (creating, updating, removing, bulk-converting locations and objects) and a 'Do NOT use when' clause routing navigation to run_command (execute/resolve). It also names the recovery path (manage_history action: undo).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_fateResolve Fate ActionsADestructive
Resolve Fate-style actions with Fudge dice, aspects, Fate points, and stress. Rolls and state changes (points, stress, momentum, progress) persist to the Novel; a roll with no following write is flagged as an uncommitted roll. stress with neither track nor consequence clears all tracks and consequences. Rolls and their state writes are recorded and are not individually reversible. Use when: rolling 4dF against a difficulty, invoking or compelling aspects, spending or refreshing Fate points, or marking stress and consequences. Do NOT use when: resolving a d20 skill check — use the bound ruleset's roll tools or run_command (action: resolve).
| Name | Required | Description | Default |
|---|---|---|---|
| op | No | Sub-operation: aspect (create, invoke, compel, remove, list), fate_point (spend, grant, refresh, list), or stress (mark, clear, list). | |
| dice | No | Fudge dice notation (roll), e.g. '4dF'; defaults to 4dF. | |
| name | No | Aspect name (aspect); consequence label (stress). | |
| seed | No | Deterministic seed (roll). | |
| skill | No | Skill name for the roll label (roll). | |
| track | No | Stress track to mark or clear (stress). | |
| action | Yes | roll, aspect, fate_point, or stress. | |
| amount | No | Fate points to spend or grant (fate_point); defaults to 1. | |
| shifts | No | Shifts to mark on a stress track (stress); defaults to 1. | |
| target | No | Aspect target: 'scene' or an entity/NPC id (aspect); defaults to 'scene'. | |
| modifier | No | Skill rating added to the roll (roll). | |
| entity_id | No | Entity or NPC id (aspect/fate_point/stress). | |
| difficulty | No | Opposition to beat (roll); defaults to 0. | |
| consequence | No | Consequence to record or clear (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?
Goes well beyond the annotations (destructiveHint=true, idempotent=false) by disclosing that rolls and state writes persist to the Novel, that a roll with no following write is flagged as uncommitted, that stress without track or consequence clears everything, and that operations are not individually reversible. This is exactly the irreversibility/persistence context a mutating 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?
Front-loaded with the core capability and then the when/when-not routing; every sentence carries behavioral or routing information. It is dense and runs long, but there is little waste.
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 mutating tool with an output schema present and full schema coverage, the description supplies the missing behavioral context (persistence, irreversibility, uncommitted-roll flagging) that the structured fields cannot convey. Nothing needed to invoke 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 the baseline is 3, but the description adds semantic grouping beyond the schema by tying the op sub-operations to action types and explaining the stress clearing rule (track/consequence omission). It doesn't detail every parameter's format, so a 4 is fair.
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 domain (resolve Fate-style actions with Fudge dice, aspects, Fate points, stress) and enumerates the sub-operations, which cleanly distinguishes it from siblings resolve_ironsworn and resolve_forged. An agent knows exactly which ruleset surface this tool covers.
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 rolling 4dF, invoking/compelling aspects, spending/refreshing Fate points, marking stress and consequences. The 'Do NOT use when' clause names the alternative (bound ruleset's roll tools or run_command with action: resolve) for d20 checks, giving a concrete routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_forgedForged in the DarkADestructive
Resolve Blades in the Dark-style actions: action rolls with position and effect, stress and trauma with resistance, and downtime recovery. Rolls and state changes (points, stress, momentum, progress) persist to the Novel; a roll with no following write is flagged as an uncommitted roll. action_roll with dice 0 rolls the lower of two d6; stress name labels the resist consequence or the trauma mark. Rolls and their state writes are recorded and are not individually reversible. Use when: rolling an action against the highest die, marking or resisting stress, or recovering during downtime. Do NOT use when: tracking a progress clock — use manage_countdown (action: set).
| Name | Required | Description | Default |
|---|---|---|---|
| op | No | Sub-operation: stress (mark, clear, resist, list), downtime (recover, indulge_vice, list). | |
| cost | No | Stress cost to resist (stress); defaults to 2. | |
| dice | No | Dice pool size (action_roll); defaults to 2. | |
| name | No | Action name (action_roll) or consequence label (stress resist). | |
| seed | No | Deterministic seed (action_roll). | |
| action | Yes | action_roll, stress, or downtime. | |
| amount | No | Stress to mark or clear (stress/downtime); defaults to 1. | |
| effect | No | Effect (action_roll); defaults to standard. | |
| position | No | Position (action_roll); defaults to risky. | |
| entity_id | No | Entity or NPC id (stress/downtime). |
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-idempotency, but the description adds substantial context the annotations cannot carry: rolls and state changes persist to the Novel, a roll with no following write is flagged as uncommitted, and rolls/state writes are not individually reversible. It also clarifies the odd dice-0 case and what the stress name label applies to.
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 paragraph is front-loaded with purpose, then behavior, then usage guidance, with no filler sentences. It is dense but every clause carries information; 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?
With an output schema present, return values need not be described, and the description still covers persistence, the uncommitted-roll flag, reversibility, and routing to alternatives. For a 10-parameter, destructive, stateful tool this is complete enough 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 description coverage is 100%, so the baseline would be 3, but the description adds meaning beyond the schema: 'action_roll with dice 0 rolls the lower of two d6' and 'stress name labels the resist consequence or the trauma mark.' These clarify ambiguous parameters (dice, name) that the schema documents only generically.
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 verb (resolve) and resource (Blades in the Dark-style actions) and enumerates the three action families: action rolls with position/effect, stress/trauma with resistance, and downtime recovery. This distinguishes it cleanly from siblings like resolve_fate and resolve_ironsworn 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 provides explicit 'Use when:' conditions (rolling an action against the highest die, marking/resisting stress, recovering during downtime) and an explicit 'Do NOT use when:' routing the agent to manage_countdown for progress clocks. Both the trigger and the exclusion name the alternative, 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.
resolve_ironswornResolve Ironsworn MovesADestructive
Resolve Ironsworn-style actions: momentum, the action-roll move framework, and progress tracks. Rolls and state changes (points, stress, momentum, progress) persist to the Novel; a roll with no following write is flagged as an uncommitted roll. move's burn replaces the action die with momentum and ignores adds; progress rank defaults to dangerous. Rolls and their state writes are recorded and are not individually reversible. Use when: setting or burning momentum, rolling a move against two challenge dice, or marking and testing a progress track. Do NOT use when: managing vows — use manage_vow (action: set).
| Name | Required | Description | Default |
|---|---|---|---|
| op | No | Sub-operation: momentum (set, gain, lose, reset, list), progress (create, mark, test, list). | |
| adds | No | Stat and bonuses added to the action die (move). | |
| burn | No | Burn momentum to replace the action score (move). | |
| name | No | Move name (move) or progress-track name (progress). | |
| rank | No | Progress-track rank (progress). | |
| seed | No | Deterministic seed (move, progress test). | |
| ticks | No | Progress to mark (progress); defaults to 1. | |
| action | Yes | momentum, move, or progress. | |
| amount | No | Amount to set/gain/lose (momentum); defaults to 1. | |
| entity_id | No | Entity or NPC id (momentum, move burn). |
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/non-idempotent, and the description goes further: state changes persist to the Novel, a roll with no following write is flagged as uncommitted, rolls and their writes are not individually reversible, and burn semantics (replaces action die with momentum, ignores adds). That is meaningful behavioral context beyond the structured hints.
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 core purpose leads, then mechanics, then routing. Every sentence carries information, though the mechanics/constraints run together in a way that makes it slightly heavy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-mode tool with 10 parameters, 100% schema coverage, and an output schema, the description supplies what the schema cannot: persistence, irreversibility, uncommitted-roll flagging, and sibling routing. An agent can select and invoke it correctly without further information.
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. The description still adds semantics the schema does not carry: burn 'ignores adds' and progress rank 'defaults to dangerous'. It does not document the op sub-operations (momentum set/gain/lose/reset/list, progress create/mark/test/list), which remain schema-only.
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 (resolve) plus the concrete resources involved: momentum, the action-roll move framework, and progress tracks. It is clearly distinguishable from sibling resolvers like resolve_fate and resolve_forged, and from the manage_* state tools.
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 gives a 'Use when' list (setting/burning momentum, rolling a move against two challenge dice, marking and testing a progress track) and a 'Do NOT use when' case that routes to the named alternative 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. 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, so the safety profile is covered. The description earns credit for going beyond that by disclosing the atomic drain-and-persist mechanism, which explains why the operation is one-shot and non-repeatable, and the schema notes that 'cancel' aborts and restores a snapshot.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and mechanism, followed by a compact 'Use when / Do NOT use when' structure. Every clause carries actionable information and there is 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?
An output schema exists, so return values need not be described. Given the tool's mutation semantics, the annotations cover reversibility, and the description covers the trigger, the exclusivity condition, and the persistence side effect — everything needed 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 description coverage is 100%, and the schema itself documents both parameters, including the special 'cancel' value with its restore-snapshot behavior. The description adds no additional syntax, format, or constraint detail beyond what the schema provides, so the 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?
States a specific verb (answer/respond) and resource (pending workflow decision) plus the mechanism: 'atomically draining it and persisting the outcome to the Novel.' The second sentence names the sibling tools (set_badge, state tools) that should be used in the alternative case, so an agent can distinguish this tool 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?
Explicitly gives the trigger condition ('the server emitted a [NEED_INPUT] prompt and the caller must choose') and the negative condition ('no decision is pending'), and routes to named alternatives. Nothing about when to call versus not call 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.
run_commandParser CommandADestructive
Execute a parser command, resolve a spatial intent, or suggest actions from intent. execute mutates world/entity state; resolve and suggest are read-only. execute persists to the Novel and is reversible with manage_history (action: undo); resolve and suggest are read-only. Use when: a player or narrator takes a physical action (execute), needs the outcome of a movement without mutating state (resolve), or wants intent mapped to tool calls (suggest). Do NOT use when: the GM inspects the model directly — use manage_world or manage_lore.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | execute (parser), resolve (non-mutating intent), or suggest (intent → tool calls). Defaults to execute. | |
| intent | No | The intent to resolve or map (resolve/suggest). | |
| 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?
Annotations only say the tool is destructive/non-read-only, which is true for execute but misleading for resolve and suggest. The description corrects that by stating execute mutates world/entity state while resolve and suggest are read-only, and adds the key behavioral fact that execute persists to the Novel and is undoable via manage_history (action: undo). That is exactly the context annotations cannot express.
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 routing clauses are front-loaded and well ordered, but the second sentence is largely redundant: 'resolve and suggest are read-only' is stated twice in adjacent clauses. That repetition costs a point on an otherwise compact definition.
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 tri-mode tool with four params and an output schema, the description covers the decision-relevant facts: what each mode does, which mutate, reversibility and the undo path, and which sibling to use instead for direct inspection. 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 description coverage is 100%, so the baseline is 3, but the description goes further by tying each action to its parameter (execute consumes a command, resolve/suggest consume intent, entity_id is suggest-scoped). It stops short of documenting formats or the execute default, which the schema already covers.
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 verb (execute/resolve/suggest) and the resources involved (parser command, spatial intent, world/entity state), and explicitly routes away from manage_world/manage_lore. The only friction is the multi-mode nature and the jargon 'parser command', which forces the reader to reconcile the tool name run_command with three distinct behaviors.
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' clause for each of the three modes (physical action → execute, movement outcome without mutation → resolve, intent mapped to tool calls → suggest) and an explicit 'Do NOT use when' clause naming manage_world and manage_lore as alternatives. This is about as complete as routing guidance gets.
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 session; always callable. 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?
Annotations already declare the safety profile (readOnly false, destructive true, idempotent false), so the bar is lower. The description still adds real context beyond them: the badge gates tool access server-side for the session, and the tool is always callable — useful for reasoning about access loss. It stops short of saying explicitly that switching away can revoke currently available tools mid-task, which is the destructive consequence an agent should weigh.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed clauses: what it does, when to use, when not to use. Front-loaded with the action and scope, no filler sentences, every clause earns its place.
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 not be explained. For a single-enum-parameter state-switching tool with full annotation coverage, the description supplies everything needed to select and 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 description coverage is 100% and the enum is fully documented in the schema, so the description adds nothing new when it lists the same four values. Baseline 3 applies when the schema carries the parameter semantics.
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 (switch the active badge), enumerates the four allowed values, and names the concrete effect: server-side gating of tool access for the session. An agent can distinguish this from every manage_* sibling without opening a 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 explicit 'Use when' triggers (entering the story, spectating, stepping away to edit) and an explicit 'Do NOT use when' case that names the correct alternative (respond_decision for a pending workflow decision). Routing is unambiguous.
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.
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 33 tools
Tools mostly target clearly distinct subsystems, and descriptions include explicit 'Do NOT use when' routing to adjacent tools. However, the large set of knowledge/lore/belief/perception/corpus/causal tools creates several subtle boundaries that an agent must read carefully.
Names are consistently snake_case and mostly follow predictable manage_<domain> or resolve_<system> patterns. A few control/session tools like run_command, respond_decision, and set_badge are reasonable but minor deviations from the dominant convention.
With 33 tools, the surface is heavy for agent selection and exceeds the typical well-scoped range. While the domain is broad, many tools are multiplexed command surfaces, making the set feel overgrown rather than tightly scoped.
The surface covers a very wide lifecycle: novel management, world model, characters, NPCs, combat, conditions, factions, vows, story/lore/notes, rulesets, codex, session diagnostics, and undo/redo. No obvious major gaps are apparent for the stated narrative-game domain.
Maintenance
Related MCP Connectors
Campaign manager for D&D and TTRPG GMs: your AI reads and writes a live typed campaign database.
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.
Connect any AI to your Foundry VTT world: actors, combat, dice, journals, tokens, compendiums.
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
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to act as RPG Game Masters by managing campaign state including characters, inventory, quests, and logs through MCP tools. Supports campaign mutations and provides both MCP and HTTP API access to RPG session data.2-
- 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.10079 npm44MIT
- FlicenseNot 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.-