Jt Mcp

io.github.qso-graphPublished by GitHub account qso-graphv0.2.0Updated Nov 3, 2026

WSJT-X over UDP for AI apps: status, decodes, who is calling CQ, stations heard, WSPR. Read-only.

Overview

AI-generated overview

Read-only MCP server that listens to WSJT-X over UDP and lets an assistant report live radio status, CQ calls, decodes, heard stations and WSPR spots.

What you can do
  • Report what each WSJT-X instance is tuned to, its mode, DX call and grid, and whether Tx is enabled
  • List who is calling CQ and what kind of CQ, latest per station
  • Read recent decodes split into their parts, filterable by callsign, CQ only, SNR or band
  • Summarize stations heard since startup with counts, last SNR, grid, mode and band
  • Show WSPR spots with call, grid, power, SNR and drift
  • Inspect the listener itself: bind address, allowed senders, dropped datagrams and instance heartbeats
When to use it
Useful for amateur radio operators running WSJT-X, JTDX or compatible software who want to ask an assistant in plain language what their station is hearing, who is calling CQ, or why nothing is arriving. It suits monitoring and question-answering, not operating the radio.
Requirements
Runs locally as a Python package via uvx (no install step). WSJT-X must be configured to send UDP messages to the server's address and port, default 127.0.0.1:2237. If another logger already uses port 2237, choose a different port. For WSJT-X on another PC, set a bind address and an allow list of IP addresses. No accounts or API keys.
Before you install
Read-only by design: it never sends to WSJT-X, so it cannot answer a call, key a transmitter or change settings. The allow list only keeps other machines out; UDP sender addresses can be forged on the same network, so a forged datagram could mislead about what WSJT-X is doing, though it cannot cause any action. Only one program can listen on a UDP port, so it may conflict with existing loggers.

Installation

In SourceWeft

  1. Open Jt Mcp in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

jt-mcp

[PyPI]

Ask an AI app what WSJT-X is hearing. WSJT-X sends what it is doing and every decode to a UDP Server address; jt-mcp listens there and answers: who is calling CQ, and what kind of CQ (DX, POTA, a contest, a region), who has been heard and how well, what WSJT-X is tuned to, recent decodes and WSPR spots.

Read-only, permanently. jt-mcp never sends WSJT-X a message, so it cannot answer a call, key your transmitter or change a setting. No write, no PTT, no transmit control — a permanent constraint, not a first-version limit. The tests assert it against the source.

WSJT-X first, and WSJT-X defines the protocol. The UDP message definitions come from the WSJT-X project — Network/NetworkMessage.hpp, at the schema WSJT-X states — because the project that owns a definition is its authority. The code is qso-graph-lib's, the same that qso-graph-sim plays WSJT-X's messages with. JTDX, WSJT-Z and MSHV are supported where they work with those definitions, and where one does not, its difference is not implemented here. JS8Call, whose API is its own, follows WSJT-X.

This server was js8call-mcp until 2026-10-29. Part of the qso-graph project.

Install

bash
uvx jt-mcp            # run it; nothing to install

Set up WSJT-X

In WSJT-X: File, Settings, Reporting, UDP Server: 127.0.0.1, port 2237 (WSJT-X's defaults). That is all jt-mcp needs when WSJT-X runs on the same PC.

Only one program can listen on a UDP port. If GridTracker, JTAlert or another logger already listens on 2237, give jt-mcp a different port (--udp-port) and point WSJT-X at that one.

Tools

ToolAnswers
jt_cqWho is calling CQ, and what kind: plain, DX, activity (POTA, SOTA, WWFF, IOTA), contest (TEST, FD, RU, WW), region (NA, EU, ...), or a frequency (CQ 290). The latest per station
jt_statusWhat each WSJT-X is doing: dial frequency and band, mode, DX call and grid, Tx enabled or transmitting, your call and grid
jt_decodesRecent decodes, each read into its parts (who is calling whom, grid, report, sign-off); filter by callsign, CQ only, SNR, band
jt_heardStations heard: how often, last SNR, last grid, mode and band
jt_wsprWSPR spots WSJT-X decoded: call, grid, power, SNR, drift
jt_diagnosticsThe listener: where it listens, who may send, what arrived, what was dropped and from where, each WSJT-X's version
get_version_infoService version and status

Times are UTC. Several WSJT-X instances (two radios, two bands) are kept apart by the Id each sends, such as WSJT-X - FT-991A.

Questions it will answer

"Who's calling CQ POTA on 20 m right now?"

"Any DX calling CQ in the last ten minutes, strongest first?"

"Has W9XYZ been heard, and how strong?"

"What is WSJT-X tuned to, and is Tx enabled?"

"Why isn't anything showing up?" — jt_diagnostics

Configure your MCP client

jt-mcp works with any MCP-compatible client. Add the server and restart the client.

Claude Desktop

Add to claude_desktop_config.json (~/Library/Application Support/Claude/ on macOS, %APPDATA%\Claude\ on Windows):

json
{  "mcpServers": {    "jt": {      "command": "uvx",      "args": ["jt-mcp"]    }  }}
Claude Code
bash
claude mcp add jt -- uvx jt-mcp
ChatGPT Desktop

Configure via Settings > Apps & Connectors, or in your agent definition, with the same command and args as above.

WSJT-X on another PC

By default jt-mcp listens on 127.0.0.1, this PC alone. For WSJT-X on another PC, give one address of this PC with --bind, and name each PC that may send with --allow:

json
"args": ["jt-mcp", "--bind", "192.168.1.50", "--allow", "192.168.1.40"]

and set WSJT-X's UDP Server to 192.168.1.50. Listening on every interface at once (0.0.0.0) is refused, --allow is required with a network address, and names are not accepted, only IP addresses. A datagram from anyone else is dropped unread and counted, and jt_diagnostics shows the count and the addresses.

What the allow list does not do. It keeps other machines out. It is not proof of who sent: a UDP sender's address can be forged by anything on the same network. What contains that is that jt-mcp only reads, so a forged datagram can mislead about what WSJT-X is doing and cannot make anything happen.

Options

jt-mcp [--bind ADDR] [--allow ADDR ...] [--udp-port N]       [--transport stdio|streamable-http] [--port N] [--version] [--help]
OptionDefault
--bind ADDR127.0.0.1where to listen for WSJT-X
--allow ADDRthis PCa PC that may send; repeatable; required with a network --bind
--udp-port N2237WSJT-X's UDP Server port
--transportstdiostreamable-http binds 127.0.0.1 only
--port N8031the streamable-http port

Licence

GPL-3.0-or-later. See LICENSE.

Source: README.md at commit c9d0be6

Tools

7

get_version_info

Get Version Info

Get this server's version, what it does, and where its work is tracked.

Takes no parameters.

jt_status

Jt Status

What each running WSJT-X is doing now: dial frequency and band, mode, the station being worked (DX call and grid), whether Tx is enabled or transmitting, and your own call and grid.

Parametersinstance

jt_cq

Jt Cq

Who is calling CQ, and what kind of CQ: plain, DX, an activity (POTA, SOTA, WWFF, IOTA), a contest (TEST, FD, RU, WW), a region (NA, EU, ...), or a frequency (CQ 290). The latest CQ per station, newest first.

Parametersbandcq_typeinstancemodifiersince_minutes

jt_decodes

Jt Decodes

Recent decodes, newest first, each read into its parts: CQ (with its type), or who is calling whom, with the grid, report or sign-off it carries.

Parametersbandlimitcq_onlymin_snrcallsigninstancesince_minutes

jt_heard

Jt Heard

Stations heard since this server started: how often, last SNR, last grid sent, mode and band, first and last heard.

Parameterssortlimitcallsignsince_minutes

jt_wspr

Jt Wspr

WSPR spots WSJT-X has decoded, newest first: call, grid, power, SNR, drift.

Parametersbandlimitcallsignsince_minutes

jt_diagnostics

Jt Diagnostics

The listener itself: where it listens, who may send, what has arrived, what was dropped and from where, and each WSJT-X instance's version and last heartbeat.

Takes no parameters.

Version history

1
  1. v0.2.0LatestOct 29, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts