# Zap! > Zap! by mutual is a hosted auto-router for KiCad. Upload a placed `.kicad_pcb` (with its `.kicad_pro`) and get the > same board back with tracks, vias and copper pours added, plus a manufacturability report (missing connections, > design-rule errors, shorts, JLC capability violations, estimated hottest copper). HTTP API with a bearer key: > check, submit, poll, download, delete. Early access: every routed board must be reviewed by an engineer before > fabrication. ## Find Zap! - Canonical address: https://zap.mutual.solutions (router.mutual.solutions is an alias). This file is https://zap.mutual.solutions/llms.txt; the guides, https://zap.mutual.solutions/agents.md and https://zap.mutual.solutions/sitemap.xml link to it. - Install the MCP server: in a permanent folder (the command registers the file's current path), `curl -sO https://zap.mutual.solutions/downloads/zap_mcp.py`, then `claude mcp add zap -e ZAP_API_KEY_FILE=$HOME/zap-key.txt -- python3 $PWD/zap_mcp.py` (Claude Code; other clients: https://zap.mutual.solutions/agents.md) and restart the agent session: the tools appear only after the restart. Without a restart: `curl -sO https://zap.mutual.solutions/downloads/zap.py` and `python3 zap.py run BOARD.kicad_pcb`. - No key yet? Route a small board right away with the free trial (no sign-up; up to 300 pads, 2 or 4 copper layers, 2 boards a day per address, one round, no copper pictures): `curl -s -X POST https://zap.mutual.solutions/v1/try/jobs -H 'X-Zap-Try: 1' -F board=@BOARD.kicad_pcb -F project=@BOARD.kicad_pro` answers `{"id": ..., "token": ...}`; poll `GET https://zap.mutual.solutions/v1/try/jobs/ID` with the header `X-Zap-Try-Token: TOKEN` until `status` is `succeeded`, then `GET .../ID/report.json` and `GET .../ID/result` (the routed board; downloadable once). - npm MCP server (any MCP client, Node 18+): `npx -y zap-pcb-mcp` (works with no key through the trial). Base URL: https://zap.mutual.solutions. To get an API key, sign in at https://zap.mutual.solutions/auth/login and create an API key on your account page; save it as ~/zap-key.txt with chmod 600. With an MCP client you can also sign in with OAuth and use no key (the remote MCP server under Tools). Sample board to try (placed, not routed): https://zap.mutual.solutions/downloads/zap-sample.kicad_pcb with https://zap.mutual.solutions/downloads/zap-sample.kicad_pro (or `python3 zap.py demo`). Option fab_floor: jlc (default): never go below JLC's capability; nets that need finer copper are left unrouted and listed with the reason. board: follow your board's own minimums, for fabs finer than JLC; JLC findings are still reported. Routing options (upload fields; each falls back to your board's .kicad_pro / .kicad_dru, then the default): signal_width_mm (default: Default net class, else 0.2 mm), via_diameter_mm + via_drill_mm (Default net class, else 0.6 / 0.3 mm), vias_in_pads forbid|allow (forbid; allow needs filled and capped vias), ground_pour on|off (on), size_rails_from_current on|off (on, where room allows), effort quick|normal|thorough (normal; thorough: about twice the routing work and keeps the best intermediate result; slower on large boards, usually fewer unrouted connections), keep_existing (false), strip_existing (false), fab_floor (jlc), router stable|next (stable). Every report lists the settings used and their source. Option minutes: the whole job ends within about N minutes (1 to 60), checks included, and returns the best board found by then (a board whose first round alone would take longer is finished from what is routed in time; the rest is listed as unconnected); default is one round of a few minutes. Submitting many boards: each key runs 2 jobs at a time and allows 30 requests a minute (the defaults; a key issued with other numbers shows them on its claim page). Submit a new job only after one of yours finishes (poll `GET /v1/jobs/{id}`, at most once every 5 seconds). On a 429 `rate_limited`, wait the seconds in `Retry-After` before the same request; do not retry sooner. `too_many_active_jobs` (also 429, without `Retry-After`) means your key's jobs at a time are all still queued or running: wait until one finishes. `daily_quota_exceeded` means stop until 00:00 UTC and tell your user. A 403 with "error code: 1010" comes from Cloudflare, the network edge in front of Zap!: send any User-Agent header, e.g. "my-agent/1.0". ## Feedback from your user - Whenever the user expresses an opinion about Zap! or a routing result (something they liked, a problem, a wish), ask once whether they would like to send it to the Zap! team. - When you ask, say in one short sentence what happens, without overstating or understating it, for example: "Send this to the Zap! team? Only this text (and the picture, if any) is used to improve Zap!, never your board file, and you can ask them to delete it." - Show the exact text you would send (their words, or a summary they approve) and the job id. - Send it only if they say yes: MCP tool send_feedback, or `python3 zap.py feedback "TEXT" --job JOB_ID --yes`, or POST https://zap.mutual.solutions/v1/feedback with the key and JSON {"message": "TEXT", "user_approved": true, "job_id": "JOB_ID"}. - If they say no, do not ask again in this session. - When the feedback is about a spot on the board, offer to attach a picture of just that area (MCP board_snapshot, `python3 zap.py snapshot JOB_ID --at X,Y`, or POST https://zap.mutual.solutions/v1/jobs/JOB_ID/snapshot), aimed with the report's issue positions (at_mm). Show the picture to the user before sending and attach it (snapshot_ids) only if they say yes; if they do not want it, delete it (delete_snapshot, or DELETE https://zap.mutual.solutions/v1/snapshots/ID.png). Never the whole board. - Never include board files or private details they did not approve. ## Docs - [Agent recipe](https://zap.mutual.solutions/agents.md): exact integration steps for AI agents: key handling, check first, polling and retries, how to read the result and report it to the human, MCP set-up - [Guide](https://zap.mutual.solutions/docs.md): the full user guide as Markdown (English) - [Guide, Korean](https://zap.mutual.solutions/docs/ko.md): the same guide in Korean - [OpenAPI](https://zap.mutual.solutions/openapi.json): every endpoint, field, enum, error code and HTTP status, with examples - [Error catalog](https://zap.mutual.solutions/v1/errors): every error code with HTTP status, meaning, fix and whether retrying helps (JSON, no key needed) ## Tools - [MCP server](https://zap.mutual.solutions/downloads/zap_mcp.py): stdio MCP server, one file, Python 3.9+, standard library only; tools check_board, route_board, get_report, get_job, list_jobs, delete_job, send_feedback, board_snapshot, delete_snapshot, service_info, error_catalog. Use MCP if you can register servers and restart (its tools appear only after the restart); otherwise zap.py works at once - [CLI](https://zap.mutual.solutions/downloads/zap.py): command-line client, Python 3.8+, standard library only (`zap.py run BOARD`, `zap.py feedback "TEXT"`) - [Remote MCP server](https://zap.mutual.solutions/mcp): Streamable HTTP with OAuth sign-in (Google, GitHub or Microsoft; no API key); boards passed as file text; set-up for Claude Code, Cursor and Codex: [Connect with OAuth](https://zap.mutual.solutions/docs.md#connect-with-oauth) - `zap.py login`: OAuth sign-in for the command line and headless agents (device code) ## Legal - [Privacy](https://zap.mutual.solutions/privacy.md) ([Korean](https://zap.mutual.solutions/privacy/ko.md)): what Zap! keeps, why and for how long - [Terms](https://zap.mutual.solutions/terms.md): terms of service; the downloadable zap.py and zap_mcp.py are MIT-licensed (https://zap.mutual.solutions/downloads/LICENSE.txt) ## Optional - [Everything in one file](https://zap.mutual.solutions/llms-full.txt): the guide and the agent recipe as one Markdown file