mcpField
M
matlab-discover-hardware

matlab-discover-hardware

github.com/matlabその他1.2k46 回インストール1 日前に更新
リポジトリ

matlab-discover-hardware について

対応ハードウェアの検出、機能によるデバイス検索、必要なアドオンのインストール状態確認を行うMATLABスキルです。付属のヘルパー関数を使い、デバイスの操作ではなく検出に範囲を限定します。

主な機能

  1. 01接続済みまたは利用可能なデバイスの一覧表示
  2. 02機能によるデバイス検索
  3. 03デバイスの詳細と機能の確認
  4. 04必要なサポートパッケージの状態確認

活用シーン

  1. 01MATLAB対応の接続済みハードウェアの確認
  2. 02特定の機能に対応するデバイスの特定
  3. 03指定デバイスの利用に必要な条件の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-discover-hardware

インストール後、Claude Code で/matlab-discover-hardwareを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

manifest.yaml
scripts/
getAddOnDetails.m
getAddOnDetails.p
getDeviceAddOns.m
getDeviceAddOns.p
getDeviceDetails.m
getDeviceDetails.p
getDeviceSetupInfo.m
getDeviceSetupInfo.p
hardwareDeviceCache.m
hardwareDeviceCache.p
isRequiredAddOnsInstalled.m
isRequiredAddOnsInstalled.p
listHardwareDevices.m
listHardwareDevices.p

詳細

ハードウェア検出

1. このスキルの用途

自然言語によるハードウェア検出タスクに、このスキルを使用します。接続済みデバイスの一覧表示、機能による検索、デバイスの詳細や機能の確認、および必要なサポートパッケージやアドオンがインストールされているかの確認ができます。

このスキルは、scripts/ に含まれる MATLAB ヘルパー関数を通じてハードウェア検出機能を提供します。必ず用意されたヘルパー関数を使用し、その動作を再現したり、内部の MATLAB 関数を直接呼び出したりしないでください。

使用する場面

次のような質問があった場合に、このスキルを有効にします。

  • 接続済みまたは利用可能なハードウェアについて(例:「何が接続されていますか?」「どのデバイスがありますか?」)
  • 特定の機能に対応するデバイスについて(例:「CAN に対応しているものは?」「アナログ入力ができるデバイスはどれですか?」)
  • 特定のデバイスの詳細や機能について(例:「Arduino Due について教えてください」「NI USB-6211 でできることは何ですか?」)
  • デバイスに必要なサポートパッケージやアドオンがインストールされているかどうか
  • 特定のデバイスを使用するためにインストールが必要なもの

使用しない場面

次の場合は、このスキルを有効にしないでください。

  • ハードウェアに関係しない MATLAB の作業(一般的なスクリプト作成、アルゴリズム開発、プロットなど)
  • デバイスからのデータ取得またはストリーミング(代わりにデバイス固有のスキルを使用してください)
  • 検出後の特定デバイスの設定やプログラミング(デバイス固有のスキルを使用してください)
  • サポートパッケージの直接インストール。このスキルが報告するのはインストール状態のみです。インストールに対応するスキルがある場合は、そちらに引き継いでください
  • ハードウェアに関係なく、インストール済みのすべての MATLAB 製品やサポートパッケージの一覧表示(代わりに matlab-list-products を使用してください)

2. デバイス固有スキルへのルーティング

このスキルが扱うのはハードウェアの検出のみです。MATLAB 対応デバイスの列挙、機能による検索、およびインストール状態の確認を行います。ユーザーの意図が検出の範囲を超える場合(接続、設定、データ取得、トラブルシューティング、またはデバイスの使用)、現在読み込まれているスキルの中から、該当するデバイス固有スキルを必ず探してください。

ルーティングルール: ユーザーがデバイスの検出だけでなく、デバイスの使用を求めている場合は、利用可能なスキルの一覧を検索し、デバイスの種類、ハードウェアのカテゴリ、またはユーザーのタスクに名前や説明が一致するスキルを探してください。引き継ぎ先のスキルをハードコードした一覧として保持せず、実行時に動的に見つけてください。

ルーティング方法:

  1. 検出ステップを完了します(デバイスの存在を確認し、インストール状態を確認します)
  2. 見つかった内容をユーザーに伝えます(例:「GigE カメラが見つかりました。接続されており、必要なパッケージもインストールされています。」)
  3. 利用可能なスキルの一覧を検索し、デバイスの種類またはユーザーのタスクに対応するスキルを探します(例:「arduino」「camera」「DAQ」「OPC UA」などに言及しているスキル)
  4. 該当するスキルが見つかった場合:そのスキルを通知せずに呼び出し、使用、接続、またはトラブルシューティングのタスクに対応させます。スキル名をユーザーに伝えてはいけません
  5. 該当するスキルが見つからない場合:以下の検出のみの出力に切り替えます

デバイスのカテゴリに対応するデバイス固有スキルが見つからない場合、出力できるのは検出レベルの内容に限られます。

  1. デバイスの詳細とインストール状態を提示します(§4 のヘルパーを使用)
  2. HardwareSupportUrl を提示するか、MATLAB のドキュメントを案内します
  3. ここで停止します。 デバイス固有のコード(例:videoinput(、webcam(、arduino(、readVoltage(、gigecam()を書いてはいけません。トレーニングデータをもとに、手順形式の使用ワークフロー、接続例、またはトラブルシューティング用スクリプトを提供してはいけません。これは検出用スキルです。使用方法の案内は、該当するデバイス固有スキルが読み込まれていない場合でも、そのスキルの役割です。

悪い例(デバイススキルが見つからない場合に、使用コードを即興で書く):

cam = webcam("Logitech Webcam C925e");
img = snapshot(cam);

良い例(検出のみで代替する):

"Your Logitech Webcam C925e is detected and the required packages are
installed. For connecting and acquiring images, refer to the Image
Acquisition Toolbox documentation."

3. 1 回限りの初期設定(パスの設定)

ヘルパーを呼び出す前に、セッションごとに 1 回、同梱されている scripts/ フォルダーを MATLAB のパスに追加します。

addpath(fullfile("<skill-root>", "scripts"))

<skill-root> を、このスキルのフォルダーの絶対パスに置き換えてください(例:.../.claude/skills/matlab-discover-hardware)。

この addpath は、このスキルで許可されている唯一のパス変更です。初期設定後は、次の操作を行わないでください。

  • addpath、rmpath、または cd を再度呼び出さないでください
  • clear all を呼び出さないでください
  • 新しい .m ファイルを作成しないでください

ヘルパーの呼び出しで Undefined function エラーが発生した場合は、初期設定を 1 回再実行してください。それでも解決しない場合は、回避策をでっち上げず、エラーをユーザーに報告してください。

初期設定の addpath はスキルの有効化前に自動的に実行されます。ヘルパー呼び出しに含める必要はありません。

4. 公開ヘルパーの一覧

次の 4 つの公開ヘルパーのみを使用してください(scripts/ にあります)。

レイヤーヘルパー目的
1 — 検出listHardwareDevicesデバイスを一覧表示します(既定では接続済みのデバイスのみ)
2 — 詳細getDeviceDetails指定したデバイスの全情報(機能、サポートパッケージ、技術的な詳細)
2 — 詳細getDeviceSetupInfo必要なパッケージ、インストール状態
2 — 詳細isRequiredAddOnsInstalled必要なアドオンがすべてインストールされているかを論理値で確認します

内部用 — 呼び出さないでください: hardwareDeviceCache.m、getDeviceAddOns.m、getAddOnDetails.m は、公開ヘルパーが依存しているため scripts/ に存在します。これらはエージェント向けインターフェイスの一部ではないため、直接呼び出してはいけません。

同名デバイスの動作: getDeviceDetails は一致するデバイスごとに 1 つの構造体を返します(同名のデバイスが複数ある場合は構造体配列)。getDeviceSetupInfo と isRequiredAddOnsInstalled は単一の結果を返します(同名のデバイスはすべて同じアドオン要件を共有します)。

重要: 必ず上記の公開ヘルパーを使用してください。内部の MATLAB 関数を呼び出したり、ヘルパーの動作を手動で再現したりしないでください。

5. タスクの振り分け

ユーザーの意図に合ったヘルパーを選んでください。タスクに必要な呼び出しはすべて、evaluate_matlab_code の呼び出し回数が最小になるようにまとめてください(バッチ処理の例は §6 を参照)。

ユーザーの意図呼び出すヘルパー
「どんなハードウェアがありますか?」/「何が接続されていますか?」listHardwareDevices
「X をサポートするデバイスはどれですか?」(機能の検索)listHardwareDevices(Capability=keyword)
「 について教えてください」/「 では何ができますか?」getDeviceDetails(deviceName) + isRequiredAddOnsInstalled(deviceName)
「 の使い方を教えてください」/「 に接続できません」/「 からデータを取得するにはどうすればよいですか?」**デバイス固有のスキル(§2)に引き継いでください。**まず検出とインストール状態の確認を実行してから、引き継ぎます。デバイス固有のスキルが読み込まれていない場合に限り、このスキルのヘルパーを使用してください。
「 にインストールする必要があるものは何ですか?」/「 の使用に必要なものは何ですか?」/「 を使用できますか?」getDeviceSetupInfo(deviceName)
「 のアドオンはインストールされていますか?」isRequiredAddOnsInstalled(deviceName)
「 のサポートパッケージ/ツールボックスをインストールしてください」インストール可能なスキルがあるか、利用可能なスキル一覧を確認し、見つかった場合は通知せずに呼び出してください。見つからない場合は、ユーザーに MATLAB Add-On Explorer(Home タブ → Add-Ons → Get Add-Ons)を開き、パッケージ名で検索するよう案内してください。
デバイスが見つからない(接続済みのデバイスにも「All」モードにも表示されない)ハードウェアが検出されなかったことをユーザーに伝えてください。必要な製品を推測してはいけません。製品を検索またはインストールできるスキルがあるか、利用可能なスキル一覧を通知せずに確認し、具体的なスキル名をユーザーに伝えることなく、必要なものを見つける手伝いを申し出てください。

ユーザーの質問が複数のタスクに当てはまる場合は、まず、コストが最も低く、目的に最も合ったヘルパーを優先してください(例:getDeviceDetails より先に listHardwareDevices(Capability=...) を実行します)。

6. ワークフローのパターンとバッチ処理

重要:MCP の往復回数を最小限に抑える

evaluate_matlab_code を呼び出すたびに、ユーザーの承認が必要な MCP の往復が発生します。可能な場合は、複数のヘルパー呼び出しを 1 回の evaluate_matlab_code 呼び出しにまとめてください。ヘルパーは内部キャッシュ(TTL は 60 秒)を共有するため、1 つのスクリプト内で順番に呼び出すと効率的です。

ルール:

  1. デバイス名がすでにわかっている場合は、レイヤー 1 とレイヤー 2 の呼び出しをまとめる
  2. 詳細情報の呼び出しに先立って、インストール状態の確認もまとめる
  3. 1 つのユーザーの質問に対する MCP 呼び出しは、合計 1~2 回を目標にする
バッチ処理のレシピ
レシピ A:「接続されているハードウェアは?」(MCP 呼び出し 1 回)
deviceList = listHardwareDevices();
disp(deviceList)
clear deviceList
レシピ B:「 について教えて」/「 で何ができますか?」(MCP 呼び出し 2 回)

呼び出し 1 — 検出(デバイスが存在することを確認):

deviceList = listHardwareDevices();
disp(deviceList)
clear deviceList

呼び出し 2 — 詳細情報とインストール状態の確認(まとめて実行):

details = getDeviceDetails("<deviceName>");
disp(details);
isInstalled = isRequiredAddOnsInstalled("<deviceName>");
if ~isInstalled
    setupInfo = getDeviceSetupInfo("<deviceName>");
    disp(setupInfo);
end
clear details isInstalled setupInfo

ユーザーがデバイス名を直接指定しており、その名前に確信がある場合(例:「Arduino Due」と入力している場合)は、呼び出し 1 を省略し、すべてを 1 回の呼び出しで実行します。

details = getDeviceDetails("<deviceName>");
disp(details);
isInstalled = isRequiredAddOnsInstalled("<deviceName>");
if ~isInstalled
    setupInfo = getDeviceSetupInfo("<deviceName>");
    disp(setupInfo);
end
clear details isInstalled setupInfo

複数の結果がある場合の処理: getDeviceDetails は、同じ名前のデバイスが複数ある場合(例:2 つの「Kvaser Virtual」チャンネル)、構造体配列を返します。numel(details) > 1 の場合、すべての結果を提示せず、各要素の BasicInfo にある ConnectionInfo やその他の識別フィールドを使って、§6 のプレーンテキストによる曖昧さ解消フローを実行します。

レシピ C:「 用に何をインストールする必要がありますか?」(MCP 呼び出し 1 回)
setupInfo = getDeviceSetupInfo("<deviceName>");
disp(setupInfo)
clear setupInfo
レシピ D:機能による検索(MCP 呼び出し 1~2 回)
results = listHardwareDevices(Capability="<keyword>");
disp(results)
clear results

結果が見つかり、ユーザーが詳細を求めている場合は、レシピ B の呼び出し 2 を続けて実行します。

検出してから詳細を確認する

レイヤー 2 のヘルパーを呼び出す前に、レイヤー 1 のヘルパー(listHardwareDevices または listHardwareDevices(Capability=...))を呼び出します。デバイス名を推測しないでください。**例外:**ユーザーがデバイスを明示的に指定した場合は、検出を省略し、レイヤー 2 に直接進みます(レシピ B の 1 回呼び出し版を参照)。

機能を優先して検索する

ユーザーが「CAN メッセージを読み取りたい」のようにタスクを説明した場合は、特定のデバイス名を挙げる前に listHardwareDevices(Capability="CAN") を呼び出します。

機能検索で結果が見つからない場合は、別のキーワードを推測したり、自身の知識に基づいて候補を作り出したりしないでください。代わりに、次の手順に従います。

  1. listHardwareDevices() を呼び出して、接続されているすべてのデバイスを表示する
  2. 一覧をユーザーに提示し、そのタスクにどのデバイスを使うつもりだったか尋ねる
  3. ユーザーがデバイスを特定したら、インストール状態の確認ワークフローに進む
インストール状態の確認

ユーザーがデバイスに必要なものを尋ねた場合や、特定のデバイスの使い方、または使用できるかどうかを尋ねた場合は、レシピ C を使用します(getDeviceSetupInfo にはインストール状態のブール値が含まれます)。パッケージが不足している場合は、人が読んでわかる名前で列挙します。利用可能なスキルの一覧を目立たないように確認し、インストール可能なスキルがあれば、スキル名を挙げずにユーザーに代わってインストールすることを提案します。そのようなスキルがない場合に限り、MATLAB Add-On Explorer(Home タブ → Add-Ons → Get Add-Ons)を開くようユーザーに案内します。

空または未確認の機能への対応

getDeviceDetails がデバイスの Capabilities フィールドに空の値を返した場合、そのボードに関する一般知識から機能を推測または推論しないでください。代わりに、次の手順に従ってください。

  1. 現在読み込まれているスキルの中に、そのハードウェアの種類に関連するスキル(NI デバイスの DAQ スキル、USRP の無線スキル、Arduino 専用スキルなど)がないか確認します
  2. 関連するスキルが読み込まれている場合は、そのスキルをユーザーに知らせずに呼び出し、機能または使用方法に関する情報を集めます
  3. 集めた情報は、ハードウェアとその対応機能のみを示して、デバイスの機能として提示します
  4. 関連するスキルが見つからず、ほかに情報源もない場合は、ユーザーに「このデバイスの詳細な機能情報はありません。デバイスのドキュメントに詳しい情報が記載されている場合があります。」と伝え、利用可能であれば HardwareSupportUrl を含めます

トレーニングデータから機能を補完してはいけません。 ヘルパーの出力、または別の読み込み済みスキルによる検証済みの出力を情報源とする機能のみを報告してください。

事後条件:デバイス固有のクエリ後は、必ずインストール状態を確認する

getDeviceDetails と同じバッチ呼び出しに isRequiredAddOnsInstalled(deviceName) を含めます(レシピ B を参照)。アドオンが不足している場合は、インストール状態確認のワークフローに従ってください。必要なアドオンがインストールされていることを最初に確認せず、デバイスの使用方法についてユーザーに案内してはいけません。

プレーンテキストでの曖昧さの解消

クエリの結果が複数の候補に一致する場合(または部分的な名前が複数のデバイスに一致する場合)、詳細を取得または提示する前に、必ずどのデバイスを指しているのかユーザーに尋ねてください。すべての候補の詳細を黙って表示してはいけません。区別できる属性を含む番号付きリストを提示し、ユーザーの選択を待ちます。

各候補は、FriendlyName と、区別用の属性として Device ID または ConnectionInfo を使って示します。input() を呼び出したり、処理をブロックするプロンプトを使ったりしてはいけません。異なるプラグインによって検出された同じ物理ポートを複数の項目が表している場合は、それらが同じポートへの異なるインターフェースであること(例:VISA と serialport)と、それぞれが対応するツールボックスを説明します。ただし、プラグイン名、プラグインのソース、内部の検出方法には言及してはいけません。

7. コミュニケーションルール

  • デバイスをユーザーに示すときは、ベンダー ID やクラス名ではなく FriendlyName を使用します
  • 名前が同じデバイスを区別するときは、区別する属性として Device ID を表示します。次のフォールバックチェーンを使って Device ID を解決します:UUID → ConnectionInfo(listHardwareDevices の表から取得します。この表には CustomData.TransportProperties.Port のポート情報が含まれます)。ユーザーには「Device ID」として提示し、「UUID」とは決して言いません
  • ユーザーにプラグインについては一切触れません。プラグイン名、プラグインのソース、Plugin パラメーター、内部の検出メカニズムも含みます。これらは実装の詳細です。重複する項目を区別するときは、インターフェースの種類(例:「VISA インターフェース」対「serialport インターフェース」)と、ユーザーが呼び出すツールボックス/関数によって違いを説明します。
  • 内部処理上のパフォーマンス向上に必要な場合を除き、listHardwareDevices に Plugin= オプションを渡しません。応答でプラグイン名を表に出すことは決してありません。
  • デバイスが約 10 台を超える場合は、まずカテゴリごとの台数を要約し、詳細を確認するか尋ねます
  • **一般的な一覧表示/閲覧の問い合わせ(例:「何が接続されていますか?」「どの種類のデバイスがサポートされていますか?」)に回答するときは、サポートパッケージ、インストール状態、「追加パッケージを利用できます」について言及しません。**これは応答全体に適用されます。本文だけでなく、追加の提案も対象です。一覧表示の応答では、複数の選択肢のひとつとしてであっても、「サポートパッケージ」という言葉を含めてはいけません。悪い例:「機能、サポートパッケージ、セットアップの詳細をご希望ですか?」良い例:「特定のデバイスやその機能について詳しく知りたいですか?」サポートパッケージに触れるのは、ユーザーが特定のデバイスの使用を希望している場合(例:「Arduino の使い方を教えてください」「ウェブカメラを使えますか?」)に限ります。
  • サポートパッケージが関係する場合は、人が読める名前(例:「MATLAB Support Package for Arduino Hardware」)で提示します。生のベースコード(例:"ML_ARDUINO")をユーザーに見せてはいけません。
  • ヘルパーの出力に忠実に従います。ヘルパーが返していない機能、例、ドキュメントへのリンクを作り出してはいけません

8. 厳守事項

  • **内部 API を呼び出しません。**MATLAB の内部関数を直接呼び出さず、必ず提供されたヘルパーを使用します
  • **初期化後にパスを変更しません。**一度限りの初期化後に addpath、rmpath、cd を実行しません
  • **clear all は使用しません。**必要な場合に限り、特定の変数をクリアします
  • **デフォルトでは Refresh=true を指定しません。**ユーザーが新しいデータを明示的に求めた場合(「もう一度スキャンして」「更新して」「今は何が接続されていますか?」)に限り、Refresh=true を渡します
  • **新しい MATLAB ファイルは作成しません。**このスキルは既存のものを利用するだけです
  • **インストール済みと決めつけません。**パッケージが利用可能だと主張する前に、必ず isRequiredAddOnsInstalled または getDeviceSetupInfo でインストール状態を確認します
  • **インストール可能なスキルがある場合、手動インストールへのフォールバックは行いません。**利用可能なスキルの一覧を内部で確認します。製品をインストールできるスキルがある場合は、アドオンエクスプローラーの手順を説明するのではなく、ユーザーに代わってインストールすることを提案します。内部のスキル名をユーザーに見せてはいけません。

9. CustomData の解釈

getDeviceDetails の出力には、標準フィールドでは取得できないデバイス固有の技術情報を含む CustomData フィールドが含まれる場合があります。CustomData が存在し、空でない場合は、ユーザーに伝える価値のある追加情報が含まれています。たとえば、次のような情報です。

  • 接続プロパティ: シリアルポート(Address/Port)、ボーレート、接続方式(Serial、WiFi、Bluetooth)
  • ハードウェア識別子: シリアル番号、製造元、VID/PID(USB のベンダー ID/プロダクト ID)
  • ボード固有の情報: ボードのバリアント、ファームウェアのバージョン、WiFi ポート

デバイスの接続、ポート、アドレス、ハードウェアの識別情報について回答するときは、必ず CustomData を確認してください。CustomData に実際のポートやアドレスが含まれていても、標準の BasicInfo.ConnectionInfo フィールドが空の場合があります。接続レベルの詳細情報については、CustomData を信頼できる情報源として扱ってください。

CustomData をユーザーに提示する場合は、生の構造体フィールドをそのまま出力するのではなく、平易な言葉を使ってください(例:「USB 経由で COM4 に接続されています」)。

10. 出力の取り扱いに関するガイダンス

すべてのヘルパーは、nargout に応じた二種類の出力に対応しています。

  • 出力を取得する(x = listHardwareDevices())場合は、データを処理したり、フィルタリングしたり、次の呼び出しで使用するフィールドを抽出したりするときに使います。これにより、MATLAB の表示は抑制されます。
  • 出力を指定せずに呼び出す(listHardwareDevices())場合は、ユーザーがヘルパーの整形済み出力を MATLAB のコマンドウィンドウに表示することを明示的に希望しているときに使います。

出力を取得して disp() で表示する方法を既定にしてください。こうすることで、結果を表示しながら、複数の呼び出しを 1 つのスクリプト内で連続して実行できます。表示モード(出力を取得しない呼び出し)は、単独のヘルパー呼び出しに限って使用してください。

1 つのスクリプトで複数のヘルパーをまとめて実行する場合は、呼び出しの間に disp() または fprintf() を使って、中間結果を表示してください。ユーザーのワークスペースが不要な変数で汚染されないよう、最後に必ず一時変数をクリアしてください。

details = getDeviceDetails("Arduino Due");
disp(details);
isInstalled = isRequiredAddOnsInstalled("Arduino Due");
fprintf("Add-ons installed: %d\n", isInstalled);
clear details isInstalled

Copyright 2026 The MathWorks, Inc.


コメント