An MCP server for JupyterCAD that allows you to control it using LLMs/natural language.
demo-chess_pawn.mp4
Suggestions and contributions are very welcome.
The default transport mechanism is stdio
. To start the server with stdio
, use the following command:
uvx --with jupytercad-mcp jupytercad-mcp
To use the streamable-http
transport, use this command instead:
uvx --with jupytercad-mcp jupytercad-mcp streamable-http
An example using the OpenAI Agents SDK is available at examples/openai_agents_client.py. To run it, follow these steps:
-
Clone the repository and navigate into the directory:
git clone [email protected]:asmith26/jupytercad-mcp.git cd jupytercad-mcp
-
Install the OpenAI Agents SDK. A Makefile target is provided for convenience:
make setup-examples-env
-
In examples/openai_agents_client.py, update line 13 to configure a
MODEL
(see supported models). -
Run JupyterLab from the project's root directory:
make jupyter-lab
-
In JupyterLab, create a new "CAD file" and rename it to my_cad_design.jcad. This file path matches the default
JCAD_PATH
in the example, allowing you to visualise the changes made by the JupyterCAD MCP server. -
(Optional) The OpenAI Agents SDK supports tracing to record events like LLM generations and tool calls. To enable it, set
USE_MLFLOW_TRACING=True
and run the MLflow UI:make mlflow-ui
-
Run the example with the default instruction, "Add a box with width/height/depth 1":
make example-openai-agents-client
The example includes an interactive chat interface using the OpenAI Agents SDK's
REPL utility. To enable it, set USE_REPL=True
.
To use the streamable-http
transport, first start the MCP server:
uvx --with jupytercad-mcp jupytercad-mcp streamable-http
Then, run the example with the TRANSPORT
variable set to "streamable-http"
in the client example.
The following tools are available:
- get_current_cad_design: Reads the current content of the JCAD document.
- remove: Remove an object from the document.
- rename: Rename an object in the document.
- add_annotation: Add an annotation to the document.
- remove_annotation: Remove an annotation from the document.
- add_occ_shape: Add an OpenCascade TopoDS shape to the document.
- add_box: Add a box to the document.
- add_cone: Add a cone to the document.
- add_cylinder: Add a cylinder to the document.
- add_sphere: Add a sphere to the document.
- add_torus: Add a torus to the document.
- cut: Apply a cut boolean operation between two objects.
- fuse: Apply a union boolean operation between two objects.
- intersect: Apply an intersection boolean operation between two objects.
- chamfer: Apply a chamfer operation on an object.
- fillet: Apply a fillet operation on an object.
- set_visible: Sets the visibility of an object.
- set_color: Sets the color of an object.