MCP server for ARRL Logbook of The World — query confirmations, QSOs, DXCC credits, and user activity
lotw-mcp presents a domain-specific, focused tool set for amateur radio QSO (contact) queries and log management. All 6 tools are explicitly registered with descriptions and input schemas visible in server.py. Naming is verb-noun consistent (get_version_info, lotw_confirmations, lotw_qsos, etc.), and all tools have meaningful descriptions (100-250 chars). However, several definition quality gaps prevent a higher score: (1) error handling is minimal, all tools catch exceptions and return `{"error": str(e)}`, which provides no recovery guidance; (2) output schemas are not formally documented (no return type hints beyond `dict[str, Any]`); (3) parameters like 'since' and date range filters lack explicit format validation hints; (4) no pagination pattern documented for list-returning tools (lotw_confirmations, lotw_qsos likely return lists); (5) no tool annotations (readOnlyHint/destructiveHint/idempotentHint) despite all tools being read-only. The server is well-named and domain-appropriate but falls short of production polish.
Get lotw-mcp service version and upstream LoTW schema version. Returns the running PyPI version of lotw-mcp and the ARRL LoTW ADIF/CSV export schema in use. Use this to confirm fleet alignment across MCP deployments — agents can compare service_version and spec_version across servers to detect drift without going outside the MCP protocol.
Query confirmed QSL records from LoTW.
Download your complete LoTW log as raw ADIF text. Returns the .adi file content — save to disk for import into your logger. Set qsl_only=True for confirmed QSLs only. Omit 'since' for full history. Warning: large logs may take 30-60 seconds (LoTW is slow).
Query DXCC award credits from LoTW confirmations.
Query all uploaded QSOs from LoTW (confirmed and unconfirmed).
No output schema documentation. Tools return `dict[str, Any]` with no specification of expected fields, structure, or types. LLMs cannot plan downstream calls or validate results.
Error handling returns raw exception strings with no recovery guidance. A generic `{"error": str(e)}` tells the LLM nothing about whether to retry, ask the user, or move on.
No pagination pattern documented for tools returning lists. lotw_confirmations and lotw_qsos likely return large result sets but accept no page/offset/limit parameters visible in schema.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Check if a callsign uses LoTW and when they last uploaded. Public endpoint — no authentication required. Uses a locally cached copy of the LoTW user activity CSV (refreshed weekly).
Date parameters ('since', 'start_date', 'end_date') lack explicit format documentation. Descriptions say 'YYYY-MM-DD' but no validation guidance for LLM (e.g., min/max dates, relative date support).
No tool annotations despite all tools being read-only. Missing readOnlyHint annotation means LLMs cannot infer that these calls are safe to retry without side effects.