Skip to content
Conduit

mcp server

lab-visa-mcp

MCP server for controlling GPIB/USB/Serial instruments via PyVISA. Define commands per instrument with YAML.

TECTOS-JP/lab-visa-mcpcommunitylistedunreviewednot running here yet

Set up

Runs on your computer. Pick your agent and operating system.

Before you start

  • uv (`curl -LsSf https://astral.sh/uv/install.sh | sh`)
~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "tectos-jp-lab-visa-mcp": {
      "command": "uvx",
      "args": [
        "lab-visa-mcp"
      ]
    }
  }
}

same format Cursor, GitHub Copilot CLI, Junie, JetBrains AI Assistant, Augment (Auggie CLI), Factory Droid, Kiro, Devin CLI +12

Values in angle brackets are placeholders. Restart Claude Desktop after editing its config.Claude Desktop docs

README

synced Oct 14, 2026

lab-visa-mcp

License: MIT Python 3.10+

lab-executor-mcp 用の PyVISA backend + 互換 shim です。

⚠ v2.8.0 で改名しました エコシステムの他 backend (lab-modbus-mcp / lab-ble-mcp / lab-nidaq-mcp) と命名を揃えました。

旧新
配布名visa-mcplab-visa-mcp
import 名visa_mcplab_visa_mcp
CLIvisa-mcplab-visa-mcp

旧配布名 visa-mcp は PyPI から削除済みで、pip install visa-mcp は 失敗します。 旧 import 名の shim も提供していません。

pip install lab-visa-mcp

改行コードに関する注意 (v2.0.1): GitHub raw view では、一部の viewer が file を「1 line」と誤って報告する ことがあります。.gitattributes で LF を強制しており、CI で TOML / YAML parse + compileall + multiline guard を常時検証しています。 実体の確認には clean clone (git clone --branch v2.0.0 等) または GitHub file viewer を使ってください。

v2.0 で分離されました v1.x まで 1 パッケージで提供していた「実験実行 runtime / DSL / extension ecosystem」は lab-executor-mcp に移りました。 本パッケージは v2.0+ で PyVISA backend layer に特化します。

  • 実機 backend が必要: pip install lab-visa-mcp (自動的に lab-executor-mcp も入る)
  • 実機 backend 不要 (benchmark / dry-run のみ): pip install lab-executor-mcp
  • v1.x からの移行: docs/v2_migration.md

PyVISA 経由で GPIB / USB / Serial / LAN 計測器を制御する MCP server です。

LLM(Claude Code / Claude Desktop など MCP 対応クライアント)から、SCPI 計測器と非 SCPI 計測器の両方を統一的に操作できるサーバーです。マニュアルから抽出したコマンドを YAML で定義すれば、機器固有の知識なしに自然言語で計測を自動化できます。

📝 記事

特徴

  • 🔌 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 で複数機器並行制御

動作確認済み機器

メーカーモデルインタフェースプロトコル
KikusuiPMX35-3A 直流安定化電源USBSCPI
Yokogawa7563 6桁ディジタルマルチ温度計GPIB独自(非SCPI)

クイックスタート

1. インストール

前提: Python 3.10+ / NI-VISA または互換 VISA ライブラリ(Keysight IO Libraries Suite / PyVISA-Py 等)

git clone https://github.com/TECTOS-JP/lab-visa-mcp.git
cd lab-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": {
    "lab-visa-mcp": {
      "command": "python",
      "args": ["-m", "lab_visa_mcp.server"],
      "cwd": "<path-to-lab-visa-mcp>"
    }
  }
}

Claude Desktop を再起動。

3. 動作確認

Claude に話しかける:

「lab-visa-mcp に接続されている計測器を一覧してください」

「USB0::0x... を identify_instrument で識別して、5V 出力するように設定してください」

v1.1 の安定性: 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/lab_visa_mcp/stability.py。

query filter による resource 検出 (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_jobrecipe を Job として登録、即 job_id 返却
start_wait_job単発 wait ジョブ (seconds / until / condition / stable_value) を起動 ★v0.5.1
get_job_statusJob の現在状態 + polling/group 進捗
get_job_result完了/失敗時の完全結果 + 次手候補
list_jobsJob 一覧 (status / owner / limit で絞り込み)
cancel_jobJob キャンセル (immediate / after_current_step / safe_shutdown)
resume_jobinterrupted / cancelled / failed / timeout Job を 新規 Job として 再開 (dry_run / from_step 明示必須、experimental) ★v0.9.0

Group / Map (並列実行) ★v0.6.0 新規

ツール用途
list_groupsinstrument_groups 一覧
list_experiment_unitsexperiment_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_statestate_query 定義に従って機器の現在状態を取得 (cache 対応)
get_last_measurement測定値キャッシュから最新値 (古ければ自動再取得)
start_monitor機器を定期測定する Monitor Job を起動 (monitor_data に保存)
stop_monitorMonitor Job を停止
get_monitor_dataMonitor の時系列データを取得 (大量データ向け別ツール、limit≤10000)
prune_monitor_dataMonitor Job データを削除 (monitor_id 指定 / older_than_days 指定) ★v0.7.0.1

Experiment DSL (LLM 向け実験計画) ★v0.8.0 新規

ツール用途
validate_experiment_planDSL plan を検証 (resource/command/safety/verify/sweep 上限など 15 項目)
dry_run_plan実機 I/O 無しで rendered SCPI + safety + verify summary を返す
start_experiment_jobvalidate → 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_templatetemplate に override (name/unit/bindings/parameters/owner) を適用して実行 (dry_run 対応) ★v0.8.3

Observation (実験ビュー) ★v0.8.2 新規

ツール用途
get_experiment_timelineJob 内の時系列イベント (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_resultsJob 測定結果を少量確認用 JSON で取得 (stable v1.x) ★v0.9.1
export_experiment_resultsJob 測定結果を 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_bundleJob 実験記録を zip (manifest+plan+timeline+results+sha256) で出力 (experimental) ★v1.0
validate_experiment_bundlebundle zip の整合性を実行なしに検証 (checksum / required files / version、experimental) ★v1.1
inspect_experiment_bundlebundle 中身要約 (manifest / plan / job_summary / result rows、analysis-only、experimental) ★v1.1

取り込み

ツール用途
extract_pdf_commandsPDF マニュアルからコマンド候補を抽出

加えて、環境変数 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/lab_visa_mcp/server.py
│  ┌────────────────┐  │
│  │ Tool Handlers  │  │  ← src/lab_visa_mcp/tools/
│  ├────────────────┤  │
│  │ Session Mgr    │  │  ← セッション・定義紐付け
│  ├────────────────┤  │
│  │ VISA Manager   │  │  ← PyVISA 非同期ラッパー
│  └────────────────┘  │
└──────────┬───────────┘
           │ VISA
┌──────────▼───────────┐
│  Instrument (GPIB/   │
│   USB/Serial/LAN)    │
└──────────────────────┘

開発

# 開発依存込みインストール
pip install -e ".[dev]"

# テスト実行
pytest

# サーバー単独起動(デバッグ用)
python -m lab_visa_mcp.server

ライセンス

MIT License — 詳細は LICENSE を参照。

注意事項

  • 計測器マニュアル PDF はリポジトリに含まれていません。各メーカーの公式サイトからダウンロードしてください。
  • 電源 / 高電圧機器を扱う場合は安全保護機能(OVP / OCP 等)を必ず設定してから出力 ON してください。本ソフトウェアは安全機能の代替ではありません。
  • LLM が誤ったコマンドを送信する可能性があります。接続機器・配線・被測定物の安全範囲は人間が責任を持って確認してください。

謝辞

↑↓ navigate openesc close