io.github.sbrunner-atx/wsjtx-mcp
The wsjtx-mcp server lets you observe and control WSJT-X (FT8/FT4/JT65/MSK144/Q65/WSPR) from MCP clients like Claude Desktop, enabling weak-signal amateur radio operation with transmit safety gated by your callsign.
Observation & Diagnostics
Status — Read the latest WSJT-X snapshot: dial frequency, mode/sub-mode, Tx/Rx state, DE/DX call & grid, current Tx message, and transmit-gate state.
Diagnostics — Troubleshoot connectivity: UDP bind status, datagram counts by message type, discovered WSJT-X instances, and network interfaces.
RX / Decode Plane
Decodes — Access buffered decode lines with
read(fetch recent N),drain(poll new since last call),clear_local(empty buffer), orreplay(ask WSJT-X to re-broadcast Band Activity decodes).
QSO Logging
Log — Read buffered completed QSOs (structured records + ADIF) emitted when WSJT-X logs a contact.
Transmit Control (requires WSJTX_CALLSIGN)
Reply — Answer a buffered CQ/QRZ decode to initiate a transmission; with Auto Seq on, sequences the full QSO automatically.
Free text — Set the Tx5 free-text message; with
send=true, keys the radio.Halt — Stop transmitting immediately or at the end of the current period (always allowed, no callsign gate required).
Operating Parameters & UI Control
Configure — Set mode, sub-mode, Rx DF, T/R period, frequency tolerance, DX call/grid, and message regeneration (dial frequency control is not supported).
Clear — Clear the Band Activity and/or Rx Frequency windows in WSJT-X.
Highlight — Colour or clear callsigns in the Band Activity panel.
Location — Override the session Maidenhead grid (useful for mobile/portable ops).
Switch config — Switch WSJT-X to a named saved configuration.
Annotate — Set a Fox/Hound sort-order annotation for a DX call (DXpedition feature).
Escape Hatch
wsjtx_call— Build and send any WSJT-X UDP message type by name with arbitrary fields (same transmit gate applies).
Limitations: Cannot control dial frequency, toggle UI checkboxes like "Enable Tx" or "Auto Seq" directly, and is optimized for search-and-pounce rather than running continuous CQ cycles.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@io.github.sbrunner-atx/wsjtx-mcpShow me the latest decodes from WSJT-X."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
wsjtx-mcp
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 — operate broad digital modes via fldigi (XML-RPC).
contest-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 viaconfigure, 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 byfree_textwithsend=true, and stopped bytransmit halt. There is no UDP command for the "Enable Tx", "Auto Seq", "Call 1st", or "Hold Tx Freq" checkboxes — those stay UI settings.replygives hands-free QSOs only when WSJT-X's "Auto Seq" is on. Areplyis equivalent to double-clicking a CQ; with Auto Seq enabled (the usual FT8/FT4 default) WSJT-X then sequences the whole exchange toQSOLoggedwith no further calls. With Auto Seq off,replystarts only the first transmission.Best for search-and-pounce, weak for RUN. The API is built to answer CQs (and only CQ/QRZ decodes), so S&P is fully automatable. It has no clean way to drive a repeating call-CQ (RUN) cycle — that needs WSJT-X's own "Enable Tx", or a
free_textCQ re-sent each period.
Related MCP server: MultiViewer
Requirements
WSJT-X 2.1 through 3.x — the UDP message protocol is schema 3 / Qt_5_4 and has been stable across those releases (verified live against WSJT-X 3.0.2).
In WSJT-X: Settings → Reporting → UDP Server
UDP Server = the host running this server (default
127.0.0.1), port2237.Accept UDP requests = ON to allow control (it is OFF by default). Observing decodes/status works without it; commanding does not.
Install (Claude Desktop)
Download the wsjtx-mcp.mcpb from the
latest release and
double-click it, or drag it onto Claude Desktop → Settings → Extensions. Fill in
the settings form (callsign, host, port). See docs/INSTALL.md.
Configuration
Variable | Default | Purpose |
|
| UDP address to bind/listen on. |
|
| WSJT-X UDP Server port. |
| (empty) | Operator callsign — the single transmit gate. Blank = receive-only. |
| (off) | Optional multicast group to join (coexist with other UDP consumers). |
| (auto) | Target a specific WSJT-X |
Host/port are where this server listens; control replies are sent back to the address each datagram arrived from.
Tools
Tool | Kind | What it does |
| observe | Latest |
| observe | Host/network + bind status + datagram counts + gate state. |
| observe/nudge |
|
| observe | Buffered completed QSOs ( |
| transmit | Answer a buffered CQ/QRZ decode (auto-sequences the QSO when WSJT-X "Auto Seq" is on). |
| transmit if | Set the Tx5 free-text message; |
| control |
|
| control | Mode/sub-mode/Rx DF/T-R period/freq-tol/DX call+grid. No dial freq. |
| control | Clear the Band Activity / Rx Frequency windows. |
| control | Colour or clear a callsign in Band Activity. |
| control | Override the session Maidenhead grid. |
| control | Switch to a named WSJT-X configuration. |
| control | Set a Fox/Hound sort-order annotation for a DX call (niche, DXpedition). |
| escape hatch | Build & send any message type by name (gate still applies). |
Transmit safety
The callsign is the single transmit gate, exactly as in fldigi-mcp. With
WSJTX_CALLSIGN blank the server is receive-only: it refuses every
transmit-initiating message — reply, free_text with send=true, and any
keying message via wsjtx_call. transmit halt, clear, configure,
highlight, location, replay, and all reads are always available (they don't
put you on the air; halt takes you off).
Beyond that gate:
Per-transmit approval comes from the Claude Desktop tool-permission prompt — lean on it for human-in-the-loop control.
WSJT-X's own Tx Watchdog and the
Tx Enabled/Transmittingflags (surfaced instatus) are extra safety signals.Operating under Part 97 automatic/remote control is the operator's responsibility: ensure station identification and a control operator who can intervene.
Running alongside other UDP tools
Only one process can normally own UDP 2237 on a host. If JTAlert, GridTracker,
or N1MM already consume it, either point WSJT-X's secondary UDP server here, use
a multicast group (WSJTX_MULTICAST) so several listeners coexist, or run
this server on a different host. To reach a WSJT-X on another machine, install
the mcp-host-bridge tool
(mcp-host-bridge install wsjtx --to <rig-host>) and set WSJTX_PORT=2238 —
sandboxed MCP clients reach only loopback, and the bridge does the LAN hop. See
docs/REMOTE-HOST.md.
Development
uv sync
uv run ruff check .
uv run pytestThe protocol codec is pure standard library and unit-tested against byte
fixtures, so the tests need no running WSJT-X. A smoke_test.py proves a live
WSJT-X is reachable receive-only. The field-tested message reference lives in
docs/WSJTX-API.md.
License
MIT © 2026 Stefan Brunner (AE5VG)
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sbrunner-atx/wsjtx-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server