拆解KiCAD MCP Server架构:TypeScript MCP协议层与Python pcbnew层如何协同的完整指南
【免费下载链接】KiCAD-MCP-ServerKiCAD MCP is a Model Context Protocol (MCP) implementation that enables Large Language Models (LLMs) like Claude to directly interact with KiCAD for printed circuit board design.项目地址: https://gitcode.com/gh_mirrors/ki/KiCAD-MCP-Server
KiCAD MCP Server 是一个开源的Model Context Protocol(MCP)实现,它让 Claude 等 AI 助手能够直接操作 KiCAD 完成 PCB 设计——从创建工程、放置元件、走线布线到导出生产文件,全部通过对话完成。理解它的架构,是理解"AI 如何安全地驱动专业工程软件"的绝佳样本:整个系统由TypeScript 写的 MCP 协议层(src/)和Python 写的 pcbnew 接口层(python/)组成,两层通过一条 JSON 管道协同工作。
🗺️ 三层架构全景:请求是如何流动的
先看整体调用链(摘自 docs/ARCHITECTURE.md):
AI 助手(Claude 等) │ MCP 协议(JSON-RPC 2.0 over STDIO) ▼ TypeScript MCP Server(src/) │ 派生 Python 子进程,传递 JSON 命令 ▼ Python KiCAD 接口(python/kicad_interface.py) │ pcbnew SWIG API 或 KiCAD 9.0 IPC API ▼ KiCAD 9.0+两层的职责划分非常清晰:
| 层 | 语言 | 职责 | 为什么用它 |
|---|---|---|---|
| MCP 协议层 | TypeScript | 实现 MCP 协议、注册工具 Schema、参数校验、管理 Python 子进程 | MCP 官方 SDK 对 TS 支持最好 |
| pcbnew 后端层 | Python | 读写 .kicad_pcb / .kicad_sch、执行布线与设计规则检查 | pcbnew 官方只提供 Python API |
| KiCAD | C++ | 真正的 PCB 引擎 | 唯一权威的数据源 |
一句话总结:TypeScript 负责"听懂 AI 说话",Python 负责"动手干活"。
🔌 TypeScript 层:200+ 工具是怎么注册和调用的
服务端入口是 src/server.ts,启动时做三件事:
- 注册全部工具——每个工具类别一个文件(如 src/tools/board.ts、src/tools/routing.ts),统一通过
register*Tools(server, callKicadScript)挂载; - 连接 STDIO 传输——刻意放在最前面(Phase 0),因为 Python 端加载 pcbnew 在 macOS 上需要 55~125 秒,先连上通道才能保证 AI 客户端的请求不被积压;
- 寻找正确的 Python 解释器——按"项目 venv → KICAD_PYTHON 环境变量 → KiCAD 自带 Python → 系统 Python"的顺序探测,并顺手验证
import pcbnew是否成功,失败时会输出针对 Windows / Linux 的排错提示。
一个典型的工具注册长这样:工具名、描述、Zod 参数 Schema、以及一个把参数转交给callKicadScript(command, args)的 handler。此外还有 src/tools/registry.ts 和 src/tools/router.ts 提供search_tools等"工具发现"能力——当 200+ 个工具全部单独注册时,AI 可以用关键词搜索快速找到目标工具,而不必逐个读 Schema。
📡 STDIO 上的 JSON 桥接:两层协同的核心
TypeScript 与 Python 之间没有复杂的 RPC 框架,只有一条极简的换行分隔 JSON管道,核心实现在 src/server.ts 的callKicadScript():
→ {"command": "place_component", "params": {...}, "requestId": 42} ← {"success": true, "message": "...", "_requestId": 42, "_backend": "swig"}围绕这条管道,有四个精巧的协同机制值得新手学习:
- 请求队列串行化:pcbnew 不是线程安全的,所以所有命令进入
requestQueue逐条处理,天然避免了对同一块板的并发写冲突; - requestId 配对:每条请求带自增 ID,Python 端原样回显
_requestId。这样即使某条命令超时,迟到的响应也会被丢弃而不是错误地"喂给"下一条请求——注释里提到的 issue #373 就是没有这个机制时管道永久错位的真实事故; - ready 握手:Python 主循环起来后先发送
{"type":"ready"}(见 python/kicad_interface.py),TypeScript 端waitForReady()等到这条消息才放行业务命令; - warmup 预热:首条命令会触发 pcbnew 完整初始化(macOS 上约 60 秒),服务端在启动阶段就发一条
_warmup命令把这个开销"提前付清",避免 AI 用户第一次调用工具时干等一分钟。
🐍 Python 层:一张命令路由表 + 双后端
Python 侧入口 python/kicad_interface.py 有一个近 7000 行的主文件,但结构并不复杂:
- stdin 循环逐行读取 JSON 命令;
command_routes路由表(python/kicad_interface.py)把命令名映射到具体 handler——create_project、place_component、route_trace、run_drc等数十个类别,每个类别对应 python/commands/ 下的一个模块;- handler 执行后统一返回
{success, message, ...}结构,由_write_response()写回 stdout。
更值得留意的是后端抽象层python/kicad_api/,由 python/kicad_api/factory.py 自动探测选择:
| 后端 | 原理 | 特点 |
|---|---|---|
| SWIG(默认) | pcbnew 官方 SWIG 绑定,直接操作文件 | 无需 KiCAD 运行,改完内存后写回磁盘 |
| IPC(实验性) | 通过 KiCAD 9.0 的 IPC socket 连接正在运行的 KiCAD | 改动实时出现在界面,GUI 关闭自动降级回 SWIG |
也就是说,同一条place_component命令,Python 层会根据环境自动决定"改文件"还是"实时操控 GUI",TypeScript 层完全无感知——响应里的_backend和_realtime字段只是给 AI 一个知情提示。
🛡️ 四个让协同稳定的细节
架构文档把这些列为关键设计决策(docs/ARCHITECTURE.md):
- 自动保存:所有会修改板卡的 SWIG 操作执行后立即落盘,防止内存态修改丢失;
- 按命令类型分级超时:普通命令与
run_drc、refill_zones等重命令使用不同超时(见 src/command-timeout.ts),避免"一刀切"误杀; - fd 级输出隔离:pcbnew 的 C++ 代码会往 stdout 打警告噪声,Python 端在主循环里用
os.dup把 JSON 响应独占真实 stdout、把 C 级输出重定向到 stderr,保证 TypeScript 解析器永远只看到干净的 JSON 帧; - 子进程自愈:
kicad_interface.py崩溃时 TypeScript 端会重建子进程(tests/test_worker_survives_bad_command.py专门覆盖此场景),一次错误命令不会拖死整个服务。
🚀 新手读源码的推荐路线
- 第一站:docs/ARCHITECTURE.md——本文所有结论的官方出处;
- 第二站:src/server.ts 的
start()与callKicadScript()——看清"桥"的两端; - 第三站:python/kicad_interface.py 的
main()与command_routes——看清命令如何落地; - 扩展工具时按官方五步走:定义 TS Schema → 注册 → 在 src/server.ts 挂载 → 写 Python handler →
npm run build+npm run test:py验证。
小结:KiCAD MCP Server 的本质是一个"双语言协程"——TypeScript 守住 MCP 协议边界,Python 守住 pcbnew API 边界,中间用一条带 ID 配对、串行化、可自愈的 JSON 管道连接。对想给自己的工程软件加"AI 手"的开发者来说,这套分层与桥接设计几乎可以直接照抄。
【免费下载链接】KiCAD-MCP-ServerKiCAD MCP is a Model Context Protocol (MCP) implementation that enables Large Language Models (LLMs) like Claude to directly interact with KiCAD for printed circuit board design.项目地址: https://gitcode.com/gh_mirrors/ki/KiCAD-MCP-Server
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考