wsjtx-mcpSAFE
Operate WSJT-X (FT8/FT4/WSPR) from MCP clients over its UDP message protocol.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
An MCP server that controls WSJT-X (FT8/FT4/JT65/MSK144/Q65/WSPR...) from MCP clients such as Claude Desktop and the MCP Inspector.
It is the weak-signal leg of an "operate → log" trio for amateur radio:
- [fldigi-mcp](https://github.com/sbrunner-atx/fldigi-mcp) — operate broad
digital modes via fldigi (XML-RPC).
- [n3fjp-mcp](https://github.com/sbrunner-atx/n3fjp-mcp) — log QSOs to
N3FJP (TCP API).
- wsjtx-mcp (this one) — operate the FT8/FT4 weak-signal world via WSJT-X
(UDP message protocol).
⚠️ Experimental (v0.1). Transmit is gated behind your callsign and you keep the operator in command. Read the Transmit safety section.
How it is different
WSJT-X does not offer a request/response API. It broadcasts state over UDP (Status, Decode, QSOLogged, Heartbeat, ...) and honours a small set of inbound control messages. So this server runs a background UDP listener that continuously parses datagrams and keeps the latest status, a buffer of decodes, and completed QSOs — you read those, and nudge WSJT-X with control messages.
Consequences worth knowing up front:
- No dial-frequency control over UDP. You can read the dial frequency from
Status, and set mode/sub-mode/Rx DF/T-R period via configure, but QSY is a rig-control concern (Hamlib/CAT or the UI), not this server.
- You can start and halt Tx, but cannot toggle "Enable Tx". Transmission is
started by answering a CQ (reply) or by free_text with send=true, and stopped by transmit halt. There is no UDP command for the "Enable Tx", "Auto Seq", "Call 1st", or "Hold Tx Freq" checkboxes — those stay UI settings.
- `reply` gives hands-free QSOs only when WSJT-X's "Auto Seq" is on. A
reply
is equivalent to double-clicking a CQ; with Auto Seq enabled (the usual FT8/FT4 default) WSJT-X then sequenc
2269602f2512OBSERVED · 2026-10-12Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.
claude mcp add wsjtx-mcp -- None wsjtx-mcp==0.1.3
Exposed tools (14)
7 read · 5 write · 2 destructive. Blast radius: 2 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
annotate | write | Set a Fox/Hound sort-order annotation for a DX call (no transmit). |
clear | destructive | Clear a WSJT-X decode window (no transmit). |
configure | write | Set operating parameters via a ``Configure`` message (no transmit). |
decodes | read | The RX data plane: buffered ``Decode`` / ``WSPRDecode`` lines. |
diagnostics | read | Host + network + listener diagnostics for troubleshooting connectivity. |
free_text | write | Set the free-text (Tx5) message; with ``send=true`` **initiates TX** (gated). |
highlight | destructive | Colour (or clear) a callsign in the Band Activity panel (no transmit). |
location | read | Override the session Maidenhead grid (4- or 6-character). No transmit. |
log | read | Read buffered completed QSOs (``QSOLogged`` paired with ``LoggedADIF``). |
reply | read | Answer a buffered decode — **initiates a transmission** (gated by callsign). |
status | read | Latest WSJT-X state snapshot plus listener/connection health. |
switch_config | read | Switch WSJT-X to a named configuration (which must already exist). No transmit. |
transmit | write | Stop transmitting. (WSJT-X |
wsjtx_call | write | Escape hatch: build and send any WSJT-X message type by name. |
Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | PASS |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- UNDECLARED (1 observation(s))
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (5)
clear, highlight
.mcpbignore
msg = protocol.parse(base64.b64decode(HEARTBEAT_B64))
msg = protocol.parse(base64.b64decode(STATUS_B64))
msg = protocol.parse(base64.b64decode(HEARTBEAT_B64))
Gates applied: no_behavioural_pass.
2269602f2512full audit observations/trust-audit/mcp-server/sbrunner-atx__wsjtx-mcp.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-12 | 2269602f2512 | SAFE | B | 89 | first audit |
Questions
What is the wsjtx-mcp MCP server?
Operate WSJT-X (FT8/FT4/WSPR) from MCP clients over its UDP message protocol.
What tools does wsjtx-mcp expose?
14 in total: 7 read-only, 5 that write, and 2 that can delete or overwrite (clear, highlight). Every one is listed on this page with its risk.
Is wsjtx-mcp safe to connect to an agent?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B. Separately from the audit: 2 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does wsjtx-mcp need?
No credential environment variables were found in its source, so it appears to need none.
How does wsjtx-mcp run?
It speaks stdio, so it runs as a local process your client starts. It is published on PyPI as wsjtx-mcp.
How current is this page?
The grade is for one exact copy of the source (2269602f2512), read on 2026-10-12. The repository is watched and re-audited when it changes.