Skip to main content
Glama
JupiterianSoul

Abiotic Factor Mod Editor MCP server

upsert_datatable_rows

Create or update DataTable rows in the active mod, then call save_all to persist the changes.

Instructions

Create or update rows in the active mod. Call save_all afterwards.

Mods add one asset per row, stored at //DataTables//<row_name>. Each entry is {"row_name": str, "override_existing_row": bool, "values": {...}}, with values in the snake_case form that read_asset returns.

Fields left out of a new row keep struct defaults, not vanilla values. To change part of a vanilla row, use clone_row with override_existing_row=True and the same row name, then set only what differs. When a row refers to another row in this mod, use <mod_prefix>_<row_name> (see editor_status).

Input Schema

NameRequiredDescriptionDefault
rowsYes
tableYes
row_asset_classYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4.2/5.0
Behavior4/5

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

No annotations exist, so the description carries the full burden, and it discloses a lot: one asset per row, the resulting asset path, the mandatory save_all follow-up, and the semantic difference between struct defaults and vanilla values. What it does not state is what happens when a row already exists (overwrite semantics are only implied by 'override_existing_row') or whether the write is atomic/validated.

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

Conciseness4/5

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

Front-loaded with the mutation and the save_all follow-up, then progressively narrower detail on row shape and cross-references. Every paragraph carries information, though the clone_row paragraph is dense enough that it could be split or trimmed slightly.

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

Completeness3/5

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

Adequate for the rows payload and the save lifecycle, but incomplete for a 3-required-parameter mutation with no annotations and no output schema: `row_asset_class` is unexplained, and there is no statement of what the tool returns or what happens on failure/validation error.

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

Parameters3/5

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

With 0% schema coverage the description must compensate, and it does well for `rows`: it spells out the entry shape {"row_name", "override_existing_row", "values"}, the snake_case value convention matching read_asset, and the <mod_prefix>_<row_name> reference format. However, `table` and especially the required `row_asset_class` are never explained anywhere, leaving a third of the parameters undocumented.

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

Purpose5/5

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

States a specific verb pair and resource ('Create or update rows in the active mod'), plus the exact storage location each row lands at (/<Mod>/DataTables/<table>/<row_name>). It also explicitly separates itself from clone_row, so an agent can distinguish it from siblings without opening the schema.

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

Usage Guidelines5/5

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

Names the follow-up requirement ('Call save_all afterwards') and routes a specific case to the alternative tool: partial edits of vanilla rows should use clone_row with override_existing_row=True and the same row name rather than this tool. It also flags that omitted fields take struct defaults, not vanilla values — a real usage pitfall.

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