
「AIのプロンプトからPLCのデバイスメモリを読み出してみたい?」そんな単純な思いつきと、「生成AIに関するセキュリティについて考察したい」という自身のスキルアップのために、PLCと通信するMCPサーバを作成してみました。
その第2回では、MCPサーバをバイブコーディングします。
PLC:Programmable Logic Controller(工場の機械設備などを自動で動かすための制御コントローラ)
MCP:Model Context Protocol(AIと外部のデータソースやツールを安全かつ統一的に接続するための標準規格)
PLC通信の前提事項
まず、PLCと通信するにあたっての、前提事項を以下にあげておきます。
- テストで用いるPLCの機種
接続テストするPLCの機種ですが、今回は手元にある三菱電機の「MELSEC-Qシリーズ」を使いました。すでに生産終了がアナウンスされている古い機種であり、後継の「MELSEC iQ-Rシリーズ」などへの更新が進んでいるかと思います。ただ、実際の生産現場では、今でも現役で動いているものも多いのではないでしょうか。
テスト用として、ミニベースユニットに「電源ユニット(Q61P)」と「CPUユニット(Q04UDEHCPU)」、そして「Ethernetユニット(QJ71E71-100)」だけを載せています。
テスト用PLCの構成 - PLCとの通信プロトコル
SLMP(Seamless Message Protocol)を使います。SLMPは、三菱電機のMELSECシリーズで用いられていたMCプロトコル(MELSEC コミュニケーションプロトコル)を、他社製PLCなどでも使用できるように標準化したものです。基本的に、MCプロトコルと機能や電文フォーマットは同じです。![]()
SLMPリファレンスマニュアル(出所:三菱電機)
テンプレートコードを作成
バイブコーディングでは、「Cursor」や「Claude Code」、「Codex」など、いろいろなAIエージェントが用いられます。それで今回は、初版となるテンプレートコードを「Gemini Notebook」で作成しました。その理由ですが、そもそも「vibe(バイブ)」は、「(物事が発する)雰囲気・フィーリング・ノリ」といった意味合いがあります。よって、個人的にいろいろ試した結果、(その時点で)一番良さそうな感じのコードが作成できたからです。バイブ!バイブ!です(笑)
Gemini Notebookに、「SLMPリファレンスマニュアル」のPDFファイルはもちろん、その他ウェブ上から10件のソースを追加し、「SLMPプロトコルのAPIを使用するAIのMCPサーバを作成したいです。どういった手順で開発を進めればいいでしょうか。」と質問しました。

そうすると、
「SLMP対応MCPサーバ 開発ロードマップ」として
1. システム構成の設計
2. PLC(SLMPサーバ)側の事前設定
3. 開発環境のセットアップ (Python)
4. MCPサーバの実装
5. MCPサーバの実行テスト
の流れで(なるほど)納得の回答を得ました。
また、続いて「MCPサーバの具体的なボイラープレート(テンプレートコード)の設計を進めましょうか?」との提案があり、その依頼をすると「mcp-slmp-server.py」が作成されました。PythonでSLMP(MCプロトコル)を非常にシンプルに扱える「pymcprotocol」というライブラリが使用されています。
そして、開発ロードマップで示された項目に従いながら、このテンプレートコード(mcp-slmp-server.py)をCursorで仕上げていくことにします。

OTセキュリティ対策のご相談はこちら
システム構成の設計
Cursorでテンプレートコードを編集しながら、AIエージェントに実装・テストをする関係から、この後のAIエージェントは「Cursor」を使うことにしました。

SLMPには、伝文フォーマットに「3Eフレーム」と「4Eフレーム」の2種類があります。また、交信データのコードとして、「ASCIIコード」と「バイナリコード(デフォルト)」があります。今回は、仕様がシンプルで互換性の高い「3Eフレーム」で、交信データ量が少なく交信時間も短くなる「バイナリコード」になっています。また、SLMPでは、TCP/IPとUDP/IPを使用することができますが、今回はTCP/IPを用いています。
PLC(SLMPサーバ)側の事前設定
今回のPLC構成では、CPUユニットとEthernetユニットの両方にLANポートがあります(どちらも使用できます)が、Ethernetユニット側を使用することにしました。
そして、AIエージェントからのTCP/IP接続用として、
IPアドレス:192.168.200.3
ポート番号:5100
を設定します。設定には、三菱電機のPLCのエンジニアリングツール(WindowsOSで動くソフトウェア)である「GX Works2」を用います(※ツールの設定方法等の詳細は今回省略します)。
開発環境のセットアップ (Python)
今回はWindowsにPythonをインストールした環境を用いました(Pythonのインストール方法等については今回省略します。また、WSLを使うことも可能です)。
- Pythonの仮想環境とその有効化
最初にPythonの仮想環境とその有効化を行います。
python -m venv mcp_env
mcp_env\Scripts\activate![]()
Pythonの仮想環境とその有効化(ブルーの下線は、最初エラーが発生したので解消のために追加) - 必須ライブラリのインストール
次に2つの必須ライブラリをインストールします。
pip install pymcprotocol # SLMP(MCプロトコル)を実現するライブラリ
pip install mcp # MCP公式のPython SDK![]()
pymcprotocol と mcp のライブラリをインストール
お使いのPythonの環境によっては、何らかのエラーが発生する場合があります(今回もいくつかエラーが発生しました)。その際には、エラーメッセージをCursorのプロンプトに貼り付けることで、エラー内容の説明とその解消方法が提案されるので、それを受け入れて進めていきます。
MCPサーバの実装
「Cursor Settings」の「Customize」からMCPを登録します。「mcp.json」にplc-controllerを設定し、起動します。

ここでも、エラーが発生したので、Cursorプロンプトからエラー内容の確認と解消を行いました。


そうすると、作成したMCPサーバで定義された次の4つのツール(AIから呼び出し可能なAPI)が立ち上がりました。
read_word_devices
write_word_devices
read_bit_devices
write_bit_devices

MCPサーバの実行テスト
では、実際にプロンプトからテストしてみます。PLCのD0からD4までのデバイスメモリを読み出します。

結果が正しいことを確認しました(別途、GX Works2でデバイスメモリの値をモニタリング)。
次回(第3回)の話は
次回は、今回説明した内容をさらに深掘りし、バイブコーディングでMCPサーバのプログラムを改修(機能を追加)してみます。
よくある質問(FAQ)
生成AIやAIエージェントの機能を、産業用の制御機器であるPLC(プログラマブル・ロジック・コントローラ)へシームレスに連携・拡張するための仕組みを実現します。
AIエージェントを活用した開発手法である「バイブコーディング」を取り入れ、ツールとしてCursorを使用しています。
AIエージェントとPLCの間を接続し、データやり取りを中継するための「MCP(Model Context Protocol)サーバ」をPythonで実装しています。









