刚拿到这个标题的时候我就在想这不就是我这两年一直在琢磨的东西吗硬件设计这个圈子说老实话比软件行业要“保守”得多很多工程师还在靠翻Datasheet、手动敲坐标、一遍一遍检查封装过日子。可另一边AI圈子的工具链已经卷到飞起大模型都能写代码了凭啥就不能帮我们画板子这阵子我把MCP协议从头到尾捋了一遍又在Altium Designer里折腾了好几周终于把这条“AIEDA”的路给走通了。今天就拿我自己的实战经历跟大伙儿好好聊聊怎么用MCP协议把Altium Designer和一个AI助手深度绑定让AI真的能听懂你的设计需求还能帮你干活。这篇内容不是什么高不可攀的学术研究就是一套已经在跑的真实方案。硬件工程师、PCB设计爱好者或者单纯对AI工具链感兴趣的朋友看完都能照着搭一套出来。我先说结论这个方案的核心思路是把AD的能力通过MCP协议暴露给大模型让AI既拥有自然语言理解能力又拥有操作AD的“手”。原理不复杂但细节是真的多。1. 整体设计思路为什么选择MCP协议作为AI与AD之间的桥梁1.1 一个硬件工程师每天都在经历的痛点先说个我自己的场景。上个月做一块六层板BOM表里有三百多个元器件其中有十几个料是标准库没有的需要手动建库。光是整理封装、检查引脚定义、核对3D模型就花了我大半天时间。好不容易把库建完又开始画原理图画到一半发现有个网络标号出了问题又得一个一个去排查。这些工作繁琐吗非常繁琐。有技术含量吗其实不高。但它们就是占据了硬件工程师大量时间。我当时就在想如果有个智能助手能听懂我说的“帮我把这颗芯片的封装改成QFN-32”然后自动去库里找到对应封装、检查引脚兼容性、把原理图符号更新一遍那该多省事。传统的方案也不是没有。Altium Designer本身有脚本系统也开放了API接口但问题是这些接口的学习成本高、使用门槛不低。一个硬件工程师能熟练画板子但让他去写一套完整的API调用脚本那是真有点强人所难。1.2 为什么不是AD插件直连也不是纯脚本在动笔之前我认真比较过三种方案插件直连、独立脚本、MCP桥接。这里直接说我的结论三种方式的差异非常明显。方案开发难度灵活性可复用性对AI的友好度AD插件直连COM/API高需要熟悉AD内部对象模型高低绑死单个工具差AI无法直接调用独立脚本Python调用AD API中需要自己处理参数输入输出中中脚本可复用中需要人工解析结果MCP桥接方案中前期开发中后期非常顺高极高一次开发处处复用极好天然为AI设计插件直连的问题在于AD的API虽然功能强大但那是给程序员用的。而且写出来的功能模块往往绑定在AD这个特定的软件上想迁移到别的EDA工具就全部报废。这就好比你专门为某款手机写了一个App换了手机就完全不能用了。独立脚本比插件灵活一些但依然绕不开一个问题脚本调用完AD之后返回的数据格式五花八门大模型很难直接理解。比如AD返回的是几个坐标点、一串位号列表AI看着这些内容并没有办法形成上下文也就做不到真正“听懂”你的话。MCP协议的出现把这个局面彻底改变了。它相当于给AI加了一个“万能遥控器”AI通过MCP协议去调用外部工具就像我们人类打开手机App一样自然。MCP协议里规定了一套标准的工具调用方法AI只需要按照协议格式发请求就能拿到结构化的结果。1.3 MCP在AD集成中的关键角色用大白话解释一下MCPModel Context Protocol到底干了什么事。你可以把它理解成一个标准化的“插座”AI是电器外部工具是电源MCP协议就是那个把两者连接起来的接口标准。在传统流程里AI模型只能处理文本你给它一份BOM表它能帮你分析但没法替你打开AD去操作。MCP让AI具备了这些能力。在这个集成方案里角色分配很明确AD客户端被操作对象负责提供原理图、PCB、元件库等数据MCP Server连接AI和AD的桥梁接收AI的指令翻译成AD能懂的API调用AI助手大脑负责理解用户的自然语言拆解任务调用MCP Server上的工具用户你发出指令微调AI的输出结果所以这个架构本质上就是用户面对的是AIAI面对的是一堆标准化的“工具”通过MCP封装每个工具对应AD的一种能力。工具我起了几个典型的名字比如get_component_list、check_net_connectivity、generate_netlist、query_manufacturer等等。AI不需要懂AD的API底层实现它只需要知道有哪些工具可用每个工具接收什么参数、返回什么结果就行。2. 搭建开发环境MCP Server的从零实现2.1 工具链准备与版本选择这个方案的开发环境搭建其实没有想象中那么复杂我先列个清单。我目前用的是Python 3.10因为MCP的官方SDK对3.10支持得最好太老版本的Python在类型注解和异步处理上会有点别扭。Altium Designer我用的AD20后面测试了AD21和AD23API接口基本一致Python 3.10开发MCP Server的主要语言MCP官方SDKpip install mcp目前最新版本已经原生支持FastMCP这种语法糖AI客户端我先是用了Claude Desktop做测试后面嫌它不够灵活直接写了一个Python客户端用OpenAI接口对接本地部署的Qwen模型win32com库pip install pywin32这是让Python和AD通信的关键组件有一点要多说一句很多人问要不要单独装一个AD的版本。我的建议是如果你手头有工作电脑在用的版本直接用那个就行不用专门装新的。AD的API体系很稳定这些接口从AD17到AD23基本没有大改动不像某些国产软件天天改API。2.2 深入理解MCP协议的核心概念动手写代码之前有几个概念必须得先吃透否则后面调试起来会被各种报错搞到怀疑人生。MCP协议里有三个核心原语Tools工具、Resources资源和Prompts提示。Tools是让AI可以主动执行的动作比如“打开文件”、“获取元器件列表”Resources是让AI可以读取的数据比如当前的原理图内容、PCB的层叠结构Prompts是预先定义好的对话模板帮助AI理解特定任务的上下文。在实际的AD集成里最常用的是Tools和Resources。比如我定义一个工具叫get_component_listAI收到用户“看看板子上有哪些元器件”的请求时就会自动调用这个工具。工具返回的是一段结构化的JSON里面包含位号、封装、值、坐标等信息。AI拿到这个JSON之后再组织成自然语言回答给用户。这套机制的妙处在于AI不需要预先“记住”AD里的数据而是按需实时获取。就好比你请了一个高级助理这个助理不需要把公司所有文件都背下来他只需要知道每个文件放在哪、怎么查要用的时候去拿就行。这样信息永远是最新的也不会因为数据太多把AI的上下文窗口撑爆。2.3 一个最小可用的MCP Server代码骨架理论铺垫得差不多了直接上代码。我先把最核心的框架贴出来这个框架能跑通的最小案例。import json from mcp.server.fastmcp import FastMCP import win32com.client import pythoncom # 初始化MCP服务器 mcp FastMCP(altium-mcp-server) class AltiumManager: 负责管理Altium Designer的COM通信 def __init__(self): self.app None self.project None self.pcb None self.sch None def connect(self): 连接正在运行的Altium Designer实例 pythoncom.CoInitialize() try: # 尝试获取已运行的AD实例 self.app win32com.client.GetActiveObject(Altium.Application) except: # 如果没有运行则创建新实例 self.app win32com.client.Dispatch(Altium.Application) self.app.Visible True self.app.WindowManager.MainWindow.Visible True return self.app def get_current_document(self): 获取当前活动的工作区 ws self.app.Workspace doc ws.CurrentDocument return doc def get_components(self): 从当前PCB或原理图中提取元器件信息 doc self.get_current_document() components [] # 这里是核心操作后面详细展开 return components # 定义一个MCP工具获取元器件列表 mcp.tool() def query_components() - str: 获取当前打开的Altium Designer设计文件中的所有元器件信息包括位号、封装、坐标、值等 manager AltiumManager() try: manager.connect() comps manager.get_components() return json.dumps(comps, ensure_asciiFalse, indent2) except Exception as e: return json.dumps({error: str(e)}) finally: pythoncom.CoUninitialize() # 启动MCP服务器 if __name__ __main__: mcp.run()任何一个MCP Server大概都是这个骨架初始化服务器、定义各种工具函数、启动监听。关键在于工具函数内部的实现——怎么从AD里拿到数据这才是真正需要精雕细琢的地方。测试这个最小框架也简单直接命令行启动python altium_mcp_server.py启动之后MCP服务器就挂在本地端口上等待AI来调用了。我建议第一次跑的时候先用客户端连一次试试确认工具能被正常发现。如果工具列表里出现了query_components那说明MCP的基础链路已经通了。3. 打通Altium Designer核心功能实现细节3.1 AD API的基础COM接口怎么玩Altium Designer底层有一个庞大的COM组件库通过Python的win32com可以访问。这个体系有点像Windows COM那套东西AD把内部对象模型暴露出来比如Workspace代表工作区、PCBDocument代表PCB文件、SchDocument代表原理图文件。我一开始也很头疼因为AD的API文档不太友好好多接口都是意大利面式的命名。后来我找到了一个很高效的学习方式AD里自带脚本编辑器可以直接写DelphiScript脚本来调用API把脚本逻辑跑通之后再翻译成Python。这个方法比对着文档啃效率高多了。给兄弟们一个建议入门AD API可以从这几个核心接口开始Application最顶层管理整个AD应用Workspace管理所有打开的项目和文档PCBDocumentPCB文档对象里面有板子上的所有对象SchDocument原理图文档对象管理元器件符号、连线等IntegratedLibrary集成元件库3.2 元器件列表读取AI理解设计的关键一步元器件列表是整个集成方案里最重要的数据源。AI能不能理解你的板子很大程度上取决于它能不能拿到一份结构化的元器件清单。这里的关键不是简单的For Each遍历而是要注意数据过滤和字段规整。AD里一个PCB文件包含的东西太多了铜箔、走线、过孔、丝印、板框……如果一股脑全读出来AI会被海量数据淹没。所以我的策略是只提取元件相关的信息其余对象全部过滤掉。def get_components(self): 提取PCB或原理图中的元器件信息 doc self.get_current_document() components [] if PCB in str(doc.DM_ObjectKind): # 从PCB文档中提取 pcb doc iterator pcb.BoardIterator_Create() iterator.AddFilter_ObjectSet(MkSet(ePCBComponent)) iterator.AddFilter_LayerSet(AllLayers) comp iterator.FirstPCBObject() while comp: component_data { designator: comp.Identifier.Text, # 位号 layer: str(comp.Layer), x: round(comp.X * 0.01, 2), # AD内部单位是10um转成mm y: round(comp.Y * 0.01, 2), rotation: comp.Rotation, footprint: comp.Pattern, # 封装名称 comment: comp.Comment.Text, # 注释/值 part_number: getattr(comp, MfrPartNumber, ) # 料号 } components.append(component_data) comp iterator.NextPCBObject() pcb.BoardIterator_Destroy(iterator) elif SCH in str(doc.DM_ObjectKind): # 从原理图文档中提取 sch doc iterator sch.SchIterator_Create() iterator.AddFilter_ObjectSet(MkSet(eSchComponent)) comp iterator.FirstSchObject() while comp: component_data { designator: comp.Location.Text, x: round(comp.Location.X / 10, 2), # 单位换算到mm y: round(comp.Location.Y / 10, 2), rotation: comp.Orientation, footprint: comp.Footprint, comment: comp.Description } components.append(component_data) comp iterator.NextSchObject() sch.SchIterator_Destroy(iterator) return components这个函数我写的算比较完整了可以通过CurrentDocument判断当前打开的是原理图还是PCB然后分别用不同的迭代器去提取。需要特别注意的是单位换算AD内部使用的单位是10umPCB和1/10mil原理图如果不在源头转好后面AI读到的数据全是乱的。3.3 把AI的“双手”接到AD上定义高价值工具集元器件列表只是一个开始。要让AI真正称得上“助手”手里得有足够多的工具。我在自己的MCP Server上已经挂了十几个工具函数这里我列几个最有代表性、也最能体现“深度集成”价值的工具一查询元器件详细信息mcp.tool() def query_component_details(designator: str) - str: 根据位号查询单个元器件的详细信息包括坐标、封装、值、网络连接等 # 实现类似上面的查询但只返回单个元件 ...这个工具让AI可以针对性地了解某个细节。比如你问“U3芯片的电源引脚接了哪些电容”AI先调用query_component_details(U3)拿到U3的引脚信息再结合网络表内容找到与之相连的电容。工具二检查未连接的引脚mcp.tool() def check_unconnected_pins() - str: 检查当前原理图中所有未连接的引脚返回未连线引脚列表和位置信息 # 遍历所有元件检查每个引脚的连接状态 ...这个工具非常实用。原理图里漏画一条线、忘记放一个电源符号AI一眼就能扫出来。实现原理不算复杂遍历原理图里每个元件的每根引脚检查是否有一个以上的连接点即可。如果没有连接点就记录下这个引脚的位号和引脚名。工具三元器件库模糊搜索mcp.tool() def search_component_library(keyword: str) - str: 搜索Altium Designer元件库中的元器件返回匹配的库条目 # 遍历AD自带的库文件按关键词匹配 ...布线的时候集成库检索很烦人我在现网用的时候发现这个工具特别受用。比如你想找一颗适合做Buck电路的电源芯片一句“帮我找一颗输入电压20V以上、输出电流3A、带EN使能的DC-DC芯片”AI就能自动去AD库里面匹配。工具四布局密度热力图分析这个工具稍微高级一点需要结合PCB文件里的元件坐标来计算。原理是先对板子区域做栅格化处理再统计每个栅格内元件的数量最后把密集区域标记出来给出拥挤度排名。AI有了这个分析结果就能给出合理的布局调整建议。这些工具的背后都是AD本身就能完成的动作。MCP协议的作用是让AI能够“学会”调用它们而且调用完之后能理解返回结果。3.4 配置AI客户端连接MCP Server写完了MCP Server接下来要做的就是让AI客户端连上来。我用的客户端是Claude Desktop在它的配置文件claude_desktop_config.json里加上MCP Server的配置就行。{ mcpServers: { altium-mcp-server: { command: python, args: [D:/workspace/altium_mcp_server.py], env: { PYTHONIOENCODING: utf-8 } } } }注意这个PYTHONIOENCODING: utf-8别看它不起眼没有这行配置中文输出到客户端的时候大概率会乱码尤其是当库名、位号里有中文的时候。连接成功后在对话框里直接说“打开我桌面上那个PMIC电源板的原理图帮我检查一下有没有漏连的引脚”AI就会自动完成操作。如果你的AD还没打开对应的工程文件也可以再加一个open_project工具让AI直接调用来打开文件。我试过用OpenAI接口对接本地部署的Qwen2.5-7B来跑这套MCP协议效果也挺不错。因为所有工具调用的指令格式都是标准的JSON结构只要模型的能力足够强就能理解“什么时候该调用工具”这个逻辑。4. 深度集成玩法从查数据到改设计4.1 原理图审查让AI当你的“第一道质检员”我现在日常使用频率最高的功能就是让AI做原理图审查。以前画完原理图全靠自己瞪大眼睛一条线一条线地过。现在我把这个工作交给了AI。AI审查的维度相当丰富我注入了不少硬件工程领域的审查规则。比如检查ERC电气规则检查标志物AD在原理图里有一个ERCWarning对象专门记录电气规则违规。AI可以通过MCP工具读取这些默认标记然后给出解释和修正建议。另一个更有意义的检查项是检查网络命名规范。很多公司内部的原理图规范要求电源网络的命名必须带电压等级比如VCC_3V3、VCC_5V0地网络必须有明确的标识GND、AGND、PGND差分对必须有固定的前后缀。我把这些规则写成JSON配置挂到MCP Server里AI在做设计审查的时候会自动加载这些规则。实测效果不错。有一回检查一块接口板的原理图AI居然发现了一个我完全没注意到的问题一个I2C的上拉电阻被接到了PWR_FLAG网络上而没有真正连到电源。这种问题人眼极难分辨因为原理图上两个网络的标号看起来就是相近的但实际上一个接的是电源层一个是测试点。4.2 BOM管理与替代料建议BOM表的管理也很占工程师时间。以前整理BOM都是手动复制到Excel里再根据供应商网站判断是否缺货、有没有替代料。这套AIEDA的方案也把这个流程打通了。MCP Server里定义了一个parse_bom工具从当前原理图直接生成BOM数据。关键是可以直接对接供应商API或本地的现货表拿实时库存和价格数据。我在自己的方案里对接的是本地Excel库存表里面记录了常用料的价格、库存、最小起订量等。AI会把这些信息整理成一份报告这颗料库存紧张建议提前备货这颗料单价太高可能有成本更低的替代方案。最精华的地方在于AI返回的报告不是冷冰冰的表格而是带着分析逻辑的完整建议。它会告诉你为什么替换成某颗料是合理的因为封装兼容、电气参数相近而且库存更充足。4.3 布局走线评估AI不是替代工程师而是辅助决策这个方向我不建议一上来就“全自动布局”这种危险选项但确实可以做评估辅助。比如你完成一版布局后可以让AI检查几个关键维度高速信号走线有没有跨分割去耦电容和芯片电源引脚之间的距离是否合理差分对的等长情况如何热敏元件是否靠近了功率发热源MCP Server端的工具主要是读取PCB数据做规则分析后返回违规项列表。AI在这里扮演的角色是“评审专家”帮你发现常见问题、给出修改优先级建议而不是替你画走线。原因很简单AI对信号的完整性和板子物理结构的理解还没达到能独立完成专业布局的程度。在可预见的未来它更适合做“审查者”而不是“设计者”。这种AI辅助的模式实际用起来的体验就很不一样了。以前我画完板子得自己盯着每一个模块反复检查现在更像是多了一个助手在旁边帮你过检虽然不会完全替代你的判断但确实能帮你把明显的问题先挑出来。5. 常见问题与排查技巧实录5.1 MCP Server启动失败的常见原因这套流程里最容易出问题的环节就是MCP Server的启动和连接。很多朋友第一次接触按配置写完启动报错就不知道怎么办了。我把自己的排查经验整理成了表格。症状根本原因解决方案客户端提示Failed to connect to MCP serverMCP服务器没有启动或崩溃先在命令行单独执行脚本看有没有报错信息工具列表是空的MCP协议版本不兼容升级mcp和fastmcp到最新版本AD无法连接报COM错误AD没有以管理员权限运行或Python里没初始化COM在代码里执行pythoncom.CoInitialize()中文乱码编码配置不对在MCP配置的env里加PYTHONIOENCODING: utf-8我见过不少人是卡在环境变量上的。如果你用了虚拟环境记得在MCP Server配置里把python改成虚拟环境里Python的绝对路径否则客户端会默认用系统Python去启动导致依赖缺失直接起不来。5.2 AD的API权限问题一个让人抓狂的坑AD的API权限系统很变态默认情况下外部程序能访问的AD功能是受限的。有些接口必须通过AD的Configure Platform菜单里的权限设置才能启用。我踩过最深的坑是用来读取PCB板框的接口在未授权的情况下AD直接返回空对象代码不报错但数据就是拿不到。那个时候排查了很久几乎怀疑是代码逻辑出了问题。后来才知道需要在AD的Preferences - System - Platform - Permissions里面手动勾选允许外部程序访问板框数据。如果你也碰到类似情况脚本跑起来不报错、不崩溃、但返回的数据很诡异就先去检查AD的权限设置。宁可多花几分钟在权限设置上也不要浪费时间在代码里瞎调试。另外一个经验是使用GetActiveObject方式连接AD时如果同时打开了多个AD实例连接的是哪一个是不确定的。我的建议是用这套系统之前先关掉所有AD窗口只打开一个工程。否则AI读取到的可能是完全错误的文档。5.3 模型上下文窗口不够用怎么办AI能处理的上下文是有限的这是所有基于大模型方案都要面对的问题。如果你把整个PCB文件的几千个元件全部塞给AI再让它分析它会直接拒绝或者回答一些无关紧要的内容。我的解决方案是“分级加载”。第一层只是让AI知道“板子上有哪些元件类别”传输的是统计信息比如电阻多少个、电容多少个、IC多少个、总元件数是多少。第二层才是详细数据当用户问“找到U3旁边的所有去耦电容”时AI才按需去加载那部分详细信息。这个方法其实很像用户用户用地图App的体验一开始看到的是概览图放大了才能看到街道。5.4 性能瓶颈AD操作慢导致AI响应超时AD的COM接口操作是同步的读取一个大型PCB文件可能需要十几秒。而AI客户端调用外部工具的默认超时时间往往只有30秒。如果你连续调用了多个工具很容易就把时间耗光了。针对这个问题我做了一个线程池的优化。把耗时的AD数据读取操作放到后台线程里MCP工具先返回一个任务IDAI轮询查询任务状态。这个方案的响应速度快很多用户体验也更好。但这里有一个新的问题AD的COM接口在后台线程里调用会出现线程模型不兼容的问题。解决方案是确保所有的AD操作都在同一个线程里串行执行用队列把多个任务排队。我这边的代码是维护了一个ThreadPoolExecutor(max_workers1)强制单线程执行。其实大多数情况下不需要这个复杂的优化。只要保证工具粒度设计合理每次只做一件事并且控制一次会话中调用的工具次数就不会触发超时。这里给个参考一次完整的“原理图审查”会话AI大概会调用6-9个工具总耗时通常在30秒左右不会超过你心里的舒适上限。6. 扩展思路与落地场景这套方案的想象力边界6.1 企业级设计规范自动审查如果你在一家有一定规模的公司里做硬件一定知道企业设计规范这东西。一份好的设计规范通常有几十页规定的都是细节元件位号字体、丝印大小、走线最小线宽、阻抗控制要求、安全间距……这些规则让老工程师把新人的错误扼杀在摇篮里。MCP协议这套方案天然适合做这种规范检查的自动化。可以把企业的设计规范翻译成一条条规则加载到MCP Server的检查工具里。AI在审查设计的时候不光是检查AD自带的DRC规则还会加载企业自定义的规范。哪个元件位号丝印太小、哪条走线间距不符合标准AI直接列出修正清单。这个方法我已经在一个朋友的公司试过效果非常好。他们原来每次发板子给PCB厂之前都要手动走一遍规范检查流程耗时半天到一天。现在这个工作量缩短到了大约20分钟而且由AI完成的。唯一的遗憾是目前只覆盖了大部分常用规则还有一些需要人眼判断的检查项暂时无法替代。6.2 跨团队协作的“AI翻译官”硬件工程师和采购、生产、测试之间的沟通成本极大。随手举一个例子工程师把PCB设计文件发给采购采购看不懂原理图只能拿到BOM表之后用Excel挨个查料。这个流程里信息传递的损耗非常大。我在MCP服务器上加了一个generate_report工具可以自动生成面向不同角色的设计报告。给采购看的报告主要是BOM、价格、库存状态给生产看的报告是装配图、标注了特殊工艺要求给测试看的报告是测试点列表、背板信号定义。AI在这里起到了一个“翻译官”的作用把设计数据翻译成不同角色能快速使用的信息格式面向不同的人给不同的输出。这个思路比起简单的“图纸自动化”来说更贴近真实工作流里宕机的那一环节。6.3 团队内AI协作模式共同进化最后说一个比较前瞻但我已经在尝试的方向让AI方案在团队里持续积累经验。我把每一次AI辅助设计的过程都记录下来保存为Session记录。这些记录包含用户提的问题、AI调用了哪些工具、用户后续手动做了哪些修正。这些Session记录最终会沉淀成一个知识库。用这个知识库做一个RAG检索增强生成应用后续其他工程师再遇到类似问题AI就能参考之前的处理经验给出更准确的建议。本质上就是让这套系统越用越“懂”你们团队的做事风格和产品需求。我已经跑了一段时间目前这套MCP桥接方案最关键的价值反而不是“AI代替人干活”而是“AI让人更愿意处理设计中的数据问题”。以前要做数据分析和规则检查得专门写脚本、跑脚本、看日志现在就是跟AI聊几句话的事这种体验的变化才是能真正让硬件工程师接受AI的根本原因。回头聊几句实操心得。这套方案里最花时间的不是MCP本身而是把AD的API接口摸清楚尤其是那些数据类型的细节不同版本的AD在返回数据的数值精度甚至字段名称上都有微妙差异。所以如果你准备落地建议先固定AD版本再动手写MCP工具不然排查问题需要反复横跳累感不爱。最后再分享一个小技巧你给MCP工具起的名字和写的描述决定AI能不能正确用它。描述写得太笼统AI不知道什么时候调写得太窄概率匹配不到。我自己琢磨出来的经验是一个工具描述控制在80字以内说明清楚功能、输入参数、返回数据格式以及最常见的应用场景。这种打磨工具参数的功夫跟当年调AI提示词是一个道理工具即是“提示词”命名和描述到位了效果自然就出来了。