Skip to main content
Glama
zinin

sketchup-mcp2

by zinin

MCP Server for SketchUp

test

Connect Claude (or any MCP-aware AI client) to SketchUp for prompt-driven 3D modeling.

Two-process bridge:

  • Python MCP server (sketchup-mcp2 on PyPI) — exposes typed tools to the LLM via the Model Context Protocol.

  • Ruby SketchUp extension — runs a TCP server inside SketchUp and executes commands against the live model.

Quickstart

1. Install the SketchUp extension

Either grab the latest .rbz from the Releases page or build it from source:

gem install --user-install rubyzip
(cd mcp_for_sketchup && ruby package.rb)
# → mcp_for_sketchup/mcp_for_sketchup_v<version>.rbz

In SketchUp: Window → Extension Manager → Install Extension, pick the .rbz, restart SketchUp. The plugin ships with eval_ruby — arbitrary Ruby execution inside SketchUp — enabled by default; uncheck Enable Ruby evaluation in Plugins → MCP Server → Settings... to close the gate.

2. Start the server inside SketchUp

Plugins → MCP Server → Start Server — by default listens on 127.0.0.1:9876.

3. Configure your MCP client

For Claude Code / Claude Desktop, add to .mcp.json (or claude_desktop_config.json):

{
  "mcpServers": {
    "sketchup": {
      "command": "uvx",
      "args": ["sketchup-mcp2"],
      "env": {
        "SKETCHUP_MCP_HOST": "127.0.0.1",
        "SKETCHUP_MCP_PORT": "9876",
        "SKETCHUP_MCP_TIMEOUT": "60",
        "SKETCHUP_MCP_LOG_LEVEL": "INFO"
      }
    }
  }
}

uvx will pull sketchup-mcp2 from PyPI automatically — install uv if you don't have it.

That's it. Ask Claude things like "create a 1.2 × 0.8 m oak dining table" and watch it happen.

Related MCP server: SketchupMCP

Features

Tool catalogue

Category

Tools

Geometry

create_component (cube / cylinder / cone / sphere), delete_component, transform_component — all dimensions in mm; position is an absolute bbox-min target

Materials

set_material — named colors and hex #rrggbb

Booleans

boolean_operation — union / difference / intersection

Edge ops

chamfer_edge, fillet_edge — distance/radius in mm, segments configurable

Joinery

create_mortise_tenon, create_dovetail, create_finger_joint

Export

export_scene — skp / obj / dae / stl / png / jpg

Introspection

get_model_info, list_components, get_component_info, find_components, list_layers, create_layer, get_selection, get_version

View

get_viewport_screenshot — captures the viewport as a PNG (returns an MCP Image + JSON metadata text block; optional view_preset / style / zoom_extents; requires SketchUp 2026+)

Lifecycle

undo

Escape hatch

eval_ruby — arbitrary Ruby inside SketchUp for anything not covered above. Enabled by default; close the gate in the Settings dialog — see Configuration.

All dimensions in millimeters; angles in degrees. Every entity-returning handler also responds with bbox_mm so the LLM can re-locate entities by bounding box if their IDs go stale after destructive ops.

Capabilities

  • Multi-client support — N concurrent MCP clients can be connected at once (e.g. Claude Desktop + a smoke-test script + your own Python notebook). Operations are still serialised on the SketchUp UI thread; frames are dispatched in a single global FIFO ordered by decode arrival.

  • One-time version handshake — every TCP connection begins with a JSON-RPC hello carrying client_version; the server validates against its supported range and replies with server_version + client_id. Incompatible pairs surface immediately as IncompatibleVersionError and the socket is closed.

  • Atomic undo — every mutating handler wraps the edit in model.start_operation/commit_operation, so a single Edit → Undo rolls back the whole call.

  • MCP prompt sketchup_modeling_strategy — surfaced in MCP-aware clients' slash menu; teaches the model project conventions (mm units, typed-tools-vs-eval_ruby, pitfalls like reversed Group#subtract).

  • Settings dialogPlugins → MCP Server → Settings... for host / port / log level. Log level applies immediately; host/port changes prompt for a restart.

Configuration

Python side (env vars in .mcp.json)

Variable

Default

Description

SKETCHUP_MCP_HOST

127.0.0.1

Where to connect to the SketchUp extension

SKETCHUP_MCP_PORT

9876

TCP port

SKETCHUP_MCP_TIMEOUT

60

Per-tool-call timeout (seconds)

SKETCHUP_MCP_LOG_LEVEL

INFO

DEBUG / INFO / WARN / ERROR

Ruby side (Settings dialog inside SketchUp)

Open Plugins → MCP Server → Settings... to change Host, Port, Log Level, the Ruby evaluation gate, and log-to-file options. Values persist in SketchUp's preferences under section MCPforSketchUp. No environment variables are read on the Ruby side.

The Ruby side logs at WARN by default, so it stays quiet in SketchUp's shared Ruby console; any line it does print is prefixed [MCPforSU] with a UTC timestamp. Enable Log to file to mirror every line to a UTF-8 log file in addition to the console (Plugins → MCP Server → Show Log opens it). The file is written append-only — there is no automatic rotation or size cap, so rotate or clean it up yourself for long-lived sessions.

eval_ruby — the arbitrary-Ruby escape hatch — is enabled by default. Uncheck Enable Ruby evaluation in the Settings dialog to close the gate; the setting persists across SketchUp restarts, and re-enabling it pops a blocking confirmation spelling out the risk (arbitrary Ruby ⇒ full filesystem / network / shell access). With the gate closed, a client's eval_ruby call comes back as a plain message telling the user how to re-open it.

Per-call review. Open gate or not, the exact Ruby a client sends stays visible in your MCP client — Claude Desktop and Claude Code display every tool call's arguments and let you approve or deny each one before it runs, so you can review each snippet case by case. (That per-call prompt is skipped only if you opt out of approvals, e.g. Claude Code's --dangerously-skip-permissions.)

⚠ Security warning: binding the host to 0.0.0.0 exposes the MCP server — including eval_ruby, which runs arbitrary Ruby inside SketchUp — to the entire local network with no authentication. Use only on trusted networks (host → VM, isolated lab). For multi-machine setups consider a loopback SSH tunnel instead.

Examples

Things you can ask Claude:

  • "Create a simple dining table — 1.2 × 0.8 m, 760 mm tall, oak finish"

  • "Highlight every component smaller than 100 mm in any dimension"

  • "Make the selected component red, then move it 100 mm up"

  • "Export the scene as STL for 3D printing"

  • "Build a small arts-and-crafts cabinet using eval_ruby with dovetails"

For richer Ruby recipes that drive the SketchUp API directly — framed walls, gable/hip roofs, joist arrays, follow_me extrusions, world-space transforms, common pitfalls — see docs/sketchup-ruby-cookbook.md.

Working examples and load tests live in examples/:

  • smoke_check.py — 25-step end-to-end verification of every tool category.

  • smoke_multi_client.py — concurrent multi-client load test.

Architecture

Claude (MCP client)
   ↕  MCP (stdio)
Python MCP server  (FastMCP)               src/sketchup_mcp/
   ↕  TCP — JSON-RPC 2.0, 4-byte big-endian length-prefix framing, 64 MiB cap
Ruby SketchUp extension (server)            mcp_for_sketchup/mcp_for_sketchup/
   ↕  SketchUp Ruby API
Live SketchUp model

The Ruby side runs entirely on the SketchUp UI thread via UI.start_timer callbacks (SketchUp's Ruby is single-threaded — no native threads allowed). The Python side holds one persistent TCP socket per process and serialises tool-calls with an asyncio.Lock.

Source layout:

  • Python: src/sketchup_mcp/{tools,connection,config,compat,errors,prompts}.py

  • Ruby: mcp_for_sketchup/mcp_for_sketchup/{core,handlers,helpers,ui}/

See CLAUDE.md for the project's working notes and non-obvious constraints (unit conversions, reversed boolean semantics, framing details, etc.).

Development

Python package (editable install)

uv pip install -e .
python -m sketchup_mcp          # direct
uvx sketchup-mcp2               # production-style (from PyPI)

Tests

ruby test/run_all.rb             # Ruby unit tests (minitest; stdlib + rubyzip for the package test)
uv run pytest tests/ -q          # Python unit tests

Live smoke (requires SketchUp running with the extension started)

uv run python examples/smoke_check.py          # 25-step end-to-end
uv run python examples/smoke_multi_client.py   # concurrent multi-client

For a split-host setup (e.g. Linux dev box + Windows SketchUp), prefix with SKETCHUP_MCP_HOST=<sketchup-host>.

Troubleshooting

SketchUp not running or extension not started: ...

The Python MCP server connected to the configured host/port but found nothing listening. Either:

  • SketchUp isn't running, or

  • The extension is installed but not started — open Plugins → MCP Server → Start Server.

The Python server stays alive after this error; the next tool-call retries the connect.

IncompatibleVersionError

Your installed sketchup-mcp2 Python package and the .rbz extension are outside the supported version range. Rebuild the .rbz from the same commit as the Python package, or pip install -U sketchup-mcp2. The current supported range lives in src/sketchup_mcp/compat.py and mcp_for_sketchup/mcp_for_sketchup/core/compat.rb.

Tool-call timeouts on long operations

Bump SKETCHUP_MCP_TIMEOUT in your .mcp.json env block. Default is 60 seconds.

SketchUp UI freezes during big requests

Frame-decoding is capped at 50 reads × 64 KiB per client per tick (~3.2 MB) to keep the UI responsive, but a very large eval_ruby body or a runaway loop inside it will still freeze SketchUp until it returns. Break the work into smaller calls if you can.

MCP client reports connection timed out after 30000ms at startup

If the client can't connect but SketchUp itself is reachable (e.g. telnet <host> 9876 succeeds), the bottleneck is the Python server's own startup, not the link to SketchUp.

The usual culprit is running the server from a source checkout whose virtual environment lives on a slow filesystem — VMware Shared Folders (vmhgfs-fuse), VirtualBox shared folders, NFS/CIFS network drives, or WSL's /mnt/.... Python touches hundreds of small files at startup, and importing the FastMCP dependency stack from such a filesystem can take 30 s+ — past the client's init timeout. (A quick check: time uv run python -c "import sketchup_mcp.app" — if that takes tens of seconds, the filesystem is the problem.)

Keep the virtualenv on a local disk. With uv, point it there via UV_PROJECT_ENVIRONMENT in the server's .mcp.json env block — the project source can stay on the shared folder (it's small, and editable installs pick up changes live); only the dependency-heavy venv needs to be local:

"sketchup": {
  "command": "uv",
  "args": ["run", "--directory", "/path/to/sketchup-mcp2", "python", "-m", "sketchup_mcp"],
  "env": {
    "UV_PROJECT_ENVIRONMENT": "/home/you/.venvs/sketchup-mcp2",
    "SKETCHUP_MCP_HOST": "127.0.0.1"
  }
}

The uvx sketchup-mcp2 setup shown earlier isn't affected — uvx already keeps its environment under uv's local cache.

Why is the venv on a shared folder at all? This bridge is typically run in an isolated VM setup — both Claude Code launched with --dangerously-skip-permissions and eval_ruby (arbitrary Ruby, full filesystem/shell access) enabled are risky enough to want a disposable VM. Typical layout: a Linux VM (Claude Code + MCP server) ↔ a Windows VM (SketchUp) over the LAN, project on a host-shared folder — which is exactly why the UV_PROJECT_ENVIRONMENT note above matters.

License

MIT — see LICENSE.

Credits and attribution

  • Originally forked from mhyrr/sketchup-mcp. The fork diverged at v0.0.1 with a new wire protocol (4-byte length-prefix framing, JSON-RPC 2.0 envelopes), modular handler architecture, expanded introspection / joinery / edge-op tools, multi-client server with one-time hello handshake, MCP prompt, viewport screenshot, settings dialog, and full unit-test coverage on both Ruby and Python sides.

  • Published to PyPI as sketchup-mcp2; the upstream package is sketchup-mcp.

  • Bridge-pattern inspiration from ahujasid/blender-mcp.

Contributing

Pull requests welcome. Before opening one, please run both test suites (ruby test/run_all.rb and uv run pytest tests/) and — if you've touched anything in the IO path — the live smokes against a running SketchUp.

Available Tools

22 tools
boolean_operationA

Perform a boolean operation (union / difference / intersection) on two solids.

difference = target minus tool. Operating on an instance of a shared definition consumes only that instance — the result is a new group, sibling instances are untouched. Unreliable on non-manifold geometry.

Returns: JSON {id, name, type, bbox_mm{min,max}|null}. Read bbox_mm to verify the result; it is null for empty geometry (e.g. a difference that consumed the whole body).

ParametersJSON Schema
NameRequiredDescriptionDefault
tool_idYesEntity ID from a previous response (integer or its string form)
operationNounion, difference (target minus tool), or intersectionunion
target_idYesEntity ID from a previous response (integer or its string form)
delete_originalsNoerase the two source bodies after a successful operation

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 fully discloses behavioral traits: the effect of operations on shared definitions, unreliability on non-manifold geometry, and the return format including how to interpret null bbox_mm for empty results. No contradictions.

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 well-structured with the core purpose first, followed by clarifications and return details. Every sentence adds value, and there is no redundancy or wasted text.

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 the tool's complexity (4 parameters, one enum, no annotations), the description covers essential behavioral aspects and return format. It lacks detailed error conditions or prerequisites but is sufficient for most use cases.

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?

All four parameters are fully described in the input schema (100% coverage). The description adds extra context beyond the schema, such as the special behavior on instances and the meaning of the difference operation, enhancing parameter understanding.

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 'Perform a boolean operation (union / difference / intersection) on two solids', specifying the verb, resource, and operation types. It uniquely identifies this tool among siblings as no other tool offers boolean operations.

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 on when to use the tool, including the difference operation semantics and behavior on shared definitions. However, it does not explicitly state when not to use it or suggest alternatives, although no alternatives exist among siblings.

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

chamfer_edgeA

Chamfer (bevel) edges of a group/component by distance mm.

By default ALL edges are chamfered. Unreliable on non-manifold geometry.

Returns: JSON {id, name, type, bbox_mm|null, edges_chamfered, stats{attempted, skipped_no_match, subtract_failed, succeeded}} — check stats.subtract_failed == 0 (failed cuts) and stats.skipped_no_match == 0 (edges consumed by earlier cuts).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID from a previous response (integer or its string form)
distanceNoChamfer distance in mm

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries full burden. It discloses the modification behavior (chamfering edges), notes unreliability on non-manifold geometry, and details the return value, including stats to check for failures. However, it does not explicitly mention destructiveness or undo behavior.

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 concise, with the main action stated first. The return value description is slightly verbose but structured with a clear format. Overall, it is efficient and avoids 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?

Considering the tool's simplicity (2 parameters, output schema), the description covers key behaviors, default, reliability note, and return value. It does not compare with the sibling tool fillet_edge, but the context is largely 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 coverage is 100%, so baseline is 3. The description adds minimal extra meaning beyond the schema: it reiterates that 'distance' is in mm and that 'id' is an entity ID from a previous response. No additional parameter details or constraints are provided.

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 (chamfer/bevel), the resource (edges of a group/component), and the key parameter (distance in mm). It distinguishes the tool from siblings like fillet_edge (rounding) and boolean_operation by specifying the bevel 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?

The description explains default behavior ('By default ALL edges are chamfered') and warns about unreliability on non-manifold geometry, providing context for when to use the tool. However, it does not explicitly state when not to use it or compare it to alternatives like fillet_edge.

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

create_componentA

Create a primitive (cube / cylinder / cone / sphere) in SketchUp.

All linear values are millimeters (mm). Minimum size per dimension: 0.1 mm for cube (thin stock like veneer is fine), 1.0 mm for sphere / cylinder / cone (tessellated types degenerate earlier). position is the bounding-box MIN corner (not the center); the same anchor is used by transform_component.position. Per-type dimensions: cube uses [x, y, z]; cylinder and cone use [0]=diameter, [2]=height ([1] is ignored); sphere uses [0]=diameter only. New geometry is wrapped in a SketchUp Group.

Returns: JSON {id, name, type, bbox_mm{min,max}|null}. Read bbox_mm to verify the result before the next step.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional name for the new group so find_components can locate it later
typeNoPrimitive type to createcube
positionNoBounding-box MIN corner [x, y, z] in mm (not the center)
dimensionsNoSizes [x, y, z] in mm; cylinder/cone use [0]=diameter, [2]=height; sphere uses [0]=diameter

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

No annotations provided, so the description fully covers behavioral traits: units (mm), minimum dimensions per type, position as MIN corner, per-type dimension conventions, return value details, and suggestion to verify with bbox_mm. Thorough 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?

Multiple sentences but each adds essential detail without redundancy. Well-structured: purpose, units, size constraints, anchor point, per-type dimension mapping, Group wrapping, return value and verification advice. Efficient and 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?

Given 100% schema coverage and presence of output schema, the description provides all necessary context: explains param nuances (ignored axis for cylinder/cone), behavioral constraints, and return format. No gaps for a primitive creation tool.

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 description coverage is 100% (baseline 3), but description adds significant value: minimum sizes (0.1mm cube, 1.0mm sphere/cylinder/cone), clarifies that dimensions are interpreted differently per type (e.g., cylinder [0]=diameter, [2]=height), and reinforces that position is MIN corner.

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 creates a primitive (cube/cylinder/cone/sphere) in SketchUp and that geometry is wrapped in a Group. Distinguishes from transform_component by noting shared anchor convention, and from sibling creation tools by specifying primitive types.

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 instructions on when to use (to create primitives) but does not explicitly state when not to use or compare to alternative creation tools like create_dovetail or create_finger_joint. However, it references transform_component for positioning, offering some guidance.

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

create_dovetailA

Create a dovetail joint between two boards.

All dimensions in millimeters; angle is in degrees, valid range (0, 60]. Offsets shift the joint from the board face's center. Defaults are sized for ~100 mm boards. The two boards must already touch/overlap along the joint axis.

Returns: JSON {tail: {id, name, type, bbox_mm|null}, pin: {...}, boolean_cuts: {attempted, failed}} — non-zero failed means some cuts did not apply (likely non-manifold geometry); verify via bbox_mm.

ParametersJSON Schema
NameRequiredDescriptionDefault
angleNoDovetail flare angle in degrees, 0 < angle <= 60
depthNoJoint depth in mm
widthNoJoint width in mm
heightNoJoint height in mm
pin_idYesEntity ID from a previous response (integer or its string form)
tail_idYesEntity ID from a previous response (integer or its string form)
offset_xNoJoint offset from the board face's center along X, mm
offset_yNoJoint offset from the board face's center along Y, mm
offset_zNoJoint offset from the board face's center along Z, mm
num_tailsNoNumber of tails

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

No annotations exist, so the description carries full burden. It explains the return JSON structure, warns about non-manifold geometry causing failed cuts, and advises verifying via bbox_mm, but lacks side-effect details.

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 three sentences plus a bullet, front-loading the core purpose with no wasted words, perfectly sized for quick comprehension.

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?

Covers prerequisites, return structure, and unit context. For 10 parameters with full schema coverage and output schema, this is sufficient, though it could mention that the operation creates geometry.

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%, providing baseline 3. The description adds context beyond schema by specifying that dimensions are in mm, angle in degrees with valid range, offsets shift from board face center, and defaults suit ~100mm boards.

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 it creates a dovetail joint between two boards, with specific details on units, angle range, offsets, and defaults, making the 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 Guidelines3/5

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

It provides a prerequisite (boards must touch/overlap along joint axis) but lacks guidance on when to use this tool versus siblings like create_finger_joint or create_mortise_tenon.

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

create_finger_jointA

Create a finger joint (box joint) between two boards.

All dimensions in millimeters; offsets shift the joint from the board face's center. Defaults are sized for ~100 mm boards. The two boards must already touch/overlap along the joint axis.

Returns: JSON {board1: {id, name, type, bbox_mm|null}, board2: {...}, boolean_cuts: {attempted, failed}} — non-zero failed means some cuts did not apply (likely non-manifold geometry); verify via bbox_mm.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoJoint depth in mm
widthNoJoint width in mm
heightNoJoint height in mm
offset_xNoJoint offset from the board face's center along X, mm
offset_yNoJoint offset from the board face's center along Y, mm
offset_zNoJoint offset from the board face's center along Z, mm
board1_idYesEntity ID from a previous response (integer or its string form)
board2_idYesEntity ID from a previous response (integer or its string form)
num_fingersNoNumber of fingers

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Without annotations, the description carries full burden. It discloses the return JSON structure, explains failure modes (non-manifold geometry via boolean_cuts.failed), and advises verification via bbox_mm. It also notes offsets shift from board face center and default sizes. Could further clarify if operation is reversible, but overall good.

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: a clear purpose statement, a compact paragraph of key details, and a structured return description. Every sentence contributes meaning, no 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?

Given the tool's complexity (9 params, output schema, no annotations), the description covers prerequisites, parameter interpretation, and failure modes concisely. It could include an example or more guidance on selecting board IDs, but the output schema reduces the need for return value details.

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?

Input schema has 100% description coverage, so baseline is 3. The description adds value by stating all dimensions are in millimeters, explaining offsets shift from board face center, and noting defaults are sized for ~100 mm boards. This contextualizes the parameters beyond their individual schema descriptions.

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 it creates a finger joint (box joint) between two boards, using specific verbs and resource. It names the joint type, which distinguishes it from sibling tools like create_dovetail and create_mortise_tenon.

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: boards must already touch/overlap along the joint axis. However, it does not explicitly guide when to use this tool versus alternatives, such as dovetail or mortise-tenon, though the naming makes it implicit.

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

create_layerA

Create a new layer (tag) with the given name.

Returns: JSON {id, name, visible}.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName for the new layer

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 behavioral traits. It states the tool creates a layer and returns {id, name, visible}, which covers mutability and output. However, it does not disclose any side effects, permissions, rate limits, or constraints beyond the schema (minLength). For a simple creation tool, this is adequate but minimal.

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 extremely concise—two sentences: one for purpose and one for return value. No unnecessary words, front-loaded with the action. Every sentence adds value.

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's single parameter and the presence of an output schema (which the description explicitly echoes), the description is complete. It covers purpose, input, and output. No critical information is missing for an agent to use this tool 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% for the single parameter 'name', which already has a description. The tool description adds no additional meaning beyond the schema for this parameter (just 'with the given name'). 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 clearly states the verb 'Create' and the resource 'new layer (tag)' with a required name parameter. It distinguishes from sibling list_layers which reads layers, and other tools that modify components. The return format is also specified.

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 for creating a layer, but does not explicitly state when to use this tool versus alternatives like list_layers or other creation tools. No when-not or exclusion criteria are provided, but the simplicity of the operation mitigates the need for extensive guidance.

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

create_mortise_tenonA

Create a mortise-and-tenon joint between two boards.

All dimensions in millimeters; offsets shift the joint from the board face's center. Defaults are sized for ~100 mm boards. The two boards must already touch/overlap along the joint axis.

Returns: JSON {mortise: {id, name, type, bbox_mm|null}, tenon: {...}, boolean_cuts: {attempted, failed}} — non-zero failed means some cuts did not apply (likely non-manifold geometry); verify via bbox_mm.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoJoint depth in mm
widthNoJoint width in mm
heightNoJoint height in mm
offset_xNoJoint offset from the board face's center along X, mm
offset_yNoJoint offset from the board face's center along Y, mm
offset_zNoJoint offset from the board face's center along Z, mm
tenon_idYesEntity ID from a previous response (integer or its string form)
mortise_idYesEntity ID from a previous response (integer or its string form)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 full burden. It explains dimensions are in millimeters, offsets from board face center, and details the return format including how to interpret failed cuts: 'non-zero failed means some cuts did not apply (likely non-manifold geometry); verify via bbox_mm.' This is a good disclosure of behavior and failure mode.

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 paragraphs with no filler. The first sentence states purpose, followed by critical details. Every sentence adds value, and the structure 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?

Given the tool has 8 parameters, an output schema, and no annotations, the description covers prerequisites, unit system, default sizing, return format, and error handling. It is complete enough for an AI agent to understand what the tool does, when to use it, and how to interpret results.

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 baseline is 3. The description adds some context (units, default sizing) but does not significantly enhance understanding of individual parameters beyond the schema. The explanation of mortise_id and tenon_id is already present in the schema's description field.

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 purpose: 'Create a mortise-and-tenon joint between two boards.' It uses a specific verb (create) and resource (mortise-and-tenon joint), which distinguishes it from sibling tools like create_dovetail or create_finger_joint.

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 explicit prerequisites: 'The two boards must already touch/overlap along the joint axis.' Also notes that defaults are sized for ~100 mm boards, giving a usage hint. Does not explicitly state when not to use or list alternatives, but sibling tools provide that context implicitly.

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

delete_componentB

Delete a group or component by entity ID.

Returns: JSON {ok: true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID from a previous response (integer or its string form)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose behavioral traits. It states the return value but fails to warn about permanent data loss or side effects. For a delete operation, this is insufficient.

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 extremely concise with two sentences, no redundant information, and the key information is front-loaded.

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?

While the tool is simple with one parameter and an output schema, the description lacks details on error handling, idempotency, and permission requirements, which are important for a delete 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 schema already fully describes the 'id' parameter (100% coverage). The description only repeats 'by entity ID', adding no additional semantic value beyond what the 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 clearly states the action ('delete') and the resource ('group or component') and specifies the method ('by entity ID'). It distinguishes itself from sibling tools, as it is the only deletion operation among them.

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?

The description provides no guidance on when to use this tool versus alternatives, nor does it mention prerequisites or conditions for safe use. Given the destructive nature, such guidance is important.

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

eval_rubyA

Evaluate arbitrary Ruby code in SketchUp.

Enabled by default; the user can close the gate in the SketchUp extension's Settings. When closed, the SketchUp side returns JSON-RPC code -32010 with a user-facing message explaining how to re-enable it. This wrapper surfaces that message as a plain string so the LLM can repeat it to the user verbatim — without the [code] prefix that format_error would otherwise add.

Returns the .to_s of the LAST evaluated expression; stdout (puts) is NOT captured. End scripts with an explicit expression — e.g. a final result.to_json — to get structured data back. Errors return "[code] message" with the Ruby exception class and message.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesRuby code to evaluate inside SketchUp

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/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 excels. It discloses that only the last expression's .to_s is returned, stdout is not captured, errors are returned as '[code] message' with the Ruby exception class, and describes the gate-closed scenario including the JSON-RPC code and how the message is surfaced. This gives an agent a clear picture of what to expect before calling.

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 moderately long but every sentence adds essential detail: purpose, gating behavior, return value nuances, and error format. It is front-loaded with the core purpose in the first sentence and then expands on critical behavioral details. No fluff is present, but it could be tightened by reducing the explanation of the gate message wrapper, which is somewhat tangential to the core call.

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?

The description covers all critical aspects an agent needs to call it correctly: return format, stdout limitation, error handling, and the special gate-closed case. It also alerts the agent to the verbatim-message mechanism. For a single-parameter tool with an output schema (though not shown), this is complete enough for accurate 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 schema already describes the parameter with 100% coverage, so the baseline is 3. The description adds valuable usage guidance by advising to end scripts with an explicit expression like 'result.to_json' to obtain structured data, which directly affects how the parameter should be used. This elevates 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 'Evaluate arbitrary Ruby code in SketchUp,' a specific verb and resource that unambiguously distinguishes it from all sibling tools which perform specific operations (create_layer, undo, get_version, etc.). There is no ambiguity about what the 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 description does not explicitly contrast this tool with its siblings or state when to prefer it over other tools. It explains the gating behavior and error handling, but this is about behavioral context, not usage routing. The implied usage is as a general-purpose escape hatch for operations not covered by the specialized tools, but that 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.

export_sceneA

Export the current scene to a temp file on the SketchUp host.

Formats: skp (native), obj / dae / stl (geometry), png / jpg (viewport render, default 1920×1080). The file is written on the machine running SketchUp — on a split-host setup the path is not directly readable here.

Returns: JSON {path, format} plus a "warning" field when exporting skp from a never-saved model (SketchUp binds the live document to the export path — relay the warning to the user).

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoskp (native), obj / dae / stl (geometry), png / jpg (viewport render)skp

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/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. It discloses important behavioral traits: the file is written on the SketchUp host, split-host path unreadability, and a warning field for certain exports. It does not explicitly state that the tool is non-destructive to the model, but the verb 'export' implies reading the scene without modification.

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 with a clear front-loaded purpose statement, followed by compact listing of formats and return information. Every sentence adds value 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 single-parameter tool with an output schema, the description covers the essential behavior, return format, and an edge case (warning for never-saved models). Minor gaps include file naming conventions and how to access files on split-host setups, but these are acceptable given the output schema likely provides additional structure.

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 has one parameter 'format' with enums and a default. The description adds meaning beyond the schema by noting that skp is native, obj/dae/stl are geometry, png/jpg are viewport renders with default resolution 1920x1080. This provides valuable context for the AI agent.

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 exports the current scene to a temp file, lists all supported formats (skp, obj, dae, stl, png, jpg), and distinguishes it from sibling tools like get_viewport_screenshot which captures a viewport image without exporting.

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 context about the export destination (SketchUp host), split-host implications, and warning conditions for skp exports from unsaved models. However, it does not explicitly state when to use this tool versus alternatives like get_viewport_screenshot for image-only needs.

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

fillet_edgeA

Round (fillet) edges of a group/component by radius mm with segments arc segments.

By default ALL edges are filleted. Unreliable on non-manifold geometry.

Returns: JSON {id, name, type, bbox_mm|null, edges_filleted, stats{attempted, skipped_no_match, subtract_failed, succeeded}} — check stats.subtract_failed == 0 (failed cuts) and stats.skipped_no_match == 0 (edges consumed by earlier cuts).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID from a previous response (integer or its string form)
radiusNoFillet radius in mm
segmentsNoArc segments per rounded edge

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/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. It discloses the unreliability on non-manifold geometry, explains the return JSON structure, and advises checking specific stats fields. It could mention that the operation modifies geometry destructively but is implied.

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 concise with three sentences plus a bullet of return info. It front-loads the main action. Could be slightly more streamlined, but no significant 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?

Given the presence of an output schema and 3 parameters, the description covers purpose, default behavior, non-manifold warning, and return interpretation. It is fairly complete for the tool's complexity.

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 baseline is 3. The description adds value by explaining default behavior and return stats, but the parameter descriptions in the schema are already clear. The description does not provide additional semantics beyond the schema for the 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 states the action ('Round (fillet) edges of a group/component') and distinguishes from sibling tool 'chamfer_edge' by specifying 'Round' vs bevel. It also mentions the parameters 'radius' and 'segments' directly.

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 context on default behavior ('By default ALL edges are filleted') and warns about non-manifold geometry. However, it does not explicitly contrast with chamfer_edge or specify when not to use this tool.

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

find_componentsA

Find components matching name substring, layer, and/or type.

Name matching is case-insensitive substring; layer must match exactly. Searches recursively (bounded by max_depth). With no filters it returns all components up to max_depth (paginated) — same traversal as list_components.

Returns: JSON {components[], total, offset, truncated} — if truncated, request the next page with offset += limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoCase-insensitive substring to match against component names
typeNoRestrict results to groups or component instances
layerNoExact layer (tag) name to filter by
limitNoPage size — maximum components per response
offsetNoHow many components to skip (pagination)
max_depthNoMaximum nesting depth to search
response_formatNodetailed includes bbox_mm per component; concise omits itdetailed

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description fully explains behavior: case-insensitive substring matching, exact layer matching, recursive search bounded by max_depth, pagination with truncation, and return format. No contradictions.

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?

6 sentences front-loading purpose, then detailing matching, filter-less behavior, and return format. No extraneous text.

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?

Covers all key aspects: filtering criteria, recursion, pagination, return structure. Output schema exists but description still gives helpful summary.

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 has 100% coverage with good descriptions. The tool description adds behavioral context (case-insensitive, exact, recursive) not in schema, enhancing understanding.

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 finds components by name substring, layer, and type. It explains matching rules (case-insensitive, exact layer) and distinguishes from sibling list_components by noting the same traversal when no filters are applied.

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 mentions that without filters it behaves like list_components, implying an alternative for unfiltered listing. However, it could explicitly state when to use find_components vs list_components.

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

get_component_infoA

Detailed info for a single group or component instance by entity ID.

Returns: JSON {id, name, type, layer, depth, bbox_mm|null}.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID from a previous response (integer or its string form)

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/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 full burden. It states the return format but does not disclose error behavior, permissions, or that it is read-only. For a simple getter, this is minimally acceptable.

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 fix, no unnecessary information. Concisely states purpose and return format.

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 the simple input and presence of output schema, the description is largely complete. It could mention error handling or that the ID must come from previous responses, but overall is 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 description coverage is 100%, so baseline is 3. The description does not add new meaning beyond the schema's parameter 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 the tool retrieves detailed info for a single group or component by entity ID, distinguishing it from sibling tools like find_components, list_components, and get_selection.

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 the user has an entity ID, but lacks explicit guidance on when to use versus alternatives, or when not to use this tool.

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

get_model_infoA

Get current SketchUp model info: file path, title, units, bounding box, entity count, layer list.

Returns: JSON {path, title, units: "mm", bounding_box_mm|null, entity_count, layers[]}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/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 burden. It implies a read-only operation but does not explicitly state that it does not modify the model or any side-effect guarantees.

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, no waste. The first sentence states purpose, the second lists return format concisely.

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 info retrieval tool with no parameters and an output schema, the description is largely sufficient. However, it misses potential preconditions (e.g., model must be open) and failure modes.

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?

No parameters exist (0 params), baseline is 4. The description adds value by detailing the return structure beyond the empty 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 'Get current SketchUp model info' and lists all returned fields (path, title, units, etc.). It is specific and distinct from sibling tools like get_component_info which focus on individual components.

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 guidance on when to use this tool vs alternatives. The context is implied as a general model information retrieval, but there is no mention of when not to use it or prerequisites.

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

get_selectionA

Get the entities currently selected in the SketchUp UI.

Returns: JSON {entities: [...]} — groups/components are {id, name, type, layer, depth, bbox_mm|null}; other selected entities (edges, faces, ...) are {id, type} only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 carries the full burden. It details the output format and differentiates entity types, but does not mention side effects, permissions, or behavior in empty selection.

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 plus an example schema structure. No wasted words, highly efficient.

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's simplicity (no parameters, straightforward purpose), the description fully explains what it returns and the format. Output schema exists, so no need for further return value explanation.

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?

No parameters exist, and the description provides no parameter information, which is appropriate since there are none. Schema coverage is 100%, so baseline score of 4 is suitable.

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 verb ('Get') and the resource ('entities currently selected in the SketchUp UI'). It differentiates itself from sibling tools like boolean_operation or create_component by being a read-only getter.

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 on when to use this tool versus alternatives or when not to use it. For a simple getter, the necessity may be obvious, but explicit context would improve clarity.

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

get_versionA

Return the server version and Python↔Ruby compatibility verdict.

Useful as a runtime sanity probe — always returns a payload, even when the connection or other tools surface errors. The result is a JSON string with fields: python_version, ruby_version, min_compatible_ruby, max_compatible_ruby, ruby_min_compatible_python, ruby_max_compatible_python, compatible (bool), error (string | null).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 full burden. It discloses that the tool always returns a payload, even during connection or other errors, and describes the result structure (JSON string with specific fields). This provides meaningful behavioral context beyond basic purpose.

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 plus a field listing, with no wasted words. The main purpose is front-loaded, and every sentence adds value.

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 no parameters and an output schema, the description is remarkably complete: it explains when to use, what it returns, and its reliability. It adds details about the compatibility fields beyond the bare 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, so baseline is 4 per guidelines. The description adds no parameter information because none exist. It correctly focuses on return value and usage 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 clearly states it returns server version and compatibility verdict, which is a specific verb+resource. It distinguishes from sibling tools by describing its unique role as a runtime sanity probe.

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 recommends using it as a runtime sanity probe and notes it always returns a payload even when other tools error. While it doesn't list alternatives or exclusions, the context is clear enough for an agent to decide when to invoke it.

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

get_viewport_screenshotA

Capture the current SketchUp viewport; returns the PNG image plus a JSON text block {width, height, preset_used, style_used}.

Useful for letting Claude visually verify the scene between steps.

Parameters

  • max_size: largest side of the returned PNG (64..4096). Aspect ratio is taken from the current viewport; the smaller side is scaled proportionally.

  • view_preset: switch the camera to a standard view before snapping. current leaves the camera alone.

  • zoom_extents: call view.zoom_extents before snapping.

  • style: temporarily flip a small set of rendering_options keys. default leaves them alone.

  • restore_view: when true (default), camera and rendering_options are snapshotted before mutation and restored after the snapshot, so the user's viewport is unchanged.

If the connection drops mid-response the call is retried automatically; the viewport may briefly flicker in that rare case.

ParametersJSON Schema
NameRequiredDescriptionDefault
styleNoTemporary rendering style for the shot; 'default' leaves rendering options alonedefault
max_sizeNoLargest side of the returned PNG in pixels; the other side follows the viewport aspect ratio
view_presetNoCamera preset to switch to before snapping; 'current' leaves the camera alonecurrent
restore_viewNoRestore the camera and rendering options after the shot, leaving the user's viewport unchanged
zoom_extentsNoZoom to fit the whole model before snapping

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 full burden. It describes the snapshot process, parameter effects, and retry/flicker behavior. It does not explicitly state non-destructiveness but implies it via the restore_view parameter and its description.

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 well-structured with clear paragraphs and a parameter list. It is concise enough but could be slightly tighter by removing some redundancy.

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 no output schema, the description includes the return format (PNG + JSON). It covers all parameters, retry behavior, and the purpose, making it fully informative for an agent.

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 significant context beyond the schema for each parameter, such as aspect ratio scaling for max_size and the specific rendering options toggled by style.

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 captures a screenshot of the SketchUp viewport and returns a PNG image along with a JSON block containing dimensions and style info. It is distinct from sibling tools like export_scene or get_selection.

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 states it is 'useful for letting Claude visually verify the scene between steps', providing clear context for when to use it. However, it does not explicitly mention when not to use it or compare with alternatives.

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

list_componentsA

List groups and component instances in the model (paginated).

Each component is {id, name, type, layer, depth, bbox_mm} (detailed) or {id, name, type, layer, depth} (concise); bounds are world-coordinate mm. Set recursive=true to descend into nested components (bounded by max_depth, default 3).

Returns: JSON {components[], total, offset, truncated} — if truncated, request the next page with offset += limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoPage size — maximum components per response
offsetNoHow many components to skip (pagination)
max_depthNoMaximum nesting depth to descend when recursive
recursiveNoDescend into nested groups/components
response_formatNodetailed includes bbox_mm per component; concise omits itdetailed

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description fully bears the burden of behavioral disclosure. It explains the return format (detailed vs. concise), pagination behavior (truncated flag, offset increment), and recursion depth limits. This is comprehensive for a read-only list 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 concise (three short paragraphs) and well-structured: purpose, object format, parameters, return value with pagination instructions. Every sentence adds value without redundancy.

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's complexity (5 parameters, pagination, two response formats), the description covers all necessary aspects: what is returned, how recursion works, and how to paginate. The presence of an output schema is acknowledged but the description still fully explains the return structure.

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 description coverage is 100%, so each parameter is already described. The description adds significant value by explaining the meaning of response_format (detailed includes bbox_mm, concise omits it) and the interaction between recursive and max_depth. This goes 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 begins with a clear verb+resource: 'List groups and component instances in the model (paginated)'. It immediately distinguishes itself from siblings like find_components (search) and get_component_info (single component), as it is a paginated listing tool.

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 guidance on using pagination and recursion (e.g., 'Set recursive=true to descend into nested components... bounded by max_depth, default 3' and instructions for pagination via offset increment). However, it does not explicitly state when to use this tool over siblings like find_components, which would improve the score.

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

list_layersA

List all model layers (tags).

Returns: JSON {layers: [{name, visible, color, id}]}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It mentions return format and that it lists all layers, implying a read-only operation but does not explicitly state no side effects. Adequate for a simple tool.

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?

Very concise, single sentence plus return format example. Structurally clear and 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?

Given zero parameters and presence of output schema in description, it is fairly complete. Lacks details on layer definitions or edge cases, but sufficient for a simple list 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?

No parameters exist, so schema coverage is 100%. Baseline of 3 applies; description adds no parameter information, which is acceptable given no params.

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 states the tool lists all model layers (tags). The verb 'list' and resource 'layers' are specific. The parenthetical 'tags' might cause minor ambiguity but overall the purpose is clear.

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 guidance on when to use this tool versus alternatives (e.g., create_layer). However, as a simple read operation with no parameters, usage context is implicitly understood.

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

set_materialA

Assign a material (color) to a group or component.

material accepts a named color — red, green, blue, yellow, cyan, turquoise, magenta, purple, white, black, brown, wood, orange, gray, grey — or a 6-digit hex string like "#a05030" (#rrggbb). Anything else fails with error -32602. Named colors are case-insensitive. Painting affects only this instance (it is made unique first). That applies to groups/components; painting a raw face/edge id (obtainable via get_selection) colors the shared definition — all instances show it.

Returns: JSON {id, name, type, bbox_mm{min,max}|null}.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID from a previous response (integer or its string form)
materialYesNamed color or 6-digit hex string like #a05030

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 discloses key behaviors: instance vs definition coloring, valid material formats, and error code for invalid material. It could also mention side effects like undo but 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?

Description is concise and well-structured: purpose first, then material details, then behavioral nuance, then return type. No superfluous sentences.

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 output schema exists and only two simple parameters, the description fully explains input, behavior, and return format. No gaps for a coloring 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?

Schema coverage is 100%, but description adds value: examples of valid colors, case-insensitivity, error code, and behavior context for the 'id' parameter (instance vs definition).

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 clearly states 'Assign a material (color) to a group or component.' It specifies the action, resource, and distinguishes from sibling tools by focusing on coloring, which no other 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 description implies usage for changing color but provides no explicit guidance on when to use vs alternatives or when not to use. No mention of prerequisites or when this tool is preferable.

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

transform_componentA

Move, rotate and/or scale a group or component (mm / degrees).

  • position: ABSOLUTE target for the entity's bounding-box MIN corner, in mm — the same anchor create_component uses. Applied LAST (after rotation/scale), so the final bbox-min lands exactly at [x, y, z] even in combined calls. It is NOT a relative offset: repeating the same position is idempotent.

  • rotation: RELATIVE rotation in degrees around the bbox center, applied sequentially about world X, then Y, then Z.

  • scale: RELATIVE scale factors about the bbox center.

These validations (3-element lists, non-zero scale) apply only to this typed tool — raw Ruby driven through eval_ruby bypasses them.

Returns: JSON {id, name, type, bbox_mm{min,max}|null}. Read bbox_mm to verify the result; it is null for empty geometry.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesEntity ID from a previous response (integer or its string form)
scaleNorelative factors about bbox center, each |s| > 1e-9
positionNoABSOLUTE target for the bbox-min corner, mm
rotationNorelative degrees around bbox center, applied X then Y then Z

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

No annotations provided, so description carries full burden. It discloses position as absolute and applied last, rotation as relative sequential about world axes, scale as relative with non-zero validation, and return JSON structure. All key behavioral traits are explained beyond 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?

Concise bullet-pointed description with no fluff. Each sentence provides essential information about parameters, validations, and output. Front-loaded with main 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 4 parameters with full schema coverage and an output schema, the description covers all needed context: operation order, validation scope, return format, and verification hint (read bbox_mm). No gaps perceived.

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 description adds critical semantics: position is NOT relative but absolute and idempotent, rotation order is X then Y then Z, scale factors are relative with non-zero constraint. These enrich the parameter understanding significantly.

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 clearly states verb 'Move, rotate and/or scale' and resource 'a group or component', distinguishing it from creation/deletion/evaluation siblings like create_component, delete_component, and eval_ruby. The title is null but name suffices.

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 contrasts with eval_ruby by noting validations only apply to this typed tool, guiding the agent to use this for safe transformations. However, it does not elaborate on when to prioritize this over other transformation-like operations among siblings.

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

undoA

Undo the last atomic operation in SketchUp. One MCP tool-call = one undo step.

Returns: JSON {ok: true}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 burden. It discloses that it undoes the last atomic operation and returns {ok: true}. This sufficiently describes behavior for a straightforward undo 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 consists of two short sentences: one explaining the action and one specifying the return value. Every word adds value with no 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?

Given no parameters and a simple return, the description is complete. It omits potential edge cases (e.g., multiple undos), but overall it provides sufficient context for a basic undo 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?

There are no parameters (0 parameters, 100% schema coverage). The description adds no extra parameter info, which is fine as the schema already covers everything.

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 'Undo the last atomic operation in SketchUp', using a specific verb and resource. It is distinct from sibling tools which create, modify, or query; no other tool performs undo.

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 explains that one MCP tool-call equals one undo step, clarifying usage. No explicit when-not-to-use or alternatives are given, but the simple 0-parameter interface and unique function make guidance adequate.

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.

  1. 17 tool updatesv0.3.0
    • Changedboolean_operation10 fields changed
      • addedInput schema / properties / delete_originals / description
        Added value: +"erase the two source bodies after a successful operation"
      • addedInput schema / properties / operation / description
        Added value: +"union, difference (target minus tool), or intersection"
      • addedInput schema / properties / target_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / target_id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / target_id / minLength
        Removed value: -1
      • removedInput schema / properties / target_id / type
        Removed value: -"string"
      • addedInput schema / properties / tool_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / tool_id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / tool_id / minLength
        Removed value: -1
      • removedInput schema / properties / tool_id / type
        Removed value: -"string"
    • Changedchamfer_edge5 fields changed
      • addedInput schema / properties / distance / description
        Added value: +"Chamfer distance in mm"
      • addedInput schema / properties / id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / id / minLength
        Removed value: -1
      • removedInput schema / properties / id / type
        Removed value: -"string"
    • Changedcreate_component7 fields changed
      • changedInput schema / properties / dimensions / default
        Previous value: -[
        -  1,
        -  1,
        -  1
        -]New value: +[
        +  100,
        +  100,
        +  100
        +]
      • addedInput schema / properties / dimensions / description
        Added value: +"Sizes [x, y, z] in mm; cylinder/cone use [0]=diameter, [2]=height; sphere uses [0]=diameter"
      • removedInput schema / properties / dimensions / items / exclusiveMinimum
        Removed value: -0
      • addedInput schema / properties / dimensions / items / minimum
        Added value: +0.1
      • addedInput schema / properties / name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Optional name for the new group so find_components can locate it later",
        +  "title": "Name"
        +}
      • addedInput schema / properties / position / description
        Added value: +"Bounding-box MIN corner [x, y, z] in mm (not the center)"
      • addedInput schema / properties / type / description
        Added value: +"Primitive type to create"
    • Changedcreate_dovetail17 fields changed
      • addedInput schema / properties / angle / description
        Added value: +"Dovetail flare angle in degrees, 0 < angle <= 60"
      • addedInput schema / properties / angle / maximum
        Added value: +60
      • addedInput schema / properties / depth / description
        Added value: +"Joint depth in mm"
      • addedInput schema / properties / height / description
        Added value: +"Joint height in mm"
      • addedInput schema / properties / num_tails / description
        Added value: +"Number of tails"
      • addedInput schema / properties / offset_x / description
        Added value: +"Joint offset from the board face's center along X, mm"
      • addedInput schema / properties / offset_y / description
        Added value: +"Joint offset from the board face's center along Y, mm"
      • addedInput schema / properties / offset_z / description
        Added value: +"Joint offset from the board face's center along Z, mm"
      • addedInput schema / properties / pin_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / pin_id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / pin_id / minLength
        Removed value: -1
      • removedInput schema / properties / pin_id / type
        Removed value: -"string"
      • addedInput schema / properties / tail_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / tail_id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / tail_id / minLength
        Removed value: -1
      • removedInput schema / properties / tail_id / type
        Removed value: -"string"
      • addedInput schema / properties / width / description
        Added value: +"Joint width in mm"
    • Changedcreate_finger_joint15 fields changed
      • addedInput schema / properties / board1_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / board1_id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / board1_id / minLength
        Removed value: -1
      • removedInput schema / properties / board1_id / type
        Removed value: -"string"
      • addedInput schema / properties / board2_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / board2_id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / board2_id / minLength
        Removed value: -1
      • removedInput schema / properties / board2_id / type
        Removed value: -"string"
      • addedInput schema / properties / depth / description
        Added value: +"Joint depth in mm"
      • addedInput schema / properties / height / description
        Added value: +"Joint height in mm"
      • addedInput schema / properties / num_fingers / description
        Added value: +"Number of fingers"
      • addedInput schema / properties / offset_x / description
        Added value: +"Joint offset from the board face's center along X, mm"
      • addedInput schema / properties / offset_y / description
        Added value: +"Joint offset from the board face's center along Y, mm"
      • addedInput schema / properties / offset_z / description
        Added value: +"Joint offset from the board face's center along Z, mm"
      • addedInput schema / properties / width / description
        Added value: +"Joint width in mm"
    • Changedcreate_layer1 field changed
      • addedInput schema / properties / name / description
        Added value: +"Name for the new layer"
    • Changedcreate_mortise_tenon14 fields changed
      • addedInput schema / properties / depth / description
        Added value: +"Joint depth in mm"
      • addedInput schema / properties / height / description
        Added value: +"Joint height in mm"
      • addedInput schema / properties / mortise_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / mortise_id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / mortise_id / minLength
        Removed value: -1
      • removedInput schema / properties / mortise_id / type
        Removed value: -"string"
      • addedInput schema / properties / offset_x / description
        Added value: +"Joint offset from the board face's center along X, mm"
      • addedInput schema / properties / offset_y / description
        Added value: +"Joint offset from the board face's center along Y, mm"
      • addedInput schema / properties / offset_z / description
        Added value: +"Joint offset from the board face's center along Z, mm"
      • addedInput schema / properties / tenon_id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / tenon_id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / tenon_id / minLength
        Removed value: -1
      • removedInput schema / properties / tenon_id / type
        Removed value: -"string"
      • addedInput schema / properties / width / description
        Added value: +"Joint width in mm"
    • Changeddelete_component4 fields changed
      • addedInput schema / properties / id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / id / minLength
        Removed value: -1
      • removedInput schema / properties / id / type
        Removed value: -"string"
    • Changedeval_ruby1 field changed
      • addedInput schema / properties / code / description
        Added value: +"Ruby code to evaluate inside SketchUp"
    • Changedexport_scene1 field changed
      • addedInput schema / properties / format / description
        Added value: +"skp (native), obj / dae / stl (geometry), png / jpg (viewport render)"
    • Changedfillet_edge6 fields changed
      • addedInput schema / properties / id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / id / minLength
        Removed value: -1
      • removedInput schema / properties / id / type
        Removed value: -"string"
      • addedInput schema / properties / radius / description
        Added value: +"Fillet radius in mm"
      • addedInput schema / properties / segments / description
        Added value: +"Arc segments per rounded edge"
    • Changedfind_components9 fields changed
      • changedInput schema / properties / layer / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / layer / description
        Added value: +"Exact layer (tag) name to filter by"
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 50,
        +  "description": "Page size — maximum components per response",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedInput schema / properties / max_depth / description
        Added value: +"Maximum nesting depth to search"
      • changedInput schema / properties / name / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / name / description
        Added value: +"Case-insensitive substring to match against component names"
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "How many components to skip (pagination)",
        +  "minimum": 0,
        +  "title": "Offset",
        +  "type": "integer"
        +}
      • addedInput schema / properties / response_format
        Added value: +{
        +  "default": "detailed",
        +  "description": "detailed includes bbox_mm per component; concise omits it",
        +  "enum": [
        +    "concise",
        +    "detailed"
        +  ],
        +  "title": "Response Format",
        +  "type": "string"
        +}
      • addedInput schema / properties / type / description
        Added value: +"Restrict results to groups or component instances"
    • Changedget_component_info4 fields changed
      • addedInput schema / properties / id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / id / minLength
        Removed value: -1
      • removedInput schema / properties / id / type
        Removed value: -"string"
    • Changedget_viewport_screenshot5 fields changed
      • addedInput schema / properties / max_size / description
        Added value: +"Largest side of the returned PNG in pixels; the other side follows the viewport aspect ratio"
      • addedInput schema / properties / restore_view / description
        Added value: +"Restore the camera and rendering options after the shot, leaving the user's viewport unchanged"
      • addedInput schema / properties / style / description
        Added value: +"Temporary rendering style for the shot; 'default' leaves rendering options alone"
      • addedInput schema / properties / view_preset / description
        Added value: +"Camera preset to switch to before snapping; 'current' leaves the camera alone"
      • addedInput schema / properties / zoom_extents / description
        Added value: +"Zoom to fit the whole model before snapping"
    • Changedlist_components5 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 50,
        +  "description": "Page size — maximum components per response",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedInput schema / properties / max_depth / description
        Added value: +"Maximum nesting depth to descend when recursive"
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "How many components to skip (pagination)",
        +  "minimum": 0,
        +  "title": "Offset",
        +  "type": "integer"
        +}
      • addedInput schema / properties / recursive / description
        Added value: +"Descend into nested groups/components"
      • addedInput schema / properties / response_format
        Added value: +{
        +  "default": "detailed",
        +  "description": "detailed includes bbox_mm per component; concise omits it",
        +  "enum": [
        +    "concise",
        +    "detailed"
        +  ],
        +  "title": "Response Format",
        +  "type": "string"
        +}
    • Changedset_material5 fields changed
      • addedInput schema / properties / id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / id / minLength
        Removed value: -1
      • removedInput schema / properties / id / type
        Removed value: -"string"
      • addedInput schema / properties / material / description
        Added value: +"Named color or 6-digit hex string like #a05030"
    • Changedtransform_component7 fields changed
      • addedInput schema / properties / id / anyOf
        Added value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / id / description
        Added value: +"Entity ID from a previous response (integer or its string form)"
      • removedInput schema / properties / id / minLength
        Removed value: -1
      • removedInput schema / properties / id / type
        Removed value: -"string"
      • addedInput schema / properties / position / description
        Added value: +"ABSOLUTE target for the bbox-min corner, mm"
      • addedInput schema / properties / rotation / description
        Added value: +"relative degrees around bbox center, applied X then Y then Z"
      • addedInput schema / properties / scale / description
        Added value: +"relative factors about bbox center, each |s| > 1e-9"
  2. 2 tool updatesv0.1.0
    • Addedget_version
    • Addedget_viewport_screenshot
  3. 20 tool updatesv0.0.1
    • First observedboolean_operation
    • First observedchamfer_edge
    • First observedcreate_component
    • First observedcreate_dovetail
    • First observedcreate_finger_joint
    • First observedcreate_layer
    • First observedcreate_mortise_tenon
    • First observeddelete_component
    • First observedeval_ruby
    • First observedexport_scene
    • First observedfillet_edge
    • First observedfind_components
    • First observedget_component_info
    • First observedget_model_info
    • First observedget_selection
    • First observedlist_components
    • First observedlist_layers
    • First observedset_material
    • First observedtransform_component
    • First observedundo

TDQS

A3.9/5.0

Scored across 22 tools

Disambiguation4/5

Most tools are clearly distinct (create_component vs transform_component vs delete_component; list_components vs get_component_info vs find_components). The three joint tools (create_mortise_tenon, create_dovetail, create_finger_joint) are similar in purpose but each targets a different joint type, so they are distinguishable. Some overlap exists between list_components and find_components with no filters, but descriptions clarify the difference.

Naming Consistency4/5

The naming pattern is mostly consistent verb_noun: create_*, list_*, get_*, delete_*, transform_*, set_*, export_*, eval_*, boolean_operation, chamfer_edge, fillet_edge. Minor deviations: boolean_operation, chamfer_edge, and fillet_edge use noun_verb or bare noun forms instead of verb_noun, but the pattern is still readable and predictable.

Tool Count4/5

22 tools is on the higher end but appropriate for a SketchUp MCP server covering modeling primitives, transformations, joints, booleans, edge operations, materials, layers, selection, scene export, and introspection. It is slightly heavy but each tool serves a distinct purpose in the 3D modeling workflow.

Completeness4/5

The tool surface covers core modeling operations: create, transform, delete, boolean ops, edge modifications, materials, layers, selection, and model info. Minor gaps include no explicit update/rename tool for components (though eval_ruby can cover it) and no direct tool for creating edges/faces from scratch beyond primitives, but the eval_ruby escape hatch fills many gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    F
    maintenance
    Connects Sketchup to Claude AI through the Model Context Protocol, allowing Claude to directly interact with and control Sketchup for prompt-assisted 3D modeling and scene manipulation.
    10
    409
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables direct interaction and control of SketchUp through Claude AI using the Model Context Protocol and a TCP socket connection. It allows for prompt-assisted 3D modeling, component manipulation, and the execution of arbitrary Ruby code within the SketchUp environment.
    10
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Connects Claude AI to SketchUp, allowing you to create and modify 3D models via natural language commands.
    21
    7
    MIT