Adif Mcp

io.github.qso-graphPublished by GitHub account qso-graphv2.1.1Updated Nov 3, 2026

ADIF 3.1.7 spec engine for amateur radio logs: validation, parsing, enumerations, geospatial.

VerifiedSTDIODesktop onlyDeveloper ToolsData & Analytics

Overview

AI-generated overview

Local MCP server for the ADIF 3.1.7 amateur radio log format: validates and parses ADIF records, searches spec enumerations, and computes distance and heading…

What you can do
  • Validate a raw ADIF record against ADIF 3.1.7 rules, including enumeration membership and structured types
  • Parse large ADIF log files with a streaming parser and pagination
  • Read specification resources and list or search the 25 ADIF enumerations plus a derived Country table
  • Calculate great-circle distance and beam heading between two Maidenhead locators
  • Report the server version and the bundled ADIF spec version
When to use it
Useful when an assistant needs to check or explore amateur radio logs: confirming a QSO record is valid, looking up allowed MODE or BAND values, paging through a large ADIF export, or working out distance and beam heading between grid squares.
Requirements
Runs as a local process, typically launched with uvx from the adif-mcp PyPI package, so a Python/uv runtime is needed. No authentication, API keys or environment variables; the ADIF specification is bundled and it works offline.
Before you install
parse_adif reads files from the local filesystem by path, so only point it at ADIF log files you own. Validation reports warnings rather than errors for import-only values and implausible-but-grammatical values, so a pass does not guarantee a clean record.

Installation

In SourceWeft

  1. Open Adif Mcp in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

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

bash
uvx adif-mcp            # run it; nothing to install

Tools

ToolDescriptionKey Parameters
validate_adif_recordValidate a raw ADIF record against the 3.1.7 specadif_string
parse_adifStreaming parser for large ADIF files, with paginationfile_path, start_at, limit
read_specification_resourceRaw JSON for any spec module (band, mode, fields, ...)resource_name
list_enumerationsAll ADIF enumerations with entry counts—
search_enumerationsSearch enumeration records by keywordsearch_term, enumeration
calculate_distanceGreat-circle distance (km) between two Maidenhead locatorsstart, end
calculate_headingInitial beam heading (azimuth) between two locatorsstart, end
get_version_infoService 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):

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

Add to .claude/settings.json:

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

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

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

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

json
{  "mcpServers": {    "adif": {      "command": "uvx",      "args": ["adif-mcp"]    }  }}
VS Code / GitHub Copilot

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

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

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

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

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

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

Development

bash
git clone https://github.com/qso-graph/adif-mcp.gitcd adif-mcpuv sync --group devuv 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.

Source: README.md at commit 8614aab

Tools

8

get_version_info

Get Version Info

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

Takes no parameters.

calculate_distance

Calculate Distance

Calculates distance (km) between Maidenhead locators.

Parametersendrequiredstartrequired

calculate_heading

Calculate Heading

Calculates heading (azimuth) between Maidenhead locators.

Parametersendrequiredstartrequired

parse_adif

Parse Adif

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.

Parameterslimitstart_atfile_pathrequired

read_specification_resource

Read Specification Resource

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.

Parametersresource_namerequired

list_enumerations

List Enumerations

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.

Takes no parameters.

search_enumerations

Search Enumerations

Searches ADIF 3.1.7 enumerations. Optionally filter by enumeration name.

Parametersenumerationsearch_termrequired

validate_adif_record

Validate Adif Record

Validates an ADIF record against 3.1.7 rules including enum membership.

Parametersadif_stringrequired

Version history

11
  1. v2.1.1LatestOct 29, 2026
  2. v2.1.0Oct 26, 2026
  3. v2.0.3Oct 26, 2026
  4. v2.0.0Oct 12, 2026
  5. v1.3.0Oct 12, 2026
  6. v1.2.3Oct 11, 2026
  7. v1.2.2Oct 11, 2026
  8. v1.2.1Oct 7, 2026
  9. v1.2.0Oct 6, 2026
  10. v1.1.4Sep 29, 2026
  11. v0.9.3Sep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts