Drive a running tModLoader (Terraria) instance from an agent: launch, query, screenshot, read state.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
One-click editor setup isnβt available for this listing yet β we donβt have a confirmed install command, and weβd rather show nothing than point your editor at the wrong package or host. Follow the projectβs own setup instructions, linked above.
Drive a running tModLoader instance from an agent β launch it, ask it questions, photograph it, and read its state back as structured data.
How it works Β· Quick start Β· Configuration Β· Known limits
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.
The tool staged its own screenshot β
time:noon, teleport:spawn, spawn:1,25,
shot:full β read from the game's back buffer, so a window in
front of the game cannot be in the picture
(How it works starts there). Trimmed of the
unexplored dark below the terrain; otherwise exactly as returned.
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.
Then:
responder/
into your mod's source tree and subclass DevResponder. It is a folder of
C#, not a PyPI dependency, because it compiles inside your mod.launch, then diag. Or open with the
start_a_session prompt, which lists the worlds and characters that
actually exist here.This needs WSL2 driving a Windows tModLoader β Requirements says why before anything else does.
The game is asked by writing a file it polls, not by sending it input:
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.
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 |
|---|---|
capture / shot | a photograph of the frame, by named region |
diag | whatever your mod chose to report |
tiles | tile-type counts in a rectangle |
entities | NPC, item or projectile counts, filterable by rectangle |
find | one line per entity: id, position, health |
players | who is connected |
The writes are opt-ins, each one line you write in RegisterCommands:
| Opt-in | Verbs it adds |
|---|---|
DevMutations | time weather spawn give teleport settile cleartile despawn |
DevCommandBridge | command commandlist β runs any mod's own registered ModCommands |
DevChat | chat say |
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.
Every line below is real β the same server and client the live checks drive, quoted rather than paraphrased:
The 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.
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
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/tmodloader-mcp)<a href="https://allmcps.com/mcp/tmodloader-mcp"><img src="https://allmcps.com/api/badge/tmodloader-mcp?style=directory" alt="Tmodloader MCP on AllMCPs" /></a>