io.github.KittyCAD/zoo-mcp
PYPI · ZOO_MCP · SCANNED OCT 4
An MCP server that provides access to the Zoo API for various CAD operations and tools.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 4 of 45 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 2 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability67
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 9168 tokens (~199/item across 46 items; 46 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management84
- Stability check failed: the tool surface changed between 0.26.7 and 0.28.6: 0 tool removals, 2 breaking changes, 0 additions. See how to fix → Fail
Tool Coverage71
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
- Structured output schemas are declared (96% of tools); any adoption earns full credit.Pass
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "execute_kcl" implies "execute" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 46 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the io.github.KittyCAD/zoo-mcp server?
io.github.KittyCAD/zoo-mcp runs locally as a PyPI package, launched with uvx zoo_mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · zoo_mcp
claude mcp add kittycad-zoo-mcp -- uvx zoo_mcp
{
"mcpServers": {
"kittycad-zoo-mcp": {
"command": "uvx",
"args": [
"zoo_mcp"
]
}
}
} {
"servers": {
"kittycad-zoo-mcp": {
"command": "uvx",
"args": [
"zoo_mcp"
]
}
}
} codex mcp add kittycad-zoo-mcp -- uvx zoo_mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"kittycad-zoo-mcp": {
"type": "local",
"command": [
"uvx",
"zoo_mcp"
],
"enabled": true
}
}
} openclaw mcp add kittycad-zoo-mcp --command uvx --arg zoo_mcp
mcp_servers:
kittycad-zoo-mcp:
command: "uvx"
args: ["zoo_mcp"] {
"McpServers": {
"kittycad-zoo-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"zoo_mcp"
]
}
}
} assistant mcp add kittycad-zoo-mcp -t stdio -c uvx -a zoo_mcp
{
"mcpServers": {
"kittycad-zoo-mcp": {
"command": "uvx",
"args": [
"zoo_mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Oct 26 −2
No change was recorded against any check on this day. Stability & Change Management went from 98 to 81.
- 2 Oct 26 0
- Package version: 0.28.1 → 0.28.6 functional
- 1 Oct 26 +1
- Package version: 0.28.3 → 0.28.6 functional
- Package version: 0.28.3 → 0.28.5 functional
- 30 Sept 26 +15
- Malware scan: unverified → pass ▲ security
- 29 Sept 26 −16
- Malware scan: pass → unverified ▼ security
- Package version: 0.28.2 → 0.28.3 functional
- 28 Sept 26 +4
- Install scripts: unverified → pass ▲ security
- Known CVEs: partial → pass ▲ security
- Dependency health: partial → 0.97 functional
- Package version: 0.28.1 → 0.28.2 functional
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Sept 26 +3
- License: fail → pass ▲ functional
- Licence: MIT functional
- 25 Sept 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Oct 2026 · Analysed pypi/zoo_mcp@0.28.6
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
Dependencies 45 packages
| Packages resolved | 45 |
|---|---|
| Stale | 1 |
| No linked repository | 3 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
calculate_bounding_box_cad ~129
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 | Type | Req | Description |
|---|---|---|---|
| input_file | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calculate_bounding_box_kcl ~204
Calculate the bounding box of a KCL model. 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: unit_length (str): The unit of length to return the result in. One of 'cm', 'ft', 'in', 'm', 'mm', 'yd' kcl_code (str | None): The KCL code to evaluate. kcl_path (str | None): Path to a .kcl file or a directory containing a main.kcl file. 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 | Type | Req | Description |
|---|---|---|---|
| kcl_code | – | – | – |
| kcl_path | – | – | – |
| unit_length | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calculate_cad_physical_properties ~387
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 | Type | Req | Description |
|---|---|---|---|
| density | number | yes | – |
| input_file | string | yes | – |
| unit_area | string | yes | – |
| unit_density | string | yes | – |
| unit_length | string | yes | – |
| unit_mass | string | yes | – |
| unit_volume | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calculate_center_of_mass ~170
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 | Type | Req | Description |
|---|---|---|---|
| input_file | string | yes | – |
| unit_length | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calculate_kcl_physical_properties ~419
Calculate physical properties (volume, mass, surface area, center of mass, bounding box) of a KCL model. 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 evaluate. kcl_path (str | None): Path to a .kcl file or a directory containing a main.kcl file. 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 | Type | Req | Description |
|---|---|---|---|
| density | number | – | – |
| kcl_code | – | – | – |
| kcl_path | – | – | – |
| unit_area | string | – | – |
| unit_density | string | – | – |
| unit_length | string | – | – |
| unit_mass | string | – | – |
| unit_volume | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calculate_mass ~209
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 | Type | Req | Description |
|---|---|---|---|
| density | number | yes | – |
| input_file | string | yes | – |
| unit_density | string | yes | – |
| unit_mass | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calculate_surface_area ~182
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 | Type | Req | Description |
|---|---|---|---|
| input_file | string | yes | – |
| unit_area | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
calculate_volume ~185
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 | Type | Req | Description |
|---|---|---|---|
| input_file | string | yes | – |
| unit_volume | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
center_camera_on_selection ~225
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 | Type | Req | Description |
|---|---|---|---|
| move_vantage | boolean | – | – |
| session_id | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
convert_cad_file ~234
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 | Type | Req | Description |
|---|---|---|---|
| export_format | – | yes | – |
| export_path | – | yes | – |
| input_file | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
curve_get_end_points ~87
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 or exec_kcl_project. Returns: CurveGetEndPoints: The curve's start and end points.
| Name | Type | Req | Description |
|---|---|---|---|
| curve_id | string | yes | – |
| session_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| end | – | yes | – |
| start | – | yes | – |
No examples provided.
curve_get_type ~88
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 or exec_kcl_project. Returns: CurveGetType: The curve's geometric type.
| Name | Type | Req | Description |
|---|---|---|---|
| curve_id | string | yes | – |
| session_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| curve_type | – | yes | – |
No examples provided.
edge_get_length ~88
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 or exec_kcl_project. Returns: EdgeGetLength: The edge length in the current scene units.
| Name | Type | Req | Description |
|---|---|---|---|
| edge_id | string | yes | – |
| session_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| length | number | yes | – |
No examples provided.
engine_util_evaluate_path ~266
Evaluate a serialized KCL path at parameter t. Examples of `path_json`: ```json { "start": { "from": [10, 0] }, "value": [ { "type": "Arc", "center": [0, 0], "radius": 10, "angle_range": [0, 90] } ] } ``` ```json { "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 or exec_kcl_project. Returns: EngineUtilEvaluatePath: The position on the path at parameter t.
| Name | Type | Req | Description |
|---|---|---|---|
| path_json | string | yes | – |
| session_id | string | yes | – |
| t | number | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| pos | – | yes | – |
No examples provided.
entity_distance ~131
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 or exec_kcl_project. on_axis: Optional global axis for projected distance; omit for Euclidean distance. Returns: EntityGetDistance: The minimum and maximum distance between the entities.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_id1 | string | yes | – |
| entity_id2 | string | yes | – |
| on_axis | – | – | – |
| session_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| max_distance | number | yes | – |
| min_distance | number | yes | – |
No examples provided.
entity_get_all_child_uuids ~89
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 or exec_kcl_project. Returns: EntityGetAllChildUuids: All child entity UUIDs.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_id | string | yes | – |
| session_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| entity_ids | array | yes | – |
No examples provided.
entity_get_index ~83
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 or exec_kcl_project. Returns: EntityGetIndex: The entity's index within its parent.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_id | string | yes | – |
| session_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| entity_index | integer | yes | – |
No examples provided.
entity_get_parent_id ~83
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 or exec_kcl_project. Returns: EntityGetParentId: The parent entity's UUID.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_id | string | yes | – |
| session_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| entity_id | string | yes | – |
No examples provided.
entity_get_sketch_paths ~90
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 or exec_kcl_project. Returns: EntityGetSketchPaths: The sketch path UUIDs belonging to the entity.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_id | string | yes | – |
| session_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| entity_ids | array | yes | – |
No examples provided.
exec_kcl_project ~227
Mock preflight a KCL project, then run it in the session and save its artifact graph. Both stages use the same captured project. Mock errors return immediately without starting real execution. Mock warnings remain visible and allow it. Known mock-engine limitations are reported as warnings for real execution. Args: kcl_code (str | None): Self-contained KCL code to run as a single-file project. Standard-library imports are allowed; filesystem imports require kcl_path. kcl_path (str | None): A .kcl file or project directory containing main.kcl. Dependencies and symlink targets must remain inside the entrypoint's directory. session_id: The modeling session in which to execute the project. Returns: ResultZooExecuteKcl: Separate mock_preflight and real_execution outcomes, each with status, message, and diagnostics. Session success includes path_artifact_graph. Mock failures set real_execution.status to not_run.
| Name | Type | Req | Description |
|---|---|---|---|
| kcl_code | – | – | – |
| kcl_path | – | – | – |
| session_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
execute_kcl ~369
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. 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 | Type | Req | Description |
|---|---|---|---|
| kcl_code | – | – | – |
| kcl_path | – | – | – |
| session_id | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
export_kcl ~293
Export KCL code to a CAD file. 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. This tool does not save editable KCL source. For model creation, include the saved KCL project alongside any requested CAD exports unless the user explicitly requests export-only output. Args: kcl_code (str | None): The KCL code to export to a CAD file. kcl_path (str | None): The path to a KCL file to export to a CAD file. The path should point to a .kcl file or a directory containing a main.kcl file. export_path (str | None): The path to export the CAD file. If no path is provided, a temporary file will be created. export_format (str | None): The format to export the file as. 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 | Type | Req | Description |
|---|---|---|---|
| export_format | – | – | – |
| export_path | – | – | – |
| kcl_code | – | – | – |
| kcl_path | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
format_kcl ~175
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 | Type | Req | Description |
|---|---|---|---|
| kcl_code | – | – | – |
| kcl_path | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_face_info ~138
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 or exec_kcl_project. 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 | Type | Req | Description |
|---|---|---|---|
| face_id | string | yes | – |
| session_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| face_get_center | – | yes | – |
| face_get_gradient | – | yes | – |
| face_get_position | – | yes | – |
No examples provided.
get_kcl_doc ~135
Get the full content of a specific KCL documentation file. Use list_kcl_docs() to see available documentation paths, or search_kcl_docs() to find relevant documentation by keyword. 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. If there was an error, returns an error message string.
| Name | Type | Req | Description |
|---|---|---|---|
| doc_path | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
get_kcl_sample ~261
Get the full content of a specific KCL sample including all files. Retrieves all KCL files that make up a sample project. Some samples consist of a single main.kcl file, while others have multiple files (e.g., parameters.kcl, components, etc.). Use list_kcl_samples() to see available sample names, or search_kcl_samples() to find samples by keyword. Args: sample_name (str): The sample directory name (e.g., "ball-bearing", "axial-fan", "gear") Returns: SampleData | str: A SampleData dictionary containing: - name: The sample directory name - 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 fetches the per-sample page and counts the parsed files. - files: List of SampleFile dictionaries, each with 'filename' and 'content' Returns an error message string if the sample is not found. If there was an error, returns an error message string.
| Name | Type | Req | Description |
|---|---|---|---|
| sample_name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
get_modeling_sessions ~85
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
get_sketch_constraint_status ~268
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 | Type | Req | Description |
|---|---|---|---|
| kcl_code | – | – | – |
| kcl_path | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
highlight_set_entities ~291
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 | Type | Req | Description |
|---|---|---|---|
| entity_ids | array | yes | – |
| session_id | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
import_cad_file ~105
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 | Type | Req | Description |
|---|---|---|---|
| input_file | string | yes | – |
| session_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
lint_and_fix_kcl ~213
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 | Type | Req | Description |
|---|---|---|---|
| kcl_code | – | – | – |
| kcl_path | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
list_kcl_docs ~149
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 | str: Categories mapped to lists of available documentation paths. If there was an error, returns an error message string.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
list_kcl_samples ~190
List all available KCL sample projects. Returns a list of all available KCL code samples from the Zoo samples repository. Each sample demonstrates a specific CAD modeling technique or creates a particular 3D model. Returns: list[dict] | str: List of sample information, each containing: - name: The sample directory name (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 /aquarium index 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. If there was an error, returns an error message string.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
list_org_datasets ~133
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
list_org_skills ~89
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
mock_execute_kcl ~171
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 | Type | Req | Description |
|---|---|---|---|
| kcl_code | – | – | – |
| kcl_path | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
save_image ~184
Save an ImageContent object to disk. This allows a human to review images locally that an LLM has requested. Args: image (ImageContent): The ImageContent object to save. This is typically returned by the snapshot tool. Note that snapshot can write straight to disk via its own output_path argument; this tool is for images you already hold. output_path (str | None): The path where the image should be saved. Can be a file path (e.g., '/path/to/image.jpg') or a directory (e.g., '/path/to/dir'). If a directory is provided, the file will be named 'image.jpg'. If not provided, a temporary file will be created. Returns: str: The absolute path to the saved image file, or an error message if the operation fails.
| Name | Type | Req | Description |
|---|---|---|---|
| image | – | yes | – |
| output_path | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
search_kcl_docs ~170
Search KCL documentation by keyword. Searches across all KCL language and standard library documentation for the given query. Returns relevant excerpts with surrounding context. Args: query (str): The search query (case-insensitive). max_results (int): Maximum number of results to return (default: 5). Returns: list[dict] | str: List of search results, each containing: - path: The documentation file path - title: The document title (from first heading) - excerpt: A relevant excerpt with the match highlighted in context - match_count: Number of times the query appears in the document If there was an error, returns an error message string.
| Name | Type | Req | Description |
|---|---|---|---|
| max_results | integer | – | – |
| query | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
search_kcl_samples ~228
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] | str: List of search results, each containing: - name: The sample directory name (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 If there was an error, returns an error message string.
| Name | Type | Req | Description |
|---|---|---|---|
| max_results | integer | – | – |
| query | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
search_org_dataset_semantic ~153
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 | Type | Req | Description |
|---|---|---|---|
| dataset_id | string | yes | – |
| limit | – | – | – |
| query | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | – | yes | – |
No examples provided.
select_entities ~299
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 | Type | Req | Description |
|---|---|---|---|
| entity_ids | array | yes | – |
| session_id | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
set_selection_filter ~97
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 | Type | Req | Description |
|---|---|---|---|
| entity_types | array | yes | – |
| session_id | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
snapshot ~928
Render an open modeling session as an image. Populate the scene first by passing this session_id to execute_kcl or exec_kcl_project. 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 or exec_kcl_project. 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 le…
| Name | Type | Req | Description |
|---|---|---|---|
| camera_view | – | – | – |
| highlight_edges | boolean | – | – |
| max_image_dimension | integer | – | – |
| output_path | – | – | – |
| padding | number | – | – |
| session_id | string | yes | – |
| zoom | boolean | – | – |
No output schema declared.
No examples provided.
start_modeling_session ~152
Open an empty modeling websocket 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 or exec_kcl_project 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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
stop_modeling_session ~92
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 | Type | Req | Description |
|---|---|---|---|
| session_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | null | yes | – |
No examples provided.
visualize_sketch ~224
Render a named 2D KCL sketch as a solver-debug PNG. The image shows sketch geometry and solver freedom without opening a modeling session. ``sketch_name`` is the variable assigned to the sketch, such as ``profile`` in ``profile = sketch(on = XY) { ... }``. Use ``get_sketch_constraint_status`` to discover sketch names when needed. 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. Returns: The inline PNG, its saved absolute path, or an error message.
| Name | Type | Req | Description |
|---|---|---|---|
| kcl_code | – | – | – |
| kcl_path | – | – | – |
| output_path | – | – | – |
| sketch_name | string | yes | – |
No output schema declared.
No examples provided.
What is the io.github.KittyCAD/zoo-mcp server?
io.github.KittyCAD/zoo-mcp is listed in the public MCP registry as io.github.KittyCAD/zoo-mcp. An MCP server that provides access to the Zoo API for various CAD operations and tools. This page covers its PyPI package (zoo_mcp).
Is the io.github.KittyCAD/zoo-mcp server safe to use?
io.github.KittyCAD/zoo-mcp scores 77 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 October 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.KittyCAD/zoo-mcp server expose?
io.github.KittyCAD/zoo-mcp exposes 46 tools: calculate_center_of_mass, calculate_mass, calculate_surface_area, calculate_volume, calculate_cad_physical_properties, and 41 more. Their descriptions and schemas cost roughly 9,168 tokens of context every time the server is loaded.
Is the io.github.KittyCAD/zoo-mcp server still maintained?
io.github.KittyCAD/zoo-mcp is still listed as active in the MCP registry. We last reached this channel on 4 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.KittyCAD/zoo-mcp server under?
io.github.KittyCAD/zoo-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.