Zoo Mcp

io.github.KittyCAD由 GitHub 帳號 KittyCAD 發布v0.34.3更新於 Nov 7, 2026

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

已驗證STDIO僅桌面開發者工具媒體與設計

概覽

AI 產生的概覽

Zoo MCP 讓助理存取 Zoo CAD API:執行 KCL 程式碼、管理建模工作階段、匯入 CAD 檔案、產生快照並匯出幾何。

可以做什麼
  • 執行 KCL 程式碼,回傳模擬預檢與實際執行結果,並可單獨執行模擬檢查
  • 管理持續性建模工作階段:啟動、列出、依工作階段 ID 重複使用與停止
  • 匯入 CAD 檔案,並對模型進行快照、選取、醒目提示與相機視角操作
  • 匯出模型、進行量測並查詢幾何資訊
  • 列出與搜尋公開的 Aquarium KCL 範例專案並下載其原始碼
適用情境
適合讓助理撰寫並執行 Zoo KCL 腳本、反覆調整參數化 CAD 模型,或取得公開範例專案作為起點,而不必離開對話。
執行需求
以本機 Python 套件執行(uvx zoo-mcp 或 uv run -m zoo_mcp),需要 uv,也可使用預先建置的執行檔。多數工具需要 Zoo 帳號:先執行一次 auth login 指令(登入資訊存於系統憑證儲存區),或透過 ZOO_API_TOKEN 設定 API 權杖(亦支援 KITTYCAD_API_TOKEN 與 ZOO_TOKEN 別名)。公開範例工具不需權杖。需要連線至 Zoo API 的網路。
安裝前請注意
API 權杖屬於憑證,請勿寫入共用設定或對話紀錄;明確設定的環境變數權杖會覆蓋已儲存的登入。執行 KCL 會在 Zoo 引擎上執行程式碼,可能耗用帳號資源;匯出與檔案匯入會讀取本機檔案,但入口目錄以外的相依項目會被拒絕。預先建置的執行檔未簽章,macOS 與 Windows 首次執行可能出現警告。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Zoo Mcp,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Zoo Model Context Protocol (MCP) Server

An MCP server housing various Zoo built utilities

Prerequisites

A Zoo account. Run uvx zoo-mcp auth login once before starting the server. The command opens your browser and prints a verification URL and code. The server reuses your saved login; public tools also work without login.

You can also use an API key:

bash
export ZOO_API_TOKEN="your_api_key_here"

Installation

  1. Ensure uv has been installed

  2. Create a uv environment

    bash
    uv venv
  3. Activate your uv environment (Optional)

  4. Install the package from GitHub

    bash
    uv pip install git+ssh://[email protected]/KittyCAD/mcp.git

Running the Server

The server can be started by using uvx

bash
uvx zoo-mcp

The server can be started locally by using uv and the zoo_mcp module

bash
uv run -m zoo_mcp

Manage device login explicitly:

bash
uvx zoo-mcp auth loginuvx zoo-mcp auth login --no-browseruvx zoo-mcp auth statusuvx zoo-mcp auth logout

Logins are saved per API origin in your system credential store using keyring: macOS Keychain, Windows Credential Locker, or a supported Linux keyring. On headless systems without an available keyring, set ZOO_API_TOKEN instead. Status never displays tokens. Logout removes only the saved login for the current origin; restart running servers afterward. If your login expires or is revoked, run auth login again and restart the server. If the login command fails because of a network error, run it again to retry. Server startup never opens a browser. Device authorization and polling use requests-oauth2client. Device login requires the API's dedicated Zoo MCP device client registration.

The server can also be run with the mcp package

bash
uv run mcp run src/zoo_mcp/server.py

Streamable HTTP

The server uses stdio by default. To serve the same tools over Streamable HTTP:

bash
uvx zoo-mcp --transport streamable-http --host 127.0.0.1 --port 8000# From a local checkout:uv run -m zoo_mcp --transport streamable-http

Connect an MCP client to http://127.0.0.1:8000/mcp. The SDK manages HTTP sessions and streaming responses. --host and --port configure the HTTP listener; their defaults are 127.0.0.1 and 8000.

Supplying client configuration from Python

Local entry points capture credentials when Zoo MCP is imported at startup. Token precedence is KITTYCAD_API_TOKEN, ZOO_API_TOKEN, then the registry's ZOO_TOKEN alias. Any explicit environment token bypasses saved/device login. API origin precedence is ZOO_HOST, KITTYCAD_HOST, then https://api.zoo.dev. Saved logins never cross API origins.

Applications can supply client configuration explicitly without changing the process environment or adding authentication arguments to MCP tools:

python
from zoo_mcp.client_config import ZooClientConfig, use_client_configfrom zoo_mcp.server import mcp
with use_client_config(ZooClientConfig(token=api_token, base_url=api_origin)):    result = await mcp.call_tool("list_org_datasets", {})

The context supplies the same token, origin, and headers to the KittyCAD SDK and KCL session constructors and restores the previous configuration on exit. New calls can use refreshed configuration. Finish child tasks before leaving their configuration context. An explicit configuration context also prevents the server lifespan from loading a saved local login. Hosted workers and embeddings should always use this interface.

To forward custom HTTP headers, pass headers={"User-Agent": "MyApp/1.0", "X-Request-Source": "example"} to ZooClientConfig. These headers reach REST requests and modeling WebSocket handshakes, including KCL sessions. A supplied User-Agent replaces the default value. Tokens and headers are excluded from configuration representations.

Client configuration applies to downstream calls. Applications serving different owners must also isolate their process-wide modeling sessions and workspaces.

Prebuilt binaries

Each GitHub release also attaches standalone executables (built with PyInstaller) for Linux (x86_64, arm64), macOS (arm64, x86_64), and Windows (x86_64) — no Python toolchain required. Download the binary for your platform, set ZOO_API_TOKEN, and run it directly, e.g.:

bash
ZOO_API_TOKEN="your_api_key_here" ./zoo-mcp-linux-x86_64

The binaries are not code-signed, so macOS Gatekeeper and Windows SmartScreen may warn on first run.

Integrations

The server can be used as is by running the server or importing directly into your python code.

python
from zoo_mcp.server import mcp
mcp.run()

Individual tools can be used in your own python code as well. At Zoo we use zoo-mcp like this with ZooKeeper to save on resources. Instead of spinning up one MCP server per agent, each agent in a sense "embeds" the server in their own runtime. It has the additional benefit of preventing shared state.

python
from mcp.server.mcpserver import MCPServerfrom zoo_mcp.zoo_tools import ResultZooExecuteKcl, zoo_execute_kcl
mcp = MCPServer(name="My Example Server")

@mcp.tool()async def my_execute_kcl(kcl_code: str) -> ResultZooExecuteKcl:    """    Example tool that uses the zoo_execute_kcl function from zoo_mcp.zoo_tools    """    return await zoo_execute_kcl(kcl_code=kcl_code)

The server can be integrated with Claude desktop using the following command

bash
uv run mcp install src/zoo_mcp/server.py

The server can also be integrated with Claude Code using the following command

bash
claude mcp add --scope project "Zoo-MCP" uv -- --directory "$PWD"/src/zoo_mcp run server.py

The server can also be tested using the MCP Inspector

bash
uv run mcp dev src/zoo_mcp/server.py

For running with codex-cli

bash
codex \  -c 'mcp_servers.zoo.command="uvx"' \  -c 'mcp_servers.zoo.args=["zoo-mcp"]' \  -c mcp_servers.zoo.env.ZOO_API_TOKEN="$ZOO_API_TOKEN"

You can also use the helper script included in this repo:

bash
./codex-zoo.sh

The script prompts for a request, runs Codex with the Zoo MCP server, and saves a JSONL transcript (including token usage) to codex-run-<timestamp>.jsonl.

Architecture

Tools are defined in src/zoo_mcp/*.py, where they are then imported into src/zoo_mcp/server.py and tied to actual @mcp.tool() decorated functions.

src/zoo_mcp/zoo_tools.py acts as a large toolset to interact with Zoo's KCL and engine facilities. This source file houses other utilities like parse_unit or normalize_ext (normalizing file extensions).

Modeling scenes use explicit persistent sessions, with at most one session open per server process. Call get_modeling_sessions to recover its ID after a client reconnect, or call start_modeling_session when none exists. Populate the session with execute_kcl or import_cad_file, passing session_id to either tool. Reuse the same session_id with snapshot and modeling tools; then call stop_modeling_session when finished.

Sessions remain available across client reconnects while the server and engine connection stay alive. Idle sessions continue receiving engine status messages so keepalive checks remain responsive. Disconnected sessions are removed from get_modeling_sessions; start a new session and execute the model again to recover.

KCL execution and persistent modeling sessions use the CPU engine pool. Isolated KCL snapshots temporarily enable CPU rendering. Persistent sessions initialize rendering on the first snapshot, selection, highlight, or camera tool and retain it until the session is stopped, preserving visual state across calls. Exports, measurements, and geometry queries do not initialize graphics.

The KCL samples tools list and search public Aquarium projects from the Zoo API. Pass the returned name (a public project ID) to get_kcl_sample to download its KCL sources. Filenames preserve project-relative paths, including subdirectories. These public tools do not require an API token. The multipleFiles field in list/search results is a hint until the project has been downloaded.

execute_kcl runs mock execution before real execution and returns separate mock_preflight and real_execution objects. Each contains status (succeeded, failed, or not_run), message, and diagnostics grouped by severity. Stage messages are short summaries; the top-level message retains the full report for existing callers. Failed stages also expose error_family, including ZooMCPTimeoutError for session timeouts. Mock errors or an aborted mock execution return immediately with ok: false and real_execution.status: "not_run". Mock warnings remain in mock_preflight.diagnostics even if real execution fails. The known planeOf mock-engine limitation is reported as a warning so the real engine can evaluate it; other mock errors still block execution. Session responses expose mock diagnostics; the engine does not return real-stage diagnostics for session execution.

Path inputs capture the entrypoint, its transitive imports (including linked modules and glTF buffers), and project.toml once. Both stages use that copy without scanning unrelated files in the containing directory. Dependencies and symlink targets must stay inside the entrypoint's directory; external paths are rejected before file reads or execution. Transient local real-execution failures retain their bounded retries using the same copy without repeating mock execution. Diagnostics refer to the original source paths. Inline kcl_code accepts self-contained code and standard-library imports; filesystem imports require kcl_path so their dependencies can be captured within an explicit directory. When calling execute_kcl with session_id, check ok, then read path_artifact_graph on session success. The standalone mock_execute_kcl tool continues to return its existing boolean/message pair.

Contributing

Contributions are welcome! Please open an issue or submit a pull request on the GitHub repository

PRs will need to pass tests and linting before being merged.

ruff is used for linting and formatting.

bash
uvx ruff checkuvx ruff format

ty is used for type checking.

bash
uvx ty check

Testing

The server includes tests located in tests. To run the tests, use the following command:

bash
uv run pytest -n auto

來源:README.md,提交 2aac766

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

20
  1. v0.34.3最新Nov 7, 2026
  2. v0.34.1Nov 6, 2026
  3. v0.34.0Nov 5, 2026
  4. v0.33.0Oct 30, 2026
  5. v0.29.0Oct 30, 2026
  6. v0.28.16Oct 29, 2026
  7. v0.28.14Oct 26, 2026
  8. v0.28.13Oct 25, 2026
  9. v0.28.12Oct 16, 2026
  10. v0.28.11Oct 15, 2026
  11. v0.28.9Oct 7, 2026
  12. v0.28.8Oct 7, 2026
  13. v0.28.7Oct 5, 2026
  14. v0.28.6Oct 1, 2026
  15. v0.28.5Oct 1, 2026
  16. v0.28.3Sep 29, 2026
  17. v0.28.2Sep 28, 2026
  18. v0.28.1Sep 22, 2026
  19. v0.28.0Sep 19, 2026
  20. v0.27.0Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分