Skip to main content
Glama

ChatQuest AI

Play a text adventure with an AI, save your progress, and try another choice on a separate timeline.

CI License: MIT

繁體中文 · Try the story · Connect ChatGPT, Claude or Grok · Playtest transcript · Build a world

Have a coding agent set it up: agent installation guide.

ChatQuest AI keeps the inventory, rolls, story progress and each character's knowledge in local SQLite. The model reads those records through MCP before continuing a scene. That gives it something to check when a conversation gets long and details start drifting.

You can also go back to a saved decision and play a different route without overwriting the first one. JSON world packs let you write your own setting. The server provides 17 tools and has no web UI or model API calls; you bring a chat client, with its own account and hosting requirements.

The bundled demo exercises this flow with scripted prose:

PLAYER  “Read the dispatch alone. Don't tell Jun what I find yet.”
MODEL   prepare_turn → roll_check → commit_turn
ENGINE  Saves the roll and records the finding for the player only.
RETRY   Same request + same key → same receipt, no duplicate cost.
IF      “Take the bridge instead.” → fork an earlier decision, main untouched.

Why an engine behind the chat?

An item you've spent should stay spent. A secret you found alone shouldn't appear in an absent character's memory. ChatQuest AI stores the records for those checks. The model still has to use them correctly when writing the scene.

Feature

How it works

IF branches

A copy of the state and knowledge at a saved revision. Both timelines stay available.

Character knowledge

The version of a fact that each character observed. Changing a secret doesn't update their earlier memory.

Server dice

Every d20 result, including failures. A submission must acknowledge the full check set.

Save receipts

Atomic revisions and request keys. An exact retry returns the same receipt without charging the cost again; check recovery if a response is lost.

Canon search

Local FTS5/BM25 results with source hashes and line ranges, including CJK bigram support.

World events

Seeded, weighted events based on game time and cooldowns. A preview is saved only when committed.

World packs

Attributes, tracks, characters, difficulties and events defined in JSON. The engine doesn't require a particular genre or class system.

Operating guide

A bundled skill, MCP resource and prompt, plus schemas for the installed tools.

Related MCP server: Fantasy Gamebook Engine

Try it in five minutes

If you want an agent to install and configure it, give it this prompt:

Install ChatQuest AI for my MCP client using https://raw.githubusercontent.com/KinsonLai/chatquest-ai/main/docs/agent-install.md . Preserve my existing saves and other MCP settings, test the installation with a disposable database, and report any remaining client login or restart step.

Requires Node.js 24+ and npm. Try the story without cloning the repo:

npx --yes --package=https://github.com/KinsonLai/chatquest-ai/releases/download/v0.3.0/chatquest-ai-0.3.0.tgz chatquest --demo

The package downloads from GitHub Releases; it isn't published on the npm registry yet.

The Last Ferry starts at a quay before a flood. The demo plays five scenes, then tries an IF branch. A failed repair uses up supplies; a failed landing causes an injury and sends you to the high bridge. The prose is prewritten, while MCP calls, dice, saves and knowledge checks run against a real server. It doesn't call a model. For a model-run session, see the playtest transcript and findings, including submitted scenes and receipts.

For MCP clients, omit --demo:

npx --yes --package=https://github.com/KinsonLai/chatquest-ai/releases/download/v0.3.0/chatquest-ai-0.3.0.tgz chatquest

This waits for a stdio client. Add --http to serve http://127.0.0.1:3333/mcp, or --help for options. Use an absolute --db path in client settings to resume the same save. Connection instructions for ChatGPT, Claude and Grok →

To work from source:

git clone https://github.com/KinsonLai/chatquest-ai.git
cd chatquest-ai
npm ci
npm run demo

The demo uses a separate in-memory database, so it leaves your campaign save alone. Dice results vary.

Then connect a client using stdio:

{
  "mcpServers": {
    "chatquest": {
      "command": "npx",
      "args": [
        "--yes",
        "--package=https://github.com/KinsonLai/chatquest-ai/releases/download/v0.3.0/chatquest-ai-0.3.0.tgz",
        "chatquest"
      ],
      "env": { "CHATQUEST_DB": "/absolute/path/to/my-adventure.sqlite" }
    }
  }
}

Use an absolute executable path if your client cannot find npx. On Windows, use forward slashes or escaped backslashes in JSON paths. This is a local stdio configuration; ChatGPT and Grok web need the remote/tunnel setup in the client guide.

Ask your client:

Read ChatQuest AI's operating guide and workflows. Create a new campaign using the ferry template, from the beginning. Let me choose Robin's actions, keep each character's knowledge separate, and confirm saves only from committed receipts.

For an existing campaign, list campaigns and branches instead of creating a new one.

Four original starting worlds

Pack

Genre

Opening question

lantern

Folk fantasy

Why did the bridge-town lighthouse go dark?

signal

Space salvage

Who is sending a message addressed to your ship?

blackout

Urban investigation

Why do the witnesses disagree during a city blackout?

ferry

Harbour mystery

Repair the ferry or take the high bridge before the flood?

The four original packs are included under MIT. Pass your own pack through create_campaign.world, or add story text you have permission to use through ingest_canon. See the pack guide.

HTTP without a web app

npm run start:http

This listens at http://127.0.0.1:3333/mcp by default. It serves MCP requests, with no dashboard at /. Set CHATQUEST_TOKEN to require a bearer token, including for local requests.

For a remote server, bind --host 0.0.0.0, set a random token of at least 24 characters and set CHATQUEST_ALLOWED_HOSTS to your public hostname. Put TLS and request limits in front of it. Each HTTP server belongs to one owner: every authenticated connection can access that database. Don't share a token between unrelated users.

docker build -t chatquest-ai .
docker run --rm -p 127.0.0.1:3333:3333 \
  -e CHATQUEST_TOKEN -v branchwright-data:/data chatquest-ai

The Docker entrypoint binds all container interfaces, so a token is mandatory. Export it in the calling environment before running the command. The host port above remains loopback-only.

Tests use the official MCP SDK over stdio and HTTP. The client guide covers Claude's local configuration, ChatGPT's Secure MCP Tunnel route, remote HTTP and authentication requirements. OAuth is not built into this release. Account-level ChatGPT/Claude/Grok integration remains unverified. Deployment and security →

The small game loop

flowchart LR
    A[Player action] --> B[prepare_turn]
    B --> C{Meaningful uncertainty?}
    C -->|Yes| D[roll_check]
    C -->|No| E[Model writes scene]
    D --> E
    E --> F[commit_turn]
    F --> G[SQLite revision + receipt]
    G --> H[Next choice or historical IF]

Use read_guide(section="tools") for the current schemas of all 17 tools. These come from the registered tool definitions, so you can check what the installed server accepts. See workflows and recovery.

Limits

v0.3 is an early release for one owner per database. A model can still pick an unfair difficulty, leak a secret in dialogue or write a character badly. The skill gives it instructions; it doesn't enforce every sentence or override platform safety checks. The playtest report includes both database checks and a prose-review finding.

  • Retrieval uses local lexical search. It has no neural embeddings and can miss relevant passages.

  • Packs define the difficulty names and DCs. Rolls use d20; other tabletop rulesets aren't implemented.

  • World events use a seeded clock, chances and cooldowns. They don't simulate a full society or economy.

  • SQLite files contain plaintext story and save data. Back them up and keep them out of Git.

  • No branch merge, save import, multiplayer isolation, automatic LLM calls or arbitrary executable plugins in this release.

  • Keep imported canon separate from character knowledge. Importing a novel also doesn't grant permission to redistribute it.

Upgrading from Branchwright

The project became ChatQuest AI in v0.3.0. The package is chatquest-ai and the command is chatquest; branchwright still works as an alias. CHATQUEST_DB, CHATQUEST_TOKEN and CHATQUEST_ALLOWED_HOSTS take precedence over the old BRANCHWRIGHT_* variables. If you haven't set the new variables, your old settings still work.

Keep your existing absolute --db path and Docker data volume. The default is still .branchwright/state.sqlite in the working directory, and saves need no migration. Campaign and branch IDs, receipts, tool names and branchwright:// resource URIs are unchanged. We also kept the original operating-skill text and folder: pending turns use that text for validation, so renaming it would invalidate them. Refresh connector metadata to see the new server name. Old release notes and playtest receipts keep their original names.

Develop

npm ci
npm test
npm run format:check
npm run check:release
npm run check:package
npm run demo
npm pack

Tests include complete success and failure story routes, CLI startup, disk reopening, scoped proofs, historical forks, NPC knowledge snapshots, resource rollback, fixed rolls, adjudication recovery, canon immutability and actual MCP transports. CI targets Linux, Windows and macOS on Node 24. See playtest evidence for the model-led session and the remaining client verification gaps.

Make the next world

You can start with an original world pack, a reproducible model failure or a CJK retrieval test case. A new rules adapter should include tests for its invariants. Include sources and permissions for any setting you contribute.

If you find it useful, a star is welcome. See CONTRIBUTING.md for bug reports and contributions.

Other projects in this area include text-adventure-handler-mcp and dmcp. ChatQuest AI was implemented independently and is not affiliated with those projects or any model provider.

Available Tools

17 tools
commit_turnB
Idempotent

Atomically validate and commit the authorized scene. Preserve exact arguments/key on an unconfirmed retry. Only a committed receipt means success.

ParametersJSON Schema
NameRequiredDescriptionDefault
changesNo
outcomeYes
summaryYes
branch_idYes
narrationYes
campaign_idYes
fact_updatesNo
check_resultsNo
player_actionYes
policy_sha256Yes
preparation_idYes
idempotency_keyYes
expected_revisionYes
knowledge_updatesNo
check_context_sha256No

TDQS

B3.3/5.0
Behavior4/5

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

Annotations cover the safety profile (idempotentHint=true, readOnlyHint=false), but the description adds real value beyond them: atomicity, the requirement to reuse exact arguments and key on an unconfirmed retry, and that only a committed receipt proves success. It stops short of describing auth/permission needs or what an uncommitted retry returns.

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

Conciseness4/5

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

Three short, front-loaded sentences with no filler; the commit/atomicity point leads. Slight terseness given the tool's complexity, but every sentence earns its place.

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

Completeness2/5

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

For a 15-parameter, 10-required tool with nested objects, 0% schema coverage, and no output schema, this description is far too thin. It omits any guidance on the payload structure, revision/precondition semantics, or what the receipt contains, leaving large gaps an agent cannot fill from structured data.

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

Parameters2/5

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

Schema description coverage is 0% across 15 parameters, so the description carries full burden, yet it only vaguely references 'arguments/key' (likely idempotency_key). It adds essentially no meaning for expected_revision, policy_sha256, preparation_id, outcome, changes, or the other structured fields.

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

Purpose4/5

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

States a specific verb (commit) and resource (the authorized scene), and pairing it against the sibling prepare_turn is implicit but inferable. It clearly signals this is the finalization step, though it never names prepare_turn or other siblings explicitly.

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

Usage Guidelines3/5

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

Implied usage is present: 'Only a committed receipt means success' tells the agent this is the terminal commit step, and the retry note establishes retry conditions. However, there is no explicit when/when-not or named alternative (e.g. prepare_turn must precede it), so an agent must infer the workflow ordering.

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

create_branchB
Idempotent

Fork a current or historical snapshot. Copies point-in-time knowledge; never changes the source. Premise is an intention, not an accomplished event.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
premiseYes
branch_idYes
campaign_idYes
from_revisionNo
idempotency_keyYes

TDQS

B3.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=true, and openWorldHint=false. The description adds genuine context beyond them: that the source snapshot is never mutated (copy semantics) and that the premise field captures an intention rather than a realized event. This clarifies behavioral intent that structure alone doesn't convey.

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

Conciseness4/5

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

Three short, front-loaded sentences with essentially no filler; the core action leads and qualifications follow. The premise sentence is slightly cryptic in isolation but is dense rather than wasteful.

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

Completeness2/5

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

For a state-mutating creation tool with 5 required parameters and no output schema, the description omits almost everything an agent needs to call it correctly: what is returned, uniqueness/conflict behavior on branch_id or idempotency_key, and the meaning of most parameters. It is more complete than a stub but not adequate given 0% schema documentation.

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

Parameters2/5

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

Schema description coverage is 0% across 6 parameters, so the description must compensate and largely doesn't. It only adds meaning for two of them (premise as an intention, from_revision via "current or historical"), leaving campaign_id, branch_id, name, and idempotency_key entirely undocumented in both places.

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

Purpose4/5

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

The description gives a concrete verb and effect ("Fork a current or historical snapshot") plus the consequence ("Copies point-in-time knowledge"), which is enough for an agent to understand it creates a new derived branch. It does not, however, explicitly name itself as the branch-creation tool or distinguish it from siblings like list_branches or restore_checkpoint.

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

Usage Guidelines2/5

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

It implies the operation forks a snapshot (current or historical), but gives no when-to-use condition, no prerequisites, and no mention of alternatives such as restore_checkpoint. The result is that the agent must infer usage context from the name alone.

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

create_campaignA
Idempotent

Create an independent campaign from a bundled template or a supplied JSON world pack. Reuse the creation key on retries.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
worldNo
templateNo
idempotency_keyYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, so safety and idempotency are covered. The description's 'Reuse the creation key on retries' restates idempotency rather than adding new behavior, and adds nothing about auth/permissions or what happens to an existing campaign with the same name.

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

Conciseness5/5

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

Two short sentences, front-loaded with the core action, and the retry note placed last. No filler, every clause carries meaning.

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

Completeness3/5

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

Given a complex nested world schema, no output schema, and 0% parameter description coverage, the description is thinner than the tool's complexity warrants. It conveys the high-level action but omits mode exclusivity rules, template semantics, and the shape of a supplied world pack.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate and does so only partially: 'bundled template' maps to the template enum, 'JSON world pack' to the world object, and 'creation key' to idempotency_key. The required 'name' parameter and the deep world structure (genre, rules, actors, events) are never explained.

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

Purpose4/5

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

The description states a specific verb (create) and resource (campaign) and clarifies that it operates from a bundled template OR a supplied JSON world pack, which distinguishes it from read-oriented siblings like list_campaigns. It does not name a sibling explicitly, but the scope is unambiguous.

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

Usage Guidelines3/5

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

The phrase 'from a bundled template or a supplied JSON world pack' implies the two mutually exclusive creation modes (the template enum vs. the world object), and 'Reuse the creation key on retries' gives retry guidance. However, it never states when to choose this tool over create_branch or when prerequisites apply, leaving usage to inference.

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

get_knowledgeC
Read-onlyIdempotent

Read the last observed values known to one actor, player, or gm. NPC values do not follow secret world changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewerYes
branch_idYes
campaign_idYes

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive behavior, so the safety profile is covered. The description adds one genuine domain nuance ('NPC values do not follow secret world changes'), but does not explain what 'last observed' means operationally or how branching/campaign state affects the read.

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

Conciseness4/5

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

Two short sentences with the core purpose front-loaded and no filler. The second sentence is terse to the point of being cryptic, but nothing is wasted.

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

Completeness2/5

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

With no output schema and three fully undocumented required parameters, the description should carry more weight. It never says what the returned 'values' look like, how they are scoped by campaign/branch, or what happens when no knowledge has been observed.

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

Parameters2/5

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

Schema description coverage is 0%, so the schema documents nothing about viewer, campaign_id, or branch_id. The description maps 'viewer' to 'one actor, player, or gm' but leaves campaign_id and branch_id entirely unexplained, so it only partially compensates for the coverage gap.

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

Purpose4/5

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

States a specific verb ('Read') and resource ('last observed values known to one actor, player, or gm'), which pins down the per-viewer knowledge concept. It does not, however, differentiate itself from close siblings like get_state or read_canon, whose names overlap heavily with this concept.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus get_state, read_canon, or read_history, nor any prerequisite or exclusion beyond a passing note about NPCs. The agent must infer the intended context from the name alone.

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

get_recoveryC
Read-onlyIdempotent

Read every pending check and look up an exact committed receipt by original key. No receipt at read time is not permission to replay with a new key.

ParametersJSON Schema
NameRequiredDescriptionDefault
branch_idYes
campaign_idYes
idempotency_keyNo

TDQS

C2.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful context: that the original idempotency key must be reused and that a missing receipt does not authorize a new key. This is meaningful behavioral disclosure beyond annotations, though it is phrased cryptically and says nothing about return contents.

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

Conciseness4/5

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

Two sentences, both dense and front-loaded, with no filler. The second sentence is syntactically convoluted but still earns its place as a behavioral warning.

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

Completeness3/5

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

There is no output schema, so return values need not be explained, but the tool involves non-trivial idempotency/recovery semantics and three undocumented parameters against 0% schema coverage. The description covers the key idempotency rule but omits what campaign_id and branch_id scope, leaving it only minimally adequate.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry parameter meaning, but it only obliquely references the idempotency_key as 'original key'. campaign_id and branch_id are entirely undocumented in both schema and description. The description partially compensates for the coverage gap but leaves most parameters unexplained.

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

Purpose3/5

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

The description states a specific action on specific resources ('read every pending check', 'look up an exact committed receipt'), giving a verb+resource pairing. However, terms like 'pending check' and 'committed receipt' are undefined domain jargon, and it never distinguishes this tool from siblings like roll_check or restore_checkpoint. It conveys intent but leaves the exact purpose partially opaque.

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

Usage Guidelines2/5

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

The second sentence ('No receipt at read time is not permission to replay with a new key') is a behavioral caution, not guidance on when to choose this tool over alternatives. There is no statement of when to invoke it versus restore_checkpoint, roll_check, or get_state. Usage must be inferred.

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

get_stateA
Read-onlyIdempotent

Read branch state and revision. player view hides GM facts; gm view includes the authoritative ledger.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewerNoplayer
branch_idYes
campaign_idYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds genuine behavioral context not in the annotations: the viewer-dependent redaction of GM facts versus disclosure of the authoritative ledger, which tells the agent what data visibility to expect.

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

Conciseness5/5

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

Two tight sentences with no waste, and the core action ('Read branch state and revision') is front-loaded ahead of the view semantics.

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

Completeness3/5

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

There is no output schema, yet the description only gestures at return content ('state and revision') without indicating what state comprises or the revision format. For a read tool whose safety profile is already carried by annotations, this is adequate but leaves the agent guessing about the payload.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It does explain the semantics of 'viewer' (player redacts GM facts, gm exposes the ledger), which is the one enum parameter, but says nothing about campaign_id or branch_id beyond their self-evident names.

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

Purpose4/5

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

States a specific verb and resource ('Read branch state and revision'), which is distinct from siblings like read_history, get_knowledge, and get_recovery. However, it never names or contrasts with any sibling tool, so differentiation relies on inference.

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

Usage Guidelines3/5

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

The description explains the condition for choosing a view ('player view hides GM facts; gm view includes the authoritative ledger'), which is useful guidance for the viewer parameter. It gives no guidance on when to call get_state versus read_history, get_recovery, or read_canon.

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

ingest_canonA
Idempotent

Store supplied story text with hashes and line citations. No file or URL access. Existing source IDs are immutable; new editions need new IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentsYes
campaign_idYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations cover the safety profile (write, closed-world, idempotent, non-destructive), and the description adds genuine behavioral context beyond them: text is stored with derived hashes and line citations, external file/URL references are unavailable, and existing source IDs are immutable so editions require new IDs. The immutability rule is a meaningful trait not expressed by 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.

Conciseness5/5

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

Three short, front-loaded sentences with no filler. The primary action leads, followed by scope limits and the ID rule, so nothing needs to be re-read.

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

Completeness3/5

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

For a 2-parameter tool with annotations present and no output schema, the description covers the key storage behavior and the ID immutability rule. It falls short on the campaign_id parameter and the documents array semantics, which are undocumented everywhere.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry the load. It only alludes to the 'id' (immutable source IDs) and the text field; campaign_id, title, the array structure, and the 20-item cap are entirely unexplained in both schema and description.

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

Purpose4/5

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

States a specific verb (store/ingest) and resource (supplied story text), with the added detail that hashes and line citations are derived. This distinguishes it from the read-side siblings like read_canon and search_canon, though it never names them explicitly.

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

Usage Guidelines3/5

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

Gives operational constraints (no file or URL access; new editions need new IDs) which imply how to call it, but does not state when to prefer this over alternatives such as create_branch or commit_turn. Usage is implied rather than explicit.

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

list_branchesB
Read-onlyIdempotent

List explicit branch IDs and origin revisions. There is no global active branch.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds useful data-model context ('no global active branch') but says nothing about pagination, ordering, auth, or result size.

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

Conciseness5/5

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

Two short sentences, front-loaded with the return content, and the clarifying note follows with zero filler. Nothing could be trimmed without losing information.

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

Completeness3/5

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

For a simple list tool with annotations carrying the safety profile and no output schema, the description adequately covers what is returned but omits the required campaign_id scope and any notion that branches are per-campaign. That omission leaves an agent guessing about the one required input.

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

Parameters2/5

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

Schema description coverage is 0% and the description never mentions the required campaign_id parameter, so it adds no meaning beyond the schema. The name is fairly self-explanatory, which keeps this above 1, but the description does not compensate for the coverage gap.

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

Purpose4/5

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

States a specific verb and resource ('List explicit branch IDs and origin revisions') and adds a scope clarification ('no global active branch') that distinguishes it from any notion of a global state. It does not name a sibling tool like create_branch, so it falls just short of the top tier.

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

Usage Guidelines3/5

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

Usage is only implied: the implicit guidance is that this is the read-only way to discover branches, and the note about no global active branch prevents one misuse. There is no explicit when-to-use statement, no alternative named (e.g., create_branch for mutation), and no prerequisite explanation.

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

list_campaignsB
Read-onlyIdempotent

List campaigns in this owner database.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/5

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

The rich annotation set (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false) already tells the agent this is a safe, repeatable, closed-world read. The description adds only the phrase "in this owner database" and discloses nothing about pagination, ordering, result limits, or what happens when no campaigns exist, so it contributes almost no behavioral signal 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.

Conciseness4/5

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

A single short sentence, front-loaded with the verb and resource, with no filler or repetition. It is not bloated, though it is thin enough that the trailing scope phrase "in this owner database" does most of the distinguishing work.

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

Completeness3/5

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

For a zero-parameter list tool this covers the minimum: what is listed and whose campaigns are listed. However, with no output schema the return shape is entirely undisclosed, "owner database" is left undefined, and there is no indication of ordering or pagination, leaving real gaps for an agent that needs to consume the results.

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

Parameters4/5

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

The tool takes zero parameters and the schema forbids additional properties, so there is no parameter semantics for the description to explain. Per the rubric, a 0-parameter tool gets a baseline of 4.

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

Purpose4/5

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

States a specific verb ("List") and resource ("campaigns") plus a scope qualifier ("in this owner database"), so the agent knows this is a read/enumeration of campaigns. It implicitly contrasts with the sibling create_campaign via the verb, but never names an alternative or clarifies what a campaign record contains.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as create_campaign or any filter/branch-scoped listing siblings. The agent must infer that this is the enumeration entry point purely from the name.

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

prepare_turnB
Idempotent

Prepare an exact player action against the current revision. Returns state, canon, GM context, policy and all pending checks. Does not advance the story.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo
branch_idYes
campaign_idYes
player_actionYes
known_policy_sha256No

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already cover idempotency (true), destructiveness (false), and open-world scope, so the description is not the sole carrier here. It adds useful behavioral context by enumerating what is returned and clarifying that the story is not advanced, but it never explains why readOnlyHint is false (what gets written or persisted) or what happens when the caller's revision is stale, which matters given "current revision" and the known_policy_sha256 parameter.

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

Conciseness5/5

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

Three short sentences, front-loaded with the purpose, then the return payload, then the key constraint. Every sentence contributes and there is no filler.

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

Completeness3/5

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

With no output schema, the description helpfully lists what comes back (state, canon, GM context, policy, pending checks), which is real added value. But for a non-read-only tool with five undocumented parameters and no stated ordering relative to commit_turn, it leaves prerequisite, concurrency, and persistence questions unanswered.

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

Parameters2/5

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

Schema description coverage is 0% across five parameters, so the description carries the full explanatory burden and fails it. It never mentions query, branch_id, campaign_id, or known_policy_sha256; only the loose word "policy" in the return list hints at the policy hash, and "player action" loosely maps to player_action. Agents get no guidance on concurrency, defaults, or what the two seemingly unrelated inputs (query, known_policy_sha256) are for.

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

Purpose4/5

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

The description gives a specific verb and resource (prepare an exact player action) and scopes it to "the current revision," which is far more than a restatement of the name. It also implies differentiation from commit_turn via "Does not advance the story," though it never names that sibling outright, so an agent must infer the pairing.

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

Usage Guidelines3/5

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

Usage is only implied: the statement that it does not advance the story suggests it is a pre-step to commit_turn, but no condition, prerequisite, or alternative is stated explicitly. An agent can guess the workflow but is given no when-to-use rules.

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

preview_worldB
Read-onlyIdempotent

Preview deterministic time-driven world events without changing the save or granting NPC knowledge.

ParametersJSON Schema
NameRequiredDescriptionDefault
branch_idYes
campaign_idYes
destinationNo
elapsed_minutesYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, and the description reinforces this while adding a domain-specific side effect beyond the annotations: no NPC knowledge is granted. That is genuinely new information because 'NPC knowledge' is not covered by any hint. It still doesn't say whether events are returned as a list, how they're ordered, or whether the preview is stable across calls.

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

Conciseness5/5

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

A single sentence with no filler, front-loading the action and immediately qualifying the non-mutating scope. Every clause earns its place.

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

Completeness2/5

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

With no output schema and 0% parameter coverage, the description should clarify what a 'preview' actually returns and what the undocumented destination/elapsed_minutes inputs mean. Annotations cover the safety profile, but the agent still cannot predict the response or the effect of the optional parameter.

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

Parameters2/5

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

Schema description coverage is 0% across four parameters, so the description carries the full burden and supplies nothing: campaign_id, branch_id, elapsed_minutes, and especially the optional 'destination' are never explained. An agent gets no help on what destination means (travel destination? branch target?) or how elapsed_minutes bounds relate to the 1440 cap.

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

Purpose4/5

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

States a specific verb (preview) and a well-scoped resource (deterministic time-driven world events), and the qualifier 'without changing the save' implicitly separates it from commit_turn/prepare_turn. It never names a sibling explicitly, so differentiation is left partly to inference.

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

Usage Guidelines3/5

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

The phrase 'without changing the save or granting NPC knowledge' implies this is a dry-run/simulation step to use before committing a turn, but no explicit when-to-use or when-not-to-use guidance is given. Alternatives such as commit_turn or prepare_turn are not named.

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

read_canonB
Read-onlyIdempotent

Read an exact canon chunk and its hash/line citation.

ParametersJSON Schema
NameRequiredDescriptionDefault
chunk_idYes
campaign_idYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered. The description adds that the payload includes a hash and line citation, which is genuinely useful return context, but says nothing about lookup failure behavior or what a 'canon chunk' comprises.

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

Conciseness5/5

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

A single front-loaded sentence with zero filler; the verb and resource come first and the return detail is appended compactly.

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

Completeness3/5

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

For a simple read tool with rich annotations, the essentials are mostly covered, but two undocumented required parameters and no clarification of what a canon chunk is or how lookup failures surface leave gaps. No output schema exists, so the brief mention of hash/line citation is a helpful but thin substitute.

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

Parameters2/5

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

Two required string parameters (campaign_id, chunk_id) have 0% schema description coverage, so the description carries the full burden - and it names neither parameter. It never explains that chunk_id is the exact identifier to read or that campaign_id scopes the lookup.

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

Purpose4/5

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

States a specific verb (read) and resource (canon chunk), and adds that the result includes a hash/line citation. The word 'exact' implicitly contrasts with search_canon, but no sibling is named explicitly, so the differentiation is left to inference.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus search_canon or read_history, and no prerequisites (e.g., needing an existing chunk_id from a prior search). The only signal is the adjective 'exact', which hints at direct-ID lookup but is never spelled out.

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

read_guideB
Read-onlyIdempotent

Read the operating skill, workflows, pack format, or live tool schemas. No save changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNooverview
tool_nameNo

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds only the mild signal that it surfaces "live" (current) schemas and reinforces no-write behavior; it discloses no permission needs, caching, or freshness guarantees beyond that.

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

Conciseness4/5

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

Two short sentences, front-loaded with the content enumeration. The trailing "No save changes" clause is slightly wasteful, restating something the readOnly annotation already conveys, but otherwise there is no padding.

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

Completeness3/5

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

For a two-parameter, no-output-schema read tool, the description broadly conveys what comes back, but it omits how tool_name scopes the "tools" section and gives no hint about the shape or size of returned documentation. Adequate but with a clear gap on the second parameter.

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

Parameters3/5

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

Schema description coverage is 0%, so the schema documents only types and the section enum. The four listed content categories map loosely onto the enum values (overview/workflows/packs/tools), which partially compensates, but the tool_name parameter is never mentioned and its relationship to section="tools" is left unexplained.

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

Purpose4/5

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

States a clear verb ("Read") and lists the specific resource categories it returns: operating skill/overview, workflows, pack format, and live tool schemas. This distinguishes it as the meta-documentation reader among gameplay siblings, though it never names an alternative tool to contrast against.

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

Usage Guidelines2/5

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

There is no when-to-use or when-not-to-use guidance and no alternative is referenced. "No save changes" is a safety aside, not usage direction, leaving the agent to infer when this meta tool should be called versus siblings like get_state or read_canon.

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

read_historyA
Read-onlyIdempotent

Read complete committed events, newest first. Follow next_before_revision without changing branch. Origin history is separate and clamped to the fork point.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
originNo
branch_idYes
campaign_idYes
before_revisionNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real behavioral context beyond them: newest-first ordering, branch-invariance, and origin being separate and clamped to the fork point. Pagination mechanism is hinted via next_before_revision.

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

Conciseness4/5

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

Three dense sentences with the core purpose front-loaded and no filler. Slightly cryptic field naming (next_before_revision vs the before_revision param) keeps it from a 5.

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

Completeness4/5

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

For a read-only tool with no output schema, the description covers ordering, pagination, and origin/branch behavior well, which is what an agent needs to call it correctly. Remaining gaps (limit bounds, id semantics) are minor.

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

Parameters3/5

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

Schema coverage is 0% across 5 params, so the description must carry the load. It meaningfully explains origin semantics and before_revision pagination, but limit, campaign_id, and branch_id are left undocumented, so compensation is only partial.

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

Purpose4/5

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

States a specific verb and resource ('Read complete committed events'), plus ordering ('newest first'), which separates it from sibling read tools like read_canon or get_state. It does not explicitly name a sibling it replaces, so it stops short of a 5.

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

Usage Guidelines3/5

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

Usage is implied by 'complete committed events' and the origin note, giving context on when origin vs branch applies. However, no alternative tool is named and no explicit when-to-use vs read_canon/get_state guidance is given, so it lands at minimum-viable.

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

restore_checkpointA
Idempotent

Only when the player explicitly requests it: append a revision restoring a saved snapshot, including knowledge and world clocks. Never erase history.

ParametersJSON Schema
NameRequiredDescriptionDefault
branch_idYes
campaign_idYes
idempotency_keyYes
target_revisionYes
expected_revisionYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, but the description adds meaningful nuance beyond them: the operation is an append of a new revision rather than an overwrite, and 'Never erase history' reinforces the append-only contract. It does not mention permission requirements or how conflicts on expected_revision are handled.

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

Conciseness5/5

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

One sentence, front-loaded with the usage precondition, then the behavioral contract. No filler, no redundancy.

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

Completeness3/5

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

The behavioral story is adequate and annotations cover the safety profile, but with five undocumented required parameters and no output schema, an agent still lacks the semantics needed to construct a correct call. Complete on intent, incomplete on invocation.

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

Parameters2/5

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

Five required parameters with 0% schema description coverage, and the description mentions none of them. Critical semantics such as the difference between expected_revision (concurrency guard) and target_revision (snapshot to restore), or the role of idempotency_key, are left entirely unexplained.

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

Purpose4/5

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

States a specific verb and effect: 'append a revision restoring a saved snapshot', and scopes what the snapshot includes (knowledge and world clocks). It is clearly distinguishable from siblings like get_recovery or read_history, though it never names them explicitly.

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

Usage Guidelines4/5

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

'Only when the player explicitly requests it' is an explicit, unambiguous trigger condition. It does not, however, name alternatives such as get_recovery or read_history for inspecting state without restoring it, so routing to siblings 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.

roll_checkB
Idempotent

Persist a server d20 result with fixed purpose, difficulty and stakes. No rerolling a purpose. Returns the complete check set and context hash.

ParametersJSON Schema
NameRequiredDescriptionDefault
basisNo
stakesYes
purposeYes
check_idYes
attributeYes
branch_idYes
difficultyYes
campaign_idYes
situationalNo
preparation_idYes

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false. The description adds real context beyond them: that purpose/difficulty/stakes are fixed, that a purpose cannot be rerolled, and that the complete check set plus a context hash are returned. That is useful behavioral detail for a persistence tool.

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

Conciseness4/5

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

Three tight sentences with the core action front-loaded, followed by the immutability rule and the return summary. No wasted words, though the sentences are terse to the point of under-explaining the missing parameters.

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

Completeness3/5

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

For a 10-parameter mutation tool with no output schema, the description helpfully summarizes the return value. However, it is far too thin for the parameter surface, leaving most required fields unexplained, so an agent cannot call it correctly from the definition alone.

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

Parameters2/5

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

Schema description coverage is 0% across 10 parameters (8 required), so the description carries the full burden. It names only purpose, difficulty and stakes, leaving campaign_id, branch_id, preparation_id, check_id, attribute, basis and situational entirely undocumented in both schema and description.

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

Purpose4/5

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

States a specific verb and resource: 'Persist a server d20 result' with the fixed attributes (purpose, difficulty, stakes). It is clear what the tool does, though it does not explicitly differentiate itself from siblings like preview_world or get_state.

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

Usage Guidelines2/5

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

Offers only a single constraint ('No rerolling a purpose') rather than guidance on when to call this versus alternatives. There is no mention of prerequisites (e.g., needing a preparation or branch first) or when-not-to-use, leaving usage to inference.

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

search_canonA
Read-onlyIdempotent

Search local canon using FTS5/BM25, including CJK bigrams. Read hits before citing; a miss is not proof of absence.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
campaign_idYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior, so the safety profile is covered. The description still adds real value beyond them: the ranking engine (FTS5/BM25), CJK bigram tokenization, and the important recall caveat that a miss does not prove absence. It omits result shape and whether the search is scoped by campaign.

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

Conciseness5/5

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

Two sentences, no filler, and the core capability is front-loaded before the usage caveat. Every clause carries information an agent can act on.

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

Completeness3/5

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

With no output schema, the description should describe what a hit contains and how limit bounds results; instead it only implies hits are readable. The safety profile is fully carried by annotations, so the remaining gaps are the undocumented parameters and undefined return shape — adequate but incomplete for a search tool.

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

Parameters2/5

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

Schema description coverage is 0% across three parameters, so the description carries the full burden and largely fails it: query, campaign_id, and limit (default 4, max 8) are never explained. Only 'CJK bigrams' indirectly hints at how the query string is tokenized; the scoping role of campaign_id and the cap on limit are left undocumented.

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

Purpose4/5

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

States a specific verb and resource ('Search local canon') plus the retrieval mechanism (FTS5/BM25, CJK bigrams), which distinguishes it from siblings like read_canon and get_knowledge. It does not name an alternative explicitly, but the ranking-based full-text framing is enough for an agent to tell it apart from direct-read tools.

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

Usage Guidelines3/5

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

'Read hits before citing; a miss is not proof of absence' guides how to interpret and act on results, which is useful workflow context. However, it never states when to choose this tool over read_canon, get_knowledge, or read_history, so the alternative-selection guidance is only implied.

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.

  1. 17 tool updatesv0.3.0
    • First observedcommit_turn
    • First observedcreate_branch
    • First observedcreate_campaign
    • First observedget_knowledge
    • First observedget_recovery
    • First observedget_state
    • First observedingest_canon
    • First observedlist_branches
    • First observedlist_campaigns
    • First observedprepare_turn
    • First observedpreview_world
    • First observedread_canon
    • First observedread_guide
    • First observedread_history
    • First observedrestore_checkpoint
    • First observedroll_check
    • First observedsearch_canon

TDQS

A3.5/5.0

Scored across 17 tools

Disambiguation5/5

Each tool targets a clearly distinct phase or resource: canon ingestion/search/read, branch creation/listing, state/knowledge/history retrieval, and the turn lifecycle (prepare, roll, commit, recover). The descriptions explicitly separate potentially overlapping tools like prepare_turn, commit_turn, and get_recovery, so an agent can select correctly.

Naming Consistency5/5

All 17 tool names use snake_case and follow a predictable verb_noun pattern (read_guide, prepare_turn, list_campaigns, create_branch, get_state, commit_turn, restore_checkpoint). There are no mixed conventions or vague standalone verbs.

Tool Count4/5

The set has 17 tools, slightly above the typical 3–15 range, but the domain is a complex stateful RPG workflow with distinct campaign, canon, branch, turn, and recovery operations. Each tool appears to earn its place, though some consolidation might be possible.

Completeness4/5

The surface covers core lifecycle operations: campaign creation/listing, canon ingestion/search/read, branch creation/listing, turn preparation/rolling/commit, state/knowledge/history reads, world preview, and recovery. Minor gaps exist around explicit checkpoint creation, campaign/branch update or deletion, and actor management, but the main workflows are supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables LLM-driven text game state management by exposing MCP tools for managing players, locations, items, entities, and abstract concepts.
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    An MCP server that provides 18 tools for dice rolling, luck tests, character management, world state, combat, and save/load, enabling an AI game master to run a solo-play gamebook entirely through deterministic game logic.
    18
    1
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    A locally-run MCP server that connects to Twine's story library, enabling AI-assisted story management, passage editing, link-graph analysis, and narrative intelligence from any MCP-compatible client.
    32 npm
    5
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI-driven long-form novel creation and management, including chapter generation, character and timeline tracking, semantic memory retrieval, version savepoints, and deep consistency checking across multiple projects through MCP tools, with support for local LM Studio or any OpenAI-compatible API.
    14
    MIT