OPC UA Modeler について
OPC UA Modelerは、OPC UA情報モデルの構築や編集を行うエージェント向けのMCPサーバーです。コンパニオン仕様の型や単位をオフラインで調べられるほか、モデルの検証、生成、リバースエンジニアリング、作成に対応します。
主な機能
- 01コンパニオン仕様の名前空間と型の検索
- 02名前空間依存関係の解決
- 03型のメンバーと再利用可能なブロックの確認
- 04工学単位記号の検索
- 05モデルの検証、生成、逆変換、作成
活用シーン
- 01産業モデルに使うOPC UA型の選定
- 02モデリング前の名前空間依存関係の確認
- 03YAMLモデルの検証と診断情報の確認
- 04YAMLモデルとNodeSet2 XMLの相互変換
MCP 対応
OPC UAの探索、単位検索、モデル操作のツールをstdio経由でMCPクライアントに公開します。探索ツールはオフラインで動作し、モデル操作にはホストAPIまたは設定済みのローカルバックエンドを使えます。一部の操作にはAPIキーが必要です。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://api.opcua-modeler.sterfive.io/api/mcpclaude mcp add --transport http node-opcua-node-opcua-modeler https://api.opcua-modeler.sterfive.io/api/mcp{"mcpServers":{"node-opcua-node-opcua-modeler":{"type":"http","url":"https://api.opcua-modeler.sterfive.io/api/mcp"}}}Cursor で開く{"servers":{"node-opcua-node-opcua-modeler":{"type":"http","url":"https://api.opcua-modeler.sterfive.io/api/mcp"}}}VS Code で開く{"mcpServers":{"node-opcua-node-opcua-modeler":{"type":"http","url":"https://api.opcua-modeler.sterfive.io/api/mcp"}}}{"mcpServers":{"node-opcua-node-opcua-modeler":{"serverUrl":"https://api.opcua-modeler.sterfive.io/api/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
12| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| aliases | array | はい | 解決するコンパニオン仕様のエイリアス(例:["machineTool", "robotics"]) |
詳細
node-opcua-modeler-mcp-server
AI エージェントにOPC UA コンパニオン仕様の型システム(33 の産業用名前空間にわたる 817 の型と 1,533 の工学単位)へのアクセスを提供し、OPC UA 情報モデルの検証、生成、リバースエンジニアリング、作成を可能にする MCP サーバーです。
Node.js 用 OPC UA スタックとして最も広く使われている node-opcua を基盤に構築されています。
なぜ使うのか?
AI エージェントが OPC UA 情報モデルを構築するには、次の情報が必要です。
- 利用可能なコンパニオン仕様の型(DI、Machinery、Robotics、Machine Tools など)
- 各型が持つコンポーネント、プロパティ、メソッド
- 必要な名前空間の依存関係
- 有効な工学単位の記号(UNECE Rec. 20)
この MCP サーバーは、これらすべての疑問にオフラインで、無料で、数ミリ秒以内に答えます。
クイックスタート
Claude Desktop の場合
claude_desktop_config.json に追加します。
{
"mcpServers": {
"opcua-modeler": {
"command": "npx",
"args": ["-y", "node-opcua-modeler-mcp-server"],
"env": {
"OPCUA_MODELER_API_KEY": "stfv_your_api_key_here"
}
}
}
}
注記: API キーは、検出ツール(オフライン)および
opcua_model_validate(1 日 50 回の匿名呼び出し)では省略できます。opcua_model_generate、opcua_model_reverse、opcua_model_createでは必須です。opcua-modeler.sterfive.io で登録し、Settings → API からキーを作成してください。無料プランでは 90 日間、1 日 25 回呼び出せます。有料プランについては料金をご覧ください。
任意の MCP クライアントの場合
npx node-opcua-modeler-mcp-server
サーバーは Model Context Protocol を使用して stdio 経由で通信します。
ホスト型 API の代わりにローカルバックエンドを使用する場合
同じマシンで OPC UA Modeler CLI を実行している場合、モデルツールをホスト型 API の代わりに CLI から提供できます。YAML がホスト外に送信されることはありません。
サーバーを起動します(serve エンタイトルメントを含むライセンスが必要です)。
opcua-modeler serve
次に、MCP クライアントの設定で環境変数を 1 つ設定します。
{
"mcpServers": {
"opcua-modeler": {
"command": "npx",
"args": ["-y", "node-opcua-modeler-mcp-server"],
"env": {
"OPCUA_MODELER_BACKEND": "local"
}
}
}
}
このモードでは API キーは不要です。クライアントがローカルエンドポイントとその認証情報を自動的に検出します。
| 変数 | 値 | 用途 |
|---|---|---|
OPCUA_MODELER_BACKEND | cloud(デフォルト)、local | モデルツールを提供するバックエンド |
OPCUA_MODELER_API_KEY | stfv_… | API キー。cloud バックエンドのみ |
OPCUA_MODELER_API_URL | URL | ホスト型 API のベース URL を上書き |
注記
- 2 つのバックエンドが混在することはなく、相互にフォールバックすることもありません。
localを選択してサーバーが起動していない場合、呼び出しは失敗し、モデルがホスト型 API に送信されることなく、その旨の説明が表示されます。 - 7 つの検出ツールはこのパッケージ内で実行され、どちらの設定でもオフラインで動作します。
opcua_model_create(AI 生成)はcloudバックエンドでのみ利用できます。
ツール
list_namespaces
エイリアス、URI、依存関係とともに、33 の OPC UA コンパニオン仕様の名前空間をすべて一覧表示します。
→ list_namespaces()
← [
{ "alias": "di", "name": "OPC UA for Devices", "uri": "http://opcfoundation.org/UA/DI/", "dependencies": [] },
{ "alias": "robotics", "name": "OPC UA for Robotics", "uri": "http://opcfoundation.org/UA/Robotics/", "dependencies": ["di", "ia"] },
...
]
resolve_dependencies
コンパニオン仕様のエイリアスについて、依存関係チェーン全体を解決します。YAML の namespaces: ブロック用に、トポロジカルソートされた一覧を返します。
→ resolve_dependencies({ aliases: ["machineTool"] })
← ["di", "ia", "machinery", "isa95JobControl", "machineryJobs", "machineTool"]
list_types
コンパニオン仕様の名前空間で定義されているすべての ObjectType と VariableType を一覧表示します。
→ list_types({ alias: "robotics" })
← [
{ "browseName": "MotionDeviceType", "kind": "ObjectType", "subtypeOf": "di:ComponentType", ... },
{ "browseName": "AxisType", "kind": "ObjectType", "subtypeOf": "di:ComponentType", ... },
...
] // 25 types
get_type_details
型の全構造(継承したメンバーを含むコンポーネント、プロパティ、メソッド、インターフェース)を取得します。
→ get_type_details({ alias: "robotics", browseName: "MotionDeviceType" })
← {
"browseName": "MotionDeviceType",
"kind": "ObjectType",
"subtypeOf": "di:ComponentType",
"interfaces": ["di:IVendorNameplateType", "di:ITagNameplateType"],
"components": [
{ "browseName": "robotics:Axes", "nodeClass": "Object", "typeDefinition": "FolderType", "modellingRule": "Mandatory" },
{ "browseName": "robotics:PowerTrains", "nodeClass": "Object", "typeDefinition": "FolderType", "modellingRule": "Mandatory" },
...
],
"properties": [
{ "browseName": "di:Manufacturer", "dataType": "LocalizedText", "modellingRule": "Mandatory" },
{ "browseName": "robotics:MotionDeviceCategory", "dataType": "MotionDeviceCategoryEnumeration", "modellingRule": "Mandatory" },
...
]
}
search_types
キーワードを指定して、すべての関連仕様から型を検索します。
→ search_types({ query: "temperature" })
← [
{ "alias": "glass", "browseName": "MotorTemperatureTooHighEventType", ... },
{ "alias": "padim", "browseName": "TemperatureMeasurementVariableType", ... },
{ "alias": "amb", "browseName": "OverTemperatureConditionClassType", ... }
]
find_reusable_block
機能を指定して、再利用可能なインターフェースとアドインを検索します。メンバー名またはキーワードを渡すと、それをすでに公開している標準ブロックが返されます。メンバーを手動で再定義するより、既存のブロックを組み合わせてください。
→ find_reusable_block({ query: "SerialNumber" })
← [
{
"browseName": "di:IVendorNameplateType",
"alias": "di",
"kind": "interface",
"matchedMembers": ["di:SerialNumber"],
"members": ["di:Manufacturer", "di:Model", "di:SerialNumber", ...]
},
{
"browseName": "machinery:MachineIdentificationType",
"alias": "machinery",
"kind": "addin",
"matchedMembers": ["di:SerialNumber"],
"members": ["machinery:Location", "di:SerialNumber", ...]
}
]
適用方法は kind で判断できます。interface は interfaces: に、addin は addIns: に指定します。
find_engineering_unit
公式の UNECE Rec. 20 工学単位記号を検索します。あいまい検索と自然言語の別名に対応しています。
→ find_engineering_unit({ query: "celsius" })
← { "symbol": "°C", "matchType": "alias", "confidence": 1 }
→ find_engineering_unit({ query: "revolutions per minute" })
← { "symbol": "r/min", "matchType": "alias", "confidence": 1 }
→ find_engineering_unit({ query: "bar" })
← { "symbol": "bar", "matchType": "exact", "confidence": 1 }
get_dsl_reference ☁️
YAML DSL 文法リファレンス(ファイルヘッダー、トップレベルセクション、型とインスタンスの構文、よくある間違いの一覧)を取得します。API キーは不要です。
このパッケージには同梱せず、API から提供します。そのため、エージェントが参照する内容は、出力を検証するバリデーターと常に一致します。
→ get_dsl_reference()
← { "version": "1", "reference": "# OPC UA Modeler YAML DSL ..." }
opcua_model_validate ☁️
OPC UA YAML モデルの正当性を検証します。重要度、コード、メッセージ、行番号を含む診断情報を返します。API キーなしで利用できます(IP アドレスごとに 1 日 50 回まで)。
→ opcua_model_validate({ yaml: "namespaces:\n di:\n..." })
← {
"valid": true,
"diagnostics": [
{ "severity": "warning", "code": "W001", "message": "...", "line": 42 }
]
}
パスを指定する場合(ローカル stdio サーバーのみ)。 yaml の代わりに model_path を渡します。OPCUA_MODELER_BACKEND=local の場合、モデルの imports: はモデル自身のフォルダー(同じ階層、次に deps/)から解決されます。VS Code と同じ動作です。uri: だけを指定したインポートにはこの方法が必要です。テキストとして送信されたモデルの場合、opcua-modeler serve の起動フォルダーを基準に解決されるためです。ホスト型コネクターではパスを指定できません。
→ opcua_model_validate({ model_path: "C:/models/cip/cip-example.model.yaml" })
opcua_model_generate ☁️
検証済みの YAML モデルから OPC UA NodeSet2.xml とシンボル CSV を生成します。API キーが必要です。
NodeId を安定させてください。 シンボル CSV には、各ノードに割り当てられた NodeId が記録されます。以前の CSV を渡さずに再生成すると新しい ID が割り当てられ、以前の ID に紐づいていたすべてのサーバーとクライアントが動作しなくなります。そのため、呼び出しごとに目的を指定してください。
| 呼び出し | 意味 |
|---|---|
symbols_csv: "<previous CSV>" | 再生成:既存ノードの ID を維持します。CSV テキスト、または前回の呼び出しで返された base64 の symbols_csv を指定できます。 |
mode: "new" | 初回生成:シンボルはまだありません。 |
mode: "renumber" | 意図的に新しい ID を割り当てます。 |
自己完結型の .opcua.yaml ストリーム | 独自のシンボルテーブルを含み、それを再利用します。 |
これらのいずれも指定されていない呼び出しは、バックエンドに到達する前に SYMBOLS_DECISION_REQUIRED で拒否され、再試行方法を示すメッセージが返されます。
パスを指定する場合(ローカル stdio サーバーのみ)。 yaml の代わりに model_path を渡します。サーバーはモデルと対応する <name>.model.symbols.csv を読み込み、モデルと同じフォルダー(または output_dir)に <name>.Nodeset2.xml、CSV、および include_docs を指定した場合は <name>.md を書き込みます。生成されるファイルとバイト列は opcua-modeler generate と同じです。変更されていないファイルには手を加えません。大きなデータが会話を通過することはありません。demoRobot のサンプルでは、結果は約 71 KB の base64 ではなく、約 700 文字です。include_artifacts: "inline" を指定すると、アーティファクトも返されます。OPCUA_MODELER_BACKEND=local の場合、モデルの deps/ フォルダーも解決されます。ホスト型コネクターではパスを指定できません。
→ opcua_model_generate({ model_path: "models/pump.model.yaml" })
← {
"valid": true,
"mode": "update",
"symbols_source": "paired-file",
"symbols": { "reused": 41, "new": 1, "dropped": 0, "renumbered": 0, "match": 1,
"new_names": ["Pump_Temperature"], "dropped_names": [] },
"files": [
{ "role": "nodeset", "path": ".../pump.model.Nodeset2.xml", "bytes": 54210, "status": "written" },
{ "role": "symbols", "path": ".../pump.model.symbols.csv", "bytes": 1312, "status": "written" }
],
"diagnostics": [],
"hints": [{ "code": "SYMBOLS_UPDATED", "level": "info", "message": ".../pump.model.symbols.csv updated: 1 new id(s) (Pump_Temperature)." }],
"next_steps": ["Commit pump.model.Nodeset2.xml, pump.model.symbols.csv with the model."]
}
テキストとして渡す場合。 yaml を渡します。アーティファクトは artifacts.nodeset2_xml / artifacts.symbols_csv で base64 エンコードされて返され、同じ symbols、hints、next_steps も含まれます。
ヒントコード:INVALID、IDS_RENUMBERED、IDS_DROPPED、SYMBOLS_LOW_MATCH(渡された CSV は別のモデルのものと思われます)、SAVE_SYMBOLS、SYMBOLS_UPDATED、STREAM_TABLE_NOT_UPDATED、WARNINGS_PRESENT、PREFER_STREAM。拒否コード:SYMBOLS_DECISION_REQUIRED、SYMBOLS_REQUIRED、SYMBOLS_FILE_EXISTS、MODE_CONFLICT。
opcua_model_reverse ☁️
NodeSet2.xml ファイルを YAML DSL 形式にリバースエンジニアリングします。API キーが必要です。ローカル stdio サーバーでは、xml の代わりに xml_path を渡します。ファイルはサーバーによって読み込まれるため、数メガバイトある関連仕様でも会話を通過しません。
→ opcua_model_reverse({ xml: "<?xml version=..." })
← {
"yaml": "namespaces:\n di:\n...",
"diagnostics": []
}
opcua_model_create ☁️
自然言語による説明から、AIを使ってOPC UA YAMLモデルを生成します。AIが関連するコンパニオン仕様を自動検出し、ドキュメント付きの検証済みモデルを生成して、検証エラーを自動修正します。APIキーが必要です。
→ opcua_model_create({ prompt: "A robotic welding cell with two robot arms, each having 6 axes, temperature monitoring on each motor" })
← {
"success": true,
"yaml": "namespaces:\n di:\n robotics:\n...",
"attempts": 2,
"diagnostics": [],
"model": "gemini-2.5-pro",
"tokens": { "input": 4200, "output": 1800 }
}
→ opcua_model_create({ prompt: "A CNC lathe with spindle speed and temperature", forceSpecs: ["di", "cnc"] })
← {
"success": true,
"yaml": "namespaces:\n di:\n cnc:\n...",
"attempts": 1,
"diagnostics": [],
"model": "gemini-2.5-pro",
"tokens": { "input": 3500, "output": 1200 }
}
対応範囲
コンパニオン仕様(33)
| エイリアス | 仕様 | 型 |
|---|---|---|
padim | PA-DIM向けOPC UA | 101 |
ijtBase | IJT Base向けOPC UA | 65 |
machineTool | 工作機械向けOPC UA | 63 |
scales | はかり向けOPC UA | 58 |
lads | ラボ機器向けOPC UA | 53 |
di | デバイス向けOPC UA | 44 |
glass | ガラス製造向けOPC UA | 36 |
machineVision | マシンビジョン向けOPC UA | 36 |
adi | 分析装置向けOPC UA | 35 |
commercialKitchenEquipment | 業務用厨房機器向けOPC UA | 35 |
i4aas | I4AAS向けOPC UA | 32 |
fxAc | OPC UA FXオートメーションコンポーネント | 28 |
robotics | ロボティクス向けOPC UA | 25 |
fxCm | OPC UA FX接続マネージャー | 24 |
ia | 産業オートメーション向けOPC UA | 20 |
amb | AMB向けOPC UA | 18 |
autoId | AutoID向けOPC UA | 18 |
iolink | IO-Link向けOPC UA | 16 |
metalForming | 金属成形向けOPC UA | 16 |
| …ほか13件 | ||
| 合計 | 型を含む32の名前空間 | 817型 |
レジストリには33件の仕様が含まれています。irdiは辞書エントリーの名前空間であり、ObjectTypeもVariableTypeも定義していません。これらの数値はcatalog/catalog.jsonに基づいており、test/catalog-coverage.test.tsで照合されるため、気付かないうちに変化することはありません。
工学単位
公式のUNECE Rec. 20の記号1,533件に、自然言語の別名136件(例:「celsius」→ °C、「revolutions per minute」→ r/min)を加えたものです。すべての別名はモデラーエンジンが受け付ける記号に解決されます。検索処理で記号が新たに作られることはありません。
仕組み
サーバーには、node-opcuaを介してOPC Foundationの公式NodeSet2.xmlファイルから抽出したすべての型情報を含む、事前生成済みのcatalog.jsonが同梱されています。すべてのクエリにはこの静的カタログを使って応答するため、ネットワークもAPIキーも必要ありません。
┌──────────────────────────────────────────────────┐
│ node-opcua-modeler-mcp-server │
│ │
│ LOCAL TOOLS (offline, free) │
│ ┌────────────────────────────────────────┐ │
│ │ catalog.json (1.7 MB) │ │
│ │ • 33 companion spec registries │ │
│ │ • 817 type summaries + details │ │
│ │ • 1,533 engineering units │ │
│ └────────────────────────────────────────┘ │
│ 7 tools → query the catalog │
│ │
│ CLOUD TOOLS (via api.opcua-modeler.sterfive.io) │
│ 5 tools → reference / validate / generate / │
│ reverse / create │
│ │
│ stdio transport (JSON-RPC) │
└──────────────────────────────────────────────────┘
使用例
- AI支援によるOPC UAモデリング — エージェントが型を検索し、依存関係を解決して、YAML/XMLモデルを生成する前に単位記号を検証できます
- Copilotとの統合 — コーディングアシスタントにOPC UAの知識を追加できます
- 産業用デジタルツインの設計 — コンパニオン仕様の型階層を対話形式で調べられます
- OPC UAの学習 — AIに型とその関係について説明を求められます
要件
- Node.js ≥ 18
関連情報
- GitHubのOPC UA Modeler — オープンなYAML DSL仕様、JSON Schema、モデルの例を掲載しています。言語に関する質問や問題を投稿する場所です
- OPC UA Modeler — ウェブアプリ — ブラウザーでOPC UA情報モデルを作成、検証、生成できます
- 製品ページ — OPC UA Modelerの概要、機能、ライセンス
- ドキュメント — ガイド、YAML DSLリファレンス、使用方法
- 仕様リファレンス — OPC UA情報モデル仕様のレンダリング版
- node-opcua — Node.js向けの完全なOPC UAスタック
- Model Context Protocol — AIツール統合のためのオープンプロトコル
ライセンス
3つのレイヤーを以下にまとめて示します。
| 対象 | ライセンス |
|---|---|
このパッケージ(node-opcua-modeler-mcp-server、MCP クライアントとそのカタログ) | バージョン 1.5.0 以降はApache License 2.0です。商標およびサードパーティに関する通知はNOTICEをご覧ください。バージョン 1.0~1.4.x は MIT ライセンスで公開されており、引き続き同ライセンスが適用されます。 |
ホステッド OPC UA Modeler API(クラウドバックエンドが呼び出す opcua-modeler.sterfive.io/api/v1) | Sterfive API 利用規約が適用されます。匿名での利用状況の確認、無料プランおよび有料プランを提供しています。 |
OPC UA Modeler CLI と opcua-modeler serve(ローカルバックエンド) | Sterfive の商用ライセンスが適用されます。製品ページをご覧ください。 |
「OPC UA Modeler」と「Sterfive」は Sterfive SAS の商標です。Apache ライセンスによって、これらの商標を使用する権利が付与されることはありません。貢献は Developer Certificate of Originに基づいて受け付けています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。