sketchup-mcp
# SketchupMCP - Sketchup Model Context Protocol Integration
SketchupMCP connects Sketchup to Claude AI through the Model Context Protocol (MCP), allowing Claude to directly interact with and control Sketchup. This integration enables prompt-assisted 3D modeling, scene creation, and manipulation in Sketchup.
Big Shoutout to [Blender MCP](https://github.com/ahujasid/blender-mcp) for the inspiration and structure.
## Features
* **Two-way communication**: Connect Claude AI to Sketchup through a TCP socket connection
* **Component manipulation**: Create, modify, delete, and transform components in Sketchup
* **Material control**: Apply and modify materials and colors
* **Scene inspection**: Get detailed information about the current Sketchup scene
* **Selection handling**: Get and manipulate selected components
* **Ruby code evaluation**: Execute arbitrary Ruby code directly in SketchUp for advanced operations
## Components
The system consists of two main components:
1. **Sketchup Extension**: A Sketchup extension that creates a TCP server within Sketchup to receive and execute commands
2. **MCP Server (`sketchup_mcp/server.py`)**: A Python server that implements the Model Context Protocol and connects to the Sketchup extension
## Installation
### Python Packaging
We're using uv so you'll need to ```brew install uv```
### Sketchup Extension
1. Download or build the latest `.rbz` file
2. In Sketchup, go to Window > Extension Manager
3. Click "Install Extension" and select the downloaded `.rbz` file
4. Restart Sketchup
## Usage
### Starting the Connection
1. In Sketchup, go to Extensions > SketchupMCP > Start Server
2. The server will start on the default port (9876)
3. Make sure the MCP server is running in your terminal
### Using with Claude
Configure Claude to use the MCP server by adding the following to your Claude configuration:
```json
"mcpServers": {
"sketchup": {
"command": "uvx",
"args": [
"sketchup-mcp"
]
}
}
```
This will pull the [latest from PyPI](https://pypi.org/project/sketchup-mcp/)
Once connected, Claude can interact with Sketchup using the following capabilities:
#### Tools
* `get_scene_info` - Gets information about the current Sketchup scene
* `get_selected_components` - Gets information about currently selected components
* `create_component` - Create a new component with specified parameters
* `delete_component` - Remove a component from the scene
* `transform_component` - Move, rotate, or scale a component
* `set_material` - Apply materials to components
* `export_scene` - Export the current scene to various formats
* `eval_ruby` - Execute arbitrary Ruby code in SketchUp for advanced operations
### Example Commands
Here are some examples of what you can ask Claude to do:
* "Create a simple house model with a roof and windows"
* "Select all components and get their information"
* "Make the selected component red"
* "Move the selected component 10 units up"
* "Export the current scene as a 3D model"
* "Create a complex arts and crafts cabinet using Ruby code"
## Troubleshooting
* **Connection issues**: Make sure both the Sketchup extension server and the MCP server are running
* **Command failures**: Check the Ruby Console in Sketchup for error messages
* **Timeout errors**: Try simplifying your requests or breaking them into smaller steps
## Technical Details
### Communication Protocol
The system uses a simple JSON-based protocol over TCP sockets:
* **Commands** are sent as JSON objects with a `type` and optional `params`
* **Responses** are JSON objects with a `status` and `result` or `message`
## Development
### Running from source
Point your MCP client at the checkout instead of PyPI:
```json
"mcpServers": {
"sketchup": {
"command": "uv",
"args": ["--directory", "/path/to/sketchup-mcp", "run", "python", "-m", "sketchup_mcp"]
}
}
```
Install the extension by copying `su_mcp/su_mcp.rb` and `su_mcp/su_mcp/` into your
`SketchUp/Plugins` folder. The server starts on load; the Extensions > MCP Server
menu can stop and restart it.
`SKETCHUP_MCP_TIMEOUT` (seconds, default 60) caps how long the client waits for a
reply, for models heavy enough to need more.
### Tests
```sh
ruby test/socket_test.rb
```
This exercises the extension's socket layer with Sketchup stubbed out and the
timer driven by hand, which makes the awkward cases cheap to check: a client that
connects and says nothing, a peer that disappears mid-reply, ten clients at once,
and a large reply that must not be dumped into the Ruby Console. Those first and
last cases each froze Sketchup at some point, so they are worth keeping honest.
Point it at a different file to compare implementations:
```sh
MAIN_RB=/path/to/other/main.rb ruby test/socket_test.rb
```
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## License
MIT TDQS
Scored across 10 tools
Most tools have clearly distinct purposes (selection, CRUD, materials, export). The three joint creation tools are similar in structure and verb, differing only by joint type, which could be ambiguous for agents unfamiliar with woodworking terminology.
All tools follow a consistent verb_noun pattern using snake_case, such as create_component, delete_component, export_scene. Even eval_ruby is verb_noun, and joint tools consistently use create_<joint_type>, making the naming highly predictable.
10 tools is within the ideal 3-15 range. Each tool serves a distinct purpose, and the three joint tools represent specific sub-types rather than redundant operations. eval_ruby provides a general escape hatch, so no tool feels unnecessary.
The set covers core component lifecycle (create, delete, transform, set material), selection, scene export, and specialized joints. Missing a direct get_component or list_components operation is a minor gap, but get_selection and eval_ruby can bridge it, so most workflows are supported.