tmodloader-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tmodloader-mcplaunch the game, teleport me to spawn, and take a screenshot"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Game engines have grown MCP servers — Unity, Unreal, Godot and Defold all have one, so an assistant can see a real scene instead of guessing from a prompt. tModLoader has not had one. This is that.
Status: alpha — it has only ever run on one install; see Known limits before adopting it. Nothing defaults to anybody's install, the mod-side half is a folder you vendor (
responder/), and CI compiles it with nothing of any mod's on the compile line.
Quick start
uv tool install tmodloader-mcp # or: pip install tmodloader-mcp
# the two paths with no default — every plausible default names somebody's install
export TMODLOADER_SAVE_DIR="/mnt/c/Users/<you>/Documents/My Games/Terraria/tModLoader"
export TMODLOADER_MOD_SOURCE="$TMODLOADER_SAVE_DIR/ModSources/<YourMod>"Then:
Vendor the responder — copy
responder/into your mod's source tree and subclassDevResponder. It is a folder of C#, not a PyPI dependency, because it compiles inside your mod.Point your MCP client at the server — the block in Using it from Claude Code.
Ask the game something —
launch, thendiag. Or open with thestart_a_sessionprompt, which lists the worlds and characters that actually exist here.
This needs WSL2 driving a Windows tModLoader — Requirements says why before anything else does.
Related MCP server: ue-live-bridge
How it works
The game is asked by writing a file it polls, not by sending it input:
┌─────────────────────────────────────────────────────┐
│ an agent — Claude Code, or anything speaking MCP │
└──────────────────────┬──────────────────────────────┘
│ tools · prompts · capture:// resources
┌──────────────────────▼──────────────────────────────┐
│ tmodloader-mcp — this package (Python, WSL2) │
└──────────────────────┬──────────────────────────────┘
│ writes <mod>-capture.trigger
│ reads <mod>-diag-<token>.txt,
│ <mod>-shot-<token>.png, ...
┌──────────────────────▼──────────────────────────────┐
│ the tModLoader save directory │
│ plain files on disk — no socket, no keystrokes │
└──────────────────────▲──────────────────────────────┘
│ polls every few frames, writes
│ each answer next to its trigger
┌──────────────────────┴──────────────────────────────┐
│ DevResponder — C# you vendor into YOUR mod, │
│ inside tModLoader, a real game, on Windows │
└─────────────────────────────────────────────────────┘No synthetic keystrokes, no window focus, and nothing that can be fooled by another window sitting on top of the game. That last point is the reason for the design: OS-level screen capture was tried first and returned a picture of Discord — a window in front of the game — while passing every check available. Reading the game's own back buffer cannot contain another window by construction, not by luck.
Captures name a region and have no default. The frame holds only the game, but that still includes a character name, a world name and any chat on screen, so a request says which corner it wants.
The mod side of that protocol — every filename, what each one contains, and
which failures it has to be able to express — is written down in
docs/MOD_CONTRACT.md,
and implemented in
responder/.
You can read the contract or vendor the folder; the folder is the same document
with a compiler checking it.
Since 0.6.0 replies are tagged: a request may carry a short id the responder echoes back first, so a late answer can never be mistaken for the next request's. Older vendored copies keep working — the tag is only sent to a responder that advertises taking it.
What the mod side answers
These are verbs, driven through the trigger tool, not separate MCP tools.
The reads come with the base class — every consumer serves them, and vendoring an upgrade can never hand your mod a power it did not have before:
Verb | What it answers |
| a photograph of the frame, by named region |
| whatever your mod chose to report |
| tile-type counts in a rectangle |
| NPC, item or projectile counts, filterable by rectangle |
| one line per entity: id, position, health |
| who is connected |
The writes are opt-ins, each one line you write in RegisterCommands:
Opt-in | Verbs it adds |
|
|
|
|
|
|
One line each is deliberately the whole mechanism: not a setting, not a marker
file, not an environment variable, because each of those can be switched on
somewhere other
than the source somebody will read when they ask why an NPC appeared in their
world. responder/README.md
has the detail, including why DevCommandBridge is the answer to "what about
an escape hatch" and why there is no reflect_invoke here.
The answers, verbatim
Every line below is real — the same server and client the live checks drive, quoted rather than paraphrased:
spawn:1,20 OK: spawned 20 of 20 id=1 at tile 2101,252
time:dusk sent to a CLIENT:
REFUSED: "time" changes something the SERVER owns, and a
client that changed it would be corrected by the next world
packet - the change would appear to work and then undo
itself. Send this to the server: time@<server-address>.
give:8,5 sent to the SERVER:
REFUSED: "give" needs a local player, and a dedicated
server has none - it runs the world without standing in
it. Ask a client, by name.
spawn:0,1 REFUSED: 0 is not a NPC id - it is how Terraria spells
"nothing", so this would have succeeded and done nothing
spawn:banana,5 REFUSED: "banana" is not a positive whole NPC id
time:teatime REFUSED: "teatime" is not one of dawn, noon, dusk, midnight
tiles:0,0,1000,1000
REFUSED: 1000 by 1000 is 1000000 tiles, past the limit of
16384 one query may scanThe refusals are the point. Each one says what was wrong, what would have been right, and — when the verb belongs to the other side of the wire — where to send it instead, because the reader is an agent and an agent retries exactly as well as the refusal explains.
The tool surface
Most of what this does could be a CLI, and where that is true it should stay one — a stateless local binary does not need a protocol in front of it. What earns the surface here is that a running game is not stateless:
A session
Tool | What it buys over |
| Session state across calls |
| A second client into a session that is already running |
| Asking whether a session exists without provoking an error |
| stop → build → launch in the one order that works |
| The worlds, characters and mods |
Asking the game
Tool | What it buys over |
| The write → poll → timeout → clean-up loop, written once |
| What the mod says it serves, read from the mod, not a copy here |
| Structured fields AND the records under them, not text to |
| Waiting for a state on one budget, instead of sleeping a guess |
| WHICH silence — absent, stale, still loading, or not armed |
Pictures
Tool | What it buys over |
| A path per call, a whole PNG behind it, refusals as refusals |
| Which captures exist, as names — a reader that takes no paths |
| The picture itself, for an agent not on this machine |
| Removing captures without a delete loose enough to reach a world |
Logs
Tool | What it buys over |
| Any log, filtered — including the run that already rotated away |
| Which logs exist right now, and how many old runs are archived |
| Only what a log gained, and whether it rotated under you |
| Blocking until a line appears, instead of a guessed sleep |
Building, the API, and the saves
Tool | What it buys over |
| Encodes tModLoader's refusal to build while the game is open |
| What the INSTALLED tModLoader actually exposes, with signatures |
| Copying the world and characters aside before a run mutates them |
| Putting them back, saving what it overwrote so it can be undone |
| Which copies exist, newest first |
Those one-liners are where the hand-written version actually went wrong: a
pkill pattern that matched its own command line, a readiness check that
passed on a killed process's leftover heartbeat, and — for one stretch — a
shot row promising a PNG check that did not exist: the file was waited for
and renamed, never opened. It exists now, and reads the end that decides — a
truncated PNG has a perfectly valid signature, so the trailer is what is
checked. The gap was recorded here rather than quietly corrected, because a
README is read by people deciding what they no longer have to check.
Two prompts ship with it: diagnose_silence walks the four reasons the
mod might not answer, with this install's heartbeat, mod list and logs already
read; start_a_session lists the worlds and characters that actually exist
here — the two preconditions launch states and cannot check. Both render the
failure into the text when the configuration is unusable, because a diagnostic
that refuses to render has failed at the one moment it was for.
Captures are also addressable as capture://{name} resources. Both surfaces
share one reader that takes a name, never a path, and serves only
capture-shaped files inside the save directory — a reader that opened whatever
it was handed would be the leak this project exists to prevent.
What it cannot do
There is no headless singleplayer. Terraria has no entry point for it —
-join -player -skipselect lands at the main menu, measured rather than
assumed. launch("singleplayer") refuses and says so instead of launching
something else and letting you believe otherwise. Singleplayer testing needs a
human to load a world; the other tools then drive it normally.
That matters more than it sounds: a bug that only appeared in singleplayer shipped once precisely because every harness ran server-plus-client.
There is no bare dedicated server either. An empty server runs no update
hooks, so the mod never polls and never answers — measured on one process,
changing only whether a client was attached: silent for 90s alone, answering
within 30s of a client joining. launch("server") refuses for the same reason
singleplayer does — what it promises is a game that can answer, and a server
on its own never becomes one. Start one outside this tool if you want a server
to join yourself.
Requirements
WSL2 on Windows, driving a Windows tModLoader. This is the one requirement
worth reading before the others, because it is not a preference — sessions are
listed and killed through Windows' own tasklist.exe and taskkill.exe, and
build_mod hands tModLoader a Windows path because it builds inside a Windows
process. A native Linux or macOS tModLoader cannot be driven by this as it
stands. The configuration check every tool runs first says so by name rather
than failing later on a missing file in System32; if you are on WSL and those
tools live somewhere unusual, set
TMODLOADER_TASKLIST, TMODLOADER_TASKKILL and TMODLOADER_POWERSHELL.
Python 3.12+
tModLoader installed (1.4.4.9 is what this is tested against)
A mod embedding the trigger-file responder — copy
responder/into your mod's source tree and subclassDevResponderA .NET SDK, for
api_searchonly — the index is built by a small C# tool. Everything else works without one.
Install
uv tool install tmodloader-mcp # or: pip install tmodloader-mcp
# or none at all: uvx tmodloader-mcpThe package is the Python half only. The responder is not on PyPI and could
not usefully be — it is C# that compiles inside your mod — so it is
vendored from
responder/
in the repository, however you obtained the package.
Configuration
Every path is an environment variable. Two are required, because every plausible default for them names somebody's own install:
Variable | Meaning |
| Required. Where the mod writes artifacts |
| Required. Mod source directory (WSL path) |
| tModLoader install; defaults to Steam's layout |
| Default world, as Windows spells it — see below |
| Usually leave unset — see below |
| Usually leave unset — see below |
export TMODLOADER_SAVE_DIR="/mnt/c/Users/<you>/Documents/My Games/Terraria/tModLoader"
export TMODLOADER_MOD_SOURCE="$TMODLOADER_SAVE_DIR/ModSources/<YourMod>"The required two have no default on purpose: a default pointing at the author's disk does not fail on yours — it resolves, worst case to something that exists, and the server drives an install you never chose. Both unset variables are reported together, so this costs one restart, not two.
TMODLOADER_WORLD_WIN is the world launch loads when you do not pass one. It
has no default either; with neither set, launch refuses and lists the worlds
actually in your save directory, with the Windows paths it wants. inventory
answers the same question without launching anything.
TMODLOADER_MOD_NAME is the mod's internal name, which every artifact
filename is built from: <modname>-diag-<token>.txt, <modname>-shot-<token>.png,
lowercased, where <token> identifies which player's client wrote it — except
<modname>-capture.trigger and <modname>-commands.txt, which stay one name
shared by every client (see
docs/MOD_CONTRACT.md
for why).
tModLoader takes the mod's name from the source folder, so it is derived from
TMODLOADER_MOD_SOURCE and only needs setting for a checkout whose folder is
named something other than the mod. Deriving it is also what keeps two mods
driven from one machine out of each other's trigger files — they share a save
directory.
TMODLOADER_MOD_SOURCE_WIN is the mod source as Windows sees it, which -build
needs because tModLoader compiles inside a Windows process with no /mnt/c. It
is derived from TMODLOADER_MOD_SOURCE, so setting that one is enough for a
source on a drive mount. Set it yourself only if your mod source lives outside
/mnt/<drive>, where there is no drive letter to translate to and the server
will ask for it by name.
The two describe one directory. If you set both to different places the server refuses to start and says so, rather than driving one and building the other.
Using it from Claude Code
A .mcp.json ships with the repository, so a session started in this directory
finds the server:
{
"mcpServers": {
"tmodloader": {
"command": "uv",
"args": ["run", "tmodloader-mcp"],
"env": {
"TMODLOADER_SAVE_DIR": "${TMODLOADER_SAVE_DIR}",
"TMODLOADER_MOD_SOURCE": "${TMODLOADER_MOD_SOURCE}"
}
}
}
}The two paths are read from your environment rather than written down — a
committed config with real paths would be one person's paths in everybody's
checkout. Export them where the client is launched, not only in an
interactive shell: the substitution is the client's, against its own
environment, and a value passed through as literal ${TMODLOADER_SAVE_DIR} is
treated as absent and reported by that name. claude mcp list names any that
are missing.
A process's environment is a copy taken when it starts, and nothing
outside can add to it afterwards. So a long-lived parent — a daemon, an agent
host, a desktop session — hands every client it spawns the environment it had
on the day it started, however long ago that was, and adding the variables to
your profile today does not reach it. The symptom is a shell where
env | grep TMODLOADER prints all three sitting next to a server that sees
none of them. Restarting the client is not enough if the thing that spawned the
client is the stale one; restart that.
Nothing can be repaired from inside a running session: the value was gone before the process started.
A project-scoped .mcp.json needs approving once — Claude Code will not run a
server a repository asked it to run without being told to. Start claude in
this directory and accept the prompt.
To drive the harness from the directory where you actually develop your mod,
copy the block into that project's .mcp.json and point --directory at this
checkout:
"args": ["run", "--directory", "/path/to/tmodloader-mcp", "tmodloader-mcp"]Or, with the package from PyPI, no checkout at all:
"command": "uvx",
"args": ["tmodloader-mcp"]The repository's own .mcp.json stays on uv run deliberately — inside this
checkout you want the code in front of you, not the release behind it.
Known limits
Everything below is a fact about this repository rather than a plan; the
struck-through history this section replaced lives in
CHANGELOG.md,
which is where a changelog belongs.
The thing most worth knowing about this project is that its hardest bugs were found by RUNNING it. Two clients overwriting each other's answers, a capture lock bounded by a guess, a dedicated server with no address to be told apart by, and — most recently — a save-snapshot feature whose entire premise turned out to be false when somebody finally measured it. The unit suite passed against every one of those. The changelog is the record.
It has only ever run on one install. One machine, one tModLoader
(1.4.4.9), one world, one character. Every live check in tests/ drives a real
game rather than a mock, which is the strongest evidence this project has — and
it is still evidence from a single configuration. That is what the alpha
classifier is for, and the first thing an outside user is likely to find is
something install-specific.
Two dedicated servers racing for one trigger: observed once, not proven.
Two servers on one save directory — different ports, different worlds, both
polling the same trigger file — served six alternating addressed requests,
each answered by the server it named, never by the other, always consumed
(tests/live_race_check.py). One machine, one run: evidence the claim
protocol holds under a real race, not a proof it always will.
There is no escape hatch, deliberately. Other harnesses ship
reflect_invoke or execute_code. command is the answer here: it runs a
mod's OWN registered ModCommands, which the mod already decided existed,
named, and gave a usage line. That keeps every reachable action published,
typed and refusable. Arbitrary evaluation would buy unlimited reach and throw
that away, so a question nobody wrote a verb for still costs an edit, a
rebuild and a relaunch.
A stopped session saves nothing. stop force-kills, so a run that changes
the world usually leaves no trace on disk — measured, not assumed. Do not rely
on that: a run long enough to autosave, or a graceful exit, does write. Take a
save_snapshot before anything that mutates a world you care about.
Available Tools
24 toolsapi_searchSearch the tModLoader API surfaceARead-only
Find a type, field, property or method in the INSTALLED tModLoader.
Args:
query: Part of a name, or a type. cloudAlpha, rain, QuickSpawnItem,
IEntitySource. Case-insensitive.
kind: Narrow to one of type, field, property, method.
limit: How many matches to return, best first.
ANSWERS THE QUESTION YOU HAVE BEFORE YOU WRITE ANYTHING. A compile tells you
exactly whether the call you already wrote is right; it cannot tell you what
is there. Main.maxRaining is only findable if you already suspect the name.
READ FROM THE ASSEMBLY'S OWN METADATA, so it cannot drift from the version installed — which is the failure mode of every wiki page and every model's recollection of an API. It carries no prose, because it is not documentation: it is the public surface, with signatures.
The index is built once per tModLoader version and cached against the DLL it came from, so a game update invalidates it by construction rather than by anybody remembering to. The first call after an update pays a few seconds.
Needs a .NET SDK, because the indexer is a small C# tool — it reads metadata without loading or running the game assembly. Without one this refuses and says so, rather than answering from a stale or absent index.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| indexed | Yes | |
| matches | Yes | |
| truncated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=true, destructiveHint=false), the description reveals that the tool reads from assembly metadata without loading or running the game assembly, builds and caches an index per tModLoader version, invalidates that cache on update, may take a few seconds on first call after an update, and refuses instead of returning stale results when the SDK is missing. These are precise behavioral traits that an agent needs to predict performance and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and has compact argument bullets. The later paragraphs are dense and useful, though the caching/metadata explanation could be trimmed slightly without losing meaning. Overall, almost every sentence earns its place, but the prose is a bit more elaborate than the minimum needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what is searched, how to phrase queries, how results are limited, why it is trustworthy, how caching affects latency, and what external prerequisites exist. Since an output schema is present, the tool's return value details do not need to be described here. Nothing an agent needs to invoke and interpret this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the full burden for parameter meaning.It does so well: query is defined as a case-insensitive name fragment or type with concrete examples, kind is narrowed to type/field/property/method, and limit is described as controlling how many best-first matches are returned. This adds real semantic value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states the exact resource being searched ('the INSTALLED tModLoader') and the specific entities returned ('type, field, property or method'). The description distinguishes this from a code compiler in the same sentence, making it unmistakably an API-discovery tool rather than a validation or documentation tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this before writing code, when you need to know what exists rather than whether an existing call compiles. It contrasts with a compile stepcars, notes that it is not a prose documentation source, and states the .NET SDK requirement up front. This gives clear guidance on when to call the tool and what it cannot do.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_modBuild the modA
Compile the configured mod source into a .tmod.
Args: timeout: Seconds to wait for the compile. A large mod on a slow machine can outlast the default, and a build that runs out of time says so rather than reporting a compile failure with no errors in it.
tModLoader REFUSES to build while the game is open, and says so with an error that otherwise reads like a compile failure. That case is reported as itself, with the fix, rather than as a broken build — which is the difference between closing the game and hunting a syntax error that is not there.
Success is read from the output, not the exit code, which is not reliable here.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| errors | Yes | |
| summary | Yes | |
| warnings | Yes | |
| game_was_open | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Both annotations are neutral (readOnlyHint=false, destructiveHint=false), so the description carries the full disclosure burden — and it delivers exceptionally. It discloses timeout semantics (reports timeout rather than a fake compile failure), the tModLoader game-open refusal with its fix, and the unreliability of the exit code, teaching the agent to read success from output. This is precisely the context that prevents misdiagnosing a time-out or game-open error as a syntax failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, followed by a param section and then two behavioral paragraphs. It is somewhat long, but every paragraph earns its place: each behavioral note conveys critical, non-obvious information that an agent needs to interpret build results correctly. No wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 1 optional parameter, an output schema (relieving the description of return-value duty), and no nested objects, the description is complete. It covers the purpose, the single parameter, and all three failure modes (timeout, game open, unreliable exit code). An agent has everything needed to invoke it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate — and it fully does for the single timeout parameter. It specifies units (seconds), explains why the default may be inadequate on slow machines, and describes the failure-reporting nuance. This adds real meaning beyond the bare schema, which only had a title and default value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence 'Compile the configured mod source into a .tmod' states a specific verb, resource, and output artifact, making the purpose unmistakable. Among the 25 siblings (launch, restart, stop, commands, diag), none compete as a build tool, so it is naturally distinct — though the description doesn't explicitly name any alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies when to use it (when you want a compiled .tmod from the configured source), but there is no explicit when/when-not guidance, no named alternatives, and no exclusion criteria. The behavioral paragraphs describe failure modes, not usage context, so the guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
capturesList the captures on diskARead-only
Every capture in the save directory, newest last.
Names, not paths — a path handed out is a path that can come back changed,
and read_capture deliberately accepts only a name.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the readOnly/destructive annotations: it discloses that output is names, not paths, and explains why paths are intentionally avoided. The ordering behavior ('newest last') is also stated directly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: one sentence states the core behavior and ordering, and a second explains the names-not-paths design decision. Every sentence earns its place, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-argument list tool, the description is complete: it specifies what is returned, the ordering, and how the returned names relate to read_capture. The presence of an output schema further reduces the need to describe return values in prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there is no parameter semantics to document. The baseline for a no-parameter tool is 4, and the description adds no irrelevant parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and scope: listing every capture in the save directory, ordered newest last. It also distinguishes the tool from read_capture by explicitly saying it returns names, not paths.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: the tool exists to provide capture names, and read_capture deliberately accepts only a name, so captures is the natural source for those names. It does not explicitly enumerate when not to use it, but the purpose is obvious enough that no exclusion is necessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
commandsWhat the running mod servesARead-only
What this side's mod says it serves, read from the mod itself.
The list is published by the responder when it loads, not assembled here. This harness used to carry its own copy of one mod's twelve commands and its own belief about which read an argument — facts that belonged to running C# and drifted the moment either side changed alone.
responder IS THE USEFUL FIELD when something is wrong. False means no list
was published: the mod is not loaded, or is a build with the dev bridge
compiled out. That is a different answer from a game still starting, and it
used to arrive as a readiness timeout, which names the wrong thing entirely —
it reads as slow rather than as never going to answer.
A list that exists but cannot be read is an ERROR rather than responder: false, because it means a responder IS running and this side cannot
understand it — a version mismatch, which needs a human rather than a wait.
Args: server: Ask the dedicated server rather than the client. Each side publishes its own list, and they are not always the same.
| Name | Required | Description | Default |
|---|---|---|---|
| server | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| commands | Yes | |
| responder | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description goes beyond them by explaining the responder field, the false/error distinction, and that the list is published at load time. It also clarifies that server and client lists differ, adding significant behavioral context not in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than typical but every sentence contributes value, including historical context that clarifies the tool's design. It is front-loaded with the core purpose and structured with an Args section. Slightly verbose but appropriately sized for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description covers the essential behavioral aspects: what the tool returns, how to interpret edge cases, and the optional parameter. It leaves no critical gaps for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description is the sole source for parameter meaning. It explicitly explains the 'server' parameter: ask the dedicated server rather than the client, and notes the lists are not always the same. This fully compensates for the schema's lack of description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads what the running mod serves, and explains it is read from the mod itself. It is specific about the resource and action, but does not explicitly differentiate from sibling tools, so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when the responder field is useful and distinguishes between 'false' and error states, but does not explicitly state when to use this tool versus alternatives or provide exclusions. It gives strong interpretive guidance but lacks direct tool-selection direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagRead the game's stateARead-only
Ask one side of the session what it currently sees, parsed.
Args: server: Read the dedicated server's view instead of the client's. target: Address a specific client by name. timeout: Seconds for the WHOLE call — the reply and then the dump it promises, out of one budget rather than one each. A large world takes longer.
Returns counters as integers and the mod's absence markers as null, so a reading of 0 — a real measurement — cannot be confused with "no data". Asking both sides at the same moment is the only way to answer "the client reports no NPC", which one side alone cannot.
records carries the indented list bodies the scalars only summarise:
fields["npcs"] says active=6 mutated=1, and records["npcs"] says which
six. Those lines were parsed and discarded until now, so a caller could see
that something was there and never what it was.
| Name | Required | Description | Default |
|---|---|---|---|
| server | No | ||
| target | No | ||
| timeout | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| side | Yes | |
| fields | Yes | |
| records | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and non-destructive annotations, the description discloses important behavioral details: the timeout covers the whole call including the promised dump, large worlds take longer, and the null-vs-zero distinction prevents misreading missing data. It also reveals that record bodies were previously parsed and discarded, adding historical context. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured and front-loaded: first the core behavior, then each parameter, then return semantics. Every sentence adds useful information, including the concrete example of fields vs records. It is detailed without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having zero schema description coverage, the description compensates fully by explaining parameter roles, return semantics, null behavior, and the cross-side comparison use case. With an output schema present and readOnly annotations provided, nothing essential is missing for an agent to correctly select and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries full weight for the three parameters. It explains 'server' as switching to the dedicated server view, 'target' as addressing a specific client by name, and describes 'timeout' with a precise one-budget semantics and a performance caveat. This is substantive semantic value the schema alone does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Ask one side of the session what it currently sees, parsed,' which names a specific action, a concrete resource, and a precise scope. This clearly distinguishes it from general-purpose logs or capture tools among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when the tool is useful, especially the explicit note that asking both sides at the same moment is the only way to answer 'the client reports no NPC'. It does not explicitly list when-not-to-use cases or name alternatives, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
heartbeatRead the mod's heartbeatARead-only
Why the game is not answering, for both sides at once.
launch already reads this file to decide readiness and keeps one bit of
it. When a launch SUCCEEDS that is all anyone needs. When it fails, the
discarded detail is the entire answer, and what comes back instead is no live heartbeat within 300s — which names the symptom and none of the four
causes:
absent — nothing ever wrote one. The mod is not loaded, is not enabled in this install, or was built without the dev bridge. For clients this is an EMPTY
clientslist, not an entry saying so.stale — a game ran and is no longer running. The file outlives the process, so this is indistinguishable from live to anything that only checks whether it exists.
live, no world — still loading. Nothing is wrong; wait longer.
live, world, not armed — loaded and ticking, bridge not listening.
clients is a LIST because two clients can share one save directory and
the old single-client shape reported whichever wrote last. Expect an entry
per client — and one more: an entry with player: null is the untokened
heartbeat every client writes before its character loads, which nothing
deletes and each new client overwrites. Treat it as a slot rather than as
a client. A real client is the one carrying a token and an advancing
polls.
Reads OFF DISK and needs no session, deliberately: a failed launch raises
without storing one, so a tool that required a session could never answer
the question it exists for. It is also the only tool here that is useful
when nothing else is.
Both sides are returned together because "the client is silent and the server is fine" is a different diagnosis from both being silent, and asking one at a time cannot see the difference.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| server | Yes | |
| clients | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses extensive behavioral details: reads off disk, requires no session, returns both sides simultaneously, and explains the data structure nuances (the `clients` list, the `player: null` entry, and how a real client is identified). It explains why it works without a session due to failed launches not storing one. This goes far beyond the readOnlyHint annotation, providing critical context that affects how results are interpreted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured: it leads with the core purpose, then explains the failure context, enumerates the four causes with bullet points, clarifies the `clients` list format, and concludes with rationale for the design. Each sentence adds value, though it could be slightly tightened. The use of bullet points and bolded terms aids readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is remarkably complete given the tool's complexity. It covers when to use it, what it returns, how to interpret the data (including edge cases like the null player entry), and why it works without a session. The output schema exists but the description adds interpretive context that schema alone cannot provide. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the input schema is trivially 100% covered. The description correctly omits parameter details, and the baseline for zero parameters is 4. No additional explanation is needed, and the description doesn't attempt to fabricate parameter info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Read the mod's heartbeat' and expands on its purpose as the diagnostic for why the game is not answering. It distinguishes itself from siblings by explaining it's the only tool useful when nothing else is and that it reads off disk without a session, unlike other tools that require a session. This makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use this tool: when a launch fails and the error 'no live heartbeat within 300s' is encountered. It contrasts with `launch` which already reads the file but discards the detail, making `heartbeat` the fallback for deeper diagnosis. It also notes it's the only tool useful when nothing else is, giving strong situational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inventoryWhat this install hasARead-only
The worlds, characters and mods on this machine.
launch states two preconditions and could check neither. player must
already exist — it does not create one, and a duplicate is kicked — and
world wants a WINDOWS path the caller had to know in advance. Both are
facts about directories sitting right there, and until now the only way to
learn either was to launch and read the failure: a kick for the wrong
character, and a readiness timeout blaming the heartbeat for the wrong
world. Each world's path_win is the exact string launch(world=...)
wants.
The mods answer something else. commands reports responder: false for
three different situations — the mod is not built, or it is built and
switched off, or it is on and was compiled without the dev bridge — and
enabled plus built_here separate the first two.
THOSE TWO ARE NOT ONE FACT. A mod can be enabled and have no .tmod here,
because a workshop mod is installed from somewhere else entirely; on the
install this was written against, CheatSheet is exactly that. Collapsing
them into installed would report it missing and send someone rebuilding a
mod that was never the problem.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| mods | Yes | |
| worlds | Yes | |
| players | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: it explains the distinction between `enabled` and `built_here` as separate facts, warns against collapsing them into `installed`, and describes the `path_win` field as the exact string `launch(world=...)` wants. This goes beyond the annotations and helps the agent interpret the data correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-written and front-loaded with the core purpose, but it is somewhat long and digresses into a narrative about why `installed` would be a bad abstraction. The first sentence earns its place; the later paragraphs are informative but could be tightened. It's not bloated enough to be a 2, but it's not as crisp as the best examples.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with an output schema, the description is quite complete. It explains the key output fields and their semantics, warns about a common misinterpretation, and connects the data to `launch` and `commands`. The only minor gap is that it doesn't explicitly describe the full list of output fields, but the output schema presumably covers that. Overall, an agent has enough context to use this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is trivially complete (100% coverage). The description doesn't need to explain parameters. It instead explains the meaning of the output fields (`enabled`, `built_here`, `path_win`), which is more valuable for a zero-parameter read-only inventory tool. Baseline 4 for zero params is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear statement: 'The worlds, characters and mods on this machine.' This identifies the resource (inventory of worlds/characters/mods) and distinguishes it from sibling tools like `launch`, `commands`, or `log_watch`. However, it doesn't explicitly name a sibling alternative or contrast itself with a specific sibling, so it's 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong contextual guidance: it explains that `launch` states preconditions that this tool can verify, and it clarifies how the mods data relates to `commands` reporting. It implicitly tells the agent to use this tool to check preconditions before `launch` and to disambiguate mod states. It doesn't explicitly say 'use this instead of X' but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
joinJoin a second client to the running sessionA
Bring another character into the session that is already running.
Args:
player: Character name. Must already exist — -player does not create
one — and must not be one this session already has, in any casing.
timeout: Seconds to wait for that client to report a live, world-ready
heartbeat of its own.
The protocol has supported several clients since answers became per-player; the LIFECYCLE supported one, so the arrangement that work exists to make safe could only be reached by spawning a game by hand. This is that, with the waiting done properly.
It waits for THIS client, not for a process. A new pid says something
started — not that a character loaded, that the join was accepted, or that
a world is under it. And it watches only that player's own tokened
heartbeat: the unsuffixed <mod>-hooks.txt is a shared slot holding
whichever client booted last, so accepting it would return against the
heartbeat of the game that was already here.
Address the new client by name — diag(target=...), shot(target=...) —
which already works, because addressing was never the half that was
missing. stop takes it down with everything else the session started.
| Name | Required | Description | Default |
|---|---|---|---|
| player | Yes | ||
| timeout | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| joined | Yes | |
| player | Yes | |
| started_pids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description explains non-obvious behavior: it waits for THIS client's own tokened heartbeat, not a new process; it rejects the unsuffixed shared heartbeat slot because that could return against the existing game; and it notes that stop will take the joined client down with the session. This is exactly the kind of behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key information is present and front-loaded, but the middle paragraph is dense and indirect ('This is that, with the waiting done properly') and the protocol-history framing adds cognitive load. It could be tighter without losing the important heartbeat caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema, the description covers preconditions, timeout semantics, heartbeat subtleties, how to address the joined client via diag/shot, and teardown via stop. Nothing critical appears missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates. It explains player is a pre-existing character name, that -player does not create one, and that the name must not already belong to the session in any casing. It defines timeout as seconds to wait for a live, world-ready heartbeat. This is strong semantic value beyond the bare field names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific action and target: 'Bring another character into the session that is already running.' It clearly differentiates from siblings such as launch and stop by emphasizing 'second client' and 'already running.' No ambiguity about what operation this performs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is clear: use when an additional client must join an existing running session. It gives context about why this is needed and what must already be true. It does not explicitly name alternatives or exclusions, so it misses the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
launchLaunch a game sessionA
Start tModLoader and wait until it can actually answer.
Args:
mode: "server_client" — a server plus one joined client. It is the only
mode there is, and the only way to observe what a CLIENT sees, which
is where most sync bugs live. The other two are refused because the
engine cannot satisfy them: "singleplayer" has no headless entry
point, and "server" alone never ticks, so the mod never polls and
never answers.
port: Server port. Change it only if something else holds the default.
player: Character name for the client. Must already exist — -player
does not create one, and a duplicate name is kicked.
world: WINDOWS path to a .wld, overriding TMODLOADER_WORLD_WIN. A WSL
path is refused rather than tried: tModLoader runs as a Windows
process, cannot resolve /mnt/c, and the only symptom is a readiness
timeout blaming the heartbeat.
timeout: Seconds to wait for readiness. Raise it on a slow machine or a
large world — the default assumes neither.
Waits for a heartbeat that is BOTH recent and reporting a live world. Those fail differently — a stale-but-ready heartbeat means the process died, a fresh-but-not-ready one means it is still loading — and checking only existence conflates them.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | server_client | |
| port | No | ||
| world | No | ||
| player | No | n43n | |
| timeout | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| port | Yes | |
| world | Yes | |
| player | Yes | |
| started_pids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say non-read-only and non-destructive; the description carries the behavioral burden. It explains the readiness wait, distinguishes stale vs not-ready heartbeats, and states why singleplayer/server modes are impossible – all beyond annotation data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense; the first line gives the core purpose, the Args section is organized, and the closing heartbeat paragraph justifies nuanced behavior. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex launch tool with five parameters, an output schema, and a readiness protocol, the description covers all parameter semantics, failure distinctions, and typical adjustments. Nothing the agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, this description compensates fully: each of the five parameters gets a purpose, constraint, and failure mode, e.g., player must already exist, world must be a Windows path. It adds substantial meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action: start tModLoader and wait until it is ready. It distinguishes from sibling tools by naming the launch/readiness behavior and later explains the only supported mode, so an agent can tell it apart from join or restart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit conditions for parameter use: only server_client mode works, port should be changed only if needed, timeout raised on slow machines, and WSL world paths are refused. However, it does not name sibling tools as alternatives (e.g., join for an existing session), so it misses the explicit alternative routing that would earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_filesList the logs this install hasARead-only
Which logs exist right now, and how many earlier runs are archived.
Read off disk rather than listed as a constant: which logs exist depends on
what was run, and a server-only session writes no client.log at all.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint, and the description adds value by explaining the dynamic, disk-read behavior and the example of a server-only session. This goes beyond the structured annotations without contradicting them, though it does not cover every possible edge case or performance implication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff, and the core purpose is front-loaded. Every sentence adds meaningful information about what the tool does and why the result can vary, making it concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema and safety annotations, the description covers the essential dynamic behavior. Nothing an agent needs to decide to call it or interpret its purpose is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description correctly avoids any parameter talk, and since there is nothing to document, it fully satisfies this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists logs and archive counts, with a specific verb and resource. It distinguishes itself by noting the result is read off disk rather than a constant, but it does not explicitly name or contrast a sibling tool, so it misses the top mark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives contextual guidance about when the tool is appropriate (e.g., server-only sessions produce no client.log) but does not explicitly state when to use this tool over alternatives like 'logs' or 'log_watch'. The implied usage is clear, but exclusions and explicit alternatives are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
logsRead a side's logARead-only
Tail one of tModLoader's logs, optionally filtered.
Args:
name: Which log — see log_files for what this install actually has.
client.log and server.log are the game; Launch.log and the
environment-*.log pair are written by the launcher, which is where
a run that died BEFORE the game started says why.
previous: Read the run BEFORE this one. tModLoader zips the previous
run's logs into Old/ when a new run starts, so after a failed
launch and a retry the failure is in an archive and the live log
belongs to the retry.
contains: Keep only lines containing this substring, case-insensitively.
Applied to the WHOLE log before the tail, so this returns the last N
MATCHING lines rather than the matches among the last N.
lines: How many trailing lines to return. Zero returns none; a negative
count is refused rather than guessed at.
Useful when a launch fails: the reason is usually in a log and not in
anything the trigger protocol can reach, because the game never got far
enough to poll. Which is also why previous exists — the obvious thing to
do after a failed launch is launch again, and that rotates the evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | client.log | |
| lines | No | ||
| contains | No | ||
| previous | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: the `contains` filter is applied to the whole log before tailing (so it returns the last N matching lines, not matches among the last N), and negative line counts are refused. It also explains the log rotation behavior that makes `previous` necessary. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear one-line summary, a parameter breakdown, and a usage rationale. It is slightly longer than strictly necessary, but every sentence earns its place: the parameter details are non-obvious and the launch-failure context is genuinely useful. The front-loaded summary makes the purpose immediately clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only log tool with 4 optional parameters and an output schema, the description is nearly complete. It covers parameter semantics, the filtering behavior, and the real-world scenario where the tool matters. The only minor gap is that it doesn't describe the output format, but the presence of an output schema reduces the need for that. The launch-failure context and log-rotation explanation make it complete enough for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden of explaining parameters. It explains all four parameters: `name` (with concrete examples of which logs exist and what they contain), `previous` (with the rotation context), `contains` (with the case-insensitive whole-log behavior), and `lines` (with the zero/negative semantics). This is strong compensation for the schema's lack of descriptions, though it could be slightly more explicit about the default values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Tail one of tModLoader's logs') and immediately distinguishes itself from siblings by naming `log_files` for discovering available logs and `log_since`/`log_watch` as alternatives. It clearly states what the tool does and how it differs from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool: 'Useful when a launch fails' and explains why the log is the right place to look. It also explains the purpose of the `previous` parameter in the context of a failed launch followed by a retry, which is exactly the kind of when-to-use guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_sinceRead what a log has gainedARead-only
Only what a log has gained since you last looked.
Args:
name: A log filename from log_files.
offset: The next_offset from your previous call, or 0 to start at the
beginning. BYTES, not lines — a line count is not a resume point,
because the number of lines you have read is not where the file
continues.
contains: Case-insensitive filter, applied to the new lines only.
fingerprint: The previous call's fingerprint, or omit on the first.
It is how a rotation is detected when the NEW log has already
outgrown your offset — without it that case reads as a quiet
continuation, silently skipping the head of the new run.
NOT A LIVE TAIL, and it cannot be one. Tools here are synchronous and a
game session is process-global state, so a launch blocking for five
minutes is not something another call watches from the side. What this
buys is the read between calls: logs re-reads a file that grows all run,
and this returns the new part.
restarted is the field to check. tModLoader ZIPS the previous run's logs
and starts fresh, so an offset from a run that has since rotated points
past the end of a now-shorter file. Reading there would report an empty log
forever, which looks exactly like a quiet game rather than like a log that
restarted underneath you. When that happens the read begins again at zero
and says so, because handing back the whole file is only correct if the
caller is told why.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| offset | No | ||
| contains | No | ||
| fingerprint | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| lines | Yes | |
| restarted | Yes | |
| truncated | Yes | |
| fingerprint | Yes | |
| next_offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint=true and destructiveHint=false, and the description adds substantial behavioral detail: offset is in bytes, fingerprints detect rotation, and on rotation the read restarts at zero while signaling via `restarted`. It also warns about the failure mode of quiet continuation. This is far beyond the annotation baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core meaning, then structured into argument definitions and behavioral caveats. Although it is long, every sentence adds needed context about byte offsets, rotation, or live-tail impossibility. No sentence merely repeats the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four parameters, rotation-sensitive behavior, and a non-obvious resume protocol, the description covers all necessary calling details: how to resume, how filtering works, how rotation is detected, and which return field to check. The output schema covers return structure, so its absence from the description is not a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries full weight. It explains all four parameters: name, offset (with the crucial 'BYTES, not lines' warning), contains (case-insensitive, applied only to new lines), and fingerprint (rotation detection). This adds real semantic meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement of scope: 'Only what a log has gained since you last looked.' It names the specific operation (incremental read) and the resource (a log file), and later distinguishes itself from `logs` by saying `logs` re-reads the whole file while this returns the new part.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says this is 'the read between calls' and contrasts with `logs`, which re-reads a growing file. It also states a hard exclusion: 'NOT A LIVE TAIL, and it cannot be one,' explaining the synchronous limitation. This is enough for an agent to know when to choose this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_watchWait for a line to appear in a logARead-only
Block until a log line matches, instead of polling log_since by hand.
Args:
name: A log filename from log_files.
contains: Case-insensitive text to wait for. REQUIRED — without one
this matches the first line written and is log_since wearing a
longer name.
offset: Where to start reading. 0 includes the log's HISTORY, which is
usually what you want ("did the mod load" is a question about a
line that is already there). Pass a previous call's next_offset
to watch only what comes after it.
fingerprint: The fingerprint from an earlier log_since/log_watch,
when resuming — see log_since for the rotation it catches.
Within one call the polls carry it themselves.
timeout: Seconds for the WHOLE call, spent across every poll.
poll: Seconds between reads.
THE OFFSET IS THE MECHANISM. Each poll resumes where the last stopped, so a line is matched exactly once — never missed in the gap between two polls, and never re-reported on the next. A watch that re-read the file from the top would match a line written before the wait began and call it news, which is how "wait for the crash" passes on the crash from the PREVIOUS run.
Not matching is an ANSWER, not an error: it returns matched: false with
the resume point, so "nothing was logged for 30s" is as expressible as
waiting for something. A MISSING log still raises, because that is nobody
having been asked rather than a line failing to arrive.
restarted means the log rotated during the wait — tModLoader zips the
previous run's logs and starts fresh, so your offset stopped meaning
anything and the lines you are holding came out of a different file.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| poll | No | ||
| offset | No | ||
| timeout | No | ||
| contains | Yes | ||
| fingerprint | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| lines | Yes | |
| polls | Yes | |
| elapsed | Yes | |
| matched | Yes | |
| restarted | Yes | |
| fingerprint | Yes | |
| next_offset | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the readOnly/destructive annotations. It discloses that the tool blocks, that it polls internally, that each line is matched exactly once, that a non-match returns `matched: false` rather than raising, that a missing log raises, and that `restarted` indicates log rotation. This is rich behavioral context that annotations alone could not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every paragraph earns its place: the first paragraph defines the parameters, the second explains the core mechanism, and the third clarifies error semantics. The 'THE OFFSET IS THE MECHANISM' section is front-loaded with the most important behavioral insight. It could be tightened slightly, but the length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a blocking, stateful, polling tool with 6 parameters and no schema descriptions, the description covers all the essential context: how to resume, what history means, what happens on timeout/non-match, what rotation means, and how it differs from `log_since`. The output schema exists, so return values don't need to be spelled out in prose. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, and it delivers. It explains `name` as coming from `log_files`, `contains` as case-insensitive and required, `offset` as the resume mechanism with history semantics, `fingerprint` as a resume token from earlier calls, `timeout` as whole-call budget, and `poll` as seconds between reads. This is far more than the schema's bare titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Block until a log line matches' a named log file, and immediately contrasts itself with the sibling `log_since` ('instead of polling `log_since` by hand'). This clearly distinguishes it from the closest alternative and states the tool's core behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use this tool versus `log_since`, including the offset mechanism for resuming, the meaning of `contains` being required, and the semantic difference between 'not matching' and a missing log. It also gives concrete guidance like 'did the mod load' being a question about history, which tells an agent exactly when to use offset 0.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prune_capturesDelete old capturesADestructive
Delete all but the newest keep captures, and say which went.
Captures accumulated forever. shot writes one per call and nothing ever
removed them, so an agent photographing in a loop grew the SAVE DIRECTORY
without bound — the folder holding the worlds and characters, which is not
a cache and not somewhere to leave litter.
Args:
keep: How many of the newest captures to keep. REQUIRED and
deliberately without a default, the same way shot requires a
region: this deletes files, and a destructive tool that runs with
no arguments is one that gets called by accident. keep=0 removes
all of them, which is a real request and has to be spelled out.
Only files matching THIS mod's capture pattern are touched, and each is
re-checked to resolve to a direct child of the save directory — the same
containment read_capture uses, because a delete that listed and removed
through different rules would be looser than the read beside it. The whole
set is validated before anything is unlinked, so a refusal costs nothing
rather than leaving a half-finished prune.
Newest is decided by MTIME, not by the index in the filename: the index is this harness's counter and the timestamp is the disk's account of what happened.
| Name | Required | Description | Default |
|---|---|---|---|
| keep | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| removed | Yes | |
| remaining | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description goes well beyond that: it explains the `keep` parameter is required to prevent accidental deletion, that `keep=0` removes all captures, that only files matching this mod's capture pattern are touched, that each file is re-checked for containment, that the whole set is validated before any unlink (so a refusal costs nothing), and that newest is determined by MTIME not filename index. This is rich behavioral disclosure that adds significant value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core action. It uses paragraphs to explain rationale, safety, and edge cases. It is somewhat long, but every sentence earns its place by explaining a non-obvious behavior or safety property. The only minor deduction is that some rationale could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with one required parameter, the description covers everything an agent needs: what gets deleted, how the keep count works, what happens with keep=0, the containment check, the validation-before-delete behavior, and the MTIME ordering. The output schema exists, so return values need not be described. This is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden. It explains `keep` in detail: it is required, deliberately has no default, `keep=0` is a real request that removes all captures, and it is compared against MTIME to decide which captures survive. This fully compensates for the schema's lack of description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Delete all but the newest `keep` captures, and say which went.' It clearly distinguishes this from siblings like `shot` (which creates captures) and `read_capture` (which reads them). The purpose is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use this tool: when captures have accumulated and need pruning. It contrasts with `shot` (which writes captures) and `read_capture` (which reads them), and explains the containment rule is the same as `read_capture`. It also warns against accidental destructive calls, making the usage context very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_captureRead a capture back as an imageARead-only
Return one capture's PNG as image content.
shot answers with a filesystem path, which is worth nothing to an agent
that is not running on this machine. This is how the picture itself gets
back, and it is a SEPARATE call on purpose: a full-frame PNG is tens of
kilobytes before base64, so a caller that only wanted to know the capture
succeeded should not be made to pay for the pixels.
Args:
name: A capture filename from captures, e.g.
<mod>-shot-<token>-001-topleft.png. A NAME, never a path — see
captures.read for why the containment is structural.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: it returns image content (PNG), is a separate call for performance reasons (tens of kilobytes before base64), and implies that calling it is unnecessary if the pixels aren't needed. It doesn't mention error handling or what happens if the name is invalid, but given the annotation coverage and simple nature, the added context earns a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It opens with a one-sentence summary, then a short paragraph explaining the rationale for the separate call, and finally a focused argument description. Every sentence adds value; there is no filler or redundant phrasing. The purpose is front-loaded, making it easy for an agent to quickly grasp the tool's role.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with annotations covering safety, the description is nearly complete. It explains the purpose, why it exists as a separate call, and the parameter format. It references `captures.read` for additional containment details, which covers deeper context. The only missing piece is what happens on error (e.g., if the name doesn't exist), but that's a minor gap for a simple read operation and the description is otherwise sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the parameter documentation. It does so thoroughly: it explains that `name` is a capture filename from `captures`, provides a concrete example format (`<mod>-shot-<token>-001-topleft.png`), and clarifies that it is a name, not a path, pointing to `captures.read` for structural containment reasons. This gives the agent everything needed to supply a valid argument.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool does: 'Return one capture's PNG as image content.' It also distinguishes itself from the sibling `shot` tool by explaining that `shot` returns a filesystem path, which is useless to an agent not on that machine, and that this tool retrieves the actual image. The verb and resource are specific, and it clearly names the sibling it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool versus alternatives. It explains that `shot` returns a filesystem path and that this tool is the way to get the actual picture, and it explicitly states that callers who only need to know a capture succeeded should not call it due to the size cost. This gives the agent a clear decision rule and names the alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restartRebuild and relaunch the sessionA
Stop, rebuild, and start again with the session's own settings.
Args: build: Compile the mod between stopping and starting. On by default, because picking up a code change is the reason this loop exists. timeout: Seconds to wait for readiness on the relaunch. build_timeout: Seconds to allow the compile.
THE ORDER IS THE POINT. tModLoader REFUSES to build while the game is open and reports it with an error that reads like a compile failure, so stop-then-build-then-launch is not a preference — building first sends you hunting a syntax error that is not there. Three separate calls let a caller get that order wrong; this one cannot.
The mode, port, player and WORLD come from the running session rather than
from arguments or defaults. That last one is why Session had to start
recording the world it resolved: a relaunch that fell back to the
configured default would quietly load a different world than the one being
tested, and report success.
Needs a running session, because a session is where those settings live.
With nothing running there is nothing to reuse — call launch.
| Name | Required | Description | Default |
|---|---|---|---|
| build | No | ||
| timeout | No | ||
| build_timeout | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| port | Yes | |
| built | Yes | |
| world | Yes | |
| player | Yes | |
| killed_pids | Yes | |
| started_pids | Yes | |
| build_summary | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral traits beyond the annotations: the order of operations matters because building while the game is open fails misleadingly; it uses session settings rather than arguments; it records the world to avoid loading a different one on relaunch. These details explain side effects and pitfalls, going well beyond the minimal readOnlyHint/destructiveHint flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: purpose first, then args, then the critical order explanation, then session settings, and finally prerequisites. Every sentence adds value, from the explicit ordering warning to the world-selection pitfall. It is detailed without being bloated, and the key points are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with build, stop, and relaunch phases plus session-specific settings. The description covers all necessary aspects: what it does, why order matters, what settings are reused, and the prerequisite of a running session. It also explains potential failure modes (false compile errors, wrong world loading). Given the complexity and the presence of an output schema, the description is fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description fully compensates by explaining each parameter: build ('Compile the mod between stopping and starting... On by default'), timeout ('Seconds to wait for readiness on the relaunch'), and build_timeout ('Seconds to allow the compile'). It also explains the default behavior and rationale, making the parameters self-documenting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Stop, rebuild, and start again with the session's own settings.' It clearly distinguishes itself from siblings like launch and build_mod by explaining that it reuses the running session's configuration and enforces the correct order. The title 'Rebuild and relaunch the session' matches and adds specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('Needs a running session') and when not to ('With nothing running there is nothing to reuse — call launch'). It also explains why the single call is preferable over three separate calls, providing clear context for choosing this over alternatives. The guidance is unambiguous and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_restorePut a saved copy backADestructive
Overwrite the world and characters with a snapshot.
This DESTROYS what is on disk now, so it saves that first: the state being
overwritten is copied to auto-before-restore and returned as undo,
which save_restore accepts like any other label. A restore aimed at the
wrong snapshot is therefore recoverable rather than final.
Refuses while the game is running, and refuses a label that does not exist by listing the ones that do.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| size | Yes | |
| undo | Yes | |
| files | Yes | |
| label | Yes | |
| removed | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the destructiveHint annotation: it explains that the current state is saved to 'auto-before-restore' and returned as 'undo', making an incorrect restore recoverable. It also discloses refusal conditions. This is rich, honest context that exceeds what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: it starts with the core action, then explains the destructive behavior and the safety mechanism, then lists refusals. Each sentence adds value. It is slightly verbose but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (which presumably documents return values), the description covers the key behavioral aspects: what happens on success (overwrite), the undo mechanism, and failure conditions. It does not explicitly describe the output format, but that is covered by the output schema. It is complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only a bare 'label' parameter with 0% description coverage. The description compensates by explaining that 'undo' is a valid label and that the tool lists existing labels when a given one is invalid. This gives the parameter contextual meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Overwrite the world and characters with a snapshot.' The title adds a synonym. It is clearly a restore operation, distinct from save_snapshot. However, it does not explicitly name sibling alternatives or differentiate them, so a 4 is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides some usage context: it refuses while the game is running, implying you should stop the game first, and it refuses non-existent labels, listing valid ones. But it does not explicitly state when to use this tool versus alternatives like save_snapshot or capture tools. No direct when-to-use/when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_snapshotCopy the save asideA
Copy this world and its characters aside, so a run can be undone.
WHAT THIS IS FOR. The mutating verbs write to a real install and none of
that FAILS — it accumulates. Enemy NPCs do not survive a reload, so spawn
looks harmless, but give writes the character file, time and weather
live in the world, and settile changes it for good. The damage is
invisible when it is done and shows up later as a measurement nobody
doubts.
Take one before a run that mutates, and save_restore after it.
REFUSES WHILE THE GAME IS RUNNING, naming the pids. A running tModLoader owns these files and writes them out on its own schedule, so a copy taken now is mid-write. Stop the session first.
Copies the configured world's .wld and .twld and every .plr/.tplr —
not the whole Worlds directory, which measured 41MB against 3MB for one
world, and not .bak files, which are the game's own safety net.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| size | Yes | |
| files | Yes | |
| label | Yes | |
| taken | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavioral traits: it refuses while the game is running, names the copied file types (.wld, .twld, .plr/.tplr), and explicitly excludes the whole Worlds directory and .bak files. This gives the agent a precise model of what the tool will and will not do.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than strictly necessary, but it is well-structured with bolded section headers and front-loaded purpose. The detailed rationale about mutating verbs, file sizes, and the running-game refusal earns its place because it directly affects when and how the tool should be invoked.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers when to use the tool, what files are copied, and the running-game refusal, and an output schema exists so return values do not need explanation. However, the required label parameter is left undefined, which is a meaningful gap for an agent trying to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter, label, with 0% schema description coverage, and the description never explains what label means, what format it should take, or how it is used to identify the snapshot for later restoration. The 'before a run' phrasing only weakly implies the label may identify the run, which is not enough to compensate for the missing documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: it copies the configured world and its characters aside so a run can be undone. It also names save_restore as the companion for after the run, but it does not explicitly distinguish this tool from the sibling save_snapshots, so it lacks full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to take a snapshot before a mutating run and use save_restore after it, and it warns that the tool refuses while the game is running and tells the agent to stop the session first. This gives clear context and an exclusion, though it does not discuss alternative tools such as save_snapshots for listing existing snapshots.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_snapshotsList the saved copiesARead-only
Every snapshot on this machine, newest first, with its age in seconds.
A snapshot whose manifest cannot be read is omitted rather than listed as
empty, because save_restore refuses it for the same reason: putting back
nothing and reporting success is the worst available outcome.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| root | Yes | |
| snapshots | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint and destructiveHint annotations by disclosing ordering, time units, and the significant behavior that unreadable manifests are omitted rather than shown as empty. It also explains why this is intentional, referencing the danger of restoring nothing and reporting success.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Both sentences earn their place. The first states the core result and ordering; the second clarifies an edge case with a concrete reason. There is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with an output schema presenthol and safety annotations, the description covers everything an agent needs: what is listed, ordering, age units, and the handling of unreadable snapshots. No critical invocation details are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is effectively complete and no parameter documentation is needed. The baseline of 4 applies because the description does not need to add parameter semantics and correctly omits them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The title 'List the saved copies' names a specific verb and resource, and the description expands to 'Every snapshot on this machine, newest first, with its age in seconds.' This clearly distinguishes the tool from siblings like save_snapshot and save_restore, which imply creation and restoration rather than listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear this is a listing operation, so an agent can infer when to use it, but it does not explicitly state when to choose this over save_snapshot or save_restore, nor does it give exclusion criteria. The mention of save_restore is behavioral rationale, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shotPhotograph part of the frameARead-only
Capture a region of the game's own back buffer and return the PNG path.
Args: region: topleft, topright, bottomleft, bottomright, or full. REQUIRED and deliberately without a default — the frame holds the player's character name, world name and any chat, so a request says which corner it wants. target: Address a specific client. timeout: Seconds for the WHOLE call — the reply and then the PNG, out of one budget rather than one each.
This reads what the game rendered, not the screen, so no other window can appear in it — by construction rather than by luck. It also sees things the in-game capture camera cannot: dust and the interface layer.
The path comes back only once the bytes behind it are a WHOLE PNG. A file exists from the moment it is created rather than the moment it is finished, so waiting on the name alone would hand back half a picture as readily as a whole one — and anything else that landed on that name as readily as either.
| Name | Required | Description | Default |
|---|---|---|---|
| region | Yes | ||
| target | No | ||
| timeout | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| region | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/destructiveHint annotations, the description discloses meaningful behavior: it captures the back buffer rather than the screen, includes interface elements and dust, and only returns a path once the PNG bytes are complete. It also warns about the file-existence race condition, which is valuable operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and organized into clear sections for arguments and behavior. It is somewhat verbose, especially the final paragraph's phrasing, but the extra detail is substantive and not wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three parameters and an output schema, the description covers the purpose, parameter semantics, capture source, edge-case behavior, and timeout handling. Nothing needed to call the tool correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description fully compensates by explaining every parameter. It enumerates valid region values and their rationale, clarifies that target addresses a specific client, and gives precise semantics for timeout as a single budget for the whole call including the PNG write.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool captures a region of the game's back buffer and returns a PNG path, which is specific and actionable. It distinguishes the capture source from the screen and from the in-game capture camera, but it does not explicitly differentiate this from sibling tools like captures or read_capture.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful context for when the tool is appropriate, such as reading the game's rendered output rather than the screen, and explains why the region parameter is required. However, it does not explicitly name alternatives among the sibling tools or state when not to use this tool, leaving tool-selection guidance largely implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusIs a session running?ARead-only
Whether a session is running, and what it is.
The only read-only way to ask. Without it an agent that lost track had to
provoke an error to find out — launch fails when one exists, diag fails
when one does not — so the cheapest question on the surface was the one
that had to be asked by breaking something.
Reports what this server BELIEVES it started. It does not re-query the
process table, so it cannot tell you a game was closed from outside; stop
is what verifies against reality.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| port | Yes | |
| world | Yes | |
| joined | Yes | |
| player | Yes | |
| running | Yes | |
| started_pids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the readOnlyHint and destructiveHint annotations by disclosing that it reports only what the server believes it started, does not re-query the process table, and cannot detect externally closed games. This is valuable behavioral context that prevents misinterpretation of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the core purpose. The additional sentences about read-only superiority and limitation on external process changes are relevant, though the phrasing could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, rich annotations, and an output schema, the description is complete. It covers what the tool reports, its reliability limits, and how it fits among sibling tools, leaving no critical gap for agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter semantics to convey. The baseline for zero-parameter tools is 4, and the description adds no unnecessary parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States exactly what the tool does: reports whether a session is running and what it is. It also distinguishes itself as 'the only read-only way to ask', contrasting with launch and diag, so an agent can tell it apart from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use this tool: when an agent has lost track of session state and needs a read-only check. It contrasts with launch/diag, which fail depending on state, and notes that stop is needed to verify against reality, providing clear context on limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stopStop the game sessionADestructive
Kill only the processes this session started, and confirm they are gone.
Args:
settle: Seconds a killed process may take to leave the process table
before it counts as a survivor. /F returns before Windows has
caught up, so verifying too eagerly reports a successful teardown as
a refused one — raise this on a loaded machine rather than lower it.
Surgical on purpose: a developer usually has their own game open, and a teardown that killed every tModLoader it could find would take it with them.
killed_pids are pids VERIFIED to have left the process table, not pids a
kill was aimed at. If any survive, this FAILS rather than answering with a
shorter list — and the session is deliberately kept, so calling stop
again retries exactly those pids. Releasing it would leave a running game
that nothing owns, which is how the next launch ends up refusing to start
over a process nobody remembers starting.
| Name | Required | Description | Default |
|---|---|---|---|
| settle | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| killed_pids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description adds critical behavior: it fails if any pids survive, deliberately keeps the session, retries exactly those pids on the next call, and explains why premature verification causes false refusals. It also clarifies that killed_pids means verified-gone pids, not merely targeted ones.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-sentence mission, then structured into argument explanation, rationale, and failure semantics. Every sentence contributes operational value, and the structure makes the longer content easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive teardown tool with one parameter and an output schema, the description covers invocation behavior, failure semantics, retry behavior, and consequences for subsequent launches. Nothing an agent needs to call it correctly and safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description carries the full burden for the only parameter, settle. It explains the unit, the failure mode when too low on Windows with /F, and when to raise it on a loaded machine, which is fully actionable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Kill only the processes this session started, and confirm they are gone.' It clearly scopes the operation to session-owned processes siege, and the 'Surgical on purpose' note distinguishes it from a broad tModLoader-wide kill.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when this tool is appropriate: a scoped teardown that avoids killing a developer's own game, and it explains that calling stop again retries surviving pids. It does not name explicit sibling alternatives, but the scope is clear enough that an agent can choose it over destructive broader kills.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
triggerSend a dev trigger to the gameA
Ask the running game to do something, and return what it said.
Args:
command: One of the dev commands THIS mod serves — call commands to
see them, since they are the running mod's rather than a list kept
here. A word it does not serve is refused before anything is
written to disk: a game that does not recognise one does nothing,
and from outside that is indistinguishable from a hang.
target: Address the request to one player by name. Every request is
already addressed to this session's own player by default, so pass
this only to ask a DIFFERENT client — one another session drives on
the same machine.
argument: Only some commands read one — commands says which. Passing
one to a command that takes none is refused here, because the mod
would refuse it too and that costs a round trip.
server: Send to the dedicated server rather than the client. Some
commands are server-authoritative and refuse on a client, and each
side publishes its own list.
timeout: Seconds to wait for the game's reply. A command that does real
work on a large world can outlast the default, and for capture
that is now safe at any value: the capture lock records the
deadline this argument implies, so another session waits it out
instead of guessing from the lock's age. Raising it no longer
trades a slow capture against a collision.
refused is reported separately from ok: a refusal is the mod
deliberately saying no, and treating it as success is how a rejected action
reads as a completed one.
note is usually null and is the one field with no other way to reach you:
something that happened on the way to this reply which the reply itself
cannot show. Currently it says a capture lock was broken to take this
picture — captures are serialised across sessions sharing a save directory,
and this one's holder was judged gone. It names WHICH rule judged it: the
holder's own recorded deadline had passed, or the lock recorded no deadline
and the 60s age bound decided instead. The second is the weaker claim — a
guess about how long a capture can take — and worth knowing you are reading.
| Name | Required | Description | Default |
|---|---|---|---|
| server | No | ||
| target | No | ||
| command | Yes | ||
| timeout | No | ||
| argument | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| note | Yes | |
| text | Yes | |
| command | Yes | |
| refused | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the sparse annotations, it discloses failure semantics: unserved commands are refused before disk writes, unknown game responses are indistinguishable from hangs, refusals are reported separately from `ok`, and capture locks serialize across sessions with deadline/age-based takeover. No contradiction with readOnlyHint/destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is long but dense and well-structured: a one-line purpose, an Args block, then two paragraphs for response semantics and capture-lock behavior. Every paragraph adds information an agent needs to interpret replies correctly, and the purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, 1-required tool with subtle refusal/hang/capture behavior, the description covers invocation, response interpretation, side effects, and cross-session concurrency. It names the `commands` sibling for discovery and explains `note` as the only out-of-band field, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description carries the entire burden for all five parameters: `command` is dynamic and must be discovered at runtime, `target` defaults to the session's player, `server` selects a different authoritative side, `argument` is command-dependent, and `timeout` interacts with capture locking. This more than compensates for the empty schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Ask the running game to do something, and return what it said.' It frames trigger as the channel for dev commands served by the mod, and points to the sibling `commands` tool to enumerate them, so it is easy to tell apart from list-only sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit conditional guidance per parameter: call `commands` to see valid commands, use `target` only for a different client, use `server` for server-authoritative commands, and pass `argument` only when a command reads one. These read as when-to-use rules and route the agent away from the discovery sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_untilWait until the game reaches a stateARead-only
Poll diag until one of its fields satisfies a comparison.
Args:
field: A TOP-LEVEL diag field, exactly as diag reports it - vats,
items, world-ready. Not a path into one: diag splits
key: value and stops, so npcs is the whole string
active=4 mutated=0 and there is no npcs.active.
op: One of ==, !=, <, <=, >, >=, contains, changed.
value: What to compare against, as text - it is converted to whatever
type the field actually reads as. Omitted for changed, which
baselines on its first reading.
server: Watch the dedicated server's view instead of the client's.
target: Watch a specific client by name.
timeout: Seconds for the WHOLE call, spent across every poll rather
than granted to each.
poll: Seconds between polls.
Use this instead of sleeping and taking a diag. A guessed sleep is wrong in both directions, and the short one is dangerous: the check reads the state BEFORE the thing happened, which looks exactly like the feature being broken.
THE COMPARISON IS TYPED. diag returns counters as ints and the
heartbeat's flags as bools; world-ready == true compares as a boolean and
items >= 10 as a number, so neither "10" < "9" nor the truthiness of
"False" can come back here.
IT REFUSES WHAT CAN NEVER COME TRUE rather than waiting it out. An unknown field names the fields that do exist; ordering a composite string says what the value actually is. Both used to be spellable and would have reported a timeout - blaming a game that was answering perfectly.
Not matching is an ANSWER, not an error: it returns matched: false with
the last reading it took, so a wait that expected nothing to happen is as
expressible as one that expected something to.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | ||
| poll | No | ||
| field | Yes | ||
| value | No | ||
| server | No | ||
| target | No | ||
| timeout | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| last | Yes | |
| note | Yes | |
| polls | Yes | |
| elapsed | Yes | |
| matched | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=true, destructiveHint=false), the description discloses critical behavioral details: the typed comparison semantics (ints vs bools), the refusal of conditions that can never be true, the return of `matched: false` with the last reading, and the timeout/poll mechanics. This is substantial added value over the structured metadata and gives the agent a complete mental model of the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized into clear sections: a terse opening, a detailed Args block, and three focused notes on typing, impossible conditions, and non-match returns. Every sentence adds information, but some parts (e.g., the typed comparison examples) could be trimmed without loss. Still, the structure front-loads the core purpose and keeps related details together, so it remains effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 params, 0% schema coverage, and a rich behavioral profile), the description covers everything an agent needs to call it correctly: parameter semantics, type handling, error behavior, and timeout/poll semantics. The presence of an output schema (not shown) means return format is already structured, but the description still explains the `matched: false` case, which is essential context. No significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description carries the full burden of parameter documentation. It explains every one of the 7 parameters in the Args section: `field` (top-level only, not paths), `op` (enum-like list), `value` (text converted to field type), `server`/`target` (view selection), `timeout` (whole-call budget), and `poll` (interval). This fully compensates for the absent schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Poll `diag` until one of its fields satisfies a comparison.' This clearly identifies the tool's action and distinguishes it from sibling tools like `diag` (direct read) and `log_watch` (log watching). It also explicitly states when to prefer it over sleeping and taking a `diag`, reinforcing its unique role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: 'Use this instead of sleeping and taking a diag' and explains why a guessed sleep is wrong in both directions. It also clarifies behavior for impossible conditions and non-matching outcomes, which helps the agent decide when the tool is appropriate. The parameter docs for `server` and `target` further specify use cases for client vs. server views.
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.
24 tool updates
v0.6.3- First observed
api_search - First observed
build_mod - First observed
captures - First observed
commands - First observed
diag - First observed
heartbeat - First observed
inventory - First observed
join - First observed
launch - First observed
log_files - First observed
log_since - First observed
log_watch - First observed
logs - First observed
prune_captures - First observed
read_capture - First observed
restart - First observed
save_restore - First observed
save_snapshot - First observed
save_snapshots - First observed
shot - First observed
status - First observed
stop - First observed
trigger - First observed
wait_until
TDQS
Scored across 24 tools
Each tool has a clearly distinct purpose, even those sharing a domain like logging (log_files lists, logs tails, log_since increments, log_watch waits). The descriptions are exceptionally detailed, leaving no ambiguity about which tool to select.
Naming is inconsistent: some tools use verb_noun with underscores (log_watch, read_capture, prune_captures), others are single verbs (launch, join, stop), and some are plain nouns (captures, commands, status). There is no uniform convention.
24 tools is on the high side but justifiable for a complex development workflow covering building, launching, monitoring, capturing, logging, and snapshot management. It borders the heavy range but each tool serves a distinct function.
The tool surface covers the full mod development lifecycle: build, launch, observe, capture, restore, and log analysis. Minor gaps exist (e.g., no direct world editing or mod config tools) but core workflows are well-supported.
Maintenance
Related MCP Connectors
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
Telegram bridge for your MCP-compatible agent. Bidirectional, no LLM in our stack.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Develop, manage, and debug Railway projects, services, and deployments from within agents.
Related MCP Servers
- FlicenseAqualityCmaintenanceEnables an agent to drive a real Ragnarok Online client session against a local rAthena server, allowing it to log in, walk, talk to NPCs, and fight in order to test server content end to end.17-
- AlicenseNot gradedqualityBmaintenanceEnables an agent to drive a running Unreal Engine game via UE4SS by reading/writing UObject properties and calling UFunction, with verdicts that verify whether the requested state change actually happened.MIT
- FlicenseNot gradedqualityBmaintenanceEnables controlling a real Minecraft Bedrock client by injecting input and reading frames through the launcher's agent socket, including launching, stopping, screenshotting, sending chat, and managing multiple bot instances.2-
- AlicenseAqualityBmaintenanceEnables AI assistants to interact with running games in real time — introspecting game state, simulating keyboard and mouse input to actually play, capturing screenshots, executing Lua code, hot-reloading files, and receiving push notifications when state changes.8MIT