Skip to main content
Glama

Read a board's PCB copper

read_pcb
Read-only

Use when the user asks how a public board is routed on copper: vias, pads, tracks, layers, or a PCB net's geometry. Returns the board's latest pcb graph (viewBox millimetres). No focus returns a bounded overview (board size, layers, via/pad/track counts, a net index with via counts and routed length). net returns that net's pads and vias (diameter, drill, layer span) plus track count and length — not a dump of every segment. ref returns one footprint's pads. pcb selects one PCB inside a multi-board project ("default" or a slug from the overview). Prefer this over reading raw .kicad_pcb text for vias and copper connectivity; read_schematic is schematic wiring, not copper. Copper pours (zones) are not in this graph; query_design select ["kicad_pcb","zone"] for those. If copper is still computing, say so rather than inferring vias from the schematic.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "board": "<board>"
    },
    "name": "read_pcb"
  }
}

Input Schema

NameRequiredDescriptionDefault
netNoOptional. One copper net name (e.g. GND): returns its pads and vias (including drill and layer span) plus track count and routed length. Prefer this for 'how many vias on net X' or 'is this net's routing reasonable'.
pcbNoOptional. One PCB inside this project: "default" or a slug from a previous overview (e.g. plate). This is NOT a BoardRepo board selector. Omit when the project has a single PCB.
refNoOptional. One footprint reference (e.g. U1): returns its pads with nets, layers and positions. Provide at most one of ref or net.
boardYesA board: handle/slug or a boardrepo.com URL. Use search_boards for public boards or list_my_boards for personal and authorised organisation boards. Do not invent references.
versionNoWhich saved version to read: a version number (3 or "v3"), a versionId from list_board_versions, "latest", or a release tag such as "rev-A". Omit for the latest version. Results echo the version they read; pass its id back to stay on it.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "properties": {
      -      "copperAvailable": {
      -        "type": "boolean"
      -      },
      -      "copperStatus": {
      -        "enum": [
      -          "computing",
      -          "unavailable"
      -        ],
      -        "type": "string"
      -      },
      -      "found": {
      -        "type": "boolean"
      -      },
      -      "hint": {
      -        "type": "string"
      -      },
      -      "matchStatus": {
      -        "enum": [
      -          "not_found",
      -          "unknown",
      -          "ambiguous"
      -        ],
      -        "type": "string"
      -      },
      -      "message": {
      -        "type": "string"
      -      },
      -      "note": {
      -        "type": "string"
      -      },
      -      "pcb": {
      -        "type": "string"
      -      },
      -      "requestedNet": {
      -        "type": "string"
      -      },
      -      "requestedPcb": {
      -        "type": "string"
      -      },
      -      "requestedRef": {
      -        "type": "string"
      -      },
      -      "url": {
      -        "type": "string"
      -      },
      -      "version": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "id": {
      -            "type": "string"
      -          },
      -          "latest": {
      -            "type": "boolean"
      -          },
      -          "number": {
      -            "type": "integer"
      -          },
      -          "tags": {
      -            "items": {
      -              "type": "string"
      -            },
      -            "type": "array"
      -          }
      -        },
      -        "required": [
      -          "id",
      -          "number",
      -          "latest",
      -          "tags"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "found"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "properties": {
      -      "appError": {
      -        "type": "string"
      -      },
      -      "bytesNeeded": {
      -        "type": "integer"
      -      },
      -      "cause": {
      -        "type": "string"
      -      },
      -      "currentHead": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "currentPolicyHash": {
      -        "type": "string"
      -      },
      -      "docsUrl": {
      -        "type": "string"
      -      },
      -      "fix": {
      -        "type": "string"
      -      },
      -      "freeBytes": {
      -        "type": "integer"
      -      },
      -      "issues": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "message": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "received": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "path",
      -            "message"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "message": {
      -        "type": "string"
      -      },
      -      "operationId": {
      -        "type": "string"
      -      },
      -      "projectsLeft": {
      -        "type": "integer"
      -      },
      -      "reason": {
      -        "type": "string"
      -      },
      -      "resetsAt": {
      -        "type": "string"
      -      },
      -      "retryAfterMs": {
      -        "type": "integer"
      -      },
      -      "retryable": {
      -        "type": "boolean"
      -      },
      -      "sourceSaved": {
      -        "type": "boolean"
      -      },
      -      "storedResultAvailable": {
      -        "type": "boolean"
      -      },
      -      "suggestions": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "board": {
      -              "type": "string"
      -            },
      -            "name": {
      -              "type": "string"
      -            },
      -            "url": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "board",
      -            "name",
      -            "url"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "uploadLinks": {
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "bytes": {
      -              "type": "integer"
      -            },
      -            "expiresAt": {
      -              "type": "string"
      -            },
      -            "headers": {
      -              "type": "object"
      -            },
      -            "method": {
      -              "const": "PUT"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "sha256": {
      -              "type": "string"
      -            },
      -            "uploadUrl": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "path",
      -            "bytes",
      -            "sha256",
      -            "uploadUrl",
      -            "method",
      -            "headers",
      -            "expiresAt"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "url": {
      -        "type": "string"
      -      },
      -      "visibility": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "reason",
      -      "message"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "copperAvailable": {
      +        "type": "boolean"
      +      },
      +      "copperStatus": {
      +        "enum": [
      +          "computing",
      +          "unavailable"
      +        ],
      +        "type": "string"
      +      },
      +      "found": {
      +        "type": "boolean"
      +      },
      +      "hint": {
      +        "type": "string"
      +      },
      +      "matchStatus": {
      +        "enum": [
      +          "not_found",
      +          "unknown",
      +          "ambiguous"
      +        ],
      +        "type": "string"
      +      },
      +      "message": {
      +        "type": "string"
      +      },
      +      "note": {
      +        "type": "string"
      +      },
      +      "pcb": {
      +        "type": "string"
      +      },
      +      "requestedNet": {
      +        "type": "string"
      +      },
      +      "requestedPcb": {
      +        "type": "string"
      +      },
      +      "requestedRef": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      },
      +      "version": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "id": {
      +            "type": "string"
      +          },
      +          "latest": {
      +            "type": "boolean"
      +          },
      +          "number": {
      +            "type": "integer"
      +          },
      +          "tags": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "number",
      +          "latest",
      +          "tags"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "found"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "appError": {
      +        "type": "string"
      +      },
      +      "bytesNeeded": {
      +        "type": "integer"
      +      },
      +      "cause": {
      +        "type": "string"
      +      },
      +      "code": {
      +        "type": "string"
      +      },
      +      "currentHead": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "currentPolicyHash": {
      +        "type": "string"
      +      },
      +      "docsUrl": {
      +        "type": "string"
      +      },
      +      "fix": {
      +        "type": "string"
      +      },
      +      "freeBytes": {
      +        "type": "integer"
      +      },
      +      "issues": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "message": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "received": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "path",
      +            "message"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "message": {
      +        "type": "string"
      +      },
      +      "openChangeRequest": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "id": {
      +            "type": "string"
      +          },
      +          "number": {
      +            "maximum": 9007199254740991,
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "url": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "number",
      +          "url"
      +        ],
      +        "type": "object"
      +      },
      +      "operationId": {
      +        "type": "string"
      +      },
      +      "projectsLeft": {
      +        "type": "integer"
      +      },
      +      "reason": {
      +        "type": "string"
      +      },
      +      "resetsAt": {
      +        "type": "string"
      +      },
      +      "retryAfterMs": {
      +        "type": "integer"
      +      },
      +      "retryable": {
      +        "type": "boolean"
      +      },
      +      "sourceSaved": {
      +        "type": "boolean"
      +      },
      +      "storedResultAvailable": {
      +        "type": "boolean"
      +      },
      +      "suggestions": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "board": {
      +              "type": "string"
      +            },
      +            "name": {
      +              "type": "string"
      +            },
      +            "url": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "board",
      +            "name",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "uploadLinks": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "bytes": {
      +              "type": "integer"
      +            },
      +            "expiresAt": {
      +              "type": "string"
      +            },
      +            "headers": {
      +              "type": "object"
      +            },
      +            "method": {
      +              "const": "PUT"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "sha256": {
      +              "type": "string"
      +            },
      +            "uploadUrl": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "path",
      +            "bytes",
      +            "sha256",
      +            "uploadUrl",
      +            "method",
      +            "headers",
      +            "expiresAt"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "url": {
      +        "type": "string"
      +      },
      +      "visibility": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "reason",
      +      "message"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed5 schema fields changed
    • addedInput schema / properties / version
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "maxLength": 64,
      +      "minLength": 1,
      +      "type": "string"
      +    }
      +  ],
      +  "description": "Which saved version to read: a version number (3 or \"v3\"), a versionId from list_board_versions, \"latest\", or a release tag such as \"rev-A\". Omit for the latest version. Results echo the version they read; pass its id back to stay on it."
      +}
    • removedOutput schema / additionalProperties
      Removed value: -true
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "copperAvailable": {
      +        "type": "boolean"
      +      },
      +      "copperStatus": {
      +        "enum": [
      +          "computing",
      +          "unavailable"
      +        ],
      +        "type": "string"
      +      },
      +      "found": {
      +        "type": "boolean"
      +      },
      +      "hint": {
      +        "type": "string"
      +      },
      +      "matchStatus": {
      +        "enum": [
      +          "not_found",
      +          "unknown",
      +          "ambiguous"
      +        ],
      +        "type": "string"
      +      },
      +      "message": {
      +        "type": "string"
      +      },
      +      "note": {
      +        "type": "string"
      +      },
      +      "pcb": {
      +        "type": "string"
      +      },
      +      "requestedNet": {
      +        "type": "string"
      +      },
      +      "requestedPcb": {
      +        "type": "string"
      +      },
      +      "requestedRef": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      },
      +      "version": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "id": {
      +            "type": "string"
      +          },
      +          "latest": {
      +            "type": "boolean"
      +          },
      +          "number": {
      +            "type": "integer"
      +          },
      +          "tags": {
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "number",
      +          "latest",
      +          "tags"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "found"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "properties": {
      +      "appError": {
      +        "type": "string"
      +      },
      +      "bytesNeeded": {
      +        "type": "integer"
      +      },
      +      "cause": {
      +        "type": "string"
      +      },
      +      "currentHead": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "currentPolicyHash": {
      +        "type": "string"
      +      },
      +      "docsUrl": {
      +        "type": "string"
      +      },
      +      "fix": {
      +        "type": "string"
      +      },
      +      "freeBytes": {
      +        "type": "integer"
      +      },
      +      "issues": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "message": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "received": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "path",
      +            "message"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "message": {
      +        "type": "string"
      +      },
      +      "operationId": {
      +        "type": "string"
      +      },
      +      "projectsLeft": {
      +        "type": "integer"
      +      },
      +      "reason": {
      +        "type": "string"
      +      },
      +      "resetsAt": {
      +        "type": "string"
      +      },
      +      "retryAfterMs": {
      +        "type": "integer"
      +      },
      +      "retryable": {
      +        "type": "boolean"
      +      },
      +      "sourceSaved": {
      +        "type": "boolean"
      +      },
      +      "storedResultAvailable": {
      +        "type": "boolean"
      +      },
      +      "suggestions": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "board": {
      +              "type": "string"
      +            },
      +            "name": {
      +              "type": "string"
      +            },
      +            "url": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "board",
      +            "name",
      +            "url"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "uploadLinks": {
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "bytes": {
      +              "type": "integer"
      +            },
      +            "expiresAt": {
      +              "type": "string"
      +            },
      +            "headers": {
      +              "type": "object"
      +            },
      +            "method": {
      +              "const": "PUT"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "sha256": {
      +              "type": "string"
      +            },
      +            "uploadUrl": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "path",
      +            "bytes",
      +            "sha256",
      +            "uploadUrl",
      +            "method",
      +            "headers",
      +            "expiresAt"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "url": {
      +        "type": "string"
      +      },
      +      "visibility": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "reason",
      +      "message"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedOutput schema / properties
      Removed value: -{
      -  "copperAvailable": {
      -    "type": "boolean"
      -  },
      -  "copperStatus": {
      -    "enum": [
      -      "computing",
      -      "unavailable"
      -    ],
      -    "type": "string"
      -  },
      -  "found": {
      -    "type": "boolean"
      -  },
      -  "hint": {
      -    "type": "string"
      -  },
      -  "matchStatus": {
      -    "enum": [
      -      "not_found",
      -      "unknown",
      -      "ambiguous"
      -    ],
      -    "type": "string"
      -  },
      -  "message": {
      -    "type": "string"
      -  },
      -  "note": {
      -    "type": "string"
      -  },
      -  "pcb": {
      -    "type": "string"
      -  },
      -  "requestedNet": {
      -    "type": "string"
      -  },
      -  "requestedPcb": {
      -    "type": "string"
      -  },
      -  "requestedRef": {
      -    "type": "string"
      -  },
      -  "url": {
      -    "type": "string"
      -  }
      -}
    • removedOutput schema / required
      Removed value: -[
      -  "found"
      -]
  3. Added

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/openWorld/non-destructive; the description goes well beyond by disclosing what each invocation mode returns (bounded overview with board size, layers, via/pad/track counts, net index), that net mode returns pads/vias plus aggregate track count and length rather than 'a dump of every segment', and that copper zones are excluded from the graph. It also discloses a transient-state condition (copper still computing) that the 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Usage condition is front-loaded and each subsequent sentence adds a distinct fact (return shape per mode, parameter disambiguation, sibling exclusions, missing-zone caveat, transient-state handling). The single dense paragraph is long and packs several ideas together, which costs a bit of scannability, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be enumerated in full, yet the description still summarizes them per mode. Combined with the annotations, sibling routing, zone exclusion, and the async-computation warning, everything an agent needs to call this correctly and interpret the result is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 extra credit by explaining expected return shape per selector — net returns pads/vias with drill and layer span plus track count and length, ref returns one footprint's pads, pcb picks one PCB inside a multi-board project. It restates some schema content (the 'default' slug, the ref-or-net exclusivity) but adds the 'not a dump of every segment' scoping note that prevents miscalling.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 ('how a public board is routed on copper: vias, pads, tracks, layers') and explicitly contrasts itself with read_schematic ('schematic wiring, not copper') and query_design (zones). An agent can distinguish this from every relevant sibling 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the triggering condition ('Use when the user asks how a public board is routed on copper'), names alternatives for adjacent needs (read_schematic, query_design with the exact argument, raw .kicad_pcb text), and gives a fallback behavior when data is unavailable ('if copper is still computing, say so rather than inferring').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.