Zoo MCP
An MCP server that provides access to the Zoo API for various CAD operations and tools.
Connector by KittyCAD · GitHub account verified by the MCP Registry
Chalk Labs
Need help deploying Zoo MCP?
Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/kittycad-zoo-mcp
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: ui-design
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list, install config and code. Checked Oct 25, 2026.
- Tools
- 33 read · 10 write · 3 delete
- Secrets
- 1 (API keys, tokens or passwords)
- Install scripts
- None found
- Runs as
- Python package
Tools by what they do 46
Read from the source code; the running server may list different tools.
Read 33 · Look things up without changing anything.
calculate_bounding_box_cadcalculate_bounding_box_kclcalculate_cad_physical_propertiescalculate_center_of_masscalculate_kcl_physical_propertiescalculate_masscalculate_surface_areacalculate_volumeconvert_cad_filecurve_get_end_pointscurve_get_typeedge_get_length
Show 21 more tools
engine_util_evaluate_pathentity_distanceentity_get_all_child_uuidsentity_get_indexentity_get_parent_identity_get_sketch_pathsformat_kclget_face_infoget_kcl_docget_kcl_sampleget_modeling_sessionslint_and_fix_kcllist_kcl_docslist_kcl_sampleslist_org_datasetslist_org_skillssearch_kcl_docssearch_kcl_samplessearch_org_dataset_semanticsnapshotvisualize_sketch
Write 10 · Create, change, send or run things.
center_camera_on_selectionexecute_kclhighlight_set_entitiesimport_cad_filemock_execute_kclsave_imageselect_entitiesset_selection_filterstart_modeling_sessionstop_modeling_session
Delete 3 · Delete, drop, revoke or wipe things.
exec_kcl_projectexport_kclget_sketch_constraint_status
Secrets and settings it asks for
Secrets: values you paste in that let it act as you.
ZOO_TOKEN
Network hosts it talks to 3
github.com· found in codesitemaps.org· found in codezoo.dev· found in code
Files it touches
- Any path the agent passes to its tools
Tools (46)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
calculate_bounding_box_cadCalculate 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.
calculate_bounding_box_kclCalculate 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 ope…
calculate_cad_physical_propertiesCalculate 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. …
calculate_center_of_massCalculate 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.
calculate_kcl_physical_propertiesCalculate 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_den…
calculate_massCalculate 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…
calculate_surface_areaCalculate 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.
calculate_volumeCalculate 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.
center_camera_on_selectionPoint 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…
convert_cad_fileConvert 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', 'ste…
curve_get_end_pointsGet 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.
curve_get_typeGet 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.
edge_get_lengthGet 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.
engine_util_evaluate_pathEvaluate 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_…
entity_distanceGet 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.
Show 31 more tools
entity_get_all_child_uuidsGet 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.
entity_get_indexGet 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.
entity_get_parent_idGet 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.
entity_get_sketch_pathsGet 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.
exec_kcl_projectMock 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 rem…
execute_kclExecute 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 p…
export_kclExport 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. expor…
format_kclFormat 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
get_face_infoGet 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.
get_kcl_docGet 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. Raises: ToolError: Documentation could not be fetched; the call can be retried.
get_kcl_sampleGet 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 de…
get_modeling_sessionsList 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.
get_sketch_constraint_statusExecute 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 al…
highlight_set_entitiesReplace 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…
import_cad_fileImport 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.
lint_and_fix_kclLint 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 kc…
list_kcl_docsList 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 pa…
list_kcl_samplesList 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 ``Fal…
list_org_datasetsList 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.
list_org_skillsList 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.
mock_execute_kclMock 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.
save_imageSave 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 fi…
search_kcl_docsSearch 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]: 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 …
search_kcl_samplesSearch 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-…
search_org_dataset_semanticSemantic-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.
select_entitiesReplace 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 throu…
set_selection_filterSet 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.
snapshotRender 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', …
start_modeling_sessionOpen 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 or exec_kcl_project to populate the scene, then reuse it with modeling query, selection, and highlight tools. Stop the session expli…
stop_modeling_sessionClose 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
visualize_sketchRender 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 …
Signals
- Stars
- 10
- Forks
- 1
- Open issues
- 6
- Weekly downloads
- 5,776
- Last commit
- Oct 23, 2026 (6 days ago)
- Last release
- Oct 16, 2026 (14 days ago)
- Last package publish
- Oct 16, 2026 (14 days ago)
From GitHub (fetched Oct 24, 2026) and the package registry.
Details
- Registry name
io.github.KittyCAD/zoo-mcp- Version
- 0.28.12
- Auth
- API key
- Packages
- pypi zoo_mcp
- License
- MIT
- Repository
- github.com/KittyCAD/mcp
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
Done for you
Rather not set it up yourself?
Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.
See how we build AI agents →Read the case studies
Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.
- launches shipped
- 50+
- launches shipped
- media placements
- 500+
- media placements
- founders on every account
- 2
- founders on every account
Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block
Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.
Get Zoo MCP running in your business
Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.
Cite this page
Zoo MCP. Agent Mart. https://agentmart.dev/connectors/kittycad-zoo-mcp (last updated 2026-10-24)