Skip to main content
Glama
baktubak
by baktubak

armorpaint-mcp

Drive ArmorPaint 1.0 from an MCP client.

An MCP server (Python) plus a small in-app bridge (an ArmorPaint plugin, written in the app's embedded C dialect) let an agent open projects, inspect and edit materials and node graphs, paint, and export textures — against a stock, unmodified ArmorPaint, including the official paid binary.

Not affiliated with, sponsored by, or endorsed by Armory3D or the ArmorPaint project. This is an independent third-party tool. Please do not file ArmorPaint bugs for it, and do not file its bugs upstream.

Status: works, lightly travelled. All 58 tools are implemented and were exercised against a live ArmorPaint 1.0: a 66-call sweep covering 42 tools returned 60 OK, 6 structured errors (all deliberate bad-input probes), 0 crashes or timeouts, at 15–513 ms per call. That includes the destructive surface — project_new, project_open, project_save_as, material_delete, export_* and the paint ops — run against a scratch project.

What that does not cover: Windows is the only platform tested. The Linux and macOS paths are written but unexercised. Long painting sessions, huge meshes and 4K exports are untested, and the optional viewport patch has only been built against the pinned commit named in docs/UPSTREAM_CHANGES.md. Expect rough edges outside the tested path, and please report them.


Architecture

One diagram, and it explains most of the design:

   ┌───────────────┐    MCP over stdio (JSON-RPC)    ┌──────────────────────┐
   │  MCP client   │ ──────────────────────────────► │   armorpaint-mcp     │
   │ (Claude Code, │ ◄────────────────────────────── │   server (Python)    │
   │  Claude, …)   │                                 └──────────┬───────────┘
   └───────────────┘                                            │
                                     write  req/<id>.json  (via os.replace — atomic)
                                     poll   res/<id>.done  (5 ms → 25 ms → 100 ms)
                                                                │
                                                     ┌──────────▼────────────┐
                                                     │     file mailbox      │
                                                     │  <spool>/req/  res/   │
                                                     │  heartbeat.json       │
                                                     │  bridge.lock          │
                                                     └──────────┬────────────┘
                                                                │
                                     read request, delete it, run it, write
                                     res/<id>.json then res/<id>.done
                                     — at most ONE per frame, inside on_update
                                                                │
 ┌──────────────────────────────────────────────────────────────▼───────────────────────┐
 │ ArmorPaint 1.0  (stock binary — nothing patched, nothing replaced)                   │
 │                                                                                      │
 │   data/plugins/armorpaint_mcp_bridge.c   the bridge: one minic plugin, one dispatcher           │
 │          │ calls                                                                     │
 │          ▼                                                                           │
 │   529 minic bindings ─► project · assets · objects · materials · nodes ·             │
 │                         brush & paint · viewport · export · filesystem               │
 └──────────────────────────────────────────────────────────────────────────────────────┘

Two things about this shape are worth knowing up front, because they are consequences of what ArmorPaint's plugin API actually offers, not preferences:

  • The transport is files, not a socket. ArmorPaint's plugin API exposes no inbound socket binding at all; its only network calls are hardcoded HTTPS GETs. A localhost listener is unreachable from inside a plugin. File I/O is unrestricted.

  • The bridge is a plugin, not a fork. It runs on the binary you already bought, survives app updates, and needs no compiler.

Both are argued in full, with the source citations, in docs/ARCHITECTURE.md. The byte-level contract is docs/PROTOCOL.md.

Related MCP server: Krita Illustration MCP

Requirements

ArmorPaint

1.0 (the current C/minic generation). The plugin system in the pre-2025 Haxe/Kha builds is a different thing entirely and is not supported.

OS

Windows 10/11 verified. Linux/macOS should work — the protocol is plain files — but are untested.

Python

3.11+

MCP client

Anything that can launch a stdio MCP server (Claude Code, Claude Desktop, …)

Compiler

None. Not for the core toolkit. Only the optional viewport patch needs a self-built ArmorPaint.

Install

Short version; the careful one is docs/INSTALL.md.

  1. Copy the bridge into ArmorPaint. Put plugin/armorpaint_mcp_bridge.c in <ArmorPaint>/data/plugins/. (That directory is beside ArmorPaint.exe, and it already contains autosave.c, converter.c and friends — that is how you know you found it.)

  2. Enable it. In ArmorPaint: Plugins tab → Preferences button → the Plugins list → tick armorpaint_mcp_bridge (the list shows the filename without its extension). It starts immediately; no restart. The choice is remembered, and the plugin auto-starts on subsequent launches.

  3. Install the server. pip install -e . in this repo (or point uv at the directory).

  4. Register it with your client. In .mcp.json:

    {
      "mcpServers": {
        "armorpaint": {
          "command": "python",
          "args": ["-m", "armorpaint_mcp"]
        }
      }
    }

    Usually that is all: the server finds the spool by locating your ArmorPaint install (it only accepts a candidate directory that really contains data\plugins). If your install is somewhere unusual — the itch.io app, for instance — add "env": {"ARMORPAINT_DIR": "C:\\ArmorPaint"}.

  5. Check the handshake. Ask the agent to call ap_ping. A healthy answer names the app version and the open project. If it reports the bridge as absent, see Troubleshooting.

Quickstart

With the bridge enabled and a mesh already imported, a prompt like this exercises the whole path — read state, mutate the node graph, write files to disk:

Using ArmorPaint: open D:/work/goblin.arm, tell me which material is active and which paint channels it has enabled. Then add a Noise node, wire its output into the base-color input of the output node, set its scale to 4.0, fill the layer with it, and export the textures to D:/work/out. List what landed there.

That is ap_project_openap_material_get_activeap_node_addap_node_connectap_node_set_valueap_material_updateap_fill_layerap_export_texturesap_fs_list. Each step is one request, one frame.

Do not drop the ap_fill_layer. Without it every call still returns success and the model, the viewport and the export are all unchanged — the graph is the paint source, not the render. See The loop that actually works.

Because the bridge answers at most one request per frame, a chain like this completes in well under a second — but a bake or a large export takes as long as ArmorPaint takes.

Tool index

58 tools. Each is backed by a named minic binding or a registered struct field; the implementation of each is tabulated in docs/MINIC_DIALECT_AND_API.md §2.13, and what was deliberately left out, with the reason, is §2.14 — read that before assuming a missing capability is an oversight.

Bridge & session (6)

Tool

Does

ap_bridge_status

Call this first when anything fails. Diagnoses the connection with no round trip: resolved spool path, heartbeat presence and whether its clock is advancing, plus a plain-language diagnosis and next step

ap_ping

Liveness: app version, uptime, open project, busy flag

ap_get_app_info

Window geometry, data path, project format version

ap_bridge_set_enabled

Turn the bridge off (and let the app idle again) or back on

ap_console_write

Write to ArmorPaint's console at info/error/log level

ap_show_message

Transient status message, or a modal box

Project (8)

Tool

Does

ap_project_new

New project

ap_project_open

Open an .arm (existence-checked first)

ap_project_save

Save in place; errors with no_project if never saved. Deferred — see below

ap_project_save_as

Set the filepath, then save. Deferred — ArmorPaint queues the write for the next frame (sys_notify_on_next_frame), so a success reply means queued, not written. Confirm with ap_fs_stat if it matters

ap_project_get_info

Filepath, basepath, version, envmap, camera FOV, BGRA flag

ap_project_list_texture_assets

Imported texture assets — live

ap_project_list_scripts

Project scripts (a save/load snapshot; labelled as such)

ap_quit

Quit ArmorPaint

Import / export (7)

Tool

Does

ap_import_asset

Import a texture, mesh or .arm by path

ap_import_envmap

Import an environment map

ap_set_envmap_params

Envmap strength and angle

ap_export_textures

Export the texture set to a directory, and report the filenames. 8-bit PNG; the format is not settable, and the base name comes from ArmorPaint's own state (the last export dialog, else untitled) — so read the returned filenames rather than predicting them

ap_export_material_bake

Bake the material to a plane and export it

ap_export_mesh

Export the mesh as .obj

ap_export_material

Export the material as .arm

Filesystem (4) — ap_fs_list, ap_fs_stat, ap_fs_mkdir run inside ArmorPaint; ap_read_image_file is answered by the server itself and hands back an image, so you can look at what an export produced (and it still works while ArmorPaint is closed). Enough for an agent to find its inputs and confirm its outputs, without a second tool server.

Introspection (5)

Tool

Does

ap_get_context

The workhorse read: tool, brush, layer, material, viewport mode, … (15 fields)

ap_get_config

The 16 readable config fields

ap_set_config

Write those same 16 (layer_res, camera_fov, workspace, workflow, …)

ap_get_main_object

The active paint object: name, visibility, transform

ap_get_object

Any object by name

Objects & meshes (6) — ap_shape_list, ap_shape_add, ap_object_duplicate, ap_object_set_transform, ap_object_set_visible, ap_append_mesh.

Materials (8)

Tool

Does

ap_material_get_active

Active material name and its 9 paint-channel flags

ap_material_update

Recompile the material after node edits. This does not change the viewport — see "The loop that actually works" below

ap_material_create

Create a material

ap_material_select

Make a material active, by name

ap_material_delete

Delete a material, by name

ap_material_assign

Assign a material to an object

ap_material_set_channels

Toggle the per-material paint channels

ap_material_list

Degraded. Reads a save/load snapshot: empty before the first save, and blind to materials created this session. Use ap_material_get_active for ground truth.

Material nodes (6) — ap_node_list (nodes and link topology), ap_node_add, ap_node_remove, ap_node_connect, ap_node_disconnect, ap_node_set_value (float / color / vector / button).

Node types are Blender-style uppercase identifiers — TEX_NOISE, TEX_BRICK, RGB, MIX_RGB — and ap_node_add validates against the 76 legal names rather than passing an unknown string into the app. The list is in docs/MINIC_DIALECT_AND_API.md §2.6.

Painting & viewport (7)

Tool

Does

ap_select_tool

Select one of the 14 tools, and read back what took

ap_set_brush

Radius, opacity, hardness, scale, angle, blending

ap_paint_stroke

A stroke in screen space, as a point list

ap_paint_stroke_world

A stroke in world space

ap_fill_layer

Fill the active layer

ap_set_display_channel

Switch the viewport display channel (one of 16)

ap_capture_to_project

Capture the viewport into the project as a texture asset — see Limitations; this does not produce a file you can read

Optional, patched builds only (1) — ap_capture_viewport writes the 3D viewport to a real PNG and returns it as an image, which is what closes the see → adjust → see loop. It requires the opt-in native patch in patch/ and therefore a self-built ArmorPaint; see docs/UPSTREAM_CHANGES.md. On a stock binary the tool reports unsupported and says why. Measured on a patched 1.0 build: 11–15 ms in-app, ~140 ms round trip for an 800×600 PNG.

The loop that actually works

This one is worth stating plainly, because every step reports success and the obvious ordering still shows you nothing:

ap_node_add / ap_node_set_value / ap_node_connect   edit the graph
ap_material_update                                  recompile it
ap_fill_layer   (or ap_paint_stroke / _world)       APPLY it   <-- the step people miss
ap_capture_viewport                                 look at it

ap_material_update does not render. ArmorPaint's viewport shows the layer stack; the node graph is only the paint source. Measured: viewport captures taken before and after a colour change plus ap_material_update are byte-identical — the pixels change only once you fill or paint. There is no scriptable layer CRUD (see Limitations), so ap_fill_layer applies to whichever layer the user has selected.

Limitations

These are properties of ArmorPaint's plugin API, verified by reading its source. They are not temporary gaps, and no amount of work on this repo removes them.

  • No 3D viewport capture on a stock binary. A plugin can capture the viewport to a GPU texture, but the only save path (viewport_save_texture) encodes it into the project's in-memory asset list — persisted inside the .arm, unreachable from another process. iron_encode_png and gpu_get_texture_pixels are not exposed to plugins. What an agent can actually see is its work product: ap_export_textures writes real PNGs, which the server reads and returns as images. For the shaded viewport itself, the optional patch (12 added lines, one new binding) closes the gap on a self-built ArmorPaint.

  • ArmorPaint renders at full rate while the bridge is enabled. The app normally sleeps after ~120 idle frames, and a sleeping app does not dispatch plugin callbacks — so a polling bridge must keep it awake, and pays for it in GPU and power. ap_bridge_set_enabled (and a toggle in the Plugins tab) turns it off when no agent is working. This is a real cost, not a rounding error.

  • One request per frame. minic has no threads, so every handler runs inline on the render thread. Batching a backlog into one frame is not just slow, it risks the interpreter's 8 MB per-frame arena. Throughput is therefore bounded by frame rate; a hundred-op plan is a hundred frames.

  • A slow handler is a visible hitch in the user's painting, for the same reason. Long operations (bake, large export) return immediately with a pending token and are polled.

  • No layer control. Not a single layer binding exists beyond "fill the active layer" — no add, delete, reorder, rename, opacity, blend mode, or mask. Layer state is not readable either.

  • No undo/redo, no bake-parameter control, no export format/bit-depth control, no tone mapping or LUT, no shelf/resource search, no project metadata, no UI automation. Each of these is a missing binding, itemised with its evidence in docs/MINIC_DIALECT_AND_API.md §2.14.

  • Windows is the tested platform. The protocol is plain files and should port, but nothing else has been measured.

Troubleshooting

The agent says the bridge is not detected. Check, in order: (1) armorpaint_mcp_bridge.c is in <ArmorPaint>/data/plugins/ — the directory beside the executable, not the config directory; (2) its checkbox is ticked in Preferences → Plugins; (3) bridge.lock and heartbeat.json exist in the spool directory; (4) the server and the plugin agree on where the spool is.

That last one is the common case and the confusing one, because both halves are individually healthy. The server reports the spool path it resolved and how it decided, in every transport error — read that path and compare it to where the plugin is actually writing. If the server fell back to its per-user default (%LOCALAPPDATA%\armorpaint-mcp\spool) it means it could not find an ArmorPaint install at all; set ARMORPAINT_DIR.

If heartbeat.json exists but its t value is not advancing between two reads, the plugin loaded but is not being ticked — the app is idle, or the bridge is disabled.

Does the ArmorPaint window have to be in the foreground? No. ArmorPaint has two sleep gates — a Windows-background gate (3 frames) and an idle gate (120 frames) — and it turns out both increment the same counter, which the bridge resets on every frame. Neither ever trips. This was traced in iron.h rather than assumed; the trace is in docs/MINIC_DIALECT_AND_API.md §0.3. The tolerance is narrow (at most 3 consecutive missed frames), so if you modify the plugin, keep iron_delay_idle_sleep() as the first statement of on_update. A minimized window has not been separately measured.

The plugin is not listed in Preferences → Plugins. The list shows only files ending in .c, read directly from <ArmorPaint>/data/plugins. A .txt extension added by a browser download, or the file sitting one directory too high, both produce an empty row. The list is also cached until the panel is reopened, so close and reopen Preferences after copying the file. Alternatively use the Import button in that same panel, which copies a .c or .zip into the right place for you.

It is listed, ticks on, and nothing happens. Look at ArmorPaint's Console. minic reports compile and run errors as armorpaint_mcp_bridge.c:<line>: error: <message> and does not pop a dialog — a plugin with a syntax error fails quietly. Note also that some minic failures are entirely silent by design (the catalogue is §1.12), which is why the bridge logs a version banner on load: no banner in the console means the script did not reach the end of main.

ArmorPaint is installed under C:\Program Files. Then data\plugins\ needs elevation to write, and ArmorPaint itself redirects its config.json to %USERPROFILE%\Saved Games\ArmorPaint\ — while still loading plugins from the install directory. Use the in-app Import button rather than copying by hand, and point the spool somewhere writable with ARMORPAINT_SPOOL. Installing ArmorPaint outside Program Files avoids the whole class of problem. Details in docs/INSTALL.md.

Documentation

File

Contents

docs/INSTALL.md

Step-by-step Windows install

docs/ARCHITECTURE.md

Why a file mailbox, why a plugin, and the constraints that forced both

docs/PROTOCOL.md

The wire contract — either half can be reimplemented against it

docs/MINIC_DIALECT_AND_API.md

The minic dialect and the whole plugin API, read out of the source. If you are writing a plugin, this is the document.

docs/API_REFERENCE.md

The generated binding list

docs/UPSTREAM_CHANGES.md

The optional viewport patch, exactly

Everything in docs/ was derived by reading ArmorPaint 1.0 at commit 906418acc600132fa927876d208eb452dc5a0967. Public web documentation for ArmorPaint's scripting describes the pre-2025 Haxe/Kha version and is wrong for this generation — a trap worth naming.

Credits and licensing

armorpaint-mcp is MIT licensed — see LICENSE.

ArmorPaint is by the Armory3D project and is licensed zlib/libpng: https://armorpaint.org · https://github.com/armory3d/armorpaint · manual

This repository contains no ArmorPaint source and is not a fork. The optional patch in patch/ edits your own checkout in place, marks every line it inserts, and is reversible.

ArmorPaint's development is funded by sales of its binaries. They are paid — from https://armorpaint.org/download and the itch.io store at https://armorpaint.itch.io/armorpaint. Building from source is explicitly supported by upstream and is free, but if this tool is useful to you, the project it drives is worth paying for.

Available Tools

58 tools
ap_append_meshA

Append geometry to the current project, either from a mesh file on disk or from inline Wavefront OBJ text. Give exactly one of 'path' or 'obj_data'. Pass inline OBJ with ordinary newlines — they are re-encoded for the wire and restored inside ArmorPaint — but it must contain no double quotes, backslashes or '|' (the bridge's JSON parser does not decode escapes and '|' is the line separator), and the whole request is capped at 8 KB. Prefer 'path' for anything non-trivial.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoMesh file to append. Absolute path, forward slashes (backslashes are converted for you).
obj_dataNoWavefront OBJ text to append inline.

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does it well: it discloses wire re-encoding, newline restoration, forbidden characters, the 8 KB cap, and path slash conversion. It stops short of discussing reversibility or failure modes, but the append operation is reasonably clear.

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

Conciseness5/5

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

The description is compact, front-loaded with purpose, then uses the remaining sentences for constraints and guidance. Every clause earns its place, and the wire-format constraints are grouped logically.

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

Completeness5/5

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

For a two-parameter additive tool with no required parameters and no output schema, this description is effectively complete. The agent knows what to provide, how to provide it, which option to prefer, and the hard constraints that could cause failures.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds substantial meaning beyond the schema: mutual exclusivity of 'path' and 'obj_data', the preference rule, inline OBJ character restrictions, the 8 KB limit, and newline handling. This is far beyond the baseline.

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

Purpose5/5

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

The description opens with a precise verb and resource: 'Append geometry to the current project', then specifies the two allowed input sources. This makes the tool distinct from export/import siblings and clearly communicates what it does.

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

Usage Guidelines4/5

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

The description gives strong within-tool guidance: exactly one of 'path' or 'obj_data' must be supplied, and 'path' should be preferred for anything non-trivial. It does not explicitly contrast this tool with ap_import_asset, but the usage 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.

ap_bridge_set_enabledA

Turn the bridge's per-frame polling on or off. This has a real cost: while enabled the plugin calls iron_delay_idle_sleep() every frame, which keeps ArmorPaint rendering at full rate even when unfocused (that is also what makes remote control of a background window possible). Disable it when no agent is working. WARNING: disabling it stops the bridge from reading requests, so this is the last tool that will work until someone re-enables it from the Plugins tab.

ParametersJSON Schema
NameRequiredDescriptionDefault
enabledYesTrue to poll every frame; false to let the app idle.

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does so thoroughly: it reveals the real performance cost, names the underlying call (iron_delay_idle_sleep()), explains the effect on rendering/focus behavior, and warns that disabling interrupts request processing. This is exemplary transparency for a state-changing tool.

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

Conciseness5/5

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

The description is concise but information-dense. The core action is front-loaded, followed by the cost, the recommended usage, and a critical warning. Every sentence earns its place and none is redundant with the schema.

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

Completeness5/5

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

For a one-parameter toggling tool with no output schema, the description is complete. It covers what the tool does, when to use it, what the side effects are, and what to be careful about. An agent can safely and correctly invoke it based on this description alone.

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

Parameters4/5

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

The input schema already fully describes the single boolean parameter, so the baseline is 3. The description adds meaningful semantics beyond the schema by tying the parameter to practical consequences: enabled means full-rate polling, disabled means idling and losing request reading. This lifts it above baseline.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Turn the bridge's per-frame polling on or off.' It clearly identifies what state is being changed and is distinct from the sibling tools, which mostly deal with painting, project management, or object operations.

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?

The description explicitly says when to disable the bridge ('Disable it when no agent is working'), explains why it is normally enabled (remote control of a background window), and includes a strong warning that disabling stops request reading, making this the last tool that will work until manual re-enable. This gives clear operational guidance beyond merely stating what the tool does.

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

ap_bridge_statusA

Diagnose the connection to ArmorPaint. Answered entirely by this server, with no round trip, so it works when everything else is failing: it reports the resolved spool directory and how it was resolved, whether the bridge heartbeat exists, whether the heartbeat's clock is advancing (the only valid liveness test), the bridge/app versions, the open project, queue depth, and a plain-language diagnosis plus next step. Call this FIRST whenever any other tool reports a transport error.

ParametersJSON Schema
NameRequiredDescriptionDefault
probeNoWatch the heartbeat for up to ~4 s to prove the bridge is actually running rather than merely present. Set false for an instant answer.

TDQS

A4.7/5.0
Behavior5/5

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

There are no annotations, so the description carries the full burden of behavioral disclosure. It fully discloses that no round trip is made, what data is reported (spool directory resolution, heartbeat existence, clock progression, versions, project, queue depth), and that it produces a plain-language diagnosis plus next step. This is exemplary transparency.

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

Conciseness5/5

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

The description is information-dense but tightly structured: an opening purpose, a complete list of reported diagnostics, and a direct invocation instruction. Every clause adds useful guidance and the most important usage instruction is placed at the end for emphasis.

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

Completeness5/5

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

For a diagnostic tool with no annotations and no output schema, the description is unusually complete. It covers what the tool does, what it returns, why it is reliable during transport failures, what counts as the only valid liveness test, and exactly when to call it first.

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?

The single parameter is fully described in the input schema, including its default value and behavioral effect, and schema description coverage is 100%. The tool description itself does not add param-level meaning, but per the baseline rule, high coverage makes 3 appropriate.

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

Purpose5/5

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

The description opens with a specific action ('Diagnose the connection to ArmorPaint') and then enumerates the exact diagnostic outputs. It distinguishes itself from likely siblings like ap_ping by stating that the advancing heartbeat clock is 'the only valid liveness test' and by clarifying that this tool is answered server-side without a round trip.

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?

The final sentence gives an explicit, unambiguous usage rule: 'Call this FIRST whenever any other tool reports a transport error.' It also explains why this is the right choice by noting it works even when the bridge is otherwise failing, giving the agent a clear decision rule.

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

ap_capture_to_projectA

Capture the 3D viewport into the project as a packed texture asset. Works on a stock ArmorPaint, but the pixels land INSIDE the project (persisted only when the .arm is saved) — nothing outside ArmorPaint can read them, so you cannot look at the result. To actually see the viewport, use ap_capture_viewport (needs the optional viewport patch). NOTE: the bridge handler runs inline in one frame and cannot wait for a re-render, so the capture is of the frame ALREADY drawn and may include the UI overlay; ArmorPaint's own two-frame settle is not reproducible from a plugin.

ParametersJSON Schema
NameRequiredDescriptionDefault
widthNoCapture width in pixels.
heightNoCapture height in pixels.

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so thoroughly: it discloses that the result is persisted only on .arm save, cannot be read outside ArmorPaint, is captured from the already-drawn frame, may include the UI overlay, and cannot reproduce ArmorPaint's two-frame settle.

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

Conciseness4/5

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

The description is relatively long but every clause carries essential caveats (persistence, visibility, one-frame timing, UI overlay, patch requirement). It is front-loaded with purpose before the caveats, though it could be tightened slightly without losing meaning.

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

Completeness5/5

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

For a tool with no annotations and no output schema, the description covers the core use case, the alternative tool, the persistence model, the platform requirement, and the rendering timing limitations. An agent has everything needed to decide and invoke correctly.

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

Parameters3/5

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

Schema coverage is 100%: both width and height have clear 'Capture width/height in pixels' descriptions and defaults. The tool description adds no parameter-specific behavior, so the baseline of 3 applies.

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

Purpose5/5

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

The description opens with a specific verb-resource-target statement: 'Capture the 3D viewport into the project as a packed texture asset.' It clearly differentiates from the sibling ap_capture_viewport by positioning that tool for actually viewing the result.

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?

It gives an explicit conditional: use this on stock ArmorPaint when pixels should land inside the project, and use ap_capture_viewport when the goal is to actually see the viewport, noting the optional viewport patch requirement. No inference is required.

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

ap_capture_viewportA

Capture the shaded 3D viewport to a PNG file and return the image so you can look at your own work. REQUIRES the optional viewport patch (docs/UPSTREAM_CHANGES.md) which adds the viewport_save_texture_to_file binding — on a stock build this returns code 'unsupported', and the fallbacks are ap_capture_to_project (in-project only) or ap_export_textures (writes real files, but flat textures rather than the shaded view).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesDestination .png file. Absolute path, forward slashes (backslashes are converted for you).
widthNoCapture width in pixels.
heightNoCapture height in pixels.
include_imageNoReturn the PNG inline as an image. Set false to get just the path and keep the response small.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the transparency burden, and it does well: it discloses the dependency on the viewport patch, the unsupported-code failure mode, and the fallback behavior. It stops short of specifying other side effects such as overwrite semantics or exact response shape on success, which keeps it from a 5.

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

Conciseness5/5

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

The description is front-loaded with the primary purpose and then adds a single, dense caveat paragraph covering compatibility and fallbacks. Every sentence contributes information an agent needs; there's no fluff or repetition.

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

Completeness4/5

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

Given there is no output schema, the description usefully explains that success returns an image and that include_image=false returns just the path, and it covers the unsupported-build case. It does not describe the broader response envelope, but for a capture-and-return-image tool this is reasonably complete.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all four parameters including defaults and the include_image behavior. The description adds no additional parameter-level meaning beyond confirming the output is a PNG image, which matches the baseline for full schema coverage.

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

Purpose5/5

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

The description names a specific operation ('Capture the shaded 3D viewport to a PNG file') and clarifies the return value ('return the image so you can look at your own work'). It also differentiates the tool from nearby siblings by naming the fallbacks and their limitations.

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?

The description explicitly states the prerequisite (optional viewport patch) and what happens on a stock build ('unsupported'), then names the two fallback alternatives with the precise conditions for each (in-project only vs real flat files). This gives an agent clear routing guidance.

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

ap_console_writeA

Write a line to ArmorPaint's own console. Write-only: no binding can read the console back, so this is for leaving a trail for the human, not for logging you intend to read.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesMessage text.
levelNoConsole channel.log

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It clearly discloses that writes cannot be read back and are intended only for human visibility. It does not detail the exact visible output or whether the call returns a status, but for a simple write-only console tool, this is sufficient context.

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

Conciseness5/5

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

Two concise sentences with no filler. The core action is front-loaded, followed immediately by the critical write-only caveat. Every sentence earns its place.

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

Completeness5/5

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

This is a simple two-parameter tool with no output schema. The description fully covers purpose, behavioral constraints, and appropriate usage context. An agent has enough information to call it correctly without additional explanation.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents both 'text' and 'level' including the enum values and default. The description adds minimal parameter-specific meaning beyond the schema, mainly framing text as a 'line.' The baseline 3 is appropriate because the description does not need to compensate for missing schema information.

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

Purpose5/5

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

The description states a specific action and resource: 'Write a line to ArmorPaint's own console.' It also clarifies the write-only nature, which distinguishes it from any potential read/console-logging tool. This is far more informative than a generic 'Write to console'.

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

Usage Guidelines4/5

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

It explicitly says when to use it: 'for leaving a trail for the human.' It also states when not to use it: 'not for logging you intend to read.' It does not name alternative sibling tools like ap_show_message, but the when/when-not guidance is strong enough for an agent to select it appropriately.

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

ap_export_materialB

Export the active material as a reusable .arm material file.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesDestination .arm path. Absolute path, forward slashes (backslashes are converted for you).

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It does disclose the general side effect (writes a .arm file) and the scope (active material), which is useful. However, it does not mention whether existing files are overwritten, whether directories must exist, or what happens if no material is active.

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

Conciseness5/5

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

The description is a single front-loaded sentence that names the action, the target, and the output format without any filler or repetition. It is appropriately sized for the tool's low parameter complexity.

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?

The tool is simple, with one well-documented parameter and no output schema, so the core invocation is clear. However, the absence of sibling differentiation and behavioral details like overwrite behavior leaves an agent with gaps when deciding between this and related material-export tools.

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?

The schema covers the single 'path' parameter fully with clear destination, format, absolute path, and slash-conversion details. The description adds little beyond the schema, but since schema coverage is 100%, the baseline of 3 is appropriate.

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

Purpose4/5

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

The description names a specific verb ('Export'), a specific resource ('the active material'), and a concrete output ('a reusable .arm material file'). It is clear and unambiguous, but it does not explicitly contrast with siblings like ap_export_material_bake or ap_export_textures, so it stops short of 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.

Usage Guidelines2/5

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

No guidance is given about when to choose this tool over ap_export_material_bake, ap_export_textures, or ap_material_save-related alternatives. The phrase 'active material' implies the precondition that a material is active, but no explicit when-to-use or when-not-to-use reasoning is provided.

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

ap_export_material_bakeA

Bake the ACTIVE MATERIAL onto a plane and export the result as images (export_texture_run with bake_material=1). This is not mesh map baking — there is no bake-run binding for normal/AO/curvature maps.

ParametersJSON Schema
NameRequiredDescriptionDefault
directoryYesOutput directory. Absolute path, forward slashes (backslashes are converted for you).

TDQS

A3.7/5.0
Behavior2/5

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

There are no annotations, so the description carries full responsibility for behavioral disclosure. It mentions exporting images but does not explain side effects such as whether files are written, overwritten, or whether the scene/material is modified. This is a meaningful gap.

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

Conciseness5/5

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

The description is concise: two sentences that directly state the purpose and an important exclusion. There is no unnecessary verbosity.

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?

The description explains what the tool does but omits output details such as return values, file naming, or image formats. Given the lack of an output schema, this leaves some ambiguity about what the caller should expect after invocation.

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

Parameters4/5

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

The single parameter 'directory' is described in the schema, and the description adds useful detail about absolute paths and forward slashes, including that backslashes are converted. This is sufficient for the parameter.

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

Purpose5/5

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

The description clearly states the action: bake the active material onto a plane and export the result as images. It also explicitly differentiates this from mesh map baking, which helps distinguish it from similar export or baking tools.

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

Usage Guidelines3/5

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

The description gives a clear purpose and a negative usage note ('not mesh map baking'), but it does not explicitly state when to use this tool versus alternatives like ap_export_textures or ap_export_material. Some inference is required.

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

ap_export_meshA

Export the paint geometry as Wavefront OBJ. The binding appends '.obj' to the path you give, so pass a path WITHOUT the extension.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesDestination path without extension. Absolute path, forward slashes (backslashes are converted for you).

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral disclosure burden. It genuinely adds value by revealing that '.obj' is automatically appended and that the caller must pass a path without the extension. It does not address overwrite or return behavior, but the most important call-affecting trait is exposed.

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

Conciseness5/5

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

Two sentences, front-loaded with the purpose, followed immediately by the single critical usage warning. There is no filler or redundant information.

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

Completeness4/5

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

For a one-parameter export tool with no output schema and no annotations, the description covers the output format and the most important input constraint. Minor details like overwrite behavior or return status are absent, but they are not needed to make a correct call.

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?

The schema already documents the path semantics well: destination path without extension, absolute path, forward slashes, and automatic backslash conversion. The description adds little beyond restating the extension caveat, so a baseline score is appropriate given 100% schema coverage.

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

Purpose5/5

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

The description states a specific verb ('Export'), a specific resource ('paint geometry'), and a specific output format ('Wavefront OBJ'). This clearly distinguishes it from sibling export tools like ap_export_textures and ap_export_material.

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

Usage Guidelines3/5

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

The resource and format make the intended use reasonably clear, but the description does not explicitly say when to use this tool instead of other export-related siblings, nor does it offer exclusions or alternative routes.

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

ap_export_texturesA

Export the project's texture channels to real image files on disk — the only binding in ArmorPaint's plugin API that writes images to disk. Returns the files found in the target directory afterwards; feed one to ap_read_image_file to look at it. IMPORTANT LIMITS, none of which are settable from a plugin: 'directory' is a DIRECTORY, not a filename; the base filename comes from the last name used in ArmorPaint's own export dialog, falling back to 'untitled'; the channel suffixes come from the active export preset ('generic' is auto-selected on first use); and the format/bit depth is whatever the UI is set to (8-bit PNG by default).

ParametersJSON Schema
NameRequiredDescriptionDefault
directoryYesOutput directory. Absolute path, forward slashes (backslashes are converted for you).

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden of behavioral disclosure, and it delivers: it flags the disk side effect, the return value, and three non-obvious external-state dependencies — the last export-dialog name (falling back to 'untitled'), the active export preset for channel suffixes, and the UI-determined format/bit depth (8-bit PNG by default). The 'IMPORTANT LIMITS' block makes explicit that none of these are settable from a plugin, preempting agent misconceptions about controlling output files.

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

Conciseness5/5

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

Three sentences in a clear order: purpose, return value plus usage chain, then the caveats grouped under the 'IMPORTANT LIMITS' label. No filler; the dense final sentence is justified because each listed limit is a genuine gotcha. The structure front-loads the most decision-relevant fact (what the tool writes).

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

Completeness4/5

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

For a one-parameter tool with no annotations and no output schema, the description is remarkably complete: purpose, side effects, return value, output consumption, and all external-state dependencies are covered. The remaining gaps are minor — 'Returns the files found in the target directory afterwards' is ambiguous about whether pre-existing files are included, and directory-existence/overwrite behavior is unspecified. A genuinely helpful description with two small holes, hence a 4.

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

Parameters4/5

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

The schema already documents directory at 100% coverage ('Absolute path, forward slashes (backslashes are converted for you)'), so the baseline is 3. The description adds decisive extra meaning: 'directory' is a DIRECTORY, not a filename, and actual naming/format are governed by external UI state — a clarification that prevents the most likely misuse of the single parameter. This raises it to a 4; it stops short of 5 because the schema already handled the path syntax.

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

Purpose5/5

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

States a specific verb and resource — 'Export the project's texture channels to real image files on disk' — and immediately differentiates from siblings by claiming to be 'the only binding in ArmorPaint's plugin API that writes images to disk.' An agent can distinguish it from export_mesh, export_material, and ap_read_image_file without opening schemas.

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

Usage Guidelines4/5

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

The claim that it is the only image-writing binding implicitly excludes alternatives, and the explicit chain 'feed one to ap_read_image_file to look at it' tells the agent how to consume the output. It lacks an explicit when-not-to-use statement or a direct comparison with sibling export functions (ap_export_material_bake, ap_export_mesh, ap_export_material), so it stops a point short of a 5.

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

ap_fill_layerA

Fill the selected layer with the active material and push an undo step. THIS IS THE STEP THAT MAKES A NODE-GRAPH EDIT VISIBLE — ap_material_update only recompiles the material; nothing appears in the viewport until you fill or paint. The working loop is: ap_node_* edits -> ap_material_update -> ap_fill_layer -> ap_capture_viewport. Fails with 'no_project'/'bad_args' if no layer is selected. This is also the ONLY layer operation in ArmorPaint's plugin API — there is no create/delete/rename/mask/opacity/blend binding, so layer management has to be done by hand in the UI.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries full behavioral disclosure: it pushes an undo step, fails with no_project/bad_args if no layer is selected, has a side effect on the viewport, and is the only layer operation in the plugin API. This is far more than a basic summary.

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

Conciseness5/5

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

The key purpose is front-loaded in the first sentence, and every subsequent sentence contributes a distinct decision-relevant fact: visible effect, workflow order, error condition, and API uniqueness. The length is justified by the lack of annotations and schema details.

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

Completeness5/5

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

For a zero-parameter tool with no annotations and no output schema, the description covers behavior, prerequisites, failures, workflow placement, and alternatives. There is no meaningful information gap left 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.

Parameters4/5

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

The tool takes zero parameters and the schema is empty, so no parameter documentation is missing. The description adds meaning by identifying the implicit contextual inputs (selected layer and active material) and the failure mode when the layer state is absent.

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

Purpose5/5

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

The first sentence names a specific verb and resource: fill the selected layer with the active material and push an undo step. It further distinguishes itself from ap_material_update by stating that only filling/painting makes node-graph edits visible, and identifies itself as the only layer-bound API operation.

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?

It gives an explicit working loop: ap_node_* edits -> ap_material_update -> ap_fill_layer -> ap_capture_viewport. It also warns that ap_material_update alone only recompiles the material and that nothing appears until fill/paint, so an agent knows exactly when this tool is required.

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

ap_fs_listA

List a directory as seen by the ArmorPaint process (which may be a different machine/container than this server). Useful for finding what an export actually wrote.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesDirectory to list. Absolute path, forward slashes (backslashes are converted for you).

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It discloses that the operation is a read-only listing and that it executes against ArmorPaint's filesystem view, which may differ from this server. It does not address errors or output format, but the core behavior is transparent.

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

Conciseness5/5

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

Two concise sentences with no filler; the key functional and contextual information is front-loaded.

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

Completeness5/5

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

For a one-parameter listing tool, the description is complete: it states the operation, the execution context, and the primary use case. No output schema is present, but the return concept is implicit in 'List a directory' and would not affect call correctness.

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

Parameters4/5

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

The input schema fully documents 'path' with absolute-path and slash-conversion details; the description adds the important nuance that the path is interpreted by ArmorPaint's process, which may live on another machine or container. This goes beyond the schema alone.

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?

Clearly states it lists a directory and scopes it to the ArmorPaint process, which distinguishes it from server-side listing and from sibling FS tools like ap_fs_stat and ap_fs_mkdir.

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

Usage Guidelines4/5

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

Provides clear context by noting the remote/container filesystem and gives a concrete use case ('finding what an export actually wrote'), but does not explicitly contrast it with sibling tools or state when not to use it.

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

ap_fs_mkdirA

Create a directory (as the ArmorPaint process), e.g. before an export.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesDirectory to create. Absolute path, forward slashes (backslashes are converted for you).

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It adds the useful behavioral nuance that the operation runs 'as the ArmorPaint process', implying its filesystem context. However, it does not mention error behavior, whether existing directories are tolerated, or whether parent directories are created.

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

Conciseness5/5

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

A single sentence with no wasted words. The core action is front-loaded, and the example usage directly follows. Every element earns its place.

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

Completeness4/5

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

For a one-parameter filesystem creation tool with no output schema, the description is sufficiently complete for an agent to invoke it correctly. The path format is fully documented in the schema, and the purpose is clear. Minor gaps like return value or existence handling do not materially hinder correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, and the path parameter is already well documented in the schema: absolute path, forward slashes, and automatic backslash conversion. The description adds no parameter semantics beyond the schema, so baseline 3 is appropriate.

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?

Description states a precise verb and resource: 'Create a directory (as the ArmorPaint process)'. It clearly distinguishes this tool from filesystem read siblings like ap_fs_list and ap_fs_stat, and the example 'before an export' reinforces its purpose.

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

Usage Guidelines4/5

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

The description provides clear context: create a directory as the ArmorPaint process, e.g., before an export. It does not explicitly name alternatives or exclusions, but none are needed since the tool name and sibling set make the read-vs-write distinction obvious.

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

ap_fs_statA

Report whether a path exists, whether it is a directory, and whether ArmorPaint considers it absolute.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath to test. Absolute path, forward slashes (backslashes are converted for you).

TDQS

A4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. The wording 'Report whether' clearly frames the tool as an inspection/read operation with no side effects, and enumerates exactly what is tested. It does not cover error handling or permissions, but for a simple stat query this is reasonably transparent.

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

Conciseness5/5

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

The description is a single, focused sentence with no filler. It front-loads the action and immediately lists the exact facts reported, making it easy for an agent to scan and understand.

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

Completeness4/5

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

The tool is simple with one parameter and no output schema. The description adequately conveys what the tool will tell the caller. It could mention the return shape or error behavior, but these are minor gaps for a stat-like operation.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already explains that the path must be absolute and use forward slashes. The description does not add significant new meaning to the 'path' parameter beyond restating the tool's purpose, so the baseline score of 3 applies.

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

Purpose5/5

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

The description uses a specific verb ('Report') and resource ('path'), and clearly defines the three checks performed: existence, directory status, and absoluteness. This clearly differentiates it from sibling filesystem tools like ap_fs_list and ap_fs_mkdir.

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

Usage Guidelines3/5

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

The description implies when to use the tool—when path properties need to be verified—but it does not explicitly state alternatives or exclusions. There is no guidance like 'use ap_fs_list for listing directory contents' or 'prefer this before creating files.'

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

ap_get_app_infoA

Application-level facts: window title, window size and position, ArmorPaint's data directory, and the project format version.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It describes what information is returned but does not explicitly state that the call is read-only, side-effect-free, or whether it requires an active ArmorPaint session. For a simple getter, the read-only nature is likely inferred, but error conditions and response behavior are not disclosed.

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

Conciseness5/5

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

A single compact sentence that front-loads the core concept ('Application-level facts') and then lists the specific outputs. Every word earns its place, with no filler, redundancy, or unnecessary examples. It is concise while still being informative.

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

Completeness3/5

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

For a zero-parameter, no-output-schema tool, the description gives a useful high-level summary of the return contents but stops short of specifying the exact field names or data types. It also does not mention any prerequisites such as the need for a live bridge connection or behavior if the application is unavailable. The list is sufficient to decide when to call it, but not fully complete for knowing exactly what to expect.

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

Parameters4/5

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

The tool has zero parameters, so the input schema is trivially complete (100% coverage). The description needs to add no parameter semantics since there are none to document. Baseline for a parameterless tool is 4, and the description doesn't introduce any confusion.

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

Purpose4/5

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

The description identifies the tool as returning application-level facts and enumerates specific data items: window title, size/position, data directory, and project format version. This clearly distinguishes it from sibling tools like ap_get_context and ap_project_get_info. It lacks an explicit verb like 'returns' or 'gets', but the tool name and the noun phrase 'Application-level facts' make the purpose obvious.

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

Usage Guidelines3/5

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

The listed facts imply when to use this tool: when you need window information, the data directory, or the project format version. However, it does not explicitly contrast it with alternatives such as ap_get_context or ap_project_get_info, nor does it state when not to use it. Usage context is only implied, not explicitly guided.

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

ap_get_configA

Application preferences that are readable from a plugin: window size/scale, supersampling, keymap, theme, undo steps, camera FOV, default layer resolution, live-brush/live-material/node-preview toggles, workspace and workflow, plus the recent-project and plugin lists. Post-processing settings (SSAO, bloom, LUT, gamma...) are not exposed by the API.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral burden. It discloses that the tool is read-only, enumerates what data is available, and explicitly excludes post-processing settings. It does not describe output formatting or error behavior, but for a parameterless config getter this is reasonably transparent.

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

Conciseness4/5

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

The description is dense but purposeful: it front-loads the read-only nature and then provides a structured inventory of exposed preferences. The second sentence adds a valuable exclusion. It is not overly verbose relative to the amount of information conveyed.

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

Completeness4/5

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

For a parameterless getter with no output schema, the description is nearly complete: it lists the available preference categories and calls out what is absent. Minor gaps are the lack of explicit return-shape detail and failure conditions, but these are low-risk for this tool.

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

Parameters4/5

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

The tool has zero parameters and the schema is empty, so the baseline of 4 applies. The description does not need to explain parameter semantics because there are none; it instead focuses on what the returned configuration contains.

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

Purpose5/5

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

The description clearly identifies the tool as exposing application preferences that are readable from a plugin, and enumerates the specific preference groups included. This distinguishes it from sibling tools like ap_set_config (write counterpart) and ap_get_app_info (app-level info).

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

Usage Guidelines4/5

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

The description makes clear this is the read path for plugin-readable application preferences and explicitly lists what is included. It also says post-processing settings are not exposed, which prevents misuse. It does not explicitly name ap_set_config as the alternative for writing, but the read-only framing implies this boundary.

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

ap_get_contextA

The workhorse read: the live painting context — active tool, brush radius/opacity/hardness/scale/angle/blending, viewport display mode, x-ray flag, whether a layer and a material are selected, and the active material's name. Note that only whether a layer is selected can be reported: the layer object itself is an opaque pointer with no readable fields.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It clearly labels the operation as a read and discloses an important limitation: the layer object itself is an opaque pointer and only selection status can be reported. This is genuine behavioral transparency beyond a field list.

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

Conciseness5/5

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

Two sentences with no filler. The core purpose and field list come first, and the crucial layer-pointer caveat is placed in the second sentence. Every clause adds information the agent needs.

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

Completeness5/5

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

With no output schema and no annotations, this description is the sole source of behavioral and return-value knowledge. It provides a comprehensive enumeration of returned fields and flags the one inaccessible piece of data. Nothing essential is missing for calling this no-argument read tool correctly.

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

Parameters4/5

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

The tool has zero parameters, so there is no parameter semantics to document. The baseline of 4 applies; the description appropriately focuses on return content rather than parameters.

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

Purpose5/5

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

The description clearly identifies the action ('read') and the resource ('live painting context'), then enumerates the exact fields returned: active tool, brush properties, viewport mode, x-ray flag, layer/material selection state, and material name. This detailed scope differentiates it from sibling getters like ap_get_app_info and ap_get_config.

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

Usage Guidelines3/5

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

The phrase 'the workhorse read' implies this is the general-purpose context query, and the listed fields make the use case evident. However, there is no explicit guidance about when to prefer this over sibling tools such as ap_material_get_active or ap_select_tool, nor any when-not-to-use note.

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

ap_get_main_objectA

Describe the main paint object: name, visibility and transform (location, rotation quaternion, scale).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral disclosure burden. 'Describe' communicates a non-mutating read operation and lists the returned data (name, visibility, transform). It does not state output format or possible absence of a main object, but for a no-argument getter the key side-effect-free behavior is clear.

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

Conciseness5/5

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

A single sentence front-loads the action and resource, then lists the relevant details in a compact parenthetical. Every word earns its place; there is no repetition of the tool name or filler.

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

Completeness4/5

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

For a simple no-argument, read-only getter, the description is nearly complete: it names the target and the contents of the description. It does not explicitly say that the result is returned vs written to console, but 'Describe' plus the get_* naming makes this reasonably clear even without an output schema.

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

Parameters4/5

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

The tool has zero parameters and schema coverage is trivially 100%, so the description need not explain parameters. The baseline for zero-parameter tools is 4, and the description correctly focuses on what the tool returns rather than arguments it does not take.

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

Purpose5/5

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

The description states a specific action ('Describe') and resource ('main paint object'), and enumerates the exact attributes covered: name, visibility, and transform with location, rotation quaternion, and scale. The qualifier 'main' clearly differentiates this from sibling ap_get_object and the setter tools, so an agent can distinguish it without looking at schemas.

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

Usage Guidelines4/5

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

The description establishes a clear use: retrieve information about the main paint object. It does not explicitly mention alternatives or exclusions, but naming 'main paint object' rather than generic 'object' gives enough context to avoid confusion with ap_get_object or transform/visibility setters.

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

ap_get_objectA

Describe a scene object by name: visibility and transform. Names are matched against the paint objects. NOTE: there is no binding that ENUMERATES objects — you can only look one up by name, or use ap_get_main_object.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesObject name.

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description carries the behavioral disclosure burden. It adds useful context: output is limited to visibility and transform, names are matched against paint objects, and enumeration is not supported. It does not cover error behavior if a name is not found, but 'Describe' sufficiently implies a read-only operation.

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

Conciseness5/5

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

The description is two sentences, front-loads the core purpose, and the NOTE earns its place by conveying a critical limitation. There is no wasted wording.

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

Completeness5/5

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

For a one-parameter lookup tool with no output schema, the description explains what the tool returns, how lookup matching works, and the important enumeration limitation. An agent has enough information to invoke it correctly and interpret the result.

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?

The schema already covers the single parameter with 100% coverage, so the baseline is 3. The description adds some context by saying names are matched against paint objects and used for lookup, but it does not add format, case-sensitivity, or failure semantics beyond the schema.

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

Purpose5/5

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

The description clearly states a specific verb ('Describe') and resource ('a scene object by name'), and specifies what is returned: visibility and transform. It also distinguishes itself from ap_get_main_object by noting there is no enumerating binding, so an agent can tell which tool to use.

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?

It explicitly explains when this tool is appropriate: look up objects by name when they are paint objects, and it names the alternative (ap_get_main_object) for the main object case. This gives clear routing guidance with no inference required.

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

ap_import_assetA

Import a file into the project, dispatched by extension: an image becomes a texture asset, a mesh replaces/adds paint geometry, a .arm becomes a material.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile to import. Absolute path, forward slashes (backslashes are converted for you).

TDQS

A3.8/5.0
Behavior3/5

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

No annotations exist, so the description must carry behavioral disclosure. It does disclose that meshes 'replaces/adds' geometry and that routing depends on extension. It does not state whether imports overwrite existing assets, what happens on unsupported extensions, or whether an open project is required.

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

Conciseness5/5

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

One tightly structured sentence with a colon separating the general action from the extension cases. Every word adds information; no filler.

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

Completeness4/5

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

For a single-parameter import tool, the description is nearly complete: path is handled and expected outcomes are enumerated. The only gap is lack of return-value/error behavior, but the operation's effect is observable in the project.

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?

The only parameter, path, is already fully documented in the schema with absolute-path/forward-slash guidance. The description adds no parameter semantics beyond that, so the 100% schema coverage sets the baseline.

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 action ('Import a file'), the target project, and the three extension-routed outcomes. This makes it immediately distinguishable from more specialized siblings like ap_import_envmap.

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

Usage Guidelines3/5

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

The extension-dispatch rule implies this is the right tool for image, mesh, and .arm files, but the description never explicitly contrasts it with ap_import_envmap or says when not to use it. An agent must infer the boundary from sibling names.

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

ap_import_envmapA

Import an HDR image as the environment map (script_import_asset with hdr_as_envmap=1) and report the resulting envmap name.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesHDR/EXR image. Absolute path, forward slashes (backslashes are converted for you).

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It mentions reporting the envmap name, but it does not describe side effects on the scene, potential errors, or any other behavioral details beyond the basic import operation.

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

Conciseness5/5

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

The description is a single, well-structured sentence that efficiently conveys the tool's purpose and output without unnecessary words.

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

Completeness4/5

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

The description provides enough context for a simple import tool: it specifies input type, the operation, and the reported output. However, it does not address error conditions or interactions with the project state, which could be relevant in a fuller context.

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

Parameters4/5

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

The parameter 'path' is described in the schema as 'HDR/EXR image. Absolute path, forward slashes (backslashes are converted for you).' The description in the tool text adds a clear detail about path format handling, which goes slightly beyond the schema description.

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

Purpose5/5

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

The description clearly states that the tool imports an HDR image as an environment map and reports the resulting envmap name. It also references the underlying script command, making 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.

Usage Guidelines3/5

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

The description implies this tool is specifically for HDR environment map import, but it does not explicitly differentiate it from sibling tools like ap_import_asset or ap_set_envmap_params, nor does it state when to prefer 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.

ap_material_assignA

Assign an existing material to a scene object. Both are looked up by name, and a material's name is its node-canvas name (what ap_material_get_active reports).

ParametersJSON Schema
NameRequiredDescriptionDefault
objectYesObject name.
materialYesMaterial name.

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral disclosure burden. It does disclose that the operation assigns an existing material and that lookup is by name, which is useful. However, it does not mention what happens if the object or material does not exist, whether the assignment replaces an existing material, or any side effects.

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

Conciseness5/5

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

Two concise sentences with no redundant wording. The primary operation is front-loaded, and the important lookup detail about material naming is placed second.

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

Completeness4/5

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

For a simple two-parameter mutation tool, the description covers the core operation, the lookup mechanism, and the material naming convention. It is slightly incomplete around failure behavior and return values, but those are minor for this tool's simplicity.

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

Parameters4/5

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

The input schema already documents both parameters with 100% coverage, providing the baseline of 3. The description adds meaningful naming semantics beyond the schema by clarifying that the material name is the node-canvas name, which is essential for correct invocation.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Assign an existing material to a scene object.' It clearly distinguishes this from sibling tools like ap_material_create, ap_material_select, and ap_material_delete by focusing on assignment to an object rather than creation, selection, or deletion.

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

Usage Guidelines4/5

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

The description gives practical context by explaining that both object and material are looked up by name, and that a material's name is its node-canvas name as reported by ap_material_get_active. This helps an agent know exactly how to supply the material argument, though it does not explicitly list when not to use the tool versus alternatives.

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

ap_material_createA

Create a new material slot and make it active.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for the new material.

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It does state two key side effects: creating a slot and making it active. However, it does not mention what happens to the previously active material, whether a return value/handle is produced, or how name collisions are handled.

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

Conciseness5/5

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

One concise, front-loaded sentence that communicates both the creation and activation behavior with no filler or redundancy. Every word earns its place.

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?

The tool is simple with a single fully described parameter, so the description is mostly adequate. However, since there is no output schema, an agent is left unsure whether the tool returns the new material's identifier or other data, and no prerequisites are mentioned.

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?

The input schema already fully describes the 'name' parameter with 'Name for the new material,' and schema description coverage is 100%. The description adds no extra parameter semantics beyond calling it a material slot, so a baseline score of 3 is appropriate.

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?

Describes a specific operation: creating a new material slot and activating it. This clearly distinguishes it from sibling material tools like ap_material_update, ap_material_delete, and ap_material_select, which handle different lifecycle stages.

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

Usage Guidelines2/5

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

No guidance is given about when to prefer this tool over alternatives, such as ap_material_update for modifying an existing material or ap_material_select for changing the active material. The intended context is only implied by the word 'create.'

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

ap_material_deleteA

Delete a material slot by name. Irreversible from here — ArmorPaint's plugin API has no undo/redo binding, so this cannot be taken back except by the user pressing Ctrl+Z in the app.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesMaterial name.

TDQS

A4.2/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden, and it delivers. It explicitly discloses that the operation is irreversible, explains why (no undo/redo binding in ArmorPaint's plugin API), and states the single exception (user pressing Ctrl+Z in the app). This tells the agent exactly what gets destroyed and the consequences, which is precisely the high-value context this dimension rewards.

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

Conciseness5/5

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

Two sentences with zero waste. The operative purpose is front-loaded in the first sentence, and the second sentence earns its place by adding the critical irreversibility caveat. Every word contributes to the agent's decision-making.

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

Completeness4/5

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

For a simple one-parameter, no-output-schema, no-annotations tool, the description is nearly complete: it states the action, the target, and the most important behavioral risk. The only meaningful gap is error behavior when the given material name does not exist, which an agent would need to handle failures gracefully.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 'name' as 'Material name'; the baseline of 3 applies. The description adds only marginal meaning by framing name as the lookup key ('by name'), but provides no extra format, constraint, or edge-case detail beyond what the schema gives.

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

Purpose5/5

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

The description opens with a specific verb+resource statement, 'Delete a material slot by name,' which precisely identifies the operation and the targeting method. This clearly distinguishes the tool from its material-related siblings (ap_material_create, ap_material_update, ap_material_select, ap_material_list), leaving no ambiguity about what this tool does.

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

Usage Guidelines3/5

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

The usage context is implied rather than explicit: an agent can infer this is the tool to call when a material slot must be removed, and the irreversibility warning implies caution. However, the description never names alternatives or states when-not-to-use conditions, so guidance on choosing it over sibling tools 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.

ap_material_get_activeA

Report the active material: its name (a material's name is its node-canvas name) and its nine per-channel paint flags.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. The verb 'Report' signals a read-only inspection, and the description names exactly what data is returned. It does not explicitly state that no project state changes, but for a zero-parameter getter this is a minor omission.

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

Conciseness5/5

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

One well-structured sentence leads with the action and resource, then fills in the specific output details and clarifies the terminology ('node-canvas name'). No filler or redundant restatement of the tool name.

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

Completeness4/5

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

There is no output schema, so the description explains the return payload. It is complete for a zero-parameter getter, though it leaves minor edge-case behavior (e.g., behavior when no material is active) to the runtime.

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

Parameters4/5

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

The tool has zero parameters, so the baseline is 4; there is no parameter meaning left unexplained. The description correctly avoids inventing parameter details that do not exist.

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

Purpose5/5

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

The description uses a specific verb ('Report') and resource ('the active material') and precisely enumerates the returned data: the node-canvas name and the nine per-channel paint flags. This distinguishes it from siblings such as ap_material_list, which enumerate materials rather than inspecting the active one.

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

Usage Guidelines3/5

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

The intended use is implied: call this when the agent needs the active material's name or paint flags. However, there is no explicit when-to-use/when-not-to-use guidance or alternative routing (e.g., 'use ap_material_list to see all materials').

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

ap_material_listA

List material names. DEGRADED — read the caveat before trusting it: this reads project_t.material_nodes, which is a SNAPSHOT written only at save and load. It is null in a project that has never been saved, and it misses materials created during this session. There is no live material enumeration binding. For the material you are actually working on, use ap_material_get_active.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden, and it excels: it explains the snapshot source, when it is null, what it misses, and that no live binding exists. This gives the agent accurate expectations about stale or missing results.

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

Conciseness5/5

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

The description is compact yet information-dense. The purpose is stated first, followed by a clearly labeled caveat, root cause, edge cases, and a sibling alternative—every sentence earns its place without unnecessary filler.

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

Completeness5/5

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

For a parameterless list tool with no output schema, this description is complete: it explains what is returned, warns about degradation, specifies failure modes, and routes the agent to a more appropriate tool. No critical information for correct invocation or interpretation is missing.

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

Parameters4/5

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

The tool has zero parameters and the schema already documents this completely, so there is no parameter burden for the description to carry. The description's focus on behavioral caveats is appropriate; a baseline of 4 is warranted for a zero-parameter tool.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'List material names.' It also distinguishes itself from ap_material_get_active by stating that tool is for the material you are actually working on, so an agent can tell them apart without inspecting schemas.

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?

The description explicitly warns when not to trust the tool and points to the correct alternative: 'For the material you are actually working on, use ap_material_get_active.' It also clarifies that there is no live enumeration binding, telling the agent this is not the tool for current-session material discovery.

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

ap_material_selectA

Make an existing material active, by name.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesMaterial name.

TDQS

A3.5/5.0
Behavior2/5

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

With no annotations provided, the description must disclose behavioral details, but it only states the core effect: the material becomes active. It does not mention what happens to the previously active material, error handling for nonexistent names, or whether this affects the current selection context or viewport.

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

Conciseness5/5

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

A single concise sentence with no wasted words. The verb, target, and lookup mechanism are all front-loaded and immediately understandable.

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

Completeness3/5

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

For a simple one-parameter tool with no output schema and no annotations, the purpose and input are adequately conveyed. However, the description omits failure behavior and return semantics, leaving the agent to infer what happens before or after the material is set active.

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?

The schema already documents the single parameter 'name' with 100% coverage, so the baseline is 3. The description reinforces that the name must refer to an existing material, but it adds no new format, value constraints, or additional parameter context.

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

Purpose5/5

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

The description states a specific action and object: 'Make an existing material active, by name.' It clearly distinguishes this from material creation, deletion, listing, assignment, and get-active sibling tools.

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

Usage Guidelines3/5

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

The phrase 'existing material' implies the tool is not for creating materials, so usage context is partially conveyed. However, it does not explicitly mention when to prefer this over sibling tools like ap_material_create, ap_material_get_active, or ap_material_assign.

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

ap_material_set_channelsA

Enable or disable which channels the active material paints into. These are the material's own paint_* flags, not texture-set channels (ArmorPaint's plugin API has no channel add/remove). Omitted channels are left alone.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNoPaint into the base channel.
heightNoPaint into the height channel.
normalNoPaint into the normal channel.
opacityNoPaint into the opacity channel.
emissionNoPaint into the emission channel.
metallicNoPaint into the metallic channel.
occlusionNoPaint into the occlusion channel.
roughnessNoPaint into the roughness channel.
subsurfaceNoPaint into the subsurface channel.

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are present, so the description carries the behavioral burden. It discloses partial-update semantics and an API limitation, which is helpful. However, it does not state persistence, effects on existing paint data, or what happens if no active material exists.

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

Conciseness5/5

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

Two sentences carry all essential information with no fluff. The action is front-loaded, and the key caveat about omitted channels is included efficiently.

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

Completeness4/5

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

For a simple optional-boolean setter with 100% schema coverage, the description is nearly complete. It covers scope, partial-update behavior, and a relevant API constraint. Minor omissions like active-material prerequisite and return behavior do not seriously impair usability.

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

Parameters4/5

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

Schema coverage is 100%, so parameters are already individually documented. The description adds important semantic value by clarifying that omitted channels are left unchanged and that these flags are the material's own paint_* flags, not texture-set channels.

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?

Description uses a specific verb and object: 'Enable or disable which channels the active material paints into.' It clearly distinguishes these from texture-set channels and notes the plugin API has no channel add/remove, preventing confusion with sibling tools.

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

Usage Guidelines4/5

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

The description gives clear context: it applies to the active material, uses the material's own paint_* flags, and explicitly excludes texture-set channels. It also states that omitted channels are left alone. It does not name alternative sibling tools by name, but the guidance is sufficient for correct selection.

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

ap_material_updateA

Recompile the active material after node edits (script_material_update). THIS DOES NOT CHANGE THE VIEWPORT. ArmorPaint renders the layer stack, and the node graph is only the paint SOURCE — measured: viewport captures before and after a colour change plus ap_material_update are byte-identical. To make a graph edit visible you must apply it: ap_fill_layer (whole layer) or ap_paint_stroke / ap_paint_stroke_world (where you paint). Call this once after a batch of ap_node_* edits, then apply.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and exceeds it: it warns 'THIS DOES NOT CHANGE THE VIEWPORT,' explains the render pipeline (layer stack vs. node graph source), and even provides measured evidence that viewport captures are byte-identical before and after. This is exactly the kind of non-obvious behavior 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.

Conciseness5/5

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

The description is front-loaded with the core purpose and the critical viewport caveat, then gives concise alternatives and a call cadence. Every sentence contributes distinct, actionable information; the measured byte-identical detail is somewhat verbose but directly supports the transparency claim.

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

Completeness5/5

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

For a zero-parameter tool with no output schema and no annotations, the description is complete: it explains what the tool does, when to call it, what it will not do, and how to achieve the visible result the user wants. No critical guidance is missing.

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

Parameters4/5

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

The input schema has zero parameters and 100% coverage, so there is nothing for the description to add about parameter meaning. The 0-parameter baseline is 4, and the description appropriately focuses on call semantics instead of inventing parameter details.

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

Purpose5/5

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

The description states a specific verb and resource: 'Recompile the active material after node edits.' It also immediately clarifies that the tool does not change the viewport, which distinguishes it from paint/fill tools and other material operations like ap_material_create or ap_material_delete.

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?

The description gives explicit when-to-use guidance: 'Call this once after a batch of ap_node_* edits.' It also names alternatives for making edits visible (ap_fill_layer, ap_paint_stroke, ap_paint_stroke_world), so the agent knows exactly how to route its next action.

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

ap_node_addA

Add a node to the active material's graph at a canvas position, and return its new id. Valid types: ATTRIBUTE BAKE_CURVATURE BLUR BOOL BRIGHTCONTRAST BUMP CLAMP COLMASK COMBINE_COLOR COMBXYZ CURVE_RGB CURVE_VEC CUSTOM DIRECT_WARP ENUM FLOAT_CURVE GAMMA GROUP GROUP_INPUT GROUP_OUTPUT HUE_SAT INVERT_COLOR LAYER LAYER_MASK MAPPING MAPRANGE MATERIAL MATH MIX_NORMAL_MAP MIX_RGB NEURAL_EDIT_IMAGE NEURAL_IMAGE_TO_3D_MESH NEURAL_IMAGE_TO_PBR NEURAL_REPEAT NEURAL_SAVE_IMAGE NEURAL_TEXT_TO_IMAGE NEURAL_UPSCALE_IMAGE NEW_GEOMETRY NORMAL NORMAL_MAP OBJECT_INFO OUTPUT_MATERIAL_PBR PICKER QUANTIZE REPLACECOL RGB RGBA RGBTOBW SCRIPT_CPU SEPARATE_COLOR SEPXYZ SHADER_GPU STRING TEX_BAKE TEX_BRICK TEX_CAMERA TEX_CHECKER TEX_COORD TEX_GABOR TEX_GRADIENT TEX_IMAGE TEX_MAGIC TEX_NOISE TEX_TEXT TEX_VORONOI TEX_WAVE TILESHEET TILESHEET_ANIM UVMAP VALTORGB VALUE VECTOR VECT_MATH VECT_ROTATE VECT_TRANSFORM WIREFRAME.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoCanvas x position.
yNoCanvas y position.
typeYesNode type string, e.g. TEX_NOISE, MIX_RGB, RGB, MATH.

TDQS

A3.9/5.0
Behavior3/5

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

No annotations are provided, so the description must disclose behavior on its own. It does state the core mutation (adding a node), the return value, and valid types. It does not disclose side effects, reversibility, or error behavior when no active material exists or an invalid type is supplied.

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

Conciseness4/5

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

The main sentence is compact and front-loaded with the action and return value. The long list of valid types is justified because there is no enum in the schema, and there is no filler or redundant explanation.

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

Completeness4/5

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

For a tool with three simple parameters, the description covers what it does, where it operates, what it returns, and what input values are allowed. The main gap is not stating the behavior when there is no active material or when the type is invalid, but the core calling context is sufficiently clear.

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

Parameters4/5

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

The schema already describes x, y, and type, so the description does not need to repeat those. It adds genuine value by listing the full universe of valid node type constants, which is significant because the schema only gives examples and no enum.

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

Purpose5/5

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

The description states a specific verb ('Add'), resource ('node'), target ('active material's graph'), placement ('canvas position'), and return value ('new id'). This clearly distinguishes it from sibling tools like ap_node_remove, ap_node_connect, and ap_node_set_value.

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

Usage Guidelines3/5

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

The description implies usage when a new node should be inserted into the active material graph, and it gives the set of valid node types. However, it does not explicitly say when to prefer this over sibling tools or mention prerequisites such as an active material being present.

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

ap_node_connectA

Link one node's output socket to another node's input socket. Socket numbers are 0-based positions, as reported by ap_node_list; the output node's material socket order is Base Color, Opacity, Occlusion, Roughness, Metallic, Normal Map, Emission, Height, Subsurface.

ParametersJSON Schema
NameRequiredDescriptionDefault
to_idYesDestination node id.
from_idYesSource node id.
to_socketNoDestination input socket index.
from_socketNoSource output socket index.

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It adds genuinely useful context — 0-based socket indexing and the exact material socket order — but does not disclose mutation traits such as whether an existing connection is replaced, what happens if either socket is occupied or invalid, or what the operation returns.

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

Conciseness5/5

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

Two sentences with zero filler: the first front-loads the core action, the second adds the socket-numbering semantics an agent needs to call correctly. Every sentence earns its place.

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

Completeness3/5

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

For a 4-parameter mutation tool with no annotations and no output schema, the description covers the essentials for making the call, but omits behavioral fine points an agent would want: overwrite behavior on occupied sockets, failure modes for invalid node references, and return value. The socket-order detail mitigates but does not fully close the gap.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real value by clarifying what socket index values mean: 0-based positions from ap_node_list and the exact material socket ordering (Base Color, Opacity, Occlusion, ...). This goes well beyond the schema's terse 'Source output socket index' and 'Destination input socket index'.

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

Purpose5/5

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

States a specific verb and resource: 'Link one node's output socket to another node's input socket.' This clearly differentiates it from the sibling tools ap_node_add, ap_node_remove, ap_node_disconnect, and ap_node_set_value, which all perform distinct node-graph operations.

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

Usage Guidelines3/5

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

Usage context is implied rather than explicit: the reference to socket numbers 'as reported by ap_node_list' hints at a precursor step and the 0-based note sets expectations. However, the description never explicitly says when to prefer this tool over ap_node_disconnect or ap_node_set_value, nor gives any exclusion conditions.

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

ap_node_disconnectA

Remove whatever is linked into one input socket of a node.

ParametersJSON Schema
NameRequiredDescriptionDefault
to_idYesDestination node id.
to_socketYesInput socket index.

TDQS

A3.5/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It states that an existing link is removed, which conveys its destructive effect, but it does not mention reversibility, idempotency, behavior on an empty socket, or whether any other connection is affected.

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

Conciseness5/5

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

The description is a single, focused sentence with no filler. The key action and target are front-loaded, making it easy to scan and understand.

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

Completeness3/5

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

For a simple two-parameter tool with complete schema coverage, the description is minimally viable. However, with no annotations and no output schema, it lacks guidance on side effects, edge cases, and when to prefer it over similar node-related tools.

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

Parameters3/5

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

Schema coverage is 100%, with both to_id and to_socket already described in the input schema. The description adds little beyond restating that the operation targets one input socket, so it meets the baseline without significantly enriching parameter meaning.

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

Purpose5/5

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

The description uses a specific verb ('Remove') and a precise resource ('whatever is linked into one input socket of a node'), clearly distinguishing this from siblings like ap_node_add, ap_node_remove, and ap_node_connect. It communicates the exact operation without ambiguity.

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

Usage Guidelines3/5

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

The description implies the tool should be used when an input socket's existing connection needs to be cleared, but it does not explicitly state when to use it instead of alternatives like ap_node_remove or ap_node_connect. There is no exclusion guidance or contextual routing.

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

ap_node_listA

Read the active material's node graph: every node's id, name, type and canvas position, its input/output socket names, and every link (from_id/from_socket -> to_id/to_socket). This is the richest and best-tested part of the API — node work is where an agent has the most real leverage in ArmorPaint.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of disclosing behavior. It clearly signals a read-only operation via 'Read', defines the scope as the active material, and describes the full returned contents. It does not mention edge cases such as missing active material or failure behavior, but for a no-parameter read tool the disclosure is solid.

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

Conciseness5/5

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

The description is two sentences with no waste. The first sentence front-loads the precise behavior and output contents; the second adds relevant context about reliability and leverage without unnecessary detail. Every sentence earns its place.

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

Completeness5/5

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

Given zero parameters, no annotations, and no output schema, the description is complete: it enumerates exactly what data will be returned and makes the read-only, scoped nature clear. An agent has enough information to call the tool correctly and interpret its results.

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

Parameters4/5

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

The tool has zero parameters and the schema is empty, so there is no parameter semantics to document. The description appropriately clarifies that the scope is the active material, which is the only implicit input an agent needs to understand. Baseline 4 is appropriate because no parameter docs are needed.

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

Purpose5/5

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

The description uses a specific verb ('Read') and a specific resource ('the active material's node graph'), then enumerates the exact data returned: node ids, names, types, positions, socket names, and links. This clearly distinguishes it from the sibling mutation tools like ap_node_add, ap_node_connect, and ap_node_remove.

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

Usage Guidelines4/5

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

The description gives clear context for when this tool is useful: when an agent needs the node graph structure to work with nodes, and it emphasizes that node work is where the agent has leverage. It does not explicitly name alternatives or state when not to use it, but for a read-only inspection tool the intended usage is strongly implied.

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

ap_node_removeA

Remove a node from the active material's graph by id (from ap_node_list).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNode id.

TDQS

A3.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. While 'Remove a node' names the core action, it does not mention whether removal is irreversible, whether connected nodes are also removed, or whether the active material must have a specific state. For a destructive operation, this is a meaningful transparency gap.

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

Conciseness5/5

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

The description is a single concise sentence that front-loads the verb and resource, then adds a useful parenthetical about the id source. 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.

Completeness4/5

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

For a one-parameter tool with no output schema, the description gives enough to call it correctly: what action to take, on what target, and where to source the id. The main missing element is a note on side effects, but that was already flagged under behavioral transparency.

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

Parameters4/5

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

The input schema already documents 'id' as a 'Node id' with 100% coverage. The description adds extra value by specifying that the id must come from ap_node_list, which clarifies where the value originates and helps the agent use a valid identifier.

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

Purpose5/5

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

The description states a specific verb ('Remove'), a clear resource ('a node from the active material's graph'), and the source of the identifier ('from ap_node_list'). This clearly differentiates it from sibling tools like ap_node_add, ap_node_connect, and ap_node_disconnect.

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

Usage Guidelines3/5

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

The description gives useful context—the node should be in the active material's graph and the id should come from ap_node_list. However, it does not explicitly say when to prefer this over alternatives like ap_node_disconnect, nor does it state any exclusions or prerequisites beyond having the id.

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

ap_node_set_valueA

Set a value on a node. Four kinds: 'float' (one number on a socket), 'color' (r,g,b,a on a socket), 'vector' (x,y,z on a socket), and 'button' (a node's own widget — dropdown index, checkbox 0/1, or a slider value; see the node reference for each type's button list). Socket-based kinds default to the node's INPUT sockets. Follow a batch of edits with ap_material_update.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesNode id from ap_node_list.
kindYesWhat to set.
colorNoRGBA (or RGB, alpha defaults to 1) in 0..1, for kind 'color'.
valueNoThe number, for kind 'float' or 'button'.
buttonNoButton index, for kind 'button'.
socketNoSocket index for float/color/vector kinds.
vectorNo[x, y, z] for kind 'vector'.
is_inputNoTarget an input socket (true) or an output socket.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It explains the mutation semantics of each kind, the distinction between socket values and button widgets, and the important follow-up requirement of ap_material_update. It does not cover permissions, errors, or return values, but the core behavior and sequencing are disclosed.

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

Conciseness5/5

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

The description is compact and front-loaded: the first sentence states the purpose, the second defines all variants, and the third gives the critical follow-up instruction. Every sentence earns its place with no filler or repetition.

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

Completeness4/5

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

For an 8-parameter mutation tool with no annotations and no output schema, the description covers the main behavioral axes: kind semantics, socket defaults, button specifics, and the required material update. The only notable gap is that button index details are deferred to an external node reference, and there is no mention of return values or error behavior.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds real semantic value beyond the schema by explaining what each 'kind' means, how color/vector/float map to socket values, how 'button' maps to widget state, and how the input-socket default works. This lifts it above baseline without fully documenting every parameter detail.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Set a value on a node') and immediately enumerates the four kinds it supports. This clearly differentiates the tool from structural siblings like ap_node_add, ap_node_remove, and ap_node_connect.

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

Usage Guidelines4/5

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

The description gives clear contextual guidance: socket-based kinds default to input sockets, and edits should be followed with ap_material_update. It does not explicitly list when-not-to-use conditions or name alternatives, but the tool's domain is distinct enough that the usage context is clear.

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

ap_object_duplicateA

Duplicate a scene object by name and return the new object's name.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the object to duplicate.

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden. It discloses the core operation and result, but does not specify behavior for missing names, duplicate name conflicts, or whether children/materials are copied. This leaves some gaps.

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

Conciseness5/5

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

A single, direct sentence conveys the action, input, and output with no filler. The key information is front-loaded.

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

Completeness4/5

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

For a single-parameter tool with no output schema and no annotations, the description covers the essential workflow: provide an object name and receive the new duplicate's name. It is adequate for correct invocation, although it omits edge-case behavior.

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

Parameters3/5

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

Schema coverage is 100% and the description reinforces that the parameter identifies the source object by name. It adds the return-value detail but does not add constraints like uniqueness, existence requirements, or naming conventions for the duplicate.

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

Purpose5/5

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

The description clearly states the action (duplicate), the resource (scene object), the selection method (by name), and the return value (the new object's name). It is unambiguous and distinct from sibling tools like ap_get_object or ap_object_set_transform.

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

Usage Guidelines4/5

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

The intended use is clear: duplicate a scene object by name. No explicit alternatives or exclusions are mentioned, but the operation is unique among siblings, so the ambiguity is minimal.

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

ap_object_set_transformA

Set an object's location, rotation and/or scale, then rebuild its matrix. Rotation is given as XYZ Euler angles in DEGREES and converted to the quaternion the engine wants. Omitted components are left alone. ArmorPaint's world is Z-up.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesObject name.
scaleNoScale [x, y, z].
locationNoWorld location [x, y, z].
rotation_euler_degreesNoXYZ Euler rotation in degrees.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations at all, the description carries the disclosure burden and does well: it warns that rotation is in degrees, states conversion to quaternion occurs, says omitted components are left alone, and notes the world is Z-up. It doesn't mention whether the operation is destructive or requires any state, but for a transform setter the core behavioral traits are disclosed. The 'rebuild its matrix' note gives useful insight into internal effect.

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

Conciseness5/5

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

Three sentences, no filler. The most important information (what it does, degrees, omitted-left-alone, Z-up) is front-loaded and each sentence earns its place. The structure leads with the verb and resource, then flags the critical unit/conversion detail, then the omission behavior, then the coordinate-space note.

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

Completeness4/5

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

For a transform setter with 1 required param and 3 optional arrays, the description covers the core usage context. It tells you the coordinate system, the rotation convention, and the omission behavior. It doesn't discuss what the return value is, but there is no output schema and it's not essential for invoking a transform setter. It doesn't mention whether the object must exist, but the parameter description for name plus the tool family context makes that obvious. A half-point deduction for lacking any note about error cases or prerequisites.

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

Parameters3/5

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

Schema description coverage is 100%, and the parameter descriptions are mostly self-explanatory. The description adds value to rotation_euler_degrees by specifying degrees and conversion, and clarifies semantics of omitted arrays. However, scale and location parameter meanings ('World location', 'Scale') are already in the schema, so the description doesn't add much beyond the schema baseline.

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

Purpose5/5

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

The description states a clear verb-object pair ('Set an object's location, rotation and/or scale, then rebuild its matrix'), names the specific resource (an object's transform), and includes a distinctive detail that differentiates from siblings like ap_object_set_visible and ap_get_object: rotation is provided as XYZ Euler degrees and converted internally. It also clarifies omissions are left alone, which disambiguates it from a tool that might reset all components.

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

Usage Guidelines4/5

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

The description implicitly tells when to use it: when you need to set transform components of an object, leave unspecified components untouched, and want the matrix rebuilt. It doesn't explicitly state when not to use it or name alternatives, but the sibling set is large and mostly about other concerns (paint, materials, nodes, files), so the context is clear enough. Losing a point because there is no explicit exclusion or alternative pointer.

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

ap_object_set_visibleA

Show or hide a scene object. This is the object's visible flag: a hidden object stays in the project with its materials intact, it just stops rendering.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesObject name.
visibleYesTrue to show, false to hide.

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral disclosure burden. It explicitly states that a hidden object stays in the project with materials intact and merely stops rendering, which goes well beyond the basic show/hide semantics. It does not cover every possible side effect, but for a simple boolean setter it provides meaningful transparency.

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

Conciseness5/5

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

Two concise sentences front-load the core action and then add a valuable clarifying detail about hidden objects persisting with materials intact. Every word earns its place, and there is no redundancy or filler.

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

Completeness4/5

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

For a simple two-parameter, no-output-schema tool, the description is largely complete: it explains purpose, effect, and non-destructive behavior. It slightly misses out on mention of return values or error behavior, but that is a minor gap given the simplicity of the operation.

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?

The input schema already covers both parameters clearly: 'name' as the object name and 'visible' as 'True to show, false to hide'. Since schema description coverage is 100%, the description does not need to add much, and it does not go beyond what the schema already conveys.

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

Purpose5/5

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

The description opens with 'Show or hide a scene object', a specific verb and resource, and then clarifies the semantics with 'visible flag' and 'stops rendering'. This clearly positions it as a visibility control tool and distinguishes it from sibling tools that deal with transforms, materials, or scene structure.

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

Usage Guidelines3/5

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

No explicit when-to-use or alternative tools are mentioned, but the context is clear: the tool is for controlling whether an object renders. The phrase 'hidden object stays in the project' implies a non-destructive visibility workflow, so usage is reasonably implied even though no direct comparison to siblings is provided.

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

ap_paint_strokeA

Paint a stroke in SCREEN space and close it. Coordinates are normalised (0..1) across the viewport, so 0.5,0.5 is the centre and what gets painted depends on the current camera. Paints into the selected layer with the active tool/brush; silently does nothing if no project is open, no layer is selected, or the selected layer is a group. At most 48 points — the whole stroke runs inside one frame.

ParametersJSON Schema
NameRequiredDescriptionDefault
pointsYesStroke path as [[x, y], ...] in normalised 0..1 screen space.

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden, and it does so richly. It discloses silent no-op conditions (no project, no selected layer, or a group layer), dependence on the selected layer and active tool/brush, the 48-point cap, and the one-frame execution constraint. This goes well beyond a generic 'paint a stroke' statement.

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

Conciseness5/5

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

Every sentence earns its place: the first establishes the core operation, the second explains the coordinate system, the third covers target context and failure behavior, and the final clause adds a hard limit. The density is high but the structure is logical and front-loaded with the most important information.

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

Completeness4/5

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

The description covers coordinate space, no-op conditions, target layer/tool, the 48-point limit, and the single-frame execution, which is nearly complete for a drawing tool. The only minor gap is that it does not explicitly state the return value or whether the operation reports any result, though 'silently does nothing' implies no error is surfaced.

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

Parameters5/5

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

The schema already describes points as normalized 0..1, but the description adds meaningful semantics beyond the schema: 0.5,0.5 maps to the viewport center, the stroke is automatically closed, and at most 48 points are allowed—a constraint not present in the schema's top-level array definition. This materially improves correct invocation.

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

Purpose5/5

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

The description states a specific action ('Paint a stroke in SCREEN space and close it') on a clear resource, and immediately distinguishes this tool from its sibling ap_paint_stroke_world by emphasizing screen-space normalized coordinates and camera dependence. This makes the tool's identity unmistakable.

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

Usage Guidelines4/5

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

The description gives clear context for when this tool applies: when you have normalized screen-space coordinates, and it notes that the painted location depends on the current camera. It does not explicitly name the world-space alternative or say 'use ap_paint_stroke_world for world coordinates,' so it falls just short of an explicit when-not/alternative statement.

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

ap_paint_stroke_worldA

Paint a stroke in WORLD space and close it — camera-independent, which makes it the reliable choice for scripted painting. ArmorPaint's world is Z-up; use ap_get_main_object for the object's bounds.

ParametersJSON Schema
NameRequiredDescriptionDefault
pointsYesStroke path as [[x, y, z], ...] in world space.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden. It discloses several important traits: the stroke is closed, uses world space, is camera-independent, ArmorPaint is Z-up, and ap_get_main_object can provide object bounds. It does not mention prerequisites like an active layer or material, but the core behavioral context is well covered.

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

Conciseness5/5

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

Two sentences carry all the essential information with no filler. The key scoping fact (WORLD space, closed, camera-independent) is front-loaded, and the second sentence adds needed ArmorPaint-specific context about the coordinate system.

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

Completeness4/5

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

For a single-parameter tool with no output schema, the description is nearly complete: it defines the stroke path space, the closure behavior, the camera-independence rationale, the Z-up convention, and a helper tool for bounds. The main gap is not stating whether an active object/layer/material must already be selected, but this is minor given the simplicity of the tool.

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

Parameters4/5

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

The schema already covers the points array at 100%, so the baseline is 3. The description adds value by explaining the coordinate system ('ArmorPaint's world is Z-up') and pointing to ap_get_main_object for object bounds, which helps the agent interpret the parameter values correctly.

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

Purpose5/5

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

The description names a specific verb and resource ('Paint a stroke in WORLD space and close it') and immediately distinguishes it from the sibling ap_paint_stroke by emphasizing camera independence. This is enough for an agent to know exactly what this tool does and why it differs.

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

Usage Guidelines4/5

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

It clearly indicates when this tool is preferred: 'reliable choice for scripted painting' because it is camera-independent. It does not explicitly name ap_paint_stroke as the alternative for camera-space strokes, but the world-space contrast makes the usage context clear.

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

ap_pingA

Round-trip health check: sends a real request through the file mailbox and returns the bridge's app time, window title and current project path. Confirms the whole path works end to end, unlike ap_bridge_status which only reads the heartbeat.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral burden. It discloses that a real request is sent, what data is returned, and that it validates the end-to-end path. It does not mention failure behavior or side effects, but for a health-check ping this is minor and the core behavior is well described.

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

Conciseness5/5

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

Two tight sentences with no wasted words. The main purpose is front-loaded, the return values are specified, and the comparison to a sibling is included in the second sentence. Every phrase earns its place.

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

Completeness5/5

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

For a simple, parameterless ping tool, the description is complete: it says what the tool does, what it returns, and how it differs from the closest sibling. No output schema exists, but the explicitly listed return fields are sufficient for an agent to interpret the result.

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

Parameters4/5

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

The tool has zero parameters, so there is no parameter documentation burden. The description still adds value by explaining what the no-argument invocation returns, which is more than the empty schema can provide.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Round-trip health check' with a clear mechanism ('sends a real request through the file mailbox') and defined return values ('app time, window title and current project path'). It also explicitly distinguishes itself from the sibling ap_bridge_status, making its purpose unmistakable.

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?

The description explicitly names the alternative ap_bridge_status and draws the comparison: ap_ping confirms the whole path works end to end, while the sibling 'only reads the heartbeat.' This gives an agent a clear decision rule for which tool to invoke when checking connectivity.

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

ap_project_get_infoA

Project-level state: file path, base path, format version, BGRA flag, environment map name/strength/angle, and camera FOV.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral disclosure burden. It does disclose the substance of what the tool returns, but it does not explicitly state that the operation is read-only, non-destructive, or what happens if no project is open. The get_info name partially mitigates this, but the description itself adds limited behavioral detail beyond the field list.

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

Conciseness5/5

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

The description is a single, front-loaded sentence that immediately establishes the scope ('Project-level state') followed by a compact list of returned fields. Every word adds information and there is no filler or redundancy.

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

Completeness4/5

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

For a zero-parameter getter with no output schema, the description does a good job of explaining what the tool returns by naming the relevant project state fields. It does not mention error conditions or output formatting, but these are minor for such a simple read-only information tool.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline of 4 applies. There are no parameter descriptions needed, and the description does not omit or obscure any parameter-related meaning.

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

Purpose4/5

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

The description clearly identifies the tool as returning project-level state and enumerates the specific information included: file path, base path, format version, BGRA flag, environment map settings, and camera FOV. It is distinguishable from sibling tools like ap_get_app_info and ap_get_context by its explicit project scope, though it relies on the tool name for the verb.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus alternatives such as ap_get_app_info, ap_get_context, or ap_get_config. There are no explicit conditions, preconditions, or exclusion statements, leaving the agent to infer usage from the name and scope.

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

ap_project_list_scriptsA

List script assets attached to the project. DEGRADED: project_t.script_datas is a snapshot written at save/load, so it is empty in a fresh project and stale after changes made this session.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior5/5

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

The description goes beyond a simple listing by disclosing that the tool operates in a degraded mode, returning a snapshot that may be empty or stale. This is a significant behavioral trait that helps manage expectations, and no annotations were provided to offset this.

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

Conciseness5/5

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

The description is concise, consisting of two sentences that deliver the core purpose and a critical caveat without unnecessary verbosity. It is well-structured and front-loads the primary action.

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

Completeness5/5

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

Given the tool has no parameters and no output schema, the description provides sufficient context by explaining the tool's purpose and the degraded state of the data. This covers all essential aspects an agent needs to decide when and how to call it.

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

Parameters4/5

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

The tool has zero parameters, so the schema covers 100% of the input surface. Since there are no parameters, the description cannot add meaning beyond what the schema already conveys, warranting the baseline score of 4.

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

Purpose5/5

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

The description clearly states the tool's function: listing script assets attached to the project. It is specific about the resource and action, and the additional caveat about degraded mode further clarifies the tool's purpose without ambiguity.

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

Usage Guidelines3/5

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

The description provides an implied usage hint by noting the degraded snapshot behavior, which indirectly tells users when the data may be unreliable. However, it does not explicitly mention alternatives or when to prefer this tool over others, so guidance is only implicit.

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

ap_project_list_texture_assetsA

List the names of texture assets imported into the project. This one is LIVE (it reads project_t.assets), unlike the material/mesh lists which are save-time snapshots.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses that the tool reads live project data rather than a snapshot, and implies a read-only operation. It does not discuss return details, but for a zero-parameter list tool this is adequate.

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

Conciseness5/5

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

Two concise sentences; the main statement is front-loaded and the second sentence adds a valuable distinction without waste.

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

Completeness4/5

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

For a simple, parameterless listing tool, the description covers what it returns ('names of texture assets'), the source ('project_t.assets'), and its live vs snapshot nature. It is complete enough for an agent to select and invoke it correctly.

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

Parameters4/5

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

The tool has no parameters, so the schema already fully describes input. The description adds no parameter detail, which is unnecessary here; baseline 4 applies.

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 ('List') and resource ('names of texture assets imported into the project'). The 'unlike material/mesh lists' clause distinguishes it from sibling list tools.

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

Usage Guidelines4/5

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

Explicitly marks this tool as the live source ('reads project_t.assets') and contrasts it with material/mesh list snapshots, giving the agent a clear selection criterion. It names the alternative category but not exact sibling tool names.

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

ap_project_newA

Start a new, empty project. Discards the current project WITHOUT prompting and without saving — call ap_project_save first if the work matters.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states the destructive consequence: 'Discards the current project WITHOUT prompting and without saving.' This is exactly the kind of critical behavioral trait an agent needs before invoking the tool. It also provides a clear mitigation: call ap_project_save first.

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

Conciseness5/5

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

The description is two sentences with no filler. The primary action is front-loaded, and the critical warning follows immediately. Each sentence earns its place; there is no redundant or vague wording.

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

Completeness5/5

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

For a zero-parameter, no-output-schema tool, the description is fully complete. It explains the action, the destructive side effect, the lack of prompting, and the necessary precaution. An agent has everything required to decide whether and how to invoke the tool safely.

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

Parameters4/5

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

The tool has zero parameters and the schema coverage is 100%, so there is nothing for the description to add regarding parameter meaning. The baseline of 4 applies because no parameter documentation is needed. The description sensibly focuses on behavior rather than parameters.

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

Purpose5/5

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

The description states a specific verb and resource: 'Start a new, empty project.' It also distinguishes this from related project operations by noting it discards the current project, making it clear this is not ap_project_open or ap_project_save. The purpose is immediately understandable and unambiguous.

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

Usage Guidelines4/5

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

The description gives clear context: use this when starting fresh and abandoning the current project. It also tells the agent to call ap_project_save first if the work matters, which is explicit when-to-use guidance for a destructive action. It does not explicitly contrast with ap_project_open, but the behavior described is sufficient to route an agent correctly.

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

ap_project_openA

Open an existing .arm project file. Discards the current project without prompting.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesProject .arm file. Absolute path, forward slashes (backslashes are converted for you).

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral burden, and it discloses the most critical trait: "Discards the current project without prompting." This tells the agent the operation is destructive and irreversible with respect to the current session state. It omits permissions, error behavior, and return values, but the single most important runtime consequence is explicit.

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

Conciseness5/5

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

Two short sentences with zero filler, and each earns its place: the action is front-loaded first, then the destructive consequence. No redundant restatement of the tool name or schema content.

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

Completeness4/5

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

For a single-parameter open command with full schema coverage, the description covers both the action and the critical side effect. Remaining gaps—no return/error behavior and no explicit "save before opening" advisory—are minor and do not mislead an agent about the tool's core behavior.

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

Parameters3/5

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

Schema description coverage is 100% and the path parameter is already richly documented (absolute path, forward slashes, backslash conversion). The description's ".arm" mention reinforces the file type already present in the schema but adds no new parameter-level semantics beyond it. Baseline 3 applies because the schema carries the weight.

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—"Open"—and resource—"an existing .arm project file." The word "existing" plus the open action clearly distinguishes this from siblings like ap_project_new, ap_project_save, and ap_project_save_as, so an agent can tell it apart without opening any schema.

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

Usage Guidelines2/5

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

Gives no guidance on when to use this tool versus alternatives. It never advises saving the current project first (a natural precondition given the destructive behavior), nor does it name conditions where ap_project_new or other project tools would be preferable. The discard warning implies caution but stops short of actionable usage direction.

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

ap_project_saveA

Save the current project to its existing path. Fails with code 'no_project' if the project has never been saved — use ap_project_save_as to give it a path first. THE SAVE IS DEFERRED: ArmorPaint queues the write for the next frame, so a successful reply means 'queued', not 'written'. Call ap_fs_stat on the path if you need proof it landed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden and does so excellently. It discloses the critical deferred-save behavior ('queued' vs 'written'), the specific failure code 'no_project', and the recommended way to confirm the write actually landed.

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

Conciseness5/5

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

Three sentences with no wasted words. The core purpose comes first, followed by the failure condition and alternative, then the critical deferred-save caveat. Each sentence adds necessary information and the most important behavioral warning is prominently capitalized.

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

Completeness5/5

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

For a zero-parameter save operation with no annotations and no output schema, the description covers what an agent needs: the operation, the failure mode, the sibling alternative, the deferred nature, and a verification path. Nothing essential is missing.

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

Parameters4/5

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

The tool has zero parameters and the schema is trivially fully covered, so there is no parameter documentation burden. The description still adds meaningful semantic context by explaining that 'the current project' and 'its existing path' are the implicit inputs, which is more than the empty schema provides.

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

Purpose5/5

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

The description states a specific verb ('Save'), a clear resource ('the current project'), and a precise target ('its existing path'). It also distinguishes itself from ap_project_save_as by explicitly naming when that sibling should be used instead.

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?

It provides explicit when-to-use guidance: use this tool when the project already has a path, and use ap_project_save_as first if it has never been saved. It also recommends ap_fs_stat as a verification step after saving, giving the agent a concrete follow-up action.

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

ap_project_save_asA

Set the project file path and save to it (project_filepath_set + project_save). Like ap_project_save, the write is DEFERRED to the next frame, so the reply confirms the path was set and the save queued — verify with ap_fs_stat.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesDestination .arm file. Absolute path, forward slashes (backslashes are converted for you).

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the burden of behavior disclosure. It clearly explains that the write is DEFERRED to the next frame, that the reply only confirms the path and queued save, and that verification should be done via ap_fs_stat. This meaningfully describes asynchronous side effects beyond the schema.

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

Conciseness5/5

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

The description is two sentences with no filler. It front-loads the core action, then adds the critical deferral behavior and verification pointer in compact form.

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

Completeness4/5

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

For a single-parameter tool with no output schema, the description gives enough context to call it correctly: what action happens, that it is deferred, what the reply means, and how to verify success. It does not detail error cases or exact return payload, but the provided guidance is sufficient for correct invocation.

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

Parameters3/5

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

Schema coverage is 100%: the single required path parameter is already documented with format guidance ('.arm file', absolute path, forward slashes, backslash conversion). The description adds nothing further about the parameter, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Set the project file path and save to it,' clearly defining a save-as operation. It distinguishes itself from the sibling ap_project_save by indicating it sets a new path in addition to saving.

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

Usage Guidelines4/5

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

It names the related sibling ap_project_save and contrasts the behavior, implying this tool is for saving to a new/chosen path while ap_project_save likely saves to the current path. It also tells the agent to verify the eventual result with ap_fs_stat, giving practical follow-up guidance, though it stops short of explicit when-to-use versus when-not-to-use.

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

ap_quitA

Quit ArmorPaint. Unsaved work is LOST — save first. Requires confirm=true. The app usually exits before it can commit a reply, so a 'no reply' result here is normal and the response says whether the request was picked up.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be true. Guards against an accidental shutdown.

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and excels: it discloses the destructive consequence ('Unsaved work is LOST'), provides mitigation ('save first'), and explains the unusual exit behavior (app exits before committing a reply, so 'no reply' is normal). This is exemplary behavioral disclosure.

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

Conciseness5/5

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

Three sentences with zero waste: the action is front-loaded, the critical warning follows immediately, and the reply-behavior caveat closes it. Every sentence earns its place and the structure orders information by importance (action → danger → expected response).

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

Completeness5/5

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

Despite having no output schema and no annotations, the description covers everything an agent needs: the destructive precondition, the required parameter value, and the expected reply behavior. Nothing is missing for correct invocation of this simple, one-parameter tool.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents confirm as 'Must be true. Guards against an accidental shutdown.' The description reinforces 'Requires confirm=true' but adds no new semantic detail beyond what the schema provides, so the baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb+resource, 'Quit ArmorPaint,' which unambiguously states the tool's sole purpose. It is clearly differentiated from all 57 siblings, which cover painting, exporting, filesystem, and project operations — none of which involve terminating the application.

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

Usage Guidelines4/5

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

The description gives clear operational context: save work first, and confirm=true is mandatory. While it doesn't name an alternative tool explicitly, no sibling provides a quitting alternative, and 'save first' implicitly points to the save-family tools. This is clear guidance with no exclusions needed.

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

ap_read_image_fileA

Read an image file from THIS server's filesystem and return it as an image, so you can look at what ArmorPaint exported. Answered locally — no round trip, and it works while ArmorPaint is closed. Pair it with ap_export_textures: export, then read one of the reported files. PNG/JPEG/GIF/WEBP/BMP only (EXR cannot be displayed), up to 6 MB.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesImage file to read. Absolute path, forward slashes (backslashes are converted for you).
max_bytesNoRefuse files larger than this. Default and ceiling 6000000.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses that the read is local, involves no round trip, works while ArmorPaint is closed, and enforces format and size limits. It does not detail error handling, but covers the key operational traits.

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

Conciseness5/5

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

Three focused sentences: purpose first, then workflow, then constraints. No filler; every sentence adds actionable information.

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

Completeness4/5

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

For a simple read-only tool, the description covers purpose, workflow, format/size limits, and the local/no-round-trip behavior. It lacks explicit error-case handling, but the core information an agent needs to call and interpret the tool is present.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds global format and size constraints, but no per-parameter detail beyond what the schema already provides.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Read an image file from THIS server's filesystem and return it as an image.' It immediately frames the use case as inspecting ArmorPaint exports, which clearly distinguishes it from filesystem listing tools like ap_fs_list.

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

Usage Guidelines4/5

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

Provides clear usage context by pairing with ap_export_textures: 'export, then read one of the reported files.' It also notes the tool works while ArmorPaint is closed. It does not explicitly exclude alternatives, but the intended workflow is evident.

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

ap_select_toolA

Select the active tool: bake, blur, brush, clone, colorid, cursor, decal, eraser, fill, material, particle, picker, select, text. The selection is read back from the context so the result confirms it took effect.

ParametersJSON Schema
NameRequiredDescriptionDefault
toolYesTool name.

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral burden. It explicitly discloses that the selection is 'read back from the context' so the result confirms the change took effect, which clarifies the tool's confirmation behavior beyond a bare 'select' command. It does not cover side effects like persistence or permission requirements, but for a simple active-tool setter this is reasonably transparent.

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

Conciseness5/5

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

The description is two sentences with no filler. The first sentence states the action and enumerates the valid values in a list, and the second clarifies the confirmation behavior. Every word earns its place.

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

Completeness4/5

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

This is a low-complexity tool with one required parameter, no output schema, and no annotations. The description explains what it does, what values are valid, and how the result confirms success. A small gap is not stating any consequences of changing the active tool, but for this simple setter the description is otherwise sufficient.

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

Parameters3/5

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

Schema coverage is 100%: the only parameter 'tool' has a full enum and a description saying 'Tool name.' The description simply repeats the enum values and does not add deeper semantics about what each tool does, but the tool names are self-explanatory. The baseline of 3 applies because the schema already documents the parameter well.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Select the active tool', followed by the complete list of valid tool values. The list and the 'active tool' phrasing make it clear this is about switching the current context tool, which distinguishes it from sibling tools like ap_set_brush or ap_material_select.

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

Usage Guidelines3/5

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

The description implies that this tool is used when the agent needs to change the active tool, but it does not explicitly contrast it with related selectors such as ap_set_brush or ap_material_select. There is no when-to-use or when-not-to-use guidance beyond the obvious 'select the active tool' intent.

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

ap_set_brushA

Set brush parameters on the painting context. Omitted values are left alone. These are direct context writes, so they take effect immediately for the next stroke.

ParametersJSON Schema
NameRequiredDescriptionDefault
angleNoBrush angle in degrees.
scaleNoBrush pattern scale.
radiusNoBrush radius (context units, typically 0..2).
opacityNoBrush opacity 0..1.
blendingNoBlend mode index.
hardnessNoBrush hardness 0..1.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does well by revealing that these are direct context writes, immediate in effect, and that omitted values are preserved. It does not discuss potential failure states or prerequisites, but the disclosed partial-update semantics are valuable.

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

Conciseness5/5

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

Two short sentences front-load the action and immediately explain the two most important behavioral nuances: partial updates and immediate application. No filler or repetition of schema details.

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

Completeness4/5

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

For a simple context setter, the combination of the explicit schema and the description covers what values to provide and how they apply. It could be more complete by noting prerequisites such as requiring an active painting context, but nothing critical about the core behavior is missing.

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

Parameters4/5

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

The schema already covers all 6 parameters with ranges and units, so the baseline is 3. The description adds meaningful merge semantics beyond the schema by stating that omitted values are left alone, which matters for a tool with zero required parameters.

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

Purpose5/5

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

The description names a specific verb and resource ('Set brush parameters on the painting context') and is distinct from painting-execution siblings like ap_paint_stroke and ap_paint_stroke_world. It also clarifies the scope of the operation as context configuration, not a stroke operation.

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

Usage Guidelines4/5

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

It gives clear temporal context ('take effect immediately for the next stroke'), which implies it should be called before painting. It does not explicitly name alternatives or when-not-to-use conditions, so it stops short of a 5.

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

ap_set_configA

Change application preferences. Only the listed fields are writable; anything else in ArmorPaint's preferences is not exposed to plugins. layer_res is the DEFAULT resolution for new layers — changing it does not resize existing ones.

ParametersJSON Schema
NameRequiredDescriptionDefault
themeNoTheme name.
keymapNoKeymap preset name.
window_hNoWindow height in pixels.
window_wNoWindow width in pixels.
workflowNoWorkflow index.
layer_resNoDefault layer resolution for NEW layers (e.g. 2048).
workspaceNoWorkspace index.
brush_liveNoLive brush preview.
camera_fovNoCamera field of view in radians.
undo_stepsNoUndo history depth.
window_scaleNoUI scale factor, e.g. 1.0 or 1.5.
material_liveNoLive material preview.
node_previewsNoNode thumbnails in the node editor.
rp_supersampleNoRender supersampling factor, e.g. 1.0 or 2.0.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It clearly signals mutation, narrows the writable surface, and discloses the non-obvious layer_res behavior that existing layers are not resized. It does not mention persistence or restart requirements, but it covers the most likely misuse.

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

Conciseness5/5

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

Two sentences with no filler: the purpose is front-loaded, the writable-fields restriction follows, and the layer_res caveat is last. Every clause earns its place.

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

Completeness4/5

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

The schema documents every parameter, so the description only needs to supply scope and caveats, which it does well. It could add whether changed settings persist or require a restart, but an agent can invoke it correctly with the information given.

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?

The input schema already describes all 14 parameters at 100% coverage, so the baseline is 3. The description only adds one behavioral clarification about layer_res beyond what the schema states, which is helpful but marginal.

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

Purpose5/5

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

The description uses a specific verb and resource, 'Change application preferences,' and scopes it to ArmorPaint. This clearly distinguishes it from sibling read tools like ap_get_config.

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

Usage Guidelines4/5

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

'Change application preferences' gives a clear when-to-use context. The caveat that only listed fields are writable also sets a hard boundary, though it does not explicitly name alternatives such as ap_get_config for reading values.

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

ap_set_display_channelA

Set what the 3D viewport displays: base_color, emission, height, lit, mask, material_id, metallic, none, normal_map, object_id, object_normal, occlusion, opacity, path_trace, roughness, subsurface, texcoord. 'lit' is the normal shaded view; the others isolate a channel or a debug output.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesDisplay mode name.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full disclosure burden. It explicitly says the tool changes the 3D viewport display and clarifies that 'lit' is the normal shaded view while other modes isolate a channel or debug output. This meaningfully describes the tool's behavior, though it does not mention side effects or persistence, which are less critical for a viewport display switch.

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

Conciseness5/5

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

The description is two sentences with no fluff. It front-loads the action and target, exhaustively lists accepted values, and then provides the key clarification about 'lit' versus the other modes. Every word earns its place.

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

Completeness5/5

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

For a single-parameter setter with an exhaustive enum and no output schema, this description is complete. It tells the agent what the tool changes, what values are accepted, and what those values mean in context, so the agent can call it correctly without additional information.

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

Parameters4/5

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

The schema already documents every enum value with 100% coverage, so the baseline is 3. The description adds value by explaining that 'lit' is the normal shaded view and all other modes isolate a channel or debug output, giving the agent semantic understanding beyond the raw enum list.

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

Purpose5/5

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

The description uses a specific verb ('Set') and identifies the exact resource ('what the 3D viewport displays') before enumerating all valid modes. This clearly distinguishes it from sibling tools like ap_capture_viewport or ap_set_config, which have different purposes.

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

Usage Guidelines3/5

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

The description implies when to use the tool—whenever you need to change the viewport display channel—and explains the semantics of 'lit' versus other modes. However, it does not explicitly state when not to use it or name alternative tools for similar tasks, so the guidance is inferred rather than stated.

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

ap_set_envmap_paramsA

Set environment map strength and/or rotation angle (direct writes to project_t).

ParametersJSON Schema
NameRequiredDescriptionDefault
angleNoEnvmap rotation in radians.
strengthNoEnvmap strength multiplier, e.g. 1.0.

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are present, so the description must carry safety and side-effect disclosure. It does disclose a concrete side effect: 'direct writes to project_t', indicating immediate mutation of project state. However, it does not comment on reversibility, whether the project must be saved, or whether this affects rendering or undo. This is partial transparency.

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

Conciseness5/5

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

A single sentence, front-loaded with the action and listing both parameters. The parenthetical side-effect note is useful and does not bloat the definition.

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

Completeness3/5

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

For a two-optional-parameter setter, the description plus schema cover the what and the parameters. However, with no annotations and no output schema, it omits whether a project must be open, what the operation returns, and whether writes require a save to persist. The cryptic 'project_t' reference also assumes internal knowledge.

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

Parameters3/5

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

Schema coverage is 100%, and the schema already describes angle as radians and strength as a multiplier with a minimum. The description adds no parameter details beyond restating the two properties in prose. Baseline 3 applies.

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

Purpose5/5

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

The description uses a specific verb ('Set') and resource ('environment map'), and explicitly names the two mutable aspects (strength, rotation angle). It reads distinctly from siblings like ap_import_envmap and ap_set_config, so an agent can distinguish it without opening the schema.

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

Usage Guidelines3/5

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

The description states the operation directly, so an agent can infer when to use it. However, it does not mention any alternatives or exclusions, nor prerequisites like an open project or an imported envmap. With no explicit when-to-use guidance, it relies on the tool name and sibling context.

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

ap_shape_addA

Add a built-in primitive to the scene (cube, sphere, plane, cylinder, cone, torus, the bevelled/shared-UV cube variants, the 2048-poly plane/sphere, or 'empty'). Use ap_shape_list for this build's exact names.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesShape name. Typically one of: cone cube cube_bevel cube_bevel_shared_uvs cube_shared_uvs cylinder empty torus plane plane_2048 sphere sphere_2048.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden. It makes the action's additive nature clear, lists special values like 'empty', and warns that exact names are build-specific. It does not mention return values or preconditions like an open project, but for a simple create-primitive operation that is a minor gap.

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

Conciseness5/5

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

Two sentences with no wasted words. The action and object are front-loaded, and the alternative lookup instruction is placed efficiently at the end.

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

Completeness4/5

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

The tool is simple: one required parameter, no output schema, and no nested objects. The description plus schema are nearly sufficient for correct invocation. A small gap is the absence of any statement about return values or error behavior if an invalid name is passed.

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

Parameters4/5

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

The schema already covers the single parameter with 100% coverage, so the baseline is 3. The description adds value by emphasizing that names are build-specific and by pointing to ap_shape_list for authoritative values, which helps the agent supply a valid parameter.

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

Purpose5/5

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

The description uses a specific verb ('Add'), a clear resource ('a built-in primitive'), and scopes the action to 'the scene'. It lists the available shapes and distinguishes itself from ap_shape_list by clarifying it creates rather than lists.

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

Usage Guidelines4/5

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

It gives a clear, actionable alternative: use ap_shape_list for this build's exact names. This is strong contextual guidance for choosing whether to call this tool or its sibling, though it does not enumerate exclusions for other potentially related tools like ap_append_mesh.

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

ap_shape_listA

List the built-in primitive shapes that ap_shape_add accepts, from the running build. Typically: cone cube cube_bevel cube_bevel_shared_uvs cube_shared_uvs cylinder empty torus plane plane_2048 sphere sphere_2048.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral disclosure burden. It states results come 'from the running build,' signaling the list is dynamic, and the word 'Typically' warns the enumerated values are not guaranteed to be exhaustive. It stops short of describing the exact return format, but for a parameterless list tool this is sufficient.

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

Conciseness5/5

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

Two sentences with no wasted words. The first sentence states the verb and resource, and the second provides concrete typical values. The structure is front-loaded and every sentence contributes useful information.

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

Completeness5/5

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

Given zero parameters and no output schema, this description is complete for practical use. It communicates the return concept (a list of built-in primitive shapes), the source (the running build), and representative examples. An agent can call this tool correctly and interpret the result without further clarification.

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

Parameters4/5

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

The tool has zero parameters, so the baseline for this dimension is 4. There is no parameter documentation needed, and the description focuses instead on the output and relationship to ap_shape_add.

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

Purpose5/5

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

The description opens with a specific action and resource: 'List the built-in primitive shapes that ap_shape_add accepts.' This clearly ties it to the sibling ap_shape_add tool and distinguishes it from other list tools like ap_fs_list or ap_node_list. The scope is unambiguous.

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

Usage Guidelines4/5

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

The description makes the usage context obvious: use this tool to discover valid shape names to pass to ap_shape_add. It does not name alternatives or exclusions, but no sibling tool offers this capability, so the intended 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.

ap_show_messageA

Show a message to the user in ArmorPaint: a transient toast by default, or a modal box. Prefer the toast — a modal blocks ArmorPaint's UI thread, which also stalls the bridge until the user dismisses it.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesMessage text.
modalNoShow a blocking message box instead of a toast.
titleNoTitle, modal only.ArmorPaint MCP
secondsNoToast duration in seconds.

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the disclosure burden. It goes beyond the schema by revealing that the toast is transient, the modal blocks ArmorPaint's UI thread, and the bridge stalls until dismissal. This is meaningful behavioral context beyond the parameter defaults.

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

Conciseness5/5

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

Two sentences, front-loaded with the core function and immediately followed by the important caveat and recommendation. Every sentence earns its place without redundancy.

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

Completeness4/5

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

For a simple message-display tool, the description plus the fully covered schema provide enough to call it correctly. The key risk, modal-induced bridge stalling, is disclosed. No output schema exists, so not detailing return values is acceptable.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all four parameters. The description adds context about toast vs. modal behavior but does not enrich individual parameter meaning beyond what the schema already provides, so the baseline of 3 is appropriate.

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

Purpose4/5

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

The description states a clear verb and resource: showing a message to the user in ArmorPaint, with toast or modal variants. It is clearly distinct from the many painting/importing tools, though it does not explicitly differentiate itself from the closely related ap_console_write sibling.

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

Usage Guidelines4/5

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

The description explicitly advises preferring the toast and warns that a modal blocks the UI thread and stalls the bridge until dismissed. This gives clear when-to-use guidance for the modal option, but it does not address when to choose this tool over ap_console_write for message-like output.

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. Dates show when Glama detected each change.

  1. 58 tool updatesv1.0.0
    • First observedap_append_mesh
    • First observedap_bridge_set_enabled
    • First observedap_bridge_status
    • First observedap_capture_to_project
    • First observedap_capture_viewport
    • First observedap_console_write
    • First observedap_export_material
    • First observedap_export_material_bake
    • First observedap_export_mesh
    • First observedap_export_textures
    • First observedap_fill_layer
    • First observedap_fs_list
    • First observedap_fs_mkdir
    • First observedap_fs_stat
    • First observedap_get_app_info
    • First observedap_get_config
    • First observedap_get_context
    • First observedap_get_main_object
    • First observedap_get_object
    • First observedap_import_asset
    • First observedap_import_envmap
    • First observedap_material_assign
    • First observedap_material_create
    • First observedap_material_delete
    • First observedap_material_get_active
    • First observedap_material_list
    • First observedap_material_select
    • First observedap_material_set_channels
    • First observedap_material_update
    • First observedap_node_add
    • First observedap_node_connect
    • First observedap_node_disconnect
    • First observedap_node_list
    • First observedap_node_remove
    • First observedap_node_set_value
    • First observedap_object_duplicate
    • First observedap_object_set_transform
    • First observedap_object_set_visible
    • First observedap_paint_stroke
    • First observedap_paint_stroke_world
    • First observedap_ping
    • First observedap_project_get_info
    • First observedap_project_list_scripts
    • First observedap_project_list_texture_assets
    • First observedap_project_new
    • First observedap_project_open
    • First observedap_project_save
    • First observedap_project_save_as
    • First observedap_quit
    • First observedap_read_image_file
    • First observedap_select_tool
    • First observedap_set_brush
    • First observedap_set_config
    • First observedap_set_display_channel
    • First observedap_set_envmap_params
    • First observedap_shape_add
    • First observedap_shape_list
    • First observedap_show_message

TDQS

A3.6/5.0

Scored across 58 tools

Disambiguation4/5

Most tools map to a distinct resource/action, and the descriptions aggressively disambiguate near-pairs like ap_capture_to_project vs ap_capture_viewport and ap_paint_stroke vs ap_paint_stroke_world. A handful of similarly named tools (ap_export_material vs ap_export_material_bake, ap_bridge_status vs ap_ping) could still be misselected without reading the details.

Naming Consistency3/5

All names are lowercase snake_case with an ap_ prefix, but the verb position is inconsistent: action-first names (ap_get_config, ap_export_textures, ap_set_brush) sit alongside resource-first names (ap_material_create, ap_project_open, ap_object_set_transform). The names remain readable, but the ordering convention is not uniform.

Tool Count2/5

At 58 tools, this is a very large surface and far beyond the 3-15 tool sweet spot. The ArmorPaint domain is broad and each tool corresponds to a real plugin binding, but many related operations could be consolidated into higher-level tools without losing capability.

Completeness3/5

The tool set covers project lifecycle, materials, node graphs, objects, painting, import/export, and bridge health. However, there are notable documented gaps that matter for real workflows: no layer create/delete/mask/opacity/blend, no object enumeration, no undo/redo, and degraded material/project listings.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI-driven 2D drawing and animation in Blender, allowing MCP clients to create Grease Pencil drawings, keyframes, materials, and renders directly inside a running Blender instance.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI models to directly control a local Krita instance by inspecting real canvas previews, managing documents and layers, importing and masking generated images, inpainting, painting with the brush engine, checkpointing, and exporting KRA/PNG files.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables agents to observe, batch, script, recover, bake, and export Adobe Substance 3D Painter scenes through a Model Context Protocol server with specialist schemas and persistent tooling.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables MCP clients to create and edit pixel art and animations through a local-first editor, sharing the same project, editing commands, and undo history with the GUI.
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/baktubak/armorpaint-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server