Skip to main content
Glama
qso-graph

darc-dok-mcp

by qso-graph

darc-dok-mcp

PyPI MCP Registry

Source: the Deutscher Amateur-Radio-Club e.V. (DARC): the DOK-Liste (DARC DX-Referat, by Karsten Radwan, DL2ABM, 26.12.2016) and the special-DOK list (DARC SDOK-Referat). DOKs are DARC's: this package serves the lists' rows as facts, each citing its page or row, and links to DARC's files rather than copying them. Our GPL-3.0 licence covers our code, not DARC's data.

MCP server for DARC DOKs and special DOKs as DARC publishes them: the local-club codes of DARC's DOK-Liste (2016-12-26) and the event codes of DARC's special-DOK list, with each special DOK's validity window. DOKs are used for DARC's DLD award, the DOK best-lists and the WAG contest, and in ADIF's DARC_DOK field.

Part of the qso-graph project. No network, no authentication: the facts from the owner's list ship with the package, and every answer names its source.

Install

uvx darc-dok-mcp            # run it; nothing to install

Related MCP server: arma-mcp

Tools

Tool

Description

Key Parameters

darc_dok_lookup

One DOK or special DOK: district and club, or purpose, callsign, window and sponsoring club

code

darc_dok_valid_on

Whether a DOK or special DOK was valid on a QSO's date

code, on_date

darc_dok_search

Find DOKs by club, town, district or purpose

text, limit

darc_dok_codes_for

Kept for the shared tool set; DOKs map to no ADIF subdivision

dxcc, subdivision

darc_dok_source_info

Owner, editions, terms, and the owner's files' URLs and SHA-256s

—

get_version_info

Service version + the owner's edition served (fleet identity attestation)

—

Quick Start

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

Configure your MCP client

darc-dok-mcp works with any MCP-compatible client. Add the server config and restart — tools appear automatically.

Claude Desktop

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

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

Claude Code

Add to .claude/settings.json:

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

ChatGPT Desktop

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

Cursor

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

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

VS Code / GitHub Copilot

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

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

Gemini CLI

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

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

Ask questions

"Which club is DOK A01?"

"Was special DOK 01ALT valid on 2004-06-01?"

"Which DOKs are in district Baden?"

MCP Inspector

darc-dok-mcp --transport streamable-http --port 8018

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

Development

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

scripts/fetch_published.py fetches the owner's document(s) into published/ (not committed) and checks their SHA-256s; uv run pytest --live runs the tests that need them. scripts/build.py regenerates derived/ and load.sql, a PostgreSQL load for QSO Graph's reference data (load QG ADIF's adif schema first).

License

darc-dok-mcp's own code is GPL-3.0-or-later. See LICENSE. The data it serves is the owner's, credited at the top of this page: our licence doesn't cover it, and we claim no rights in it. The owner's document itself is not included; data/SOURCE.json records its URL and SHA-256 so anyone can check the facts against it. Files we built from the facts (data/derived/) are ours and labelled as ours. How the owner's text was read is recorded in docs/TRANSCRIPTION.md. See NOTICE.

Available Tools

6 tools
darc_dok_codes_forDarc Dok Codes ForB
Read-onlyIdempotent

DOK lists don't map to ADIF subdivisions: this answers for entity 230 (Germany) with nothing per subdivision. Use darc_dok_search for a district or town.

NameRequiredDescriptionDefault
dxccYesADIF DXCC entity code (e.g. 291 for the United States, 1 for Canada).
subdivisionNoADIF Primary_Administrative_Subdivision code, e.g. "QC" or "AZ".

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive behavior, and a closed-world scope. The description adds useful domain context that DOK lists do not map to ADIF subdivisions, but it does not clarify output behavior or edge cases beyond that caveat.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and contains no obvious filler, but it opens with a caveat rather than a front-loaded statement of what the tool does. The second sentence is more useful than the first for tool selection.

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?

An output schema exists and annotations cover safety traits, so return values and mutability need not be explained. However, the description remains ambiguous about the tool's exact output domain and does not fully distinguish it from all siblings.

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 both dxcc and subdivision are already documented in the schema. The description adds only an example entity and a caveat about subdivision mapping, without adding syntax or format details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description implies the tool returns entity-level DOK codes and distinguishes itself from darc_dok_search, but it never explicitly states a clear verb and resource such as 'returns DOK codes for a DXCC entity.' The phrase 'this answers for entity 230 (Germany) with nothing per subdivision' is vague and relies heavily on the tool name.

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?

It explicitly names an alternative, darc_dok_search, and gives the condition for using it: 'for a district or town.' That is clear routing guidance, though it does not address when to use other siblings like darc_dok_lookup or darc_dok_valid_on.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

darc_dok_lookupDarc Dok LookupB
Read-onlyIdempotent

One DOK or special DOK: the district and local club (DOKs), or the purpose, callsign, validity window and sponsoring club (special DOKs), with the citation.

NameRequiredDescriptionDefault
codeYesA DOK (e.g. A01) or special DOK (e.g. 1000ER).

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as a read-only, idempotent, non-destructive, closed-world lookup, so the safety profile is covered. The description adds useful context about what is returned, including the citation, but does not describe not-found behavior or any other runtime traits beyond the annotations and output schema.

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 definition is a single sentence with no wasted preamble. The colon-and-parenthetical structure is slightly awkward, but it is appropriately sized for a simple lookup tool.

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 the robust annotations, an output schema, and 100% schema description coverage for the sole parameter, the description supplies enough context for a simple lookup tool. Its main remaining gap is the lack of sibling routing guidance, which is already penalized under usage guidelines.

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% and the single parameter is well documented with DOK and special-DOK examples. The description reinforces the one-code lookup model but adds no syntax or format detail 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 makes clear that this is a lookup for a single DOK or special DOK and specifies the kinds of data returned for each: district/local club for DOKs, and purpose/callsign/validity/sponsor for special DOKs. The verb is implicit rather than explicit, and it does not distinguish itself from siblings such as darc_dok_search or darc_dok_valid_on.

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?

There is no explicit guidance about when to use this lookup versus the sibling tools, nor any when-not conditions. The phrase 'One DOK or special DOK' implies a single-code lookup, but the agent receives no routing help among darc_dok_search, darc_dok_codes_for, darc_dok_valid_on, and this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

darc_dok_source_infoDarc Dok Source InfoB
Read-onlyIdempotent

Who owns this list, which edition is served, its terms, and the owner's files' URLs and SHA-256s.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered. The description adds useful content scope (provenance, licensing terms, file hashes) but nothing beyond that — no note on caching, freshness, or whether the terms are authoritative. It does not contradict the annotations.

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?

A single tight sentence with no filler, and the most useful item (ownership) leads. It loses a point because the fragmentary noun-phrase form leaves the leading action implicit rather than front-loading what the call does.

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?

With zero params, full annotation coverage and an output schema, the definition is close to self-sufficient — return values and safety are handled elsewhere. What is still missing is the connective tissue: what 'this list' refers to and why an agent would call this alongside darc_dok_lookup or get_version_info.

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?

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-arg tool applies. The listed return fields are informative but belong to the output schema, which already exists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is a noun phrase listing the data returned (owner, edition, terms, file URLs and SHA-256s) rather than a verb stating what the tool does. It conveys the subject matter but never says explicitly 'retrieves source/ownership metadata for the DARC DOK list,' and 'this list' is an unresolved referent. It also does not distinguish it from get_version_info, which plausibly overlaps with 'which edition is served.'

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?

There is no when-to-use guidance, no alternatives named, and no exclusion of the sibling lookup/search/version tools. The agent must infer from the tool name alone that this is a metadata/provenance call rather than a data lookup.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

darc_dok_valid_onDarc Dok Valid OnA
Read-onlyIdempotent

Whether a DOK or special DOK was valid on a date: a special DOK counts only inside the window DARC published for it. A DOK merged into another (e.g. A49, merged into A12 in 2001) shows replaced_by.

NameRequiredDescriptionDefault
codeYesA DOK (e.g. A01) or special DOK (e.g. 1000ER).
on_dateYesThe date, YYYY-MM-DD.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds genuine domain behavior beyond that: window-bounded validity for special DOKs and the replaced_by signal for merged codes, which is the kind of nuance an agent could not get from annotations alone.

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?

Two tight sentences with no filler, front-loading the core question and then the two edge-case behaviors. Every clause carries information an agent needs.

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?

With an output schema present, return values need not be explained, and the description supplies enough domain context for a 2-parameter read tool. A brief pointer to how a false result differs from an unknown code would make it fully complete.

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 both code and on_date are already documented with examples and the YYYY-MM-DD format, making the baseline 3. The description adds framing about special DOK codes but no new syntax or constraint detail 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 states a specific predicate (validity of a DOK/special DOK on a date) and clarifies two non-obvious domain rules: special DOKs are valid only within the published window, and merged codes expose replaced_by. An agent can tell this is a point-in-time validity check rather than a lookup or search, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the phrasing 'whether ... was valid on a date'; there is no explicit when-to-use, when-not-to-use, or routing against darc_dok_lookup, darc_dok_codes_for, or darc_dok_search. The agent must infer that this is the tool for temporal validity questions versus general code retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_version_infoGet Version InfoA
Read-onlyIdempotent

Get darc-dok-mcp's version and the edition of DARC's list it serves.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, closed-world and non-destructive, so the safety profile is fully covered. The description adds that the result includes which edition of DARC's list is being served, which is useful context beyond the annotations, but nothing about response shape or freshness.

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?

One short sentence that front-loads the verb and the two returned facts. Nothing extraneous.

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?

An output schema exists, so return values needn't be spelled out. Combined with full annotation coverage and no parameters, the description supplies everything an agent needs to decide to call it.

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?

There are zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies.

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?

States a specific verb ('Get') and two specific resources: the tool server's version and the edition of DARC's list it serves. That is clearly distinct from the lookup/search siblings, though the description doesn't explicitly name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied (a diagnostic/version probe) rather than stated. There are no exclusions or prerequisites, but for a zero-parameter metadata tool the implied use case is fairly unambiguous.

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.1.0
    • First observeddarc_dok_codes_for
    • First observeddarc_dok_lookup
    • First observeddarc_dok_search
    • First observeddarc_dok_source_info
    • First observeddarc_dok_valid_on
    • First observedget_version_info

TDQS

B3.4/5.0

Scored across 6 tools

Disambiguation3/5

Several pairs have unclear boundaries: get_version_info and darc_dok_source_info both report the served edition, and darc_dok_lookup overlaps with both darc_dok_valid_on (validity window) and darc_dok_codes_for, since lookup already returns validity windows for special DOKs. The descriptions are rich enough to mostly sort it out, but an agent must read carefully to choose between lookup, search, and codes_for.

Naming Consistency4/5

Five tools follow a clean darc_dok_<verb/preposition> snake_case pattern (lookup, search, valid_on, codes_for, source_info). get_version_info breaks the prefix convention, a minor but noticeable deviation.

Tool Count4/5

Six tools is well-scoped for a read-only reference lookup server. The only redundancy is the version/source-info pair, which could arguably be one tool.

Completeness4/5

The surface covers point lookup, free-text search, date-validity, entity-level code listing, provenance/citation, and version info, which is solid for a static reference dataset. A reverse listing of all DOKs within a district is only indirectly available via search, a minor gap.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • 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
  • F
    license
    Not graded
    quality
    B
    maintenance
    Provides offline, read-only access to Bohemia Interactive scripting documentation—SQF commands, functions, event handlers, and config classnames—across OFP and Arma 1/2/3, with search, comparison, and SQF validation against game/version availability.
    1
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables querying a local SQLite index of FCC ULS licensing data to look up licenses by callsign, licensee, or FRN, find licensed transmitter sites near a coordinate, and see who is authorized on a frequency or band. Runs over STDIO or Streamable HTTP with no API key required at request time.
    70 npm
    1
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    Enables querying WAZ zone definitions, mapping ADIF DXCC entities and subdivisions to zone codes, searching zones by name or prefix, and checking zone validity with source citations. Runs locally without network access or authentication.
    6
    165 PyPI
    GPL 3.0