Zoo MCP Server
OfficialZoo MCP Server exposes Zoo CAD, KCL, modeling, documentation, sample, and organization-data utilities as MCP tools.
Execute, evaluate, mock-execute, format, lint/fix, and inspect KCL code or projects, including sketch constraint reports and sketch rendering.
Calculate CAD properties such as mass, volume, surface area, center of mass, and bounding box; convert CAD files between formats.
Manage persistent modeling sessions: import CAD, execute KCL into a scene, take snapshots, query faces/curves/edges/entities, measure distances, select/highlight entities, and control the camera.
Browse and search KCL documentation and public KCL sample projects.
List and search organization datasets and skills, including semantic dataset search.
Run the server over stdio or Streamable HTTP and integrate it with MCP clients or Python code using saved Zoo login/API token authentication.
Supports importing, converting, exporting, and analyzing glTF/GLB CAD files, including bounding-box, volume, mass, surface-area, and center-of-mass calculations.
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., "@Zoo MCP ServerCreate a 3D cube with side length 10mm using KCL"
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.
Zoo Model Context Protocol (MCP) Server
An MCP server housing various Zoo built utilities
Prerequisites
A Zoo account. Run uvx zoo-mcp auth login once before starting the server.
The command opens your browser and prints a verification URL and code.
The server reuses your saved login; public tools also work without login.
You can also use an API key:
export ZOO_API_TOKEN="your_api_key_here"Related MCP server: FreeCAD MCP
Installation
uv venvInstall the package from GitHub
uv pip install git+ssh://git@github.com/KittyCAD/mcp.git
Running the Server
The server can be started by using uvx
uvx zoo-mcpThe server can be started locally by using uv and the zoo_mcp module
uv run -m zoo_mcpManage device login explicitly:
uvx zoo-mcp auth login
uvx zoo-mcp auth login --no-browser
uvx zoo-mcp auth status
uvx zoo-mcp auth logoutLogins are saved per API origin in your system credential store using
keyring: macOS Keychain, Windows Credential
Locker, or a supported Linux keyring. On headless systems without an available
keyring, set ZOO_API_TOKEN instead. Status never displays tokens. Logout removes
only the saved login for the current origin; restart running servers afterward.
If your login expires or is revoked, run auth login again and restart the server.
If the login command fails because of a network error, run it again to retry.
Server startup never opens a browser. Device authorization and polling use
requests-oauth2client.
Device login requires the API's dedicated Zoo MCP device client registration.
The server can also be run with the mcp package
uv run mcp run src/zoo_mcp/server.pyStreamable HTTP
The server uses stdio by default. To serve the same tools over Streamable HTTP:
uvx zoo-mcp --transport streamable-http --host 127.0.0.1 --port 8000
# From a local checkout:
uv run -m zoo_mcp --transport streamable-httpConnect an MCP client to http://127.0.0.1:8000/mcp. The SDK manages HTTP
sessions and streaming responses. --host and --port configure the HTTP
listener; their defaults are 127.0.0.1 and 8000.
Supplying client configuration from Python
Local entry points capture credentials when Zoo MCP is imported at startup.
Token precedence is KITTYCAD_API_TOKEN, ZOO_API_TOKEN, then the registry's
ZOO_TOKEN alias. Any explicit environment token bypasses saved/device login.
API origin precedence is ZOO_HOST, KITTYCAD_HOST, then https://api.zoo.dev.
Saved logins never cross API origins.
Applications can supply client configuration explicitly without changing the process environment or adding authentication arguments to MCP tools:
from zoo_mcp.client_config import ZooClientConfig, use_client_config
from zoo_mcp.server import mcp
with use_client_config(ZooClientConfig(token=api_token, base_url=api_origin)):
result = await mcp.call_tool("list_org_datasets", {})The context supplies the same token, origin, and headers to the KittyCAD SDK and KCL session constructors and restores the previous configuration on exit. New calls can use refreshed configuration. Finish child tasks before leaving their configuration context. An explicit configuration context also prevents the server lifespan from loading a saved local login. Hosted workers and embeddings should always use this interface.
To forward custom HTTP headers, pass headers={"User-Agent": "MyApp/1.0", "X-Request-Source": "example"} to ZooClientConfig. These headers reach REST
requests and modeling WebSocket handshakes, including KCL sessions. A supplied
User-Agent replaces the default value. Tokens and headers are excluded from
configuration representations.
Client configuration applies to downstream calls. Applications serving different owners must also isolate their process-wide modeling sessions and workspaces.
Prebuilt binaries
Each GitHub release also attaches standalone executables (built with PyInstaller) for Linux (x86_64, arm64), macOS (arm64, x86_64), and Windows (x86_64) — no Python toolchain required. Download the binary for your platform, set ZOO_API_TOKEN, and run it directly, e.g.:
ZOO_API_TOKEN="your_api_key_here" ./zoo-mcp-linux-x86_64The binaries are not code-signed, so macOS Gatekeeper and Windows SmartScreen may warn on first run.
Integrations
The server can be used as is by running the server or importing directly into your python code.
from zoo_mcp.server import mcp
mcp.run()Individual tools can be used in your own python code as well. At Zoo we use zoo-mcp like this with ZooKeeper to save on resources. Instead of spinning up one MCP server per agent, each agent in a sense "embeds" the server in their own runtime. It has the additional benefit of preventing shared state.
from mcp.server.mcpserver import MCPServer
from zoo_mcp.zoo_tools import ResultZooExecuteKcl, zoo_execute_kcl
mcp = MCPServer(name="My Example Server")
@mcp.tool()
async def my_execute_kcl(kcl_code: str) -> ResultZooExecuteKcl:
"""
Example tool that uses the zoo_execute_kcl function from zoo_mcp.zoo_tools
"""
return await zoo_execute_kcl(kcl_code=kcl_code)The server can be integrated with Claude desktop using the following command
uv run mcp install src/zoo_mcp/server.pyThe server can also be integrated with Claude Code using the following command
claude mcp add --scope project "Zoo-MCP" uv -- --directory "$PWD"/src/zoo_mcp run server.pyThe server can also be tested using the MCP Inspector
uv run mcp dev src/zoo_mcp/server.pyFor running with codex-cli
codex \
-c 'mcp_servers.zoo.command="uvx"' \
-c 'mcp_servers.zoo.args=["zoo-mcp"]' \
-c mcp_servers.zoo.env.ZOO_API_TOKEN="$ZOO_API_TOKEN"You can also use the helper script included in this repo:
./codex-zoo.shThe script prompts for a request, runs Codex with the Zoo MCP server, and saves a JSONL transcript (including token usage) to codex-run-<timestamp>.jsonl.
Architecture
Tools are defined in src/zoo_mcp/*.py, where they are then imported into
src/zoo_mcp/server.py and tied to actual @mcp.tool() decorated functions.
src/zoo_mcp/zoo_tools.py acts as a large toolset to interact with Zoo's KCL and
engine facilities. This source file houses other utilities like parse_unit or
normalize_ext (normalizing file extensions).
Modeling scenes use explicit persistent sessions, with at most one session open
per server process. Call get_modeling_sessions to recover its ID after a client
reconnect, or call start_modeling_session when none exists. Populate the
session with execute_kcl or import_cad_file, passing session_id to either
tool. Reuse the same session_id with snapshot and modeling tools; then call
stop_modeling_session when finished.
Sessions remain available across client reconnects while the server and engine
connection stay alive. Idle sessions continue receiving engine status messages
so keepalive checks remain responsive. Disconnected sessions are removed from
get_modeling_sessions; start a new session and execute the model again to recover.
KCL execution and persistent modeling sessions use the CPU engine pool. Isolated KCL snapshots temporarily enable CPU rendering. Persistent sessions initialize rendering on the first snapshot, selection, highlight, or camera tool and retain it until the session is stopped, preserving visual state across calls. Exports, measurements, and geometry queries do not initialize graphics.
The KCL samples tools list and search public Aquarium projects from the Zoo API.
Pass the returned name (a public project ID) to get_kcl_sample to download its
KCL sources. Filenames preserve project-relative paths, including subdirectories.
These public tools do not require an API token. The multipleFiles field in
list/search results is a hint until the project has been downloaded.
execute_kcl runs mock execution before real execution and returns separate
mock_preflight and real_execution objects.
Each contains status (succeeded, failed, or not_run), message, and
diagnostics grouped by severity. Stage messages are short summaries; the
top-level message retains the full report for existing callers. Failed stages
also expose error_family, including ZooMCPTimeoutError for session timeouts.
Mock errors or an aborted mock execution
return immediately with ok: false and real_execution.status: "not_run".
Mock warnings remain in mock_preflight.diagnostics even if real execution fails.
The known planeOf mock-engine limitation is reported as a warning so the real
engine can evaluate it; other mock errors still block execution.
Session responses expose mock diagnostics; the engine does not return real-stage
diagnostics for session execution.
Path inputs capture the entrypoint, its transitive imports (including linked
modules and glTF buffers), and project.toml once. Both stages use that copy
without scanning unrelated files in the containing directory. Dependencies and
symlink targets must stay inside the entrypoint's directory; external paths are
rejected before file reads or execution. Transient local real-execution failures
retain their bounded retries using the same copy without repeating mock execution.
Diagnostics refer to the original source paths. Inline kcl_code accepts
self-contained code and standard-library imports; filesystem imports require
kcl_path so their dependencies can be captured within an explicit directory.
When calling execute_kcl with session_id, check ok, then read
path_artifact_graph on session success. The standalone mock_execute_kcl tool
continues to return its existing boolean/message pair.
Contributing
Contributions are welcome! Please open an issue or submit a pull request on the GitHub repository
PRs will need to pass tests and linting before being merged.
ruff is used for linting and formatting.
uvx ruff check
uvx ruff formatty is used for type checking.
uvx ty checkTesting
The server includes tests located in tests. To run the tests, use the following command:
uv run pytest -n autoAvailable Tools
42 toolscalculate_bounding_box_cadA
Calculate the bounding box of a CAD file.
Args: input_file (str): The path of the CAD file. The file should be one of the supported formats: .fbx, .gltf, .obj, .ply, .sldprt, .step, .stp, .stl (case-insensitive)
Returns: dict | str: A dictionary with 'center' (dict with x,y,z) and 'dimensions' (dict with x,y,z), or an error message if the operation fails.
| Name | Required | Description | Default |
|---|---|---|---|
| input_file | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
calculate_cad_physical_propertiesA
Calculate physical properties (volume, mass, surface area, center of mass, bounding box) of a CAD file.
Args: input_file (str): The path of the file. The file should be one of the supported formats: .fbx, .gltf, .obj, .ply, .sldprt, .step, .stp, .stl (case-insensitive) unit_length (str): The unit of length for center of mass. One of 'cm', 'ft', 'in', 'm', 'mm', 'yd'. unit_mass (str): The unit of mass for the mass result. One of 'g', 'kg', 'lb'. unit_density (str): The unit of density for the material. One of 'lb:ft3', 'kg:m3'. density (float): The density of the material. unit_area (str): The unit of area for surface area. One of 'cm2', 'dm2', 'ft2', 'in2', 'km2', 'm2', 'mm2', 'yd2'. unit_volume (str): The unit of volume. One of 'cm3', 'ft3', 'in3', 'm3', 'mm3', 'yd3', 'usfloz', 'usgal', 'l', 'ml'.
Returns: dict | str: A dictionary with keys 'volume', 'mass', 'surface_area', 'center_of_mass', and 'bounding_box', or an error message if the operation fails.
| Name | Required | Description | Default |
|---|---|---|---|
| density | Yes | ||
| unit_area | Yes | ||
| unit_mass | Yes | ||
| input_file | Yes | ||
| unit_length | Yes | ||
| unit_volume | Yes | ||
| unit_density | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
calculate_center_of_massA
Calculate the center of mass of a 3d object represented by the input file.
Args: input_file (str): The path of the file to get the mass from. The file should be one of the supported formats: .fbx, .gltf, .obj, .ply, .sldprt, .step, .stp, .stl (case-insensitive) unit_length (str): The unit of length to return the result in. One of 'cm', 'ft', 'in', 'm', 'mm', 'yd'
Returns: str: The center of mass of the file in the specified unit of length, or an error message if the operation fails.
| Name | Required | Description | Default |
|---|---|---|---|
| input_file | Yes | ||
| unit_length | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
calculate_massA
Calculate the mass of a 3d object represented by the input file.
Args: input_file (str): The path of the file to get the mass from. The file should be one of the supported formats: .fbx, .gltf, .obj, .ply, .sldprt, .step, .stp, .stl (case-insensitive) unit_mass (str): The unit of mass to return the result in. One of 'g', 'kg', 'lb'. unit_density (str): The unit of density to calculate the mass. One of 'lb:ft3', 'kg:m3'. density (float): The density of the material.
Returns: str: The mass of the file in the specified unit of mass, or an error message if the operation fails.
| Name | Required | Description | Default |
|---|---|---|---|
| density | Yes | ||
| unit_mass | Yes | ||
| input_file | Yes | ||
| unit_density | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
calculate_surface_areaA
Calculate the surface area of a 3d object represented by the input file.
Args: input_file (str): The path of the file to get the surface area from. The file should be one of the supported formats: .fbx, .gltf, .obj, .ply, .sldprt, .step, .stp, .stl (case-insensitive) unit_area (str): The unit of area to return the result in. One of 'cm2', 'dm2', 'ft2', 'in2', 'km2', 'm2', 'mm2', 'yd2'.
Returns: str: The surface area of the file in the specified unit of area, or an error message if the operation fails.
| Name | Required | Description | Default |
|---|---|---|---|
| unit_area | Yes | ||
| input_file | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
calculate_volumeA
Calculate the volume of a 3d object represented by the input file.
Args: input_file (str): The path of the file to get the volume from. The file should be one of the supported formats: .fbx, .gltf, .obj, .ply, .sldprt, .step, .stp, .stl (case-insensitive) unit_volume (str): The unit of volume to return the result in. One of 'cm3', 'ft3', 'in3', 'm3', 'mm3', 'yd3', 'usfloz', 'usgal', 'l', 'ml'.
Returns: str: The volume of the file in the specified unit of volume, or an error message if the operation fails.
| Name | Required | Description | Default |
|---|---|---|---|
| input_file | Yes | ||
| unit_volume | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
center_camera_on_selectionA
Point the camera at the current "selection set".
Useful for making a small selection legible, especially an edge: an edge is only a pixel or two wide, so centring it helps far more than any change of colour. Set the selection first with select_entities.
Centring moves the camera without re-framing the scene, so parts of the model
may fall outside the image. Follow with snapshot passing zoom=False, since
zoom=True re-frames the whole scene and undoes the centring.
Args: session_id: An open modeling session, from start_modeling_session. Required: camera position is scene state and would be discarded without one. move_vantage: Move the camera's vantage point as well as its target. True (the default) centres the selection most precisely; False re-aims the camera from where it already is.
Returns: DefaultCameraCenterToSelection: Confirmation that the camera was centred.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | ||
| move_vantage | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
convert_cad_fileA
Convert a CAD file from one format to another CAD file format.
Args: input_file (str): The input cad file to convert. The file should be one of the supported formats: .fbx, .gltf, .obj, .ply, .sldprt, .step, .stp, .stl (case-insensitive) export_path (str | None): The path to save the converted CAD file to. If the path is a directory, a temporary file will be created in the directory. If the path is a file, it will be overwritten if the extension is valid. export_format (str | None): The format of the exported CAD file. This should be one of 'fbx', 'glb', 'gltf', 'obj', 'ply', 'step', 'stl'. If no format is provided, the default is 'step'.
Returns: str: The path to the converted CAD file, or an error message if the operation fails.
| Name | Required | Description | Default |
|---|---|---|---|
| input_file | Yes | ||
| export_path | Yes | ||
| export_format | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
curve_get_end_pointsA
Get the start and end points of a curve entity.
Args: curve_id: Curve UUID, typically obtained from an artifact graph. session_id: A modeling session populated by execute_kcl.
Returns: CurveGetEndPoints: The curve's start and end points.
| Name | Required | Description | Default |
|---|---|---|---|
| curve_id | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| end | Yes | |
| start | Yes |
curve_get_typeA
Get whether a curve is a line, arc, or NURBS curve.
Args: curve_id: Curve UUID, typically obtained from an artifact graph. session_id: A modeling session populated by execute_kcl.
Returns: CurveGetType: The curve's geometric type.
| Name | Required | Description | Default |
|---|---|---|---|
| curve_id | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| curve_type | Yes |
edge_get_lengthA
Get the length of an edge entity in the current scene units.
Args: edge_id: Edge UUID, typically obtained from an artifact graph. session_id: A modeling session populated by execute_kcl.
Returns: EdgeGetLength: The edge length in the current scene units.
| Name | Required | Description | Default |
|---|---|---|---|
| edge_id | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| length | Yes |
engine_util_evaluate_pathA
Evaluate a serialized KCL path at parameter t.
Examples of path_json:
{
"start": {
"from": [10, 0]
},
"value": [
{
"type": "Arc",
"center": [0, 0],
"radius": 10,
"angle_range": [0, 90]
}
]
}{
"start": {
"from": [0, 0]
},
"value": [
{
"type": "ToPoint",
"to": [10, 0]
},
{
"type": "ToPoint",
"to": [10, 10]
}
]
}Args: path_json: The serialized JSON representation of the KCL sketch or path. t: Normalized path parameter, conventionally between 0 and 1. session_id: A modeling session populated by execute_kcl.
Returns: EngineUtilEvaluatePath: The position on the path at parameter t.
| Name | Required | Description | Default |
|---|---|---|---|
| t | Yes | ||
| path_json | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| pos | Yes |
entity_distanceA
Get the minimum and maximum distance between two model entities.
Args: entity_id1: The first entity UUID, typically obtained from an artifact graph. entity_id2: The second entity UUID. session_id: A modeling session populated by execute_kcl. on_axis: Optional global axis for projected distance; omit for Euclidean distance.
Returns: EntityGetDistance: The minimum and maximum distance between the entities.
| Name | Required | Description | Default |
|---|---|---|---|
| on_axis | No | ||
| entity_id1 | Yes | ||
| entity_id2 | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| max_distance | Yes | |
| min_distance | Yes |
entity_get_all_child_uuidsB
Get all child UUIDs belonging to an entity.
Args: entity_id: Entity UUID, typically obtained from an artifact graph. session_id: A modeling session populated by execute_kcl.
Returns: EntityGetAllChildUuids: All child entity UUIDs.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| entity_ids | Yes |
entity_get_indexA
Get an entity's index within its parent.
Args: entity_id: Entity UUID, typically obtained from an artifact graph. session_id: A modeling session populated by execute_kcl.
Returns: EntityGetIndex: The entity's index within its parent.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| entity_index | Yes |
entity_get_parent_idA
Get the UUID of an entity's parent.
Args: entity_id: Entity UUID, typically obtained from an artifact graph. session_id: A modeling session populated by execute_kcl.
Returns: EntityGetParentId: The parent entity's UUID.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| entity_id | Yes |
entity_get_sketch_pathsB
Get the sketch path UUIDs belonging to an entity.
Args: entity_id: Entity UUID, typically obtained from an artifact graph. session_id: A modeling session populated by execute_kcl.
Returns: EntityGetSketchPaths: The sketch path UUIDs belonging to the entity.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| entity_ids | Yes |
evaluate_kclA
Execute KCL once and collect requested measurements, snapshots and exports.
Prefer this when several checks or final export formats are known in advance. Provide exactly one source: self-contained kcl_code or a saved kcl_path project. Save editable source separately; inline code does not create a source file. Mock errors prevent hosted execution. The isolated session closes after the operation; no persistent session ID is needed or returned.
snapshot_request: Optional views (1–4 named views or camera dicts with up, vantage, center). An empty object requests one isometric image. Named views use zoom-to-fit; custom views default to their explicit framing. physical_properties_request: Optional properties list (volume, mass, surface_area, center_of_mass, bounding_box) and units. Mass additionally requires density and unit_density. Only requested properties are measured. exports: Optional format/destination_dir pairs. Each format needs a separate, non-overlapping directory, created if missing. Returned bundle filenames are preserved; existing files are not overwritten. Request final formats together rather than executing separately for each export.
Returns structured execution/inspection outcomes and per-export statuses and file paths, plus an inline image when requested and available. ok describes execution only: inspect output statuses for partial failures. Output failures never rerun geometry; successful outputs remain available.
| Name | Required | Description | Default |
|---|---|---|---|
| exports | No | ||
| kcl_code | No | ||
| kcl_path | No | ||
| snapshot_request | No | Optional snapshots; omit to skip rendering, or pass {} for an isometric image. | |
| physical_properties_request | No | Optional measurements and output units; omit to skip. Mass requires density and unit_density. |
execute_kclA
Execute KCL code given a string of KCL code or a path to a KCL project. Either kcl_code or kcl_path must be provided. If kcl_path is provided, it should point to a .kcl file or a directory containing a main.kcl file.
Prefer evaluate_kcl when execution, measurements, snapshots, or exports are needed together; it collects them from one execution.
Executing kcl_code does not save a .kcl source file. For model creation, save the source and required project files with the client's authorized file-editing tools, then validate the saved project using kcl_path and include the editable KCL files in the handoff.
Session executions save the artifact graph to a temporary JSON file and return its path. Local executions do not produce an artifact graph and can have large network overhead depending on the model.
Args: kcl_code (str | None): Self-contained KCL code to execute. Standard-library imports are allowed; filesystem imports require kcl_path. kcl_path (str | None): The path to a KCL file to execute. The path should point to a .kcl file or a directory containing a main.kcl file. Dependencies and symlink targets must remain inside the entrypoint's directory. session_id: An open modeling session in which to execute the KCL.
Returns: ResultZooExecuteKcl: Separate mock_preflight and real_execution outcomes, each with status, message, and diagnostics. Mock errors return immediately with real_execution not_run; mock warnings remain visible and allow real execution. Known mock-engine limitations are warnings. Session successes include path_artifact_graph. Transient local failures may retry real execution without repeating preflight.
| Name | Required | Description | Default |
|---|---|---|---|
| kcl_code | No | ||
| kcl_path | No | ||
| session_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
format_kclA
Format KCL code given a string of KCL code or a path to a KCL project. Either kcl_code or kcl_path must be provided. If kcl_path is provided, it should point to a .kcl file or a directory containing .kcl files.
Args: kcl_code (str | None): The KCL code to format. kcl_path (str | None): The path to a KCL file to format. The path should point to a .kcl file or a directory containing a main.kcl file.
Returns: str | None: Returns the formatted kcl code if the kcl_code is used otherwise returns None, the KCL in the kcl_path will be formatted in place
| Name | Required | Description | Default |
|---|---|---|---|
| kcl_code | No | ||
| kcl_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
get_face_infoA
Get the position, gradient, normal, and center of a face in a modeling session.
Args: face_id (str): Usually a user or LLM-selected face id. session_id: A modeling session populated by execute_kcl.
Returns: FaceInfo: The face position, gradient, normal, and center. The position is the starting point of the face's outside perimeter in KittyCAD engine space. The center is the geometric center of the face and should generally be preferred over the position.
| Name | Required | Description | Default |
|---|---|---|---|
| face_id | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| face_get_center | Yes | |
| face_get_gradient | Yes | |
| face_get_position | Yes |
get_kcl_docA
Get the full content of a specific KCL documentation file.
Prefer lookup_kcl_docs first; fetch a full page when more detail is needed. Use list_kcl_docs() to see available documentation paths, or lookup_kcl_docs() to find relevant documentation by symbol or topic.
Args: doc_path (str): The path to the documentation file (e.g., "docs/kcl-lang/functions" or "docs/kcl-std/functions/std-sketch-extrude")
Returns: str: The full Markdown content of the documentation file, or an error message if not found.
Raises: ToolError: Documentation could not be fetched; the call can be retried.
| Name | Required | Description | Default |
|---|---|---|---|
| doc_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
get_kcl_sampleA
Get the full content of a specific KCL sample including all files.
Downloads a public Aquarium project and retrieves its KCL files with their project-relative paths, including files in subdirectories.
Use list_kcl_samples() to see available sample names, or search_kcl_samples() to find samples by keyword.
Args: sample_name (str): The public project ID returned by list_kcl_samples() or search_kcl_samples().
Returns: SampleData | str: A SampleData dictionary containing: - name: The public project ID - title: Human-readable title - description: Brief description - multipleFiles: Whether the sample contains multiple files. Reliable here (unlike in list_kcl_samples / search_kcl_samples), because this tool downloads the project and counts its KCL files. - files: List of SampleFile dictionaries, each with a project-relative 'filename' and its 'content' Returns an error message string if the sample is not found.
Raises: ToolError: The sample could not be fetched; the call can be retried.
| Name | Required | Description | Default |
|---|---|---|---|
| sample_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
get_modeling_sessionsA
List modeling sessions owned by the current MCP server process.
Use this to recover the active session ID after reconnecting to a server process. A restarted server has no sessions. The current implementation supports at most one session, but the list return type allows future support for multiple sessions.
Returns: list[str]: Active modeling session IDs, currently empty or one item.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
get_sketch_constraint_statusA
Execute KCL and return a report of sketch constraint status. Either kcl_code or kcl_path must be provided. If kcl_path is provided, it should point to a .kcl file or a directory containing a main.kcl file.
Sketches are grouped by constraint status: fully_constrained, under_constrained, over_constrained, and errors. Each sketch entry includes the sketch name, status, free_count (under-constrained segments), conflict_count (over-constrained segments), and total_count (total segments analyzed).
The report also includes kcl_executes_successfully (False when KCL parsing/execution failed before all sketches were analyzed) and kcl_error (None on success, otherwise a dict with phase ("parse" or "execution") and text fields describing the failure). A partial report may still contain sketch entries analyzed prior to the failure.
Args: kcl_code (str | None): The KCL code to check constraints for. kcl_path (str | None): The path to a KCL file or directory containing a main.kcl file.
Returns: dict | str: A report grouping sketches by constraint status, or an error message if the operation fails.
| Name | Required | Description | Default |
|---|---|---|---|
| kcl_code | No | ||
| kcl_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
highlight_set_entitiesA
Replace the currently highlighted entities. Does NOT modify the "selection set".
This is a visual command: follow it with the snapshot tool, passing the same
session_id and zoom=False, to see the highlight without moving the camera. It
highlights edges, surfaces and bodies.
Highlighting only brightens an entity slightly. select_entities is markedly more obvious, tinting the entity and drawing an outline around it. For the strongest emphasis on a face, call both; on an edge call only one, because selection overrides the highlight. An edge is a pixel or two wide whichever you choose, so also consider center_camera_on_selection or a larger max_image_dimension to make one legible.
Highlights draw through the solid, so an entity facing away from the camera still renders, seen through the body. A highlighted entity in a snapshot is therefore not evidence that it faces the camera; choose a camera on the same side as the entity to see it properly.
Args: entity_ids: Entity UUIDs to highlight; pass an empty list to clear highlights. session_id: An open modeling session, from start_modeling_session. Required: highlights are scene state and would be discarded without one.
Returns: HighlightSetEntities: Confirmation that the highlights were replaced.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_ids | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
import_cad_fileA
Import a CAD file into an existing modeling session.
Args: session_id: The ID returned by start_modeling_session. input_file: Path to a .fbx, .gltf, .obj, .ply, .sldprt, .step, .stp, or .stl file.
Returns: str: The modeling engine ID of the imported object.
| Name | Required | Description | Default |
|---|---|---|---|
| input_file | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
lint_and_fix_kclA
Lint and fix KCL code given a string of KCL code or a path to a KCL project. Either kcl_code or kcl_path must be provided. If kcl_path is provided, it should point to a .kcl file or a directory containing .kcl files.
Args: kcl_code (str | None): The KCL code to lint and fix. kcl_path (str | None): The path to a KCL file to lint and fix. The path should point to a .kcl file or a directory containing a main.kcl file.
Returns: tuple[str, list[str]]: If kcl_code is provided, it returns a tuple containing the fixed KCL code and a list of unfixed lints. If kcl_path is provided, it returns a tuple containing a success message and a list of unfixed lints for each file in the project.
| Name | Required | Description | Default |
|---|---|---|---|
| kcl_code | No | ||
| kcl_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
list_kcl_docsA
List all available KCL documentation topics organized by category.
Returns a dictionary with the following categories:
kcl-lang: KCL language documentation (syntax, types, functions, etc.)
kcl-std-functions: Standard library function documentation
kcl-std-types: Standard library type documentation
kcl-std-consts: Standard library constants documentation
kcl-std-modules: Standard library module documentation
Each category contains a list of documentation file paths that can be retrieved using get_kcl_doc().
Returns: dict: Categories mapped to lists of available documentation paths.
Raises: ToolError: Documentation could not be fetched; the call can be retried.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
list_kcl_samplesA
List all available KCL sample projects.
Returns the public Aquarium projects from the Zoo API. Each sample demonstrates a CAD modeling technique or creates a particular 3D model.
Returns:
list[dict]: List of sample information, each containing:
- name: The public project ID (use with get_kcl_sample)
- title: Human-readable title
- description: Brief description of what the sample creates
- multipleFiles: Whether the sample contains multiple KCL files.
Best-effort hint only. The public listing doesn't expose file
counts, so this is False for any sample that has not yet
been fetched via get_kcl_sample. Call get_kcl_sample if you
need a reliable answer.
Raises: ToolError: The sample index could not be fetched; the call can be retried.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
list_org_datasetsA
List the datasets available to the user's organization.
Only datasets the organization has enabled for lookup are listed; datasets excluded from lookup (for example while their conversions are still being worked on) are omitted and should not be searched.
Each dataset has a UUID id, a human-readable name, and an optional
description. Use the id as the dataset_id argument to
search_org_dataset_semantic.
Returns: A list of {"id": str, "name": str, "description": str | None} entries, or an error message if the operation fails.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
list_org_skillsB
List the skills available to the user's organization.
Each skill has a UUID id, a human-readable name, a description, and a
markdown body containing the skill's full content.
Returns: A list of {"id": str, "name": str, "description": str, "markdown": str} entries, or an error message if the operation fails.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
lookup_kcl_docsA
Look up compact KCL reference sections. Prefer this for initial docs lookup.
Matches symbols, titles, headings, and keywords. Returns source paths and nonempty sections with complete examples and table rows when they fit. max_chars is a shared budget for Markdown content across all results (metadata is additional). Tables may omit rows within this budget. Truncated results can be expanded with get_kcl_doc(path). Both limits must be positive.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| max_chars | No | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
mock_execute_kclA
Mock execute KCL code given a string of KCL code or a path to a KCL project. Either kcl_code or kcl_path must be provided. If kcl_path is provided, it should point to a .kcl file or a directory containing a main.kcl file.
Args: kcl_code (str | None): The KCL code to mock execute. kcl_path (str | None): The path to a KCL file to mock execute. The path should point to a .kcl file or a directory containing a main.kcl file.
Returns: tuple(bool, str): Returns True if the KCL code executed successfully and a success message, False otherwise and the error message.
| Name | Required | Description | Default |
|---|---|---|---|
| kcl_code | No | ||
| kcl_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
search_kcl_samplesA
Search KCL samples by keyword.
Searches across all KCL sample titles and descriptions for the given query. Returns matching samples ranked by relevance.
Args: query (str): The search query (case-insensitive). max_results (int): Maximum number of results to return (default: 5).
Returns: list[dict]: List of search results, each containing: - name: The public project ID (use with get_kcl_sample) - title: Human-readable title - description: Brief description of the sample - multipleFiles: Whether the sample contains multiple KCL files. Best-effort hint only — see list_kcl_samples for the full caveat. Call get_kcl_sample if you need a reliable answer. - match_count: Number of times the query appears in title/description - excerpt: A relevant excerpt with the match in context
Raises: ToolError: The sample index could not be fetched; the call can be retried.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
search_org_dataset_semanticA
Semantic-search a dataset for samples relevant to the query.
Embeds the query with the org-dataset embedding model and returns the top chunk matches ranked by cosine similarity.
Args:
dataset_id (str): The UUID of the dataset to search (from list_org_datasets).
query (str): The natural-language query to embed and search with.
limit (int | None): Optional max number of matches to return.
Returns: A list of match dicts (source_file_path, content, similarity, chunk_index, conversion_id), or an error message if the operation fails.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| dataset_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
select_entitiesA
Replace the "selection set" with the given entities.
Takes UUIDs exactly as they appear in an artifact graph, and works for faces, edges, and solids alike.
Selected entities render with a distinct color tint and an outline, which is
considerably more obvious in a snapshot than the subtler brightening that
highlight_set_entities applies. For the strongest emphasis on a face, call
both this and highlight_set_entities; for an edge use just one, as selection
overrides the highlight. Follow with snapshot (passing zoom=False to keep
the current camera) to see the result.
Selections draw through the solid. An entity facing away from the camera still renders tinted, seen through the body, so a tinted entity in a snapshot is not evidence that it faces the camera: an occluded edge shows up as an interior diagonal rather than on the silhouette, and an occluded face looks washed out rather than solid. Pick a camera on the same side as the entity to see it properly.
Args: entity_ids: Entity UUIDs to select; pass an empty list to clear the selection. session_id: An open modeling session, from start_modeling_session. Required: the selection is scene state and would be discarded without one.
Returns: SelectReplace: Confirmation that the selection was replaced.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_ids | Yes | ||
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
set_selection_filterA
Set which model entity types can be added to the "selection set".
Args: entity_types: Entity types permitted by the selection filter. session_id: An open modeling session, from start_modeling_session. Required: the filter is scene state and would be discarded without one.
Returns: SetSelectionFilter: Confirmation that the filter was set.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | ||
| entity_types | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
snapshotA
Render an open modeling session as an image.
Populate the scene first by passing this session_id to execute_kcl. The camera always uses an orthographic projection, so measurements read off the image are not distorted by perspective.
Args: session_id: A modeling session populated by execute_kcl. camera_view: Which view or views to capture. Omit it for a single isometric view. Otherwise one of:
1. A named view: 'front', 'back', 'left', 'right', 'top',
'bottom', 'isometric', 'isometric_front_right',
'isometric_front_left', 'isometric_back_right',
'isometric_back_left'.
A named view puts the camera on that axis looking back at the
origin, matching the app's standard views: 'front' is -Y,
'back' is +Y, 'left' is -X, 'right' is +X, 'top' is +Z and
'bottom' is -Z.
So 'front' shows the face whose outward normal is -Y. The four
isometric views all look down from above, from (+X, -Y, +Z)
for 'isometric_front_right', (-X, -Y, +Z) for
'isometric_front_left', (+X, +Y, +Z) for
'isometric_back_right' and (-X, +Y, +Z) for
'isometric_back_left'. Plain 'isometric' is front-right.
2. A dict with "up", "vantage" and "center" keys, each a list of 3
floats in model space: "vantage" is the camera position and
"center" the point it looks at. For example
{"up": [0, 0, 1], "vantage": [0, -1, 0], "center": [0, 0, 0]}
looks at the origin from the front, showing the -Y face.
With zoom=True only the direction from "center" to "vantage"
matters, because zooming to fit sets the distance: [0, -1, 0]
and [0, -200, 0] frame identically. "up" must not be parallel
to that direction.
3. 'multiview' for a 2x2 collage of front (top left), right (top
right), top (bottom left) and isometric (bottom right).
4. 'multi_isometric' for a 2x2 collage of the front-right (top
left), front-left (top right), back-right (bottom left) and
back-left (bottom right) isometric views.
5. A list of up to 4 names and/or dicts, tiled in the order given.
zoom: Zoom to fit before capturing each view. Leave True unless you
have positioned the session's camera yourself; a freshly
executed scene is not framed, so zoom=False renders the model
only a few pixels wide.
highlight_edges: Whether rendered edges should be outlined. Default is
False so that entities highlighted with
highlight_set_entities are obvious in the image.
max_image_dimension: Maximum width or height of the returned JPEG.
padding: Fraction of the frame left as margin when zooming to fit.
output_path: If provided, the snapshot is written to disk and the
absolute file path is returned instead of the image. May
be a file path (e.g. '/path/to/image.jpg') or a directory
(in which case the file is named 'image.jpg'). If
omitted, the image is returned inline as an ImageContent.
The file is always JPEG data whatever extension is given,
so prefer '.jpg' to avoid writing a JPEG named '.png'.Returns: ImageContent | str: The snapshot as an inline image when output_path is omitted; otherwise the absolute path to the saved file.
| Name | Required | Description | Default |
|---|---|---|---|
| zoom | No | ||
| padding | No | ||
| session_id | Yes | ||
| camera_view | No | ||
| output_path | No | ||
| highlight_edges | No | ||
| max_image_dimension | No |
start_modeling_sessionA
Open an empty CPU modeling session for subsequent tools.
Only one modeling session can be open at a time. Stop the current session before starting another. If one is already open, or is still connecting, this fails with an error naming that session's ID so it can be stopped.
The server does not expire sessions after an idle or lifetime timeout. Callers are responsible for tracking and enforcing their desired timeout.
Pass the returned session_id to execute_kcl to populate the scene, then reuse it with modeling query, selection, and highlight tools. Stop the session explicitly with stop_modeling_session when finished.
Returns: str: The session ID to pass to session-aware modeling tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
stop_modeling_sessionA
Close a persistent modeling websocket session.
Also accepts the ID of a session that is still connecting, which cancels that start and frees the slot for a new start_modeling_session call.
Args: session_id: The ID returned by start_modeling_session, or the one named by a "already open or starting" error.
Returns: None
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
visualize_sketchA
Render a named 2D KCL sketch as a solver-debug PNG.
The image shows sketch geometry and solver freedom without requiring an
existing modeling session. sketch_name is the sketch's variable name,
such as profile in profile = sketch(on = XY) { ... }. Use
get_sketch_constraint_status to discover sketch names when needed.
A completed sketch may still be rendered after a later execution failure.
A returned PNG does not mean the whole project executes successfully.
If names repeat (for example, a function called twice), select an
instance_index from a fresh constraint report for the same entrypoint.
Args:
sketch_name: Variable name of the sketch to render.
kcl_code: KCL source code containing the sketch.
kcl_path: Path to a KCL file or project containing main.kcl.
output_path: If provided, write the PNG to this file or directory and
return its absolute path. A directory receives image.png. If
omitted, return the PNG inline as ImageContent.
instance_index: Zero-based creation order among sketches with this
name. Omit for a unique name; refresh the report after edits.
Returns: The inline PNG, its saved absolute path, or an error message.
| Name | Required | Description | Default |
|---|---|---|---|
| kcl_code | No | ||
| kcl_path | No | ||
| output_path | No | ||
| sketch_name | Yes | ||
| instance_index | No |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.33.0- Removed
calculate_bounding_box_kcl - Removed
calculate_kcl_physical_properties - Added
evaluate_kcl - Removed
exec_kcl_project - Removed
export_kcl - Added
lookup_kcl_docs - Removed
save_image - Removed
search_kcl_docs
1 tool update
v0.28.11- Changed
get_kcl_sample2 fields changed- changed
Output schema / $defs / SampleData / descriptionPrevious value: -"Complete data for a KCL sample including all files."New value: +"Complete data for a KCL sample including its KCL files." - changed
Output schema / $defs / SampleFile / descriptionPrevious value: -"A single file within a KCL sample."New value: +"A KCL source with its project-relative path."
2 tool updates
v0.28.7- Changed
set_selection_filter1 field changed- changed
Input schema / $defs / EntityType / enumPrevious value: -[ - "entity", - "object", - "path", - "segment", - "curve", - "solid2d", - "solid3d", - "edge", - "face", - "plane", - "vertex", - "region" -]New value: +[ + "entity", + "object", + "path", + "segment", + "curve", + "solid2d", + "solid3d", + "edge", + "face", + "plane", + "vertex", + "region", + "patterngroup" +]
- Changed
visualize_sketch1 field changed- added
Input schema / properties / instance_indexAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Instance Index" +}
2 tool updates
v0.28.6- Changed
exec_kcl_project3 fields changed- added
Output schema / $defs / KclExecutionInspectionAdded value: +{ + "properties": { + "completed_snapshot_views": { + "items": { + "type": "string" + }, + "title": "Completed Snapshot Views", + "type": "array" + }, + "physical_analysis_status": { + "default": "not_requested", + "enum": [ + "not_requested", + "not_run", + "succeeded", + "partial", + "failed" + ], + "title": "Physical Analysis Status", + "type": "string" + }, + "physical_properties": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Physical Properties" + }, + "physical_property_errors": { + "additionalProperties": { + "type": "string" + }, + "title": "Physical Property Errors", + "type": "object" + }, + "rendered_snapshot": { + "anyOf": [ + { + "format": "binary", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Rendered Snapshot" + }, + "rendered_snapshots_status": { + "default": "not_requested", + "enum": [ + "not_requested", + "not_run", + "succeeded", + "partial", + "failed" + ], + "title": "Rendered Snapshots Status", + "type": "string" + }, + "sketch_constraints": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Sketch Constraints" + }, + "sketch_constraints_status": { + "default": "not_run", + "enum": [ + "not_requested", + "not_run", + "succeeded", + "partial", + "failed" + ], + "title": "Sketch Constraints Status", + "type": "string" + }, + "snapshot_errors": { + "additionalProperties": { + "type": "string" + }, + "title": "Snapshot Errors", + "type": "object" + } + }, + "title": "KclExecutionInspection", + "type": "object" +} - added
Output schema / $defs / ResultZooExecuteKclLocal / properties / inspectionAdded value: +{ + "$ref": "#/$defs/KclExecutionInspection" +} - added
Output schema / $defs / ResultZooExecuteKclRemote / properties / inspectionAdded value: +{ + "$ref": "#/$defs/KclExecutionInspection" +}
- Changed
execute_kcl3 fields changed- added
Output schema / $defs / KclExecutionInspectionAdded value: +{ + "properties": { + "completed_snapshot_views": { + "items": { + "type": "string" + }, + "title": "Completed Snapshot Views", + "type": "array" + }, + "physical_analysis_status": { + "default": "not_requested", + "enum": [ + "not_requested", + "not_run", + "succeeded", + "partial", + "failed" + ], + "title": "Physical Analysis Status", + "type": "string" + }, + "physical_properties": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Physical Properties" + }, + "physical_property_errors": { + "additionalProperties": { + "type": "string" + }, + "title": "Physical Property Errors", + "type": "object" + }, + "rendered_snapshot": { + "anyOf": [ + { + "format": "binary", + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Rendered Snapshot" + }, + "rendered_snapshots_status": { + "default": "not_requested", + "enum": [ + "not_requested", + "not_run", + "succeeded", + "partial", + "failed" + ], + "title": "Rendered Snapshots Status", + "type": "string" + }, + "sketch_constraints": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Sketch Constraints" + }, + "sketch_constraints_status": { + "default": "not_run", + "enum": [ + "not_requested", + "not_run", + "succeeded", + "partial", + "failed" + ], + "title": "Sketch Constraints Status", + "type": "string" + }, + "snapshot_errors": { + "additionalProperties": { + "type": "string" + }, + "title": "Snapshot Errors", + "type": "object" + } + }, + "title": "KclExecutionInspection", + "type": "object" +} - added
Output schema / $defs / ResultZooExecuteKclLocal / properties / inspectionAdded value: +{ + "$ref": "#/$defs/KclExecutionInspection" +} - added
Output schema / $defs / ResultZooExecuteKclRemote / properties / inspectionAdded value: +{ + "$ref": "#/$defs/KclExecutionInspection" +}
2 tool updates
v0.28.0- Changed
exec_kcl_project3 fields changed- added
Output schema / $defsAdded value: +{ + "KclExecutionStage": { + "properties": { + "diagnostics": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": "Diagnostics", + "type": "object" + }, + "error_family": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Error Family" + }, + "message": { + "title": "Message", + "type": "string" + }, + "status": { + "enum": [ + "succeeded", + "failed", + "not_run" + ], + "title": "Status", + "type": "string" + } + }, + "required": [ + "status", + "message" + ], + "title": "KclExecutionStage", + "type": "object" + }, + "ResultZooExecuteKclLocal": { + "properties": { + "message": { + "title": "Message", + "type": "string" + }, + "mock_preflight": { + "$ref": "#/$defs/KclExecutionStage" + }, + "ok": { + "title": "Ok", + "type": "boolean" + }, + "real_execution": { + "$ref": "#/$defs/KclExecutionStage" + } + }, + "required": [ + "ok", + "message", + "mock_preflight", + "real_execution" + ], + "title": "ResultZooExecuteKclLocal", + "type": "object" + }, + "ResultZooExecuteKclRemote": { + "properties": { + "message": { + "title": "Message", + "type": "string" + }, + "mock_preflight": { + "$ref": "#/$defs/KclExecutionStage" + }, + "ok": { + "title": "Ok", + "type": "boolean" + }, + "path_artifact_graph": { + "format": "path", + "title": "Path Artifact Graph", + "type": "string" + }, + "real_execution": { + "$ref": "#/$defs/KclExecutionStage" + } + }, + "required": [ + "ok", + "message", + "mock_preflight", + "real_execution", + "path_artifact_graph" + ], + "title": "ResultZooExecuteKclRemote", + "type": "object" + } +} - added
Output schema / properties / result / anyOfAdded value: +[ + { + "$ref": "#/$defs/ResultZooExecuteKclLocal" + }, + { + "$ref": "#/$defs/ResultZooExecuteKclRemote" + } +] - removed
Output schema / properties / result / typeRemoved value: -"string"
- Changed
execute_kcl7 fields changed- added
Output schema / $defs / KclExecutionStageAdded value: +{ + "properties": { + "diagnostics": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": "Diagnostics", + "type": "object" + }, + "error_family": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Error Family" + }, + "message": { + "title": "Message", + "type": "string" + }, + "status": { + "enum": [ + "succeeded", + "failed", + "not_run" + ], + "title": "Status", + "type": "string" + } + }, + "required": [ + "status", + "message" + ], + "title": "KclExecutionStage", + "type": "object" +} - added
Output schema / $defs / ResultZooExecuteKclLocal / properties / mock_preflightAdded value: +{ + "$ref": "#/$defs/KclExecutionStage" +} - added
Output schema / $defs / ResultZooExecuteKclLocal / properties / real_executionAdded value: +{ + "$ref": "#/$defs/KclExecutionStage" +} - changed
Output schema / $defs / ResultZooExecuteKclLocal / requiredPrevious value: -[ - "ok", - "message" -]New value: +[ + "ok", + "message", + "mock_preflight", + "real_execution" +] - added
Output schema / $defs / ResultZooExecuteKclRemote / properties / mock_preflightAdded value: +{ + "$ref": "#/$defs/KclExecutionStage" +} - added
Output schema / $defs / ResultZooExecuteKclRemote / properties / real_executionAdded value: +{ + "$ref": "#/$defs/KclExecutionStage" +} - changed
Output schema / $defs / ResultZooExecuteKclRemote / requiredPrevious value: -[ - "ok", - "message", - "path_artifact_graph" -]New value: +[ + "ok", + "message", + "mock_preflight", + "real_execution", + "path_artifact_graph" +]
3 tool updates
v0.27.0- Changed
save_image7 fields changed- removed
Input schema / $defs / Annotations / additionalPropertiesRemoved value: -true - added
Input schema / $defs / Annotations / descriptionAdded value: +"Optional annotations the client can use to inform how objects are used or displayed." - added
Input schema / $defs / Annotations / properties / lastModifiedAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Lastmodified" +} - removed
Input schema / $defs / ImageContent / additionalPropertiesRemoved value: -true - changed
Input schema / $defs / ImageContent / descriptionPrevious value: -"Image content for a message."New value: +"An image provided to or from an LLM." - added
Input schema / $defs / ImageContent / properties / type / defaultAdded value: +"image" - changed
Input schema / $defs / ImageContent / requiredPrevious value: -[ - "type", - "data", - "mimeType" -]New value: +[ + "data", + "mimeType" +]
- Changed
snapshot1 field changed- changed
Output schema / (root)Previous value: -{ - "$defs": { - "Annotations": { - "additionalProperties": true, - "properties": { - "audience": { - "anyOf": [ - { - "items": { - "enum": [ - "user", - "assistant" - ], - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Audience" - }, - "priority": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Priority" - } - }, - "title": "Annotations", - "type": "object" - }, - "ImageContent": { - "additionalProperties": true, - "description": "Image content for a message.", - "properties": { - "_meta": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Meta" - }, - "annotations": { - "anyOf": [ - { - "$ref": "#/$defs/Annotations" - }, - { - "type": "null" - } - ], - "default": null - }, - "data": { - "title": "Data", - "type": "string" - }, - "mimeType": { - "title": "Mimetype", - "type": "string" - }, - "type": { - "const": "image", - "title": "Type", - "type": "string" - } - }, - "required": [ - "type", - "data", - "mimeType" - ], - "title": "ImageContent", - "type": "object" - } - }, - "properties": { - "result": { - "anyOf": [ - { - "$ref": "#/$defs/ImageContent" - }, - { - "type": "string" - } - ], - "title": "Result" - } - }, - "required": [ - "result" - ], - "title": "snapshotOutput", - "type": "object" -}New value: +null
- Changed
visualize_sketch1 field changed- changed
Output schema / (root)Previous value: -{ - "$defs": { - "Annotations": { - "additionalProperties": true, - "properties": { - "audience": { - "anyOf": [ - { - "items": { - "enum": [ - "user", - "assistant" - ], - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Audience" - }, - "priority": { - "anyOf": [ - { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Priority" - } - }, - "title": "Annotations", - "type": "object" - }, - "ImageContent": { - "additionalProperties": true, - "description": "Image content for a message.", - "properties": { - "_meta": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Meta" - }, - "annotations": { - "anyOf": [ - { - "$ref": "#/$defs/Annotations" - }, - { - "type": "null" - } - ], - "default": null - }, - "data": { - "title": "Data", - "type": "string" - }, - "mimeType": { - "title": "Mimetype", - "type": "string" - }, - "type": { - "const": "image", - "title": "Type", - "type": "string" - } - }, - "required": [ - "type", - "data", - "mimeType" - ], - "title": "ImageContent", - "type": "object" - } - }, - "properties": { - "result": { - "anyOf": [ - { - "$ref": "#/$defs/ImageContent" - }, - { - "type": "string" - } - ], - "title": "Result" - } - }, - "required": [ - "result" - ], - "title": "visualize_sketchOutput", - "type": "object" -}New value: +null
1 tool update
v0.26.4- Added
visualize_sketch
16 tool updates
v0.23.1- Changed
convert_cad_file3 fields changed- added
Input schema / properties / input_fileAdded value: +{ + "title": "Input File", + "type": "string" +} - removed
Input schema / properties / input_pathRemoved value: -{ - "title": "Input Path", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "input_path", - "export_path", - "export_format" -]New value: +[ + "input_file", + "export_path", + "export_format" +]
- Changed
curve_get_end_points6 fields changed- removed
Input schema / properties / kcl_codeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Code" -} - removed
Input schema / properties / kcl_pathRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Path" -} - removed
Input schema / properties / session_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / session_id / defaultRemoved value: -null - added
Input schema / properties / session_id / typeAdded value: +"string" - changed
Input schema / requiredPrevious value: -[ - "curve_id" -]New value: +[ + "curve_id", + "session_id" +]
- Changed
curve_get_type6 fields changed- removed
Input schema / properties / kcl_codeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Code" -} - removed
Input schema / properties / kcl_pathRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Path" -} - removed
Input schema / properties / session_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / session_id / defaultRemoved value: -null - added
Input schema / properties / session_id / typeAdded value: +"string" - changed
Input schema / requiredPrevious value: -[ - "curve_id" -]New value: +[ + "curve_id", + "session_id" +]
- Changed
edge_get_length6 fields changed- removed
Input schema / properties / kcl_codeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Code" -} - removed
Input schema / properties / kcl_pathRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Path" -} - removed
Input schema / properties / session_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / session_id / defaultRemoved value: -null - added
Input schema / properties / session_id / typeAdded value: +"string" - changed
Input schema / requiredPrevious value: -[ - "edge_id" -]New value: +[ + "edge_id", + "session_id" +]
- Changed
engine_util_evaluate_path6 fields changed- removed
Input schema / properties / kcl_codeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Code" -} - removed
Input schema / properties / kcl_pathRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Path" -} - removed
Input schema / properties / session_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / session_id / defaultRemoved value: -null - added
Input schema / properties / session_id / typeAdded value: +"string" - changed
Input schema / requiredPrevious value: -[ - "path_json", - "t" -]New value: +[ + "path_json", + "t", + "session_id" +]
- Changed
entity_distance6 fields changed- removed
Input schema / properties / kcl_codeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Code" -} - removed
Input schema / properties / kcl_pathRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Path" -} - removed
Input schema / properties / session_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / session_id / defaultRemoved value: -null - added
Input schema / properties / session_id / typeAdded value: +"string" - changed
Input schema / requiredPrevious value: -[ - "entity_id1", - "entity_id2" -]New value: +[ + "entity_id1", + "entity_id2", + "session_id" +]
- Changed
entity_get_all_child_uuids6 fields changed- removed
Input schema / properties / kcl_codeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Code" -} - removed
Input schema / properties / kcl_pathRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Path" -} - removed
Input schema / properties / session_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / session_id / defaultRemoved value: -null - added
Input schema / properties / session_id / typeAdded value: +"string" - changed
Input schema / requiredPrevious value: -[ - "entity_id" -]New value: +[ + "entity_id", + "session_id" +]
- Changed
entity_get_index6 fields changed- removed
Input schema / properties / kcl_codeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Code" -} - removed
Input schema / properties / kcl_pathRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Path" -} - removed
Input schema / properties / session_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / session_id / defaultRemoved value: -null - added
Input schema / properties / session_id / typeAdded value: +"string" - changed
Input schema / requiredPrevious value: -[ - "entity_id" -]New value: +[ + "entity_id", + "session_id" +]
- Changed
entity_get_parent_id6 fields changed- removed
Input schema / properties / kcl_codeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Code" -} - removed
Input schema / properties / kcl_pathRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Path" -} - removed
Input schema / properties / session_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / session_id / defaultRemoved value: -null - added
Input schema / properties / session_id / typeAdded value: +"string" - changed
Input schema / requiredPrevious value: -[ - "entity_id" -]New value: +[ + "entity_id", + "session_id" +]
- Changed
entity_get_sketch_paths6 fields changed- removed
Input schema / properties / kcl_codeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Code" -} - removed
Input schema / properties / kcl_pathRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Path" -} - removed
Input schema / properties / session_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / session_id / defaultRemoved value: -null - added
Input schema / properties / session_id / typeAdded value: +"string" - changed
Input schema / requiredPrevious value: -[ - "entity_id" -]New value: +[ + "entity_id", + "session_id" +]
- Changed
exec_kcl_project8 fields changed- removed
Input schema / properties / session_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / session_id / defaultRemoved value: -null - added
Input schema / properties / session_id / typeAdded value: +"string" - added
Input schema / requiredAdded value: +[ + "session_id" +] - removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / propertiesAdded value: +{ + "result": { + "title": "Result", + "type": "string" + } +} - added
Output schema / requiredAdded value: +[ + "result" +] - changed
Output schema / titlePrevious value: -"exec_kcl_projectDictOutput"New value: +"exec_kcl_projectOutput"
- Changed
execute_kcl6 fields changed- added
Output schema / $defsAdded value: +{ + "ResultZooExecuteKclLocal": { + "properties": { + "message": { + "title": "Message", + "type": "string" + }, + "ok": { + "title": "Ok", + "type": "boolean" + } + }, + "required": [ + "ok", + "message" + ], + "title": "ResultZooExecuteKclLocal", + "type": "object" + }, + "ResultZooExecuteKclRemote": { + "properties": { + "message": { + "title": "Message", + "type": "string" + }, + "ok": { + "title": "Ok", + "type": "boolean" + }, + "path_artifact_graph": { + "format": "path", + "title": "Path Artifact Graph", + "type": "string" + } + }, + "required": [ + "ok", + "message", + "path_artifact_graph" + ], + "title": "ResultZooExecuteKclRemote", + "type": "object" + } +} - added
Output schema / properties / result / anyOfAdded value: +[ + { + "$ref": "#/$defs/ResultZooExecuteKclLocal" + }, + { + "$ref": "#/$defs/ResultZooExecuteKclRemote" + } +] - removed
Output schema / properties / result / maxItemsRemoved value: -2 - removed
Output schema / properties / result / minItemsRemoved value: -2 - removed
Output schema / properties / result / prefixItemsRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - } -] - removed
Output schema / properties / result / typeRemoved value: -"array"
- Changed
get_face_info6 fields changed- removed
Input schema / properties / kcl_codeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Code" -} - removed
Input schema / properties / kcl_pathRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Path" -} - removed
Input schema / properties / session_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / session_id / defaultRemoved value: -null - added
Input schema / properties / session_id / typeAdded value: +"string" - changed
Input schema / requiredPrevious value: -[ - "face_id" -]New value: +[ + "face_id", + "session_id" +]
- Added
get_modeling_sessions - Added
import_cad_file - Changed
snapshot7 fields changed- removed
Input schema / properties / input_fileRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Input File" -} - removed
Input schema / properties / kcl_codeRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Code" -} - removed
Input schema / properties / kcl_pathRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Kcl Path" -} - removed
Input schema / properties / session_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / session_id / defaultRemoved value: -null - added
Input schema / properties / session_id / typeAdded value: +"string" - added
Input schema / requiredAdded value: +[ + "session_id" +]
25 tool updates
v0.20.0- Added
center_camera_on_selection - Added
curve_get_end_points - Added
curve_get_type - Added
edge_get_length - Added
engine_util_evaluate_path - Added
entity_distance - Added
entity_get_all_child_uuids - Added
entity_get_index - Added
entity_get_parent_id - Added
entity_get_sketch_paths - Changed
exec_kcl_project5 fields changed- added
Input schema / properties / session_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Session Id" +} - added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "string" - } - ], - "title": "Result" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"exec_kcl_projectOutput"New value: +"exec_kcl_projectDictOutput"
- Changed
execute_kcl1 field changed- added
Input schema / properties / session_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Session Id" +}
- Changed
get_face_info8 fields changed- added
Input schema / properties / session_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Session Id" +} - added
Output schema / $defsAdded value: +{ + "FaceGetCenter": { + "additionalProperties": false, + "description": "The 3D center of mass on the surface", + "properties": { + "pos": { + "$ref": "#/$defs/Point3d" + } + }, + "required": [ + "pos" + ], + "title": "FaceGetCenter", + "type": "object" + }, + "FaceGetGradient": { + "additionalProperties": false, + "description": "The gradient (dFdu, dFdv) + normal vector on a brep face", + "properties": { + "df_du": { + "$ref": "#/$defs/Point3d" + }, + "df_dv": { + "$ref": "#/$defs/Point3d" + }, + "normal": { + "$ref": "#/$defs/Point3d" + } + }, + "required": [ + "df_du", + "df_dv", + "normal" + ], + "title": "FaceGetGradient", + "type": "object" + }, + "FaceGetPosition": { + "additionalProperties": false, + "description": "The 3D position on the surface that was evaluated", + "properties": { + "pos": { + "$ref": "#/$defs/Point3d" + } + }, + "required": [ + "pos" + ], + "title": "FaceGetPosition", + "type": "object" + }, + "Point3d": { + "additionalProperties": false, + "description": "A point in 3D space", + "properties": { + "x": { + "title": "X", + "type": "number" + }, + "y": { + "title": "Y", + "type": "number" + }, + "z": { + "title": "Z", + "type": "number" + } + }, + "required": [ + "x", + "y", + "z" + ], + "title": "Point3d", + "type": "object" + } +} - added
Output schema / properties / face_get_centerAdded value: +{ + "$ref": "#/$defs/FaceGetCenter" +} - added
Output schema / properties / face_get_gradientAdded value: +{ + "$ref": "#/$defs/FaceGetGradient" +} - added
Output schema / properties / face_get_positionAdded value: +{ + "$ref": "#/$defs/FaceGetPosition" +} - removed
Output schema / properties / resultRemoved value: -{ - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "string" - } - ], - "title": "Result" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "face_get_position", + "face_get_gradient", + "face_get_center" +] - changed
Output schema / titlePrevious value: -"get_face_infoOutput"New value: +"FaceInfo"
- Added
highlight_set_entities - Removed
multi_isometric_snapshot_of_cad - Removed
multi_isometric_snapshot_of_kcl - Removed
multiview_snapshot_of_cad - Removed
multiview_snapshot_of_kcl - Added
select_entities - Added
set_selection_filter - Added
snapshot - Removed
snapshot_of_cad - Removed
snapshot_of_kcl - Added
start_modeling_session - Added
stop_modeling_session
TDQS
Scored across 42 tools
Most tool families are distinct (sessions, docs, samples, datasets, selection, snapshots), but several tools overlap heavily: execute_kcl vs evaluate_kcl vs mock_execute_kcl, and the individual calculate_mass/volume/surface_area/center_of_mass/bounding_box tools duplicate capabilities already inside calculate_cad_physical_properties. Descriptions help clarify intended use, but an agent still faces real choice ambiguity among execution and measurement tools.
Many names follow verb_noun conventions (start_modeling_session, calculate_mass, list_kcl_docs), but entity/curve/edge query tools use noun_verb patterns such as entity_get_parent_id, curve_get_end_points, and edge_get_length. The mix is readable but not fully predictable.
At 42 tools, the surface is heavy for a single MCP server and includes substantial redundancy among calculation and execution tools. Some grouping or consolidation would make the set easier to navigate.
The server appears to cover the CAD/KCL lifecycle well: session management, import/convert, execution/evaluation, physical calculations, selection/highlighting, snapshots, sketch constraint inspection, documentation, and samples. Minor gaps may exist around direct scene editing or artifact-graph traversal, but core workflows are supported.
Maintenance
Related MCP Connectors
Parametric 3D CAD for AI agents: build print-ready parts, check them, export STL, 3MF or STEP.
CAD in ChatGPT and Claude: editable parts, STEP/STL/drawings, in-chat 3D, automatic checks.
A browser 3D CAD for your AI: it scripts real-size models, uCAD builds them and returns pictures.
Design 3D-printable parts by chatting: create, edit, render and publish parametric forges.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact programmatically with Autodesk Fusion 360 for creating parametric 3D models through simple API calls.18-
- AlicenseAqualityDmaintenanceEnables users to control FreeCAD through natural language for creating, editing, and managing 3D objects and documents. It supports executing Python code, capturing screenshots of the workspace, and importing parts from the FreeCAD library.11MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to control FreeCAD 3D modeling software, allowing creation and manipulation of 3D objects, execution of Python code, and interaction with FreeCAD's parts library through natural language.10MIT
- AlicenseAqualityDmaintenanceControls JupyterCAD using natural language, enabling creation, modification, and boolean operations on 3D CAD models.1920Apache 2.0