A serial monitor and real-time plotter for fast serial links (tested at 12 Mbaud), with a built-in MCP server so an AI agent such as Claude Code can read and write the same serial session you are watching.
When I debug embedded boards I want four things from one window: a monitor that keeps up with a fast UART without dropping bytes, a plotter that shows numbers and states on one time axis, a capture that survives the board resetting, and — lately — a way to let an AI agent look at the same log and type into the same port while I watch. I could not find one tool that did all of that, so I built this one. It is a Tauri/Rust rewrite of an earlier C# version.
- Lossless receive at high line rates: data is kept in fixed-size chunks and spilled to disk, so long captures do not grow memory without bound
- Hex / ASCII views with virtual scrolling, timestamps, line wrap and visible control characters
- Regex search and filter over the whole capture
- Send text or hex, with a selectable line ending (none / CR / LF / CRLF) and input history
- Any baud rate the driver accepts (including non-standard ones), DTR / RTS control, hardware or software flow control
- Auto Reconnect: when the board resets or is unplugged and comes back on the same port, the app reopens it and keeps adding to the same capture, so the output from before the reset is not lost
- Save the capture as a binary file, or copy it as hex or ASCII
-
Oscilloscope-style roll mode with a fixed window (1 s – 300 s). Downsampling is aligned to absolute time, so history does not shift as new data arrives
-
Peak downsampling (default) draws the minimum and maximum of every pixel column at the times they occurred, like an oscilloscope's peak detect: a single-sample spike keeps its real height in any window. Average draws the mean with a min/max band
-
State timeline: non-numeric values such as
motor:ONare drawn as colored bars on the same time axis as the numeric channels -
LIVE / Inspect / Paused: zooming switches to Inspect, you can pan back through history, and LIVE resumes following
-
Arduino-style input — no configuration needed:
25.5,60,RUNNING # CSV (channels are named ch0, ch1, ...) temp:25.5,humidity:60,state:RUNNING # label:value pairs temp,humidity,state # an optional header row names the CSV columns
- A serial port can only be opened by one program at a time, so the app shares the port it already has open with the agent instead of making them compete for it
- One-call request/response:
serial_send("AT+GMR", expect="OK|ERROR")sends and waits for the reply, and cannot miss a reply that arrives immediately - Summaries that stay small:
serial_digest/serial_watchanswer from an index, so the reply is the same size whether the device sent 4 KB or 4 GB - Every byte the agent sends is shown in the main window
- Off by default, and listens on
127.0.0.1only
Installers are attached to each release on the
Releases page. The Tauri/Rust version
starts with the 0.1.0 beta (marked "Pre-release"); tags up to v0.0.8 are the old C# version.
Bug reports from the beta are very welcome.
- Download
serial-monitor-essential_<VERSION>_x64-setup.exeand run it. It installs for the current user only, so no administrator rights are needed. - The installer is not code-signed, so SmartScreen may warn about it. Click More info → Run anyway. The release page shows the SHA-256 of each file next to it if you want to verify the download.
If you used the old C# version (0.0.9 or earlier), both versions can be installed side by side and the old one is left untouched. Uninstall it from Settings → Apps to avoid confusion.
# .deb (recommended; apt installs webkit2gtk-4.1 and the other dependencies)
sudo apt install ./serial-monitor-essential_<VERSION>_amd64.deb
# or the AppImage
chmod +x serial-monitor-essential_<VERSION>_amd64.AppImage
./serial-monitor-essential_<VERSION>_amd64.AppImageSerial devices (/dev/ttyUSB*, /dev/ttyACM*) belong to the dialout group. Add yourself once,
then log out and back in:
sudo usermod -aG dialout $USERNot supported. The code compiles on macOS in CI, but nothing is tested there and no binaries are published.
- Pick a port and a baud rate, then click Connect.
- Received data appears under Receive. Switch between Hex and ASCII, or type a regex into the search box.
- Type into Send and press Send (or turn on Send with Enter).
- Click Plotter to open the plotter. Channels are created automatically from the incoming lines.
-
Turn on MCP Server in the settings panel. It listens on
127.0.0.1:57320. -
Register the app as an MCP server in your AI client. The MCP server is built into the app itself, so nothing else needs to be installed. Setup Guide (next to the toggle) shows the exact command for your install path. With Claude Code:
# Windows claude mcp add serial-monitor -- "<path-to>\serial-monitor-essential.exe" --mcp # Linux (.deb) claude mcp add serial-monitor -- /usr/bin/serial-monitor-essential --mcp
Other MCP clients take the same command in their
mcpServersJSON:"command": "<path-to-exe>", "args": ["--mcp"]. -
Ask for what you need:
You : Send AT+GMR to the board and tell me the firmware version. Claude : serial_send("AT+GMR", expect="OK|ERROR") → "AT version:2.1.0.0 ... OK". The firmware version is 2.1.0.0. You : Check the recent log for CRC errors. Claude : serial_find("CRC mismatch") → 3 matches (offsets 12034, 40881, 91002) You : What is this board doing? Claude : serial_digest() → 402,331 lines in 6 shapes, 0 err / 3 warn, one new line "W: rx overflow q=64" first seen at offset 134,110,221
The app has to be running with MCP Server on while the agent works. If it is not, the tools return an error that says so, rather than failing silently.
| Tool | What it does |
|---|---|
serial_status, serial_ports |
Connection state, port list |
serial_digest, serial_watch |
Summary of the whole capture / what changed since last time |
serial_sample, serial_find |
Representative lines, regex search |
serial_read_tail, serial_read_range |
Raw bytes from the end / from any offset |
serial_send, serial_send_hex |
Send text or bytes, optionally waiting for a reply |
serial_wait_for |
Wait for a regex to match new data |
Details, environment variables and the full tool reference: mcp/README.md.
Without MCP: any program can connect to 127.0.0.1:57320 directly and exchange one JSON
object per line. Send {"id":1,"method":"help"} first to get the machine-readable protocol
specification.
Security. While MCP Server is on, any program running on the same computer can connect to the port, read the capture and send to the device. Remote machines cannot connect, and nothing the agent sends is hidden from you. Do not turn it on if you do not trust the other programs on that computer.
| What | Result | Setup |
|---|---|---|
| Receive at line rate | 60 s at 12 Mbaud, 0 bytes lost | FT232H loopback with RTS/CTS flow control, while also sending 64 KiB blocks |
| Plotter memory | Flat after warm-up (about 210 MB) | 60 s of continuous plotting |
| MCP summary size | serial_digest ≈ 250 tokens, serial_watch ≈ 110 tokens |
Independent of how much data has been received |
Without flow control, even a plain USB-serial adapter can drop bytes at these rates, before the data ever reaches the app. How these were measured is described in the V&V plan (Japanese).
Performance tests and the end-to-end UI tests run on Windows only. On Linux the build and unit tests run in CI, plus a smoke test under WSL2. Wayland and HiDPI have not been tested.
Prerequisites: Node.js 20+, stable Rust, and the Tauri prerequisites for your OS.
npm install
npm run tauri dev # run in development mode (set RUST_LOG=debug for verbose logs)
npm run tauri build # build installers into src-tauri/target/release/bundle
# the same checks CI runs
npm run type-check && npm run lint && npm run format:check && npm test
cd src-tauri && cargo fmt -- --check && cargo clippy --all-targets -- -D warnings && cargo testThe design and test documents in docs/ are written in Japanese:
requirements ·
architecture and ADRs ·
traceability ·
V&V plan ·
release strategy ·
AI API design ·
open verification items.
The end-to-end UI test harness (com0com + Windows UI Automation) is in
test_tools/e2e/.
Bug reports and pull requests are welcome. Please open an issue first for larger changes.


