lotw-mcp
<!-- mcp-name: io.github.qso-graph/lotw-mcp -->
# lotw-mcp
[](https://pypi.org/project/lotw-mcp/)
[](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.qso-graph/lotw-mcp&version=latest)
MCP server for [ARRL Logbook of The World](https://lotw.arrl.org/) (LoTW) — query confirmations, uploaded QSOs, DXCC credits, and user activity through any MCP-compatible AI assistant.
Part of the [qso-graph](https://qso-graph.io/) project. Read-only — uploads require TQSL digital signatures and are out of scope.
## Install
```bash
uvx lotw-mcp # run it; nothing to install
```
## Tools
| Tool | Auth | Description |
|------|------|-------------|
| `lotw_confirmations` | Yes | Query confirmed QSLs with band/mode/call/date filters |
| `lotw_qsos` | Yes | Query all uploaded QSOs (confirmed and unconfirmed) |
| `lotw_dxcc_credits` | Yes | DXCC award credits from LoTW confirmations |
| `lotw_download` | Yes | Download QSOs as ADIF file |
| `lotw_user_activity` | No | Check if a callsign uses LoTW and when they last uploaded |
| `get_version_info` | No | Service version + upstream LoTW schema version (fleet identity attestation) |
## Quick Start
### 1. Set up credentials
lotw-mcp uses [qso-graph-auth](https://qso-graph.io/servers/qso-graph-auth/) personas for credential management:
```bash
# Install qso-graph-auth if you haven't
uv tool install qso-graph-auth
# A persona (your callsign and the dates it covers), then LoTW for it
qso-auth persona add --name ki7mt --callsign KI7MT --start 2020-01-01
qso-auth provider enable ki7mt lotw
qso-auth creds set ki7mt lotw # asks for your username, then your password (hidden)
```
All three steps are needed: without `provider enable`, the server reports that the persona has no `lotw` ref.
**Note**: The LoTW `login` is usually your callsign but not always. Pre-Sept 2019 accounts may require lowercase passwords. Avoid special characters in passwords.
### 2. Configure your MCP client
#### Claude Desktop
Add to `claude_desktop_config.json` (`~/Library/Application Support/Claude/` on macOS, `%APPDATA%\Claude\` on Windows):
```json
{
"mcpServers": {
"lotw": {
"command": "uvx",
"args": ["lotw-mcp"]
}
}
}
```
#### Claude Code
Add to `.claude/settings.json`:
```json
{
"mcpServers": {
"lotw": {
"command": "uvx",
"args": ["lotw-mcp"]
}
}
}
```
#### ChatGPT Desktop
```json
{
"mcpServers": {
"lotw": {
"command": "uvx",
"args": ["lotw-mcp"]
}
}
}
```
#### Cursor
Add to `.cursor/mcp.json` (project-level) or `~/.cursor/mcp.json` (global):
```json
{
"mcpServers": {
"lotw": {
"command": "uvx",
"args": ["lotw-mcp"]
}
}
}
```
#### VS Code / GitHub Copilot
Add to `.vscode/mcp.json` in your workspace:
```json
{
"servers": {
"lotw": {
"command": "uvx",
"args": ["lotw-mcp"]
}
}
}
```
#### Gemini CLI
Add to `~/.gemini/settings.json` (global) or `.gemini/settings.json` (project):
```json
{
"mcpServers": {
"lotw": {
"command": "uvx",
"args": ["lotw-mcp"]
}
}
}
```
### 3. Ask questions
> "How many LoTW confirmations did I get this month?"
> "Show me all unconfirmed 20m FT8 QSOs uploaded to LoTW in the last 90 days"
> "What DXCC credits do I have on 40m CW?"
> "Does JA1ABC use LoTW? When did they last upload?"
## Public Tool
`lotw_user_activity` works without any credentials. It uses the public LoTW user activity CSV, cached locally for 7 days.
## Testing Without Credentials
Set the mock environment variable:
```bash
LOTW_MCP_MOCK=1 lotw-mcp
```
## Performance Notes
LoTW can be slow (30-60s for large queries). lotw-mcp uses 120s timeouts. Use date filters (`since`, `start_date`) to limit result sets.
## MCP Inspector
```bash
lotw-mcp --transport streamable-http --port 8004
```
## Development
```bash
git clone https://github.com/qso-graph/lotw-mcp.git
cd lotw-mcp
uv sync --group dev
uv run pytest
```
## License
GPL-3.0-or-later
TDQS
Scored across 6 tools
Each tool targets a distinct aspect of LoTW functionality: version info, confirmations, full log download, DXCC credits, all QSOs, and user activity. No two tools have overlapping purposes.
Most tools use 'lotw_' prefix but 'get_version_info' breaks this pattern. Additionally, some tool names are verbs ('lotw_download') while others are nouns ('lotw_confirmations'), introducing inconsistency.
With 6 tools, the server covers the core LoTW data retrieval operations without being too sparse or overwhelming. A slightly larger set might include upload or more granular queries, but the current count is appropriate for this domain.
The tool set provides most essential LoTW operations: version checking, log downloading, QSO querying (confirmed and all), DXCC credits, and user activity. Missing only upload functionality and perhaps station-specific queries, but these are minor gaps.