sketchup-mcp2
The sketchup-mcp2 server connects AI clients (like Claude) to a live SketchUp session, enabling prompt-driven 3D modeling through the following capabilities:
Geometry Creation & Manipulation
Create 3D primitives (cubes, cylinders, cones, spheres) at specified positions and dimensions (in mm)
Delete components by entity ID
Move, rotate, or scale components in 3D space
Materials
Apply named colors or hex
#rrggbbvalues to components
Boolean Operations
Union, difference, or intersection between two solid components
Edge Operations
Chamfer (bevel) and fillet (round) edges with configurable distance/radius
Woodworking Joinery
Mortise & tenon, dovetail, and finger/box joints with configurable dimensions
Scene Export
Export in SKP, OBJ, DAE, STL, PNG, or JPG formats
Model Introspection
Query model info (file path, title, units, bounding box, entity count)
List, find, and get details on components by name, type, or layer
Manage layers (list, create) and retrieve the current selection
Visual Feedback
Capture viewport screenshots (SketchUp 2026+) with configurable view presets, rendering styles, zoom extents, and resolution
History & Escape Hatch
Undo the last atomic operation
Execute arbitrary Ruby code inside SketchUp for full API access (disabled by default in the warehouse build for security)
Other
Version handshake for Python↔Ruby compatibility checks
Supports multiple concurrent MCP clients with serialized operations
All dimensions in millimeters, angles in degrees
Provides tools for creating, modifying, and manipulating 3D models in SketchUp, including component management, boolean operations, joinery, and scene export.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sketchup-mcp2Create a 3D cube and color it blue"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Server for SketchUp
Connect Claude (or any MCP-aware AI client) to SketchUp for prompt-driven 3D modeling.
Two-process bridge:
Python MCP server (
sketchup-mcp2on 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>.rbzIn 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 |
|
Materials |
|
Booleans |
|
Edge ops |
|
Joinery |
|
Export |
|
Introspection |
|
View |
|
Lifecycle |
|
Escape hatch |
|
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
hellocarryingclient_version; the server validates against its supported range and replies withserver_version+client_id. Incompatible pairs surface immediately asIncompatibleVersionErrorand the socket is closed.Atomic undo — every mutating handler wraps the edit in
model.start_operation/commit_operation, so a singleEdit → Undorolls 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 reversedGroup#subtract).Settings dialog —
Plugins → 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 |
|
| Where to connect to the SketchUp extension |
|
| TCP port |
|
| Per-tool-call timeout (seconds) |
|
|
|
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.0exposes the MCP server — includingeval_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_rubywith 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 modelThe 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}.pyRuby:
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 testsLive 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-clientFor 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-permissionsandeval_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 theUV_PROJECT_ENVIRONMENTnote 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
hellohandshake, 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 issketchup-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 toolsboolean_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).
| Name | Required | Description | Default |
|---|---|---|---|
| tool_id | Yes | Entity ID from a previous response (integer or its string form) | |
| operation | No | union, difference (target minus tool), or intersection | union |
| target_id | Yes | Entity ID from a previous response (integer or its string form) | |
| delete_originals | No | erase the two source bodies after a successful operation |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID from a previous response (integer or its string form) | |
| distance | No | Chamfer distance in mm |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional name for the new group so find_components can locate it later | |
| type | No | Primitive type to create | cube |
| position | No | Bounding-box MIN corner [x, y, z] in mm (not the center) | |
| dimensions | No | Sizes [x, y, z] in mm; cylinder/cone use [0]=diameter, [2]=height; sphere uses [0]=diameter |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| angle | No | Dovetail flare angle in degrees, 0 < angle <= 60 | |
| depth | No | Joint depth in mm | |
| width | No | Joint width in mm | |
| height | No | Joint height in mm | |
| pin_id | Yes | Entity ID from a previous response (integer or its string form) | |
| tail_id | Yes | Entity ID from a previous response (integer or its string form) | |
| offset_x | No | Joint offset from the board face's center along X, mm | |
| offset_y | No | Joint offset from the board face's center along Y, mm | |
| offset_z | No | Joint offset from the board face's center along Z, mm | |
| num_tails | No | Number of tails |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Joint depth in mm | |
| width | No | Joint width in mm | |
| height | No | Joint height in mm | |
| offset_x | No | Joint offset from the board face's center along X, mm | |
| offset_y | No | Joint offset from the board face's center along Y, mm | |
| offset_z | No | Joint offset from the board face's center along Z, mm | |
| board1_id | Yes | Entity ID from a previous response (integer or its string form) | |
| board2_id | Yes | Entity ID from a previous response (integer or its string form) | |
| num_fingers | No | Number of fingers |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the new layer |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Joint depth in mm | |
| width | No | Joint width in mm | |
| height | No | Joint height in mm | |
| offset_x | No | Joint offset from the board face's center along X, mm | |
| offset_y | No | Joint offset from the board face's center along Y, mm | |
| offset_z | No | Joint offset from the board face's center along Z, mm | |
| tenon_id | Yes | Entity ID from a previous response (integer or its string form) | |
| mortise_id | Yes | Entity ID from a previous response (integer or its string form) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID from a previous response (integer or its string form) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Ruby code to evaluate inside SketchUp |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | skp (native), obj / dae / stl (geometry), png / jpg (viewport render) | skp |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID from a previous response (integer or its string form) | |
| radius | No | Fillet radius in mm | |
| segments | No | Arc segments per rounded edge |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Case-insensitive substring to match against component names | |
| type | No | Restrict results to groups or component instances | |
| layer | No | Exact layer (tag) name to filter by | |
| limit | No | Page size — maximum components per response | |
| offset | No | How many components to skip (pagination) | |
| max_depth | No | Maximum nesting depth to search | |
| response_format | No | detailed includes bbox_mm per component; concise omits it | detailed |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID from a previous response (integer or its string form) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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[]}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
currentleaves the camera alone.zoom_extents: call view.zoom_extents before snapping.
style: temporarily flip a small set of rendering_options keys.
defaultleaves 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.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | Temporary rendering style for the shot; 'default' leaves rendering options alone | default |
| max_size | No | Largest side of the returned PNG in pixels; the other side follows the viewport aspect ratio | |
| view_preset | No | Camera preset to switch to before snapping; 'current' leaves the camera alone | current |
| restore_view | No | Restore the camera and rendering options after the shot, leaving the user's viewport unchanged | |
| zoom_extents | No | Zoom to fit the whole model before snapping |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size — maximum components per response | |
| offset | No | How many components to skip (pagination) | |
| max_depth | No | Maximum nesting depth to descend when recursive | |
| recursive | No | Descend into nested groups/components | |
| response_format | No | detailed includes bbox_mm per component; concise omits it | detailed |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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}]}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID from a previous response (integer or its string form) | |
| material | Yes | Named color or 6-digit hex string like #a05030 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Entity ID from a previous response (integer or its string form) | |
| scale | No | relative factors about bbox center, each |s| > 1e-9 | |
| position | No | ABSOLUTE target for the bbox-min corner, mm | |
| rotation | No | relative degrees around bbox center, applied X then Y then Z |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
17 tool updates
v0.3.0- Changed
boolean_operation10 fields changed- added
Input schema / properties / delete_originals / descriptionAdded value: +"erase the two source bodies after a successful operation" - added
Input schema / properties / operation / descriptionAdded value: +"union, difference (target minus tool), or intersection" - added
Input schema / properties / target_id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / target_id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / target_id / minLengthRemoved value: -1 - removed
Input schema / properties / target_id / typeRemoved value: -"string" - added
Input schema / properties / tool_id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / tool_id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / tool_id / minLengthRemoved value: -1 - removed
Input schema / properties / tool_id / typeRemoved value: -"string"
- Changed
chamfer_edge5 fields changed- added
Input schema / properties / distance / descriptionAdded value: +"Chamfer distance in mm" - added
Input schema / properties / id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / id / minLengthRemoved value: -1 - removed
Input schema / properties / id / typeRemoved value: -"string"
- Changed
create_component7 fields changed- changed
Input schema / properties / dimensions / defaultPrevious value: -[ - 1, - 1, - 1 -]New value: +[ + 100, + 100, + 100 +] - added
Input schema / properties / dimensions / descriptionAdded value: +"Sizes [x, y, z] in mm; cylinder/cone use [0]=diameter, [2]=height; sphere uses [0]=diameter" - removed
Input schema / properties / dimensions / items / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / dimensions / items / minimumAdded value: +0.1 - added
Input schema / properties / nameAdded 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" +} - added
Input schema / properties / position / descriptionAdded value: +"Bounding-box MIN corner [x, y, z] in mm (not the center)" - added
Input schema / properties / type / descriptionAdded value: +"Primitive type to create"
- Changed
create_dovetail17 fields changed- added
Input schema / properties / angle / descriptionAdded value: +"Dovetail flare angle in degrees, 0 < angle <= 60" - added
Input schema / properties / angle / maximumAdded value: +60 - added
Input schema / properties / depth / descriptionAdded value: +"Joint depth in mm" - added
Input schema / properties / height / descriptionAdded value: +"Joint height in mm" - added
Input schema / properties / num_tails / descriptionAdded value: +"Number of tails" - added
Input schema / properties / offset_x / descriptionAdded value: +"Joint offset from the board face's center along X, mm" - added
Input schema / properties / offset_y / descriptionAdded value: +"Joint offset from the board face's center along Y, mm" - added
Input schema / properties / offset_z / descriptionAdded value: +"Joint offset from the board face's center along Z, mm" - added
Input schema / properties / pin_id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / pin_id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / pin_id / minLengthRemoved value: -1 - removed
Input schema / properties / pin_id / typeRemoved value: -"string" - added
Input schema / properties / tail_id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / tail_id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / tail_id / minLengthRemoved value: -1 - removed
Input schema / properties / tail_id / typeRemoved value: -"string" - added
Input schema / properties / width / descriptionAdded value: +"Joint width in mm"
- Changed
create_finger_joint15 fields changed- added
Input schema / properties / board1_id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / board1_id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / board1_id / minLengthRemoved value: -1 - removed
Input schema / properties / board1_id / typeRemoved value: -"string" - added
Input schema / properties / board2_id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / board2_id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / board2_id / minLengthRemoved value: -1 - removed
Input schema / properties / board2_id / typeRemoved value: -"string" - added
Input schema / properties / depth / descriptionAdded value: +"Joint depth in mm" - added
Input schema / properties / height / descriptionAdded value: +"Joint height in mm" - added
Input schema / properties / num_fingers / descriptionAdded value: +"Number of fingers" - added
Input schema / properties / offset_x / descriptionAdded value: +"Joint offset from the board face's center along X, mm" - added
Input schema / properties / offset_y / descriptionAdded value: +"Joint offset from the board face's center along Y, mm" - added
Input schema / properties / offset_z / descriptionAdded value: +"Joint offset from the board face's center along Z, mm" - added
Input schema / properties / width / descriptionAdded value: +"Joint width in mm"
- Changed
create_layer1 field changed- added
Input schema / properties / name / descriptionAdded value: +"Name for the new layer"
- Changed
create_mortise_tenon14 fields changed- added
Input schema / properties / depth / descriptionAdded value: +"Joint depth in mm" - added
Input schema / properties / height / descriptionAdded value: +"Joint height in mm" - added
Input schema / properties / mortise_id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / mortise_id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / mortise_id / minLengthRemoved value: -1 - removed
Input schema / properties / mortise_id / typeRemoved value: -"string" - added
Input schema / properties / offset_x / descriptionAdded value: +"Joint offset from the board face's center along X, mm" - added
Input schema / properties / offset_y / descriptionAdded value: +"Joint offset from the board face's center along Y, mm" - added
Input schema / properties / offset_z / descriptionAdded value: +"Joint offset from the board face's center along Z, mm" - added
Input schema / properties / tenon_id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / tenon_id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / tenon_id / minLengthRemoved value: -1 - removed
Input schema / properties / tenon_id / typeRemoved value: -"string" - added
Input schema / properties / width / descriptionAdded value: +"Joint width in mm"
- Changed
delete_component4 fields changed- added
Input schema / properties / id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / id / minLengthRemoved value: -1 - removed
Input schema / properties / id / typeRemoved value: -"string"
- Changed
eval_ruby1 field changed- added
Input schema / properties / code / descriptionAdded value: +"Ruby code to evaluate inside SketchUp"
- Changed
export_scene1 field changed- added
Input schema / properties / format / descriptionAdded value: +"skp (native), obj / dae / stl (geometry), png / jpg (viewport render)"
- Changed
fillet_edge6 fields changed- added
Input schema / properties / id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / id / minLengthRemoved value: -1 - removed
Input schema / properties / id / typeRemoved value: -"string" - added
Input schema / properties / radius / descriptionAdded value: +"Fillet radius in mm" - added
Input schema / properties / segments / descriptionAdded value: +"Arc segments per rounded edge"
- Changed
find_components9 fields changed- changed
Input schema / properties / layer / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / layer / descriptionAdded value: +"Exact layer (tag) name to filter by" - added
Input schema / properties / limitAdded value: +{ + "default": 50, + "description": "Page size — maximum components per response", + "maximum": 500, + "minimum": 1, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / max_depth / descriptionAdded value: +"Maximum nesting depth to search" - changed
Input schema / properties / name / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / name / descriptionAdded value: +"Case-insensitive substring to match against component names" - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "How many components to skip (pagination)", + "minimum": 0, + "title": "Offset", + "type": "integer" +} - added
Input schema / properties / response_formatAdded value: +{ + "default": "detailed", + "description": "detailed includes bbox_mm per component; concise omits it", + "enum": [ + "concise", + "detailed" + ], + "title": "Response Format", + "type": "string" +} - added
Input schema / properties / type / descriptionAdded value: +"Restrict results to groups or component instances"
- Changed
get_component_info4 fields changed- added
Input schema / properties / id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / id / minLengthRemoved value: -1 - removed
Input schema / properties / id / typeRemoved value: -"string"
- Changed
get_viewport_screenshot5 fields changed- added
Input schema / properties / max_size / descriptionAdded value: +"Largest side of the returned PNG in pixels; the other side follows the viewport aspect ratio" - added
Input schema / properties / restore_view / descriptionAdded value: +"Restore the camera and rendering options after the shot, leaving the user's viewport unchanged" - added
Input schema / properties / style / descriptionAdded value: +"Temporary rendering style for the shot; 'default' leaves rendering options alone" - added
Input schema / properties / view_preset / descriptionAdded value: +"Camera preset to switch to before snapping; 'current' leaves the camera alone" - added
Input schema / properties / zoom_extents / descriptionAdded value: +"Zoom to fit the whole model before snapping"
- Changed
list_components5 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 50, + "description": "Page size — maximum components per response", + "maximum": 500, + "minimum": 1, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / max_depth / descriptionAdded value: +"Maximum nesting depth to descend when recursive" - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "How many components to skip (pagination)", + "minimum": 0, + "title": "Offset", + "type": "integer" +} - added
Input schema / properties / recursive / descriptionAdded value: +"Descend into nested groups/components" - added
Input schema / properties / response_formatAdded value: +{ + "default": "detailed", + "description": "detailed includes bbox_mm per component; concise omits it", + "enum": [ + "concise", + "detailed" + ], + "title": "Response Format", + "type": "string" +}
- Changed
set_material5 fields changed- added
Input schema / properties / id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / id / minLengthRemoved value: -1 - removed
Input schema / properties / id / typeRemoved value: -"string" - added
Input schema / properties / material / descriptionAdded value: +"Named color or 6-digit hex string like #a05030"
- Changed
transform_component7 fields changed- added
Input schema / properties / id / anyOfAdded value: +[ + { + "type": "integer" + }, + { + "minLength": 1, + "type": "string" + } +] - added
Input schema / properties / id / descriptionAdded value: +"Entity ID from a previous response (integer or its string form)" - removed
Input schema / properties / id / minLengthRemoved value: -1 - removed
Input schema / properties / id / typeRemoved value: -"string" - added
Input schema / properties / position / descriptionAdded value: +"ABSOLUTE target for the bbox-min corner, mm" - added
Input schema / properties / rotation / descriptionAdded value: +"relative degrees around bbox center, applied X then Y then Z" - added
Input schema / properties / scale / descriptionAdded value: +"relative factors about bbox center, each |s| > 1e-9"
2 tool updates
v0.1.0- Added
get_version - Added
get_viewport_screenshot
20 tool updates
v0.0.1- First observed
boolean_operation - First observed
chamfer_edge - First observed
create_component - First observed
create_dovetail - First observed
create_finger_joint - First observed
create_layer - First observed
create_mortise_tenon - First observed
delete_component - First observed
eval_ruby - First observed
export_scene - First observed
fillet_edge - First observed
find_components - First observed
get_component_info - First observed
get_model_info - First observed
get_selection - First observed
list_components - First observed
list_layers - First observed
set_material - First observed
transform_component - First observed
undo
TDQS
Scored across 22 tools
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.
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.
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.
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
Related MCP Connectors
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Persistent context for Claude. Your AI always knows your projects and next actions across sessions.
- platform7nOAuthtech.p7n
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
Create projects, nodes, and tasks in UluP Spaces by conversation with Claude.
Related MCP Servers
- AlicenseBqualityFmaintenanceConnects 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.10409MIT
- AlicenseBqualityCmaintenanceIntegration that connects Sketchup to Claude AI through the Model Context Protocol, allowing Claude to directly interact with and control Sketchup for prompt-assisted 3D modeling, scene creation, and manipulation.1025MIT
- AlicenseBqualityDmaintenanceEnables 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.10MIT
- AlicenseAqualityCmaintenanceConnects Claude AI to SketchUp, allowing you to create and modify 3D models via natural language commands.217MIT