Atlas / MCP servers / sbrunner-atx / wsjtx-mcp

wsjtx-mcpSAFE

mcp/sbrunner-atx/wsjtx-mcp

Operate WSJT-X (FT8/FT4/WSPR) from MCP clients over its UDP message protocol.

Verdict
SAFE
Grade
B
Trust score
89 /100
Exposed tools
14 7r · 5w · 2d
Transport
stdio
License
MIT
Stars
0
01

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

Read from source at commit 2269602f2512OBSERVED · 2026-10-12
02

Connect

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-code (pypi)
claude mcp add wsjtx-mcp -- None wsjtx-mcp==0.1.3
03

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.

ToolRiskDescription
annotatewriteSet a Fox/Hound sort-order annotation for a DX call (no transmit).
cleardestructiveClear a WSJT-X decode window (no transmit).
configurewriteSet operating parameters via a ``Configure`` message (no transmit).
decodesreadThe RX data plane: buffered ``Decode`` / ``WSPRDecode`` lines.
diagnosticsreadHost + network + listener diagnostics for troubleshooting connectivity.
free_textwriteSet the free-text (Tx5) message; with ``send=true`` **initiates TX** (gated).
highlightdestructiveColour (or clear) a callsign in the Band Activity panel (no transmit).
locationreadOverride the session Maidenhead grid (4- or 6-character). No transmit.
logreadRead buffered completed QSOs (``QSOLogged`` paired with ``LoggedADIF``).
replyreadAnswer a buffered decode — **initiates a transmission** (gated by callsign).
statusreadLatest WSJT-X state snapshot plus listener/connection health.
switch_configreadSwitch WSJT-X to a named configuration (which must already exist). No transmit.
transmitwriteStop transmitting. (WSJT-X
wsjtx_callwriteEscape hatch: build and send any WSJT-X message type by name.
04

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.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (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)

MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
clear, highlight
Why it matters. 2 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.mcpbignore
.mcpbignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
tests/test_golden.py:26
msg = protocol.parse(base64.b64decode(HEARTBEAT_B64))
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
tests/test_golden.py:36
msg = protocol.parse(base64.b64decode(STATUS_B64))
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
tests/test_golden.py:58
msg = protocol.parse(base64.b64decode(HEARTBEAT_B64))

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha 2269602f2512full audit observations/trust-audit/mcp-server/sbrunner-atx__wsjtx-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-122269602f2512SAFEB89first audit
06

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.

Advertisement