lotw-mcp
Enables querying ARRL Logbook of The World (LoTW) confirmations, uploaded QSOs, DXCC credits, and user activity through GitHub Copilot.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@lotw-mcpHow many LoTW confirmations did I get this month?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
lotw-mcp
MCP server for ARRL Logbook of The World (LoTW) — query confirmations, uploaded QSOs, DXCC credits, and user activity through any MCP-compatible AI assistant.
Part of the qso-graph project. Read-only — uploads require TQSL digital signatures and are out of scope.
Install
pip install lotw-mcpRelated MCP server: hamqth-mcp
Tools
Tool | Auth | Description |
| Yes | Query confirmed QSLs with band/mode/call/date filters |
| Yes | Query all uploaded QSOs (confirmed and unconfirmed) |
| Yes | DXCC award credits from LoTW confirmations |
| Yes | Download QSOs as ADIF file |
| No | Check if a callsign uses LoTW and when they last uploaded |
| No | Service version + upstream LoTW schema version (fleet identity attestation) |
Quick Start
1. Set up credentials
lotw-mcp uses qso-graph-auth personas for credential management:
pip install qso-graph-auth
qso-auth persona create ki7mt --callsign KI7MT
qso-auth persona provider ki7mt lotw --username KI7MT
qso-auth persona secret ki7mt lotwNote: 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):
{
"mcpServers": {
"lotw": {
"command": "lotw-mcp"
}
}
}Claude Code
Add to .claude/settings.json:
{
"mcpServers": {
"lotw": {
"command": "lotw-mcp"
}
}
}ChatGPT Desktop
{
"mcpServers": {
"lotw": {
"command": "lotw-mcp"
}
}
}Cursor
Add to .cursor/mcp.json (project-level) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"lotw": {
"command": "lotw-mcp"
}
}
}VS Code / GitHub Copilot
Add to .vscode/mcp.json in your workspace:
{
"servers": {
"lotw": {
"command": "lotw-mcp"
}
}
}Gemini CLI
Add to ~/.gemini/settings.json (global) or .gemini/settings.json (project):
{
"mcpServers": {
"lotw": {
"command": "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:
LOTW_MCP_MOCK=1 lotw-mcpPerformance 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
lotw-mcp --transport streamable-http --port 8004Development
git clone https://github.com/qso-graph/lotw-mcp.git
cd lotw-mcp
pip install -e .License
GPL-3.0-or-later
Available Tools
6 toolsget_version_infoA
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.
Returns: service_name, service_version (PyPI), and spec_version (LoTW schema).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description fully explains the tool returns version information and implies no side effects. It is transparent about what the tool does and returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two sentences plus a Returns line. Front-loaded with main purpose, then usage guidance. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and the presence of an output schema (which defines return fields), the description fully explains purpose, usage, and return values. Sibling tools are unrelated, so no confusion.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has zero parameters with 100% coverage. The description correctly does not include parameter details as none exist. Baseline score 4 for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool retrieves service and LoTW schema version information. Uses specific verbs and resources ('get version info', 'service version', 'schema version'). Distinct from sibling tools which handle confirmations, downloads, QSOs, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using this tool to confirm fleet alignment across MCP deployments by comparing version strings, providing a clear scenario and benefit. No alternative tools are needed for this purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lotw_confirmationsC
Query confirmed QSL records from LoTW.
| Name | Required | Description | Default |
|---|---|---|---|
| persona | Yes | Persona name configured in adif-mcp. | |
| since | No | QSLs received since this date (YYYY-MM-DD). Default: last 30 days. | |
| band | No | Filter by ADIF band (e.g., '20M'). | |
| mode | No | Filter by ADIF mode (e.g., 'FT8'). | |
| callsign | No | Filter by worked station callsign. | |
| dxcc | No | Filter by DXCC entity code. | |
| detail | No | Include QSL station location data (default true). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits (e.g., read-only nature, authentication needs, rate limits). 'Query' implies read, but it is not explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with no redundancy or fluff. It is concise, though it could be expanded with useful context without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema, the description lacks context about the meaning of 'confirmed QSL records' in the LoTW ecosystem and how this tool relates to siblings. For a tool with 7 parameters, it is insufficient for an agent to understand when to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 7 parameters have descriptions in the input schema (100% coverage), so the tool description adds no additional parameter information beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Query confirmed QSL records from LoTW' specifies the resource ('confirmed QSL records') and action ('query'), but does not distinguish it from sibling tool lotw_qsos, which may query similar records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like lotw_qsos or lotw_download. The description provides no context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lotw_downloadA
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).
| Name | Required | Description | Default |
|---|---|---|---|
| persona | Yes | Persona name configured in adif-mcp. | |
| qsl_only | No | Only return confirmed QSLs (default: all uploaded QSOs). | |
| since | No | Only records since this date (YYYY-MM-DD). Omit for full history. | |
| band | No | Filter by band (e.g., '20M'). | |
| mode | No | Filter by mode (e.g., 'FT8'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses performance characteristics ('large logs may take 30-60 seconds') and output format (raw ADIF text). It does not mention authentication or other behavioral traits, but it is transparent about the expected behavior for a download tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a short paragraph with three sentences. Each sentence serves a clear purpose: stating the action, explaining key parameters, and warning about performance. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and the parameter count of 5, the description covers purpose, key parameters, performance, and output format. It leaves out details on error handling or required permissions but is sufficient for a download tool. The presence of an output schema reduces the need to explain return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the input schema has 100% coverage, the description adds useful context: 'Omit 'since' for full history' clarifies the null default, and 'Set qsl_only=True' explains the boolean parameter in plain language. This adds meaning beyond schema field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Download' and the resource 'your complete LoTW log as raw ADIF text'. It distinguishes from siblings like lotw_confirmations and lotw_qsos by specifying it returns the full log in ADIF format, which none of the siblings do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives specific parameter guidance (e.g., 'Set qsl_only=True for confirmed QSLs only' and 'Omit 'since' for full history') and warns about performance. However, it does not explicitly tell when to use this tool versus alternatives like lotw_qsos or lotw_confirmations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lotw_dxcc_creditsC
Query DXCC award credits from LoTW confirmations.
| Name | Required | Description | Default |
|---|---|---|---|
| persona | Yes | Persona name configured in adif-mcp. | |
| entity | No | Optional DXCC entity code to filter by. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only mentions 'Query', implying a read-only operation, but fails to detail return structure, pagination, or any side effects. The presence of an output schema partially mitigates this, but the description adds minimal behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is front-loaded and concise. Every word serves a purpose. It lacks waste but could be slightly more informative without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has only two parameters with full schema coverage and an output schema exists, the description is minimally adequate. However, the lack of usage guidelines and behavioral details (especially without annotations) leaves some gaps in completeness for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already describes both parameters ('persona' and optional 'entity'). The description adds no additional meaning beyond what the schema provides. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Query' and resource 'DXCC award credits from LoTW confirmations', which distinguishes it from sibling tools like 'lotw_confirmations' or 'lotw_qsos' that likely query different data. It is specific and unambiguous, though a bit terse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as 'lotw_confirmations' or 'lotw_download'. The description only states what it does, leaving the agent to infer usage context without explicit when-to-use or when-not-to-use instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lotw_qsosC
Query all uploaded QSOs from LoTW (confirmed and unconfirmed).
| Name | Required | Description | Default |
|---|---|---|---|
| persona | Yes | Persona name configured in adif-mcp. | |
| since | No | QSOs uploaded since this date (YYYY-MM-DD). Default: last 30 days. | |
| band | No | Filter by band (e.g., '20M'). | |
| mode | No | Filter by mode (e.g., 'FT8'). | |
| start_date | No | QSO date range start (YYYY-MM-DD). | |
| end_date | No | QSO date range end (YYYY-MM-DD). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description should disclose behavioral traits. It does not mention authentication, rate limits, pagination, or the default 30-day scope beyond what the schema provides. Minimal extra context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with core action and scope. No redundancy; every word serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having 6 parameters, a rich output schema, and multiple sibling tools, the description is only one sentence. Lacks context on use cases, data volume, or how it relates to lotw_download and lotw_confirmations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions (e.g., since, band, mode). The description adds no additional semantic value; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool queries LoTW QSOs, both confirmed and unconfirmed. It distinguishes from siblings like lotw_confirmations and lotw_download, but the phrase 'all uploaded QSOs' is slightly misleading due to the default time range.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus its alternatives (e.g., lotw_confirmations, lotw_download). The description only explains what it does, not the conditions for choosing it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lotw_user_activityA
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).
| Name | Required | Description | Default |
|---|---|---|---|
| callsign | Yes | Callsign to check. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses important behaviors: public endpoint (no auth) and weekly cached data. This goes beyond the name and purpose, though it doesn't cover error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two sentences, first covers purpose, second covers behavior. No wasted words, front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 param, output schema present), the description is complete. It states purpose, security (public), and data freshness (cached weekly). No additional details needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes the single parameter. The description adds no extra meaning beyond 'Callsign to check.' Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'check' and the resource 'callsign' regarding LoTW usage and last upload time. It distinguishes from sibling tools like lotw_confirmations and lotw_qsos by focusing on user activity checks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context ('check if a callsign uses LoTW'), implying when to use it. It notes the public endpoint and cached data, but lacks explicit guidance on alternatives or when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.3.3- First observed
get_version_info - First observed
lotw_confirmations - First observed
lotw_download - First observed
lotw_dxcc_credits - First observed
lotw_qsos - First observed
lotw_user_activity
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.
Maintenance
Related MCP Connectors
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Official remote MCP server for Archivist AI TTRPG campaign memory: characters, sessions, and more.
Read-only MCP server exposing a user ORANO library to their own AI agent.
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server for eQSL.cc that allows users to download incoming electronic QSL cards, verify specific contacts, and check Authenticity Guaranteed status. It enables natural language interaction with amateur radio logs and confirmation records through any MCP-compatible AI assistant.5GPL 3.0
- AlicenseAqualityDmaintenanceMCP server for HamQTH.com — callsign lookup, DX cluster spots, Reverse Beacon Network, DXCC resolution, and more through any MCP-compatible AI assistant.8GPL 3.0
- AlicenseAqualityFmaintenanceMCP server for QRZ.com — callsign lookups, DXCC entity resolution, and logbook queries through any MCP-compatible AI assistant.639 PyPI3GPL 3.0
- AlicenseAqualityDmaintenanceEnables IOTA group lookup, island search, DXCC mapping, nearby groups, and programme statistics through any MCP-compatible AI assistant.7GPL 3.0