Altium MCP服务器
TLDR:使用Claude来控制或询问有关Altium项目的问题。 这是一个模型上下文协议(MCP)服务器,它提供了一个通过Python与Altium Designer交互的接口。该服务器允许以编程方式查询和操纵PCB设计。
注意:让克劳德在PCB上放置组件目前很难。
示例命令
- 运行所有输出作业
- 在附加的数据表中为零件创建符号,并将当前打开的符号用作参考示例。
- 根据随附的MPM3650开关稳压器数据表创建原理图符号,并确保严格遵守符号放置规则。(注意:需要打开原理图库。用途
AppData\Roaming\Claude\Claude Extensions\local.dxt.altium-mcp\server\symbol_placement_rules.txt描述为引脚放置规则。请根据自己的喜好进行修改。) - 在我的运算放大器库中找到LM358符号并打开它
- 根据随附的LM324数据表为四路运算放大器创建多部分符号(创建具有共享V+/V电源引脚的a、B、C、D部分)
- 在随附的数据表中为SMD零件创建PCB封装,并将其添加到我打开的PcbLib中
- 复制我选择的布局。(将提示用户现在选择目标组件。支持组件、轨迹、圆弧、通路、多边形和区域)
- 展示我所有的内心世界。显示顶层和底层。关闭焊膏。
- 把Molex设计的所有零件都给我
- 给我U4的描述和零件号
- 根据开关稳压器的最佳实践,将选定的零件放在我的pcb上。注意:它尝试了,但位置很糟糕。希望我能找到一种方法来改善这一点。
- 给我一份我设计中所有IC代号的清单
- 给我所有长度匹配规则
安装MCP服务器
最简单的安装方法是使用Claude Code,将其指向此仓库并要求它为您安装。或者,请参阅下文。
- 确保Claude安装了Python 3.10+:
drop down > File > Settings > Extensions > Advanced > Python如果没有,请安装Python并将其添加到PATH中。 - 下载
altium-mcp.dxt来自的桌面扩展文件 发布 - 在Windows上的克劳德桌面中:
drop down > File > Settings > Extensions > Advanced > Install Extension...选择.dxt文件
您不需要重新启动Claude,现在您应该在搜索栏附近的工具菜单中看到altium mcp。
创建新的.dxt(面向开发人员)
Bootstrap Venv(推荐)
这种方法附带了一个小型引导脚本(start_server.py)它创建了一个虚拟环境,pip在首次启动时在用户的机器上安装依赖关系。.dxt很小(约60 KB),适用于任何Python 3.10+版本。
将预编译包捆绑在 server/lib/ 不再建议使用——当用户的Python版本与用于构建捆绑包的版本不匹配时,它就会中断 .pyd 文件(例如,为3.11编译的pydantic_core在3.13上失败)。
它是如何工作的:
start_server.py(在回购根目录处)检查server/.venv/Scripts/python.exe- 如果venv不存在,它会创建一个,pip会安装固定的依赖项
- 然后发射
server/main.py使用venv的Python - 首次发射大约需要20-30秒;后续发射是即时的
构建步骤:
- 确保
start_server.py存在于repo根目录(内容见下文) - 确保
server/main.py没有旧的site.addsitedir在顶部砍 - 更新
manifest.json:setentry_point到start_server.py,删除任何env/PYTHONPATH字段和使用manifest_version: "0.3" - 打包DXT——使用
dxt pack或手动压缩并重命名:
Compress-Archive -Path manifest.json, start_server.py, pyproject.toml, server -DestinationPath altium-mcp.zip
Rename-Item altium-mcp.zip altium-mcp.dxt不包括 server/lib/ 或 server/.venv/ 在.dxt中。 关键在于这些是在用户的机器上创建的。
start_server.py:
import subprocess
import sys
from pathlib import Path
SCRIPT_DIR = Path(__file__).parent
VENV_DIR = SCRIPT_DIR / "server" / ".venv"
REQUIREMENTS = [
"mcp[cli]==1.5.0",
"pillow>=11.1.0",
"pywin32>=310",
]
def ensure_venv():
python_exe = VENV_DIR / "Scripts" / "python.exe"
if python_exe.exists():
return str(python_exe)
subprocess.check_call([sys.executable, "-m", "venv", str(VENV_DIR)])
pip_exe = str(VENV_DIR / "Scripts" / "pip.exe")
subprocess.check_call([pip_exe, "install", "--quiet"] + REQUIREMENTS)
return str(python_exe)
if __name__ == "__main__":
venv_python = ensure_venv()
server_path = str(SCRIPT_DIR / "server" / "main.py")
sys.exit(subprocess.call([venv_python, server_path]))manifest.json 服务器部分:
"server": {
"type": "python",
"entry_point": "start_server.py",
"mcp_config": {
"command": "python",
"args": ["${__dirname}/start_server.py"]
}
}陷阱
这些是调试DXT构建过程中来之不易的经验教训。违反其中任何一项都会产生难以诊断的错误。
- 请勿使用
os.execv()在start_server.py. DXT安装到包含空格的路径上(Claude Extensions).在Windows上,os.execv在空间处分割路径并失败。使用sys.exit(subprocess.call([...]))相反。
- 针
mcp到==1.5.0. 使用>=1.5.0引入了最新版本,该版本对API进行了突破性的更改(FastMCP.__init__()放下了description郭)。服务器代码是针对1.5.0编写的。
- 请勿使用
manifest_version: "0.4"随着"type": "uv". Claude Desktop尚不支持它。你会得到Invalid manifest: server: Required.使用"type": "python"随着manifest_version: "0.3".
- 移除后
site.addsitedirhack frommain.py,修复pathlib.Path参考。 黑客包括import pathlib在文件的顶部。稍后的日志设置将使用pathlib.Path(...)哪个会扔NameError一旦这种进口消失了。更改为Path(...)--thefrom pathlib import Path导入已存在于文件中,只需确保它在日志设置之前出现。
- 请勿捆绑
server/lib/在DXT中。 这是旧的方法,违背了venv bootstrap的目的。
传统:捆绑服务器/lib(不推荐)
这种方法将所有依赖项捆绑在一起 server/lib/ 和设置 PYTHONPATH 指向它。它产生一个更大的.dxt(约17 MB) 仅当用户的Python版本与用于编译捆绑包的版本匹配时才有效.
- 填充包:
python -m pip install --no-cache-dir --target server/lib -r requirements.txt - 设置清单
entry_point到server/main.py并添加"env": {"PYTHONPATH": "${__dirname}/server/lib"}到mcp_config - 包裹:
npm install -g @anthropic-ai/dxt && dxt pack
DXT资源
配置
首次启动claude时,服务器将自动尝试定位您的Altium Designer安装。它将搜索以开头的所有目录 C:\Program Files\Altium\AD* 并使用修订号最大的版本。如果找不到任何可执行文件,则在首次运行服务器时,系统将提示您手动选择Altium可执行文件(X2.EXE)。Altium的DelphiScript脚本用于在mcp服务器和Altium之间创建API。
可用工具
服务器提供了几个与Altium Designer交互的工具:
输出作业
get_output_job_containers:使用当前打开的。OutJob文件,读取所有可用的输出容器run_output_jobs:传递当前打开的输出作业容器名称列表。OutJob可以运行任意数量的任务。.OutJob必须是当前关注的文档。
组件信息
get_all_designators:获取当前电路板中所有组件标识符的列表get_all_component_property_names:获取所有可用组件属性名称的列表get_component_property_values:获取所有组件的特定属性值get_component_data:按指示符获取特定组件的详细数据get_component_pins:获取指定组件的引脚信息
示意图/符号
get_schematic_data:获取指定组件的原理图数据create_schematic_symbol(油管):将带有引脚类型和坐标的引脚列表传递给Altium脚本。通过以下方式支持多部分符号(例如四运算放大器)part_count参数和aowner_part_id每个引脚上的字段(共享电源/GND引脚使用0)。还支持活动低引脚名称超号,在每个超号字符后放置一个反斜杠(例如。R\E\S\E\T\渲染为RESET与overbar)。get_symbol_placement_rules:创建符号的辅助工具,该工具读取~\AppData\Roaming\Claude\Claude Extensions\local.dxt.altium-mcp\server\symbol_placement_rules.txt获取符号创建的引脚放置规则。get_library_symbol_reference:创建符号的辅助工具,以开放库符号为例创建符号search_library_symbol:在原理图库(.SchLib)中按名称搜索符号并导航到它。支持部分名称匹配。如果提供了路径,将在Altium中打开库文件,如果没有,将显示文件选择器。
布局操作
get_all_nets:从pcb返回唯一网络列表create_net_class(油管):从网络列表中创建一个网络类get_pcb_layers:获取详细的图层信息,包括电气、机械、图层对等。get_pcb_layer_stackup:获取堆叠信息,如电介质、层厚度等。set_pcb_layer_visibility(油管):打开或关闭任何一组图层。例如,启用内层。关掉丝绸。get_pcb_rules:获取布局中所有pcb规则的规则描述。get_selected_components_coordinates:获取当前选定组件的位置和旋转信息move_components:按X和Y偏移移动指定组件layout_duplicator(油管):假设您已经选择了PCB上的源组件,则开始布局复制。layout_duplicator_apply:行动#2layout_duplicator.Agent将自动使用部件信息来预测源组件和目标组件之间的匹配,然后将这些匹配发送到位置脚本。
与Altium的内置布局复制不同,这种布局复制的酷之处在于,不必匹配确切的组件,因为LLM可以查看描述并了解哪些组件匹配,哪些组件不匹配。这真的不能硬编码。 Placement Duplicator
PCB封装库
两者
get_screenshot:截取当前视图的Altium PCB窗口或原理图窗口的屏幕截图。如果它是打开的,但聚焦了不同的文档类型,它应该自动聚焦其中任何一个。注意:克劳德不太擅长分析电路或布局截图等图像。ChatGPT非常擅长它,但他们还没有发布MCP,所以这个功能在未来会更有用。
服务器状态
get_server_status:检查MCP服务器的状态,包括Altium和脚本文件的路径
运作原理
服务器使用脚本桥与Altium Designer通信:
- 它将命令请求写入
workspace\request.json - 它启动Altium,并指示运行
Altium_API.PrjScr脚本 - 脚本处理请求并将结果写入
workspace\response.json - 服务器读取并返回响应
参考文献
- 从Jeff Collins和William Kitchen的精简版中获取脚本的项目路径
- BlenderMCP:听说MCP在Blender中使用,我受到了启发,并将其作为参考。https://github.com/ahujasid/blender-mcp
- 使用Petar Perisin和Randy Clemmons的CopyDesignatorsToMechLayerPair脚本作为参考。复制对象(用于布局复制器)
- Petar Perisin的Select Bad Connections脚本:用于理解如何行走连接到焊盘的pcb图元(轨道、弧形、过孔等)
- Matija Markovic和Petar Perisin分发脚本:了解如何正确地让GUI知道我何时更新了曲目网络
- 来自Poly的Petar Perisin的房间:用作检测Poly与焊盘重叠的参考,因为我无法找到更传统的方法来工作。
- Petar Perisin的图层面板脚本:用作获取图层和更改图层可见性的参考
- Jeff Collins有一个XIA_Release_Manager.pas脚本,它教会了我输出作业的艺术。请参阅他在Altium论坛上的帖子:https://forum.live.altium.com/#/posts/189423
贡献者
免责声明
这是第三方集成,不是Altium制造的。由...制作 咖啡音乐
一切:
- 更改选择筛选器:
- scripts-libraries\Scripts - PCB\FilterObjects\ - scripts-libraries\Scripts - SCH\SelectionFilter\
- 显示/隐藏面板:
DXP/ReportPCBViews.pas - 创建规则:
PCB/CreateRules.pas - 运行DRC:IPCB_Board。RunBatchDesignRuleCheck(
- 将光标移动到位置:IPCB_Board。XCursor,IPCB_Board。YCursor
- 为封装添加get原理图和pcb库路径。
- 从库中添加get符号
- 记录每个工具的响应时间
- 添加到原理图页
- 转到带有组件指示符的表
- 董事会。选择位置(x,y,“测试”);
- 缩放到选定对象:
- 更改原理图选择过滤器:SelectionFilter.pas
- 放置原理图对象(从库中放置元件):PlaceSchObjects.pas
- 如何从“组件”面板中的库中读取组件?
TODO测试: 需要添加以下测试单元
get_pcb_layersset_pcb_layer_visibilitylayout_duplicatorget_pcb_screenshot
