Generic SCPI Instrument について
Generic SCPI Instrumentは、VISA、TCP、シリアル接続を介してSCPI機器と通信するMCPサーバーです。生コマンドを扱い、設定可能な許可・拒否リストを備え、単一クエリーによる読み取りとクライアント確認が必要な書き込みを分けています。
主な機能
- 01VISA、TCP、シリアルで接続
- 02機器の識別とVISAリソース一覧
- 03単一SCPIクエリーの送信
- 04検査付きコマンドバッチの実行
- 05バイナリブロックと波形データの読み取り
- 06コマンド許可・拒否リストの設定
活用シーン
- 01SCPI機器から測定値を読み取る
- 02バイナリ波形やトレースデータを取得
- 03エージェントが使えるコマンドを制限
- 04問題発生時に設定済みの安全状態を適用
MCP 対応
SCPIのクエリー、書き込み、バッチ、バイナリブロック読み取り、および機器の安全・接続機能をMCPクライアントに公開します。読み取りは単一クエリーに限定され、状態を変更するツールにはクライアントの確認が必要で、コマンドポリシーによる制限も可能です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx labmcp-scpiLABMCP_ADDRESSInstrument address, e.g. serial:///dev/ttyUSB0 or tcp://192.168.1.50:5025LABMCP_SIMULATESet to 1 to use the built-in simulator (no hardware)LABMCP_READ_ONLYSet to 1 to disable all state-changing toolsLABMCP_LIMITSSafety limit overrides, e.g. max_temperature_c=80ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
14掲載時のツール一覧 · 2 週間前に更新
このツールにパラメーターはありません。
詳細
汎用 SCPI 計測器 — MCP サーバー
AI エージェントから、あらゆる IEEE 488.2 / SCPI 計測器を操作できます。マルチメーター、オシロスコープ、ソース・メジャー・ユニット、電源、電子負荷、ファンクションジェネレーター、スペクトラムアナライザー、カウンターなどに対応しています。GPIB、USBTMC、LAN(VXI-11、HiSLIP、raw socket)、RS-232 経由で動作します。エージェントが生の SCPI コマンドを送信するため、安全性はサーバーの仕組みで確保します。読み取り経路で受け付けるのは単一のクエリのみです。計測器に変更を加える操作はすべて、MCP クライアントから確認を求めるツールを経由します。コマンドの許可リストと拒否リスト、および独自の安全状態設定コマンドをサーバーに指定できます。
Keysight または Rohde & Schwarz の計測器をお使いですか? 代わりに、メーカー公式の MCP サーバーをご利用ください:Keysight MCP Server for Instrument Control または RsInstrument に付属する MCP サーバー(
python -m RsInstrument.mcp)。labmcp-scpiは、それ以外の計測器(Tektronix/Keithley、Rigol、Siglent、SRS、Aim-TTi、B&K Precision、GW Instek、旧式の HP/Agilent GPIB 機器など)を幅広くカバーします。
| パッケージ | labmcp-scpi |
| 計測器 | SCPI または IEEE 488.2 共通コマンドに対応するあらゆる計測器 |
| インターフェース | GPIB、USBTMC、LAN VXI-11 / HiSLIP(すべて VISA 経由)、LAN raw socket(例:ポート 5025)、RS-232 / USB シリアル |
| プロトコル | SCPI-99 / IEEE 488.2(SCPI-99 standard, IVI Foundation);PyVISA 経由の VISA |
| ステータス | 🧪 シミュレーション済み:ワイヤーレベルの SCPI シミュレーターでテスト済みですが、実機ではまだ検証されていません。ハードウェアでのテスト結果を報告する |
ハードウェアなしで試す
uvx labmcp-scpi --simulate --check
シミュレーターは、汎用の小型ベンチ計測器です(*IDN? → LabMCP,SIM-DMM-PSU,SIM000001,1.0.0)。100 Ω の負荷を駆動する 0~30 V / 3 A の電源で、負荷に接続した DMM を内蔵しています。MEASure:VOLTage:DC?、CONFigure + READ?/FETCh?、[SOURce:]VOLTage/CURRent、OUTPut[:STATe]、TRIGger:COUNt、FORMat[:DATA] REAL,32|64 バイナリブロック、FORMat:BORDer、*ESR?/*STB?、および 10 件のエントリーを持つ SYSTem:ERRor? キュー(オーバーフロー時は -350 を返します)に対応しています。--simulate モードでは、安全状態は OUTP OFF です。
計測器を接続する
- 計測器の設定: 使用するリモートインターフェースを有効にします。
- LAN: 固定 IP アドレスを設定します。VXI-11/HiSLIP(VISA 用)または SCPI raw-socket サーバーを有効にします。多くの計測器ではソケットにポート 5025 を使用します。LAN 設定画面またはマニュアルを確認してください。
- USB: USBTMC / 「USB device (TMC)」を選択します。「USB mass storage」や仮想 COM ポートは選択しないでください。
- GPIB: 計測器の GPIB アドレスを確認します。
- RS-232: ボーレート、パリティ、ハンドシェイクを設定し、計測器から指定を求められた場合は SCPI を言語として選択します。
- 計測器を見つける:
uvx labmcp portsを実行するか、エージェントにlist_visa_resourcesの実行を依頼します。このツールは--addressなしで動作し、pyvisa-py 経由で VISA リソースを一覧表示します。NI-VISA または別のメーカーの VISA ライブラリを使用するには、backend=@iviを指定します。 - 接続をテストする:
uvx labmcp-scpi --address visa://TCPIP0::192.168.1.50::inst0::INSTR --check # LAN, VXI-11 uvx labmcp-scpi --address visa://TCPIP0::192.168.1.50::hislip0::INSTR --check # LAN, HiSLIP uvx labmcp-scpi --address tcp://192.168.1.50:5025 --check # raw socket uvx labmcp-scpi --address "visa://USB0::0x1AB1::0x0588::DS1ZA000000::INSTR" --check uvx labmcp-scpi --address "visa://GPIB0::22::INSTR?backend=@ivi" --check # NI-VISA uvx labmcp-scpi --address "serial:///dev/ttyUSB0?baudrate=9600&read_termination=CRLF" --check--checkを指定すると、解析された*IDN?の応答が表示されます。タイムアウトする場合は、終端文字を確認してください。SCPI のデフォルトは LF ですが、シリアル接続の計測器によってはread_termination=CRLFが必要です。また、ボーレートと、計測器がエミュレーション言語ではなく SCPI に設定されていることも確認してください。
MCP クライアントに追加する
Claude Code
claude mcp add scope -- uvx labmcp-scpi --address visa://TCPIP0::192.168.1.50::inst0::INSTR
Claude Desktop / Cursor / Windsurf(claude_desktop_config.json、.cursor/mcp.json、…)
{
"mcpServers": {
"psu": {
"command": "uvx",
"args": [
"labmcp-scpi", "--address", "tcp://192.168.1.50:5025",
"--option", "safe_state=OUTP OFF",
"--option", "write_denylist=^OUTP\\d*(:STAT)? (?!OFF\\b)"
]
}
}
}
クエリのみを許可するには --read-only を追加します。読み取り専用モードでは scpi_write、scpi_batch、reset_instrument は表示されなくなります。device_clear と apply_safe_state は引き続き利用できます。計測器ごとにサーバーを 1 つ起動し、それぞれに個別のキー(scope、psu、dmm など)を設定します。
ツール
| ツール | 種類 | 説明 |
|---|---|---|
apply_safe_state | 🛑 安全 | 装置をラボで設定された安全状態(--option safe_state のプログラムメッセージ。例:'OUTP OFF')にしてから、エラーキューを読み取ります。安全状態が設定されている場合のみ一覧に表示されます。問題がありそうな場合は、すぐに呼び出してください。 |
device_clear | 🛑 安全 | 応答しなくなった、または状態が不明になった装置を復旧します。VISA デバイスクリア(またはソケット/シリアル接続で未読入力を破棄)を行い、エラーキューを報告し、必要に応じて ABORt を実行してから *CLS を送信します。これによって任意の装置が安全な状態になるわけではありません(出力はそのままです)。ラボで安全状態が設定されている場合は apply_safe_state を、そうでない場合は装置本体のコントロールを使用してください。 |
get_command_log | 👁 読み取り | 装置に送信した最新の生コマンドと、装置から受信した応答を返します(新しいものが末尾)。デバッグや実行内容の記録に役立ちます。 |
get_connection_info | 👁 読み取り | 接続されている装置(識別情報、アドレス、シミュレーションか実機か)、サーバーが読み取り専用かどうか、有効な安全制限を報告します。最初に呼び出してください。 |
get_errors | 👁 読み取り | 装置のエラー/イベントキューを読み取り、クリアします(0,"No error" が返されるまで SYSTem:ERRor? を実行)。エントリは古いものから順に返され、各エントリは一度しか読み取れません。空のリストはエラーがないことを意味します。 |
identify | 👁 読み取り | 装置に識別情報を問い合わせます(*IDN?):メーカー、モデル、シリアル番号、ファームウェア。 |
list_visa_resources | 👁 読み取り | このコンピューターで VISA から認識できる GPIB/USBTMC/LAN(VXI-11、HiSLIP)装置を一覧表示します。--address がなくても動作します。Raw-socket 装置(tcp://host:5025)は検出できません。 |
query_binary_block | 👁 読み取り | IEEE 488.2 の確定長バイナリブロック(波形、トレースデータ、スクリーンショット、FORMat REAL/INTeger の読み取り値)を読み取ります。クエリは scpi_query と同じ読み取り専用チェックを通過する必要があります。長さ、SHA-256、必要に応じて要約統計量付きのデコード済み値を返します。値は max_points まで間引かれます。データ全体を保存するには save_path を使用してください。max_block_bytes の上限を超えるブロックは破棄されます。 |
reconnect | 🛑 安全 | 装置との接続を閉じて、再度開きます(装置の電源を入れ直した場合や、ケーブルを再接続した場合など)。 |
reset_instrument | ⚠️ 危険 | 装置をデフォルト設定にリセットし(*RST、続いて *CLS)、完了を待ってエラーを確認します。SCPI では *RST 後に出力が OFF になることが求められますが、それ以外のすべての設定(レベル、レンジ、トリガー、制限値)はデフォルトに戻り、装置によって挙動が異なる場合もあります。被試験デバイスに接続された装置をリセットする前に、マニュアルを確認してください。 |
scpi_batch | ⚠️ 危険 | SCPI コマンドとクエリの短いシーケンスを順に実行し、各ステップの後にエラーキューを確認します。最初のコマンドを送信する前に、すべてのステップがコマンドポリシーに照らして確認されます。そのため、拒否されたステップがあっても何も送信されません。ステップごとの応答とエラーを返します。約14分以内に開始されなかったステップは送信されず、ステータスは not_run になります。 |
scpi_primer | 👁 読み取り | SCPI 構文の簡潔なガイド(長形式/短形式、クエリ、複合コマンド、一般コマンド、エラーキュー、バイナリブロック)と、このサーバーの有効なコマンドポリシーを表示します。接続がなくても動作します。 |
scpi_query | 👁 読み取り | 読み取り専用の SCPI クエリを1つ送信し、装置のテキスト応答を返します。 |
scpi_write | ⚠️ 危険 | 任意の SCPI プログラムメッセージ(設定、複合 'A;B' メッセージ、副作用のあるクエリ)を送信してから、エラーキューを読み取ります。メッセージにクエリが含まれる場合は、その応答を返します。出力をオンにするなど、装置の状態を変更する可能性があります。呼び出す前に、コマンドの動作を説明してください。ラボの拒否リストに含まれるコマンドや、許可リストの範囲外のコマンドは、何も送信される前に拒否されます。 |
wait_operation_complete | 👁 読み取り | 装置が保留中のすべての操作を完了するまで待機します(*OPC? が 1 を返すまで)。たとえば、スイープ、測定、またはソースの安定化を開始した後に使用します。 |
get_connection_info、get_command_log、reconnect は、すべての LabMCP サーバーに組み込まれています。apply_safe_state は、安全状態が設定されている場合のみ一覧に表示されます。
コマンドポリシー
汎用サーバーでは、お使いの計測器でどの SCPI コマンドが危険かを把握できません。サーバーは可能な範囲で制御し、残りはユーザーが追加できるようにしています。
| ルール | 対象 | 動作 |
|---|---|---|
| クエリは 1 つのみ | scpi_query、query_binary_block(READ。読み取り専用モードで許可) | ヘッダーは ? で終わる必要があります(VOLT? MAX などのパラメーターは問題ありません)。;、改行、制御文字を含むメッセージは拒否されます。 |
| 組み込みの副作用を伴うクエリ | scpi_query、query_binary_block | *TST?(セルフテスト)、*CAL?、CALibration…?、DIAGnostic…? はここでは拒否されます。これらは scpi_write 経由で実行する必要があります。 |
--option query_denylist=REGEX | scpi_query、query_binary_block | たとえば SMU での ^(MEAS|READ) のように、ラボで副作用があると見なす追加のクエリを指定します。この場合、実行には scpi_write が必要です。 |
--option write_denylist=REGEX(別名 denylist) | すべての生のツール | 一致するコマンドは、どのツールからも送信されません。両方の名前に異なるパターンを設定すると、設定エラーになります。 |
--option write_allowlist=REGEX | scpi_write、scpi_batch、reset_instrument | 設定すると、これらのツールは一致するコマンドのみ送信できます(scpi_query が受け付けるクエリは常に許可されます)。引用符の内側であっても、; を含むメッセージは拒否されます。 |
--option safe_state=MESSAGE | apply_safe_state(SAFETY) | お使いの計測器を安全な状態にするプログラムメッセージです(例:OUTP OFF)。メッセージはそのまま送信され、リストによってブロックされることはありません。 |
--option error_query=QUERY | すべての書き込み | エラーキューのクエリです。デフォルトは SYST:ERR? です。 |
照合ルール:
- パターンは Python の正規表現で、大文字と小文字を区別せずに照合されます。
;で区切られた各メッセージ単位は、2 つの形式でチェックされます。1 つ目は、送信された単位を大文字に変換し、空白をまとめ、先頭のコロンを除いたものです。2 つ目は、すべてのニーモニックを SCPI の短縮形(SCPI-99 Vol. 1 §6.2.1)に変換したものです。:OUTPut1:STATe ONはOUTP1:STAT ONになります。そのため、^OUTP\d*(:STAT)? (?!OFF\b)はOUTP ON、outp:stat 1、VOLT 5;:OUTPut:STATe ON、OUTPut2 ONに一致します。- SCPI のブール値では任意の数値を使用できます(丸められ、ゼロ以外は ON と見なされます)。そのため、
OUTP 2、OUTP 1.0、OUTP #H1でも出力がオンになります。(ON|1) を列挙するのではなく、上記のように OFF 以外をすべて拒否してください。 - denylist では
re.searchを使用します。また、相対ヘッダーを解決し(OUTP:POL NORM;STAT ONはOUTP:STAT ONとしてチェックされます)、引用符の内側であっても、すべての;で分割します。allowlist は単位全体に一致する必要があります。 scpi_batchの各ステップは、最初のステップを送信する前にすべてチェックされます。
例:
# Power supply: the agent may set levels and switch the output OFF, but only a human switches it on
--option 'write_denylist=^OUTP\d*(:STAT)? (?!OFF\b)' --option 'safe_state=OUTP OFF'
# DMM: allow measurement configuration only
--option 'write_allowlist=(CONF|SENS|TRIG|INIT|FORM|ABOR)(:\S+)*( .*)?'
# SMU: measuring can switch the output on, so require confirmation for it
--option 'query_denylist=^(MEAS|READ)' --option 'safe_state=OUTP OFF'
環境変数 LABMCP_OPTIONS はカンマで分割されます。カンマを含む正規表現を使用する場合は、コマンドラインで渡すか、LABMCP_OPTIONS を JSON オブジェクト({"write_denylist": "..."})として指定してください。
安全性の上限
| 上限 | デフォルト | 意味 |
|---|---|---|
max_operation_wait_s | 300 s | エージェントが要求できる最長の *OPC? 待機時間(wait_operation_complete) |
max_block_bytes | 16777216 bytes | サーバーが保持するバイナリブロックの最大サイズです。サイズはブロックヘッダーから確認されます。これを超えるペイロードは受信時に破棄され(VISA:デバイスクリア)、メモリに保持されることはありません。 |
起動時に上書きできます:--limit max_block_bytes=67108864。このサーバーには電圧や電流の上限がありません。任意のコマンドを解釈できないためです。計測器本体で上限(OVP/OCP、コンプライアンス、出力保護)を設定するか、denylist を使用するか、計測器専用のサーバーを使用してください。
プロンプトの例
- 「どの計測器が接続されていますか?識別情報を読み取り、エラーキューを確認してください。」
- 「DMM を DC 電圧、10 V レンジに設定して、20 回測定し、平均と標準偏差を教えてください。」
- 「電源を 3.3 V、電流制限を 200 mA に設定し、両方の設定値を読み返してください。ただし、まだ出力は有効にしないでください。」
- 「オシロスコープからチャンネル 1 の波形をバイナリブロックとして取得し、~/data/ch1.csv に保存して、最小値、最大値、平均値をまとめてください。」
- 「-222 エラーが発生しました。これはどういう意味で、直近のどのコマンドが原因ですか?」
- 「問題が発生しました。安全状態を適用してから、インターフェースをクリアしてください。」
注意事項
- 汎用サーバーでは、任意の計測器を安全な状態にできるとは限りません。
device_clearは 4 つの処理を行います。VISA デバイスのクリア(raw socket および serial link では、未読の入力を破棄するだけです)、エラーキューの読み取り、ABORtの送信、*CLSの送信です。通信を復旧し、スイープを停止します。出力をオフにはしません。エネルギーを出力する機器にはsafe_stateを設定してください。危険を伴う機器には、対応するものがあれば、計器固有の LabMCP サーバーを使用してください。実際の設定値の制限を適用できます。 - クエリは常に読み取り専用とは限りません。 Keithley 2400 のようなソースメジャーユニットでは、
MEASure?、READ?、INITiate、CONFigureによってソース出力が有効になることがあります(Keithley 2400 Series SourceMeter User's Manual、2400S-900-01 Rev. G、§11 および §17)。そのため、--read-onlyモードでは、デフォルトでscpi_queryはMEASure?とREAD?を拒否しますが、FETCh?は最後の測定値を返します。ソース機能のないメーターの場合は、--option allow_measure_in_read_only=trueを設定してください。読み取り専用モードでない場合、SMU では--option query_denylist=^(MEAS|READ)を追加し、これらのコマンドの実行にscpi_writeによる確認を必要とするようにしてください。 *RST:SCPI-99 Vol. 2 §15.12 では、*RSTの後にOUTPut:STATe OFFを送信することが求められています。ただし、*RSTはレベル、レンジ、制限値、トリガー設定もリセットし、すべての計測器がこの仕様に準拠しているとは限りません。- 各
scpi_write/scpi_batchのステップの後に、エラーキューを読み取ります(読み取り後、キューはクリアされます)。エラーは結果に表示されます。計測器が認識しないクエリは応答を返しません。サーバーはタイムアウト(デフォルトは 5 秒。変更するには--timeoutを指定)し、再同期を行って、キューから取得した-113を報告します。 SYSTem:ERRor?を実装していない計測器(一部の古い IEEE 488.2 専用機器)では、error_check: "unavailable"が報告されます。計測器が別のエラークエリを使用する場合は、--option error_query=…を設定してください。query_binary_blockが読み取るのは、確定長ブロック(#<n><len><data>)のみです。不定長の#0ブロックは拒否されます。バイト順はFORMat:BORDerに従います(NORMal = ビッグエンディアン)。timeout_sは転送全体に適用されます。デコードされた NaN と無限値はnullとして返され(non_finiteに件数が記録されます)、保存された CSV ではnan/infのまま保持されます。save_pathの拡張子は.csv(decode_asでデコードした値、または指定がなければ生バイト)、.bin、.dat、.raw、.txt、または画像形式の拡張子(.png、.bmp、.jpg、.jpeg、.gif、.tif、.tiff)である必要があります。~は展開され、存在しないフォルダーは作成されます。overwrite=trueを指定しない限り、既存のファイルは置き換えられません。このチェックは計測器に何かを送信する前に行われます。scpi_batchは、約 14 分後に新しいステップの開始を停止します(ツールのタイムアウトは 15 分です)。送信されなかったステップにはnot_runと表示されます。- テキストは ASCII として送信されます。制御文字または非 ASCII 文字を含むコマンドは拒否され、サーバーが LF 終端文字を追加します。
- 拒否リストは安全策であり、保証ではありません。テキストに対して照合するため、ベンダー固有の別名やマクロ(
*DMC、ユーザー定義シーケンス)を回避できる場合があります。計測器本体の保護制限も設定してください。
ハードウェア検証
| モデル | ファームウェア | インターフェース | 検証者 | 日付 |
|---|---|---|---|---|
| まだありません:最初の検証を報告する |
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。