Skip to main content
Glama
qso-graph

lotw-mcp

by qso-graph

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-mcp

Related MCP server: hamqth-mcp

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 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 lotw

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):

{
  "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-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

lotw-mcp --transport streamable-http --port 8004

Development

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 tools
get_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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
personaYesPersona name configured in adif-mcp.
sinceNoQSLs received since this date (YYYY-MM-DD). Default: last 30 days.
bandNoFilter by ADIF band (e.g., '20M').
modeNoFilter by ADIF mode (e.g., 'FT8').
callsignNoFilter by worked station callsign.
dxccNoFilter by DXCC entity code.
detailNoInclude QSL station location data (default true).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
personaYesPersona name configured in adif-mcp.
qsl_onlyNoOnly return confirmed QSLs (default: all uploaded QSOs).
sinceNoOnly records since this date (YYYY-MM-DD). Omit for full history.
bandNoFilter by band (e.g., '20M').
modeNoFilter by mode (e.g., 'FT8').

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
personaYesPersona name configured in adif-mcp.
entityNoOptional DXCC entity code to filter by.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
personaYesPersona name configured in adif-mcp.
sinceNoQSOs uploaded since this date (YYYY-MM-DD). Default: last 30 days.
bandNoFilter by band (e.g., '20M').
modeNoFilter by mode (e.g., 'FT8').
start_dateNoQSO date range start (YYYY-MM-DD).
end_dateNoQSO date range end (YYYY-MM-DD).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
callsignYesCallsign to check.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 6 tool updatesv0.3.3
    • First observedget_version_info
    • First observedlotw_confirmations
    • First observedlotw_download
    • First observedlotw_dxcc_credits
    • First observedlotw_qsos
    • First observedlotw_user_activity

TDQS

A3.6/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency3/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    An 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.
    5
    GPL 3.0
  • A
    license
    A
    quality
    D
    maintenance
    MCP server for HamQTH.com — callsign lookup, DX cluster spots, Reverse Beacon Network, DXCC resolution, and more through any MCP-compatible AI assistant.
    8
    GPL 3.0
  • A
    license
    A
    quality
    F
    maintenance
    MCP server for QRZ.com — callsign lookups, DXCC entity resolution, and logbook queries through any MCP-compatible AI assistant.
    6
    39 PyPI
    3
    GPL 3.0
  • A
    license
    A
    quality
    D
    maintenance
    Enables IOTA group lookup, island search, DXCC mapping, nearby groups, and programme statistics through any MCP-compatible AI assistant.
    7
    GPL 3.0