benchtop-mcp
シリアル接続された計測装置・回路を、AI エージェント(Claude など)から直接操作・記録・解析するための MCP サーバーです。
実機がなくても動きます。 内蔵の仮想装置(port="mock")があるので、ハードを繋ぐ前に全機能を試せます。
License: v0.x は MIT。 v1.0+ は AGPL-3.0 + commercial dual への切替 可能性 予告 (LICENSE file 参照)。 v0.x 分は 永久 MIT (irrevocable)。
これは何を解決するのか
計測の現場では、だいたい同じことが繰り返されています。
- 装置にコマンドを送って値を読む
- しばらく回してログを取る
- Excel に貼って平均と σ を出し、おかしい点を探す
- CSV にして誰かに渡す
一つ一つは簡単ですが、面倒で、毎回手でやっています。このサーバーを入れると、その全部を AI に日本語で頼めるようになります。
「mock に繋いで200回測って、電圧のばらつきを見て、外れ値があったら教えて。結果は CSV にして」
地味です。しかし前の会話で確認した「売れるものの条件」——誰もが必要とし、自作すると面倒で、壊れると静かに高くつく——に、正確に当てはまります。
公開しているツール(AI から呼べる機能)
| ツール | 役割 |
|---|---|
list_ports |
利用可能な装置の一覧。実機が無くても mock が必ず出る |
send_command |
装置に1行送って応答を読む(*IDN? など) |
measure |
N 回連続で測定し、セッションとして保存 |
list_sessions |
保存済みセッションの一覧 |
analyze_session |
平均・σ・最小/最大・ドリフト・3σ外れ値を算出 |
export_session_csv |
CSV に書き出し |
対応する測定値の形式は3種類を自動判別します。
T=25.3,H=48.1 → {"T": 25.3, "H": 48.1}
25.3,48.1 → {"ch1": 25.3, "ch2": 48.1}
25.3 → {"value": 25.3}
導入手順
1. 依存関係を入れる
pip install "mcp>=2.0.0" pyserial
pyserial は実機に繋ぐときだけ必要です。無くてもモックは動きます。
2. 動作確認(Claude に繋ぐ前に、まずこれ)
python benchtop_mcp.py --selftest
以下のように出れば成功です。
== benchtop-mcp セルフテスト ==
[1] ポート一覧: 33件 / pyserial=True
[2] IDN応答: MOCK,BENCHTOP-SIM,0001,1.0.0
[3] パース: 4形式すべてOK
[4] 計測: 60行 / channels=['T', 'H', 'V']
[5] 解析: T平均=25.028583 σ=0.274831 外れ値=1件
[6] CSV書き出し: ... (61行=ヘッダ1+データ60)
全テスト成功。実機が無くてもこのサーバーは動作します。
3. Claude Desktop に登録する
設定ファイル(%APPDATA%\Claude\claude_desktop_config.json)に追記します。
{
"mcpServers": {
"benchtop": {
"command": "python",
"args": ["C:\\path\\to\\benchtop_mcp.py"]
}
}
}
Claude Desktop を再起動すると、ツール一覧に benchtop が現れます。あとは普通に日本語で頼めます。
実機に繋ぐ
装置が1行1レコードで値を送ってくるなら、それだけで動きます。Arduino 側の最小例:
void setup() { Serial.begin(9600); }
void loop() {
float t = analogRead(A0) * 0.0048828125 * 100.0;
float v = analogRead(A1) * 0.0048828125;
Serial.print("T="); Serial.print(t, 3);
Serial.print(",V="); Serial.println(v, 4);
delay(100);
}
あとは port に COM3(Windows)や /dev/ttyUSB0(Linux/Mac)を指定するだけです。
コードの読みどころ
学習目的で読む場合、この3点が設計の要点です。
1. コアと MCP 層を分離しているBench クラスは MCP を一切知りません。MCP 層(@server.tool() の部分)は薄い皮です。こうしておくと、コアだけ単体テストできますし、将来 CLI や Web API を生やすときにも書き直しが要りません。
2. モック装置を最初から入れているDevice という共通インターフェースを挟み、実機(SerialDevice)とモック(MockDevice)を差し替え可能にしています。ハードが手元に無い日でも開発が止まりません。デモも CI も通せます。ハードウェア絡みのソフトでは、これがあるか無いかで開発速度が何倍も変わります。
3. docstring が AI への説明書になる@server.tool() を付けた関数の docstring と型注釈は、そのまま AI に渡されます。ここが雑だと AI は道具を正しく使えません。普通のコードではコメントは人間向けですが、MCP では機械向けの仕様書です。 ここを丁寧に書くことが、そのまま品質になります。
ライセンス
v0.x = MIT (LICENSE file 参照)。 藤本さん 2026-08-12 judgment per 選択。
v1.0+ 以降は AGPL-3.0 + commercial dual への 切替可能性 予告 (LICENSE file 内 「License trajectory notice」 参照)。 但し v0.x code は 永久 MIT (irrevocable) = fork 継続 path は 永久に開く。
背景: Product Transition Judgment Framework v0.1 の 5 checklist を benchtop-mcp v0.x 段階では 0-1 件該当 = 無料継続 default。
参考: 有料化候補 3 点 fit (chat-Claude 2026-08-12 arc 分析)
benchtop-mcp は 「売れる条件 3 点」 全該当 = 有料化 candidate:
- 誰もが必要: 計測ログ + 統計 + CSV 出力 は 差別化要素でない (全部の 計測現場が やる作業)
- 自作面倒: シリアル通信 + セッション管理 + AI 説明 docstring は 毎回書きたくない
- 静かに壊れて高い: 監視ログが 数日 気付かず 溜まる、 品質記録が 消えると 監査で困る
将来 v1.0+ で 有料 tier 検討する場合の 線引き案:
推奨する組み合わせ (将来 v1.0+ の 参考、 現時点 v0.x = MIT)
ソフト部分: AGPL-3.0 + 商用ライセンスのデュアル
- 個人・研究・社内利用は無料で自由に使える(あなたの「個人にも使ってほしい」という希望を満たす)
- ただし、これを組み込んだ製品を売るなら、ソース公開か商用ライセンス購入かを選ぶことになる
- MIT にすると、この選択を後から追加できません。AGPL なら、後から緩めるのは自由(著作権者はいつでも緩められる)
貢献者対応: CLA を最初に用意する
外部から Pull Request を受け取ると、その部分の著作権は相手のものになり、あなた単独でライセンスを変更できなくなります。将来の商用化を残すなら、最初から CLA(貢献者ライセンス同意書)を置いてください。後から遡って集めるのは、ほぼ不可能です。
無料/有料の線引き案
| 無料(AGPL) | 有料 | |
|---|---|---|
| 装置操作・計測・解析・CSV | ○ | ○ |
| 同時接続する装置の数 | 1台 | 無制限 |
| 長時間の連続ロギング・自動再接続 | − | ○ |
| 閾値アラート・異常通知 | − | ○ |
| 校正記録・監査ログ(トレーサビリティ) | − | ○ |
| サポート・SLA | − | ○ |
企業が金を払うのは機能ではなく、「止まったときに誰かに電話できる権利」と「監査に出せる記録」 です。個人が欲しがるのは上段だけなので、この線引きなら両者は競合しません。
回路・装置を含める場合の警告 (依然 有効)
公開する前に特許出願の要否を判断してください。 ソフトと違い、ハードウェアは公開した瞬間に新規性が失われ、特許が取れなくなります。日本には新規性喪失の例外(特許法30条、公開から1年以内の出願)がありますが、国によって扱いが異なり、海外出願で詰むことがあります。
これは一方通行のドアです。ユーザーが0人でも損失は確定します。
本 project の scope: benchtop-mcp = 純 software (Python + pyserial via generic protocol) = 特許性事実上ゼロ (シリアル通信 + 統計 + CSV export は 数十年 well-known)。 ハードウェア回路 (Arduino sketch 例は README 参照用のみで 本 repo に含まず) は 依然 上記警告対象。
次にやるとよいこと
--selftestを通す(最優先。ここが通れば土台は正しい)- Claude Desktop に登録して、実際に日本語で呼んでみる
- 手持ちの装置1台を繋いで、
send_commandで*IDN?に応答が返るか確認 - 自分が毎回手でやっている面倒な作業を1つ、ツールとして足す — ここからが本当のオリジナルです
- ライセンスを決めて GitHub に公開
Elasticsearch は奥さんのレシピアプリから始まりました。最初から立派である必要はありません。