Skip to main content
Glama

Claude-TTSim-MCPServer

Let Claude play board games against you in Tabletop Simulator (TTSim). Claude reads the table, rolls real physics dice and moves its own pieces, and you watch it all happen in the game.

Claude playing Backgammon against Peter in Tabletop Simulator

Left: the conversation with Claude. Right: the same game in Tabletop Simulator, where Claude moves the light checkers.

How it works

Two parts work together:

  • TTSim-MCP is an MCP server that gives Claude generic access to Tabletop Simulator: run Lua in the game, list and inspect objects, move them, measure distances, roll and read dice. It knows nothing about any specific game.

  • Game skills teach Claude one game on one table: where the pieces are, how the board is laid out, the rules, and how a turn with you works. Skills so far: ttsim-backgammon (the built-in Backgammon table) and ttsim-nine-mens-morris (the Steam Workshop mod "Nine Men's Morris").

flowchart LR
    Claude["Claude<br/>(Claude Code)"]
    Skill["Claude Skill<br/>ttsim-backgammon<br/>rules · board layout · turn flow"]
    MCP["TTSim-MCP<br/>MCP server (Python)<br/>run_lua · objects · moves · dice"]
    TTSim["Tabletop Simulator<br/>External Editor API<br/>localhost:39999 / 39998"]
    Game["Loaded game<br/>Backgammon board,<br/>checkers, dice"]

    Claude -- "loads the skill<br/>for the game" --> Skill
    Skill -- "MCP tool calls<br/>(stdio)" --> MCP
    MCP -- "Lua as JSON" --> TTSim
    TTSim -- "runs Lua,<br/>physics" --> Game
    TTSim -. "results, events" .-> MCP
  1. You talk to Claude in Claude Code, e.g. "let's play backgammon". Claude loads the matching skill.

  2. The skill tells Claude how this table works. Claude acts through the TTSim-MCP tools.

  3. TTSim-MCP turns each tool call into Lua and sends it to Tabletop Simulator's External Editor API (the same interface script editors use; TTSim listens on localhost:39999 and replies to localhost:39998).

  4. TTSim runs the Lua in the loaded game: pieces glide to their new places, dice are thrown by the physics engine, and the results come back to Claude.

Dice are real: every roll is a visible physics roll in TTSim, never a number Claude makes up. A test of 400 rolls came out consistent with fair dice (see docs/requirements.md, Q8).

Related MCP server: Portals MCP

MCP tools

Tool

What it does

ttsim_status

Is TTSim reachable, which game is loaded, who is seated

run_lua

Run any Lua in the game and get the result back (the universal tool)

get_scripts, get_events

Read the game's scripts (read-only) and messages TTSim sent on its own

list_objects, inspect_object

Objects on the table with position, rotation, tint, bounds, snap points

move_object, move_objects

Move pieces smoothly and wait until they have settled

table_geometry, measure, highlight

Table size, distances, point out a piece to the player

roll_dice, read_dice

Roll dice (and flip coins) with TTSim's physics and read the results; flags dice that landed tilted

Requirements

Setup

git clone https://github.com/PeterPeet/Claude-TTSim-MCPServer.git
cd Claude-TTSim-MCPServer
python3 -m venv .venv
.venv/bin/pip install -e '.[dev]'

.mcp.json registers the server for Claude Code. It contains an absolute path to the Python in .venv. Change it to your own folder:

{
  "mcpServers": {
    "ttsim": {
      "command": "/path/to/Claude-TTSim-MCPServer/.venv/bin/python",
      "args": ["-m", "ttsim_mcp"]
    }
  }
}

The game skills are linked into .claude/skills/, so Claude Code finds them automatically in this folder.

Play

  1. Start Tabletop Simulator and load the built-in Backgammon game.

  2. Open Claude Code in this folder and approve the ttsim MCP server when asked.

  3. Say "let's play backgammon".

Claude plays the light checkers and rolls the white dice beside the board. You play brown with the blue dice: roll, move, and tell Claude when you are done. Claude reads your dice and move from the table, checks the move, and takes its turn.

The skill is written for the built-in Backgammon table that comes with Tabletop Simulator (one board with 120 snap points, light and brown checkers, white and blue dice). A Workshop backgammon mod may need small changes in skills/ttsim-backgammon.

Project layout

Path

Contents

ttsim_mcp/comms.py

Raw External Editor API connection: send Lua, receive results and events

ttsim_mcp/access.py, ttsim_mcp/table.py

Read-only access helpers and the generic 3D controls

ttsim_mcp/server.py

The MCP server: thin layer exposing those functions as tools

ttsim_mcp/lua/

All Lua the server sends to TTSim, as template files

skills/ttsim-backgammon/

The Backgammon skill (SKILL.md) and its Lua board helper (bg.lua)

skills/ttsim-nine-mens-morris/

The Nine Men's Morris skill (SKILL.md) and its Lua board helper (nmm.lua)

docs/requirements.md

Requirements, findings about TTSim behaviour, and the changelog

tests/

Unit, contract (against a fake TTSim) and integration tests (against the real game)

Development

The project is requirements-driven: every feature has a requirement ID in docs/requirements.md and tests that reference it. See CLAUDE.md for the working method and architecture rules.

.venv/bin/pytest            # unit + contract tests, no TTSim needed
.venv/bin/pytest -m ttsim   # integration tests against the running game
.venv/bin/ruff check . && .venv/bin/ruff format --check .

Only one program can receive TTSim's replies at a time. While a Claude Code session is running the ttsim server, pytest -m ttsim fails with a "port in use" error; run the integration tests outside such a session.

Some integration tests show messages in the TTSim chat on purpose (a print, and a labelled deliberate syntax error).

Roadmap

  • Access to TTSim through the External Editor API

  • MCP server with raw access tools

  • 3D controls and physics dice

  • Backgammon: Claude plays against you (v0.1.0)

  • Nine Men's Morris: coin toss, placing, moving, flying, mills (in progress)

  • Warhammer Age of Sigmar (Spearhead), using the mod's own dice area

License

GNU General Public License v3.0, see LICENSE.

Disclaimer

An independent hobby project, not affiliated with Berserk Games (Tabletop Simulator) or Anthropic.

Available Tools

13 tools
get_eventsA

Messages TTSim sent on its own since sequence number since: print output, Lua errors, game loaded/saved, objects created.

Returns {"events": [{"seq", "time", "kind", ...}], "last_seq"}. Pass last_seq as since next time to get only new events. Only events received while this server runs are available.

NameRequiredDescriptionDefault
sinceNo

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden and does well: it discloses the return envelope ({events, last_seq}), the cursor-based incremental retrieval pattern, and the retention limitation that state does not survive server restarts. It stops short of describing event `kind` values or ordering guarantees.

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?

Four tight sentences, front-loaded with what the tool returns, then the cursor mechanism, then the retention caveat. No filler, no restatement of the tool name.

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?

With no output schema, the description supplies the response shape and cursor semantics, plus the lifecycle limitation — everything needed to invoke and iterate correctly. Minor gap: the set of possible `kind` values is elided as "...", which could matter for client-side filtering.

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

Parameters4/5

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

Schema coverage is 0%, so the description must compensate, and it does: `since` is defined as a sequence number, and the round-trip use of `last_seq` gives a concrete value to pass. Only the default-0 baseline behavior (fetch everything retained) is left implicit.

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

Purpose5/5

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

States a specific verb and resource: retrieves self-initiated messages TTSim emitted (print output, Lua errors, game loaded/saved, object creation). This clearly separates it from siblings like get_scripts (script inventory) and run_lua (execution), which do not describe an event stream.

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?

Explains the polling pattern explicitly: pass the returned `last_seq` as `since` next time to get only new events. It also states the key exclusion — only events received while the server runs are available — so the agent knows not to rely on history. It doesn't contrast with sibling tools, but the usage context is clear.

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

get_scriptsA

Read the loaded game's Lua scripts and UI XML (read-only).

Returns {"global": {"script", "ui"}, "objects": [{"guid", "name", "type", "script", "ui"}]}, listing only objects whose script or UI is not empty.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations present, the description carries the full disclosure burden and does meaningful work: it declares read-only semantics, describes the exact return shape, and states the non-obvious filtering rule that only objects with non-empty script or UI are listed. It does not cover behavior when no game is loaded or output size concerns, keeping it 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.

Conciseness5/5

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

Three compact lines: purpose first, then the return contract, then the filtering caveat. No filler, and the most decision-relevant fact (read-only) is front-loaded.

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?

No output schema exists, so the description's inline return shape is essential and adequate, and with no parameters and no annotations there is little else to document. It stops just short by not stating prerequisites (a loaded game) as a failure mode or hinting at output volume for large games.

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, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies there is no filtering or scoping argument beyond the implicit 'loaded game' context.

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 the loaded game's Lua scripts and UI XML, with an explicit read-only marker. It is clearly distinct from the mutating/executing siblings like run_lua or move_object, though it never names them directly.

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 intent of reading scripts is implied by the name and description, but there is no explicit when-to-use statement and no routing against alternatives such as inspect_object (single object) or run_lua (execute rather than read). 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.

highlightB

Highlight an object for a few seconds to point it out to the player. color is a TTSim colour name: White, Red, Orange, Yellow, Green, Blue, Purple, Pink, ...

NameRequiredDescriptionDefault
guidYes
colorNoYellow
secondsNo

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose that the effect is visual and short-lived ("for a few seconds"), which implies a safe, non-mutating operation. It does not say whether the object/player must be present, what happens with an invalid guid, or whether the call blocks for the duration.

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, purpose front-loaded, with the parameter detail following. The colour list trails off with an ellipsis but the enumeration is genuinely useful rather than 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?

For a 3-parameter, no-output, no-annotation tool the description covers purpose, colour naming, and approximate duration, which is enough to call it. It leaves open where the guid comes from and what the call returns or does on failure, which matters with zero annotation coverage.

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 well on `color` (TTSim colour name with an example list) and implies `seconds` via "a few seconds", but gives no meaning for `guid` (presumably an object GUID from list_objects) and no units or bounds for `seconds`.

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 ("Highlight an object") plus the player-facing effect and duration, which clearly separates it from siblings like move_object or inspect_object. It stops short of naming any sibling directly, so it is clear but not fully differentiated.

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 "to point it out to the player" implies the usage context (visual attention cue during play) but there are no explicit when/when-not rules or pointers to alternatives such as inspect_object for non-visual inspection. 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.

inspect_objectA

Full details of one object: everything list_objects gives, plus scale, bounds (world-axis box: center, size), value (dice etc.), whether it is held or moving, and its snap points in world coordinates (e.g. the slots on a game board).

NameRequiredDescriptionDefault
guidYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does a good job disclosing the returned data: scale, bounds, value, held/moving state, and snap points. It implies a read-only inspection but does not explicitly state side effects, permissions, or error behavior.

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?

The definition is front-loaded with the core purpose, then efficiently lists the additional details returned. Every clause adds information and there is no redundant or filler text.

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 one-parameter inspection tool with no output schema or annotations, the description is largely complete because it explains the rich return contents. It still omits error behavior and does not describe the guid 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%, so the description should compensate for the undocumented guid parameter. It says the tool inspects one object but never names or explains the guid, leaving parameter meaning entirely to the bare schema field.

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

Purpose5/5

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

The description states a specific verb and resource: it returns full details for one object. It explicitly distinguishes itself from list_objects by saying it gives everything list_objects gives plus additional per-object data.

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?

The contrast with list_objects makes the intended use clear: list_objects is for listing, while inspect_object is for deep inspection of a single object. It does not explicitly state when not to use it or prerequisites such as needing a guid.

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

list_objectsA

List objects on the table: guid, name, description, type, tags, tint (hex), position, rotation, locked, resting. Optional filters: name (case-insensitive substring), type (e.g. "Dice"), tag, tint (hex, e.g. "bbbbbb"). GUIDs change when a game is loaded, so look objects up each session.

NameRequiredDescriptionDefault
tagNo
nameNo
tintNo
typeNo

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations supplied, the description carries the burden and does most of it: it discloses the record shape returned, that name matching is case-insensitive substring, tint is a hex string, and critically that GUIDs are session-volatile. It never explicitly says the call is read-only or describes result limits, which keeps it from a 5.

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

Conciseness5/5

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

Two sentences, front-loaded with the resource and return shape, then the optional filters and the session caveat. Every clause carries information an agent needs; nothing is redundant with structured fields.

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?

No output schema exists, and the description compensates by enumerating the returned fields, which is exactly right. Filters are covered. What's missing is anything about ordering, result caps, or what 'tag' accepts, which matters for a list tool an agent may call repeatedly.

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

Parameters5/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 entirely, and it does: all four parameters (name, type, tag, tint) are named with matching semantics, including an example value for type ("Dice") and the hex format for tint ("bbbbbb"). The only thin spot is tag, whose valid values are unstated, but every parameter is at least semantically defined.

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

Purpose5/5

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

States a specific verb and resource ('List objects on the table') and immediately enumerates the returned fields (guid, name, description, type, tags, tint, position, rotation, locked, resting). This is clearly distinguishable from the inspection/mutation siblings (inspect_object, move_object) 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.

Usage Guidelines3/5

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

Filter semantics are explained and there is useful workflow advice ('GUIDs change when a game is loaded, so look objects up each session'), which tells the agent to re-query rather than cache. However, it never states when to prefer this over inspect_object or move_object, and nothing is said about result size or pagination limits.

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

measureB

Horizontal distance between two objects (GUIDs) or points ([x, y, z]), in world units. Returns center (centre to centre), edge (between bounding boxes, 0 if overlapping), dx, dy, dz.

NameRequiredDescriptionDefault
aYes
bYes

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full behavioral burden. It usefully defines the return metrics (center, edge, dx, dy, dz) and clarifies edge behavior when bounding boxes overlap, but it omits error handling, required permissions, and whether missing objects cause failures.

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?

The description is two tight sentences: the first states the measurement and input forms, and the second defines the returned components. Every phrase is informative and the purpose is front-loaded.

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 simple two-parameter measurement tool with no annotations or output schema, the description supplies the essential input formats and return metrics. It is nearly complete for invocation, though it could mention failure behavior or whether points are interpreted as world coordinates.

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 adds valuable meaning by explaining that each argument can be an object GUID or a point array in [x, y, z] form, but it does not explicitly map this to parameters a and b or specify whether mixed argument types are allowed.

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 clearly states a specific operation: measuring horizontal distance between two objects (GUIDs) or points ([x, y, z]) in world units. It is distinct from sibling tools like move_object or table_geometry, though it does not explicitly name alternatives.

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 description explains what the tool does but gives no guidance on when to use it versus alternatives such as table_geometry or inspect_object. There are no exclusions, prerequisites, or usage conditions stated.

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

move_objectA

Move one object to position (optionally rotation) and wait until it has settled. smooth=true (default) glides it so the player sees the move; false teleports it. Place pieces slightly above their resting height and let physics settle them. Returns the final position and rotation.

NameRequiredDescriptionDefault
guidYes
smoothNo
positionYes
rotationNo

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it discloses that the call blocks until the object settles, that smooth=true glides versus false teleporting, and that final position and rotation are returned. It omits permissions, failure behavior, and whether coordinates are world or local space.

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?

Four short sentences, front-loaded with the action and its blocking behavior, then the smooth toggle, then a practical tip. No filler and every sentence adds information an agent would otherwise have to guess.

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 4-parameter mutation tool with no annotations and no output schema, the description covers blocking semantics, the default behavior toggle, and the return value. The remaining gap is the coordinate space and the meaning of `guid`, which an agent must infer.

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%, so the description must compensate. It explains `smooth` meaningfully (glide vs teleport, default true) and clarifies that `rotation` is optional, but adds nothing on `position` format, coordinate frame, or what `guid` identifies — the other half of the parameters remain 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?

Specific verb and resource: "Move one object to `position` (optionally `rotation`)". The phrase "one object" implicitly separates it from the sibling move_objects, though it never names that sibling explicitly. An agent can tell what it 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.

Usage Guidelines3/5

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

It offers practical placement advice ("Place pieces slightly above their resting height and let physics settle them"), which is real usage guidance. But there is no explicit when-to-use / when-not-to-use statement and no routing to move_objects for multi-object moves.

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

move_objectsA

Move several objects at once and wait until all have settled. Either:

  • moves: [{"guid", "position", "rotation"?}, ...] for explicit targets, or

  • guids + offset [dx, dy, dz] to shift them together, keeping their formation.

NameRequiredDescriptionDefault
guidsNo
movesNo
offsetNo
smoothNo

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description must carry the full burden. 'Wait until all have settled' usefully discloses that the call is blocking/synchronous, but it doesn't cover permissions, whether motion is animated by default (smooth=true), failure behavior if a guid is invalid, or whether the move is undoable.

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

Conciseness4/5

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

Front-loaded action sentence followed by a tight two-branch list; every sentence earns its place. The trailing newline/formatting is slightly rough but not confusing.

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?

A 4-parameter, zero-coverage, annotation-free mutation tool needs more: the `smooth` flag, mutual exclusivity of the two modes, and what 'settled' means operationally are all unaddressed, and there is no output schema to fall back on.

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%, so the description is the only documentation. It does add real meaning for `moves` (guid/position/rotation keys) and `offset` (dx,dy,dz formation-preserving shift), but leaves `smooth` completely undocumented and doesn't state precedence between `moves` and `guids`+`offset`.

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 ('move') and resource ('several objects at once') plus a behavioral promise ('wait until all have settled'). It implicitly distinguishes itself from the singular sibling move_object via 'several', but never names the alternative 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?

Clear routing between two invocation modes: explicit per-object targets via `moves`, or a shared `offset` applied to `guids` to preserve formation. No guidance on when to prefer this over calling move_object repeatedly, and no statement on what happens if both modes are supplied.

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

read_diceA

Read dice values without rolling (e.g. after the player rolled): the given dice/coins, or all dice and coins on the table. Coins report their face name, e.g. "Heads". Each die has value, resting, tilt, cocked, tint and position.

NameRequiredDescriptionDefault
guidsNo
cocked_tiltNo

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the safety profile and does so: it declares the operation non-mutating ('without rolling') and describes what each returned item contains (value, resting, tilt, cocked, tint, position; coins report face name like "Heads"). It does not explain what the cocked_tilt threshold does or how invalid guids 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.

Conciseness4/5

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

Front-loaded with the core purpose and the non-rolling qualifier, then a compact enumeration of returned fields. Slightly terse on the parameter side rather than padded, so length is not the problem.

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 tool with no annotations and no output schema, the description does useful work by enumerating the per-die return fields. But it leaves cocked_tilt undefined and gives no guidance on identifier format or behavior for unknown guids, which an agent needs in order to call it correctly.

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 coverage is 0%, so the description must carry parameter meaning. It implies the scope of 'guids' ('the given dice/coins, or all dice and coins on the table') but never states the expected identifier format, and the second parameter cocked_tilt is never mentioned at all.

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

Purpose5/5

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

States a specific verb and resource ('Read dice values') plus the key distinction 'without rolling (e.g. after the player rolled)', which separates it from the sibling roll_dice. It also clarifies it covers coins as well as dice.

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?

The parenthetical 'without rolling (e.g. after the player rolled)' gives clear situational context and implicitly routes the agent to roll_dice when it actually wants to roll. There is no explicit 'do not use for X' exclusion, but the alternative is obvious from the sibling name.

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

roll_diceA

Roll dice with TTSim's physics roll (visibly lifted and spun, like pressing R) and wait until all have come to rest. Coins (and other objects with named faces) are flipped with TTSim's randomize and report their face name, e.g. "Heads"; only numeric dice count towards the total. Returns each die's value and tilt (degrees from lying flat), the total, and cocked: dice tilted more than cocked_tilt (default 10°, for flat surfaces), whose value may be disputed. Dice bounce: roll them where nothing else can be hit, e.g. in a dice tray.

NameRequiredDescriptionDefault
guidsYes
cocked_tiltNo

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses that this is a physics simulation, that it blocks until all dice come to rest, that dice bounce and can hit other objects, and that tilt/cocked disputes are possible. It doesn't cover failure modes (e.g. a die that never settles) or what happens to objects knocked over, which keeps it off 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.

Conciseness4/5

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

Front-loaded with the mechanism, then the return contract, then the bounce caution — each sentence earns its place. Markdown mangling ('all\nhave come to rest') and the slightly run-on return sentence cost a point.

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?

Compensates well for having no annotations and no output schema by describing the return payload (value, tilt, total, `cocked`) inline. The one material omission is the identity of `guids`, which leaves an agent guessing on the required argument.

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 explains `cocked_tilt` well (degrees, default 10, 'for flat surfaces') but says nothing about `guids`, the sole required parameter — an agent must guess these are the die/coin object GUIDs.

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

Purpose5/5

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

States a specific verb and resource plus the mechanism ('TTSim's physics roll (visibly lifted and spun, like pressing R)'), and distinguishes the coin/hame-face case from numeric dice. An agent can tell this apart from read_dice, which presumably only reads existing values.

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?

Gives clear operational context: roll where nothing can be hit, e.g. in a dice tray, and notes coins are flipped with randomize rather than rolled. It never explicitly says when to prefer read_dice or another sibling over this, so it stops short of naming alternatives.

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

run_luaA

Execute Lua in the TTSim Global script context and return the result.

Use return to get a value back. Tables arrive as JSON objects/arrays; numbers, strings, booleans and nil (null) work too. TTSim objects (userdata) cannot be returned directly: return their fields instead, e.g. local o = getObjectFromGUID("abc123") return {name = o.getName(), pos = o.getPosition()}. Lua runtime and syntax errors come back as tool errors with the TTSim message. Changes made here are visible to the player immediately, so act deliberately.

NameRequiredDescriptionDefault
codeYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations present, the description carries the full burden and does well: it discloses serialization behavior (tables as JSON, scalars pass through, userdata cannot be returned), the error channel (Lua runtime/syntax errors as tool errors with the TTSim message), and the critical side effect that changes are immediately visible to players. Gaps remain around permissions, execution limits/timeouts, and whether the environment is sandboxed.

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?

Front-loaded with the core action in one sentence, then return-value rules, then error behavior, then the safety caution. The inline code example is compact and earns its place by demonstrating the userdata workaround, which would be hard to convey in prose.

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 one-parameter arbitrary-code-execution tool with no output schema and no annotations, the description covers return encoding, error propagation, and mutation visibility — the essentials. It leaves out execution constraints (timeouts, permissions, sandbox scope) that an agent calling arbitrary code would want to know.

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

Parameters4/5

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

Schema coverage is 0% for the single `code` parameter, so the description must compensate — and it does, explaining that the body must use `return` to produce a value, which types serialize, and giving a concrete getObjectFromGUID example with field extraction. It stops short of stating size limits or whether top-level awaits/wait patterns are permitted.

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

Purpose5/5

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

States a specific verb and resource — execute Lua in the TTSim Global script context — and names the outcome (return the result). This clearly distinguishes it from read-oriented siblings such as get_scripts, get_events, inspect_object, and list_objects.

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 gives operational guidance (use `return`, how to convert userdata, errors surface as tool errors) and a caution to 'act deliberately' because changes are visible immediately. However, it never says when to prefer this over siblings like inspect_object or list_objects for simple reads, nor what to avoid running. Usage is implied rather than routed.

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

table_geometryA

The table's type and bounding box (center, size), and global snap points. Snap points that belong to a board are listed by inspect_object on the board.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description bears full responsibility. It discloses the return content (type, bounding box, snap points) and points to inspect_object for board snap points. It does not state that the tool is read-only or that it has no side effects, though the zero-parameter nature makes this low risk.

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?

The description is two sentences and front-loads the key information about what is returned. The second sentence is slightly fragmented ('Snap points that belong to a board are listed by inspect_object on the board') but still conveys the necessary routing information without waste.

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?

Given zero parameters, no output schema, and no annotations, the description adequately explains what the tool returns and where board-specific snap points are found. For a simple read-only getter, this is sufficiently complete, though an explicit 'read-only' note would strengthen it.

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 accepts zero parameters, so there is no parameter semantics to explain. Per the rubric, zero parameters yields 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?

The description specifies the exact data returned: table type, bounding box (with center and size), and global snap points. It also differentiates from the sibling inspect_object for board-specific snap points. A clear verb like 'Get' is missing, but the resource and attributes are 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?

Usage is implied: call this tool to obtain table geometry. It explicitly tells the agent to use inspect_object for snap points belonging to a board, which is a useful exclusion. However, there is no explicit 'use this when' guidance or mention of alternatives for the table geometry itself.

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

ttsim_statusA

Check whether TTSim is reachable; if so, return the loaded game's name, object count and seated players (colour, host). Never fails: an unreachable TTSim is reported, not raised.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: 'Never fails: an unreachable TTSim is reported, not raised' discloses the error semantics an agent must branch on, and the return contents are enumerated. It stops short of describing the shape of the unreachable response (message text, status field), leaving that to inference.

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 with no filler: capability first, error behavior second. The most decision-relevant fact (it never raises on failure) is placed where it will be read.

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?

With zero params, no annotations and no output schema, the description is nearly self-sufficient because it enumerates the returned fields and the failure mode. The only gap is the exact form of the 'reported' unreachable result, which an agent must guess at.

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, so there is nothing to document and no risk of ambiguity; the baseline applies. No parameter information is needed or missing.

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

Purpose5/5

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

The description names a specific verb and target ('Check whether TTSim is reachable') and then enumerates exactly what is returned (game name, object count, seated players with colour and host). This clearly separates it from the sibling object/script/dice tools, which all operate on game content rather than service health.

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 health-check framing suggests calling it first or when connectivity is in doubt, but the description never states when to prefer it or what to do with the result. No exclusions or alternatives are mentioned, though none of the disclosed siblings competes for the same purpose.

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. 13 tool updatesv0.1.0
    • First observedget_events
    • First observedget_scripts
    • First observedhighlight
    • First observedinspect_object
    • First observedlist_objects
    • First observedmeasure
    • First observedmove_object
    • First observedmove_objects
    • First observedread_dice
    • First observedroll_dice
    • First observedrun_lua
    • First observedtable_geometry
    • First observedttsim_status

TDQS

A3.9/5.0

Scored across 13 tools

Disambiguation5/5

Each tool targets a clearly distinct action or resource: script reading vs. Lua execution, single- vs. multi-object movement, rolling vs. reading dice, measuring vs. geometry, listing vs. inspecting objects. The singular/plural move_object/move_objects and roll_dice/read_dice pairs are explicitly differentiated in their descriptions, leaving no realistic ambiguity.

Naming Consistency4/5

The set is consistently snake_case and mostly follows a verb_noun pattern (get_scripts, list_objects, inspect_object, move_object, roll_dice, read_dice). A few tools deviate: ttsim_status and table_geometry are noun phrases while measure and highlight are bare verbs without an object, but these are still readable and predictable.

Tool Count5/5

13 tools is well within the ideal 3-15 range and each earns its place, covering distinct facets of tabletop simulation control (scripting, object manipulation, measurement, dice, status). No tool feels redundant or padded.

Completeness4/5

The surface covers the core lifecycle: reading scripts, executing arbitrary Lua, listing/inspecting objects, moving single/multiple objects, geometry, measurement, highlighting, and dice roll/read. Gaps exist around object creation/deletion, chat/player messaging, and save/load operations, but run_lua serves as a powerful escape hatch for most of these.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers