mcpField
O
OPC-UA MCP Server

OPC-UA MCP Server

ローカル
github.comその他5今日更新

OPC-UA MCP Server について

OPC-UA MCP Serverは、LLMを産業用OPC-UAサーバーに接続し、ライブデータの閲覧、検索、読み書き、購読を可能にします。永続キャッシュとアドレス空間のインデックスを備え、stdioまたはHTTPで通信します。

主な機能

  1. 01読み取りと型検証付き書き込み
  2. 02ノードの再帰的な閲覧
  3. 03インデックス化されたブラウズ名の検索
  4. 04ライブ更新の購読
  5. 05キャッシュと購読状態の永続化
  6. 06認証情報または証明書による認証

活用シーン

  1. 01OPC-UAアドレス空間の調査
  2. 02ノード値の読み取りや更新
  3. 03ノードのライブ変更の監視

MCP 対応

OPC-UA接続の管理、探索、検索、閲覧、読み書き、購読を行うMCPツールと、ノードデータおよびサーバー情報のリソースを提供します。クライアントはstdioまたはHTTPで接続できます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"mwieczorkiewicz-opcua": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"OPCUA_ENDPOINT",
"-e",
"OPCUA_AUTH_MODE",
"-e",
"OPCUA_USERNAME",
"-e",
"OPCUA_PASSWORD",
"-e",
"OPCUA_SECURITY_POLICY",
"-e",
"OPCUA_SECURITY_MODE",
"-e",
"SERVER_TRANSPORT",
"ghcr.io/mwieczorkiewicz/opcua-mcp:main-29734c4"
],
"env": {
"OPCUA_ENDPOINT": "<OPCUA_ENDPOINT>",
"OPCUA_AUTH_MODE": "<OPCUA_AUTH_MODE>",
"OPCUA_USERNAME": "<OPCUA_USERNAME>",
"OPCUA_PASSWORD": "<OPCUA_PASSWORD>",
"OPCUA_SECURITY_POLICY": "<OPCUA_SECURITY_POLICY>",
"OPCUA_SECURITY_MODE": "<OPCUA_SECURITY_MODE>",
"SERVER_TRANSPORT": "<SERVER_TRANSPORT>"
}
}
}
}
起動コマンドdocker run -i --rm -e OPCUA_ENDPOINT -e OPCUA_AUTH_MODE -e OPCUA_USERNAME -e OPCUA_PASSWORD -e OPCUA_SECURITY_POLICY -e OPCUA_SECURITY_MODE -e SERVER_TRANSPORT ghcr.io/mwieczorkiewicz/opcua-mcp:main-29734c4
設定が必要な環境変数
OPCUA_ENDPOINTOPC-UA server endpoint to connect to, e.g. opc.tcp://your-plc-host:4840
OPCUA_AUTH_MODEシークレットAuthentication mode against the OPC-UA server
OPCUA_USERNAMEUsername, required if OPCUA_AUTH_MODE=username
OPCUA_PASSWORDシークレットPassword, required if OPCUA_AUTH_MODE=username
OPCUA_SECURITY_POLICYOPC-UA transport security policy, e.g. Basic256Sha256
OPCUA_SECURITY_MODEOPC-UA transport security mode, e.g. SignAndEncrypt
SERVER_TRANSPORTMCP transport: stdio (for local MCP clients) or http (for remote/hosted deployments)

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocighcr.io/mwieczorkiewicz/opcua-mcp:main-29734c4

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

OPC-UA MCP サーバー

LLM が stdio または HTTP 経由で OPC-UA 産業オートメーションサーバーのライブデータを読み取り、書き込み、ブラウズ、検索、サブスクライブできる MCP サーバーです。永続キャッシュと、アドレス空間の検索可能なインデックスを内蔵しています。

https://github.com/user-attachments/assets/0b676e6e-17ce-42f5-918f-9a615e939008

クイックスタート

同梱の Microsoft OPC-UA テストサーバーと、Claude がアクセスできる公開トンネルを使って、最初から最後まで最も手早く動作を確認する方法です。

git clone https://github.com/mwieczorkiewicz/opcua-mcp.git
cd opcua-mcp
make compose-up        # starts a test OPC-UA server, opcua-mcp, and a public HTTPS tunnel
make connector-url      # prints a URL like https://xyz.trycloudflare.com/mcp

その URL を Claude の Settings → Connectors → Add custom connector に貼り付けてから、サーバーのブラウズや値の読み取りを依頼します。完了したら make compose-down で停止してください。このトンネルで公開される内容や、代わりに独自の OPC-UA サーバーに接続する方法については、docs/deployment.md を参照してください。

ローカルでのビルドと実行
go build -o opcua-mcp ./cmd/opcua-mcp.go

# stdio (default) - no OPC-UA connection until the client calls opcua_connect
./opcua-mcp

# HTTP - connects eagerly at startup
SERVER_TRANSPORT=http OPCUA_ENDPOINT=opc.tcp://localhost:4840 ./opcua-mcp

Go 1.26 以降が必要です。テストサーバー/コンテナ化されたデプロイには、任意で Docker も必要です。

機能

  • 読み取り/書き込み:ノード値の読み取りと書き込みに対応します。書き込み時には型を検証し、型が一致しない値がデバイスに送信される前に拒否します。
  • ブラウズ:アドレス空間を一階層ずつ、または再帰的にブラウズできます。ノード ID ではなく名前でノードを検索することもできます。
  • サブスクライブ:プッシュ型のライブ更新に対応します。サブスクリプションは再起動後も維持され、再接続時に自動的に再確立されます。
  • キャッシュ:読み取り結果、ブラウズ結果、型情報をディスク(bbolt)にキャッシュするため、繰り返しの検索でデバイスへの往復通信が発生しません。書き込み時には該当するエントリーが自動的に無効化されます。
  • 検出と検索:アドレス空間をバックグラウンドで検出し、部分一致やあいまい検索によるブラウズ名の検索に対応するため、Bleve でインデックス化します。
  • 認証:匿名認証、ユーザー名/パスワード認証、証明書認証に対応し、OPC-UA のセキュリティポリシーとモードを設定できます。

キャッシュレイヤー、サブスクリプションマネージャー、検出インデックスの連携については、docs/architecture.md を参照してください。

MCP ツール

ツール説明
opcua_read1 つ以上のノード値を読み取ります。サブスクライブ済みのノードはライブキャッシュから提供されます。それ以外のノードは、max_age_ms でキャッシュ値を許可しない限り、ライブで読み取ります。
opcua_writeノードに値を書き込みます。書き込み前に、値の型をノードの型と照合して検証します。
opcua_get_value単一ノードの値を読み取ります。opcua_read の便利なラッパーです。
opcua_get_value_by_name検出インデックスを介して、ノード ID ではなくブラウズ名で値を読み取ります。
opcua_browseノードの直下の子ノードを一覧表示します。
opcua_browse_nodesノードから深さの上限まで再帰的にブラウズし、子ノードを親ノードの下にネストして表示します。
opcua_node_infoノードのメタデータ(データ型、アクセスレベルなど)を取得します。
opcua_find_similar_nodes検出インデックスを使って、ブラウズ名をあいまい一致で検索します。
opcua_subscribe指定した間隔で、1 つ以上のノードのプッシュ型更新を開始します。
opcua_unsubscribeID を指定するか、対象ノードの名前を指定してサブスクリプションをキャンセルします。
opcua_list_subscriptions有効なサブスクリプションを一覧表示します。
opcua_connect / opcua_disconnect接続を明示的に管理します(主に stdio モードで使用します)。
opcua_server_infoOPC-UA サーバーのメタデータを取得します。
opcua_discovery_statsバックグラウンドの検出キャッシュの統計情報(ノード数、深さの分布、有効フラグ)を取得します。
opcua_force_discovery次のサイクルを待たずに、検出の更新をただちに実行します。
opcua_debug_search / opcua_ensure_server_nodesノードが検索結果に表示されない原因を調査するための診断ツールです。

MCP リソース

リソース説明
opcua://node/{node_id}ノードデータです。例:opcua://node/ns=2;i=1。複数のノードには、カンマ区切りのリストを指定できます。
opcua://serverOPC-UA サーバー情報です。

設定

設定は、優先順位の低い順に次の3つのソースから読み込まれます(viper を使用)。

  1. 組み込みのデフォルト値(以下の表を参照)。
  2. 任意の設定ファイル(TOML、YAML、JSON、または viper がサポートするその他の形式)。デフォルトでは、存在する場合に ./config.{yaml,yml,toml,json,...} が読み込まれます。明示的なパスを指定するには CONFIG_FILE=/path/to/config.toml を設定してください。設定ファイルは完全に任意です。環境変数だけでも引き続き十分です。
  3. 環境変数(SERVER_*、OPCUA_*、MCP_*、SEARCH_*、STORE_*)。設定ファイルよりも常に優先されるため、環境変数のみを使用する既存のデプロイも変更なしで引き続き動作します。

設定ファイルでは、環境変数名を小文字にし、各プレフィックスの下にネストして記述します。たとえば、SERVER_HTTP_PORT は次のようになります。

server:
  http_port: "8080"
サーバー
変数デフォルト説明
SERVER_TRANSPORTstdiostdio または http
SERVER_HTTP_PORT8080HTTP トランスポートのポート
SERVER_LOG_LEVELinfodebug、info、warn、error
SERVER_LOG_FORMATjsonjson または text
SERVER_LOG_OUTPUTstdoutstdout、stderr、または file(stdio モードでは stdout が MCP ストリームを伝送するため、stderr に強制されます)
SERVER_LOG_FILE-ログファイルのパス。SERVER_LOG_OUTPUT=file の場合は必須です
SERVER_LOG_ADD_SOURCEfalseログエントリーにソースファイル名と行番号を追加します
OPC-UA 接続
変数デフォルト説明
OPCUA_ENDPOINTopc.tcp://localhost:4840サーバーのエンドポイント
OPCUA_AUTH_MODEanonymousanonymous、username、または certificate
OPCUA_USERNAME / OPCUA_PASSWORD-AUTH_MODE=username の場合は必須です
OPCUA_CERT_FILE / OPCUA_KEY_FILE-AUTH_MODE=certificate の場合は必須です
OPCUA_SERVER_CERT-サーバー証明書ファイルのパス
OPCUA_SECURITY_POLICYNoneNone、Basic128Rsa15、Basic256、Basic256Sha256、Aes128_Sha256_RsaOaep
OPCUA_SECURITY_MODENoneNone、Sign、SignAndEncrypt
OPCUA_REQUEST_TIMEOUT30sリクエストごとのタイムアウト
OPCUA_SESSION_TIMEOUT60sセッションのタイムアウト
OPCUA_MAX_RETRIES3接続の再試行回数
OPCUA_RETRY_DELAY1s再試行までの待機時間
MCP
変数デフォルト説明
MCP_NAMEOPC-UA MCP Serverクライアントに通知するサーバー名
MCP_VERSION1.0.0クライアントに通知するサーバーのバージョン
MCP_ENABLE_TOOLStrueツールを有効にします
MCP_ENABLE_RESOURCEStrueリソースを有効にします
MCP_ENABLE_PROMPTSfalseプロンプトを有効にします
MCP_HTTP_PATH/mcpHTTP エンドポイントのパス
検出と検索
変数デフォルト説明
SEARCH_ENABLE_DISCOVERYtrueバックグラウンドでのノード検出を有効にします
SEARCH_DISCOVERY_INTERVAL30sアドレス空間を再クロールする間隔
SEARCH_DISCOVERY_ROOT_NODEi=85クロールの起点となるルートノード(Objects フォルダー)
SEARCH_MAX_DISCOVERY_DEPTH10最大クロール深度
SEARCH_MAX_NODES_PER_BROWSE10000ブラウズ呼び出しで返されるノード数の上限
SEARCH_ENABLE_SEARCHtrueBleve 検索インデックスを有効にします
SEARCH_INDEX_PATH./search_index検索インデックスのディレクトリ
SEARCH_MAX_RESULTS100検索ごとの最大結果数
SEARCH_MIN_SCORE0.1最小一致スコア
SEARCH_ENABLE_CACHEtrueリードスルーキャッシュの有効・無効を切り替えます。false にすると、すべての opcua_read/opcua_write/opcua_browse_nodes 呼び出しが常にライブで実行され、キャッシュ導入前とまったく同じ動作になります
永続ストア

オンディスクの bbolt データベースを使用して、読み取り時キャッシュとサブスクリプションの永続化を実現します。

変数デフォルト説明
STORE_DB_PATHmcp_opcua_store.dbデータベースファイルのパス
STORE_OPEN_TIMEOUT5sファイルを開く際にロック解除を待つ時間
STORE_TYPEINFO_TTL24hキャッシュされた型情報の有効期間
STORE_BROWSE_TTL5mキャッシュされたブラウズ結果の有効期間
STORE_BATCH_WINDOW25msサブスクリプション通知をストアにフラッシュする頻度
STORE_BATCH_MAX_ITEMS2501 バッチでフラッシュする通知の最大数
STORE_NOTIFY_CHAN_BUFFER1024受信するサブスクリプション通知のバッファーサイズ

ストアを開けない場合(前回の正常でないシャットダウンによる古いロックや、読み取り専用ファイルシステムなど)、サーバーは警告をログに記録して動作を続けます。この場合、キャッシュは無効になり、サブスクリプションツールはエラーを返します。それ以外のすべてのツールには影響しません。

テレメトリー

opcua-mcp は、このオープンソースプロジェクトの保守の優先順位付けに役立てるため、匿名の集計利用状況テレメトリー(使用されたツール、キャッシュヒット率、エラーのカテゴリ)を収集します。ノード ID、エンドポイント URL、ノード値、認証情報は収集しません。デフォルトで有効です。収集内容の詳細については、docs/telemetry.md を参照してください。

次のいずれかを設定してオプトアウトできます。

変数効果
DO_NOT_TRACK=1プロジェクトをまたいで使われるコミュニティ標準の設定(consoledonottrack.com)
OPCUA_MCP_TELEMETRY=falseこのプロジェクト独自の設定

Docker

docker build -t opcua-mcp .
docker run -p 8080:8080 -e SERVER_TRANSPORT=http -e OPCUA_ENDPOINT=opc.tcp://your-server:4840 opcua-mcp

Chainguard の最小 Go イメージを使用したマルチステージビルドで、scratch から実行します。シェルがなく、攻撃対象領域が小さい構成です。再起動後も検出、キャッシュ、サブスクリプションの状態を保持するには、./search_index と ./mcp_opcua_store.db をボリュームとしてマウントしてください。認証モードの使用例、Compose 開発スタック、Claude コネクターのトンネル設定については、docs/deployment.md を参照してください。

開発

make start-opcua-server      # Microsoft OPC-UA test server in Docker
make run-with-test-server    # run the app against it (auto start/stop)

go test ./...                # unit tests
go test -race ./...
make test-integration        # real Subscribe/reconnect/cache behavior via testcontainers-go (needs Docker)

VS Code の起動構成は .vscode/launch.example.json にあります。.vscode/launch.json にコピーすると、テストサーバーを自動的に起動・停止する stdio/HTTP/認証のデバッグターゲットを利用できます。make help で利用可能なすべてのターゲットを確認できます。

テストはテーブル駆動方式で、稼働中またはシミュレーションサーバーではなく、opcuaClient インターフェースの境界(internal/opcua/mock_client_test.go)で OPC-UA クライアントをモックします。テスト対象の各要素がどのように連携するかについては、docs/architecture.md を参照してください。また、このリポジトリのコミットメッセージ形式については、docs/COMMIT_CONVENTION.md を参照してください。

コントリビューション

フォークして変更を加え、PR を作成してください。詳細は CONTRIBUTING.md を参照してください。

ライセンス

MIT

コメント

MCP は初めてですか?

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

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