Skip to main content
Glama
yonnayy

SketchUp MCP untuk Windows

by yonnayy

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
create_componentA

Create a primitive (type: cube, cylinder, sphere, cone) as a group.

position and dimensions are in INCHES (SketchUp's internal unit).
For a cylinder, position is the corner of its bounding box (not the
centre) and dimensions are [diameter, ignored, height].
A cube placed at z=0 extrudes DOWNWARD (z from -height to 0).
For real modelling work prefer eval_ruby.
delete_componentB

Delete a component by ID

transform_componentB

Move, rotate or scale an entity by ID.

position is a RELATIVE translation in inches (it is added to the current position, it is not an absolute target). rotation is in degrees.

get_selectionA

List the entities the user currently has selected in SketchUp (id, type, bounds).

set_materialA

Paint an entity with a named colour.

Supported names: red, green, blue, yellow, cyan, magenta, white, black,
brown, orange, gray. For any other colour use eval_ruby with
Sketchup::Color.new(r, g, b).
export_sceneA

Export the current model. format: png, jpg, skp, obj, dae, stl.

The file is written to the sketchup_exports folder inside %TEMP% and its full path is
returned in content[0].text. Use format='png' to get a screenshot of the
current view so you can check the model visually.
build_floor_planA

Turn a floor plan into 3D walls, doors, windows and a floor slab, already tagged and given materials according to the house rules.

All numbers are METRES. Coordinates are [x, y] on the ground plane.
spec = {
  "building": "Rumah A",         # container group for the whole building
  "name": "Lantai 1",            # name of this floor's group
  "wall_height": 3.0,            # default height
  "wall_thickness": 0.15,        # default thickness
  "base_z": 0,                   # floor level (use 3.2 etc. for upper floors)
  "wall_ref": "center",          # default for "ref" below
  "walls": [                     # from/to line of each wall, see "ref"
    {"id": "W1", "from": [0, 0], "to": [6, 0]},
    {"id": "W2", "from": [6, 0], "to": [6, 4], "thickness": 0.1, "height": 2.8}
  ],
  "openings": [                  # offset = distance from the wall's "from"
    {"wall": "W1", "type": "door",   "offset": 1.0, "width": 0.9, "height": 2.1},
    {"wall": "W2", "type": "window", "offset": 1.2, "width": 1.5, "sill": 0.9, "height": 1.2}
  ],
  "slab": {"outline": [[0, 0], [6, 0], [6, 4], [0, 4]], "thickness": 0.12}
}
An opening with no "sill" (or sill 0) is a door; with a sill it is a window.
Doors get a 4 cm leaf and windows a 1 cm glass pane ("infill": false for
plain holes). Walls and slab accept "material": "Dinding - Bata Ekspos".
"ref" on a wall says what its from/to line is: "center" (centreline,
the default), "left" or "right" (that face of the wall, as seen walking
from `from` to `to`; the wall body lies on the other side). Use the one
the plan is dimensioned to, or the error equals the wall thickness:
- outside dimensions of the building: trace the outline anticlockwise
  with "ref": "right";
- clear (inside) dimensions of a room: trace the room anticlockwise
  with "ref": "left";
- grid/axis dimensions: "center".
Where walls meet, their ends are lengthened or trimmed automatically so
corners close and walls do not overlap ("extend": false, a number, or
[start, end] in metres overrides that for one wall).
The whole plan is one undo step. The reply reports the built size and any
opening that was skipped (for example because it does not fit the wall):
read it, then call verify_dimensions and look at export_scene(format="png").
check_dimension_chainsA

Check that the dimension strings on a plan add up, BEFORE modelling.

chains = [
  {"label": "Sisi depan", "segments": [1.0, 0.9, 0.5, 1.5, 2.1], "total": 6.0},
  {"label": "Sisi kiri",  "segments": [3.0, 3.0], "total": 6.0}
]
All numbers in metres. For every chain the segments are summed and compared
with the overall dimension. Does not need SketchUp. If any chain is in
conflict, show the user which one and ask which number wins; do not guess.
verify_dimensionsA

Measure the model in SketchUp and compare it with the plan (accuracy report).

checks (metres) can mix three kinds:
  {"label": "Panjang luar", "overall": "x", "expected": 6.0}
      outside size of all walls along x or y; optional "building" and
      "floor" (group names) limit which walls are counted
  {"label": "Kamar tidur 1", "at": [1.5, 4.5], "expected": [2.8, 2.8]}
      clear room size through that point: [along x, along y]
  {"label": "Lebar koridor", "at": [3, 2], "axis": "y", "expected": 1.2}
      one clear distance; axis is "x", "y" or an angle in degrees
"at" is any point inside the room, away from the walls. Clear distances
are measured between wall faces (doors, glass and furniture are ignored;
openings do not fool it). Add "z" (floor level) for upper floors. Leave
"expected" out to just read a dimension.
Every line is OK or SELISIH with the difference in mm. Run this after
build_floor_plan with the key dimensions from the plan, fix what differs,
and pass the report on to the user.
eval_rubyA

Run Ruby code inside SketchUp (full SketchUp Ruby API) and return the value of the last expression as a string.

This is the main modelling tool. Rules that avoid the usual mistakes:
- Lengths are inches internally. Write 3.m, 150.mm, 15.cm, never bare numbers.
- model = Sketchup.active_model; wrap edits in
  model.start_operation('name', true) ... model.commit_operation.
- A face on the ground plane (z=0) has its normal pointing down, so
  pushpull(+h) would go underground: face.reverse! if face.normal.z < 0.
- Create each element with SU_MCP.element(name, kind, parent) { |ents| ... }
  so it gets the standard tag and material; parent = SU_MCP.container('Rumah A').
- End with SU_MCP.audit_model; the work is done only when it says AUDIT OK.
- Make the last expression a short summary string (counts, bounds) so you
  can verify the result. Calls time out after about 15 seconds, so split
  very large jobs into several calls.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation3/5

Most tools have distinct purposes, but eval_ruby is a universal backdoor that overlaps with create_component, transform_component, set_material, delete_component, and parts of build_floor_plan. The descriptions help by explaining when to prefer wrappers versus Ruby, but an agent may still hesitate over whether to use a narrow tool or eval_ruby for many edits.

Naming Consistency5/5

All names are lower snake_case and follow a verb_noun or verb_phrase pattern such as get_selection, create_component, verify_dimensions, and build_floor_plan. There are no mixed conventions or vague names.

Tool Count5/5

10 tools is well-scoped for a SketchUp modeling server: selection, transform, material, export, floor-plan building, dimension checks, primitive create/delete, Ruby eval, and verification. Each tool maps to a meaningful operation, even if some overlap with eval_ruby.

Completeness4/5

The set covers the core modeling lifecycle: read selection, create/delete/transform entities, assign material, export, build floor plans, check dimensions before modeling, verify after, and run arbitrary Ruby. Minor gaps remain for general querying/listing of non-selected model entities and richer scene/camera control, but eval_ruby provides a workaround.

Maintenance

ActivityMaintained
ResponsivenessNo issues