ETABS MCP について
ETABS MCPは、構造エンジニアやAIエージェント向けのMCPサーバーです。CSI ETABSの公式APIを使い、構造物のモデリング、荷重設定、解析、設計、検査を行います。厳選されたワークフロー用ツールに加え、稼働中のバージョンのAPIを反映して呼び出せます。
主な機能
- 01モデルを作成し構造、材料、荷重を設定
- 02構造解析と設計チェックを実行
- 03結果、設計データ、データベーステーブルを確認
- 04モデルビューを描画しオブジェクトを検索
- 05ETABS API全体を検索して呼び出し
- 06破壊的操作の確認と読み取り専用モード
活用シーン
- 01建物モデルを生成して荷重を適用
- 02モデルを解析して層間変位と部材設計を確認
- 03結果を調べてインポート可能なテーブルを編集
- 04厳選ツールにないETABS操作をAPI経由で実行
MCP 対応
ETABS MCPはstdioまたはHTTP経由で、71の構造設計ツール、ETABS API呼び出し、リソース、プロンプトをMCPクライアントに提供します。実行中のETABSに接続するか、ETABSを起動します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
71掲載時のツール一覧 · 1 週間前に更新
このツールにパラメーターはありません。
詳細
ETABS 23 のライブセッションからレンダリング:すべての部材、たわみ、D/C 比は実際の値です。MP4
etabs-mcp
ETABS の中で使える AI エージェント。
CSI ETABS v22+ 向けのエージェント型 Model Context Protocol サーバーです。Claude Code、Codex、Factory Droid、Cursor など、あらゆる MCP クライアントが、エンジニアと同じ方法で、公式 ETABS API を通じて構造物のモデル化、荷重設定、解析、設計、検査を行えます。すべての呼び出しは実際のシグネチャと照合されます。
特長
ETABS には膨大な自動化 API があり、143 のインターフェース、到達可能な 1,293 のメソッド、58 の列挙型を備えています。一方で、ref 配列、ステータスコード、表面化しにくい癖も数多くあります。エージェントが取り組むべきなのは建物の設計であり、COM マーシャリングとの格闘ではありません。
etabs-mcp は、エージェントに次の 2 つのレイヤーを提供します。
| 厳選された 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 バージョンのライブシグネチャと照合して検証されます。 |
主な特長
|
完全な網羅性で、推測不要 |
エンジニアの視点で確認 |
インタラクティブなデータベース |
|
安全性を重視した設計 |
バージョンに適応 |
エージェント向けに設計 |
クイックスタート
要件: 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
エージェントを接続する
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(リモートエージェント、複数のクライアント)
etabs-mcp --transport streamable-http --port 8765
あとは、次のように依頼するだけです:
「2 層の鉄骨フレームをモデル化してください。6 m × 5 m のスパンを 2×1 ベイ配置とし、柱は W14X90、梁は W18X35、スラブ厚は 200 mm にします。 SDL 1.5 kPa と積載荷重 3 kPa を適用して解析を実行し、T₁、風による層間変位、鉄骨の最大 D/C 比を報告し、 3D ビューも表示してください。」
サーバーは自動的に接続します。実行中の ETABS に接続するか、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:グリッド、階、鉄骨のモーメントフレーム/ブレース構造またはコンクリートのフレーム/壁構造、スラブ、支持、ダイアフラム、重力荷重を1回の呼び出しで生成 |
| 解析と設計 | 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 (層間変形角、ねじれ/軟弱階/重量の不規則性、モード質量、RS と 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) があります。
例:厳選されたツールでカバーされていない操作
// 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": { ... } }
エージェントに見えるもの
上の映像は、1回の記録されたセッションから切り出したものです。エージェントは 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
モデルのデータをもとに描画された、エージェント独自のビューです。ETABSを非表示にした状態で動作し、フォーカスを奪うこともありません。また、ETABS APIではGUIを切り替えられないビューも表示できます。
![]() | ![]() | ![]() |
color_by="design_ratio" | deformed_case="EQX", color_by="displacement" | color_by="section", theme="light" |
エージェントが 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
ETABS ではなく、API をリバースエンジニアリングしています。 このサーバーは公式に文書化された OAPI のみを使用し、ETABS エンジンへのパッチ適用や逆コンパイルは行いません。API の範囲は、同梱されている相互運用アセンブリからマッピングしました。
ETABSv1.dllの REA 静的メタデータ分析: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として認識しません。すべての引数を 1 要素の型付き配列と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 秒で失敗 0 件のツール呼び出し 42 件を実行します。
| 手順 | 検証内容 |
|---|---|
| モデル | 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 件を読み取り、Interactive Database 経由で 1 件を編集し、API 経由で検証 |
| ライフサイクル | ロック解除、保存(.EDB)、スクリーンショット、ETABS の正常終了 |
ライブ v0.2 テストスイート: tests/live/test_live_v2.py は、3 階建て、部材 63 本のモデルで、追加されたすべてのツールを ETABS に対して実行します。
| 手順 | 検証内容 |
|---|---|
| 単位 | "3.5 m"、"4200 mm"、"500 mm" の入力が正しい値として反映される |
| 検索とラベル付け | 柱 27 本、Story2 の梁 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 が正確に 0 になる |
| 可視化 | 設計比、変形、断面、平面図のレンダリング。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 | 実行中の ETABS に attach するか、新しく 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 用のベアラートークン。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) |
安全性モデル
| レベル | 例 | 動作 |
|---|---|---|
| read | Get*、Count*、テーブル、結果 | 常に許可 |
| write | Set*、Add*、解析、設計 | 読み取り専用モードではブロック |
| destructive | Delete*、モデルの新規作成/オープン、ロック解除(結果を削除)、ETABS の終了 | confirm=true が必要 |
| blocked | InternalExec、プラグインフック、アクティブオブジェクトの切り替え | 常に呼び出し不可 |
etabs_menu 経由で実行するメニューコマンドにも confirm=true が必要です。また、HTTP 経由ではすべてのリクエストにベアラートークンを含める必要があります。
プロジェクト構成
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 ツールのタイムアウトを延長してください(エージェントを接続するを参照)。
- ETABS のメジャーバージョンを切り替える:サーバーを再起動してください。1 つのプロセスでホストできる
ETABSv1.dllは 1 つです。
Apache-2.0 © Moha2005269 · ETABS は Computers and Structures, Inc. の商標です。このプロジェクトは独立しており、CSI とは提携しておらず、CSI による承認も受けていません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。





