关于 ETABS MCP
ETABS MCP 是面向结构工程师及 AI Agent 的 MCP 服务,通过 CSI ETABS 官方 API 建模、加载、分析、设计和检查结构。它提供工程工作流工具,也可按运行版本反射并调用完整 API。
主要功能
- 01创建模型并配置结构、材料和荷载
- 02运行结构分析与设计检查
- 03查询结果、设计数据和数据库表
- 04渲染模型视图并查找对象
- 05搜索并调用完整 ETABS API
- 06支持只读模式与破坏性操作确认
适用场景
- 01生成建筑结构模型并施加荷载
- 02分析模型并检查漂移和构件设计
- 03查看结果并编辑可导入的数据库表
- 04通过 API 执行未覆盖的 ETABS 操作
MCP 相关
ETABS MCP 通过 stdio 或 HTTP 向 MCP 客户端暴露 71 个工程工具、ETABS 完整 API 调用、资源和提示词。它连接正在运行的 ETABS,或启动 ETABS。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
71收录的工具列表 · 更新于 1 周前
此工具无需参数。
详细介绍
由实时 ETABS 23 会话渲染:每个构件、挠度和 D/C 比都是真实数据。MP4
etabs-mcp
让你的 AI Agent 进入 ETABS。
面向 CSI ETABS v22+ 的智能体 Model Context Protocol 服务。Claude Code、Codex、Factory Droid、Cursor 及任何 其他 MCP 客户端,都可以通过官方 ETABS API,像工程师一样对结构进行建模、加载、分析、设计和检查, 且每次调用都会根据真实签名进行校验。
为什么选择它
ETABS 拥有庞大的自动化 API:143 个接口、1,293 个可调用方法、58 个枚举。它还充斥着
ref 数组、状态码和不易察觉的特殊行为。Agent 应该专注于设计建筑,而不是纠结于 COM 编组。
etabs-mcp 为 Agent 提供两个层次:
| 71 个精选工具 | 面向工程师的工作流:etabs_generate_building、etabs_define_seismic_load、etabs_code_checks、etabs_run_analysis、etabs_get_results、etabs_run_design、etabs_render_view、etabs_find_objects、etabs_edit_table 等。 |
| 完整 API | etabs_search_api → etabs_describe_api → etabs_call_api。每个 ETABS 方法都可以通过普通 JSON 调用,并根据当前运行的 ETABS 版本的实时签名进行校验。 |
亮点
|
全面覆盖,绝不猜测 |
像工程师一样观察 |
交互式数据库 |
|
安全设计 |
适配不同版本 |
为 Agent 打造 |
快速开始
**要求:**Windows · ETABS 22 或更高版本(需授权)· Python 3.10+ · .NET 8 Desktop Runtime(随 ETABS 22+ 安装)。
从 PyPI 安装:
pip install etabs-mcp
或者使用 uv 运行,无需安装:
uvx etabs-mcp --list-installs
**Claude Desktop,一键安装:**根据你的 Python 版本,从最新版本下载 etabs-mcp-<version>-py3XX.mcpb 并打开。Claude Desktop 会安装扩展,并包含所有依赖项。
检查是否能找到 ETABS:
etabs-mcp --list-installs
连接你的 Agent
Claude Code
claude mcp add etabs -- etabs-mcp
大型模型的分析可能需要几分钟;请使用 MCP_TOOL_TIMEOUT=600000 延长工具超时时间。
OpenAI Codex
~/.codex/config.toml
[mcp_servers.etabs]
command = "etabs-mcp"
tool_timeout_sec = 600
Factory Droid · Cursor · Claude Desktop · Windsurf · 任意 MCP 客户端
{
"mcpServers": {
"etabs": {
"command": "etabs-mcp",
"env": { "ETABS_MCP_CONNECT_MODE": "auto" }
}
}
}
HTTP(远程 Agent、多个客户端)
etabs-mcp --transport streamable-http --port 8765
然后直接提出要求:
“建立一个 2 层钢框架,2×1 跨,每跨 6 m × 5 m,柱采用 W14X90,梁采用 W18X35,楼板厚 200 mm。 施加 1.5 kPa SDL 和 3 kPa 活荷载,运行分析,报告 T₁、风致侧移和最不利钢构件 D/C 比,并展示 3D 视图。”
服务会自动连接:连接到正在运行的 ETABS,或启动一个实例。
71 个工具
| 领域 | 工具 |
|---|---|
| 会话 | etabs_list_installations · etabs_connect · etabs_status · etabs_disconnect |
| 模型与文件 | etabs_model_overview · etabs_new_model · etabs_open_model · etabs_save_model · etabs_set_units · etabs_get_stories · etabs_set_stories |
| 几何 | etabs_add_frames · etabs_add_areas · etabs_add_points · etabs_list_objects · etabs_delete_objects · etabs_set_restraints · etabs_assign_section · etabs_select |
| 属性 | etabs_list_properties · etabs_define_material · etabs_define_frame_section · etabs_define_area_section |
| 荷载 | etabs_define_load_patterns · etabs_assign_loads · etabs_define_combinations · etabs_list_load_definitions |
| 侧向体系 | etabs_define_seismic_load(ASCE 7-16 ELF)· etabs_define_wind_load(ASCE 7-16/7-22,其他规范可通过字段设置)· etabs_define_response_spectrum · etabs_set_mass_source · etabs_assign_diaphragm · etabs_set_modal_case |
| 生成 | etabs_generate_building:一次调用即可生成网格、楼层、钢结构抗弯/支撑或混凝土框架/墙体体系、楼板、支座、楼板刚性隔板和重力荷载 |
| 分析与设计 | etabs_run_analysis · etabs_analysis_status · etabs_unlock_model · etabs_get_results · etabs_run_design · etabs_get_design_summary · etabs_design_codes |
| 混凝土与墙体 | etabs_get_concrete_design(梁、柱、节点)· etabs_run_shear_wall_design · etabs_get_wall_design(墙肢、连梁)· etabs_get_slab_design(条带、冲切) |
| 规范检查 | etabs_code_checks(层间位移、扭转/软弱层/重量不规则、振型质量、反应谱与 ELF 对比)· etabs_scale_response_spectrum |
| 后台作业 | etabs_job_status · etabs_job_wait:使用 background=true 进行分析和设计,不会触发客户端超时 |
| 数据库表 | etabs_list_tables · etabs_get_table · etabs_edit_table |
| 查看与查询 | etabs_render_view · etabs_find_objects · etabs_screenshot · etabs_show_window · etabs_refresh_view |
| 跟踪与撤销 | etabs_what_changed · etabs_checkpoint · etabs_list_checkpoints · etabs_restore_checkpoint |
| 导出与报告 | etabs_export_model(完整的 .e2k 文本,分页)· etabs_design_report(Markdown)· etabs_assign_label(组、墙肢、连梁) |
| 菜单与对话框 | etabs_menu(浏览并运行 API 未提供的 ETABS 菜单命令)· etabs_dialogs |
| 实例 | etabs_instances:同时操作多个 ETABS(etabs_connect(instance=...)),切换或移除实例 |
| 完整 API | etabs_search_api · etabs_describe_api · etabs_call_api · etabs_call_api_batch |
此外还有 资源(etabs://api/interfaces、etabs://api/interface/{name}、etabs://api/enum/{name}、
etabs://server/info)以及一个 提示词(etabs_build_and_check),引导 Agent 完成整个工作流。
示例:精选工具未涵盖的任意操作
// 1. find it
etabs_search_api({ "query": "frame releases" })
// → SapModel.FrameObj.SetReleases(Name, ref II[], ref JJ[], ref StartValue[], ref EndValue[], ItemType)
// 2. call it: plain JSON, validated and converted to the exact .NET types
etabs_call_api({
"path": "FrameObj.SetReleases",
"args": { "Name": "13", "II": [false,false,false,false,false,true],
"JJ": [false,false,false,false,false,true],
"StartValue": [0,0,0,0,0,0], "EndValue": [0,0,0,0,0,0] }
})
// → { "ok": true, "ret": 0, "outputs": { ... } }
Agent 看到的内容
上方影片截取自一次录制的会话。Agent 通过 etabs-mcp 建立了一栋 6 层、4×3 跨的支撑钢结构建筑,
对其进行分析并运行 AISC 360-16 检查,发现 48 根梁超限,于是增大它们的截面,并反复重新运行所有步骤,直到没有构件超出承载力。
![]() | ![]() | ![]() |
| 建模 · 354 根构件、72 块楼板、30 次工具调用 | 设计 · 48 根构件超限,最大 D/C 为 1.22 | 迭代 · W24X76 × 48 → 0 根构件超限,最大 D/C 为 0.91 |
etabs_render_view
Agent 根据模型数据绘制的专属视图。即使 ETABS 隐藏,它也能正常工作,不会占用焦点,并能显示 ETABS API 无法切换 GUI 显示的内容。
![]() | ![]() | ![]() |
color_by="design_ratio" | deformed_case="EQX", color_by="displacement" | color_by="section", theme="light" |
Agent 使用 etabs_screenshot 捕获的同一模型在 ETABS 中的画面。
工作原理
flowchart LR
A["AI agent<br/>Claude Code · Codex · Droid · Cursor"] -- "MCP (stdio / HTTP)" --> S
subgraph S["etabs-mcp"]
direction TB
T["71 curated tools<br/>+ generic dispatcher"] --> P["Policy<br/>read-only · confirm · blocked"]
P --> C["Coercion<br/>JSON → typed args, ByRef placeholders"]
C --> K["API catalog<br/>live reflection of ETABSv1.dll"]
K --> W["Single STA worker thread"]
end
W -- "pythonnet / CoreCLR<br/>MethodInfo.Invoke" --> D["ETABSv1.dll<br/>(the installed version)"]
D -- "COM, cross-process" --> E["ETABS.exe"]
E -. "screen capture" .-> A
**对 API 进行逆向工程,而非对 ETABS 进行逆向工程。**此服务始终使用官方文档说明的 OAPI,不会修补或反编译 ETABS 引擎。其 API 范围根据随附的互操作程序集梳理而成:
- REA 对
ETABSv1.dll进行静态元数据分析:365 个类型、3,275 个方法定义、14,752 个参数。 - 反射转储工具(
tools/ApiDump)会将每个公共接口、签名、ByRef 标志、默认值和枚举写入etabs_api_spec.json。 - **交叉核对:**反射结果与原始元数据完全一致(例如,
cFrameObj+cAnalysisResults+cDatabaseTables= 136 个方法 + 1 个属性访问器 = REA 的 137 个)。 - 运行时,服务会重新反射已加载的 DLL,因此验证结果始终与所运行的 ETABS 相符。
让一切“开箱即用”的工程细节:
- **类型化封送。**pythonnet 会将 Python
int在object[]中装箱为PyInt,而反射无法将其用于Int32。每个参数都会通过一个单元素类型化数组和Array.Copy进行传递,因此 ETABS 收到的是实际的Int32/Double/枚举装箱对象和 ByRef 数组。 - **单线程。**ETABS 和 COM 代理并非线程安全;所有调用都会在单个工作线程上串行执行。
- 连接丢失(ETABS 已关闭或崩溃)会通过 HRESULT 检测到,并提示重新连接。
- 处理 ETABS 的特殊情况:
- 检测并还原 ETABS 静默重命名的库导入项(
W14X90→W14X90-1)。 - 编辑表格后,ETABS 会将模型文件报告为临时文件
.$et;保存时会映射回.EDB。 - 无单位的结果列(漂移比、质量比)会转换为数值,而
Label: "1"这样的 ID 会保留为字符串。 - GPU 绘制的视口在
PrintWindow中显示为空白,因此截图会从合成后的屏幕获取,之后焦点会交还给原窗口。
- 检测并还原 ETABS 静默重命名的库导入项(
经真实 ETABS 测试
离线(CI): 58 项测试。每个精选工具都会通过 FastMCP 对接一个模拟后端运行,该后端会针对真实的 ETABSv1.dll 目录解析并校验每次调用的参数类型。方法名或参数名错误时,会像在 ETABS 中一样失败。
实时端到端测试: tests/live/test_live_e2e.py 会将服务作为真实的 MCP 子进程启动,运行 ETABS 23.3.2,并在约 42 秒内执行 42 次工具调用,0 次失败:
| 步骤 | 验证结果 |
|---|---|
| 模型 | 2 层、26 根框架构件(库中的 W 型钢)、4 块楼板、6 个固定支座 |
| 荷载 | SDL / LL / 风荷载模式、面荷载 + 线荷载 + 节点荷载、2 个组合 + AISC 默认值 |
| 分析 | 所有工况均在 9.8 秒内完成;模型锁定 |
| 基底反力 | LL ΣFz = 360 kN = 3 kPa × 120 m²,完全一致;SDL 与楼板及线荷载的手算结果一致 |
| 模态 / 层间位移 | T₁ = 0.398 s · 最大风荷载层间位移角为 1/1846 |
| 设计 | 26 个钢构件(AISC 360-16),最大 D/C 为 0.35,0 个不合格 |
| 通用 API | 设置并读回构件释放,执行 9 次调用的批处理,验证状态码失败、校验错误和确认错误 |
| 表格 | 读取 26 个截面分配,通过交互式数据库编辑其中一项,并通过 API 验证 |
| 生命周期 | 解锁、保存(.EDB)、截图、正常关闭 ETABS |
实时 v0.2 测试套件: tests/live/test_live_v2.py 会在一个 3 层、63 个构件的模型中,针对 ETABS 驱动每个新增工具:
| 步骤 | 验证结果 |
|---|---|
| 单位 | "3.5 m"、"4200 mm"、"500 mm" 输入均正确换算为对应数值 |
| 查找与标注 | Story2 上有 27 根柱、12 根梁;长度 ≥ 7.5 m 的梁有 18 根(已选中);组往返验证 |
| 侧向荷载 | ASCE 7-16 地震(X、X±E)、自动风荷载、ASCE 7-16 反应谱 + RS 工况、质量源、12 块楼板上的楼板隔板、9 个振型 |
| 变更跟踪 | 手动编辑和新增梁均会报告;检查点可还原模型 |
| 后台作业 | 分析立即返回;其他调用会收到 busy;job_wait 会返回结果 |
| 结果 | EQX、WX 和 RSX 基底剪力;仅 X 向地震时 FY 恰为零 |
| 可视化 | 设计比、变形、截面和平面渲染;AISC 341 设计错误会被标记,绝不会显示为安全 |
| 导出与报告 | .e2k 截面信息、包含反力、振型、层间位移和设计结果的 Markdown 报告 |
实时 v0.3 测试套件: tests/live/test_live_v3.py:
| 步骤 | 验证结果 |
|---|---|
| 生成器 | 在非均匀网格(8/6/8 m)上生成 4 层混凝土剪力墙建筑;以 kip-ft 为单位生成钢支撑建筑 |
| 手算校核 | 钢结构建筑 LL ΣFz = 0.05 ksf × 90 ft × 50 ft × 3 层,完全一致 |
| 规范校核 | 层间位移(经 Cd 放大)、扭转、软弱层、重量、模态质量(12 个振型)、RS 与 ELF 对比 |
| RS 缩放 | 将反应谱缩放至 ELF 的 100%,重新分析,并验证比值为 1.00 |
| 混凝土与剪力墙 | 按 ACI 318-19 设计梁、全部 48 根柱及节点;通过菜单设计剪力墙,并读回墙肢结果 |
演示运行(tools/record_demo_data.py):一个 6 层钢支撑建筑,包含 354 个构件和 72 块楼板。LL ΣFz = 9,720 kN(= 3 kPa × 30 m × 18 m × 6 层,完全一致),风荷载 ΣFx = 432 kN(= 18 kN × 24 个节点,完全一致),T₁ = 1.71 s。重新设计循环将最大 D/C 从 1.22 降至 0.91。
pip install -e ".[dev]"
pytest # offline suite
ETABS_MCP_ARTIFACTS=docs/live pytest tests/live --live -s # drives your local ETABS
配置
| 环境变量 / 标志 | 默认值 | 含义 |
|---|---|---|
ETABS_MCP_CONNECT_MODE / --connect-mode | auto | attach 表示连接到正在运行的 ETABS,start 表示启动一个新实例,auto 表示如果已有实例打开则连接,否则启动 |
ETABS_MCP_VERSION / --etabs-version | newest | 要使用的 ETABS 主版本,例如 22 |
ETABS_MCP_INSTALL_DIR / --install-dir | auto | ETABS 程序文件夹 |
ETABS_MCP_VISIBLE / --hidden | visible | 启动时显示 ETABS 窗口 |
ETABS_MCP_READ_ONLY / --read-only | off | 拒绝所有会更改模型的调用 |
ETABS_MCP_ALLOW_DESTRUCTIVE / --allow-destructive | off | 对破坏性调用跳过 confirm=true 检查(用于 CI / 无人值守场景) |
ETABS_MCP_RUNTIME | coreclr | pythonnet 使用的 .NET 主机(netfx 作为后备选项) |
ETABS_MCP_MAX_ARRAY_ITEMS | 2000 | 限制 etabs_call_api 返回的数组长度 |
ETABS_MCP_MAX_TABLE_ROWS | 500 | 表格和结果的默认分页大小 |
ETABS_MCP_AUDIT_LOG / --audit-log | off | 将每次模型更改调用(时间、实例、调用、参数、结果)追加到 JSON-lines 文件 |
ETABS_MCP_TOKEN / --token | none | --transport streamable-http/sse 的 Bearer 令牌;要在 localhost 之外监听时必须提供 |
发布(维护者)
标记 vX.Y.Z 会运行 release.yml,执行测试、构建 wheel、sdist 和
.mcpb 包,并发布 GitHub 版本。PyPI 和 MCP Registry 使用无需令牌的可信发布:
在 pypi.org 添加可信发布者(此仓库、工作流 release.yml、环境 pypi),然后设置
仓库变量 PUBLISH_PYPI=true。之后的标签会发布到 PyPI,并在 MCP Registry 中列出此服务。
版本支持
| ETABS | 状态 |
|---|---|
| 23.x | ✅ 已通过实际运行验证(23.3.2) |
| 22.x | ✅ 支持:使用相同的 .NET 8 API;目录会从你安装的 DLL 反射生成 |
| 24+ | ✅ 预计可用:新方法会通过实时反射自动显示 |
| ≤ 21 | ❌ 不支持(.NET Framework 时代的 API) |
安全模型
| 级别 | 示例 | 行为 |
|---|---|---|
| 读取 | Get*、Count*、表格、结果 | 始终允许 |
| 写入 | Set*、Add*、分析、设计 | 只读模式下禁止 |
| 破坏性操作 | Delete*、新建 / 打开模型、解锁(删除结果)、关闭 ETABS | 需要 confirm=true |
| 禁止 | InternalExec、插件钩子、活动对象切换 | 永远不可调用 |
通过 etabs_menu 执行的菜单命令也需要 confirm=true,并且通过 HTTP 发送的每个请求都必须携带
Bearer 令牌。
项目结构
src/etabs_mcp/
server.py FastMCP assembly: tools, resources, prompt, agent instructions
session.py connection lifecycle + single worker thread + generic call()
dotnet.py pythonnet host, live reflection, typed marshalling, connection-loss detection
catalog.py API catalog: path resolution, search, describe
coerce.py JSON → signature-typed values, results → JSON
policy.py read / write / destructive / blocked classification
discovery.py ETABS installs and running instances
screenshot.py window capture
render.py offscreen model renderer (etabs_render_view)
units.py unit-aware lengths ("6 m", "20 ft", "250 mm")
gui.py ETABS menu commands through Windows UI Automation
http.py HTTP transports with bearer-token auth
tools/ curated tools (connection, model, generator, geometry, properties, loads, lateral,
analysis, concrete, checks, tables, view, insight, api)
mcpb/ Claude Desktop extension manifest server.json MCP Registry entry
data/etabs_api_spec.json reflected API of ETABSv1.dll
tools/ApiDump .NET reflection dumper that produced the API spec
tools/record_demo_data.py drives the MCP tools against live ETABS and records the showcase data
tools/render_hero.py renders the README film and stills from that data
tools/build_mcpb.py builds the Claude Desktop extensions
tests/ offline suite + live end-to-end test
故障排除
install_not_found:运行etabs-mcp --list-installs;如果 ETABS 安装在特殊位置,请设置ETABS_MCP_INSTALL_DIR。- 连接后没有任何反应:等待 ETABS 完成启动并关闭所有模态对话框;或者向
etabs_connect传入pid。 - 分析后无法编辑:模型已锁定。
etabs_unlock_model(confirm=true)会删除结果并解锁模型。 - 长时间分析在客户端超时:提高客户端的 MCP 工具超时时间(参见连接你的 Agent)。
- 切换 ETABS 主版本:重启服务;一个进程只托管一个
ETABSv1.dll。
Apache-2.0 © Moha2005269 · ETABS 是 Computers and Structures, Inc. 的商标。本项目独立运营,与 CSI 无关联,也未获得 CSI 的认可。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。





