PyVISA backend + compatibility shim for lab-executor-mcp. Hardware (GPIB / USB / Serial / LAN) communication layer.
Project description
visa-mcp
v2.0+: PyVISA backend + compatibility shim for
lab-executor-mcp.
Line-ending note (v2.0.1): GitHub raw view が一部 viewer で file を「1 line」と mis-report する ことがあります。
.gitattributesで LF を強制しており、CI で TOML / YAML parse +compileall+ multiline guard を常時検証しています。 実体確認は clean clone (git clone --branch v2.0.0等) または GitHub file viewer を使ってください。
v2.0 で分離されました v1.x まで visa-mcp 1 パッケージで提供していた「実験実行 runtime / DSL / extension ecosystem」は
lab-executor-mcpに移りました。 visa-mcp は v2.0+ で PyVISA backend layer + 旧 import shim に 特化します。
- 実機 backend が必要:
pip install visa-mcp(自動的にlab-executor-mcpも入る)- 実機 backend 不要 (benchmark / dry-run のみ):
pip install lab-executor-mcp- 既存の import:
from visa_mcp.extension import ...等は v2.0 で DeprecationWarning 付きで動作。詳細はdocs/v2_migration.md
MCP server for controlling GPIB / USB / Serial / LAN instruments via PyVISA.
LLM(Claude Code / Claude Desktop など MCP 対応クライアント)から、SCPI 計測器と非 SCPI 計測器の両方を統一的に操作できるサーバーです。マニュアルから抽出したコマンドを YAML で定義すれば、機器固有の知識なしに自然言語で計測を自動化できます。
📝 記事
- v0.3.0: 計測器を「指示で動かす」から「手順ごと預ける」へ — Recipes / 応答パーサ / 安全制約
- v0.1.0: Claude から計測器を動かす ── 設計と実機検証 — 設計思想と Yokogawa 7563 救出記
特徴
- 🔌 VISA 経由のあらゆるインタフェース対応: GPIB / USB / RS-232C / LAN (VXI-11, HiSLIP)
- 📋 YAML で機器コマンド定義: SCPI/独自プロトコル問わず宣言的に定義
- 🔍
*IDN?自動識別 + 手動バインディング (旧世代非SCPI機器対応) - ✅ 型・範囲・enum 検証: 安全に SCPI コマンドを構築
- 🛡️ 安全制約システム (v0.2.0): 絶対最大定格・前提条件・自然言語注意事項を YAML で宣言、3 段階の安全モード (
strict/advisory/permissive)、override 機構、監査ログ - 🍳 Recipe (典型ワークフロー) (v0.3.0): 複数コマンドの安全な順序を YAML で宣言、
$var * 1.1のような式評価対応、安全制約と完全統合 - 🔎 応答の構造化パース (v0.3.0): ベンダ独自フォーマット (例: Yokogawa 7563 の
NTKC+00027.2E+0) を正規表現で構造化辞書に変換 - 🗂️ 動作状態・物理インタフェース定義 (v0.3.0): 起動シーケンス・モード・端子情報を YAML で宣言、LLM に共有
- ⏱️ Job モデル + wait step (v0.5.0): recipe をバックグラウンド実行、状態機械 (queued / running / waiting / completed / failed / cancelled / timeout / interrupted)、SQLite 永続化、3 段階キャンセル、
recommended_next_actionsで LLM への次手提示 - 📄 PDF マニュアル取り込み: pdfplumber でコマンド候補を自動抽出
- ⚡ 非同期実装: FastMCP + asyncio で複数機器並行制御
動作確認済み機器
| メーカー | モデル | インタフェース | プロトコル |
|---|---|---|---|
| Kikusui | PMX35-3A 直流安定化電源 | USB | SCPI |
| Yokogawa | 7563 6桁ディジタルマルチ温度計 | GPIB | 独自(非SCPI) |
クイックスタート
1. インストール
前提: Python 3.10+ / NI-VISA または互換 VISA ライブラリ(Keysight IO Libraries Suite / PyVISA-Py 等)
git clone https://github.com/TECTOS-JP/visa-mcp.git
cd visa-mcp
pip install -e .
2. Claude Desktop に登録
%APPDATA%\Claude\claude_desktop_config.json(Windows)または ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)に追記:
{
"mcpServers": {
"visa-mcp": {
"command": "python",
"args": ["-m", "visa_mcp.server"],
"cwd": "<path-to-visa-mcp>"
}
}
}
Claude Desktop を再起動。
3. 動作確認
Claude に話しかける:
「visa-mcp に接続されている計測器を一覧してください」
「USB0::0x... を identify_instrument で識別して、5V 出力するように設定してください」
v1.1 stability: Stable 43 tools (v1.x 互換保証) + Experimental 7 tools (うち
validate_experiment_bundle/inspect_experiment_bundleは v1.1 新規)。 raw 系 2 tools は別途オプトイン (VISA_MCP_ENABLE_RAW_COMMANDS=1)。 詳細はdocs/v1_stability_policy.md+docs/naming_and_repository_strategy.md+docs/backend_abstraction.md、 単一 source はsrc/visa_mcp/stability.py。
Resource discovery with query filters (v2.1+)
list_resources は query 引数で interface 別の絞り込みに対応:
list_resources(query="USB?*")— USB のみlist_resources(query="GPIB?*")— GPIB のみlist_resources(query="TCPIP?*")— TCP/IP のみlist_resources(query="ASRL?*")— シリアル のみ
全件列挙が一部 interface の異常で失敗する場合、まず query を
絞って試すこと。例えば GPIB ドライバの問題 (NI-488.2 未インストール
等) により全件列挙が VI_ERROR_SYSTEM_ERROR で失敗する環境でも、
USB resource は query="USB?*" で取得できる。
list_resources / probe_resource / discover_resources_safe は
*IDN? / query / write / 任意の raw VISA コマンドを 一切送らない。
discover_resources_safe(queries=[...])
v2.1.0 で追加された safe discovery。USB?* / GPIB?* / ASRL?* /
TCPIP?* を個別に試し、1 つでも成功すれば success=true を返す。
部分成功時は partial_success=true、成功 interface と失敗
interface を successful_interfaces / failed_interfaces で報告。
失敗時は recommended_next_actions で対処案を提示。
probe_resource(resource_name, timeout_ms=3000)
v2.1.0 で追加。VISA resource を open_resource → 属性読取 → close
だけで疎通確認する。*IDN? / query / write は絶対に送らない
ため、identify_instrument より前段の安全な健全性チェックに使える。
構造化 error (error_class / code / message) を返す。
提供される MCP ツール(50 個 / raw 系 2 個は別途オプトイン)
識別・情報
| ツール | 用途 |
|---|---|
list_resources |
接続中の VISA リソースを列挙 (query="USB?*" 等で interface 別絞込) |
probe_resource ★v2.1 新規 |
*IDN? を送らず open/close だけで疎通確認 |
discover_resources_safe ★v2.1 新規 |
interface ごとに個別 list_resources、一部失敗でも部分成功を返す |
identify_instrument |
*IDN? で機器を識別し定義をバインド |
identify_all_instruments |
全リソースを一括識別 (query="USB?*" で絞込可、v2.1) |
list_identified_instruments |
既に識別済みのセッション一覧 |
bind_definition |
*IDN? 非対応機器に定義を手動バインド |
list_available_definitions |
ロード済みの YAML 定義一覧 |
list_commands |
識別済み機器の利用可能コマンド表示 |
get_instrument_info |
機器仕様・安全制約・recipes 等を一括取得 |
list_safety_constraints |
安全制約のみを抽出 |
reload_definitions |
定義ファイルを再読込 |
同期実行
| ツール | 用途 |
|---|---|
execute_named_command |
型安全に名前付きコマンドを実行 |
validate_operation |
実行せずに事前検証 (dry-run) |
list_recipes |
利用可能な典型ワークフロー一覧 |
execute_recipe |
複数コマンドの安全な順次実行 |
Job (バックグラウンド実行) ★v0.5.0 新規
| ツール | 用途 |
|---|---|
start_recipe_job |
recipe を Job として登録、即 job_id 返却 |
start_wait_job |
単発 wait ジョブ (seconds / until / condition / stable_value) を起動 ★v0.5.1 |
get_job_status |
Job の現在状態 + polling/group 進捗 |
get_job_result |
完了/失敗時の完全結果 + 次手候補 |
list_jobs |
Job 一覧 (status / owner / limit で絞り込み) |
cancel_job |
Job キャンセル (immediate / after_current_step / safe_shutdown) |
resume_job |
interrupted / cancelled / failed / timeout Job を 新規 Job として 再開 (dry_run / from_step 明示必須、experimental) ★v0.9.0 |
Group / Map (並列実行) ★v0.6.0 新規
| ツール | 用途 |
|---|---|
list_groups |
instrument_groups 一覧 |
list_experiment_units |
experiment_units 一覧 |
start_group_query_job |
グループ全機器に同じ query を並列実行 |
start_map_recipe_job |
異なる条件で各 unit に recipe を並列実行 (100 サンプル等) |
状態・モニタ (self-awareness + persistence) ★v0.7.0 新規
| ツール | 用途 |
|---|---|
describe_instrument |
機器の能力サマリ (identity / capabilities / state_keys / recommended_usage) |
get_state |
state_query 定義に従って機器の現在状態を取得 (cache 対応) |
get_last_measurement |
測定値キャッシュから最新値 (古ければ自動再取得) |
start_monitor |
機器を定期測定する Monitor Job を起動 (monitor_data に保存) |
stop_monitor |
Monitor Job を停止 |
get_monitor_data |
Monitor の時系列データを取得 (大量データ向け別ツール、limit≤10000) |
prune_monitor_data |
Monitor Job データを削除 (monitor_id 指定 / older_than_days 指定) ★v0.7.0.1 |
Experiment DSL (LLM 向け実験計画) ★v0.8.0 新規
| ツール | 用途 |
|---|---|
validate_experiment_plan |
DSL plan を検証 (resource/command/safety/verify/sweep 上限など 15 項目) |
dry_run_plan |
実機 I/O 無しで rendered SCPI + safety + verify summary を返す |
start_experiment_job |
validate → compile → persist → Job 実行 (experiment_plans に保存) |
save_experiment_template |
再利用可能 DSL テンプレートを SQLite に保存 |
list_experiment_templates |
保存済みテンプレート一覧 ★v0.8.0.1 |
get_experiment_template |
指定 name のテンプレート (plan JSON 含む) ★v0.8.0.1 |
start_experiment_job_from_template |
template に override (name/unit/bindings/parameters/owner) を適用して実行 (dry_run 対応) ★v0.8.3 |
Observation (実験ビュー) ★v0.8.2 新規
| ツール | 用途 |
|---|---|
get_experiment_timeline |
Job 内の時系列イベント (kind / severity / title / summary、monitor_sample デフォルト除外) |
get_job_live_view |
実行中 Job の集約 (current_phase enum / active_waits / latest_measurements / recent_errors) |
get_job_summary |
完了 Job の構造化要約 (key_results / failures / verify_summary / recommended_next_actions) |
get_experiment_results |
Job 測定結果を少量確認用 JSON で取得 (stable v1.x) ★v0.9.1 |
export_experiment_results |
Job 測定結果を CSV / JSONL ファイル出力 (path traversal 拒否、sha256 添付、stable v1.x) ★v0.9.1 |
query_audit |
監査ログを filter + cursor pagination で取得 (experimental) ★v0.9.3 |
list_locks |
現在の resource lock 一覧 (include_stale、experimental) ★v0.9.3 |
export_experiment_bundle |
Job 実験記録を zip (manifest+plan+timeline+results+sha256) で出力 (experimental) ★v1.0 |
validate_experiment_bundle |
bundle zip の整合性を実行なしに検証 (checksum / required files / version、experimental) ★v1.1 |
inspect_experiment_bundle |
bundle 中身要約 (manifest / plan / job_summary / result rows、analysis-only、experimental) ★v1.1 |
取り込み
| ツール | 用途 |
|---|---|
extract_pdf_commands |
PDF マニュアルからコマンド候補を抽出 |
加えて、環境変数 VISA_MCP_ENABLE_RAW_COMMANDS=1 で 未検証の任意 SCPI を送る危険ツールを 2 個追加可能(unsafe_send_command / unsafe_query_instrument、strict モードでは登録されない)。詳細は docs/safety.md。
Job モデルの詳細 (state machine / cancel mode / timeout / 再起動セマンティクス / recommended_next_actions) は docs/jobs.md を参照。
詳細は docs/mcp_tools_reference.md を参照。
新しい機器を追加する
instruments/_template.yaml をコピーしてカスタマイズします:
metadata:
manufacturer: "YourVendor"
model: "Model123"
description: "DC Power Supply"
identification:
manufacturer_match: "YOURVENDOR"
model_regex: "Model123"
connection:
default_timeout_ms: 3000
read_termination: "\n"
write_termination: "\n"
commands:
set_voltage:
scpi: "VOLT {voltage}"
type: "write"
description: "出力電圧を設定"
parameters:
- name: voltage
type: "float"
range: [0, 30]
詳細は docs/adding_instruments.md を参照。examples/instruments/ に実例(PMX35-3A / 7563)を収録しています。
アーキテクチャ
┌──────────────────────┐
│ Claude / MCP Client │
└──────────┬───────────┘
│ MCP (stdio)
┌──────────▼───────────┐
│ FastMCP Server │ ← src/visa_mcp/server.py
│ ┌────────────────┐ │
│ │ Tool Handlers │ │ ← src/visa_mcp/tools/
│ ├────────────────┤ │
│ │ Session Mgr │ │ ← セッション・定義紐付け
│ ├────────────────┤ │
│ │ VISA Manager │ │ ← PyVISA 非同期ラッパー
│ └────────────────┘ │
└──────────┬───────────┘
│ VISA
┌──────────▼───────────┐
│ Instrument (GPIB/ │
│ USB/Serial/LAN) │
└──────────────────────┘
開発
# 開発依存込みインストール
pip install -e ".[dev]"
# テスト実行
pytest
# サーバー単独起動(デバッグ用)
python -m visa_mcp.server
ライセンス
MIT License — 詳細は LICENSE を参照。
注意事項
- 計測器マニュアル PDF はリポジトリに含まれていません。各メーカーの公式サイトからダウンロードしてください。
- 電源 / 高電圧機器を扱う場合は安全保護機能(OVP / OCP 等)を必ず設定してから出力 ON してください。本ソフトウェアは安全機能の代替ではありません。
- LLM が誤ったコマンドを送信する可能性があります。接続機器・配線・被測定物の安全範囲は人間が責任を持って確認してください。
Acknowledgments
- PyVISA — Python VISA wrapper
- FastMCP — MCP server framework
- Model Context Protocol — Anthropic
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lab_visa_mcp-2.8.1.tar.gz.
File metadata
- Download URL: lab_visa_mcp-2.8.1.tar.gz
- Upload date:
- Size: 458.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d875408cc9f8778d456a3368d2ff0e28b428eb447cd31fce2036fd9ca1a854a
|
|
| MD5 |
08f3b1c6f13bd62bed13d95f7c4fc52f
|
|
| BLAKE2b-256 |
53aadb99328efca31476c49f4eca5b04cbc1bef98d362b9e828b4c9252affcf5
|
Provenance
The following attestation bundles were made for lab_visa_mcp-2.8.1.tar.gz:
Publisher:
publish.yml on TECTOS-JP/lab-visa-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lab_visa_mcp-2.8.1.tar.gz -
Subject digest:
5d875408cc9f8778d456a3368d2ff0e28b428eb447cd31fce2036fd9ca1a854a - Sigstore transparency entry: 2211370582
- Sigstore integration time:
-
Permalink:
TECTOS-JP/lab-visa-mcp@79d3d14076b050b62f9ed0e246e4cfc919d9a702 -
Branch / Tag:
refs/tags/v2.8.1 - Owner: https://github.com/TECTOS-JP
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@79d3d14076b050b62f9ed0e246e4cfc919d9a702 -
Trigger Event:
push
-
Statement type:
File details
Details for the file lab_visa_mcp-2.8.1-py3-none-any.whl.
File metadata
- Download URL: lab_visa_mcp-2.8.1-py3-none-any.whl
- Upload date:
- Size: 157.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9824d5721f3e62fc748a3a87a80228ae30b98aa630b46a6284672491bc3133d7
|
|
| MD5 |
5b553e591a21d3f7b00f052904dc1654
|
|
| BLAKE2b-256 |
606bd9b91a75820fc4b5664d8ec37767a1320c3f8c57ffbbdf8debad9bb39fcc
|
Provenance
The following attestation bundles were made for lab_visa_mcp-2.8.1-py3-none-any.whl:
Publisher:
publish.yml on TECTOS-JP/lab-visa-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lab_visa_mcp-2.8.1-py3-none-any.whl -
Subject digest:
9824d5721f3e62fc748a3a87a80228ae30b98aa630b46a6284672491bc3133d7 - Sigstore transparency entry: 2211370654
- Sigstore integration time:
-
Permalink:
TECTOS-JP/lab-visa-mcp@79d3d14076b050b62f9ed0e246e4cfc919d9a702 -
Branch / Tag:
refs/tags/v2.8.1 - Owner: https://github.com/TECTOS-JP
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@79d3d14076b050b62f9ed0e246e4cfc919d9a702 -
Trigger Event:
push
-
Statement type: