SketchUp MCP for SketchUp Make 2017
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SKETCHUP_MCP_HOST | No | The URL of the SketchUp plugin's HTTP server. Only needed if the port was changed in the .rb file (e.g. http://127.0.0.1:8765). | http://127.0.0.1:8080 |
| SKETCHUP_MCP_UNIT | No | The unit used for lengths taken and returned by the tools. Allowed values: m, cm, mm, inch. Internal tolerances are fixed real-world sizes. Independent of the units SketchUp displays. | m |
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
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_model_infoA | Get general information about the currently open SketchUp model: name, file path, unit system, entity/layer/material counts. |
| list_layersA | List all layers (tags) in the SketchUp model with their visibility. |
| list_materialsA | List all materials in the SketchUp model with their colors and textures. |
| list_entitiesA | List entities (faces, edges, groups, component instances) in the model or inside a named group. All lengths and coordinates are in metres. |
| list_componentsA | List all component definitions in the SketchUp model. |
| get_selectionA | Get the current SketchUp selection: for each entity, its type, id, persistent_id, tag (layer), and world-space bounds; faces also get their normal and a point on their plane. Coordinates are in metres, in world coordinates (the active group/component's transform is applied). All lengths and coordinates are in metres. |
| selectA | Replace the SketchUp selection with the given entities, so the user can see what the assistant means before something changes. Identify entities by 'ids' (persistent_id values, stable across sessions — NOT the 'id'/entityID field, which changes every session) or by 'group_names'. Selection is limited to the currently active editing context (top level, or whatever group/component the user has open for edit): a target nested elsewhere is replaced by its top-level container within that context, and the reply's 'notes' explain the substitution. |
| zoom_toA | Zoom/frame the SketchUp camera to fit the given entities (by 'ids' = persistent_id values, or 'group_names'). Does not modify the model. |
| screenshotA | Capture the SketchUp viewport as a PNG image. All temporary state changes made to take the shot (camera, hidden tags/entities, section plane, guide visibility) are rolled back afterwards, and the model's modified flag is left as it was found — this never creates an undo step. All lengths and coordinates are in metres. |
| list_wall_planesA | List vertical (wall-like) faces in a group, grouped by their plane coordinate along an axis (faces within 1.5mm of each other are clustered into one plane; each member's exact coordinate is still reported). Only faces aligned to the X or Y axis are considered (not diagonal walls). Replaces manually scripting this. All lengths and coordinates are in metres. |
| measureA | Measure distances. Three modes (provide exactly one): (1) point_a + point_b: straight-line distance. (2) face_id_a + face_id_b (persistent_id values): perpendicular distance from face B's centroid to face A's plane, plus centroid-to-centroid distance. (3) axis + at (+ optional group): a probe line along 'axis' at the given fixed coordinates on the other two axes. Returns every face the line crosses, in order (coordinate, containing group, normal_sign, material), plus the gaps between consecutive crossings — which are room widths and wall thicknesses directly. With 'group', groups nested inside it are scanned too, and each crossing names the innermost group it belongs to, which may be one of those nested groups. All lengths and coordinates are in metres. |
| audit_geometryA | Check a group (or every top-level group, if 'group' is omitted) for geometry problems: stray edges (0 faces), open edges (1 face), non-manifold edges (>2 faces), duplicate edges (same endpoints, separate edge entities — the cause of 'deleting a line deletes the wall'), near-coincident vertex pairs (<2mm, different vertex objects), tiny faces (<0.005 m², reported with the nested group they live in, counted per group in tiny_faces_by_group; faces inside closed solids such as frame end faces are skipped and only counted), non-planar faces, and mergeable coplanar seams (same material/orientation). Always recurses into nested groups. Each issue category is capped at 50 example items plus a total count. Without 'group', only the counts per group are returned (pass details:true for the example items too, which can be very long); audit one group to see where its issues are. Duplicate edges and near-coincident vertices carry a cross_group flag (the two sit in different groups: inherent and harmless) with separate counts. All lengths and coordinates are in metres. |
| changes_sinceA | Check whether the model has changed since a previous look. Pass the 'token' string you got back last time; omit it on the first call. Returns the current token, the model's modified flag, and whether it changed since the given token. The counter is scoped per file path, bumped by a model observer on every commit/undo/redo — read-only, does not itself count as a change. The token embeds a per-plugin-load session id, so a token from before SketchUp (or the plugin) restarted is always treated as changed rather than risking a false 'unchanged' against a fresh session. |
| move_planeA | Move every vertex lying on one axis-aligned plane of a group, by (to - from). This is the wall-move / room-resize operation. Takes exactly one undo step, aborts without changing anything if any face would end up non-planar, deletes edges the move stranded, and reports before/after counts (faces, edges, open edges, near-coincident vertices) so the result can be checked with audit_geometry. Refuses a move that would shift only some of a face's corners lying on that plane — which tilts the face without splitting it or making it non-planar — or that would change a face from vertical/horizontal. Reaches into nested groups inside the target group. Refuses by default if the vertices would span more than one collection — name them in 'include' or drop them with 'exclude'. Use dry_run:true to see what would change without changing it. All lengths and coordinates are in metres. |
| remap_planesA | Move several parallel planes of a group at once, in a single undo step. Aborts without changing anything if any vertex lies strictly between the mapped planes without a rule covering it — that vertex would stay put while its neighbours move, which is the silent-distortion failure mode. Use 'shift_beyond' to carry everything past a coordinate along by a fixed delta. Same post-check, tilt guard, collection guard and change report as move_plane. Reaches into nested groups inside the target group. All lengths and coordinates are in metres. |
| cut_openingA | Cut a rectangular opening (door/window) through a wall: holes in both wall faces, plus the side and head reveal faces, each oriented to point into the opening. The host group is found at any nesting depth and its composed world transform is used, so a wall nested inside another group works. from_floor:true means the opening starts at the wall's bottom: the bottom face is split and the middle removed, and no sill face is made. Refuses if an opening already exists there, so it cannot double-cut. New points snap onto existing vertices within ~3.5mm. Self-checks with classify_point (open at the centre of both faces, still covered just outside each edge and above the head) and reports the result. One undo step. Optionally builds the frame as a single U-shaped prism in one go. All lengths and coordinates are in metres. |
| fill_openingA | Fill a rectangular opening back in: removes the reveal faces, refills both wall faces copying material and orientation from the coplanar neighbour, closes the bottom again for a from_floor opening, and erases the seams so each wall side is a single face. Takes the same rectangle arguments as cut_opening. Refuses if both wall faces are already solid there. One undo step. All lengths and coordinates are in metres. |
| merge_coplanarA | Erase the seam edges between coplanar faces in a group that share the same orientation and the same front/back materials, merging them back into single faces. One undo step, same post-check and change report as move_plane. Use audit_geometry's mergeable_coplanar_seams to see what it would touch, or dry_run:true here. |
| weld_verticesA | Merge near-coincident vertex pairs in a group by moving one onto the other, which is what fixes the 'deleting a line deletes the wall' problem. Only welds vertices within the same entities collection — two vertices in different groups are genuinely separate points. With cross_group:true it instead snaps near-coincident vertices that sit in different groups/components (e.g. a wall group and its parent) exactly onto each other, moving the one in the nested group (keep:'outer', default) or the outer one (keep:'inner'); the vertices stay separate points, but the sub-millimetre gap disappears. One undo step; aborts if the weld would split or fold a face. Check the near_coincident_vertices delta in the report. All lengths and coordinates are in metres. |
| add_dimensionA | Add a real linear dimension entity between two points (not a text label). Placed on the given tag, default 'Dimensions'. One undo step. All lengths and coordinates are in metres. |
| saveA | Save the current SketchUp model in place. Fails if the model has never been saved. |
| save_copyA | Save a copy of the model alongside the original as '_.skp', leaving the open file untouched. Defaults the suffix to a timestamp. Use this to take a backup before a risky batch of edits. |
| create_faceB | Create a flat face (polygon) in SketchUp from an ordered list of 3D points. All coordinates are in METRES (the plugin converts to SketchUp's internal inches). All lengths and coordinates are in metres. |
| create_edgeB | Create a line segment (edge) between two 3D points. All lengths and coordinates are in metres. |
| create_groupB | Create an empty named group in SketchUp, optionally on a layer. |
| create_boxC | Create a 3-D box (rectangular prism) as a named group, by specifying width, depth, height in metres. Optionally provide an origin [x, y, z] for the base corner. All lengths and coordinates are in metres. |
| create_circleB | Create a circle in SketchUp from a center point, normal vector, and radius. Returns edges forming the circle. All lengths and coordinates are in metres. |
| create_arcB | Create an arc in SketchUp. Specify center, radius, start/end angles in degrees. All lengths and coordinates are in metres. |
| create_polygonC | Create a regular polygon (triangle, pentagon, hexagon, etc.) with n sides. All lengths and coordinates are in metres. |
| push_pullA | Push/pull a face by a specified distance. Positive distance extrudes outward, negative pulls inward. All lengths and coordinates are in metres. |
| follow_meB | Extrude a face along a path (array of edge IDs). This is SketchUp's Follow Me tool. |
| move_entityB | Move (translate) an entity by a vector [x, y, z]. All lengths and coordinates are in metres. |
| rotate_entityB | Rotate an entity around an axis by a given angle in degrees. All lengths and coordinates are in metres. |
| scale_entityB | Scale an entity. Provide a single number for uniform scaling, or [x, y, z] array for non-uniform scaling. All lengths and coordinates are in metres. |
| create_componentB | Create a new (empty) component definition and place one instance in the model. Returns the definition name and instance ID. All lengths and coordinates are in metres. |
| place_componentB | Place an instance of an existing component definition into the model at a given origin. All lengths and coordinates are in metres. |
| create_roof_trussA | Create engineered roof trusses with accurate geometry based on professional truss analysis. Supports king post (simple, up to 26') and fink/W-truss (most common, 20-60'). NOTE: unlike every other tool, this one uses US units (span in feet, other lengths in inches). Trusses include proper web patterns, angled members, and realistic connections. Use construction://roof-trusses resource for detailed guidance. |
| execute_rubyA | Execute arbitrary Ruby code inside SketchUp. The code runs at the top level (not inside the plugin's SU_MCP module; call its helpers as SU_MCP.name) and has full access to the SketchUp Ruby API (Sketchup, Geom, UI, etc.). Returns the result of the last expression and any puts/print output. SketchUp Make 2017 (Ruby 2.2): do NOT use Ruby 2.3+ syntax such as |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Roof Truss Design Guide | Comprehensive guide for roof truss design including types, dimensions, and code requirements |
| Framing Standards | Standard framing practices for walls, floors, headers, and openings |
| Stair Design Standards | Building code requirements, design formulas, stair types, and calculation methods |
TDQS
Scored across 38 tools
Most tools target a clearly distinct operation, and create_* primitives (face, edge, circle, arc, polygon) are distinguishable by shape. The one soft overlap is move_plane vs remap_planes and measure vs audit_geometry, but their descriptions explain the boundaries well enough to avoid misselection.
Names are consistently snake_case and verb-first (list_materials, create_face, cut_opening, move_entity). A few are bare verbs (select, save, measure, push_pull, follow_me), which is a minor deviation but still readable and predictable.
38 tools is heavy and above the comfortable 15-25 band, but the domain is broad (read/model info, creation primitives, transforms, opening cut/fill, geometry cleanup, audit, file ops, Ruby escape hatch), so most tools earn their place. It is on the borderline of over-scoped rather than clearly excessive.
Coverage is strong across read, create, transform, clean-up, audit and save workflows, with an execute_ruby fallback that fills most gaps. Minor holes remain: no explicit delete/erase-entity tool, no material creation/assignment, and no layer creation.