balatro-agent
Enables an AI agent to play the Steam version of Balatro via a local MCP by reading player-visible game information, validating and executing native game actions, confirming outcomes, and saving/loading/revising model experience across runs.
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., "@balatro-agentplay one native random Red Deck White Stake run and tell me the result"
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.
Balatro Agent
English | 简体中文
Let AI take the next run of Balatro.
A tool-capable AI uses local MCP tools to read player-visible information, choose and execute game actions, and save and reuse what it learns.
For Windows x64 · Steam Balatro · Codex desktop. The launcher and play activity window support English and Chinese.
Gold Stake clear
GPT-6.1 Sol has cleared Gold Stake using Balatro Agent. Watch the 26-second gameplay excerpt below (waiting periods sped up).
https://github.com/user-attachments/assets/fbc3b384-bd33-472a-82f0-dbf9969bc187
Related MCP server: local-game-mcp
Download and play
Download the v1.4.0 project ZIP and extract it to a permanent folder. Keep the whole folder. Install the Steam edition of Balatro and sign in to Codex; close the game normally before installation or updates.
Open Balatro Agent.exe and wait for Ready. It finds the project and game, prepares dependencies, backs up and installs the Mods, and configures MCP. No separate Python installation is needed.
Choose Deck and Stake / mode, then click Start in Codex. When Codex supports the project link, it opens a project chat with the prompt filled in. Review and send the prompt in Codex to begin. The launcher closes after successfully dispatching the opening request.
If the project link does not open, reopen the launcher and use Copy play prompt. Paste it into a local Codex chat with the balatro-agent tools loaded. Both paths use the same short prompt with the actual project path, your selections and a play-rules file reference, so you do not need to select the project folder first. If tools are missing after setup, reload MCP or reopen Codex.
The launcher follows the Windows display language by default; use Language / 语言 to switch. You can close the launcher after sending the prompt. Keep the project folder.
If an earlier action is unconfirmed, its receipt is missing, or a checkpoint is damaged, normally close Balatro and click Abandon session / prepare on the launcher's error page. Old records stay preserved and old actions are never replayed. You can start again after preparation; reopening the launcher also resumes an interrupted archive. Recovery details
Test other models with CC Switch
Use CC Switch to configure other model providers in Codex and continue using this project's local MCP tools and Balatro Agent.exe. DeepSeek V4.1 Flash has been successfully connected through CC Switch and used to play this project.
Live play activity
An MCP game launch opens an independent activity window. Its HH:mm:ss timeline shows stage changes, short decisions, plan updates, action results, and experience saves. It displays the model's submitted rationale and plans.
Close the window at any time without interrupting play; double-click Balatro Status.exe to reopen it. The command Balatro Agent.exe --monitor also works. How it works and measured overhead
Each run's activity is automatically saved under runs/live/activity/by-run/. Normal results and post-run experience saves stay with that run.
Decks and stakes
The default is Red Deck / White Stake. Choose from 15 original decks; the selected deck must be visibly unlocked. After you send the play prompt, the AI first opens or shows the game, then checks the connection.
Stake / mode | Behavior |
White, Red, Green, Black, Blue, Purple, Orange, Gold | One run at the selected stake |
Highest stake | One run at the highest unlocked stake for that deck |
Climb mode | Start at that deck's highest unlocked stake; retry normal losses, advance one stake after a verified win, and continue until beating Gold or you ask to stop |
Climb mode reports and reviews each run before continuing.
Results and experience
Each completed run returns a brief report: actual deck / stake · win or loss · ante / round · elapsed time · experience update status.
After a single run or a completed climb, the game stays on the results screen with its window open. A climb continues after each run's report.
The AI reads the general guide before playing and other topics as needed. Both source baselines and local experience keep one current.md per topic; local updates amend and atomically replace that same file. Local experience takes priority and stays in runs/local-experience/.
More information
Setup and recovery · English support · Play rules · Verification evidence · Changelog
License
Self-authored code, documentation, and experience use the MIT License. Third-party licenses are listed in NOTICE.
Available Tools
12 toolsactADestructiveIdempotent
Submit one native action bound to current observation_id, unique action_id, short reason and actual experience_refs. For the bilingual activity window, reason may use '[zh-CN]Chinese rationale [en]English rationale' (replace placeholders with one concise equivalent sentence in each language, no internal reasoning); plain text remains valid. parameters: select={region,positions}; reorder={region,order}; blind={blind_slot}; buy/sell/use/take={region,position}; select_setup_option={kind:deck or stake,position}; play/discard may use {positions:[complete selection]} with positions-v1, or {} for already selected cards; others={}. native-target-v1 clicks the actual target/button; select consumable hand targets separately. Pack Tarot/Planet/Spectral immediate use is use; select_pack_card takes playing cards/Jokers or explicitly enabled consumables. Choose current visible unlocked candidates; native settings only. Random non-challenge. Identical IDs query, changed content rejects. AWAITING_INPUT: observe, close each native prompt once, query original navigation. Service UNKNOWN: pause gameplay, query the original ID and observe; continue local diagnosis, repair and isolated verification under maintenance policy, without replaying or bypassing pending records. Only an exact host approval-timeout receipt confirming no execution permits one identical client retry after original-ID and unchanged-state checks; see prompts/mcp-evidence.js.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | compact | |
| action | Yes | ||
| reason | Yes | ||
| action_id | Yes | ||
| parameters | Yes | ||
| observation_id | Yes | ||
| experience_refs | Yes |
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 destructive=true and idempotent=true, but the description adds substantive context beyond them: identical IDs query while changed content rejects, close-each-prompt handling for AWAITING_INPUT, pause/query behavior for service UNKNOWN, and a strict host approval-timeout retry rule. It discloses real operational constraints, though several clauses are cryptically worded.
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?
After a serviceable first sentence, the description collapses into a single dense run-on covering parameter shapes, error states, and maintenance policy with no headings or sentence breaks to front-load the essentials. Every clause carries content, but the wall-of-text structure makes the critical routing and parameter information hard to locate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description does cover error states and many action parameter shapes. It is still incomplete for a 34-value action enum with 0% schema coverage: several actions and the top-level identity fields (action_id uniqueness expectations, experience_refs, view) are not fully specified.
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 burden and largely succeeds by enumerating per-action parameter shapes (select={region,positions}, reorder={region,order}, blind={blind_slot}, buy/sell/use/take={region,position}, select_setup_option={kind,position}, and the positions-v1 form for play/discard). It leaves the top-level observation_id, action_id, and experience_refs semantics only partially implied.
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 gives a specific verb and resource: 'Submit one native action bound to current observation_id, unique action_id...'. An agent understands this dispatches a game action, which is distinguishable from siblings like observe and action_status, though the term 'native action' is jargon that is never defined.
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?
Usage guidance is embedded but scattered: 'Choose current visible unlocked candidates; native settings only. Random non-challenge' and the AWAITING_INPUT/Service UNKNOWN recovery flows. However, it never explicitly states when to call act versus action_status, observe, or wait_until_ready, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
action_statusCRead-onlyIdempotent
Query an action record in this game session and return filtered feedback; never replay it. Session change or missing records remains UNKNOWN; no cross-process exactly-once guarantee.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | compact | |
| action_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, non-open-world), so the description earns credit for adding failure semantics instead: session changes or missing records resolve to UNKNOWN, and there is no cross-process exactly-once guarantee. That is genuinely useful context an agent could not get from 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?
Dense and front-loaded in two short clauses, with the core action ('query... never replay') stated first and the caveats second. No filler, though the compressed phrasing borders on cryptic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. However, with 0% schema description coverage on two parameters and no explanation of the action_id semantics or the view filter, the definition is under-specified 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%, so the schema documents nothing about either parameter. The description's phrase 'filtered feedback' weakly gestures at the optional view parameter but never explains action_id format, validity, or what view values do, leaving both parameters effectively undocumented.
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 ('query an action record in this game session'), but 'action record' and 'filtered feedback' are vague jargon. The 'never replay it' clause hints it is a status read rather than a re-execution, but it does not clearly distinguish it from siblings like observe, act, or health.
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 only usage signal is the embedded 'never replay it', which vaguely implies you should not use this to re-run an action, but no alternative tool is named and no when-to-use context is given. An agent must infer how this relates to act, observe, or health.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculateARead-onlyIdempotent
Explicit public numbers only. sum/difference/product/quotient/mean/median/variance_population take {values:[numbers]}; combination takes {n,k}; hypergeometric takes {population,successes,draws,min_successes,max_successes}, conditioned on uniform sampling without replacement. Up to 200 values/1000 population. Reject unknown/nonfinite values, zero divisors, extra fields and limits. No game/network reads, action recommendation, expressions or arbitrary code.
| Name | Required | Description | Default |
|---|---|---|---|
| inputs | Yes | ||
| operation | Yes |
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 readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds behavior beyond that: hard limits (200 values / 1000 population), the sampling semantics of hypergeometric ('uniform sampling without replacement'), and explicit rejection behavior for unknown/nonfinite values, zero divisors, extra fields and limit breaches — all useful for anticipating errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences with zero filler, but the structure is a semicolon-chained run-on and leads with a constraint rather than the purpose, which front-loads the least orienting information. Every clause does earn its place, so waste is minimal.
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 2-parameter tool with an output schema and full annotation coverage, the description supplies the missing pieces: operation-to-input mapping, size caps, sampling semantics, and rejection rules. It stops short of stating error/return format, but the output schema reasonably covers returns, leaving only minor ambiguity about whether the operation list is exhaustive.
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 schema is nearly empty (operation is an unconstrained string, inputs is a free-form object), so the description carries the entire semantic burden and does so well: it maps each operation to its exact input shape ({values:[numbers]}, {n,k}, {population,successes,draws,min_successes,max_successes}). This compensates fully for the schema gap.
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 enumerated operations (sum/difference/product/quotient/mean/median/variance_population, combination, hypergeometric) make it unambiguous that this is a pure arithmetic/statistics evaluator, and it is trivially distinguishable from the action-oriented siblings (act, run_plan, launch_game). However, the description never states a purpose sentence up front — it opens with a constraint ('Explicit public numbers only'), so the agent must infer 'calculates math' from the operation list.
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 strong negative guidance: 'Explicit public numbers only', 'No game/network reads, action recommendation, expressions or arbitrary code' — effectively delineating when this tool is and is not appropriate. It lacks a positive 'use this when...' statement or comparison to an alternative, but no sibling covers the same math domain, so the absence costs little.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_gameADestructiveIdempotent
Under an explicit user close request or standing authorization for necessary maintenance closure in docs/balatro-ai/maintenance.md: normally close the verified Balatro window and confirm exit, without force kill. Requires known current profile, latest observation_id, ready, normal results or idle main menu, and no pending actions. Reject active runs/UNKNOWN. 0-30 seconds; operation_id deduplicates. An uncertain response permits querying the identical operation only.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_s | No | ||
| operation_id | Yes | ||
| observation_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (destructive/readOnly/idempotent/openWorld), and the description still adds substantial context: authorization source, no-force-kill constraint, preconditions, the 0-30s expected duration, operation_id-based deduplication, and the uncertain-response retry rule ('permits querying the identical operation only'). This is well beyond what the annotations supply.
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 authorization condition is front-loaded and every clause carries operational weight (preconditions, duration, dedupe, retry). It reads as a dense run-on that is harder to scan than separated sentences, but there is little pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description still covers authorization, preconditions, timing expectations, failure rejection cases, and retry semantics. An agent has everything needed to decide and call 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 must carry parameter meaning; it explains that observation_id must be the latest and that operation_id deduplicates retries and governs safe re-query after an uncertain response. Only timeout_s is left semantically unexplained, which keeps it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('close the verified Balatro window and confirm exit') and explicitly bounds the action ('without force kill'). It is trivially distinguishable from siblings like launch_game or recover_lost_session without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when ('explicit user close request or standing authorization ... in docs/balatro-ai/maintenance.md') and when-not ('Reject active runs/UNKNOWN'), plus a full precondition gate: known current profile, latest observation_id, ready, normal results or idle main menu, no pending actions. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
healthARead-onlyIdempotent
Read connection, fixed versions, actual native profile and historical test-profile comparison. A profile mismatch is information only. Performs no game action.
| 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 readOnly/idempotent/non-destructive, so the safety profile is covered. The description still adds genuine domain context: the profile-mismatch-is-informational note tells the agent mismatches are not actionable failures, and "Performs no game action" disambiguates it from action-oriented siblings.
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 short sentences with no filler, and the statement of what is read comes first. The noun list is somewhat jargon-dense but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. For a zero-parameter read-only diagnostic tool, the description covers what is read and its non-side-effecting nature; the only gap is the absence of explicit routing against sibling diagnostics.
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?
Zero parameters, so the baseline is 4. There is nothing for the description to compensate for, and the schema is fully self-describing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a clear verb (Read) and enumerates the specific artifacts returned: connection state, fixed versions, native profile, and historical test-profile comparison. It does not explicitly contrast itself with siblings like observe or action_status, but the resource content is distinctive enough to identify the 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?
Override implicit context, but no explicit when-to-use. "Performs no game action" hints at a safe diagnostic use case, and "A profile mismatch is information only" tells the agent not to react to mismatches. However nothing says when to prefer this over observe or action_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
launch_gameAIdempotent
Windows: verify Steam AppID 2379780, launch normally and wait for MCP. A new permitted launch also requests an independent bilingual activity window; closing or failing that viewer never controls gameplay. It displays public MCP summaries, submitted reason and run_plan, not internal model reasoning. If already running, verify/show its window; UNKNOWN allows only restoring that window. timeout_s is 0-30 seconds. operation_id is durably deduplicated; identical requests query only, without reopening the viewer. No game clicks, pending-action deletion, paths, commands or process IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout_s | No | ||
| operation_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false) by disclosing that a permitted launch opens an independent activity window, that closing/failing that viewer never controls gameplay, and exactly what it displays. It also states the durable operation_id dedup semantics and enumerates what the tool will NOT do (no game clicks, pending-action deletion, paths, commands, process IDs).
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?
Extremely dense and run-on, mixing launch behavior, window policy, timeout, dedup, and negative constraints into long clauses. Much is load-bearing, but the front-loading is weak and phrases like "No game clicks, pending-action deletion, paths, commands or process IDs" are cryptic fragments rather than clean structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description still covers the already-running/UNKNOWN branches, the lifecycle of the activity viewer, the timeout bound, and dedup behavior. Reasonably complete for a launch tool, though the failure/timeout outcome path is not described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does for both parameters: timeout_s is bounded ("0-30 seconds") and operation_id's dedup/query-only semantics are spelled out. This adds material meaning the bare schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (launch the game) tied to a concrete Steam AppID and defines the core behavior "launch normally and wait for MCP." It implicitly contrasts with the already-running path, but does not explicitly name the obvious sibling (close_game) to disambiguate.
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 conditional guidance for one branch ("If already running, verify/show its window; UNKNOWN allows only restoring that window") and notes the dedup query path. However, it never states when to prefer this over siblings like run_plan, wait_until_ready, or recover_lost_session, so selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
observeBRead-onlyIdempotent
Read the player-visible state of the current identified native profile. Unknown actual profiles are reported. server_time is service wall-clock metadata outside the observation ID, usable for run timing, not pure model thinking time. No deck order, seeds or hidden card identity. Game names and descriptions retain their current game language.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | compact |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and non-destructive behavior. The description adds meaningful context beyond that: unknown profiles are reported, hidden information such as deck order and seeds is excluded, and server_time is wall-clock metadata rather than thinking time. Some phrases remain ambiguous, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and the remaining sentences add relevant constraints without obvious padding. Some wording is dense and jargon-heavy, but the overall structure is efficient.
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 state-observation tool with an output schema and strong read-only annotations, the description covers observation scope and data exclusions well. It is incomplete because it omits any explanation of the view parameter, which is the only input an agent must choose.
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 single parameter "view" is never mentioned or explained in the description. With no schema-level description to compensate, the description should clarify what view values mean or what compact/default does, but it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: "Read the player-visible state of the current identified native profile." It also clarifies scope by excluding hidden information. However, it does not explicitly differentiate this tool from siblings such as action_status or act, 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?
Usage is implied by the game-observation context, but there is no explicit when-to-use guidance or comparison to alternatives like action_status or act. The mention that server_time is usable for run timing is a partial usage clue, but not a routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_notesARead-onlyIdempotent
Actually read disk, local experience over read-only baseline; TEST is separate. Each experience topic has one current.md; revision is an update counter and older content is not retained for reading. Default strategy returns only actionable rules, conditions, counterexamples and confidence, plus short update references. It omits sources, historical facts, timestamps and write IDs. Explicit content/full views include audit information; full also returns the Chinese Markdown guide. Read EXP-GENERAL-GUIDE first, then relevant topics. Omitted IDs read all, [] reads none. index returns truncated previews/revision refs, not full reading or action evidence. query is literal, at most 80 characters; pages contain 20 entries, continue with next_offset. TEST retains historical reads. Existing note text keeps its original language.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | experience | |
| view | No | strategy | |
| query | No | ||
| offset | No | ||
| note_ids | No | ||
| revision | 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 readOnly/idempotent/non-destructive, yet the description adds substantial beyond-schema behavior: revision is an update counter with no retained history, views differ in what they omit, full returns a Chinese Markdown guide, and query is literal and capped at 80 characters. This is genuine added context, though pagination and scoping rules are stated in dense fragments rather than cleanly.
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 a run-on wall of semicolon-separated clauses with a confusing opening sentence that spends space on environment chatter rather than the tool's function. Key facts are present but not front-loaded or organized, hurting scannability.
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, return-value detail is less critical, yet the description still specifies per-view outputs and omits fields appropriately. Combined with the parameter and behavioral coverage for a 6-param, 0%-coverage schema, an agent has enough to call it correctly, though the muddled purpose statement leaves a small 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?
With 0% schema description coverage across 6 parameters, the description carries the full burden and largely succeeds: it explains kind (experience vs TEST), view modes, query length/format, offset continuation ('continue with next_offset'), note_ids semantics (omitted = all, [] = none), and revision meaning. Some fields remain under-specified (exact accepted view/kind strings are not enumerated).
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 tool clearly reads notes/experience topics and the description implies a read operation, but the opening ('Actually read disk, local experience over read-only baseline; TEST is separate') is cryptic and never states plainly what read_notes does. It never names its write counterpart write_note, so differentiation from siblings is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Offers concrete sequencing guidance ('Read EXP-GENERAL-GUIDE first, then relevant topics') and disambiguates views (index = previews only, strategy = actionable rules, content/full = audit). It stops short of an explicit when-not-to-use or a direct pointer to a sibling, so it lands below the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recover_lost_sessionCIdempotent
First query action_status and observe. Retire only after actual session change and confirmed record loss, with known current profile, fresh observation and ready. Requires a pending intent or, with all checkpoints clear, an unambiguous missing-record status previously delivered by this service in the lost session. A missing record alone never proves non-submission. The original remains UNKNOWN; RETIRED is not success or a normal loss. No game action, replay or save read. Identical recovery_id/parameters query the durable receipt. Reject live old sessions, stale observations or unknown profiles.
| Name | Required | Description | Default |
|---|---|---|---|
| action_id | Yes | ||
| recovery_id | Yes | ||
| observation_id | Yes |
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 readOnly=false, idempotent=true, destructive=false, openWorld=false, and the description meaningfully extends these: identical recovery_id/parameters hit the durable receipt (explaining idempotency), no game action/replay/save read occurs, and RETIRED is explicitly not success. It also states the authoritative rejection cases. It stops short of explaining what state is written or how the receipt is returned.
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 text is a dense, run-on block of jargon-heavy conditions with no front-loaded statement of purpose; the reader must parse every clause before knowing what the tool does. Several sentences ('A missing record alone never proves non-submission', 'RETIRED is not success or a normal loss') are important but buried rather than 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?
An output schema exists, so return values need not be explained, and the description does supply substantial precondition and semantics context. However, it omits any clear statement of the tool's own operation and leaves all three parameters undocumented, which is insufficient for a 3-required-parameter mutation tool with 0% schema coverage.
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% for all three required parameters, so the description must carry the burden and largely does not. It hints that recovery_id is the key that makes calls idempotent and that observation_id must be a 'fresh observation', but action_id is never explained and no format or provenance is given for any parameter.
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 never plainly states what the tool does (e.g., 'records a retirement decision for a lost session and returns the durable receipt'). Almost every sentence is a precondition, warning, or exclusion, so the agent must infer the core operation from phrases like 'Retire only after...' and 'query the durable receipt'. The name recover_lost_session is not clarified or distinguished from siblings such as action_status or observe.
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 gating conditions: 'Retire only after actual session change and confirmed record loss, with known current profile, fresh observation and ready', plus exclusions ('Reject live old sessions, stale observations or unknown profiles') and a mandated prerequisite step ('First query action_status and observe'). Alternatives are named only as precondition steps, not as competing tools, so it stops short of a full when/when-not/alternative map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_planAIdempotent
Model-authored short run memory. read actually reads disk; omit other parameters. write requires latest observation_id, expected_revision(first 0), unique write_id and content{objective,priorities:[1-4],recheck_when:[1-4],experience_refs:[up to 6 fully read EXP-XXX@rN]}. For the bilingual activity window, objective and priorities[0] may each use '[zh-CN]Chinese summary [en]English equivalent' (replace placeholders with short matching summaries); plain text remains valid. At most 2000 UTF-8 bytes, 200 characters per item including both languages and tags. Only confirmed start_run/continue_run, actionable current run, no pending action. Same ID/content queries. Revise on material changes, read after compression. Run/profile/session changes invalidate reuse but retain history. No strategy generation or game action.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | read | |
| content | No | ||
| write_id | No | ||
| observation_id | No | ||
| expected_revision | 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 idempotentHint=true and destructiveHint=false, and the description is consistent with them while adding substantive context: revision-guarded writes via expected_revision (first 0), unique write_id dedup, size caps of 2000 UTF-8 bytes / 200 chars per item, and an explicit scope exclusion ('No strategy generation or game action'). It does not say what a conflicting revision does or what is returned, so it stops short of full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information density is high and the tool's function is front-loaded, but the text is a chain of clipped fragments and bracketed jargon ('read actually reads disk; omit other parameters', 'expected_revision(first 0)') that demands parsing. Several sentences would need rereading, which is a structure cost even if little is 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?
An output schema exists so return values need not be described, and the description covers the hard parts of a stateful read/write tool: preconditions, revision safety, dedup by ID/content, invalidation triggers, and size limits. The remaining gaps (mode value set, revision-conflict behavior) are minor given the overall coverage.
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 no parameter has an enum, so the description carries the full burden and largely meets it: mode read/write semantics, content sub-keys (objective, priorities[1-4], recheck_when[1-4], experience_refs up to 6 read EXP-XXX@rN), observation_id freshness, expected_revision initial value, and write_id uniqueness. It still never enumerates the legal mode strings or types, leaving some inference to the agent.
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 identifies a specific resource (run memory) and distinguishes its two modes: 'read actually reads disk' versus the write path with its required fields. It is telegraphic and the opening phrase 'Model-authored short run memory' is a little opaque, but an agent can tell this is a read/write store for the current run rather than the generic read_notes/write_note 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?
It gives real preconditions ('Only confirmed start_run/continue_run, actionable current run, no pending action') and lifecycle rules ('Revise on material changes, read after compression', 'Run/profile/session changes invalidate reuse but retain history'). What is missing is an explicit contrast with adjacent tools like write_note or read_notes, so the routing to a sibling 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.
wait_until_readyARead-onlyIdempotent
Poll read-only until normal UI is actionable; default 10 seconds, maximum 30. Returns ready, timeout, disconnected or unsupported. Readiness alone does not confirm an action completed.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | compact | |
| timeout_s | 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 the safe-read profile (readOnlyHint, idempotentHint, destructiveHint=false), so the description's real value is the added behavior: polling semantics, the 10s default / 30s cap, and the explicit warning that readiness does not equal action completion. That caveat is a genuinely useful behavioral disclosure 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?
Three short, information-dense sentences with no filler. The core operation is front-loaded, followed by timing bounds and then the readiness caveat, which is the right order of importance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, explaining return values is not strictly required, and the description still summarizes states (ready, timeout, disconnected, unsupported) for quick scanning. It is nearly complete for a 2-optional-param, zero-required tool; only the view parameter's effect is left unexplained.
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 carry parameter meaning. It partially compensates by giving the timeout default (10) and cap (30), but never explains the 'view' parameter or its 'compact' default, nor the relationship between 'normal UI' and view modes.
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: 'poll read-only until normal UI is actionable', which tells the agent exactly what operation occurs. It does not name or contrast itself with siblings like observe or action_status, so the agent must infer the boundary, but the purpose itself is 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?
Usage is only implied — the polling/readiness framing suggests calling it after launch or before an action, and the caveat 'readiness alone does not confirm an action completed' clarifies interpretation. There is no explicit when-not or pointer to an alternative sibling, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_noteBIdempotent
Atomically replace the same local current.md, never upload or overwrite baseline. First local edit starts from the baseline current content, without copying old versions. Before amending, explicitly read content/full to preserve current strategy and audit fields. Submit the full updated content; it replaces rather than automatically merges text. 0 creates; updates require current expected_revision. The Chinese guide contains strategy only; sources, historical facts and compact hash receipts are separate audit metadata. Default strategy response omits audit fields. Receipts deduplicate write IDs without retaining old strategy content. Legacy local data requires the maintenance migration. TEST remains separate. content: sources[{run_id,steps}], facts, interpretation, conditions, counterexamples, confidence(low/medium/high), revision_reason. Formal run IDs start n5-, TEST starts test-. Model writes from actual feedback. Read back to verify.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | experience | |
| view | No | strategy | |
| content | Yes | ||
| note_id | Yes | ||
| write_id | Yes | ||
| expected_revision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (idempotentHint=true, destructiveHint=false), the description discloses substantive behavior: full-content replacement rather than merge, old versions not copied, and receipts deduplicating write IDs without retaining prior strategy content. This explains what happens to prior data, which the annotations alone do not. It stops short of stating auth requirements or failure/rejection 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?
Roughly fourteen packed sentences that mix the core write semantics with migration notes, TEST run-ID conventions, Chinese-guide scope, and receipt behavior. The purpose is in the first sentence but immediately diffuses; several clauses ('TEST remains separate', 'Formal run IDs start n5-') do not help an agent invoke this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description does note the default strategy response omits audit fields. For a 6-parameter, nested-object, revision-controlled write, though, key parameter meanings (note_id, kind, view) and the exact create path (expected_revision=0) are left unclear.
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 carry all parameter meaning. It partially does: content's sub-fields (sources, facts, interpretation, conditions, counterexamples, confidence, revision_reason), expected_revision ('updates require current expected_revision'), and write_id (receipt dedup) are addressed. But note_id, kind, and view are never explained, leaving the compensation incomplete.
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 conveys a specific verb and scope (atomic replace of a note's local current content under revision control) rather than a tautology. However, it never clearly names the resource as a 'note' matching write_note, and it buries the core purpose under tangents about Chinese guides, migrations, and run-ID conventions. An agent must read several sentences to extract the essential action.
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 conditional guidance: '0 creates; updates require current expected_revision', 'Before amending, explicitly read content/full', and 'Legacy local data requires the maintenance migration'. These imply when the tool applies, but no sibling alternative is named (e.g., read_notes) and the create-vs-update branch is stated obliquely rather than as an explicit rule.
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.
12 tool updates
v1.4.0- First observed
act - First observed
action_status - First observed
calculate - First observed
close_game - First observed
health - First observed
launch_game - First observed
observe - First observed
read_notes - First observed
recover_lost_session - First observed
run_plan - First observed
wait_until_ready - First observed
write_note
TDQS
Scored across 12 tools
Tools cover distinct phases (session lifecycle, observation, action, notes, planning, math) and most purposes are clear. However, observe, action_status, and wait_until_ready all return status-like information, and recover_lost_session overlaps with action_status in record handling, creating minor confusion.
All names use snake_case, but the set mixes single verbs (observe, act, calculate), noun phrases (health, action_status, run_plan), and verb_noun patterns (recover_lost_session, read_notes). This inconsistent structural convention is readable but not predictable.
12 tools fit a complex game-agent domain that spans process control, game interaction, durable notes, run planning, and calculation. Each tool appears to earn its place without excessive redundancy.
The surface covers session lifecycle, observation, action submission, health, notes, run planning, and math. Gaps include no explicit profile-switching or action-listing tool, but these are minor workarounds within the described workflows.
Maintenance
Related MCP Connectors
Supported Balatro scoring and exact small-deck play/discard analysis with verified explanations.
- bluffnetOAuthgg.bluffnet
Live Texas Hold'em for AI agents. The tools teach the rules; the bluffing is up to your model.
Heads-up poker for AI agents: play live matches against other agents while your owner coaches.
Persistent memory, hybrid search and a goal graph for AI agents, over stdio or remote HTTP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceBridges AI assistants to running game instances for testing, debugging, and verification. Works with any game engine via a simple TCP protocol.5 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to play local Windows games through low-level keyboard/mouse input, screen capture, OCR, and per-game profiles for semantic actions.-
- AlicenseAqualityCmaintenanceAllows Codex desktop to control the Steam game Balatro via local STDIO MCP tools, exposing only constrained normal game actions without debugging or cheat capabilities.18MIT
- AlicenseAqualityBmaintenanceEnables Claude Desktop and Claude Code to access Steam Web API data locally over stdio, including player profiles, owned games, achievements, friend activity, and game news.1532 npmMIT