mcpField
O
OPC UA Modeler

OPC UA Modeler

リモート
opcua-modeler.sterfive.io開発ツール25 日前に更新
リポジトリ公式サイト

OPC UA Modeler について

OPC UA Modelerは、OPC UA情報モデルの構築や編集を行うエージェント向けのMCPサーバーです。コンパニオン仕様の型や単位をオフラインで調べられるほか、モデルの検証、生成、リバースエンジニアリング、作成に対応します。

主な機能

  1. 01コンパニオン仕様の名前空間と型の検索
  2. 02名前空間依存関係の解決
  3. 03型のメンバーと再利用可能なブロックの確認
  4. 04工学単位記号の検索
  5. 05モデルの検証、生成、逆変換、作成

活用シーン

  1. 01産業モデルに使うOPC UA型の選定
  2. 02モデリング前の名前空間依存関係の確認
  3. 03YAMLモデルの検証と診断情報の確認
  4. 04YAMLモデルとNodeSet2 XMLの相互変換

MCP 対応

OPC UAの探索、単位検索、モデル操作のツールをstdio経由でMCPクライアントに公開します。探索ツールはオフラインで動作し、モデル操作にはホストAPIまたは設定済みのローカルバックエンドを使えます。一部の操作にはAPIキーが必要です。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://api.opcua-modeler.sterfive.io/api/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

パッケージ
npmnode-opcua-modeler-mcp-server1.6.1

ツール

12
パラメーター型必須説明
aliasesarrayはい解決するコンパニオン仕様のエイリアス(例:["machineTool", "robotics"])

詳細

node-opcua-modeler-mcp-server

npm version npm downloads/month npm downloads total License: Apache-2.0 MCP

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_BACKENDcloud(デフォルト)、localモデルツールを提供するバックエンド
OPCUA_MODELER_API_KEYstfv_…API キー。cloud バックエンドのみ
OPCUA_MODELER_API_URLURLホスト型 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)
エイリアス仕様型
padimPA-DIM向けOPC UA101
ijtBaseIJT Base向けOPC UA65
machineTool工作機械向けOPC UA63
scalesはかり向けOPC UA58
ladsラボ機器向けOPC UA53
diデバイス向けOPC UA44
glassガラス製造向けOPC UA36
machineVisionマシンビジョン向けOPC UA36
adi分析装置向けOPC UA35
commercialKitchenEquipment業務用厨房機器向けOPC UA35
i4aasI4AAS向けOPC UA32
fxAcOPC UA FXオートメーションコンポーネント28
roboticsロボティクス向けOPC UA25
fxCmOPC UA FX接続マネージャー24
ia産業オートメーション向けOPC UA20
ambAMB向けOPC UA18
autoIdAutoID向けOPC UA18
iolinkIO-Link向けOPC UA16
metalForming金属成形向けOPC UA16
…ほか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

関連情報

ライセンス

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に基づいて受け付けています。

© Sterfive SAS

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。