Koppar
Server Details
Design working and manufacturable PCBs from your agent: a circuit description becomes a schematic, a routed board checked with DRC, a live-priced BOM and Gerbers. Calling tools needs a free API key from app.koppar.ai.
- Status
- Healthy
- Uptime
- 99.9% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 66 tools
Most tools have a distinct scope and the long descriptions give sequencing hints, so many boundaries are workable. But several clusters are easy to confuse: status/reporting tools (get_board_status, get_board_job, get_board_info, get_fab_status, get_design), copper cleanup tools (cleanup_board, prune_vias, polish_vias, tidy_copper, widen_nets), and placement tools (auto_place, anneal_place, place_footprints, start_board). At 66 tools, misselection risk remains substantial even though descriptions help.
The surface is consistently snake_case and overwhelmingly verb_noun (e.g. add_copper, run_drc, set_zones, get_bom, restore_design). A few names like auto_place are less verb-like, but they still fit the same readable convention. There is no camelCase or chaotic mixed-style naming.
Sixty-six tools is far beyond a well-scoped MCP surface and is heavily fragmented into fine-grained operations. The PCB domain is broad and each tool is non-trivial, which prevents a score of 1, but many cleanup, status, placement, and routing operations could be consolidated or exposed as modes. The count is excessive for reliable tool selection.
The surface covers the full design lifecycle: design creation, schematic synthesis and review, BOM and sourcing, placement, routing, DRC, fab release, ordering, import/export, revisions, and feedback. There are no obvious CRUD or lifecycle gaps for the stated PCB automation purpose.
Available Tools
66 toolsadd_copperAdd tracks and viasAInspect
Lay exact copper by hand where the routers leave a gap: tracks as polylines on one copper layer, and through vias. width_mm, diameter_mm and drill_mm default to the board's current track and via sizes. Nets must exist on the board. Nothing is checked here: run_drc afterwards, and ripup_routing takes copper back out.
| Name | Required | Description | Default |
|---|---|---|---|
| vias | No | ||
| tracks | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic safe-mutation profile; the description goes further by disclosing that no validation happens here ("Nothing is checked here"), that nets must already exist on the board, and how to undo via ripup_routing. It does not cover failure behavior for a missing net, but the net-existence precondition is a real, non-obvious constraint the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with what gets created, then defaults, then preconditions, then caveats/follow-ups. No filler and no restatement of the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers purpose, defaults, preconditions, verification and reversal — enough to call it correctly. Minor gaps (batch limits of 500 vias / 200 tracks, error behavior on an unknown net) are covered by schema constraints or left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 50% schema coverage, the description compensates where it matters most: width_mm, diameter_mm and drill_mm "default to the board's current track and via sizes," which is not inferable from the schema. wait_s and design_id are well documented in the schema itself, and the track/via shapes are described structurally.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Lay exact copper by hand ... tracks as polylines on one copper layer, and through vias" names a specific verb (lay copper) plus both resources (tracks, vias) and their shape. The phrase "where the routers leave a gap" cleanly separates it from route_board (automatic) and ripup_routing (removal), so an agent can pick it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage context (manual touch-up after the router) and names the follow-up and undo paths: run_drc afterwards, ripup_routing to remove copper. It stops short of an explicit exclusion such as "do not use for bulk routing — call route_board instead," so it is clear context rather than a full when/when-not rubric.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_custom_footprintAdd your own footprintAInspect
Give the design a footprint of your own: a KiCad .kicad_mod (the file's text) for a package KiCad's libraries lack. It joins the design's "custom" footprint library and is used as "custom:": pass that to create_custom_symbol (footprint=) or name it in the SKiDL script's footprint=; the board builder loads it like a library footprint and the KiCad project download carries it. The pads must be numbered like the pins. The CLI: koppar footprint <design> part.kicad_mod.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The footprint name (default: the name inside the file). | |
| design_id | Yes | The design id returned by create_design or list_designs. | |
| kicad_mod | Yes | The .kicad_mod file, as text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (not read-only, not destructive, closed-world); the description adds real behavioral context beyond them: the footprint joins the design's 'custom' library, is addressable as custom:<name>, is loaded by the board builder like a library footprint, and is carried into the KiCad project download. It does not cover overwrite/name-collision behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then downstream usage, then constraints, then the CLI equivalent. Dense but essentially waste-free; the embedded CLI line is the only element that could be seen as optional.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by explaining where the artifact lands and how it is referenced later. Only minor gaps remain around failure modes and whether re-adding a same-named footprint overwrites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning: the resulting name maps to the 'custom:<name>' handle used downstream, and the kicad_mod content must have pads numbered like the pins — a constraint not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (add a KiCad .kicad_mod footprint to the design) and scopes it to 'a package KiCad's libraries lack', which implicitly separates it from search_kicad_footprint and get_kicad_symbol. An agent can tell exactly what artifact this produces and how it is identified (custom:<name>).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: use it when KiCad's libraries lack the package, and then consume the result via create_custom_symbol(footprint=) or the SKiDL script's footprint=. It does not explicitly tell the agent to try search_kicad_footprint first, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_project_filesAdd files to the projectAInspect
Unpack a ZIP into the project folder, keeping its paths: new footprints into a .pretty library the fp-lib-table names, 3D models, a library table. Existing files are kept unless overwrite is true; the reply lists written, replaced and kept files. Base64, up to about 18 MB zipped.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| overwrite | No | ||
| zip_base64 | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint=false, openWorldHint=false and destructiveHint=false, the description adds genuinely useful behavior: existing files are kept unless overwrite is true, the reply itemizes written/replaced/kept files, input is base64 and capped near 18 MB zipped. That overwrite path replaces existing files, which is worth stating given destructiveHint=false, but the description discloses it rather than contradicting the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence pair, front-loaded with the action and followed by semantics. It is packed but every clause carries information; no filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers the write semantics, the opt-in overwrite path, the response contents (written/replaced/kept), and the input size/encoding constraints. Only the absence of tie-ins to related import tools leaves a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (just design_id documented), but the description compensates for both undocumented parameters: it explains what overwrite=true does and clarifies the zip_base64 encoding and the ~18 MB zipped ceiling that corresponds to the 24,000,000-char base64 maxLength. That is real added meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Unpack a ZIP into the project folder, keeping its paths,' and enumerates what the ZIP may contain (footprints into a .pretty library, 3D models, a library table). An agent can tell this is a file-import operation on an existing project, though it never explicitly contrasts itself with siblings like import_kicad_project or add_custom_footprint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the content it handles ('new footprints into a .pretty library the fp-lib-table names, 3D models, a library table'), which suggests adding KiCad assets to an existing design. There is no explicit when-to-use statement, no prerequisites, and no named alternative such as import_kicad_project or add_custom_footprint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
anneal_placeAnneal a dense placementAInspect
Dense placement by simulated annealing: wirelength inside the outline with courtyard gaps, edge connectors held on their edge, fixed and locked parts held, keepout rectangles kept clear (routing corridors), and a per-pad price for the bottom side (flip_cost, mm of wirelength; each bottom-side pad whose net has top-side pins costs a via). Starts from the current positions unless from_scratch. Slower than auto_place (a minute per 600k iterations) and much denser. Check overlapping_pairs and run_drc afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| t0 | No | Start temperature (default 15). ~0.5 keeps the current placement and only tidies it (refine, or squeeze into a smaller outline). | |
| edge | No | Connector ref to the edge it sits on, optionally @mm: where along that edge its centre goes, from the outline's top-left corner (x on top/bottom, y on left/right) — the same meaning as in auto_place and a board plan. A fixed or locked ref keeps its pin. | |
| halo | No | Routing room per ref, mm (a number all round, or footprint-local [left, top, right, bottom]). | |
| near | No | Keep ref at its anchor (a decoupling capacitor at its IC, a crystal at its MCU): the board plan's near constraint, as a strong pull in the anneal. | |
| refs | No | The footprints that may move (default: every unlocked one). | |
| seed | No | ||
| fixed | No | Parts held at these origin positions; they are moved there on the board first. | |
| shove | No | Legaliser: a part may take a spot held only by movable parts under this fraction of its area (default 0.3, 0 off). | |
| gap_mm | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| grid_mm | No | Placement grid for free parts (0.254 = 10 mil, the designer habit); default off. | |
| keepouts | No | Rectangles no part may cover, e.g. a bus corridor. | |
| bottom_ok | No | Footprint-id substrings allowed on the bottom side (e.g. "0402"). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| flip_cost | No | ||
| rotations | No | ||
| bottom_any | No | Any SMD-only part may go to the back (priced by flip_cost); LEDs, switches, displays and test points stay on top unless bottom_exclude says otherwise. | |
| ic_halo_mm | No | Room kept around ICs with 48+ pads (default 1.5). | |
| iterations | No | ||
| net_weight | No | ||
| refit_from | No | Outline the current placement was drawn in; it is scaled affinely into the new outline before annealing (with t0 ~0.5: shrink a placement that closed). | |
| split_cost | No | Price (mm of wirelength) of an SMD net with pads on both sides, i.e. a via. | |
| from_scratch | No | ||
| hole_room_mm | No | Room kept around mounting holes on both sides for the screw head and standoff (default 1). | |
| bottom_exclude | No | Regex of refs or footprint ids that stay on top regardless. | |
| overlap_weight | No | Overlap price per mm2 at the end of the anneal (default 400; 4000 halves what a dense draw leaves). | |
| edge_overhang_mm | No | Per edge ref, how far its body sits past the edge: default 0.5 for a USB/barrel/jack connector (at most its 1.2 mm lip), 0 (flush) for anything else, which may not overhang. | |
| connector_room_mm | No | Room kept on the board side of every edge connector (default 2.5). | |
| connector_flank_mm | No | Room kept on the flanks of every edge connector (default 1.0). | |
| bottom_max_height_mm | No | Tallest part allowed on the back (3D-model height, default 1.0): the assembly box grows by the tallest back-side part. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare readOnlyHint=false and destructiveHint=false), the description discloses many behavioral details: it respects courtyard gaps, holds fixed/locked parts, keeps keepout rectangles clear, honors edge connector constraints, applies a per-pad price for bottom-side pads via flip_cost, starts from current positions unless from_scratch, runs at about a minute per 600k iterations, and recommends follow-up checks. This is rich context well beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and is appropriately sized for a complex placement operation. The sentences carry useful information, though the first sentence is long and dense; every part still earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a tool with 30 parameters, no output schema, and only basic safety annotations, the description provides sufficient high-level context: what it optimizes, what constraints are honored, how it starts, and what to do afterwards. It does not cover job-status semantics (covered by the wait_s schema description) or every parameter, but it is broadly complete for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 77%, which is high enough that the schema itself documents most parameters. The description adds some meaning for a few parameters (e.g., flip_cost as 'mm of wirelength', edge connectors held on their edge, fixed/locked parts held, keepouts kept clear), but it does not explain the majority of the 30 parameters. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Dense placement by simulated annealing'. It also distinguishes the tool from its sibling auto_place by noting it is 'slower than auto_place ... and much denser', so an agent can tell when this tool is the right choice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for use: it is slower but much denser than auto_place, starts from current positions unless from_scratch, and advises to 'Check overlapping_pairs and run_drc afterwards'. It does not explicitly state when to avoid this tool or provide a full decision tree, but the alternative and trade-off are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auto_placeAuto-place footprintsAInspect
Pack footprints inside the board outline with Koppar's heuristic placer (ratsnest-driven, courtyard-legal). By default every unlocked footprint moves and locked ones stay; refs names exactly which move (all others stay). Constraints: fixed (exact origin positions and rotation, never moved; locked footprints likewise), side, keepouts (rectangles), groups, near (ref within maxMm of an anchor), edge (ref to "left|right|top|bottom", optionally "@mm" along that edge from the outline's top-left corner). Nothing is left past the outline except a USB/barrel/jack opening's 1.2 mm lip; placement_notes lists every part that could not be placed where asked. Coarse by design: refine the result with place_footprints.
| Name | Required | Description | Default |
|---|---|---|---|
| edge | No | Ref to the edge it sits on, optionally @mm: where along that edge its centre goes, from the outline's top-left corner (x on top/bottom, y on left/right). | |
| near | No | ||
| refs | No | The footprints that may move. | |
| side | No | ||
| fixed | No | ||
| shove | No | Legaliser: a part may take a spot held only by movable parts under this fraction of its area (default 0.3, 0 off). | |
| groups | No | ||
| placer | No | "ml": the learned placer service (dense, two-sided when two_sided, honours keepouts); the packer when it is unavailable. | |
| refine | No | "anneal": refine the placement by simulated annealing from this seed (wirelength-driven, same edge/fixed/keepouts, holes held) — the ML placer's structure with the annealer's tightness. | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| grid_mm | No | Placement grid for the refine step (0.254 = 10 mil); default off. | |
| keepouts | No | ||
| bottom_ok | No | Refine: footprint-id substrings allowed on the back instead of bottom_any. | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| flip_cost | No | Annealing price per bottom-side pad whose net has top pins (default 3). | |
| two_sided | No | Small two-pad passives go to the back side. | |
| bottom_any | No | Refine: any SMD-only part may go to the back, priced by flip_cost (default with two_sided); LEDs, switches, displays and test points stay on top. | |
| ic_halo_mm | No | Refine: room kept around ICs with 48+ pads (default 1.5; 16+ pads and fine pitch get two thirds). | |
| iterations | No | Annealing iterations for refine (default 600000). | |
| split_cost | No | Refine: price (mm of wirelength) of an SMD net with pads on both sides, i.e. a via. | |
| hole_room_mm | No | Refine: room kept around mounting holes, both sides (default 1). | |
| bottom_exclude | No | Refine: regex of refs or footprint ids that stay on top. | |
| overlap_weight | No | Overlap price per mm2 at the end of the anneal (default 400; 4000 halves what a dense draw leaves). | |
| connector_room_mm | No | Refine: room kept on the board side of every edge connector (default 2.5). | |
| connector_flank_mm | No | Refine: room kept on the flanks of every edge connector (default 1.0); sets the pitch of connectors sharing an edge. | |
| bottom_max_height_mm | No | Refine: tallest part allowed on the back (3D-model height, default 1.0). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive, closed-world mutation, and the description adds real value on outcomes: nothing is left outside the outline except a 1.2 mm connector lip, and placement_notes reports every part that could not be placed as asked. It still does not disclose job/async behavior or what a placement actually changes, so it stops short of rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and engine, then a compact parenthetical constraint roll-up and the coarse-then-refine hand-off. Dense for 26 parameters but every clause is load-bearing; the nested edge/keepout parenthetical is slightly hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 26-parameter placer with no output schema, the description covers what the tool changes, what constraints bind it, and what it returns (placement_notes, the 1.2 mm lip exception). Gaps remain around placer vs refine selection and async job return behavior, which only the schema hints at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 81%, so the baseline is 3; the description earns above that by pinning semantics for the constraint families — fixed (exact origin and rotation, never moved), locked footprints, side, keepout rectangles, groups, near-with-maxMm, and edge syntax with optional '@mm' measured from the outline's top-left. It does not touch the refine-specific weights, which the schema covers anyway.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('pack footprints inside the board outline') and names the engine ('Koppar's heuristic placer, ratsnest-driven, courtyard-legal'). It explicitly positions itself as the coarse pass whose output should be refined with place_footprints, which distinguishes it from place_footprints and anneal_place.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the default selection behavior (all unlocked move, locked stay) and when refs overrides it, plus the 'coarse by design: refine with place_footprints' routing. It never explicitly excludes anneal_place or place_footprints from the initial-placement role, so the sibling boundary is only half-drawn.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bridge_islandsJoin pour islandsADestructiveInspect
A filled pour cut into islands by routing: one through-via per island that KiCad finds cut off from its net, placed well inside the island and inside the net's main copper on another layer, clear of every other net between. Reports the islands it found no site for. Run run_drc afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| nets | No | Net names; * and ? wildcards, e.g. ["USB_D*", "+3V3"]. | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| max_vias | No | ||
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=false, so the mutation profile is known; the description adds real value beyond that by disclosing the placement rules (well inside the island, inside the net's main copper on another layer, clear of every other net) and the partial-failure behavior ('Reports the islands it found no site for'). It does not mention that the work runs as a job, though the wait_s schema entry covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the operation and followed by failure reporting and the next step; nothing is padding. The long appositive listing placement constraints is dense but each clause carries operationally relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive copper-modifying tool with no output schema, the description covers what is created and what is reported on failure, but leaves max_vias unexplained and does not state prerequisites (routing/fill must exist) or how net scoping affects the operation. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 75% schema description coverage, the schema documents nets, wait_s and design_id, so a baseline of 3 applies. The description adds no parameter-level detail, and max_vias is undocumented in both schema and description ('one through-via per island' only loosely hints at a cap).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete action and object: adding one through-via per island that KiCad finds cut off from its net. It is clearly distinguishable from siblings such as tie_rail_pads or polish_vias, though the opening clause ('A filled pour cut into islands by routing') is a strained sentence fragment that takes a second read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied ('a filled pour cut into islands by routing') and a post-step is prescribed ('Run run_drc afterwards'), but no sibling alternative is named and there is no explicit when-not guidance (e.g. versus fill_zones, repair_board, or diagnose_open_nets for open nets).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_net_rulesCheck net classes and pairsAInspect
Check the copper against the project's net classes and differential pairs, which KiCad's DRC does not: every class or pair net's narrowest track and the length below its class width, and every pair (X_P/X_N, X+/X-, CAN X_H/X_L) with its coupled share at the class's diff_pair_gap, both lengths and the skew. Routing applies the same rules.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the substantive behavior — what counts as a violation, the diff_pair_gap coupling criterion, the X_P/X_N, X+/X-, CAN X_H/X_L name patterns — which is real value beyond the annotations. However it is silent on side effects and statefulness, and annotations declare readOnlyHint=false, so an agent cannot tell whether a 'check' persists results or touches the board; that gap is not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the key differentiator (DRC doesn't check this) is front-loaded. The single long sentence is dense but every clause enumerates a distinct measured quantity that the agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description never says what comes back — a pass/fail list, per-net violation records, or a job handle beyond the wait_s case. It is strong on what is measured but leaves the result shape and any threshold/units to inference, which matters for a tool whose entire value is the report it produces.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so design_id, the pattern constraint, and the wait_s/running-job follow-up with get_board_job are already fully documented in the schema. The description adds nothing about either parameter, so baseline 3 applies; 'the project's net classes' only loosely corroborates that design_id selects a design.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb plus resource: checks copper against the project's net classes and differential pairs. It explicitly names the boundary against run_drc ('which KiCad's DRC does not') and enumerates the exact quantities measured (narrowest track, length below class width, coupled share at diff_pair_gap, skew), so an agent can distinguish it from run_drc and check_physics without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'which KiCad's DRC does not' gives an implicit routing rule to this tool for class/diff-pair conformance, and 'Routing applies the same rules' implies it belongs after routing. But there is no explicit when-to-use, no statement of preconditions (routing finished? rules set via set_design_rules first?), and no mention of the sibling tools that fix these violations (widen_nets, couple_pairs, tidy_copper).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_physicsCheck the physicsAInspect
Judge the copper by physics, which KiCad's DRC does not: impedance from the stackup on controlled nets, IR drop and heating on rails with a stated current, pair and lane skew, a ground via beside every high-speed layer change, 3W spacing between high-speed runs, and the via path under exposed paddles. Each check runs only when the board states something it can judge. With repair, the fixable findings are fixed in place (track width, skew meanders, return vias, widened rails), each kept only if KiCad counts nothing worse. finish_board runs the same repairs.
| Name | Required | Description | Default |
|---|---|---|---|
| repair | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnly=false and destructive=false, and the description adds meaningful behavior: with repair, fixes are applied in place and each is kept only if KiCad counts nothing worse — a rollback/guard semantic the annotations cannot express. It omits the return/report format and whether the board must be routed/complete first.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, and every clause carries substance (checks, conditional execution, repair behavior). It is dense and somewhat run-on as one long sentence plus a repair paragraph, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param check tool with no output schema, the description covers what is checked, when checks fire, and repair semantics. The main gap is the shape of the returned findings/report, though job-follow behavior is already documented in the wait_s schema field.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with wait_s and design_id documented in-schema; the undocumented repair flag is the one the description explains best, detailing exactly what gets fixed (track width, skew meanders, return vias, widened rails) and the acceptance condition. It adds real meaning beyond the schema for the one gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Judge the copper by physics') and then enumerates the exact checks performed: impedance from stackup, IR drop/heating, skew, ground-via at layer changes, 3W spacing, via path under paddles. It also positions itself against siblings by naming what KiCad's DRC does not catch and noting finish_board runs the same repairs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the selection condition 'each check runs only when the board states something it can judge' and clarifies the repair branch versus finish_board, which runs the same repairs. It implies run_drc handles standard DRC but does not state an explicit when-not-to-use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
choose_bom_partChoose a BOM offerAInspect
Pick which offer a BOM line uses: the line's references and a seller part number or MPN from its offer or alternatives in get_bom; null goes back to the automatic pick. Sourcing only: a different component is a circuit change.
| Name | Required | Description | Default |
|---|---|---|---|
| part | Yes | Seller part number or MPN from get_bom, or null. | |
| refs | Yes | References of the line, e.g. ["C1","C2"]. | |
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, open-world operation. Beyond them, the description discloses the key behavior that null reverts the line to the automatic pick and that the change is confined to sourcing, which is real context the annotations don't convey. It doesn't detail validation or error behavior, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the action and scope, with no wasted words. The null-revert and sourcing-only boundary are packed into the same compact block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with full schema coverage, annotations, and no output schema, the description supplies the missing behavioral context (null semantics, sourcing scope) needed to call it correctly. Only minor gaps (validation/error outcomes) remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: it identifies `refs` as the line's references and explains that `part` must come from the offer or alternatives shown in get_bom, plus the null-revert semantics. This provenance guidance goes beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Pick which offer a BOM line uses") and immediately scopes the input to references plus a seller part number or MPN. It distinguishes itself from siblings by naming get_bom as the option source and framing component changes as a different operation. An agent can tell it apart from get_bom and edit_circuit without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use (choosing an offer for a BOM line), an alternative behavior (null returns to the automatic pick), and an exclusion ("Sourcing only: a different component is a circuit change"). It stops short of naming the specific sibling tool to use for a component change, but the boundary is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cleanup_boardClean up tracks and viasADestructiveInspect
Sweep the routing: zero-length and duplicate tracks, stub tracks (a free end, and everything the track touches stays joined without it), and vias that meet their net on fewer than two layers. Contact is copper overlap, as KiCad judges it. Refills the zones first so pours count as connections. Locked items stay. The board is put back if the unconnected count or the DRC errors rise. A track running on past its last junction is cut back to it (trim_overhangs). list_removed names every item that went.
| Name | Required | Description | Default |
|---|---|---|---|
| refill | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| list_removed | No | ||
| trim_overhangs | No | ||
| dangling_tracks | No | ||
| duplicate_tracks | No | ||
| unconnected_vias | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint=true annotation: it discloses that zones are refilled first so pours count as connections, that locked items are preserved, that the board is rolled back if the unconnected count or DRC errors rise, and how overhangs are trimmed. The definition of 'contact' (copper overlap as KiCad judges it) is exactly the kind of domain-specific behavioral detail an agent cannot infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the removal targets, then the safety and reporting behavior, with no filler sentences. Some parentheticals ('a free end, and everything the track touches stays joined without it') are dense but carry real meaning; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 8-parameter mutation with no output schema and no annotations beyond safety hints, the description covers the critical gaps: what gets deleted, what is exempt (locked items), rollback conditions, and what list_removed reports. Only minor items are unaddressed, such as the default state of the category flags and the long-running job follow-up (partly handled by the wait_s schema text).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25%, so the description must compensate, and it largely does: it ties the three category booleans to their targets (duplicates, dangling/stub tracks, under-connected vias) and explains trim_overhangs, list_removed, and the implicit refill flag. It does not state that these are independent on/off selectors or their defaults, leaving some semantics to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (sweep the routing) and enumerates exactly which items are removed: zero-length/duplicate tracks, stub tracks, and vias touching their net on fewer than two layers. This is precise enough to distinguish it from pruning/polishing tools, though no sibling is named to make the contrast explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no named alternative, even though the sibling list contains obvious near-neighbors (prune_vias, polish_vias, tidy_copper, repair_board, ripup_routing). The text describes what the sweep does and how it behaves, not the conditions under which an agent should pick it over those tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consolidate_bom_basicConsolidate the BOM to JLCPCB basic partsAInspect
Move every resistor, capacitor and inductor bought outside JLCPCB's basic library onto an in-stock basic-library part of the same value, package and (capacitors) at least the same voltage rating. Each part outside that library adds a loading fee to a JLCPCB order, usually more than the part. Each swap becomes the line's choice (choose_bom_part with null undoes it); lines with no readable value, no SMD size or no basic part are reported and left alone.
| Name | Required | Description | Default |
|---|---|---|---|
| boards | No | Boards the stock must cover (default 1). | |
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark it as a non-read-only, non-destructive mutation; the description usefully adds that each swap is persisted as the line's choice, that it is individually reversible via choose_bom_part with null, and that unmatchable lines are reported and left untouched rather than erroring. That failure and reversibility behavior is exactly the context annotations cannot express, though auth/permission needs are unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and matching criteria, followed by motivation and edge-case handling. Dense but every sentence carries information; parenthetical asides are compact rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers matching rules, the fee rationale, reversibility, and unmatchable-line behavior, which is most of what an agent needs before calling it. Missing only expected result shape (e.g., count of swaps) which the absent output schema would otherwise carry.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters (design_id, boards) are already documented in the schema, including the boards default and design_id format. The description's value-add is matching logic (same value, package, at least equal voltage for capacitors) rather than parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a precise verb (move/consolidate), the exact resource (resistors, capacitors and inductors), and the target library (JLCPCB basic). It is unmistakably distinct from siblings like choose_bom_part or get_bom, which handle individual selection or retrieval rather than bulk library substitution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear rationale for when to use it (every off-library part adds a loading fee exceeding the part cost) and describes the scope limit (only R/C/L passives with readable value, SMD size and a basic equivalent). It also names the undo path (choose_bom_part with null). It stops short of an explicit 'do not use this if...' statement, so it's strong rather than exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
couple_pairsCouple differential pairsADestructiveInspect
After route_board: re-route the weakly coupled differential pairs one at a time, least coupled first. Both legs are ripped and routed alone around everything else as a pair; the new copper stays only when the pair's coupled share rises by min_gain_pct, its skew stays within max_skew_mm, KiCad counts no new open item or DRC error, and the board gains at most max_extra_vias vias. Pairs routed with the whole board lose their lanes; alone they couple. Run check_net_rules before and after.
| Name | Required | Description | Default |
|---|---|---|---|
| pairs | No | Only pairs with a leg matching these (default every pair under target_pct). | |
| tries | No | Router seeds per pair; the best acceptable one is kept (default 2). | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| ml_options | No | ||
| target_pct | No | Pairs coupled below this are tried (default 70). | |
| max_skew_mm | No | Largest length mismatch kept (default: the pair's current skew, at least 1 mm). | |
| min_gain_pct | No | Coupling points a reroute must gain to be kept (default 10). | |
| time_budget_s | No | Router budget per try (default 90). | |
| bridge_islands | No | ||
| max_extra_vias | No | Vias a kept reroute may add to the board (default 2). | |
| total_budget_s | No | Stop starting pairs after this (default 1800). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond destructiveHint=true by disclosing the exact mutation ('both legs are ripped and routed alone') and the full acceptance gate that decides whether the new copper is kept: coupling gain, skew limit, no new opens/DRC errors, and a via budget. That tells the agent both what can be destroyed and when the board is left untouched.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger and the ordering rule, then the acceptance criteria, then the sanity-check step. Dense but almost every clause carries information; the aphorism 'Pairs routed with the whole board lose their lanes; alone they couple' is evocative rather than precise and is the one soft spot.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter destructive routing operation with no output schema, the description covers trigger, mutation, keep/discard criteria, and follow-up verification, and wait_s in the schema routes the agent to get_board_job for long jobs. Minor gaps remain: bridge_islands and ml_options are unexplained and nothing says what the board looks like when no pair passes the gate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, so the baseline is 3, and the prose adds real meaning for the gate parameters (min_gain_pct as coupling points, max_skew_mm as kept length mismatch, max_extra_vias as board-level via budget). However, bridge_islands and ml_options are undocumented in both schema and description, and tries/time_budget_s/total_budget_s get no prose treatment.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (re-route), resource (weakly coupled differential pairs), ordering rule (least coupled first) and prerequisite (after route_board). An agent can distinguish this from route_board and ripup_routing without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing: 'After route_board' and 'Run check_net_rules before and after.' It also explains why this tool exists versus routing everything at once ('Pairs routed with the whole board lose their lanes; alone they couple') and scopes the work to pairs under target_pct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_custom_symbolRegister a custom symbolAInspect
Register a connectable schematic symbol for a part that is NOT in KiCad's libraries (search_kicad_symbol returned nothing). Use this for specialty ICs — LED-matrix drivers, niche sensors, etc. — INSTEAD of telling the synthesizer to model the part with discrete passives (which leaves every pin dangling and breaks the board). Provide the full datasheet pinout. The part then becomes available to the synthesizer as Part('custom', '') with the exact pin names you supply here, and is added to the Verified parts table. A part with three or more pins needs footprint= naming a real, in-library footprint for its package (search_kicad_footprint with the family and pin count, e.g. 'LGA-14'); the call is rejected without one, since a generated grid of pads cannot be assembled. List every pad of the footprint, NC pins included. When the package is not in KiCad's libraries, bring your own footprint instead: footprint_mod takes the whole .kicad_mod file as text (KiCad 6+, up to 1 MB; the CLI reads it with koppar custom-symbol --footprint-file). It is checked as a KiCad footprint, every pad must have a pin with that pad's number (and every pin a pad), and it is stored as 'custom:': the symbol uses it, and it goes on the board, into project.zip and into the fp-lib-table. footprint is then not needed. The name is used for file names: letters, digits and _ . + - (anything else becomes _). The symbol belongs to design_id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Part number, used as the symbol name (letters, digits, _ . + -). | |
| pins | Yes | Every pin from the datasheet. | |
| datasheet | No | ||
| design_id | Yes | The design id returned by create_design or list_designs. | |
| footprint | No | A 'Library:Footprint' from search_kicad_footprint. Required for 3+ pins unless footprint_mod is given. | |
| reference | No | Reference prefix, e.g. 'U'. | |
| description | No | ||
| footprint_mod | No | Your own footprint: the full text of a .kicad_mod file, starting with '(footprint'. Its pad numbers must match the pin numbers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnlyHint=false, non-destructive, closed-world). The description adds substantial behavioral context: the part is registered as Part('custom','<name>'), added to the Verified parts table, the call is rejected without a footprint for 3+ pins, footprint_mod is validated as a KiCad footprint and stored as 'custom:<name>', and it propagates into project.zip and the fp-lib-table.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the routing condition and the destructive alternative, which is the most decision-relevant content. It is dense and long, but nearly every sentence carries non-obvious constraint information. Minor tightening possible around the footprint_mod storage/pipeline details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, non-read-only tool with no output schema, the description supplies the pin-to-pad relationship rule, the validation/rejection behavior, and the downstream effects. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the description meaningfully supplements it: it explains the footprint requirement for 3+ pins, the footprint_mod vs footprint relationship ('footprint is then not needed'), the name sanitization to letters/digits/_ . + -, and the instruction to list every pad including NC pins. It does not cover datasheet, description, or reference, but these are self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Register) and resource (connectable schematic symbol) plus an explicit scope constraint: parts NOT in KiCad's libraries. It clearly distinguishes itself from the sibling search_kicad_symbol / get_kicad_symbol tools by naming the failure condition that routes an agent here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (specialty ICs, when search_kicad_symbol returned nothing) and what NOT to do instead (telling the synthesizer to model the part with discrete passives, which 'breaks the board'). It also names the alternative path (footprint_mod vs footprint) with the condition that selects each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_designCreate a designAInspect
Start a new design from the user's brief (what the board must do, its interfaces, power, size and constraints). Returns the design_id every other tool takes and the web_url where the user follows the design. Uses no generation quota: the work is done by you.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | Yes | The design brief, in the user's terms plus anything you clarified with them. | |
| title | No | A short name for the design. | |
| session_id | No | The project (web session) to put this design in: the session_id an earlier design of this board returned. Without it, a design whose title matches a project you opened before joins that project. | |
| new_project | No | Start a new project even when one with this title exists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, closed-world. The description adds genuinely new behavioral facts: no generation quota is consumed and the generation work is performed by the calling agent, plus downstream effects (design_id consumed by every other tool, web_url for the user). It stops short of describing failure modes or project-collision behavior, which live only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences; the action and its inputs come first, then the return values, then the quota note. No sentence is filler, and the quota remark earns its place by changing how the agent plans its work.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description covers that gap by naming both return values (design_id, web_url). With four params and 100% schema coverage, the only unaddressed area is project/session behavior, which the schema itself documents adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description earns above that by expanding what belongs in 'brief' (interfaces, power, size, constraints) beyond the schema's terser 'user's terms plus anything you clarified', giving the agent concrete content guidance for the critical required parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start a new design from the user's brief') and enumerates the brief's required dimensions, plus what it returns. It does not differentiate itself from the similarly-named sibling start_board, which is the main ambiguity an agent could hit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'from the user's brief' and 'the work is done by you' imply this is the entry point the agent drives itself, but there is no explicit when-to-use / when-not-to-use statement and no named alternative (e.g., restore_design for existing work or start_board). The guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_designDelete a designADestructiveInspect
Move a design (or a board workspace) to the trash: it leaves list_designs and the web app, and restore_design brings it back. permanent deletes it with no trash to restore from. Refused while a run on it is in progress. The CLI: koppar delete <design>.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | The design id returned by create_design or list_designs. | |
| permanent | No | Remove it now, with no trash to restore from (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds substance they do not carry: this is a reversible trash operation, it disappears from list_designs and the web app, and it is rejected mid-run. It also contrasts the irreversible permanent variant, which is exactly the risk context an agent needs before deleting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The destructive-versus-reversible distinction is front-loaded and each sentence adds information. The closing CLI mapping is tangential to an MCP invocation, but it is a single short line and does not obscure the core behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with full schema coverage and no output schema, nothing material is missing: effect, reversibility, blocker, and recovery alternative are all covered. An agent can invoke it safely on the strength of the description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented there, so the schema already does most of the work. The only added meaning is that the target may be a board workspace as well as a design, which slightly widens the interpretation of design_id beyond the schema's 'returned by create_design or list_designs'. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first clause gives a specific verb and resource ('Move a design (or a board workspace) to the trash') and immediately scopes the effect ('it leaves list_designs and the web app'). It is clearly separable from restore_design and from a permanent removal, so an agent can choose it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use it (default soft delete), how to get the other behavior (permanent), the recovery path (restore_design), and the one blocking condition ('Refused while a run on it is in progress'). That is explicit when/when-not guidance plus named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnose_open_netsWhy nets do not routeARead-onlyInspect
For every net still open (or the nets named): each pad with the escape corridors free on its own layer, whether a via can be dropped beside it at all, and what blocks it (which part's pads, which net's tracks or vias, the board edge). A pad with no free corridor and no via site is CRAMPED — no router can reach it; the advice names the parts to move. Otherwise the advice says which nets to rip and route first. Use it instead of repeating repair_board on a net that keeps failing.
| Name | Required | Description | Default |
|---|---|---|---|
| nets | No | Only these nets (default: every open net). | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| max_nets | No | ||
| reach_mm | No | How far a corridor must stay free (default 1.5). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real value by disclosing the diagnostic model: corridor checks per layer, via-site feasibility, named blockers, CRAMPED detection with 'no router can reach it', and rip-and-retry advice. It does not mention that long runs return a 'running' job status, though the wait_s schema param covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense but purposeful sentences; the scope condition is front-loaded and the sibling routing rule comes last. Slightly run-on phrasing around the parenthetical blocker list costs it a point, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry the return contract itself, and it does: per-pad corridors, via-site verdicts, responsible blockers, CRAMPED classification, and actionable advice. The only gap is the async job lifecycle, which is handled by the wait_s parameter documentation rather than the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so most parameters are already documented, giving a baseline of 3. The description repeats rather than extends what the schema says about nets and reach, adding no format or interaction detail (for example how max_nets interacts with nets, or how reach_mm changes CRAMPED verdicts).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: per open net, report each pad's free escape corridors, whether a via can be dropped, and what blocks it. It also names concrete verdicts (CRAMPED) and the advice it returns, so the agent knows exactly what it gets back without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the sibling alternative explicitly (repair_board) and the condition that selects this tool: a net that keeps failing. That is a clear when-to-use rule tied to a real tool in the sibling list, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_circuitPatch the schematicAInspect
Apply SEARCH/REPLACE patches to your latest script and re-run every check, as submit_circuit does. The latest script is your last submission when it was sent back (attempt_N_circuit.py), otherwise the design's circuit.py. Each search must match the current file exactly once (whitespace-sensitive); an empty replace deletes. Nothing is applied if any block fails to match.
| Name | Required | Description | Default |
|---|---|---|---|
| edits | Yes | Ordered patches. | |
| design_id | Yes | The design id returned by create_design or list_designs. | |
| check_sourcing | No | Check the parts against supplier catalogues (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=true). It discloses atomicity ('Nothing is applied if any block fails to match'), the exactly-once whitespace-sensitive match rule, delete semantics via empty replace, and that every check is re-run. These are non-obvious behavioral traits an agent must know before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences, front-loaded with the action, then target resolution, then the critical match/atomicity rules. No filler; every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers action, target file resolution, atomicity, match semantics, and check re-running. It omits failure/response details, but annotations and the atomicity statement cover the essentials.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: each search must match exactly once, matching is whitespace-sensitive, and an empty replace deletes. This meaningfully enriches the 'edits' array semantics beyond the schema's terse 'Ordered patches'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Apply SEARCH/REPLACE patches to your latest script and re-run every check.' It also distinguishes itself from the sibling submit_circuit by describing the relationship ('as submit_circuit does'), so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clarifies which file is targeted ('your last submission when it was sent back (attempt_N_circuit.py), otherwise the design's circuit.py') and frames the tool as the alternative to submit_circuit for incremental editing. No explicit when-not condition is stated, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_stepExport STEPARead-onlyInspect
Export the assembled board as STEP (3D models, DNP parts left out). Download it as workspace.step; workspace.zip includes it.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful scope detail (DNP parts excluded, artifact naming), but omits the asynchronous job behavior (a still-running job returns status 'running' and requires get_board_job follow-up), which is a key trait only found in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the main action front-loaded and the artifact details immediately following. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description names the output artifacts and exclusion rules, which suffices. The async nature is documented in the schema, so the remaining gap is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both design_id and wait_s fully documented including the async follow-up semantics. The description adds nothing beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Export the assembled board as STEP') and clarifies what is included (3D models, DNP parts left out). It also names the resulting artifacts (workspace.step, workspace.zip), so an agent can distinguish this from render_board or get_downloads, though it does not explicitly contrast them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the export/download framing, but there is no explicit when-to-use guidance, no conditions, and no mention of alternatives such as get_downloads for retrieving artifacts. The agent must infer the context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fill_zonesFill zonesBInspect
Refill every copper zone with KiCad's zone filler.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it is a non-read-only, non-destructive, closed-world operation, matching "refill". The description adds the useful scope detail that ALL zones are refilled (no subset targeting), but says nothing about it being a potentially long-running job that may return status "running" and must be polled — that behavior lives only in the wait_s schema text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with zero filler; the verb and scope appear immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, possibly async job with no output schema, the description covers only what. Workflow placement and the need to follow up with get_board_job on a "running" result are left to the parameter schema, which is thin compensation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so design_id and wait_s (including the running/polling semantics and the 55s cap) are fully documented in the schema. The description adds nothing on either parameter, which is acceptable at this coverage level but not value-adding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Refill") and resource ("every copper zone"), plus the underlying engine (KiCad's zone filler), so the agent knows exactly what happens. It doesn't name the sibling boundary (e.g. set_zones defines zones, this recomputes fill), but the operation itself is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to run it — not after routing, not after moving footprints, not after set_zones/set_keepouts changes — and no mention of alternatives or prerequisites. The agent must infer the workflow position from the sibling list alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finish_boardFinish the open netsAInspect
Close what the router left open the way a designer does: for each open net the diagnosis names the copper boxing it in; that copper is ripped (never a poured net), the open nets are routed FIRST into the space, then the ripped nets go back around them; up to rounds rounds, each kept only if KiCad counts fewer unconnected items. Use it after route_board leaves a handful of nets open (route_board's default pipeline already runs three rounds; this adds more, or follows a single route); repair_board never moves the blockers.
| Name | Required | Description | Default |
|---|---|---|---|
| rounds | No | Rip-and-reroute rounds (default 3). | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| reach_mm | No | Radius cleared of tracks and vias around a pad with no way out (default 1.5). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| class_vias | No | Route with the Default class's via instead of the board's smallest legal one. | |
| ml_options | No | ||
| vias_in_pads | No | 'allow': vias may sit in pin pads (the board must be ordered with filled and capped vias). | |
| time_budget_s | No | Router budget per routing call (default 120). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the mutation model: blocking copper is ripped (never a poured net), open nets are routed first, then ripped nets are rerouted around them. It also explains the quality gate—each round is kept only if KiCad counts fewer unconnected items—which is key behavioral context for a routing mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action, constraints, and usage guidance are front-loaded and information-dense. The semicolon-heavy single sentence and phrases like 'the way a designer does' make it slightly denser than necessary, but there is little true filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex routing mutation with eight parameters and no output schema, the description covers the essential process, preconditions, alternatives, and iteration behavior. It leaves return/status handling mostly to the wait_s schema text and get_board_job, and does not explain ml_options, so it is strong but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 88%, so most parameter meaning is already supplied by the schema. The description adds useful semantics for `rounds`, including its relationship to route_board's default pipeline and the acceptance rule applied to each round, though it adds little for the remaining parameters such as wait_s, reach_mm, class_vias, vias_in_pads, or ml_options.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action—closing open nets left by routing—and explains the rip-and-reroute approach. It explicitly contrasts with repair_board, which never moves blockers, so an agent can distinguish it from route_board and related siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the exact triggering condition: use after route_board leaves a handful of nets open, noting route_board's default pipeline already runs three rounds. It also explains that this tool adds more rounds or follows a single route, and that repair_board is not the right alternative for moving blockers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_board_contextBoard planning contextBRead-onlyInspect
What the board plan is decided from: the computed minimum board, BOARD STATS (pad density, fine-pitch parts, fanout), the parts and nets, board instructions the user gave, and the plan schema with its rules. Needs an accepted schematic.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real context beyond that by disclosing the input prerequisite and the shape of the data returned, though it says nothing about whether the plan is recomputed, error behavior, or staleness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is two compact sentences with no filler; the returned-content list is front-loaded and the prerequisite is placed at the end. Slightly dense with parenthetical asides, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only getter with no output schema, the description does the necessary work of enumerating what the call returns (computed minimum board, pad density/fine-pitch/fanout stats, parts and nets, user instructions, plan schema rules) and states the precondition. An agent has enough to call it correctly, with only minor gaps around recomputation and failure modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (design_id) with 100% schema description coverage, so the schema already documents its format and provenance ('returned by create_design or list_designs'). The description adds no additional meaning about the parameter, which is the correct baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The definition frames itself as 'What the board plan is decided from' and enumerates the returned content (minimum board, board stats, parts/nets, instructions, plan schema), which conveys the resource. However, it never states a plain verb ('returns'/'retrieves') and gives no differentiation from adjacent-sounding siblings like get_board_info or board_census, leaving the agent to infer the exact role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one useful precondition, 'Needs an accepted schematic,' which implies the phase in which the tool is callable. It says nothing about when to prefer this over get_board_info, board_census, or get_workflow_guide, so selection among siblings must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_board_infoBoard infoBRead-onlyInspect
The board as it stands: copper layers, outline, design rules and net classes, counts (footprints, nets, tracks, vias, zones, keepouts, KiCad unconnected items), zones and keepouts, and every footprint with reference, value, footprint, position (origin, mm), rotation, side, locked, DNP, courtyard box and 3D models.
| Name | Required | Description | Default |
|---|---|---|---|
| refs | No | Only these footprints. | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| include_footprints | No | List footprints (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description contributes the return payload contract (what fields come back), which matters because there is no output schema, but it omits that a call can come back with status "running" and must be followed via get_board_job, and gives no sense of response size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single run-on sentence that is a field inventory rather than a front-loaded statement of purpose; every item arguably earns its place given no output schema, but the lack of lead verb and the list-heavy structure make it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema, the description rightly spells out the returned contents, which is the main completeness win. It still leaves gaps: no indication of cost/size of an all-footprints dump, no guidance to use refs/include_footprints to trim the response, and no mention of the asynchronous running-status path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so refs, wait_s, design_id and include_footprints are already documented, and the schema's wait_s text carries the job-polling semantics. The description adds nothing parameter-level, such as that refs narrows the footprint list or that the full unfiltered dump can be large; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The resource is unmistakable: a full read-out of board state (layers, outline, rules, net classes, counts, footprints). However, it never names a verb and gives no differentiation from closely related siblings like get_board_context, board_census, or get_board_status, so an agent cannot tell from the description alone which snapshot tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no named alternative. The reader must infer from the sibling list whether this is the right inspector or whether board_census / get_board_context is cheaper for a narrower question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_board_jobBoard jobARead-onlyInspect
The design's latest board job: its status and, once it ends, its result or error. wait_s holds the call until it ends.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered and the remaining burden is low. The description adds that a completed job yields a result or error and that the call blocks while waiting, but details like the 55s cap, restart survival, and budget behavior live only in the schema parameter text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences that front-load the resource and outcome, with no filler. The second sentence overlaps with the wait_s schema description, which is a minor duplication but not bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly carries the return semantics (status now, result or error once finished) and the blocking behavior. It could say more about job lifecycle states or what 'latest' means when multiple jobs exist, but the essentials for calling it correctly are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the design_id and wait_s semantics (default 55, maximum 55, restart and budget behavior) are already thoroughly documented in the schema. The description's 'wait_s holds the call until it ends' restates what the schema says without adding format, deadline, or retry nuance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it retrieves the design's latest board job, returning status and, on completion, result or error. That is clear enough to act on, but it offers no contrast with close siblings like get_board_status or get_board_info, leaving the agent to guess which status tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'wait_s holds the call until it ends' implies this is a blocking poll, and the schema param text explicitly says to follow a 'running' job with get_board_job again. However, the description itself never says when to prefer this over get_board_status, nor when long-polling is appropriate versus a quick check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_board_statusBoard statusARead-onlyInspect
The board run: stage, size, layers, placement, routing completion, open nets, DRC counts; once finished, DRC violations by type, whether the fab files are released and, when not, the diagnosed causes (first = fix first: parts that did not fit, collisions, missing footprints, open nets, thin power). wait_s holds the call until the run ends (or that many seconds pass).
| Name | Required | Description | Default |
|---|---|---|---|
| wait_s | No | Seconds to wait for a running board to finish (max 55). | |
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), so the bar is lower. The description adds genuinely useful behavior the annotations cannot express: wait_s blocks the call until the run ends or the timeout elapses, and the reported fields change depending on completion state (DRC-by-type, fab release, diagnosed causes appear only once finished, with a 'fix first' ordering). Return-format disclosure like this is the real value here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the returned-field inventory is front-loaded before the wait_s semantics. The first sentence is a dense comma list, which is slightly heavy, but every item is informative rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return-value burden, and it does so thoroughly: run state, metrics, DRC detail, release status, and failure causes with priority ordering. Combined with the explicit wait_s blocking rule, an agent has enough to call and interpret it. The only shortfall is the missing contrast with sibling status tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in the schema, so baseline is 3. The description only restates wait_s semantics ('holds the call until the run ends (or that many seconds pass)'), which is roughly what the schema already says ('Seconds to wait for a running board to finish (max 55)'), adding little new syntax or edge-case detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource — the board run — and enumerates exactly what is reported (stage, size, layers, placement, routing completion, open nets, DRC counts, fab release, diagnosed causes). That is well beyond a restatement of the name. It does not, however, distinguish itself from close siblings such as get_fab_status, get_board_job, or board_census, so the agent cannot tell from the text alone which status endpoint to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the wait_s sentence signals this is polled until a run completes, which is useful. There is no explicit when-to-use guidance, no statement of when to prefer this over get_fab_status/get_board_job, and no prerequisites or exclusions. Adequate but with a clear routing gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bomBill of materialsARead-onlyInspect
The live-priced BOM: each line with references, value, footprint, the chosen offer (seller, part number, MPN, price, stock, match quality), alternatives and totals. refresh asks the sellers again (tens of seconds).
| Name | Required | Description | Default |
|---|---|---|---|
| tier | No | JLCPCB PCBA tier to source for, kept with the design. 'economic' swaps Standard-only parts for Economic-eligible ones that match as well; default 'standard' (no filter). The BOM reports which parts decide the tier either way. | |
| boards | No | Boards to price for (default 1). | |
| refresh | No | Ask the sellers again instead of the stored prices. | |
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true. The description adds genuinely new context: refresh re-queries sellers and takes tens of seconds, which is a latency/cost disclosure the annotations cannot convey. It also describes the returned payload shape, useful since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: the first establishes what the BOM contains, the second front-loads the one caveat (refresh cost). It is dense but every clause contributes; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description appropriately carries the return-value burden by enumerating the line fields and totals. Combined with annotation coverage of the safety profile and a 100%-covered input schema, an agent has enough to call this correctly; only the absent when-to-use guidance leaves a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains tier, boards, refresh, and design_id in detail. The description reinforces the refresh semantics (sellers re-queried) but adds no syntax or constraint beyond what the schema provides. Baseline 3 is appropriate when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (a live-priced BOM) and enumerates its contents concretely: references, value, footprint, chosen offer fields, alternatives, totals. An agent understands exactly what is returned. It does not, however, contrast itself with nearby siblings like consolidate_bom_basic or choose_bom_part, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no statement of prerequisites beyond the design_id parameter, and no routing to alternatives such as choose_bom_part or consolidate_bom_basic. The only usage-flavored content is the refresh cost note, which describes behavior rather than selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_designDesign statusARead-onlyInspect
Where a design stands: the brief, the schematic (accepted or the last blocking error, ERC, part and net counts, submissions), the board run, the readable files, and the next step.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that by disclosing what the response contains, including edge states such as 'accepted or the last blocking error' and the presence of a next-step recommendation. It stops short of describing pagination or refresh/caching behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One densely packed sentence, front-loaded with the core purpose, then a scannable list of returned sections. Every clause maps to a real output area; nothing is wasted, though the fragmentary 'Where a design stands:' construction is slightly informal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-value burden, and it does so by enumerating the report sections an agent can expect. Combined with read-only annotations and a simple, fully documented single id parameter, an agent has what it needs to call the tool and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (design_id) and schema description coverage is 100%, with the schema itself explaining that the id comes from create_design or list_designs. The description adds nothing about the parameter, which is acceptable baseline behavior when the schema already carries the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete resource ('a design') and enumerates exactly what is reported (brief, schematic state, ERC, part/net counts, board run, readable files, next step), so an agent knows immediately this is a design status read. It does not, however, distinguish itself from nearby siblings such as get_board_status, get_board_context, or get_fab_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the content: you call it to see 'where a design stands' and the phrase 'the next step' hints it feeds a workflow decision. But there is no explicit when-to-use, no exclusions, and no named alternative among the many get_* status/info siblings, so the agent must infer routing on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_downloadsDownloadsARead-onlyInspect
Download URLs for the design (KiCad project, schematic, netlist, BOM CSV, board file, 3D model, Gerbers, order bundle) and which are available now. They take the same Authorization: Bearer API key; the CLI fetches them with koppar download <design> <artifact>.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive/non-openWorld, so the bar is lower; the description still adds real value by disclosing the Authorization: Bearer requirement, the CLI invocation (`koppar download <design> <artifact>`), and that only currently-available artifacts are returned. It doesn't say whether URLs expire or how availability is signaled, keeping it out of 5 territory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly-packed sentences with the artifact list and availability caveat front-loaded, followed by the auth/CLI detail. No filler sentences and no repetition of structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only single-parameter tool, the description covers what is returned (URLs plus availability) and the auth/CLI path, which is sufficient without an output schema. A note on URL lifetime or the response shape would push it to complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single fully-described design_id, so the schema carries the parameter meaning and baseline is 3. The description adds no extra semantics (e.g., how design_id relates to artifacts or the artifact selector for the CLI) beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (retrieve download URLs for a design) and enumerates the artifact types covered, which is more than a bare restatement of the name. However, it doesn't explicitly distinguish itself from overlapping siblings like get_bom or export_step, which also surface design artifacts, so the agent must infer the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (fetch links to artifacts) and it adds practical context about auth and the CLI equivalent, but there is no explicit when-to-use/when-not clause or routing to alternatives such as get_bom, export_step, or get_review_packet. The agent gets context but no decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fab_statusFab release statusARead-onlyInspect
Whether the board has earned its fab files (zero serious DRC errors, nothing unconnected), and if not, why not.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe read (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the description's added value is the disclosure of what it actually evaluates (serious DRC errors, unconnected items) and that it explains failures. That is genuine behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that answers the primary question first and appends the failure case. No filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return contract, and it does convey that the result is a boolean-like verdict plus reasons for failure. It stops short of describing the shape of those reasons or how this gates downstream fabrication/ordering steps, leaving a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, including its pattern and provenance from create_design or list_designs. The description adds nothing about design_id, so baseline 3 applies since the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (fab release status) and defines the criteria being evaluated: zero serious DRC errors and nothing unconnected. This clearly distinguishes it from pure checkers like run_drc or check_net_rules, though it does not name a sibling explicitly, which keeps it just below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'earned its fab files' framing implies the tool is a pre-fabrication gate check, so usage is inferable. However, it never states when to call it versus get_board_status, run_drc, or the upload/order tools, and gives no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_kicad_symbolGet a KiCad symbolARead-onlyInspect
Return the full pin list (number, name, electrical type) and description for a specific KiCad symbol. For some high-risk power parts it also returns curated topology_constraints from datasheet-style application notes and footprint_suggestions. Use this before writing pin connections (e.g. mcu['VCC'] += vcc) so names, constraints and footprints match the symbol exactly. For a part found in KiCad, the result is ALSO enriched with that part's topology + required external parts from a datasheet database (merged into topology_constraints). For a part NOT in KiCad (search returned nothing), call this with library='custom' and name='': the component database returns its datasheet link, package and an UNVERIFIED machine-extracted pinout. That is not a symbol: register the part with create_custom_symbol, whose pinout is checked against the datasheet. Pass design_id so the lookup is recorded for the design's dossier and a registered part belongs to it. Give library and name, or up to 12 of them in parts.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Symbol name, e.g. 'RP2040'. | |
| parts | No | Batch form: several (library, name) pairs. | |
| library | No | Symbol library, e.g. 'MCU_RaspberryPi', or 'custom' for a database part number. | |
| design_id | No | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive/closed-world, but the description goes well beyond them: it discloses the datasheet-database enrichment merged into topology_constraints, the footprint_suggestions, and critically that the 'custom' path returns an UNVERIFIED machine-extracted pinout that is 'not a symbol.' It also explains the design_id side effect (lookup recorded for the dossier; registered part belongs to the design). This is exactly the behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return contents before the usage guidance and the custom-library edge case, and most sentences earn their place. There is mild redundancy (topology_constraints is introduced twice) and the run of clauses makes it denser than necessary, but it is well-structured overall.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers the return contents (pins, description, topology_constraints, footprint_suggestions), the merge behavior, the custom fallback and its caveat, the batch form, and the design_id side effect. For a 4-param read tool with full schema coverage, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics the schema does not: the special library='custom' + name='<part number>' convention, the batch form of up to 12 (library, name) pairs, and the meaning of passing design_id. It stops short of describing error behavior for a not-found symbol, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Return the full pin list (number, name, electrical type) and description for a specific KiCad symbol') and clearly distinguishes itself from the sibling search_kicad_symbol by being a direct lookup and by handling the non-KiCad 'custom' fallback. An agent can tell it apart from create_custom_symbol and search_kicad_symbol without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: 'Use this before writing pin connections ... so names, constraints and footprints match the symbol exactly.' It also names the routing condition to the alternative: for a part NOT in KiCad, call this with library='custom', then register with create_custom_symbol. When/when-not and the alternative tool are all stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_order_priceOrder priceBRead-onlyInspect
One price for a quantity: parts from the sellers, the board and assembly from the chosen provider's quote, setup fees, and what the total does not include.
| Name | Required | Description | Default |
|---|---|---|---|
| boards | No | Quantity (default 1). | |
| provider | No | Provider id from list_order_providers, e.g. "jlcpcb". | |
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so safety and external-dependency are covered. The description adds that the price pulls from vendors and a provider quote and hints at exclusions via 'what the total does not include', but the phrasing is vague and adds little concrete behavior beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence beginning with the core outcome ('One price for a quantity') with no filler. The trailing clause 'and what the total does not include' is slightly awkward and underspecified, keeping it short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only pricing tool with no output schema and full schema coverage, the description covers what the price comprises, which is adequate. It omits currency, whether the result is an estimate, and the provider prerequisite, leaving meaningful gaps for an agent deciding whether this is the right call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented in the schema. The description alludes to quantity (boards) and the provider quote, matching the schema, but adds no syntax, format, or default details beyond it, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: it returns 'one price for a quantity' and enumerates the components (parts, board/assembly from the provider quote, setup fees). This clearly separates it from get_bom or send_order_to_provider, though it never uses a crisp 'get the price for a design' verb+resource phrasing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use, when-not-to-use, or prerequisite guidance. It doesn't mention that a provider id (from list_order_providers) is needed, that requirement only living in the schema, and offers no routing against sibling tools like get_bom.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_review_packetDesign review packetARead-onlyInspect
Everything a design review needs in one text: the brief, the dossier, circuit.py and the compiled connectivity (every net with every pin and its function), with the reviewer instructions. Review it yourself and fix blockers with edit_circuit.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true, destructiveHint=false and openWorldHint=false already declared, the safety profile is covered; the description usefully adds that this returns one consolidated text blob containing the netlist, dossier and reviewer instructions. It carries real return-content burden since no output schema exists, and it does so adequately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the packet's contents, and the second sentence pivots to the action step. Slightly dense parenthetical, but every clause conveys inventory the agent needs to decide whether to call it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with no output schema, the description covers both what comes back and what to do next. Missing only explicit routing against lookalike siblings (get_design, read_design_file).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter with 100% schema description coverage, so the schema already defines design_id and its origin (create_design or list_designs). The description adds no further parameter guidance, which matches the baseline expectation when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (a design review packet) and enumerates its contents: brief, dossier, circuit.py, compiled connectivity with nets/pins/functions, and reviewer instructions. This distinguishes it well from file-level siblings like read_design_file, though it never explicitly contrasts itself with get_design or get_board_context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the intended workflow ('Review it yourself and fix blockers with edit_circuit'), which tells the agent both the purpose and the follow-up tool. No explicit when-not or exclusion criteria are given, so it falls just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workflow_guideWorkflow guideARead-onlyInspect
How to drive Koppar end to end, and the instructions for each stage you do yourself: "research" (part research and the dossier), "synthesis" (writing the SKiDL schematic), "review" (design review), "board" (the board plan). Read the stage guide before doing that stage.
| Name | Required | Description | Default |
|---|---|---|---|
| stage | Yes | overview | research | synthesis | review | board |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnly, non-destructive, non-open-world), so the burden is lower. The description adds that some stages are "each stage you do yourself," implying other stages are automated by sibling tools, which is useful framing, but says nothing about the guide's format, size, or caching behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with the scope front-loaded and the usage rule last; every clause carries information. The nested parentheticals make it slightly hard to scan for a specific stage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-enum guide lookup with no output schema, the description supplies the workflow framing, the stage vocabulary, and the when-to-call rule. Nothing essential to calling it correctly is missing, though the return shape is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear enum, so baseline is 3, but the description adds real meaning to four of the five enum values (synthesis = writing the SKiDL schematic, review = design review, etc.) that the bare enum strings do not convey. "overview" is left unexplained, a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource clearly: end-to-end guidance for Koppar plus the per-stage instructions, and enumerates the stages (research, synthesis, review, board) that match the schema enum. It never uses a retrieval verb like "returns" or "fetches", but the content is unmistakable and no sibling tool overlaps with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Read the stage guide before doing that stage" gives an explicit trigger tied to each stage, which is genuinely actionable. It stops short of stating exclusions or pointing to alternative tools for stages handled automatically, so it is clear context rather than complete routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_kicad_projectImport a KiCad projectAInspect
Bring an existing KiCad project in as a board workspace: the project folder as a ZIP (the .kicad_pcb, .kicad_pro, schematics, footprint and 3D-model folders), base64-encoded, up to about 18 MB zipped. The CLI does this with koppar import <folder>. Or from_design_id: the KiCad project of a design the pipeline built (its board, rules, schematics and custom footprints) opened as a workspace, to change the design rules, place and route it with the board tools and put the result back with upload_board (workspace_id). Returns the design_id the board tools take and a first get_board_info.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | No | A note for the design record. No tool reads it: what to keep, widths and layers go in the options of set_design_rules and route_board. | |
| title | No | ||
| board_file | No | Which .kicad_pcb at the top of the project, when there are several. | |
| session_id | No | The project (web session) a new revision of this board goes into: the session_id the first import returned. Without it, an import whose title matches a project you opened before joins that project, so revisions of one board stay together in the user's list. | |
| zip_base64 | No | The zipped project folder, base64. | |
| new_project | No | Start a new project even when one with this title exists. | |
| from_design_id | No | A design of yours with a board (start_board or upload_board): its KiCad project becomes the workspace. Instead of zip_base64. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-open-world operation, so the bar is lower; the description still adds real behavior: an ~18 MB zipped payload limit, base64 encoding requirement, the folder contents expected, and the return value (design_id plus a first get_board_info). It does not discuss failure modes for oversized or malformed archives, which would have pushed it to a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded and free of filler, with the input-mode split established early. The heavy nested parentheses and long run-on structure make it denser than necessary for a tool an agent must parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly fills that gap by stating what comes back (design_id and an initial get_board_info), and it covers both input modes and the size ceiling for a 7-parameter import tool. The absence of any note on which of the seven parameters are required, or what happens when both zip_base64 and from_design_id are supplied, is the main remaining hole.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 86% schema coverage the baseline is 3, but the description adds meaning the schema does not: zip_base64 and from_design_id are presented as mutually exclusive input paths, and the ZIP is explained as a whole project folder rather than a bare board file. It never mentions board_file or new_project in prose, so those rely entirely on their schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Bring an existing KiCad project in as a board workspace" names a specific verb and resource, then immediately splits into the two input modes (ZIP folder vs. from_design_id), so the agent knows exactly what the tool produces (a workspace plus a design_id). It is clearly distinguishable from start_board (new board) and upload_board (pushing a board back).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use each mode: a ZIP when the user has an existing folder on disk, and from_design_id when the goal is to change rules, place and route, and return the result via upload_board. It also explains the session_id revision-grouping rule. It lacks an explicit "do not use this if…" exclusion (e.g. when to use start_board or create_design instead), keeping it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leave_feedbackLeave feedbackAInspect
Send the Koppar team feedback from the user: about Koppar in general, or about one design (design_id). A rating from 1 to 5, a message, or both. Use it when the user asks you to pass something on, or tells you what worked or did not; say in the message what happened, in their words where you can. The team reads every one.
| Name | Required | Description | Default |
|---|---|---|---|
| rating | No | 1 (poor) to 5 (great), when the user gave one. | |
| message | No | What the user wants us to know, in their words where you can. | |
| design_id | No | The design it is about, when it is about one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only, non-destructive, non-open-world operation. The description adds useful behavioral context: the team reads every submission and the message should capture what happened in the user's own words.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then adds only relevant scoping, content, and usage details. Every sentence contributes to correct invocation without unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-optional-parameter feedback tool with no output schema, the description covers purpose, trigger conditions, content expectations, and design scoping. It does not describe the post-submit response or privacy details, but annotations and schema cover the critical structured information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter is already documented in the schema. The description reinforces that rating, message, or both may be provided and that design_id scopes feedback to one design, but it adds little beyond the structured schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: send feedback to the Koppar team, either generally or about one design. It names the supported content types (rating, message, design_id) and is easily distinguishable from the hardware/design sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit trigger conditions: use when the user asks to pass something on or describes what worked or did not work. It does not name alternatives or exclusions, but none are apparent among the siblings, so the guidance is clear without being fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_board_revisionsBoard revisionsARead-onlyInspect
The snapshots of this board, newest first. Revision N is the board as it was before change N (revision 0 is the project as imported); restore_board_revision N goes back to it.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful domain behavior beyond that: results are ordered newest first, revision N is the board before change N, and revision 0 is the imported project. It does not describe the per-revision payload (id, timestamp, labels), which is the remaining gap given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact clauses with zero filler; the ordering fact is front-loaded and the revision-numbering semantics and the restore cross-reference follow immediately. Every clause carries information an agent needs, and the semicolon-dense style is appropriate for a short definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only listing with full schema coverage, the description supplies the two things that could not be inferred: result ordering and the meaning of revision indices including the base case. No output schema exists, but the notion of what a revision is and how it is numbered is explained well enough to consume the results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single design_id parameter is already documented in the schema with its source tools (import_kicad_project, list_designs) and a pattern constraint. The description adds no additional meaning about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource precisely ('the snapshots of this board') and adds ordering, making it immediately distinguishable from board-mutating siblings and from restore_board_revision. It lacks an explicit verb like 'list', so the listing action is inferred from the tool name rather than stated, which keeps it just under a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative, restore_board_revision N, and ties it to a concrete purpose ('goes back to it'), so an agent knows this tool is for inspecting revisions before restoring one. There is no explicit 'use this when you need to...' framing or a statement of when not to use it, so it stops at clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_designsList designsBRead-onlyInspect
The user's designs, newest first, including ones made in the web app (an agent can continue those too) and board workspaces (kind "board workspace"). With trashed, the designs in the trash instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many (default 20). | |
| trashed | No | List the trash instead of the live designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that — result ordering (newest first), inclusion of web-app-created and board-workspace designs, and the fact that an agent can continue web-app designs. It omits pagination behavior and what identifying fields come back in each entry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences that front-load the result set and ordering. The parenthetical "(an agent can continue those too)" is a bit chatty but carries genuinely useful information, so it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read with no output schema, the description covers ordering and scope but not the shape of returned entries (e.g., whether design IDs are included so get_design can be called next). That omission is the main completeness gap for a discovery-style tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both limit and trashed are already documented, including the default of 20. The description's "With trashed, the designs in the trash instead" restates the schema rather than adding new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource (the user's designs) and a scope detail (newest first, includes web-app and board-workspace designs), which clearly separates it from get_design, delete_design and restore_design. It never uses an explicit verb like "list", relying on the name/title for that, which slightly weakens the opening.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: consult this to see the user's designs, and set trashed to view the trash instead. There is no explicit routing to siblings such as get_design for a single design, and no guidance on when a listing is preferable to fetching a specific design.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_order_providersManufacturersBRead-onlyInspect
The PCB and assembly providers, whether each can quote and take this kind of board today, and what a handoff sends them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so safety and external-source nature are covered. The description adds a useful behavioral detail — results are time-sensitive ('today'), i.e., live availability rather than a static directory — plus that the response includes handoff information. It does not say whether a design must be loaded/selected for 'this kind of board' to resolve, which is a meaningful behavioral precondition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler — appropriately sized for a zero-argument list tool. It is not strongly front-loaded though: the clarifying value ('can quote today', 'handoff') is buried in a trailing comma clause rather than leading.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description is the only source of return-value information, and it only loosely characterizes the response (providers, current quotability, handoff contents). Missing are the context dependency (which board is used) and its place in the order flow relative to get_order_price / send_order_to_provider, leaving the agent to guess on a workflow-critical step.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero input parameters, so the schema carries no semantics to compensate for; baseline 4 applies. The description's implicit dependency on the current board context ('this kind of board') is worth noting but does not correspond to a parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (PCB and assembly providers) and adds qualifying information (whether each can quote/take this board today), which hints at a capability listing. But it is a noun-phrase fragment with no verb, and the trailing clause 'what a handoff sends them' is opaque — an agent cannot confidently say whether this returns a provider list, a capability matrix, or a payload preview, nor how it differs from get_order_price.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus get_order_price or send_order_to_provider, which are the obvious neighbors in the ordering workflow. The agent must infer the sequencing on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
place_footprintsPlace footprints exactlyAInspect
Put footprints exactly where given: KiCad board coordinates of the footprint origin in mm (y grows downward), rotation in degrees as KiCad shows it, side F or B (changing side flips the footprint, as KiCad does), locked. dx_mm/dy_mm/drot_deg move relative to where it is. Nothing is nudged or legalized: overlaps are for run_drc to report. Unknown references come back in missing.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| placements | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, destructive=false, openWorld=false): it documents that nothing is auto-legalized, that overlaps are deferred to run_drc, and that unknown references are reported back in 'missing'. It also explains the F/B side-flip behavior and relative-move semantics, which are genuine behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and dense with zero filler; every clause (coordinates, rotation, side flip, relative moves, no legalization, missing refs) carries information. The telegraphic sentence-plus-fragment style is slightly cramped but earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description still covers conventions, mutation semantics, and error signaling ('missing'). Async/job behavior is handled by the wait_s schema description pointing to get_board_job, so the definition is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description fills the semantic gaps richly: y grows downward, rotation is 'as KiCad shows it', side F/B flips the footprint, locked, and dx_mm/dy_mm/drot_deg are relative deltas from current position. This adds meaning well beyond the bare schema field names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('put footprints') with an explicit placement mode: exact, caller-supplied coordinates. The clause 'Nothing is nudged or legalized' separates it functionally from siblings like auto_place, anneal_place, and tidy_copper without needing to open their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Makes clear this is the tool for deterministic coordinate placement rather than automatic/optimizing placement, and tells the agent overlaps are left for run_drc. It gives clear selection context but never names an alternative tool explicitly or states when NOT to use it (e.g. bulk placement).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
polish_viasFewer vias, net by netADestructiveInspect
After route_board and prune_vias: rip one net at a time, most vias first, route it alone around everything else at a high via price, and keep the new copper only when KiCad counts fewer vias with no new open item or DRC error (a reroute that cuts a pour into islands first gets one via per island, bridge_islands). Run run_drc and get_score afterwards; a second pass sometimes finds more.
| Name | Required | Description | Default |
|---|---|---|---|
| nets | No | Net names; * and ? wildcards, e.g. ["USB_D*", "+3V3"]. | |
| pairs | No | Rip and reroute a differential pair (_H/_L, _P/_N, +/-) together (default true: a leg rerouted alone comes back at its own length; a step that degrades a pair is never kept). | |
| pours | No | Also polish the poured nets (default false): the pour and its stitch vias stay, the net is routed as a track tree on top, then its redundant stitch vias are pruned. A lottery: the tree that did this by accident (PCBGolf +3V3 53 -> 32) did not repeat in 2 deliberate tries. | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| workers | No | prune workers for a poured net (default 4). | |
| max_nets | No | Nets to try, most vias first (default 40). | |
| min_vias | No | Only nets with at least this many vias (default 2). | |
| via_cost | No | Via price for the lone reroute (default 60). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| ml_options | No | ||
| time_budget_s | No | Router budget per net (default 120). | |
| bridge_islands | No | ||
| total_budget_s | No | Stop starting nets after this (default 1800). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description earns that by disclosing the acceptance rule: new copper is kept only when KiCad counts fewer vias with no new open item or DRC error. That is meaningful behavior beyond the annotation. It does not say whether rejected copper is rolled back or how revisions/undo work, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the pipeline position and the core loop in one dense sentence, then adds follow-up and iteration advice in a short second clause. The nested parenthetical about pour islands is slightly hard to parse but carries information, so nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter, destructive, no-output-schema tool, the description covers prerequisites, the accept/reject policy, the pour-island edge case, the polling follow-up and the verification step. An agent has enough to invoke it correctly and know what to do next.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 85%, but the description adds real meaning: it explains that nets are tried 'most vias first' (max_nets/min_vias ordering), that via_cost is deliberately high for the lone reroute, and it supplies semantics for bridge_islands, which has no schema description at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (rip one net at a time, reroute it alone, keep the new copper only on a via-count win) and explicitly positions itself in the pipeline 'After route_board and prune_vias', which separates it from prune_vias and route_board. An agent can tell what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions (after route_board and prune_vias), the follow-up sequence (run_drc and get_score afterwards), and the caveat that a second pass sometimes finds more. It also names bridge_islands as the alternative for the pour-island case, so the routing decision between tools is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prune_viasRemove redundant viasAInspect
Remove every via the board does not need: groups of vias come out, the zones are refilled and KiCad's unconnected count compared, and a via stays only if removing it disconnects something. nets limits the candidates (GND and the plane rails first: pours already join most of their pads). Runs for minutes on a large board; then fill_zones, run_drc.
| Name | Required | Description | Default |
|---|---|---|---|
| nets | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| workers | No | ||
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false; the description earns credit by explaining why a removal tool is non-destructive — a via survives if its removal disconnects anything, and zones are refilled and re-verified. It also discloses the runtime cost ('runs for minutes on a large board'), which annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core behavior before the nets hint and the runtime/follow-up warning. Parentheticals are informative rather than filler; only the 'pours already join most of their pads' aside is arguably optional.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a long-running mutation tool with no output schema, the description covers the decision rule (kept if removal disconnects), the runtime expectation, the long-job continuation hint exists in the schema, and the required follow-ups. It does not state what is returned (e.g. count of removed vias) or how partial/interrupted runs are reported, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: design_id and wait_s are documented in-schema, while nets and workers are not. The description adds real meaning for nets (candidate limiting, GND/plane rails prioritized) but says nothing about workers or about how nets interacts with the connectivity test. Baseline 3 given partial coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Remove every via the board does not need', then defines 'redundant' concretely via the refill-and-compare-unconnected-count test. It never names the closest sibling (polish_vias), so an agent must infer the distinction itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage pattern: 'nets limits the candidates (GND and the plane rails first: pours already join most of their pads)' and names the follow-up sequence 'then fill_zones, run_drc'. No explicit when-not-to-use or exclusion versus polish_vias/tidy_copper, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_design_fileRead a design fileBRead-onlyInspect
Read a text file of the design: prompt.txt (brief), dossier.md, circuit.py, circuit.net, result.json, circuit.erc.json (KiCad ERC violations), attempt_N_circuit.py / attempt_N_error.txt, board_plan.json, pcb_result.json, pcb_run.log, circuit.drc.json (KiCad DRC), netclasses.resolved.json, dfm.json, harness.log.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | A file name, e.g. 'circuit.py'. | |
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, non-destructive operation. The description adds that it reads text files and identifies the specific artifact types available, but it does not describe error behavior, missing files, or authentication needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence: it states the action first, then enumerates supported files. The list is long but every item is relevant to the tool's scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, read-only file retrieval tool with annotations covering safety and a fully documented two-parameter schema, the description provides a complete catalog of readable design files. No output schema exists, so return-value details are not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds substantial meaning beyond the schema by enumerating valid path values such as circuit.py, circuit.erc.json, and board_plan.json, which helps an agent know what can be requested.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: reading a text file from a design. It enumerates the supported design artifacts, making the scope concrete, but it does not explicitly differentiate itself from siblings such as get_design or get_board_context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lists what files can be read but gives no guidance on when to use this tool versus alternatives like get_design, get_board_context, or other retrieval tools. There is no mention of conditions, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_boardRender the board (2D, exact)ARead-onlyInspect
An exact 2D picture of the board as an engineer reads it: copper per layer (the facing layer full strength, the others faded), pads, vias, pours, outline, courtyards and refs. side top|bottom, region [x, y, w, h] mm for a crop, drc_markers to circle every DRC violation, ratsnest to draw the open connections, highlight_nets/highlight_refs in magenta. The pixel-per-mm scale and region come back so a follow-up crop is exact. Download workspace.render.png.
| Name | Required | Description | Default |
|---|---|---|---|
| refs | No | ||
| side | No | ||
| layers | No | ||
| region | No | [x_mm, y_mm, w_mm, h_mm] crop; default the whole board. | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| markers | No | ||
| ratsnest | No | ||
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| max_width | No | ||
| px_per_mm | No | ||
| courtyards | No | ||
| drc_markers | No | ||
| highlight_nets | No | ||
| highlight_refs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint true, destructive false, closed world), so the bar is lower; the description still adds real value by disclosing render semantics — facing layer at full strength with others faded — and the return payload (px_per_mm and region echoed, plus a downloadable workspace.render.png). It omits the async/job-follow-up behavior, which is only carried by the wait_s schema field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A dense but efficient paragraph that front-loads what the image contains before enumerating options and the return payload. Nearly every clause conveys distinct information, with only minor cramming of option descriptions into one sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains what comes back (scale, region, PNG download location) so a follow-up crop is exact. Combined with schema-level wait_s text about the running-job path, an agent has enough to call it, though the unexplained markers and max_width params leave small gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 21% across 14 params, and the description meaningfully compensates by naming and explaining side, region, drc_markers, ratsnest, highlight_nets/highlight_refs, layers, refs and courtyards. However, markers (custom annotations with labels) and max_width are never explained, and refs/courtyards are only implied by a list of drawing elements rather than described as toggles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: an 'exact 2D picture of the board' with an enumerated layer set (copper, pads, vias, pours, outline, courtyards, refs). That makes it clearly distinct from data-oriented siblings like board_census or get_board_context, though it never names a sibling to differentiate against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the option clauses ('drc_markers to circle every DRC violation', 'ratsnest to draw the open connections', 'region ... for a crop'), but there is no explicit statement of when to render versus using other board-inspection tools, nor any exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repair_boardRepair open connectionsAInspect
Keep the copper of every net it already connects and route the nets still open around it: route_board with preserve_existing, with the learned router service. Default budget 120 s.
| Name | Required | Description | Default |
|---|---|---|---|
| nets | No | Net names; * and ? wildcards, e.g. ["USB_D*", "+3V3"]. | |
| pours | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| compact | No | Via choice as on route_board: true for the densest legal via (JLCPCB Kelvin test), false for the Kelvin-free 0.45/0.2. | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| time_budget_s | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false), and the description adds a genuinely useful behavioral promise: existing copper for already-connected nets is preserved. Beyond that it is silent on what happens to nets that cannot be routed, whether changes are reversible, or that the job may need polling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact clauses with the core behavior front-loaded and no filler. The route_board-with-preserve_existing framing is efficient, though the trailing 'with the learned router service' phrase adds little for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the return-behavior burden, and it partially does by noting the default budget and long-running nature of the operation. That is adequate for a six-parameter repair tool, though it never says how an agent learns which nets remain open after the run.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description contributes a default execution budget of 120 s, which the time_budget_s parameter does not document. It says nothing about nets, pours, or compact beyond what the schema already provides, so the baseline 3 fits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: preserve the copper of already-connected nets and route only the still-open ones, which is precisely 'route_board with preserve_existing'. That clearly separates it from plain route_board. It stops short of a 5 because 'the learned router service' is unexplained jargon and the net-selection scope is only implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verbs 'keep' vs 'route the nets still open', so an agent can infer this is the repair path after routing. But there is no explicit when-to-use guidance: nothing says to run diagnose_open_nets first, nor when to prefer ripup_routing or a fresh route_board instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_board_revisionRestore a revisionAInspect
Put the board and its rules back as they were in a revision from list_board_revisions. The current board is saved as a new revision first, so the restore itself can be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| revision | Yes | ||
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the key side effect and safety property: the current board is snapshotted as a new revision first, so the mutation is reversible — consistent with destructiveHint=false. It does not mention permissions, concurrency with running jobs (wait_s/get_board_job), or failure behavior on an invalid revision, so it stops short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, zero filler, with the core action front-loaded and the undo guarantee immediately after. Nothing repeated from the schema or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers what changes and how to revert it, which is the crucial gap. The asynchronous job semantics are delegated to the wait_s schema description, which is reasonable, though the description could have flagged that this may return a running job to follow with get_board_job.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the undocumented parameters carry meaningful context: wait_s has a rich inline description and design_id identifies its origin. The description only adds the provenance hint that `revision` comes from list_board_revisions; it says nothing about valid revision values, wait_s semantics, or what the returned job status means.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus scope: put the board AND its rules back to a state from a named revision. It also names the source tool (list_board_revisions), which anchors the operation. It does not distinguish itself from the sibling restore_design, which an agent could plausibly confuse with this.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the revision argument must come from list_board_revisions, which suggests a list-then-restore workflow. There is no explicit statement of when to prefer this over restore_design or other repair/restore siblings, and no stated preconditions (e.g., board must be idle, no job running).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_designRestore a design from the trashCInspect
Put a deleted design back from the trash.
| Name | Required | Description | Default |
|---|---|---|---|
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a non-read-only but non-destructive operation, so the description needed to add the meaningful behavioral context: what happens if the design is not in the trash, where it is restored to, and whether the restore is idempotent. None of that is present; 'put back' is only a restatement of the mutation the annotations already imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with no filler and the action front-loaded. It is not verbose, though the terseness comes at the cost of information rather than from efficient compression of useful detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, non-destructive mutation with full schema coverage and annotations, the minimum is met but key behaviors remain unstated: failure mode when the design is not trashed, and what the caller gets back given there is no output schema. An agent could call it, but could not predict the outcome confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter, and the schema already explains that design_id comes from create_design or list_designs and enforces a pattern. The description adds nothing about the identifier, so the baseline 3 applies rather than a higher score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete action (return a deleted design from the trash), which is more specific than the bare name, but it is essentially a paraphrase of the title 'Restore a design from the trash.' It gives no differentiation from nearby siblings such as restore_board_revision or delete_design, so an agent still has to infer which restore applies to designs vs. board revisions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no precondition (e.g., only works if the design is currently trashed), and no named alternative. The sibling list includes both restore_design and restore_board_revision, and this description does nothing to route between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ripup_routingRip up routingADestructiveInspect
Delete tracks and vias: of the given nets, on the given layers (vias are not layer-filtered), with an end inside region, or all. Filters combine. tracks/vias choose which kinds (both by default); zones also deletes the copper zones (pours) the same filters match (a zone inside region), never keepout areas. Locked items stay unless include_locked.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | ||
| nets | No | Net names; * and ? wildcards, e.g. ["USB_D*", "+3V3"]. | |
| vias | No | ||
| zones | No | ||
| layers | No | ||
| region | No | ||
| tracks | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| include_locked | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses exactly what can be destroyed: tracks, vias, and optionally copper zones. It also gives important protective semantics: keepouts are never deleted, locked items stay unless include_locked is set, and layers do not filter vias.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the destructive action, and every clause carries operational meaning. It avoids repetition and covers the important caveats without unnecessary prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive bulk-delete tool with 10 parameters and no output schema, the description gives strong filtering and safety context. It leaves async job behavior and return handling to the schema's wait_s description and sibling tools, which is a minor gap rather than a blocking omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 30% schema description coverage for 10 parameters, the description compensates well. It explains the boolean filters, default inclusion of tracks and vias, zone behavior, layer filtering exceptions for vias, filter combination, region matching, and include_locked semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Delete tracks and vias', then enumerates the routing objects and filters affected. It is clear what the tool does, though it does not explicitly distinguish itself from nearby siblings such as prune_vias or cleanup_board.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the available filters ('of the given nets, on the given layers... or all') and defaults. However, the description does not explicitly say when to choose this instead of alternatives like cleanup_board, prune_vias, or route_board.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
route_boardRoute the boardAInspect
Route under the project's rules and net classes. By default (no nets, no router, none of the single-route options below) it runs the full route pipeline Koppar benchmarks: the learned router on the whole board, repair rounds on what stays open, copper finishing (0/45/90 runs) and one repair round after it, inside one wall-clock cap: time_budget_s is that cap (default 1200, up to 1500), so the job runs up to about 20 minutes: follow it with get_board_job. The result gives the final unconnected items and DRC errors and a pipeline summary: the counts after the route and after each finish, whether the copper finishing was kept. preserve_existing unset keeps the copper of a board that has tracks or vias and routes a board without any from scratch; false routes every net again. nets, router, or any single-route option (pours, rule overrides, ml_options, seed_existing, pairs_first, class_vias) runs ONE route with that router instead, for expert control: nets limits it to those nets; preserve_existing (default true) keeps every track and via already on the board and routes only what is still open. pours: "keep" (the default when the board has zones) keeps the board's zones and routes every net as tracks. Rule overrides apply to this run only. The learned router takes its via discipline in ml_options. A single route takes time_budget_s (default 120, up to 900).
| Name | Required | Description | Default |
|---|---|---|---|
| nets | No | Net names; * and ? wildcards, e.g. ["USB_D*", "+3V3"]. | |
| pours | No | ||
| router | No | Unset: the full pipeline (above) on the whole board, "ml" for nets. "ml": the learned router service alone, 1 to 8 layers; the time budget is its deadline. Nets outside the nets scope, and with preserve_existing the nets their copper already connects, keep that copper and everything else is routed around it (partial copper of a routed net is replaced). | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| compact | No | true: the densest via the rules allow (0.4/0.2), which JLCPCB prices with a mandatory 4-wire Kelvin test (~$40 per order); false: never below the Kelvin-free 0.45/0.2. Unset: compact only on a board with an area-array package or vias in pads. | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| class_vias | No | Route with the Default class's via. Without it (and without via_diameter_mm) a route uses the board's smallest legal via where the class's is larger. | |
| ml_options | No | Fields passed to the learned router service as they are (router "ml"): via_cost and via_cost_hi (prices in lattice cells; a move costs 1 and the served default via is 8, 12 while a net is on the quality ladder), ql_release (rejected rip trades before a net drops to via_cost, 0 never), endgame_release (false keeps failing nets at via_cost_hi), economy_via_mm (a via counts as this many mm in the economy pass, default 2), guide_via_w (per-cell via price from the model's via channel), plane_cost (signal copper on a poured layer, per cell), pair_w, guide_w, ripup, seed_offset, via_economy_victims (default 4; 8 trades harder), first_nets (globs routed before everything else: buses that span several connectors), draws (client-side: route this many seeded draws and keep the one that connects most then uses fewest vias; the tie-breaks alone move a 500-via board by about 8 vias), stitch_poured (false: no stitch via for a pad already on a layer poured with its net, GND pads on F/B), stitch_cluster_mm (join same-layer pads of a poured net within this reach by short traces and via once per cluster; 4 wins, 8 loses), stitch_cluster_nets (globs: which poured nets cluster), draw_open_penalty (client-side: vias an open net costs when draws are compared, default 0 = the most-connected draw always wins), layer_cost (per-cell price on named layers, {"F.Cu": 2}: the pour polish prices every layer but the plane's). | |
| pairs_first | No | Route the differential pairs (USB D+/D-, CAN H/L, X_P/X_N) alone first, then everything else around them: a port pad row only lets a pair out before the neighbours take its lane. | |
| clearance_mm | No | ||
| via_drill_mm | No | ||
| vias_in_pads | No | 'forbid' (default): no via inside an SMD pad under 2 mm. 'allow': vias may sit in pin pads, for a board ordered with filled and capped vias (JLCPCB POFV); dense connector rows close that otherwise stay open. | |
| seed_existing | No | ML router: the connected nets in scope are sent as their own routes (seed_copper) and the service reworks the finished board with its rip-up and via-economy passes; kept only when KiCad counts fewer vias. Scope nets to the routed signal nets (pour nets stay). | |
| time_budget_s | No | The full pipeline's wall-clock cap (default 1200), or a single route's budget (default 120, up to 900). | |
| track_width_mm | No | ||
| via_diameter_mm | No | ||
| edge_clearance_mm | No | ||
| preserve_existing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond the annotations, it discloses the wall-clock cap semantics (1200s default, 1500 max, ~20 minutes), that jobs survive a server restart and resume from their last finished stage, what preserve_existing=false actually overwrites ('routes every net again'), and what the result contains (unconnected items, DRC errors, per-stage counts, whether copper finishing was kept). This is unusually complete behavioral disclosure for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The default mode is helpfully front-loaded, but the body collapses into a single dense paragraph of long parenthetical sentences that an agent must parse linearly to find the mode switch. Every clause is substantive, yet the structure obscures the key decision rule more than it needs to.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter mutation tool with no output schema, it supplies the missing return-value picture (final unconnected items, DRC errors, pipeline summary counts) and the follow-up polling path. The only gap is that timing/async behavior of the single-route mode (default 120s, up to 900) is stated but its interaction with wait_s default 55 is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 18 parameters at 61% schema coverage, the description carries real weight: it explains the mode-switching behavior of nets/router, the conditional default of preserve_existing (keeps copper on a board with tracks, routes from scratch otherwise), pours='keep' defaulting on zoned boards, and that ml_options only applies to the learned router. It leaves compact, wait_s and vias_in_pads to their schema descriptions, and the generic 'rule overrides' shorthand never enumerates clearance/track/via/edge parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource ('Route under the project's rules and net classes') and the description carefully separates two operating modes: the default full pipeline versus a single route triggered by nets/router/single-route options. It does not name any rival sibling (e.g. ripup_routing, polish_vias) to steer an agent away from this tool, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a precise trigger rule: with no nets, no router and no single-route option it runs the full pipeline; with nets, router or any single-route option it runs exactly ONE route, explicitly framed as 'expert control'. It also states defaults for preserve_existing, pours and the default time budgets, and directs the agent to get_board_job for polling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_drcDesign-rule checkARead-onlyInspect
KiCad's DRC on the board as it is now, with schematic parity when the project has its schematic: error and warning counts by type, shorts, unconnected items, parity items, and the first violations with their items and positions (types filters, max_violations caps; default 40). Also mount_fit: parts reaching through the board (mid-mount jacks, USB-C) checked against their cutouts from their 3D models, with any body area over board material or within the fab's 0.2 mm milling tolerance of the cut.
| Name | Required | Description | Default |
|---|---|---|---|
| types | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| max_violations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, closed-world), so the bar is lower, and the description still adds real behavior: results are truncated to 'the first violations' with a default cap of 40, and a second mount_fit check is disclosed with its concrete tolerance (0.2 mm milling). It does not disclose that this is a long-running job whose result may come back as 'running' — that lives only in the wait_s schema text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and output shape are front-loaded in the first clause, with the mount_fit addendum after. It is dense and long-ish, but nearly every clause carries information; the only soft spot is the mount_fit tangent competing with the primary DRC purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain the return value — and it does, enumerating counts by type, shorts, unconnected items, parity items, and truncated violation records with items and positions. The one gap, job follow-up via get_board_job, is covered by the wait_s schema text rather than the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: design_id and wait_s are documented, but types and max_violations are not. The description compensates by explaining that types is a filter over violation kinds and max_violations caps how many violations are returned, with a default of 40 — adding meaning beyond the bare integer bounds.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource — 'KiCad's DRC on the board as it is now' — plus the schematic-parity caveat, and it names the concrete outputs (counts by type, shorts, unconnected items, parity items, violations with positions). It never names the adjacent siblings (check_net_rules, check_physics, diagnose_open_nets), so the agent must infer the DRC-vs-rule-check distinction itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'On the board as it is now' implies a post-edit / pre-signoff check, and the parity clause hints when the schematic is needed, but there is no explicit when-to-use, when-not-to-use, or named alternative among the many check_* siblings. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_dossierSave the parts dossierAInspect
Store the research dossier (markdown with ## Parts list, ## Power rails, ## Topology constraints, ## Notes, as the research guide describes). The verified pin tables from your lookups on this design are appended, and verified entries the design already had for parts you did not look up again are kept. Reports every (library, name) in the parts list that does not exist, with catalog candidates.
| Name | Required | Description | Default |
|---|---|---|---|
| markdown | Yes | The dossier. | |
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare write, non-destructive, closed-world, and the description substantiates that by spelling out merge semantics: verified pin tables are appended, and pre-existing verified entries for parts not re-looked-up are preserved. It does not state whether the markdown body overwrites the prior dossier, which is the one behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, and each sentence carries distinct information (format expectations, merge behavior, missing-part reporting). Dense but not padded, though the parenthetical heading list is slightly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully covers the response surface by explaining that non-existent (library, name) entries are reported with catalog candidates. Combined with the annotation safety profile and full parameter coverage, only overwrite/versioning behavior is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by prescribing the required markdown section headings the 'markdown' string must contain and by framing 'design_id' in terms of the create_design/list_designs origin. This adds real meaning beyond the two terse schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Store') plus the exact resource ('the research dossier') and enumerates its expected section structure (## Parts list, ## Power rails, ## Topology constraints, ## Notes). No sibling tool competes for this action, so an agent can select it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the workflow reference ('as the research guide describes') and the prerequisite of having performed lookups, but there is no explicit when-to-use/when-not statement or named alternative. Adequate but leaves the trigger condition to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_kicad_footprintSearch KiCad footprintsARead-onlyInspect
Search KiCad's standard footprint libraries. Returns 'Library:Footprint' strings suitable for the footprint= argument of Part(...). Query with the package family and pin count ('LGA-14', 'QFN-24', 'SOIC-8'), optionally a body size or pitch. When no name contains every word, near_misses lists footprints of the same package, ranked by body size and pitch. Pass design_id so the lookup is recorded for the design's dossier and a registered part belongs to it.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Package to search for, e.g. 'SOIC-8', 'QFN-56 7x7', 'USB_C_Receptacle'. | |
| design_id | No | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld=false/destructive=false, so the safety profile is covered. The description goes further by disclosing the return format, the near_misses behavior when no name matches every word, and the side-purpose of design_id, which is meaningful content beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all earning their place, front-loaded with the core action and return value before the fallback and design_id details. Slightly dense but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the job of explaining the return shape and the near_misses fallback, plus how design_id affects recording. Complete enough to call correctly, though the exact result structure (list form, exact matches field) is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real value: example query strings ('LGA-14', 'QFN-24', 'SOIC-8') and the purpose of design_id (lookup recorded for the design's dossier; a registered part belongs to it) beyond the schema's terse note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Search KiCad's standard footprint libraries', and specifies the return type ('Library:Footprint' strings for the footprint= argument). The resource ('footprint libraries') naturally separates it from search_kicad_symbol, but it never explicitly contrasts with that sibling, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete query-construction guidance ('package family and pin count', optionally body size or pitch) and explains the near_misses fallback condition. It lacks an explicit when-not clause or a direct pointer to search_kicad_symbol for symbol lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_kicad_symbolSearch KiCad symbolsARead-onlyInspect
Search KiCad's standard symbol libraries for parts whose name contains a substring. Use this whenever you are not 100% sure the (library, name) pair you're about to pass to Part(...) exists. Always prefer the package-suffixed variant the search returns over a generic name. If a part returns nothing here, get_kicad_symbol(library='custom', name='') may find it in the component database (a datasheet link and a pinout lead); register it with create_custom_symbol. Pass design_id so the lookup is recorded for the design's dossier and a registered part belongs to it.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Substring to search for, e.g. 'NE555', 'USB-C', 'RP2040'. | |
| library | No | Restrict to one symbol library, e.g. 'Timer'. | |
| design_id | No | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it as a non-destructive, closed-world read. The description adds genuine side-effect context beyond them: passing design_id records the lookup in the design's dossier and scopes registered parts, and the fallback path to a custom component database is disclosed. It stops short of describing result shape or any limits, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then layered usage rules and fallbacks in a logical order. Each sentence carries practical information, though the closing sentence on design_id is dense enough that it could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries return-value burden and does reasonably well by saying the search returns package-suffixed variants to prefer. A 3-param read tool with full schema coverage needs little more; only the absence of result-format/pagination detail keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds real meaning on top: query is a substring match, design_id ties the lookup to a design dossier, and library is implied as a restriction scope. It does not clarify maxLength/pattern constraints, but it exceeds the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: searching KiCad's standard symbol libraries by name substring. It also distinguishes itself from siblings by name (get_kicad_symbol, create_custom_symbol), so an agent can tell it apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('use this whenever you are not 100% sure the (library, name) pair exists') plus branching guidance: prefer package-suffixed results, fall back to get_kicad_symbol(library='custom'), then register with create_custom_symbol. This is a full when/when-not/alternatives routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_order_to_providerSend the order to a manufacturerADestructiveInspect
Upload the released board (Gerbers, BOM, placement) to a manufacturer and return the page where the user pays. This publishes the design to a third party: call it only when the user has explicitly asked to order from that provider, and set user_confirmed only then. Some providers need a shipping address.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Order title at the provider. | |
| boards | No | Quantity (default 1). | |
| provider | Yes | Provider id from list_order_providers. | |
| shipping | No | Delivery address, for providers that need one. | |
| design_id | Yes | The design id returned by create_design or list_designs. | |
| user_confirmed | Yes | The user explicitly asked to send this design to this provider. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true; the description adds critical context beyond that: design data is published to a third party, the call is gated on explicit user request, and the return is a payment page. It also flags that some providers require shipping. This is exactly the extra context the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and outcome, followed by the gating condition and a provider-specific caveat. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-world mutation with no output schema, the description covers what is sent, who receives it, the precondition, and what is returned (payment page). The only minor omission is error behavior on unsupported providers, but overall it is complete enough to invoke safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning: user_confirmed is tied to explicit user intent (beyond the schema's const:true), provider references list_order_providers, and shipping is conditional. It doesn't cover title or boards, but those are well-documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource ('Upload the released board ... to a manufacturer and return the page where the user pays') immediately distinguishes it from siblings like upload_board or get_order_price. The scope — publishing Gerbers, BOM, placement to a third party and handing off to a payment page — is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'call it only when the user has explicitly asked to order from that provider, and set user_confirmed only then', and notes the shipping-address condition. This names the precondition and the confirmation requirement that select this tool over get_order_price or list_order_providers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_board_outlineSet the board outlineAInspect
Replace everything on Edge.Cuts with a new outline: rect (optionally with corner_radius_mm), a polygon of points, or fit_to_parts (the rectangle around every footprint courtyard plus margin_mm). Give exactly one.
| Name | Required | Description | Default |
|---|---|---|---|
| rect | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| polygon | No | ||
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| fit_to_parts | No | ||
| line_width_mm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the key behavioral fact that existing Edge.Cuts content is wiped ('Replace everything'), which annotations alone do not convey. That sits in mild tension with destructiveHint=false and the description adds nothing about async job behavior, defaults (line_width_mm), or what happens on failure — those behaviors live only in the wait_s schema text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the verb and target layer, then the modes. It is dense with nested parentheticals but every clause supplies selection-relevant detail; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers shape inputs and mutual exclusivity but not the return path (job / status / polling via get_board_job), the default line width, or failure handling. An agent would still need the schema to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 33%, the description carries real weight: it explains rect with optional corner_radius_mm, polygon as a point list, and fit_to_parts as the courtyard bounding rectangle plus margin_mm. It does not mention wait_s, line_width_mm, or design_id, but those are documented in the schema, so the gap is small.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replace everything on Edge.Cuts') and enumerates the three accepted outline forms (rect, polygon, fit_to_parts). Naming Edge.Cuts cleanly separates it from the set_keepouts / set_zones / set_silkscreen siblings without needing to reference them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing 'Give exactly one' is a useful exclusivity rule for the three modes, and each mode is described well enough to choose between them. However, there is no guidance on when to use this tool versus related siblings, no prerequisites (e.g., existing design state, required permissions), and no note on whether the change is reversible.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_design_rulesSet design rulesAInspect
Set the project design rules (.kicad_pro) and copper layer count. Works on a board workspace and on a generated design (create_design → start_board). On a generated design the rules go into circuit.kicad_pro/.kicad_dru in place (the previous ones are snapshotted under rules_revisions/), are kept by every later project write (project.zip, a new board run), the copper is not changed and KiCad DRC judges the board against them at once: the reply carries the DRC counts and whether the Gerbers are released; the next start_board routes to the default_* values. copper_layers, stackup and board_thickness_mm are workspace-only (a generated design changes them with a new board). preset "jlcpcb" applies JLCPCB's published minimums for the layer count and writes their per-feature limits (plated rings, pad hole spacing, hole-to-track) as KiCad custom rules (.kicad_dru) that run_drc checks; explicit values override the minimums. Board minimums (min_*), the Default net class (default_*), and named net classes with their net patterns. route_board routes with these rules and run_drc checks against them. Changing copper_layers rebuilds the stackup; tracks on removed layers are reported. copper_layers 1 is a single-sided board (hand etching): the KiCad file keeps F.Cu and B.Cu, and from then on the routers hold to one face (B.Cu as soon as a THT pad exists, else F.Cu) and place no via; copper on the other face is removed.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| stackup | No | 1.6 mm impedance stackups, written into the board: JLCPCB's 4-layer 7628 (0.21 mm prepreg, their default) or 3313 (0.1 mm prepreg: thinner pairs for the same impedance), and 6- / 8-layer 3313 builds (approximations of the fab's, from its 3313 outer prepreg and human 1.6 mm boards). Needed before a net class states diff_impedance_ohm. | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| net_classes | No | ||
| min_track_mm | No | ||
| copper_layers | No | ||
| hole_to_hole_mm | No | ||
| default_track_mm | No | ||
| min_clearance_mm | No | ||
| hole_clearance_mm | No | ||
| board_thickness_mm | No | Finished board thickness; the stackup is rebuilt to it. JLCPCB FR4: 0.4, 0.6, 0.8, 1.0, 1.2, 1.6, 2.0 mm. | |
| min_via_annular_mm | No | ||
| min_via_diameter_mm | No | ||
| default_clearance_mm | No | ||
| default_via_drill_mm | No | ||
| min_through_drill_mm | No | ||
| default_via_diameter_mm | No | ||
| copper_edge_clearance_mm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses many behavioral consequences, including snapshots under rules_revisions/, persistence across later project writes, DRC evaluation, and routing effects. However, it also states that copper on the other face is removed when copper_layers is 1, which contradicts destructiveHint=false; that is a real destructive side effect despite the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the length is largely justified by a complex 19-parameter mutation tool. The text is a dense run-on paragraph with some repeated DRC discussion, so it could be structured more cleanly, but there is little outright filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with no output schema, the description covers the two execution contexts, persistence, snapshots, DRC consequences, preset behavior, and the reply content. It is not fully complete because several parameters remain semantically thin, but the major operational context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 21% across 19 parameters, so the description must compensate. It does explain preset, copper_layers, stackup, board_thickness_mm, net_classes, and grouping for min_* and default_* parameters, but it leaves hole_to_hole_mm, hole_clearance_mm, copper_edge_clearance_mm, and several individual minimum/default fields to their names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: setting project design rules (.kicad_pro) and copper layer count. It also distinguishes the two operational contexts, board workspace versus generated design, so the agent can tell what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly explains when the tool applies to a board workspace versus a generated design, how the jlcpcb preset behaves, that explicit values override preset minimums, and which parameters are workspace-only. It does not explicitly route the agent away from overlapping tools such as set_keepouts or set_zones, so it stops short of full alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_keepoutsKeepout areasAInspect
Add or remove keepout rule areas. Each keepout is a rect or polygon on the given copper layers (default all) and forbids what it names: no_tracks, no_vias, no_zone_fills (all three default true), no_pads, no_footprints. route_board keeps tracks and vias out of them and KiCad DRC enforces them. remove takes names (wildcards allowed).
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | ||
| remove | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a non-read-only, non-destructive, closed-world mutation. The description adds meaningful context beyond that: default layer coverage, default boolean rule values, interaction with route_board and KiCad DRC, and wildcard support for removal. It does not fully explain what happens to existing keepout definitions on removal, but the annotation bar is lower here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences front-load the operation and then add only necessary detail about geometry, defaults, enforcement, and removal. Every sentence carries useful information, and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with no output schema, the description covers the core operations, default semantics, and enforcement behavior well enough to invoke it correctly. It does not discuss return values or job-follow-up behavior, though wait_s is explained in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, but the description compensates for several undocumented fields by explaining layer defaults, the default-true behavior of no_tracks/no_vias/no_zone_fills, and wildcard support for the remove/name fields. The remaining parameters (design_id, wait_s) are already described in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact operation (add or remove), the resource (keepout rule areas), and defines what a keepout is, including its rect/polygon shape and layer scope. It is clearly distinct from zone-setting siblings in substance, though it does not explicitly name a sibling to contrast with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the two modes (add, remove) and notes that remove accepts wildcards. However, it gives no explicit when-to-use guidance versus alternatives such as set_zones, nor any when-not-to-use conditions, leaving the agent to infer routing constraints and DRC enforcement as the rationale.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_silkscreenTidy the silkscreenAInspect
Take clutter off the silkscreen. values "hide" (default) hides value and part-number fields; references "keep" (default), "fab" (moved to the fabrication layer) or "hide"; texts "fab" moves footprint texts off the silkscreen. run_drc's silk_overlap and silk_over_copper warnings count what is left.
| Name | Required | Description | Default |
|---|---|---|---|
| texts | No | ||
| values | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| references | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare that this is not read-only and not destructive; the description goes further by stating what actually changes — value/part-number fields hidden, references moved to the fab layer or hidden, footprint texts moved off the silkscreen. That is the mutation context an agent needs. It says nothing about reversibility or permissions, but the annotations carry the safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and the rest is a compact parameter walkthrough with no filler. The clipped phrasing ("values "hide" (default) hides...") is dense to the point of being slightly telegraphic, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with no output schema and 40% schema coverage, the description covers the enum options and references async job follow-up via run_drc results, but never states what the tool returns when executed or how to interpret a "running" status here. Adequate, with a visible gap around outcome reporting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, so the description must compensate, and it does: it names the three enum parameters and their defaults (values="hide", references="keep", texts="fab"). It omits that values also accepts "show", and leaves wait_s entirely to the schema's own description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a concrete verb and resource ("Take clutter off the silkscreen") and the parameter walkthrough makes it clear this manipulates value/reference/text fields. It does not, however, name or distinguish itself from the nearest siblings such as stamp_silkscreen or tidy_copper, so an agent must infer the split.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies defaults for each option and points at run_drc's silk_overlap/silk_over_copper warnings as the way to check what remains, which implies a clean-then-verify workflow. There is no explicit when-to-use versus stamp_silkscreen or tidy_copper, and no statement of prerequisites or when not to run it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_zonesCopper zonesAInspect
Add or remove copper zones (pours). Each zone pours its net on the given copper layers over rect or polygon, by default the whole board outline. priority orders overlapping zones (higher fills first); clearance_mm and min_thickness_mm override the rules; thermal false connects pads solid. remove takes zone or net names (wildcards allowed) and never touches keepout areas. Run fill_zones afterwards, then run_drc.
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | ||
| remove | No | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the generic safety profile; the description adds real behavior: default zone extent is the whole board outline, priority orders overlapping fills, clearance_mm/min_thickness_mm override design rules, and thermal=false solid-connects pads. It also discloses remove matching semantics (zone or net names, wildcards) and its keepout exclusion. Missing only return/result shape and failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then packed detail in compact clauses; every sentence carries information. The semicolon-chained phrasing is dense and takes a second pass to parse, costing a point versus a cleanly broken-out structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested-array mutation tool with no output schema, the description covers creation shape, defaults, ordering rules, overrides, and post-steps. It does not say whether added zones merge with or replace existing ones, nor what the response contains, which are the remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 50% schema coverage, the description usefully explains the semantics of priority, clearance_mm, min_thickness_mm, thermal, and the net/layers/rect/polygon fields — meaning well beyond their bare types. However, name, design_id, and wait_s are left entirely to the schema, so it does not fully compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb pair and resource: 'Add or remove copper zones (pours).' It then scopes the operation (net poured on given copper layers, over rect or polygon, defaulting to the whole board outline), which clearly separates it from add_copper, set_keepouts, and tidy_copper.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit workflow ordering — 'Run fill_zones afterwards, then run_drc' — and states a boundary condition ('remove ... never touches keepout areas'), implicitly routing keepout edits to set_keepouts. It does not say when to prefer this over add_copper for simple copper shapes, but the sequencing context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stamp_silkscreenStamp silkscreenAInspect
Silkscreen stamps for release, both off unless asked for: a small spec badge ("routed with Koppar", optionally the title, revision and part count) in the largest free patch of the front or back silk, and JLCPCB's JLCJLCJLCJLC placeholder on the back silk so their order number is printed there, not on the front. Free means clear of pads, mask openings, other silk, courtyards, holes and the edge. KiCad's DRC is run before and after and a stamp that changes any count is taken off again.
| Name | Required | Description | Default |
|---|---|---|---|
| badge | No | Place the spec badge (default false). | |
| parts | No | Part count for the badge; counted from the board when unset. | |
| title | No | Board title for the badge's second line. | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| revision | No | Revision for the badge ("rev B"). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| badge_side | No | Silk side for the badge; the larger free patch when unset. | |
| jlc_order_number | No | Place JLCJLCJLCJLC on the back silk (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It adds substantial behavioral detail beyond annotations: DRC is run before and after, a stamp that changes any DRC count is removed, 'free' is defined against pads/mask/silk/courtyards/holes/edge, and the JLC placeholder is restricted to back silk. This is exactly the kind of mutation and rollback context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded and every sentence contributes: default behavior, badge contents, placement constraints, JLC behavior, and DRC safety. Nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with no output schema, it covers the key action, defaults, placement rules, and safety behavior. It relies on the schema's wait_s text for job-follow-up behavior rather than restating it, which is reasonable, though return/status expectations are not fully elaborated in the description itself.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter. The description still adds meaning by explaining what the badge contains, what the JLC placeholder is for, and what 'free' means for placement side.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: stamping two kinds of release silkscreen marks. It clearly describes the badge and JLC placeholder, but does not explicitly distinguish this tool from the sibling set_silkscreen.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes the release context and states that both stamps are off by default unless requested. However, it does not explicitly say when to use set_silkscreen or cleanup_board instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_boardPlace and route the boardAInspect
Start place and route with your board plan (the JSON object from the board guide: board, stated, edge, chain, groups, near, side, fixed, keepouts, netClasses). The plan is clamped and returned as applied. Runs for minutes in the background: follow it with get_board_status. Needs an accepted schematic; one board run per design at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| plan | No | The board plan object. Omit for the default plan. | |
| design_id | Yes | The design id returned by create_design or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this is a non-read-only, non-destructive, closed-world operation. The description adds real value beyond that: it runs for minutes in the background, the plan is clamped and returned as applied, it requires an accepted schematic, and only one run per design is allowed at a time. Concurrency and duration details are exactly the kind of context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, each front-loaded with the action or the key constraint (prerequisite, follow-up tool, concurrency limit). No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still covers prerequisites, runtime behavior, the returned/clamped plan, and the follow-up status tool, which is solid for a complex two-param job tool. It could do slightly more on what 'clamped' means or how failures surface, but nothing essential for invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description goes further by enumerating the plan object's expected keys (board, stated, edge, chain, groups, near, side, fixed, keepouts, netClasses) and clarifying it comes from the board guide and is clamped. That adds structure the generic schema description ('the board plan object') does not carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (start place and route) and identifies the input (the board plan). It distinguishes itself implicitly from siblings like route_board and auto_place by being the combined place-and-route kickoff, but never explicitly contrasts with them, leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: needs an accepted schematic, one board run per design at a time, and directs the agent to follow up with get_board_status. It stops short of naming alternative tools (route_board, auto_place) or stating when not to use this one, so no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_circuitSubmit the schematicAInspect
Compile and check a complete SKiDL script: the symbol and footprint pre-flight (unambiguous typos are corrected and listed), SKiDL, the ERC score, KiCad ERC, floating subsystems, parts without a footprint, and supplier sourcing. Returns accepted plus blocking findings to fix and warnings. An accepted script becomes the design's circuit.py; one that is sent back is kept as attempt_N_circuit.py and leaves the design as it was. Takes up to a couple of minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The complete SKiDL Python script. | |
| design_id | Yes | The design id returned by create_design or list_designs. | |
| check_sourcing | No | Check the parts against supplier catalogues (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true). The description adds context the annotations cannot: the successful path overwrites circuit.py, the rejected path is preserved as attempt_N_circuit.py and leaves the design untouched, sourcing makes network calls, and the run can take minutes. That is exactly the state-change, failure-mode and latency disclosure the annotations omit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the check list are front-loaded, and every clause carries information (checks performed, return shape, file outcomes, runtime). The long enumerative sentence is dense but justified; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return burden and does so adequately: 'Returns accepted plus blocking findings to fix and warnings.' For a mutating, open-world compile step the failure/persistence semantics and latency are also covered. Only the precise findings structure is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents design_id, code and check_sourcing, including formats and defaults. The description mentions supplier sourcing among the checks, loosely implying check_sourcing, but adds no syntax or semantics beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-and-resource pair ('Compile and check a complete SKiDL script') and then enumerates exactly what is checked: symbol/footprint pre-flight, SKiDL, ERC score, KiCad ERC, floating subsystems, missing footprints, supplier sourcing. This clearly separates it from siblings like edit_circuit (incremental edits) or check_net_rules (board-level rules).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: this is the full-script submission/validation gate, and the 'takes up to a couple of minutes' note hints it is the heavyweight option versus edit_circuit. However, no sibling is named and there is no explicit when-not guidance (e.g. use edit_circuit for small tweaks), so the agent must infer routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
swap_footprintSwap footprintsAInspect
Replace footprints in place with another footprint from a library in the project's fp-lib-table (library:name): the reference, value, position, rotation (or rot_deg), side, lock and schematic link stay, and nets move pad by pad. pad_map maps a NEW pad number to the OLD pad whose net it takes, for packages numbered differently. The schematic symbols' Footprint fields are updated too. Reports new pads left without a net and old nets left behind.
| Name | Required | Description | Default |
|---|---|---|---|
| swaps | Yes | ||
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (non-readOnly, non-destructive, closed-world), the description discloses exactly what is preserved, that nets are transferred pad by pad, that schematic Footprint fields are rewritten as a side effect, and that leftovers are reported — much of the safety-relevant context. It omits failure modes (footprint not found in fp-lib-table, unknown refs) and async/job follow-up behavior, which lives in the wait_s schema field rather than the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Tightly front-loaded with the core action first, then preservation guarantees, then pad_map semantics and reporting. The long single sentence carries a lot of clauses but every one adds information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does state what the tool reports (pads left without a net, old nets left behind), which covers the return-value burden, and async handling is documented in the wait_s parameter. Minor gap: no mention of what happens on partial failure or if a footprint is missing from the library.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the description compensates by explaining the non-obvious semantics of pad_map (NEW pad → OLD pad whose net it takes) and clarifying that rot_deg is the rotation control, plus the library:name format for footprint. refs and the wait_s async behavior are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (replace/swap), specific resource (footprints), and explicit source constraint (a library in the project's fp-lib-table, addressed as library:name). It is clearly distinguishable from siblings like place_footprints and add_custom_footprint because it is an in-place swap that preserves the existing placement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: use pad_map 'for packages numbered differently', and it spells out the conditions under which this tool is the right choice (ref, value, position, rotation, side, lock and schematic link must survive). It stops short of naming an explicit alternative or a when-not-to-use condition versus place_footprints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tidy_copperTidy the copperADestructiveInspect
After routing: every run redrawn as the fewest 0/45/90-degree segments that clear, and every track narrower than its net's netclass width widened where it fits (slid sideways, bumped around a lone obstacle, or necked only over the stretch that needs it; a via or thin track of another net moved aside when that is all that is in the way). No via is added or removed; a change that would split a pour is undone, and the board is kept only if KiCad counts nothing worse.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, so the safety class is known, yet the description still adds substantive behavior: no vias are added or removed, changes that would split a pour are rolled back, and the board is kept only if the DRC count does not worsen. Those rollback and acceptance criteria are exactly the kind of transactional detail an agent cannot get from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The 'After routing:' lead front-loads the trigger, and the parenthetical enumerates the widening strategies efficiently. It is a single very dense sentence with heavy semicolons and parentheses, which is a slight readability cost, but virtually no clause is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers what changes, what is deliberately left alone (vias), what is reverted (pour splits), and the acceptance condition. Combined with a fully documented schema, an agent has enough to invoke it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (design_id, wait_s) are documented in-schema, including the job-polling follow-up via get_board_job. The description adds no parameter-level meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete transformations precisely: re-drawing runs as the fewest 0/45/90-degree segments and widening tracks below their netclass width. That is far more specific than the title 'Tidy the copper', but it never distinguishes itself from siblings such as cleanup_board, widen_nets, or polish_vias, which an agent may reasonably consider equivalent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'After routing:' implies the sequencing context, which is a genuine usage cue. However, there is no explicit statement of when to prefer this over widen_nets or cleanup_board, nor any exclusion such as 'do not run before fill_zones' — the agent must infer placement in the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tie_rail_padsTie plane-net pads togetherAInspect
Tie neighbouring same-net SMD pads of the plane nets (GND, the rails with a pour) together on their own layer with short tracks, so a group shares one via to the plane instead of one via per pad, as a designer does. A tie is placed only where it misses every other net's pad, its tracks and vias, and the board edge. Before routing: route afterwards with preserve_existing (the default). After routing and prune_vias: run prune_vias on those nets again.
| Name | Required | Description | Default |
|---|---|---|---|
| nets | No | Nets to tie (default: every net that has a pour). | |
| layers | No | Copper layers to tie on (default F.Cu and B.Cu). | |
| max_mm | No | Longest tie (default 2.5). | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| width_mm | No | Tie track width (default: the board's current track width). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| avoid_copper | No | Treat other nets' tracks and vias as obstacles (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only but non-destructive, closed-world mutation; the description adds the key behavioral fact that geometry is collision-checked against other nets, tracks, vias, and the board edge, so the agent knows this is an additive, obstacle-avoiding edit. It does not discuss reversibility (e.g., undoing via ripup_routing) or what happens on partial failure, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and its rationale, then safety, then workflow. The first sentence is long and clause-heavy but every clause carries information an agent needs; nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, no-output-schema board mutation, the description covers purpose, safety constraint, and pipeline ordering, which is the bulk of what is needed. It leaves out any expectation about the returned report (e.g., how many ties were placed) and defers async job behavior entirely to the wait_s schema text.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so defaults and bounds for nets, layers, max_mm, width_mm, avoid_copper, and wait_s are already documented. The description adds conceptual framing (what a 'tie' is and why it exists) but no syntax, unit, or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource — tie neighbouring same-net SMD pads of plane nets together on their own layer with short tracks — and adds the design intent (one shared via per group instead of one per pad). This is clearly distinguishable from siblings like prune_vias, route_board, and fill_zones even though none are named as substitutes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit pipeline placement: run before routing and then route with preserve_existing (the default), or run after routing/prune_vias and re-run prune_vias on those nets. It also states a hard precondition for placement — a tie is only placed where it misses every other net's pad, tracks, vias, and the board edge.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_board_from_netlistUpdate the board from a changed netlistAInspect
Bring a routed board to a changed circuit and keep every track that is still right: what KiCad calls Update PCB from Schematic, then the routing. New parts go on the board (place: a connector on an edge, the board grown when there is no room, the rest in free room near what they connect to; placements for exact poses), moved or re-netted pads lose only the branch of copper that led to them, copper a new part lands on goes, and only what is open is routed, with the rules read off the board. The answer says how many tracks and vias were kept, ripped and added, what is still open, and the errors that touch the change. A route that takes copper off the rip list is refused and the board stays.
| Name | Required | Description | Default |
|---|---|---|---|
| place | No | New parts without a pose yet, and where they should go. | |
| remove | No | Parts that leave the board. Parts in no netlist (a logo, a fiducial) stay otherwise. | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| netlist | Yes | The new KiCad netlist, as text. | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. | |
| placements | No | Reference -> exact pose, for new parts and parts that move. | |
| time_budget_s | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare destructiveHint=false, but the description says moved or re-netted pads lose copper, copper under a new part is removed, and tracks/vias are ripped. That is a direct contradiction with the destructive hint, so behavioral transparency is scored 1 despite the otherwise detailed disclosure of placement, rip, retention, and refusal behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads the action and the description is information-dense without marketing filler. The middle sentence is a long, clause-heavy run-on, so it is effective but not maximally clean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation with no output schema, the description covers the placement strategy, copper preservation and removal, rip-list refusal, job behavior via wait_s, and the summary counts returned. Combined with the schema descriptions for netlist, design_id, remove, and wait_s, an agent has enough to call it correctly apart from the contradictory destructive annotation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 86%, so the schema already documents most parameters. The description still adds real semantics for placement behavior—edge placement, board growth, free-room-near-connections, and exact placements—and clarifies the rip-list interaction beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: bringing a routed board to a changed circuit/netlist, mapped to KiCad's Update PCB from Schematic plus routing. It also scopes the operation to only open copper, which distinguishes it from a full routing run.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes the triggering context of a changed circuit/netlist and explains that correct existing tracks are retained, implying this is the update path rather than a fresh route. It does not explicitly name route_board or ripup_routing as alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_boardUpload a boardAInspect
Replace the design's board with a .kicad_pcb you routed or edited yourself (the file, base64). The board must carry the design's circuit: every schematic part by reference, every pad on the net the netlist gives it; a footprint swap is allowed and recorded. Anything else is refused with the list of differences and nothing changes. The previous board is kept as circuit.before-upload.kicad_pcb. KiCad DRC judges the new board and releases or withholds the Gerbers, and the session chat gets a note of the upload. Not for a board workspace (import_kicad_project): its board tools edit the board in place.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | What was done to the board, for the session chat. | |
| design_id | Yes | The design id returned by create_design or list_designs. | |
| board_base64 | No | The .kicad_pcb file, base64 (or give workspace_id). | |
| rules_base64 | No | The .kicad_dru beside the board, base64. | |
| workspace_id | No | A board workspace of yours (import_kicad_project, e.g. one made from this design with from_design_id): its board, project rules and .kicad_dru are taken from there, no download and upload. | |
| project_base64 | No | The .kicad_pro beside the board, base64: its design rules and net classes judge the board (without it the design keeps its own). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are generic (readOnlyHint=false, destructiveHint=false) and the description adds the real behavioral profile: validation against the netlist, refusal with a difference list and no change on mismatch, footprint swaps allowed and recorded, prior board preserved as circuit.before-upload.kicad_pcb, DRC gating Gerber release, and a chat note. This is exactly the kind of side-effect and failure-mode disclosure that annotations cannot carry, and it is consistent with destructiveHint=false since the prior board is archived.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense and front-loaded: the action and input come first, then constraints, side effects, and the sibling exclusion. Every clause carries content, though the long semicolon-chained sentences make it slightly heavy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers what an agent needs: inputs, validation behavior, failure output (difference list), preserved artifacts, downstream DRC/Gerber consequences, and the alternative tool. Nothing material is missing for a mutation tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented in the schema (including the board_base64/workspace_id alternative). The description corroborates ('the file, base64') and implies relationships (circuit must match the netlist, footprint swap allowed) but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replace the design's board with a .kicad_pcb you routed or edited yourself') and explicitly names the sibling it is not (import_kicad_project). An agent can distinguish it from the many board-editing siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit exclusion with the alternative: 'Not for a board workspace (import_kicad_project): its board tools edit the board in place.' It also states the precondition that the board must carry the design's circuit, so the when/when-not conditions are fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
widen_netsWiden power nets in placeAInspect
Grow the tracks (and optionally vias) of the named nets in place, each as wide as its clearance to every other net's copper, holes and the board edge allows, up to the net's target width. Nothing moves and no via is added, so the score does not change. Routers neck power down to the signal width wherever the class width did not fit their grid; most necks have room around them. List the heaviest current first: earlier nets take the room. Pours are refilled after each net and a widening that leaves the board less connected is backed out. The result names what still holds each remaining neck (a neighbour to move or reroute).
| Name | Required | Description | Default |
|---|---|---|---|
| nets | Yes | Net -> target track width in mm. | |
| vias | No | Net -> [diameter_mm, drill_mm] sizes to try, largest first; a via only ever grows. | |
| guard | No | Refill pours and back out widenings that disconnect anything (default true). | |
| necks | No | How many remaining necks to report per net (default 12). | |
| wait_s | No | Seconds to wait for the job (default 55). A job still running comes back with status "running": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage). | |
| design_id | Yes | The design id returned by import_kicad_project or list_designs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations, the description adds substantial behavioral detail: no movement or added vias, score unchanged, pours refilled after each net, disconnected widenings backed out, and remaining necks reported. This goes well beyond the readOnly/destructive/openWorld annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the action and tightly organized: purpose, constraint, rationale, ordering advice, guard behavior, and result reporting. Every sentence contributes useful operational context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter mutation tool with no output schema, the description covers the important behavior: in-place widening, optional vias, guard/backout semantics, pour refill, ordering, and what the result reports. Nothing critical is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameter semantics are already well supplied by the schema, including nets, vias, guard, necks, wait_s, and design_id. The description adds usage ordering for nets but little parameter-level syntax beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: "Grow the tracks (and optionally vias) of the named nets in place." It also distinguishes the operation from routing-like siblings by stating "Nothing moves and no via is added" and explains the intended power-net necking context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operating context (routers neck power down; most necks have room) and an explicit ordering rule: "List the heaviest current first: earlier nets take the room." It does not explicitly name sibling alternatives or when not to use it, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
- Changed
finish_board1 field changed- removed
Input schema / properties / routerRemoved value: -{ - "enum": [ - "ml", - "ts" - ], - "type": "string" -}
- Changed
polish_vias1 field changed- removed
Input schema / properties / routerRemoved value: -{ - "enum": [ - "ml", - "ts" - ], - "type": "string" -}
- Changed
repair_board1 field changed- removed
Input schema / properties / routerRemoved value: -{ - "enum": [ - "ts", - "ml" - ], - "type": "string" -}
- Changed
route_board6 fields changed- removed
Input schema / properties / fewest_viasRemoved value: -{ - "description": "Router \"negotiated\": the fine-grid router alone with its via phase (every net rerouted at 3x the via price and settled again): fewer vias, 2-3x the time.", - "type": "boolean" -} - removed
Input schema / properties / grid_mmRemoved value: -{ - "maximum": 0.5, - "minimum": 0.025, - "type": "number" -} - removed
Input schema / properties / negotiation_roundsRemoved value: -{ - "maximum": 6, - "minimum": 1, - "type": "integer" -} - changed
Input schema / properties / router / descriptionPrevious value: -"Unset: the full pipeline (above) on the whole board, \"ml\" for nets. \"ml\": the learned router service alone, 1 to 8 layers; the time budget is its deadline. Nets outside the nets scope, and with preserve_existing the nets their copper already connects, keep that copper and everything else is routed around it (partial copper of a routed net is replaced). \"ts\": the local router, also the fallback when the service fails; pours/via_cost/grid_mm/negotiation_rounds apply to it only. \"negotiated\": PathFinder over every net at once, gridless on a coarse routing graph, the fine grid for the last open nets (the whole board from scratch, nets must be unset; GND routed as a net under its pour, then pruned). Minutes (its budget is 1800 s unless time_budget_s is given) but it closes dense boards the service leaves open. Follow with tidy_copper."New value: +"Unset: the full pipeline (above) on the whole board, \"ml\" for nets. \"ml\": the learned router service alone, 1 to 8 layers; the time budget is its deadline. Nets outside the nets scope, and with preserve_existing the nets their copper already connects, keep that copper and everything else is routed around it (partial copper of a routed net is replaced)." - changed
Input schema / properties / router / enumPrevious value: -[ - "ts", - "ml", - "negotiated" -]New value: +[ + "ml" +] - removed
Input schema / properties / via_costRemoved value: -{ - "maximum": 50, - "minimum": 0, - "type": "number" -}
1 tool update
- Changed
import_kicad_project1 field changed- changed
Input schema / properties / brief / descriptionPrevious value: -"What the user wants done with the board, for the design record."New value: +"A note for the design record. No tool reads it: what to keep, widths and layers go in the options of set_design_rules and route_board."
1 tool update
- Added
update_board_from_netlist
3 tool updates
- Changed
create_design2 fields changed- added
Input schema / properties / new_projectAdded value: +{ + "description": "Start a new project even when one with this title exists.", + "type": "boolean" +} - added
Input schema / properties / session_idAdded value: +{ + "description": "The project (web session) to put this design in: the session_id an earlier design of this board returned. Without it, a design whose title matches a project you opened before joins that project.", + "pattern": "^[A-Za-z0-9_-]{8,80}$", + "type": "string" +}
- Changed
import_kicad_project2 fields changed- added
Input schema / properties / new_projectAdded value: +{ + "description": "Start a new project even when one with this title exists.", + "type": "boolean" +} - added
Input schema / properties / session_idAdded value: +{ + "description": "The project (web session) a new revision of this board goes into: the session_id the first import returned. Without it, an import whose title matches a project you opened before joins that project, so revisions of one board stay together in the user's list.", + "pattern": "^[A-Za-z0-9_-]{8,80}$", + "type": "string" +}
- Added
leave_feedback
2 tool updates
- Removed
board_census - Removed
score_board
1 tool update
- Changed
set_design_rules2 fields changed- changed
Input schema / properties / stackup / descriptionPrevious value: -"JLCPCB's 4-layer 1.6 mm impedance stackups, written into the board: 7628 (0.21 mm prepreg, their default) or 3313 (0.1 mm prepreg: thinner pairs for the same impedance). Needed before a net class states diff_impedance_ohm."New value: +"1.6 mm impedance stackups, written into the board: JLCPCB's 4-layer 7628 (0.21 mm prepreg, their default) or 3313 (0.1 mm prepreg: thinner pairs for the same impedance), and 6- / 8-layer 3313 builds (approximations of the fab's, from its 3313 outer prepreg and human 1.6 mm boards). Needed before a net class states diff_impedance_ohm." - changed
Input schema / properties / stackup / enumPrevious value: -[ - "JLC04161H-7628", - "JLC04161H-3313" -]New value: +[ + "JLC04161H-7628", + "JLC04161H-3313", + "KOPPAR-6L-1.6-3313", + "KOPPAR-8L-1.6-3313" +]
35 tool updates
- Changed
add_copper1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
anneal_place1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
auto_place1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
board_census1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
bridge_islands1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
check_net_rules1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
check_physics1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
cleanup_board1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
couple_pairs1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
diagnose_open_nets1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
export_step1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
fill_zones1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
finish_board1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
get_board_info1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
get_board_job1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
place_footprints1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
polish_vias1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
prune_vias1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
render_board1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
repair_board1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
restore_board_revision1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
ripup_routing1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
route_board1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
run_drc1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
score_board1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
set_board_outline1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
set_design_rules1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
set_keepouts1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
set_silkscreen1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
set_zones1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
stamp_silkscreen1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
swap_footprint1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
tidy_copper1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
tie_rail_pads1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
- Changed
widen_nets1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot; route_board's pipeline goes on from its last finished stage)."
4 tool updates
- Changed
get_bom1 field changed- added
Input schema / properties / tierAdded value: +{ + "description": "JLCPCB PCBA tier to source for, kept with the design. 'economic' swaps Standard-only parts for Economic-eligible ones that match as well; default 'standard' (no filter). The BOM reports which parts decide the tier either way.", + "enum": [ + "economic", + "standard" + ], + "type": "string" +}
- Changed
repair_board1 field changed- added
Input schema / properties / compactAdded value: +{ + "description": "Via choice as on route_board: true for the densest legal via (JLCPCB Kelvin test), false for the Kelvin-free 0.45/0.2.", + "type": "boolean" +}
- Changed
route_board1 field changed- added
Input schema / properties / compactAdded value: +{ + "description": "true: the densest via the rules allow (0.4/0.2), which JLCPCB prices with a mandatory 4-wire Kelvin test (~$40 per order); false: never below the Kelvin-free 0.45/0.2. Unset: compact only on a board with an area-array package or vias in pads.", + "type": "boolean" +}
- Added
stamp_silkscreen
2 tool updates
- Changed
anneal_place1 field changed- added
Input schema / properties / nearAdded value: +{ + "description": "Keep ref at its anchor (a decoupling capacitor at its IC, a crystal at its MCU): the board plan's near constraint, as a strong pull in the anneal.", + "items": { + "properties": { + "anchor": { + "maxLength": 40, + "type": "string" + }, + "maxMm": { + "exclusiveMinimum": 0, + "type": "number" + }, + "ref": { + "maxLength": 40, + "type": "string" + } + }, + "required": [ + "ref", + "anchor" + ], + "type": "object" + }, + "maxItems": 1000, + "type": "array" +}
- Added
consolidate_bom_basic
40 tool updates
- Changed
add_copper1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Added
add_custom_footprint - Changed
anneal_place2 fields changed- added
Input schema / properties / fixed / descriptionAdded value: +"Parts held at these origin positions; they are moved there on the board first." - changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
auto_place1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
board_census1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
bridge_islands1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
check_net_rules1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
check_physics1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
cleanup_board1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
couple_pairs1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Added
delete_design - Changed
diagnose_open_nets1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
export_step1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
fill_zones1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
finish_board1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
get_board_info1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
get_board_job1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
import_kicad_project2 fields changed- added
Input schema / properties / from_design_idAdded value: +{ + "description": "A design of yours with a board (start_board or upload_board): its KiCad project becomes the workspace. Instead of zip_base64.", + "pattern": "^[A-Za-z0-9_-]{8,80}$", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "zip_base64" -]
- Changed
list_designs1 field changed- added
Input schema / properties / trashedAdded value: +{ + "description": "List the trash instead of the live designs.", + "type": "boolean" +}
- Changed
place_footprints1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
polish_vias1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
prune_vias1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
render_board1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
repair_board1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
restore_board_revision1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Added
restore_design - Changed
ripup_routing1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
route_board1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
run_drc1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
score_board1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
set_board_outline1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
set_design_rules1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
set_keepouts1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
set_silkscreen1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
set_zones1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
swap_footprint1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
tidy_copper1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
tie_rail_pads1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
- Changed
upload_board5 fields changed- changed
Input schema / properties / board_base64 / descriptionPrevious value: -"The .kicad_pcb file, base64."New value: +"The .kicad_pcb file, base64 (or give workspace_id)." - added
Input schema / properties / project_base64Added value: +{ + "description": "The .kicad_pro beside the board, base64: its design rules and net classes judge the board (without it the design keeps its own).", + "maxLength": 24000000, + "type": "string" +} - added
Input schema / properties / rules_base64Added value: +{ + "description": "The .kicad_dru beside the board, base64.", + "maxLength": 24000000, + "type": "string" +} - added
Input schema / properties / workspace_idAdded value: +{ + "description": "A board workspace of yours (import_kicad_project, e.g. one made from this design with from_design_id): its board, project rules and .kicad_dru are taken from there, no download and upload.", + "pattern": "^[A-Za-z0-9_-]{8,80}$", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "design_id", - "board_base64" -]New value: +[ + "design_id" +]
- Changed
widen_nets1 field changed- changed
Input schema / properties / wait_s / descriptionPrevious value: -"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job."New value: +"Seconds to wait for the job (default 55). A job still running comes back with status \"running\": follow it with get_board_job. A job is allowed the time its budget asks for (time_budget_s, total_budget_s, rounds), and survives a server restart (the op starts over from its snapshot)."
2 tool updates
- Changed
anneal_place3 fields changed- changed
Input schema / properties / edge / additionalProperties / patternPrevious value: -"^(left|right|top|bottom)(@-?\\d+(\\.\\d+)?)?$"New value: +"^(left|right|top|bottom)(@\\d+(\\.\\d+)?)?$" - changed
Input schema / properties / edge / descriptionPrevious value: -"Connector ref to the edge it sits on, optionally @overhang_mm of its body past the edge (default 0.5)."New value: +"Connector ref to the edge it sits on, optionally @mm: where along that edge its centre goes, from the outline's top-left corner (x on top/bottom, y on left/right) — the same meaning as in auto_place and a board plan. A fixed or locked ref keeps its pin." - added
Input schema / properties / edge_overhang_mmAdded value: +{ + "additionalProperties": { + "maximum": 5, + "minimum": 0, + "type": "number" + }, + "description": "Per edge ref, how far its body sits past the edge: default 0.5 for a USB/barrel/jack connector (at most its 1.2 mm lip), 0 (flush) for anything else, which may not overhang.", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Changed
auto_place1 field changed- added
Input schema / properties / edge / descriptionAdded value: +"Ref to the edge it sits on, optionally @mm: where along that edge its centre goes, from the outline's top-left corner (x on top/bottom, y on left/right)."
1 tool update
- Changed
route_board3 fields changed- changed
Input schema / properties / router / descriptionPrevious value: -"\"ml\" (default): the learned router service, 1 to 8 layers; the time budget is its deadline. Nets outside the nets scope, and with preserve_existing the nets their copper already connects, keep that copper and everything else is routed around it (partial copper of a routed net is replaced). \"ts\": the local router, also the fallback when the service fails; pours/via_cost/grid_mm/negotiation_rounds apply to it only. \"negotiated\": PathFinder over every net at once, gridless on a coarse routing graph, the fine grid for the last open nets (the whole board from scratch, nets must be unset; GND routed as a net under its pour, then pruned). Minutes (its budget is 1800 s unless time_budget_s is given) but it closes dense boards the service leaves open. Follow with tidy_copper."New value: +"Unset: the full pipeline (above) on the whole board, \"ml\" for nets. \"ml\": the learned router service alone, 1 to 8 layers; the time budget is its deadline. Nets outside the nets scope, and with preserve_existing the nets their copper already connects, keep that copper and everything else is routed around it (partial copper of a routed net is replaced). \"ts\": the local router, also the fallback when the service fails; pours/via_cost/grid_mm/negotiation_rounds apply to it only. \"negotiated\": PathFinder over every net at once, gridless on a coarse routing graph, the fine grid for the last open nets (the whole board from scratch, nets must be unset; GND routed as a net under its pour, then pruned). Minutes (its budget is 1800 s unless time_budget_s is given) but it closes dense boards the service leaves open. Follow with tidy_copper." - added
Input schema / properties / time_budget_s / descriptionAdded value: +"The full pipeline's wall-clock cap (default 1200), or a single route's budget (default 120, up to 900)." - changed
Input schema / properties / time_budget_s / maximumPrevious value: -900New value: +1500
1 tool update
- Changed
create_custom_symbol4 fields changed- changed
Input schema / properties / footprint / descriptionPrevious value: -"A 'Library:Footprint' from search_kicad_footprint."New value: +"A 'Library:Footprint' from search_kicad_footprint. Required for 3+ pins unless footprint_mod is given." - added
Input schema / properties / footprint_modAdded value: +{ + "description": "Your own footprint: the full text of a .kicad_mod file, starting with '(footprint'. Its pad numbers must match the pin numbers.", + "maxLength": 1000000, + "minLength": 20, + "type": "string" +} - changed
Input schema / properties / name / descriptionPrevious value: -"Part number, used as the symbol name."New value: +"Part number, used as the symbol name (letters, digits, _ . + -)." - changed
Input schema / requiredPrevious value: -[ - "design_id", - "name", - "footprint", - "pins" -]New value: +[ + "design_id", + "name", + "pins" +]
61 tool updates
- First observed
add_copper - First observed
add_project_files - First observed
anneal_place - First observed
auto_place - First observed
board_census - First observed
bridge_islands - First observed
check_net_rules - First observed
check_physics - First observed
choose_bom_part - First observed
cleanup_board - First observed
couple_pairs - First observed
create_custom_symbol - First observed
create_design - First observed
diagnose_open_nets - First observed
edit_circuit - First observed
export_step - First observed
fill_zones - First observed
finish_board - First observed
get_board_context - First observed
get_board_info - First observed
get_board_job - First observed
get_board_status - First observed
get_bom - First observed
get_design - First observed
get_downloads - First observed
get_fab_status - First observed
get_kicad_symbol - First observed
get_order_price - First observed
get_review_packet - First observed
get_workflow_guide - First observed
import_kicad_project - First observed
list_board_revisions - First observed
list_designs - First observed
list_order_providers - First observed
place_footprints - First observed
polish_vias - First observed
prune_vias - First observed
read_design_file - First observed
render_board - First observed
repair_board - First observed
restore_board_revision - First observed
ripup_routing - First observed
route_board - First observed
run_drc - First observed
save_dossier - First observed
score_board - First observed
search_kicad_footprint - First observed
search_kicad_symbol - First observed
send_order_to_provider - First observed
set_board_outline - First observed
set_design_rules - First observed
set_keepouts - First observed
set_silkscreen - First observed
set_zones - First observed
start_board - First observed
submit_circuit - First observed
swap_footprint - First observed
tidy_copper - First observed
tie_rail_pads - First observed
upload_board - First observed
widen_nets
Publisher details
- Operator
- Koppar
- Operator website
- https://koppar.ai
- Vendor relationship
- First-party
- Documentation
- https://docs.koppar.ai
- Trust center
- Not available
- Restrictions
- 3 free runs, then a custom API Key is required.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRemote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.MIT
- AlicenseCqualityCmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs112 npm29 PyPIMIT
- AlicenseAqualityDmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1623 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.