Koppar
REMOTE · APP.KOPPAR.AI
Design a KiCad PCB from a prompt: parts, schematic checks, routing, KiCad DRC and Gerbers.
Available components
Last scanned (1 hour ago)
Scores higher than 89% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Developer Tools
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security89
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, but the challenge carries no valid RFC 9728 metadata, so a client cannot discover where to get a token. See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability72
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 17820 tokens (~274/item across 65 items; 65 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management57
- Stability check failed: schema churn in the 18 days we've observed: 2 tool removals, 0 breaking changes, 0 auth/transport breaks, 6 additions. See how to fix → Fail
Tool Coverage90
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 71% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 66 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 53 to 57.
- 3 Nov 26 +1
- New tool “leave_feedback” functional
- “create_design” added an optional parameter “new_project” cosmetic
- “create_design” added an optional parameter “session_id” cosmetic
- “import_kicad_project” added an optional parameter “new_project” cosmetic
- “import_kicad_project” added an optional parameter “session_id” cosmetic
- 1 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 40 to 43.
- 31 Oct 26 0
- The server rewrote its instructions, which are the text every model session reads security
- 30 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 33 to 37.
- 27 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 23 to 27.
- 26 Oct 26 0
- Stability: 0.23 → fail ▼ security
- A breaking change shipped without a version bump: still 0.1.0 ▼ security
- Tool “board_census” was removed ▼ security
- Tool “score_board” was removed ▼ security
- The server rewrote its instructions, which are the text every model session reads security
- Tool “prune_vias” rewrote its description, which is the text the model reads security
- “set_design_rules” reworded the description of “stackup” cosmetic
- 25 Oct 26 0
- “add_copper” reworded the description of “wait_s” cosmetic
- “anneal_place” reworded the description of “wait_s” cosmetic
- “auto_place” reworded the description of “wait_s” cosmetic
- “board_census” reworded the description of “wait_s” cosmetic
- “bridge_islands” reworded the description of “wait_s” cosmetic
- “check_net_rules” reworded the description of “wait_s” cosmetic
- “check_physics” reworded the description of “wait_s” cosmetic
- “cleanup_board” reworded the description of “wait_s” cosmetic
- “couple_pairs” reworded the description of “wait_s” cosmetic
- “diagnose_open_nets” reworded the description of “wait_s” cosmetic
- “export_step” reworded the description of “wait_s” cosmetic
- “fill_zones” reworded the description of “wait_s” cosmetic
- “finish_board” reworded the description of “wait_s” cosmetic
- “get_board_info” reworded the description of “wait_s” cosmetic
- “get_board_job” reworded the description of “wait_s” cosmetic
- “place_footprints” reworded the description of “wait_s” cosmetic
- “polish_vias” reworded the description of “wait_s” cosmetic
- “prune_vias” reworded the description of “wait_s” cosmetic
- “render_board” reworded the description of “wait_s” cosmetic
- “repair_board” reworded the description of “wait_s” cosmetic
- “restore_board_revision” reworded the description of “wait_s” cosmetic
- “ripup_routing” reworded the description of “wait_s” cosmetic
- “route_board” reworded the description of “wait_s” cosmetic
- “run_drc” reworded the description of “wait_s” cosmetic
- “score_board” reworded the description of “wait_s” cosmetic
- “set_board_outline” reworded the description of “wait_s” cosmetic
- “set_design_rules” reworded the description of “wait_s” cosmetic
- “set_keepouts” reworded the description of “wait_s” cosmetic
- “set_silkscreen” reworded the description of “wait_s” cosmetic
- “set_zones” reworded the description of “wait_s” cosmetic
- “stamp_silkscreen” reworded the description of “wait_s” cosmetic
- “swap_footprint” reworded the description of “wait_s” cosmetic
- “tidy_copper” reworded the description of “wait_s” cosmetic
- “tie_rail_pads” reworded the description of “wait_s” cosmetic
- “widen_nets” reworded the description of “wait_s” cosmetic
35 cosmetic changes on this day. Switch on “Show cosmetic changes” to see them.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://app.koppar.ai/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=app.koppar.ai | CN=YE2,O=Let's Encrypt,C=US | 12 Oct 2026 | 10 Jan 2027 | ECDSA 256 | ECDSA-SHA384 | 5d03f4477a99a755a4a8913336fafe8c0b1 |
| SANs: app.koppar.ai | ||||||
| CN=YE2,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 4df3b15dd6c0784c507cd37b58e6f115 |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of app.koppar.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 1814, 3799 | 8, 8 | Verified |
| koppar.ai. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Challenged, unverified
The endpoint asked for a token, but we could not retrieve and validate the RFC 9728 metadata that tells a client how to obtain one.
| Result | Challenged, unverified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer realm="koppar"
Bearer realm="koppar" | Header | Value |
|---|---|
| strict-transport-security | max-age=31536000; includeSubDomains |
| content-security-policy | default-src 'self'; script-src 'self' 'unsafe-inline' https://*.googletagmanager.com https://www.google-analytics.com; connect-src 'self' https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com https://www.google.com; style-src 'self' 'unsafe-inline'; font-src 'self'; img-src 'self' data: blob: https://*.google-analytics.com https://*.googletagmanager.com https://www.claudeai.directory; object-src 'none'; base-uri 'self'; frame-ancestors 'none'; form-action 'self' |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | strict-origin-when-cross-origin |
Protected resource metadata
| Retrieved | No |
|---|---|
| Problem | no_resource_metadata |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://app.koppar.ai/mcp | Verified | 200 | |
| http (plaintext) | http://app.koppar.ai/mcp | HTTPS enforced | 308 | https://app.koppar.ai/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
search_kicad_symbol Search KiCad symbols ~203
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='<part number>') 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 | Type | Req | Description |
|---|---|---|---|
| design_id | string | – | The design id returned by create_design or list_designs. |
| library | string | – | Restrict to one symbol library, e.g. 'Timer'. |
| query | string | yes | Substring to search for, e.g. 'NE555', 'USB-C', 'RP2040'. |
No output schema declared.
No examples provided.
send_order_to_provider Send the order to a manufacturer ~165
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 | Type | Req | Description |
|---|---|---|---|
| boards | integer | – | Quantity (default 1). |
| design_id | string | yes | The design id returned by create_design or list_designs. |
| provider | string | yes | Provider id from list_order_providers. |
| shipping | object | – | Delivery address, for providers that need one. |
| title | string | – | Order title at the provider. |
| user_confirmed | boolean | yes | The user explicitly asked to send this design to this provider. |
No output schema declared.
No examples provided.
set_board_outline Set the board outline ~190
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 | Type | Req | Description |
|---|---|---|---|
| design_id | string | yes | The design id returned by import_kicad_project or list_designs. |
| fit_to_parts | object | – | – |
| line_width_mm | number | – | – |
| polygon | array | – | – |
| rect | object | – | – |
| wait_s | integer | – | 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_budge… |
No output schema declared.
No examples provided.
set_design_rules Set design rules ~776
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 | Type | Req | Description |
|---|---|---|---|
| board_thickness_mm | number | – | 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. |
| copper_edge_clearance_mm | number | – | – |
| copper_layers | – | – | – |
| default_clearance_mm | number | – | – |
| default_track_mm | number | – | – |
| default_via_diameter_mm | number | – | – |
| default_via_drill_mm | number | – | – |
| design_id | string | yes | The design id returned by import_kicad_project or list_designs. |
| hole_clearance_mm | number | – | – |
| hole_to_hole_mm | number | – | – |
| min_clearance_mm | number | – | – |
| min_through_drill_mm | number | – | – |
| min_track_mm | number | – | – |
| min_via_annular_mm | number | – | – |
| min_via_diameter_mm | number | – | – |
| net_classes | array | – | – |
| preset | string | – | – |
| stackup | string | – | 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… |
| wait_s | integer | – | 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_budge… |
No output schema declared.
No examples provided.
set_keepouts Keepout areas ~212
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 | Type | Req | Description |
|---|---|---|---|
| add | array | – | – |
| design_id | string | yes | The design id returned by import_kicad_project or list_designs. |
| remove | array | – | – |
| wait_s | integer | – | 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_budge… |
No output schema declared.
No examples provided.
set_silkscreen Tidy the silkscreen ~211
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 | Type | Req | Description |
|---|---|---|---|
| design_id | string | yes | The design id returned by import_kicad_project or list_designs. |
| references | string | – | – |
| texts | string | – | – |
| values | string | – | – |
| wait_s | integer | – | 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_budge… |
No output schema declared.
No examples provided.
set_zones Copper zones ~214
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 | Type | Req | Description |
|---|---|---|---|
| add | array | – | – |
| design_id | string | yes | The design id returned by import_kicad_project or list_designs. |
| remove | array | – | – |
| wait_s | integer | – | 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_budge… |
No output schema declared.
No examples provided.
stamp_silkscreen Stamp silkscreen ~343
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 | Type | Req | Description |
|---|---|---|---|
| badge | boolean | – | Place the spec badge (default false). |
| badge_side | string | – | Silk side for the badge; the larger free patch when unset. |
| design_id | string | yes | The design id returned by import_kicad_project or list_designs. |
| jlc_order_number | boolean | – | Place JLCJLCJLCJLC on the back silk (default false). |
| parts | integer | – | Part count for the badge; counted from the board when unset. |
| revision | string | – | Revision for the badge ("rev B"). |
| title | string | – | Board title for the badge's second line. |
| wait_s | integer | – | 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_budge… |
No output schema declared.
No examples provided.
start_board Place and route the board ~122
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 | Type | Req | Description |
|---|---|---|---|
| design_id | string | yes | The design id returned by create_design or list_designs. |
| plan | object | – | The board plan object. Omit for the default plan. |
No output schema declared.
No examples provided.
submit_circuit Submit the schematic ~162
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 | Type | Req | Description |
|---|---|---|---|
| check_sourcing | boolean | – | Check the parts against supplier catalogues (default true). |
| code | string | yes | The complete SKiDL Python script. |
| design_id | string | yes | The design id returned by create_design or list_designs. |
No output schema declared.
No examples provided.
swap_footprint Swap footprints ~215
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 | Type | Req | Description |
|---|---|---|---|
| design_id | string | yes | The design id returned by import_kicad_project or list_designs. |
| swaps | array | yes | – |
| wait_s | integer | – | 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_budge… |
No output schema declared.
No examples provided.
tidy_copper Tidy the copper ~223
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 | Type | Req | Description |
|---|---|---|---|
| design_id | string | yes | The design id returned by import_kicad_project or list_designs. |
| wait_s | integer | – | 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_budge… |
No output schema declared.
No examples provided.
tie_rail_pads Tie plane-net pads together ~317
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 | Type | Req | Description |
|---|---|---|---|
| avoid_copper | boolean | – | Treat other nets' tracks and vias as obstacles (default true). |
| design_id | string | yes | The design id returned by import_kicad_project or list_designs. |
| layers | array | – | Copper layers to tie on (default F.Cu and B.Cu). |
| max_mm | number | – | Longest tie (default 2.5). |
| nets | array | – | Nets to tie (default: every net that has a pour). |
| wait_s | integer | – | 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_budge… |
| width_mm | number | – | Tie track width (default: the board's current track width). |
No output schema declared.
No examples provided.
upload_board Upload a board ~321
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 | Type | Req | Description |
|---|---|---|---|
| board_base64 | string | – | The .kicad_pcb file, base64 (or give workspace_id). |
| design_id | string | yes | The design id returned by create_design or list_designs. |
| note | string | – | What was done to the board, for the session chat. |
| project_base64 | string | – | The .kicad_pro beside the board, base64: its design rules and net classes judge the board (without it the design keeps its own). |
| rules_base64 | string | – | The .kicad_dru beside the board, base64. |
| workspace_id | string | – | 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. |
No output schema declared.
No examples provided.
widen_nets Widen power nets in place ~336
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 | Type | Req | Description |
|---|---|---|---|
| design_id | string | yes | The design id returned by import_kicad_project or list_designs. |
| guard | boolean | – | Refill pours and back out widenings that disconnect anything (default true). |
| necks | integer | – | How many remaining necks to report per net (default 12). |
| nets | object | yes | Net -> target track width in mm. |
| vias | object | – | Net -> [diameter_mm, drill_mm] sizes to try, largest first; a via only ever grows. |
| wait_s | integer | – | 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_budge… |
No output schema declared.
No examples provided.
How do I install the Koppar MCP server?
Koppar is a hosted endpoint at https://app.koppar.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · app.koppar.ai
claude mcp add --transport http ai-koppar-koppar 'https://app.koppar.ai/mcp'
What is the Koppar MCP server?
Koppar is an MCP server listed in the public MCP registry as ai.koppar/koppar. Design a KiCad PCB from a prompt: parts, schematic checks, routing, KiCad DRC and Gerbers. This page covers its hosted endpoint (https://app.koppar.ai/mcp).
Is the Koppar MCP server safe to use?
Koppar scores 84 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Koppar MCP server expose?
Koppar exposes 65 tools: get_workflow_guide, create_design, leave_feedback, list_designs, delete_design, and 60 more. Their descriptions and schemas cost roughly 16,262 tokens of context every time the server is loaded.
Does the Koppar MCP server require authentication?
Yes. Koppar asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the Koppar MCP server still maintained?
Koppar is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.