Skip to main content
Glama

adif-mcp

PyPI MCP Registry

MCP server for the ADIF 3.1.7 specification: validate and parse ADIF records, search the spec's fields, enumerations and data types, and compute distance and heading between Maidenhead locators, through any MCP-compatible AI assistant.

Part of the qso-graph project. No authentication required — the ADIF specification is bundled, so it works offline.

Install

uvx adif-mcp            # run it; nothing to install

Related MCP server: qrz-mcp

Tools

Tool

Description

Key Parameters

validate_adif_record

Validate a raw ADIF record against the 3.1.7 spec

adif_string

parse_adif

Streaming parser for large ADIF files, with pagination

file_path, start_at, limit

read_specification_resource

Raw JSON for any spec module (band, mode, fields, ...)

resource_name

list_enumerations

All ADIF enumerations with entry counts

—

search_enumerations

Search enumeration records by keyword

search_term, enumeration

calculate_distance

Great-circle distance (km) between two Maidenhead locators

start, end

calculate_heading

Initial beam heading (azimuth) between two locators

start, end

get_version_info

Service version + upstream spec version (fleet identity attestation)

—

What is ADIF?

ADIF (Amateur Data Interchange Format) is the standard file format amateur radio logging programs use to exchange QSO records. adif-mcp is the specification package of qso-graph: it validates, parses and searches ADIF so an assistant can work with logs safely and accurately. Credentials are handled separately by qso-graph-auth, and each logging service has its own MCP server (see qso-graph.io).

Quick Start

No credentials needed — just install and configure your MCP client.

Configure your MCP client

adif-mcp works with any MCP-compatible client. Add the server config and restart. The tools appear automatically.

Claude Desktop

Add to claude_desktop_config.json (~/Library/Application Support/Claude/ on macOS, %APPDATA%\Claude\ on Windows):

{
  "mcpServers": {
    "adif": {
      "command": "uvx",
      "args": ["adif-mcp"]
    }
  }
}

Claude Code

Add to .claude/settings.json:

{
  "mcpServers": {
    "adif": {
      "command": "uvx",
      "args": ["adif-mcp"]
    }
  }
}

ChatGPT Desktop

Configure via Settings > Apps & Connectors, or in your agent definition:

{
  "mcpServers": {
    "adif": {
      "command": "uvx",
      "args": ["adif-mcp"]
    }
  }
}

Cursor

Add to .cursor/mcp.json (project-level) or ~/.cursor/mcp.json (global):

{
  "mcpServers": {
    "adif": {
      "command": "uvx",
      "args": ["adif-mcp"]
    }
  }
}

VS Code / GitHub Copilot

Add to .vscode/mcp.json in your workspace:

{
  "servers": {
    "adif": {
      "command": "uvx",
      "args": ["adif-mcp"]
    }
  }
}

Gemini CLI

Add to ~/.gemini/settings.json (global) or .gemini/settings.json (project):

{
  "mcpServers": {
    "adif": {
      "command": "uvx",
      "args": ["adif-mcp"]
    }
  }
}

Ask questions

"Is this ADIF record valid? CALL:5KI7MT<QSO_DATE:8>20260928BAND:320mMODE:3SSB"

"What values does the ADIF MODE enumeration allow for digital modes?"

"Parse my log file and show me the first 50 QSOs."

"How far is it from DN13 to JN48, and what heading should I point the beam?"

What the validator checks

adif-mcp ships ADIF 3.1.7 as ADIF publishes it: 186 fields, 25 enumerations and 28 data types. validate_adif_record checks each field against its ADIF data type and, for enumerated fields, against the enumeration:

  • Enumeration values match regardless of case, so LoTW's BAND=15M is accepted as 15m.

  • Import-only values (42 of the Mode enumeration's 91 entries, for example) give a warning, not an error: ADIF allows them on import but not in new records.

  • Compound values such as CREDIT_SUBMITTED (a list of Credit or Credit:Medium entries) are checked entry by entry.

  • SUBMODE must be a valid Submode; one that belongs to a different MODE gives a warning. FT4, for example, is MODE=MFSK with SUBMODE=FT4.

  • Structured types are checked against the grammar ADIF states for them: grid squares (2, 4, 6 or 8 characters, any case) and their extensions and lists (VUCC needs two or four, each four or six characters), Location (XDDD MM.MMM), Boolean (Y or N), and IOTA, WWFF, POTA and SOTA references. What the grammar allows but cannot be right, such as a latitude over 90 degrees or N/S on a longitude, is a warning, never an error.

The server also publishes the MCP resource adif://system/version: the service version and the ADIF specification version it serves.

MCP Inspector

adif-mcp --transport streamable-http --port 8003

Then open the MCP Inspector at http://localhost:8003.

Development

git clone https://github.com/qso-graph/adif-mcp.git
cd adif-mcp
uv sync --group dev
uv run pytest

License

adif-mcp's own code is GPL-3.0-or-later. See LICENSE for details.

The ADIF specification files are not ours. The package includes ADIF's published files for two versions, the previous and the current (3.1.6 and 3.1.7 today), unmodified: every file in ADIF's resource zip except its test material, in every format ADIF publishes (JSON, XML with all.xml and the XSD, CSV, TSV, XLSX, ODS), with a MANIFEST.json of their SHA-256s per version, from the ADIF Developers Group. They are ADIF's work, and our licence doesn't cover them. The only files in that folder that are ours are the derived Country enumeration and each version's MANIFEST.json. See NOTICE.

Available Tools

8 tools
calculate_distanceCalculate DistanceB
Read-onlyIdempotent

Calculates distance (km) between Maidenhead locators.

Inputs: end (required), start (required). Returns: result

calculate_headingCalculate HeadingB
Read-onlyIdempotent

Calculates heading (azimuth) between Maidenhead locators.

Inputs: end (required), start (required). Returns: result

get_version_infoGet Version InfoA
Read-onlyIdempotent

Returns the version of the ADIF-MCP server and spec.

Inputs: no named parameters. Returns: object

list_enumerationsList EnumerationsA
Read-onlyIdempotent

Lists the 26 enumerations: ADIF 3.1.7's 25 plus Country (derived).

Each entry's source says whether it is ADIF's own export or derived by adif-mcp, so a consumer loading reference tables can tell them apart.

Inputs: no named parameters. Returns: object

parse_adifParse AdifC
Read-onlyIdempotent

Streaming parser for large ADIF files with record seeking.

SECURITY NOTE: This tool reads files from the local filesystem using the provided path. Only pass paths to ADIF log files you own.

Inputs: file_path (required), limit, start_at.

read_specification_resourceRead Specification ResourceA
Read-onlyIdempotent

Reads an ADIF 3.1.7 specification resource (e.g., 'mode', 'fields', 'all').

An unknown or unreadable name is a tool execution error, so the model can see it failed and correct the name rather than being handed an error document that looks like a successful result.

Inputs: resource_name (required). Returns: result

search_enumerationsSearch EnumerationsC
Read-onlyIdempotent

Searches ADIF 3.1.7 enumerations. Optionally filter by enumeration name.

Inputs: search_term (required), enumeration. Returns: object

validate_adif_recordValidate Adif RecordB
Read-onlyIdempotent

Validates an ADIF record against 3.1.7 rules including enum membership.

Inputs: adif_string (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 8 tools

    Disambiguation4/5

    Most tools target distinct actions (parsing, validation, spec reading, geo math), and the list vs search enumeration pair is clarified by descriptions. The calculate_distance vs calculate_heading pair and read_specification_resource vs list_enumerations overlap slightly, but outputs are well differentiated.

    Naming Consistency5/5

    All tools follow a consistent snake_case verb_noun pattern (get_version_info, calculate_distance, parse_adif, list_enumerations, search_enumerations, validate_adif_record). No mixed conventions.

    Tool Count5/5

    Eight tools is well-scoped for an ADIF reference/validation server, with each tool covering a distinct capability (version, geo, parsing, spec, enumerations, validation). Nothing feels padded or missing for the stated purpose.

    Completeness4/5

    The read/validate/spec-reference surface is solid, covering parsing, validation, enumerations, and spec lookup. However, there is no write/export or record-modification tool, which is a noticeable but workable gap for an ADIF-focused server.

    Maintenance

    ActivityActive
    ResponsivenessUsually handled

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      A
      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
      126 PyPI
      GPL 3.0
    • A
      license
      A
      quality
      A
      maintenance
      MCP server for QRZ.com — callsign lookups, DXCC entity resolution, and logbook queries through any MCP-compatible AI assistant.
      6
      171 PyPI
      4
      GPL 3.0
    • A
      license
      A
      quality
      C
      maintenance
      Enables read-only access to Turbo HAMLOG amateur radio logs, allowing natural-language search and aggregation of contacts, station history, award progress, and statistics by importing logs from ADIF/CSV or HAMLOG.HDB via the DLL.
      9
      1
      MIT
    • A
      license
      A
      quality
      A
      maintenance
      Enables read-only querying of live and past amateur-radio nets and check-ins from NetLogger, with caching, rate limiting, and a consistent contract for future sources.
      6
      166 PyPI
      GPL 3.0