Skip to content
Agentmart
Submit a tool

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

IndexedMITLocal (stdio)★ 10
Write a review

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.

Book a call

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.

We use your email only for this newsletter. Privacy

About

An MCP server that provides access to the Zoo API for various CAD operations and tools.

Use cases: ui-design

No 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_cad
  • calculate_bounding_box_kcl
  • calculate_cad_physical_properties
  • calculate_center_of_mass
  • calculate_kcl_physical_properties
  • calculate_mass
  • calculate_surface_area
  • calculate_volume
  • convert_cad_file
  • curve_get_end_points
  • curve_get_type
  • edge_get_length
Show 21 more tools
  • engine_util_evaluate_path
  • entity_distance
  • entity_get_all_child_uuids
  • entity_get_index
  • entity_get_parent_id
  • entity_get_sketch_paths
  • format_kcl
  • get_face_info
  • get_kcl_doc
  • get_kcl_sample
  • get_modeling_sessions
  • lint_and_fix_kcl
  • list_kcl_docs
  • list_kcl_samples
  • list_org_datasets
  • list_org_skills
  • search_kcl_docs
  • search_kcl_samples
  • search_org_dataset_semantic
  • snapshot
  • visualize_sketch

Write 10 · Create, change, send or run things.

  • center_camera_on_selection
  • execute_kcl
  • highlight_set_entities
  • import_cad_file
  • mock_execute_kcl
  • save_image
  • select_entities
  • set_selection_filter
  • start_modeling_session
  • stop_modeling_session

Delete 3 · Delete, drop, revoke or wipe things.

  • exec_kcl_project
  • export_kcl
  • get_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 code
  • sitemaps.org · found in code
  • zoo.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_cad

    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.

  • calculate_bounding_box_kcl

    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 ope…

  • calculate_cad_physical_properties

    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. …

  • calculate_center_of_mass

    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.

  • calculate_kcl_physical_properties

    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_den…

  • calculate_mass

    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…

  • calculate_surface_area

    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.

  • calculate_volume

    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.

  • center_camera_on_selection

    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…

  • convert_cad_file

    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', 'ste…

  • curve_get_end_points

    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.

  • curve_get_type

    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.

  • edge_get_length

    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.

  • engine_util_evaluate_path

    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_…

  • entity_distance

    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.

Show 31 more tools
  • entity_get_all_child_uuids

    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.

  • entity_get_index

    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.

  • entity_get_parent_id

    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.

  • entity_get_sketch_paths

    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.

  • exec_kcl_project

    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 rem…

  • execute_kcl

    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 p…

  • export_kcl

    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. expor…

  • format_kcl

    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

  • get_face_info

    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.

  • get_kcl_doc

    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. Raises: ToolError: Documentation could not be fetched; the call can be retried.

  • get_kcl_sample

    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 de…

  • get_modeling_sessions

    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.

  • get_sketch_constraint_status

    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 al…

  • highlight_set_entities

    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…

  • import_cad_file

    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.

  • lint_and_fix_kcl

    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 kc…

  • list_kcl_docs

    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 pa…

  • list_kcl_samples

    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 ``Fal…

  • list_org_datasets

    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.

  • list_org_skills

    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.

  • mock_execute_kcl

    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.

  • save_image

    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 fi…

  • search_kcl_docs

    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]: 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_samples

    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-…

  • search_org_dataset_semantic

    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.

  • select_entities

    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 throu…

  • set_selection_filter

    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.

  • snapshot

    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', …

  • start_modeling_session

    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 or exec_kcl_project to populate the scene, then reuse it with modeling query, selection, and highlight tools. Stop the session expli…

  • stop_modeling_session

    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

  • visualize_sketch

    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 …

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
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.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying Zoo MCP?

CallGet help
Cite this page

Zoo MCP. Agent Mart. https://agentmart.dev/connectors/kittycad-zoo-mcp (last updated 2026-10-24)