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 in design. 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 | One app for your station on Windows, macOS and Linux: your logbook, nets, awards, spots and your radio, with your callsigns and logins kept in your own OS keyring | In design |
| QSO Graph SDK (QGSDK) | The build kit for QSO Graph's standalone apps: Qt and CMake, one command to a pinned build environment on Windows or Linux, so anyone can build them | Available (open source) |
Earlier plans for a separate net logger, an ADIF service and a self-hosted club server are folded into it.
Products are linked here as each becomes public.
In order:
- Now: one app for the station, designed properly. QSO Graph Desktop, built to enterprise security standards.
- 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, the qso-auth command) 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
- Rate limiting on every API to prevent account bans
- Independent security audit required before every PyPI release
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-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 | 8 tools: spots, park info, stats, schedules, location, 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) | |
| omiss-mcp | OMISS | 13 tools: net schedule, nets on the air, member lookup, check-in history, past net check-ins, Statehood, officers, awards, award rules, award recipients, net statistics, set callsign, version info |
| Package | Service | Tools | Status |
|---|---|---|---|
| n1mm-mcp | N1MM Logger+ | 9 tools: station state, lookup, contacts, bandmap, performance, multipliers, clock, 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 |
# 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-auth CLI Each server = 5-13 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
| Demo | Description | Status |
|---|---|---|
| qso-graph-demo | QSO logbook analysis showcase (Next.js / Vercel) | Live Demo |
| dxpedition-demo | DXpedition propagation analysis — 3Y0K Bouvet Island (Next.js / Vercel) | Live Demo |
| Project | Description |
|---|---|
| ionis-jupyter | Jupyter notebooks for propagation research |
Do NOT open public GitHub issues for security vulnerabilities. Email: ki7mt@yahoo.com with subject [SECURITY] qso-graph vulnerability report.
GPL-3.0-or-later