逻辑分析器mcp
用于固件调试、逆向工程和CI/CD硬件验证的逻辑分析工具和MCP服务器。内置Go,具有DSLogic第一硬件抽象层。
它做什么
- 捕捉 来自逻辑分析仪的数字信号(DSLogic,或用于测试的模拟/重放)
- 解码 协议:UART、SPI、I2C、CAN、1-Wire(原生Go),通过嵌入式goja引擎使用用户定义的JS解码器
- 分析 定时、检测异常、比较捕获、搜索解码帧
- 触发 关于边缘、模式、超时和复合条件
- 断言 CI/CD流水线中的信号正确性(
logicanalyzer assert) - 交互式调试 通过MCP——让LLM驱动逻辑分析仪跟踪固件问题
- 可视化 基于浏览器的查看器中的波形、协议解码和异常
安装
源代码(纯Go,无需硬件)
git clone --recurse-submodules https://github.com/DatanoiseTV/logicanalyzer-mcp.git
cd logicanalyzer-mcp
make build这将生成一个二进制文件:
- 模拟和回放设备(无需硬件)
- 5个本地Go解码器(UART、SPI、I2C、CAN、1-Wire)
- 用于自定义协议的JavaScript解码器运行时(goja)
- 完整的CLI、MCP服务器、web查看器、会话管理
支持DSLogic硬件
make build-full 从包含的git子模块自动编译libsigrok4DSL:
# Install system dependencies (one time)
make install-deps # macOS: brew install cmake pkg-config glib libusb libzip
# Full build (auto-compiles C deps from submodules)
make build-full在Linux上:
sudo apt-get install -y cmake pkg-config libglib2.0-dev libusb-1.0-0-dev libzip-dev
make build-full使用克劳德代码(MCP服务器)
通过CLI
claude mcp add logicanalyzer -- /path/to/logicanalyzer mcp或者,如果已安装到PATH中:
claude mcp add logicanalyzer -- logicanalyzer mcp通过配置文件
添加 ~/.claude/settings.json 或项目级别 .claude/settings.json:
{
"mcpServers": {
"logicanalyzer": {
"command": "/path/to/logicanalyzer",
"args": ["mcp"]
}
}
}MCP工具
MCP服务器公开了18个工具,并提供了详细的LLM友好描述。LLM可以驱动完整的调试会话:
| 类别 | 工具 |
|---|---|
| 发现 | device_list, device_configure, channel_survey |
| 捕获 | capture_start, capture_status, capture_stop, capture_get |
| 分析 | decode, analyze_timing, analyze_anomalies, compare_captures, search_frames |
| 会议 | session_list, session_get, session_annotate, capture_replay |
| 解码器 | decoder_list, decoder_info, decoder_install |
| 调试 | investigate (自动调查+检测+捕获+解码+报告) |
LLM工作流程示例:
investigate--“电线上有什么?”decode具有自动检测功能——确认SPI,解码帧analyze_anomalies--“第5帧出现CS故障”compare_captures与已知商品相反——“此交易缺失”
命令行用法
# Discovery
logicanalyzer devices # List connected devices
logicanalyzer survey --duration 100ms # Quick channel activity survey
# Capture
logicanalyzer capture \
--channels 0,1,2 --labels CLK,MOSI,CS \
--rate 10MHz --duration 500ms \
--decode spi --channel-map clk=0,mosi=1,cs=2 \
--output capture.json
# Decode
logicanalyzer decode capture.json
logicanalyzer decode capture.json --protocol spi --format json
# CI/CD assertions (exit 0 = pass, 1 = fail, 2 = error)
logicanalyzer assert capture.json \
--no-anomalies \
--frame-count "spi >= 10" \
--field "spi[0].mosi == 0x9F"
# Compare two captures
logicanalyzer diff before.json after.json
# Search decoded frames
logicanalyzer search capture.json "mosi == 0x9F"
# Session management
logicanalyzer session list
logicanalyzer session show
logicanalyzer session tag debug,spi
# Decoders
logicanalyzer decoder list
logicanalyzer decoder info spi
logicanalyzer decoder load custom-protocol.js
# Web viewer
logicanalyzer serve --port 8080
# MCP server (stdio)
logicanalyzer mcp网络观众
从...开始 logicanalyzer serve 并打开 http://localhost:8080.特点:
- 可缩放/可平移波形显示(鼠标滚轮+拖动)
- 带有帧注释的协议解码覆盖
- 异常标记(按严重程度进行颜色编码)
- 自动缩放时间轴
- 会话浏览器侧边栏
- 解码帧表
- 统计面板
去图书馆
import (
"github.com/DatanoiseTV/logicanalyzer-mcp/pkg/analyzer"
"github.com/DatanoiseTV/logicanalyzer-mcp/pkg/hal/mock"
)
// Open a mock device (for testing)
a, _ := analyzer.OpenMock(analyzer.MockConfig{
NumChannels: 3,
Signals: []mock.SignalConfig{
{Channel: 0, Generator: mock.SPISignal(1_000_000, []byte{0x9F}, 0, 0)},
},
})
defer a.Close()
// Or replay from a recorded capture
a, _ := analyzer.OpenReplay("golden-capture.json")
// Capture and decode
result, _ := a.Capture(analyzer.CaptureConfig{
Channels: []analyzer.ChannelConfig{{Index: 0, Label: "CLK"}, {Index: 1, Label: "MOSI"}, {Index: 2, Label: "CS"}},
SampleRate: 10_000_000,
Duration: 100 * time.Millisecond,
})
decoded, _ := result.Decode("spi", analyzer.DecodeOpts{
Channels: map[string]int{"clk": 0, "mosi": 1, "cs": 2},
})
fmt.Println(decoded.Frames[0].Data["mosi"]) // "0x9F"自定义JS解码器
为专有或不常见的协议编写JavaScript解码器:
({
id: "my_sensor",
name: "My Sensor Protocol",
description: "Custom protocol decoder",
requiredChannels: [
{name: "clk", description: "Clock"},
{name: "data", description: "Data"}
],
decode: function(stream) {
var edges = stream.risingEdges("clk");
var frames = [];
var byte_val = 0, bit_count = 0, start = 0;
for (var i = 0; i < edges.length; i++) {
if (bit_count === 0) start = edges[i].timestamp;
byte_val = (byte_val << 1) | stream.sample("data", edges[i].sampleIndex);
bit_count++;
if (bit_count === 8) {
frames.push({
start: start, end: edges[i].timestamp,
data: {value: "0x" + byte_val.toString(16).toUpperCase()},
annotation: "0x" + byte_val.toString(16).toUpperCase()
});
byte_val = 0; bit_count = 0;
}
}
return frames;
},
detectApplicability: function(stream) { return 0; }
})通过CLI加载(logicanalyzer decoder load protocol.js)或MCP(decoder_install 工具)。
建筑
cmd/logicanalyzer/ CLI + MCP server entrypoint
pkg/
analyzer/ Public Go library API
capture/ Capture manager, trigger engine
decoder/ Edge detection, decoder pipeline, auto-detect
native/ Native Go decoders
uart/ UART 8N1
spi/ SPI (CPOL/CPHA)
i2c/ I2C with ACK/NACK tracking
can/ CAN 2.0A with CRC, bit destuffing
onewire/ Dallas 1-Wire (reset, presence, commands)
js/ JavaScript decoder runtime (goja)
analysis/ Timing measurement, anomaly detection, diff, search
session/ File-backed session & capture storage
schema/ JSON schema types (CaptureResult, Frame, Anomaly, ...)
hal/ Hardware abstraction layer
mock/ Mock device with signal generators
replay/ Replay from captured files
dslogic/ DSLogic CGo bridge (libsigrok4DSL)
output/ Output formatters (JSON, table, CSV)
mcp/ MCP server (18 tools)
web/ Embedded web viewer (SPA)
third_party/
DSView/ DreamSourceLab DSView (libsigrok4DSL source)
libsigrokdecode/ sigrok protocol decoders (100+)
build-libsigrok/ CMake wrapper for standalone lib build制定目标
make build Pure Go build (mock/replay, no hardware)
make build-full Full build (auto-compiles libsigrok4DSL from submodule)
make build-mcp MCP-only binary
make install-deps Install system dependencies (brew/apt)
make test Run all tests
make serve Start web viewer on :8080
make mcp Start MCP server on stdio
make check-deps Verify system dependencies
make clean Remove build artifacts许可证
麻省理工学院
