Open amateur radio software, built to work together.
QSO Graph is open amateur radio software for your station: logging, nets, awards, spots and your radio, in one place, on Windows, macOS and Linux, with the libraries and AI integrations behind them. Today that is the MCP servers and the libraries under them; QSO Graph Desktop, the app that brings it together, is released: 0.4.0 is the Stable release on Windows, Linux and macOS. They share one data model, publish their interfaces, and are built so that any of them can be used alone. Free software under the GPL, for individual operators and for clubs, small and large.
View the live demo → · Documentation →
- MCP servers that connect AI assistants to the services hams use every day: QRZ, LoTW, eQSL, HamQTH, POTA, SOTA, IOTA, NOAA space weather, WSPR, OMISS, NetLogger, N1MM Logger+, IONIS-AI propagation analytics, and the ADIF specification itself. Published on PyPI; each one runs with a single
uvxcommand, nothing to install. - Tools that look after them: credential handling that keeps your passwords in your operating system's keyring, and a relay that gives local LLMs the same tools.
- Live demos of what that makes possible: logbook analysis, and DXpedition propagation planning.
| Product | What it is | Status |
|---|---|---|
| QSO Graph Desktop | A desktop home for your station on Windows, Linux and macOS: your callsigns and their logins (kept in your own OS credential store), your Locations, Parks On the Air, band conditions, the sun and moon, and ADIF Lookup, each an extension. Integrations with WSJT-X and the programs you already run come next. Signed downloads, a signed apt/dnf repository, and Homebrew | Available (0.4.0), growing milestone by milestone |
| QSO Graph SDK (QGSDK) | The build kit: pick what you work on (QSO Graph Desktop, the Qt logger or the MCP servers) and get exactly its tools, pinned, with one command on Windows, Linux or macOS, so anyone can build them | Available (latest) |
Earlier plans for a separate net logger, an ADIF service and a self-hosted club server are folded into QSO Graph Desktop.
For developers: qso-graph-sim replays a program's network messages from its own log (WSJT-X first), so integrations can be tested without a radio, and the Homebrew tap carries QSO Graph Desktop's Stable releases for macOS.
Products are linked here as each becomes public.
In order:
- Now: one app for the station, built properly. QSO Graph Desktop, to enterprise security standards; 0.4.0 is the Stable release.
- With it: the clubs with nothing. Club rosters, nets and awards for the many clubs and nets that have no software or server of their own.
- Then: publish the seams. The interfaces between the pieces become published specifications that anyone can implement, including software that isn't ours.
- Eventually: governance that isn't us. Clubs, small and large with an equal voice, steering the parts that affect them, through the specifications.
Underneath all of it, continuously: the data. ADIF as the base, propagation as the research edge.
How the pieces fit:
- ADIF is the base. Every QSO Graph tool reads and writes ADIF, the format LoTW, eQSL, QRZ and every major logger share, and uses ADIF's own definition for every field ADIF defines. No one-off custom fields: when a tool genuinely needs something ADIF doesn't have, it is defined once, published, and used the same way across every QSO Graph tool where it applies. That costs more than a quick private field, and it's a cost accepted deliberately: it's what keeps the tools working together, and what lets you take your log anywhere.
- Shared contracts, not shared code. The pieces talk through published APIs and the same reference data (ADIF, DXCC), and are tested against the same recorded service responses, so a Python MCP server and the desktop app agree on what a service means.
- Each piece stands alone. Every service is a library with thin layers over it: an MCP server for AI assistants, and the desktop app's own screens. Each works on its own; club features connect when a club has them.
What we don't do: replace LoTW, eQSL or QRZ. QSO Graph records, queries and predicts contacts, and connects to those services rather than standing in for them.
The integration layer, available now. Open-source Model Context Protocol servers that connect AI assistants to amateur radio services. Ask Claude, ChatGPT, Copilot, or Gemini about your QSOs, confirmations, and logbook data — no manual API wrangling required.
Nothing to install per server. Every server, its tools and its current version: qso-graph.io.
Install uv once:
curl -LsSf https://astral.sh/uv/install.sh | sh # Linux / macOS
powershell -c "irm https://astral.sh/uv/install.ps1 | iex" # WindowsThen your MCP client runs each server with uvx, always the current release:
"command": "uvx", "args": ["solar-mcp"]Command-line tools install with uv tool install: qso-graph-auth (credentials) and qsp-client (the local-LLM relay). Client configs for Claude Desktop, Claude Code, ChatGPT, Cursor, VS Code and Gemini CLI: Getting Started.
Your credentials never leave the OS keyring. Every qso-graph server enforces non-negotiable security guarantees:
- Credentials stored in OS keyring only (macOS Keychain, Windows Credential Manager, Linux Secret Service) — never in config files, environment variables, or logs
- Credentials never appear in MCP tool results, error messages, or debug output — enforced by architecture, not policy
- No command injection surface — no
subprocess, noshell=True, noeval - All external connections HTTPS only
- Every server that calls an outside service respects that service's request limits, and
treats a
429as the limit it is: it waits the interval the service asks for rather than retrying into it - A security gate every PyPI release must pass before the upload runs: the security test
suite, a dependency audit against known advisories, and source checks for credential
logging, plaintext
http://and subprocess use. It is mechanical, not a review — nothing ships past a red gate, and no human sign-off is claimed in its place
Full details: Security
| Package | Purpose | Status |
|---|---|---|
| adif-mcp | ADIF 3.1.7 spec parsing, validation, enumerations (8 tools) | |
| qso-graph-auth | Persona management, OS keyring credentials, qso-graph-auth CLI |
| Package | Service | Tools | Status |
|---|---|---|---|
| eqsl-mcp | eQSL.cc | 6 tools: inbox, verify, AG status, download, last upload, version info | |
| lotw-mcp | LoTW | 6 tools: confirmations, QSOs, DXCC credits, download, user activity, version info | |
| qrz-mcp | QRZ.com | 6 tools: lookup, DXCC, logbook status, download, logbook fetch, version info | |
| hamqth-mcp | HamQTH | 8 tools: lookup, DXCC, bio, activity, DX spots, RBN, verify QSO, version info |
| Package | Service | Tools | Status |
|---|---|---|---|
| pota-mcp | POTA | 11 tools: spots, park info, stats, activations, leaderboard, schedules, location, nearby, rare parks nearby, activator, version info | |
| sota-mcp | SOTA | 5 tools: spots, alerts, summit info, nearby summits, version info | |
| iota-mcp | IOTA | 7 tools: group lookup, island search, DXCC mapping, nearby, stats, version info | |
| solar-mcp | NOAA SWPC | 7 tools: SFI, Kp, solar wind, X-ray flux, band outlook, alerts, version info | |
| wspr-mcp | WSPR | 9 tools: spots, band activity, top beacons/spotters, propagation, grid, SNR, version info | |
| ionis-mcp | IONIS-AI | 12 tools: HF propagation analytics from 175M+ signatures (14B observations) | |
| eme-mcp | moonbounce (computed locally) | 5 tools: moon window, path loss, degradation, calendar, version info | |
| meteor-mcp | Global Meteor Network + NASA CNEOS | 7 tools: best windows, showers, shower info, activity, fireballs, source info, version info | |
| omiss-mcp | OMISS | 14 tools: net schedule, nets on the air, member lookup, check-in history, past net check-ins, Statehood, officers, awards, award rules, award recipients, award eligibility, net statistics, set callsign, version info |
The lists ADIF's fields point to but ADIF doesn't define, each as its owner publishes it, credited to the owner. The facts ship with the package; the owner's document doesn't.
| Package | Owner's list | Tools | Status |
|---|---|---|---|
| cq-zones-mcp | CQ zones: CQ's WAZ Zone Definitions (CQ / WWROF) | 6 tools: lookup, codes for an entity, search, valid on a date, source info, version info | |
| itu-zones-mcp | ITU zones: IARU HF Managers Handbook, ch. 9.8 (IARU Region 1) | 6 tools: lookup, codes for an entity, search, valid on a date, source info, version info | |
| darc-dok-mcp | DOKs and special DOKs: DARC's DOK-Liste and special-DOK list | 6 tools: lookup, valid on a date, search, codes for an entity, source info, version info |
On PyPI so the name is reserved and the release machinery is proven, and each
answers get_version_info with "in development — no working tools yet". They
are listed here so that is said rather than discovered: installing one today
gets you a version number and nothing else.
| Package | Planned | Status |
|---|---|---|
| dxe-mcp | DXpedition tracking | In development — no working tools |
| js8call-mcp | JS8Call HF messaging | In development — no working tools |
| qso-graph-contest-mcp | Contest calendar and rules | In development — no working tools |
| Package | Service | Tools | Status |
|---|---|---|---|
| n1mm-mcp | N1MM Logger+ | 12 tools: station state, lookup, contacts, bandmap, performance, multipliers, clock, network, pileup, SO2R, diagnostics, version info | |
| netlogger-mcp | NetLogger | 6 tools: active nets, live check-ins and who's up, past nets, past check-ins, set callsign, version info |
| Package | Purpose | Status |
|---|---|---|
| qsp-client | QSP — an MCP client that relays tools to any local LLM (llama.cpp, Ollama, vLLM, SGLang). Formerly qsp-mcp |
| Demo | Description | Status |
|---|---|---|
| qso-graph-demo-logbook | QSO logbook analysis showcase (Next.js, GitHub Pages) | Live Demo |
| qso-graph-demo-dxpedition | DXpedition propagation analysis — 3Y0K Bouvet Island (Next.js, GitHub Pages) | Live Demo |
| Project | Description |
|---|---|
| ionis-jupyter | Jupyter notebooks for propagation research |
# Install uv once (Linux / macOS)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Run any server
uvx solar-mcp
# Credentials for the logbook servers
uv tool install qso-graph-authEach server works with any MCP client: Claude Desktop, Claude Code, ChatGPT, Cursor, VS Code / GitHub Copilot, Windsurf, Gemini CLI, Goose, and Codex CLI — or use qsp-client to relay tools to any local LLM.
qso-graph-auth (identity) MCP Servers (qso-graph)
├── PersonaManager ──> eqsl-mcp, qrz-mcp, lotw-mcp, hamqth-mcp
├── OS keyring credentials Each server = 1 uvx
└── qso-graph-auth CLI Each server = 5-14 MCP tools
adif-mcp (ADIF spec) Public Servers
└── 8 spec tools ──> solar, pota, sota, iota, wspr, omiss,
ionis, netlogger (no auth); n1mm (local)
qsp-client (tool relay) Local LLM Inference
└── Stateless pipe ──> llama.cpp, Ollama, vLLM, SGLang
MCP tools → OpenAI Any model with function calling
tools format Zero cloud dependency
Do NOT open public GitHub issues for security vulnerabilities. Email: maintainers@qso-graph.io with subject [SECURITY] qso-graph vulnerability report.
GPL-3.0-or-later