mcpField
J
J-Link MCP

J-Link MCP

ローカル
github.com開発ツール392 日前に更新

J-Link MCP について

J-Link MCPは、ハードウェアプローブでARM Cortex-Mデバイスをデバッグするファームウェア開発者向けのMCPサーバーです。デバイス制御、クラッシュ診断、RTTログ、GDBのワークフローを提供し、J-Link、OpenOCD、Black Magic Probeのバックエンドに対応します。

主な機能

  1. 01メモリとレジスターの読み書き
  2. 02ファームウェア書き込みと実行制御
  3. 03Cortex-M障害のデコード
  4. 04RTTログの読み取りと絞り込み
  5. 05GDBデバッグとサーバー制御
  6. 06CMSIS-SVDによるペリフェラル解析

活用シーン

  1. 01実機上のファームウェアクラッシュ診断
  2. 02名前付きペリフェラルレジスターの確認
  3. 03ファームウェア書き込みとステップ実行
  4. 04レベルやパターンによるデバイスログ検索

MCP 対応

デバイス設定、アクセス、クラッシュ診断、RTT、GDB操作などの組み込みデバッグツールをMCPクライアントに公開します。MCPプロンプトも4つ同梱しています。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"klievan-jlink": {
"command": "npx",
"args": [
"-y",
"jlink-mcp"
],
"env": {
"JLINK_DEVICE": "<JLINK_DEVICE>",
"JLINK_SERIAL": "<JLINK_SERIAL>",
"SVD_PATH": "<SVD_PATH>",
"JLINK_RTT_ADDR": "<JLINK_RTT_ADDR>"
}
}
}
}
起動コマンドnpx -y jlink-mcp
設定が必要な環境変数
JLINK_DEVICETarget device name, exactly as J-Link spells it (e.g. nRF52840_XXAA, STM32F407VG). Use the search_devices tool to find it.
JLINK_SERIALSerial number of a specific probe, when more than one is attached.
SVD_PATHCMSIS-SVD file for the target. Without it, peripheral reads are undecoded hex.
JLINK_RTT_ADDRAddress of the firmware's _SEGGER_RTT symbol. Lets RTT survive a reset or flash.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmjlink-mcp0.8.0

ツール

43

掲載時のツール一覧 · 2 日前に更新

このツールにパラメーターはありません。

詳細

jlink-mcp のロゴ

jlink-mcp

AI にシリコンへ触れる手を与えましょう。
SEGGER J-Link プローブを通じて、LLM が組み込みデバイスをデバッグできる MCP サーバーです。

MCP サーバー TypeScript J-Link ARM Cortex-M

GitHub のスター数 ライセンス npm npm のダウンロード数 VS Code マーケットプレイス 最新リリース MCP 互換 CI ハードウェアでテスト済み


動作を見る

ターミナルセッション:MCP サーバーがプローブを検出し、ファームウェアを書き込み、デバッグセッションを開始して、RTT ログをストリーミングし、フォルトを発生させて、結果の HardFault をデコードし、フォルトを起こした命令を特定します。

実際の nRF52840-DK に対する、実際の MCP ツール呼び出しです。自分で再現するには、npm run demo を実行してください。

ファームウェアがクラッシュしました。ツールを 1 回呼び出すだけです。

> diagnose_crash

## Crash Diagnosis

### CPU State
Core: PC=0x000000B8 SP=0x2003FFA8 R0=0x0000000A R1=0x000007FF R2=0x00000001 ...
Status: XPSR=0x21000003 CONTROL=0x00000000 PRIMASK=0x00000000 ...
Stack: MSP=0x2003FFA8 PSP=0x00000000

⚠ CPU is in exception handler (IPSR=0x00000003)

### Fault Registers
CFSR=0x01000000 HFSR=0x40000000 DFSR=0x00000000 MMFAR=0xe000edf8 BFAR=0xe000edf8

### Decoded Faults
## UsageFault (UFSR):
  - UNALIGNED: Unaligned memory access
## HardFault (HFSR):
  - FORCED: Forced HardFault (escalated from configurable fault)

### Exception Stack Frame
  R0    = 0x0000000A     R1  = 0x000007FF
  R12   = 0x00000000     LR  = 0x000001F5
  PC    = 0x00000254     xPSR = 0x21000000

→ Faulting instruction at PC=0x00000254

### Recent Errors/Warnings from RTT
  [WRN] sensor_drv: sample out of range, clamping seq=2

フォルトをデコードし、例外フレームを巻き戻して、フォルトを起こした命令を特定し、デバイス自身のログと照合します。CFSR のビット 24 の意味を調べるために、人がデータシートを読む必要はありません。すべて 1 回の呼び出しで完了します。

シリコンのことも把握しています

ターゲットの CMSIS-SVD ファイルを指定すると、周辺機器のレジスターが単なる 16 進数ではなくなります。

> read_peripheral FICR

FICR @ 0x10000000
INFO.PART @ 0x10000100 = 0x00052840  (read-only)
  [31:0]    PART             0x52840 → N52840
INFO.RAM @ 0x1000010C = 0x00000100  (read-only)
  [31:0]    RAM              0x100 → K256
INFO.FLASH @ 0x10000110 = 0x00000400  (read-only)
  [31:0]    FLASH            0x400 → K1024

0x400 は 1024 KB のフラッシュを意味しますが、それを知っている場合に限ります。ビット配置を LLM が推測することは、まさにこのツールが防ぐ失敗です。アドレスはベンダー自身の記述から取得し、意味はその列挙値から取得します。

どちらの実行例も、このプロジェクトのハードウェアテストスイートで nRF52840-DK を使って得られた出力そのままです。

これは何ですか?

jlink-mcp は、Model Context Protocol を使用して、SEGGER J-Link デバッグプローブ経由で AI アシスタント(Claude、Copilot など)を組み込みハードウェアに接続します。

J-Link コマンドを手動で入力する代わりに、AI アシスタントは次の操作を行えます。

  • レジスターとメモリーを読み取ることで、デバイスの状態を把握します
  • ファームウェアを書き込み、デバイスをリセットします
  • RTT ログをストリーミングし、レベル/モジュール/正規表現で検索します
  • ARM Cortex-M のフォルトレジスターを自動デコードして、クラッシュを診断します
  • 実行を制御します — 停止、ステップ実行、再開、ブレークポイント
  • GDB サーバーを起動して、完全なデバッグセッションを行います

OpenOCD(ST-Link、CMSIS-DAP、FTDI)および Black Magic Probe バックエンドにも対応しています。

インストール

SEGGER J-Link ソフトウェアが必要です — このサーバーが操作するソフトウェアです — ARM Cortex-M ターゲットに接続されたプローブと、Node 18 以降も必要です。他のバックエンドの場合は、代わりに OpenOCD または arm-none-eabi-gdb が必要です。

Claude Code — プラグインマーケットプレイスからインストールします。サーバーとともに embedded-debugging スキルも導入されるため、アシスタントがハードウェアについて推測するのを防げます。

/plugin marketplace add Klievan/jlink-mcp
/plugin install jlink-mcp

その他のエージェント — このリポジトリーを指定して、セットアップを依頼してください。

https://github.com/Klievan/jlink-mcp にある MCP サーバーをインストールし、私のボード用に設定してください。

必要なものはこのリポジトリー内で見つかります。手動で設定する場合は、サーバーは npm で提供されており、ビルド手順は不要です。ターゲットに JLINK_DEVICE を設定して、npx -y jlink-mcp を実行します。mcp-config.json は、そのまま貼り付けて使える設定ファイルです。

VS Code — 拡張機能をインストールします。Copilot Chat、Claude、および MCP 対応クライアント用にサーバーが登録されるため、設定は不要です。

Nix / NixOS — インストールせずに、flake から直接実行します。

# Run standalone MCP server
nix run github:Klievan/jlink-mcp

# Or in an MCP client configuration (e.g. Claude Desktop / Claude Code)
# "command": "nix", "args": ["run", "github:Klievan/jlink-mcp", "--"]

または、システム設定または flake に jlink-mcp と jlink-mcp-skills を追加します。

# flake.nix inputs
inputs.jlink-mcp.url = "github:Klievan/jlink-mcp";

# In your packages:
inputs.jlink-mcp.packages.''${system}.jlink-mcp
inputs.jlink-mcp.packages.''${system}.jlink-mcp-skills

NixOS ユーザーへの注意: 使用するプローブツール(segger-jlink/segger-jlink-headless、openocd、または gdb)を environment.systemPackages または devShell に追加してください。segger-jlink を使用するには、プローブの USB 権限を設定するために nixpkgs.config.allowUnfree = true; と services.udev.packages = [ pkgs.segger-jlink ]; が必要です。

次に、動作を確認します

check_setup を実行するよう依頼してください。1 回の呼び出しで、不足しているものと必要な対応を確認できます。

Not ready to debug yet.

OK    probe software — J-Link software found at /Applications/SEGGER/JLink
BLOCK probe — none detected (Connecting to J-Link via USB...FAILED). Check the USB cable.
BLOCK target device — not set. Find the exact name with search_devices, then set_device.
note  SVD — not loaded, so peripheral reads stay raw hex. Set SVD_PATH to a CMSIS-SVD file.

事前にデバイスの正確な型番を把握しておく必要はありません。search_devices は、J-Link がサポートする 9800 種類すべてを対象に、型番、メーカー、またはコアで検索します。

ツール(48)

ワークフローツール(まずはこちらから)
ツール説明
start_debug_session1 回の呼び出しでセットアップ。 GDB サーバーを起動し、RTT に接続して、起動ログを返します。
snapshotレジスター、フォルト状態、スタックダンプ、RTT 出力など、デバイスの全状態をキャプチャします。
diagnose_crashARM Cortex-M のフォルトレジスター(CFSR、HFSR、MMFAR、BFAR)を例外スタックフレームとともに自動で読み取り、デコードします。
デバイスのセットアップ
ツール説明
list_devices接続されているプローブをスキャンし、設定済みのターゲットを表示します
set_device再起動せずに、実行時にターゲットデバイスを変更します
set_serial_number実行時にプローブのシリアル番号を変更します(複数プローブ構成向け)
get_config現在のプローブ、ターゲットデバイス、GDB サーバーの状態を表示します
デバイスの制御
ツール説明
device_infoプローブの種類、ターゲット CPU、レジスターの概要
haltCPU を停止します
resumeCPU を再開します
resetデバイスをリセットします。halt を指定するとリセットベクターで停止します。strategy では J-Link のリセット方式を選択できます。省略すると J-Link が選択します
step1 命令をステップ実行します
周辺機器(CMSIS-SVD)

jlinkMcp.svdPath にターゲットの SVD を設定します。これは、Cortex-Debug の svdFile に指定するものと同じファイルです。各ベンダーがパーツごとに公開しています。

ツール説明
list_peripheralsチップ上のすべての周辺機器とベースアドレス
read_peripheral周辺機器のレジスターを読み取り、それぞれのビットフィールドを名前でデコードします
decode_register1 つのレジスターをデコードします。デバイスから読み取るか、すでに取得した値を解釈します
メモリとレジスター
ツール説明
read_memoryアドレスのメモリを読み取ります(見やすい 16 進ダンプを出力)
write_memoryアドレスに 32 ビット値を書き込みます
read_registersすべての CPU レジスターをコンパクトな形式で表示します
read_register指定したレジスターを読み取ります(PC、SP、R0-R12 など)
フラッシュ
ツール説明
flash.hex/.bin/.elf ファームウェアをデバイスに書き込みます
eraseフラッシュ全体を消去します
ブレークポイント
ツール説明
set_breakpointアドレスにハードウェアブレークポイントを設定します
clear_breakpointsすべてのブレークポイントを消去します
GDB サーバー
ツール説明
gdb_server_startプローブの GDB サーバーを起動します
gdb_server_stopGDB サーバーを停止し、RTT を切断します
gdb_server_statusGDB サーバー、RTT、プロキシの状態を表示します
ソースレベルデバッグ

シンボルを認識できる作業(バックトレース、変数の確認、命令単位ではなくソース行単位のステップ実行)を行うには、実際の GDB クライアントを接続します。

ツール説明
gdb_connectGDB クライアントを接続します(サーバーを自動起動します。シンボル用の ELF は任意です)
gdb_loadデバッグシンボル用に ELF を読み込みます。必要に応じて同時にフラッシュにも書き込めます
gdb_backtraceコールスタックを表示します。各フレームのローカル変数も任意で表示できます
gdb_command任意の GDB コマンドを実行します。例:print sensor_state、info threads、break main
gdb_waitターゲットが停止するまで待機します(continue またはブレークポイントの後)
gdb_disconnectクライアントを切断し、ブレークポイントとデバッグ用ハードウェアをクリアします
RTT(リアルタイム転送)
ツール説明
rtt_connectRTT の Telnet ポートに接続します
rtt_disconnectRTT を切断します
rtt_read最近のログ行を読み取ります(ANSI を除去し、Zephyr 形式を解析します)
rtt_searchレベル(err/wrn/inf/dbg)、モジュール、または正規表現でログをフィルタリングします
rtt_sendRTT ダウンチャネル経由でデバイスにデータを送信します
rtt_clearRTT バッファーをクリアします
Telnet プロキシ(Trice / Pigweed)
ツール説明
telnet_proxy_start外部デトークナイザー用に RTT を分岐する TCP プロキシを起動します
telnet_proxy_stopプロキシを停止します
telnet_proxy_statusプロキシの接続状態を表示します
telnet_proxy_readプロキシの生バッファーを読み取ります
詳細
ツール説明
probe_commandプローブの生コマンドを実行します
get_config現在のプローブとサーバーの設定を表示します

ステータスバーでプローブを使用している人がわかります

J-Link は一度に 1 つのクライアントしか処理できないため、GDB サーバーを起動したままにすると、それ以外のすべてがブロックされます。よくあるのは、アシスタントが MCP 経由でサーバーを起動し、誰も気づかないケースです。拡張機能は、自分が行った操作を記憶するだけではそれを検出できません。MCP サーバーは別のプロセスで動作するため、LLM が起動したサーバーは拡張機能から見えないのです。

そこで、誰が起動したかにかかわらず確実な方法として、GDB ポートを監視します。何かがリッスンしていると、ステータスバーがアンバー色になり、J-Link · MCP · 47m と表示されます。起動したのは誰か、そして何分前かがわかります。この 2 つの情報によって、「何かがプローブを使用中」から「アシスタントが昼食前から使い続けている」ことまでわかります。クリックすると、停止するかどうかを選べます。

ツールチップには、デバイス、ポート、RTT が起動しているかどうか、そしてなぜ重要なのかが表示されます。また、監視していない稼働時間を表示することもありません。ウィンドウを開いた時点ですでに起動していたサーバーは、稼働時間ではなく、その時間だけ 認識済み と報告されます。

J-Link GDB サーバーだと特定できないプロセスは停止しません。ポートがリッスン中であることから何かが存在するとはわかりますが、それがこのサーバーのものだとは限りません。

スキル

ツールは、モデルに「何ができるか」を伝えます。しかし、何をすべきかまでは伝えません。その結果、次の 2 つの問題が絶えず起こります。モデルが ELF の読み込みを思いつかないため、バックトレースがアドレスだけになること。そして、ハードウェアに何が起きているべきかを推論し、確認するための呼び出しを 1 回することを怠ることです。

skills/embedded-debugging/SKILL.md は、この両方を網羅する Claude Code スキルです。すべてを変える 2 つのファイル(名前を解決する ELF と、意味を示す SVD)、停止/読み取り/再開のルール、クラッシュ、ハング、周辺機器、応答しないデバイスのワークフロー、そして各仮説と、それを実際に検証するツール呼び出しを組み合わせた表が含まれています。

このリポジトリをプラグインとしてインストールすると(.claude-plugin/plugin.json)、Claude Code がスキルを読み込みます。または、ファームウェアプロジェクトの .claude/skills/ にディレクトリをコピーすることもできます。MCP 自体にはスキルの概念はありません。移植可能な同等のものはプロンプトであり、このサーバーには 4 つ用意されています。

スキルの記述内容はテストで検証されています。test/hil/s04-symbols.test.ts では、実際のシリコン上で、シンボルなしのバックトレースには関数名がなく、ELF を読み込むと関数名が表示されること、そしてシンボルのみの読み込みではデバイスを再プログラムしないことを確認します。

マルチプローブ対応

jlink-mcp は、共通の ProbeBackend 抽象化を通じて、複数のデバッグプローブバックエンドをサポートします。

バックエンドプローブハードウェア状態RTT サポート
J-LinkSEGGER J-Link、J-Link OB、J-Link EDU本番対応あり
OpenOCDST-Link、CMSIS-DAP、FTDI、J-Link(OpenOCD 経由)ベータなし
Black Magic ProbeBMP(シリアル接続の組み込み GDB サーバー)ベータなし
probe-rsprobe-rs がサポートするすべてのプローブ対応予定対応予定
バックエンドの選択
# J-Link (default)
PROBE_TYPE=jlink JLINK_DEVICE=nRF52840_XXAA node out/mcp/standalone.js

# OpenOCD with ST-Link
PROBE_TYPE=openocd \
  OPENOCD_INTERFACE=interface/stlink.cfg \
  OPENOCD_TARGET=target/stm32f4x.cfg \
  node out/mcp/standalone.js

# Black Magic Probe
PROBE_TYPE=blackmagic \
  BMP_SERIAL_PORT=/dev/ttyACM0 \
  node out/mcp/standalone.js

アーキテクチャ

┌─────────────────────────────────────────────────────┐
│                    MCP Client                        │
│          (Claude, Copilot, any MCP client)           │
└──────────────────────┬──────────────────────────────┘
                       │ JSON-RPC over stdio
┌──────────────────────▼──────────────────────────────┐
│                  jlink-mcp                           │
│                                                      │
│  ┌──────────┐  ┌──────────┐  ┌───────────────────┐  │
│  │ 31 Tools │  │4 Resources│  │    4 Prompts      │  │
│  └────┬─────┘  └────┬─────┘  └───────┬───────────┘  │
│       │              │                │              │
│  ┌────▼──────────────▼────────────────▼───────────┐  │
│  │              ProbeBackend                       │  │
│  │  ┌─────────┐ ┌─────────┐ ┌──────────────────┐  │  │
│  │  │ J-Link  │ │ OpenOCD │ │ Black Magic Probe│  │  │
│  │  └────┬────┘ └────┬────┘ └────────┬─────────┘  │  │
│  └───────┼───────────┼───────────────┼─────────────┘  │
│          │           │               │              │
│  ┌───────▼───┐ ┌─────▼────┐ ┌───────▼──────────┐  │
│  │ RTTClient │ │TelnetProxy│ │  ProcessManager  │  │
│  └───────────┘ └──────────┘ └──────────────────┘  │
└─────────────────────────────────────────────────────┘
                       │
          ┌────────────▼────────────┐
          │    Debug Probe (USB)    │
          │  → Target MCU (SWD/JTAG)│
          └─────────────────────────┘
ソースの構成
src/
├── probe/
│   ├── backend.ts      # ProbeBackend abstract class + shared utilities
│   ├── jlink.ts        # SEGGER J-Link implementation
│   ├── openocd.ts      # OpenOCD implementation
│   ├── blackmagic.ts   # Black Magic Probe implementation
│   └── factory.ts      # Probe creation from config
├── mcp/
│   ├── server.ts       # MCP server (45 tools, 4 resources, 4 prompts)
│   └── standalone.ts   # Standalone entry (stdio transport)
├── rtt/
│   └── rtt-client.ts   # RTT client with ANSI stripping + Zephyr log parsing
├── telnet/
│   └── telnet-proxy.ts # TCP proxy for Trice/Pigweed detokenizer
├── utils/
│   ├── config.ts       # VSCode settings / env var config
│   ├── logger.ts       # Logging
│   └── process-manager.ts # Child process lifecycle
└── extension.ts        # VSCode extension + MCP provider registration

設計上の決定(LLM 向けに最適化)

このサーバーは、AI に実際のハードウェアで使用させ、そこで生じた摩擦をすべて解消しながら構築されました。

read_registers で得られるもの

halt; regs に対する JLinkExe の生出力は 77 行で、そのうち情報を含むのは約 6 行です。ここにあるトークンはすべてコンテキストを消費し、レジスタ値は出力の中央に埋もれています。

SEGGER J-Link Commander V9.70 (Compiled Aug 19 2026 12:16:13)
DLL version V9.70, compiled Aug 19 2026 12:15:25
Connecting to J-Link ...O.K.
Firmware: J-Link OB-nRF5340-NordicSemi compiled Jun 11 2026 13:12:28
Hardware version: V1.00
J-Link uptime (since boot): 0d 00h 34m 29s
S/N: 1050298247
License(s): RDI, FlashBP, FlashDL, JFlash, GDB
...30 more lines of connect banner...
PC = 00000044, CycleCnt = 00EB67E5
R0 = 20000000, R1 = 9D56C547, R2 = 00000000, R3 = 00000000
...
FPS0 = 00000000, FPS1 = 00000000, FPS2 = 00000000, FPS3 = 00000000
...28 more lines of zeroed FP registers...
実際に得られるもの

3 行です。 求める内容ごとにまとめた、同じ情報です:

Core: PC=0x00000046 SP=0x20010000 R0=0x20000000 R1=0x01D43416 R2=0x00000000 ...
Status: XPSR=0x01000000 CONTROL=0x00000000 PRIMASK=0x00000000 BASEPRI=0x00000000
Stack: MSP=0x20010000 PSP=0x00000000

どちらも同じボードから取得したものです。設計の残りも同じルールに従います ――求められたものだけを返し、それ以外は返しません:

  • 出力の解析では接続バナーを取り除きます。データだけが返されます。
  • レジスタはコンパクトにまとめられ、グループ化されます(コア/ステータス/スタック)。
  • FP レジスタはゼロ以外の場合のみ表示されます(通常はすべてゼロです)。
  • RTT 出力は ANSI エスケープコードを取り除き、Zephyr のログ形式を解析して構造化フィールドに変換します。
  • 複合ツール(start_debug_session、snapshot、diagnose_crash)は、複数ステップのワークフローを単一の呼び出しに置き換えます。
  • フォールトのデコードは自動で行われます。CFSR/HFSR/MMFAR/BFAR を読み取り、各ビットの意味を説明します。
  • **rtt_search**を使うと、ログ全体を読まずにエラーを検索できます。
  • ペリフェラルレジスタはベンダー独自の CMSIS-SVD を使ってデコードされるため、モデルはそのレジスタのそのフィールドで 0x100 が何を意味するか推測せず、RAM = K256 と読み取れます。
  • 失敗時には対処方法が示されます。「ターゲットが実行中です。halt を使用してください」は「メモリを読み取れませんでした」よりも役立ちます。また、実行されなかったフォールトレジスタの読み取りは、ゼロを「フォールトは検出されませんでした」とデコードするのではなく、読み取りが行われなかったことを報告します。

実機で検証済み

LLM とデバッグプローブの間で起こり得る問題の多くは、静かに失敗します。ツールが空のペイロードで成功を返したり、パーサーが行の半分を落としたり、セッションが終了した後、次のコマンドがもっともらしい別の結果を返したりします。こうした問題はコードを読むだけでは見つからず、「呼び出しでエラーが発生しなかった」ことを確認するテストスイートでは、どれも検出できません。

そこでこのプロジェクトでは、セルフホストランナー上で実際の nRF52840-DK に対して 58 件のテストを実行するハードウェアテスト層を設けています。クライアントと同じように、stdio 経由で実際の MCP サーバーを操作します。プローブの検出、フラッシュ書き込みと検証、稼働中の GDB セッションでの停止/ステップ実行/再開、メモリとペリフェラルの読み取り、RTT のストリーミングとフィルタリング、オンデマンドで注入したフォールトを使ったクラッシュ診断を網羅しています。

このテスト層は、成功として扱われたままリリースされていたバグも検出してきました。たとえば、次のようなものです。

  • 実際にクラッシュしているときに、diagnose_crash が**「フォールトは検出されませんでした」と報告**していました。メモリダンプのパーサーが各行の半分を捨てていました
  • サーバーが正常と報告している一方で、GDB 経由のすべてのツールが空の出力を返していました
  • セッション終了後に、ターゲットが起動できない状態になっていました。ブレークポイントコンパレーターが有効なまま残り、どのリセットでも解除されませんでした
  • reset は成功を報告しながら、実際には何もしていませんでした。GDB サーバーは同期型リモートであり、ターゲットの実行中はコマンドを拒否します。そのためリセットシーケンスの各コマンドが順番にすべて拒否され、失敗は破棄されていました
  • 同じ理由で、デバッグハードウェアを解除するセッション終了処理が完全に拒否されていたにもかかわらず、「デバッグハードウェアを解除しました」と報告していました。上記の修正によって、これも検出できるようになりました
  • GDB サーバーがすでに終了していたのに、実行中と報告されていました。起動処理がプロセスの生成時点で戻り、プローブを確保できたか確認していませんでした
  • リセットまたはフラッシュ書き込み後にRTT が無音になっていました。ターゲットはログを出し続けていたものの、プローブが収集を停止しており、デバイスが静かになったように見えていました。両側からコントロールブロックを読み取り、ファームウェアが 490 バイトを書き込んでいる一方で、収集されたデータがないことを確認して検出しました
  • 代入が黙って破棄され、その後のセッション中ずっと RTT が停止していました。代入を制御するフラグは、GDB サーバーが実行中かどうかを確認するべきところで、状態列挙値が GDB_RUNNING かどうかを確認していました

これらはすべて成功を報告していました。これがハードウェアテスト層を設ける理由であり、呼び出しがエラーなく終了したかではなく、解析された内容を検証する理由です。エラーの有無だけを確認するテストスイートでは、どれも検出できなかったでしょう。

これらの実行中に取得したプローブの生出力は、ゴールデントランスクリプトとしてコミットされています。そのため、高速なユニットテスト層では、どのマシンでもプローブなしで実機のバイト列を数秒で再生し、形式のリグレッションを検出できます。

npm test          # ~257 tests, seconds, no hardware
npm run test:hil  # hardware tier; needs HIL=1 and a probe

環境変数

J-Link
変数デフォルト説明
PROBE_TYPEjlinkプローブバックエンド:jlink、openocd、blackmagic
JLINK_DEVICEUnspecifiedターゲットデバイス(例:nRF52840_XXAA、STM32F407VG)
JLINK_INSTALL_DIR自動検出SEGGER J-Link のインストール先パス
JLINK_INTERFACESWDデバッグインターフェース:SWD または JTAG
JLINK_SPEED4000接続速度(kHz)
JLINK_SERIALJ-Link のシリアル番号(複数のプローブを使用する場合)
JLINK_GDB_PORT2331GDB サーバーのポート
JLINK_RTT_PORT19021RTT Telnet ポート
JLINK_RTT_ADDR自動RTT 制御ブロック(_SEGGER_RTT シンボル)のアドレス。J-Link は RAM をスキャンしてこのアドレスを検出しますが、検出したアドレスは返しません。アドレスを指定することで、ターゲットのリセット後も RTT を維持できます
OpenOCD
変数デフォルト説明
OPENOCD_BINARYopenocdopenocd バイナリのパス
OPENOCD_INTERFACEinterface/stlink.cfgインターフェース設定ファイル
OPENOCD_TARGETtarget/stm32f4x.cfgターゲット設定ファイル
OPENOCD_GDB_PORT3333GDB サーバーのポート
OPENOCD_TELNET_PORT4444Telnet コマンドポート
Black Magic Probe
変数デフォルト説明
BMP_GDB_PATHarm-none-eabi-gdbGDB バイナリのパス
BMP_SERIAL_PORT/dev/ttyACM0BMP シリアルポート
BMP_TARGET_INDEX1スキャン後のターゲットインデックス

コントリビューション

新しいプローブバックエンドを追加する手順:

  1. ProbeBackend を実装する src/probe/yourprobe.ts を作成します
  2. src/probe/factory.ts に case を追加します
  3. これで完了です。31 個すべての MCP ツールが自動的に動作します

ライセンス

MIT - LICENSE を参照してください


The Sprk Factory が開発しました

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。