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: hamlog-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 ForA

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.

ParametersJSON Schema
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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose a genuinely non-obvious behavioral trait: results are entity-scoped with nothing broken out per ADIF subdivision, a domain limitation an agent could not infer from the schema. It does not state error behavior or confirm the read-only nature, but the output schema covers the return shape.

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?

It is short (two sentences) and every clause carries information, so there is little waste. The ordering is the problem: it leads with a mapping caveat before stating what the tool returns, which makes the first read harder than necessary.

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?

For a 2-parameter lookup with full schema coverage and an output schema, the description supplies the one non-obvious semantic (entity-level granularity) plus sibling routing, which is most of what an agent needs. Minor gaps remain around the exact treatment of a supplied subdivision.

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?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema by signaling that per-subdivision output is meaningless here ('nothing per subdivision'), which tells an agent not to expect the subdivision parameter to shape results. It still does not say whether subdivision is rejected, ignored, or simply unused.

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 identifies the resource (DOK codes resolved against a DXCC entity) and explicitly distinguishes itself from the sibling darc_dok_search, which handles districts/towns. However, the leading clause 'DOK lists don't map to ADIF subdivisions' and the vague verb 'this answers' force the reader to reconstruct the actual purpose from the tool name rather than reading a clean verb+resource statement.

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 names the alternative explicitly ('Use darc_dok_search for a district or town') and implies this tool is the entity-level path, which is a usable routing rule. It stops short of an explicit when-not/prerequisite statement (e.g. what happens if a caller does pass a subdivision), so it is clear context rather than full guidance.

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 LookupC

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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, and it discloses nothing about read-only semantics, error behavior for invalid codes, or result completeness. It only lists output fields, which the output schema already covers.

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 compact sentence that front-loads the DOK/special-DOK split and then lists the payload. It is efficient, though the colon-and-parenthetical construction reads more like schema notes than agent-facing guidance.

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 an output schema present, the return-value enumeration is largely redundant, so the description's main remaining job is disambiguation and edge-case behavior — both of which are absent. For a simple one-param lookup this is adequate but thin.

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 'code' parameter is documented with examples in the schema itself, so the baseline is 3. The description restates the DOK/special-DOK distinction but adds no format, casing, or validation detail beyond what the schema already says.

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 retrieval of a single code's details by enumerating the returned fields ('district and local club', 'purpose, callsign, validity window and sponsoring club'), but never states a verb or explicitly says 'look up one DOK'. The word 'One' hints at single-record scope versus the plural siblings (darc_dok_search, darc_dok_codes_for), but no sibling is named or contrasted.

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 statement of when this should be chosen over darc_dok_search or darc_dok_valid_on, and no mention of prerequisites or failure conditions for an unknown code. The agent must infer routing purely from the tool name.

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It implies a read-only inspection of list metadata (owner, edition, terms, file integrity hashes) but never explicitly states it's non-mutating, whether the call needs authorization, or whether results are cached or live. The SHA-256s hint at a verification/integrity use case, which is useful context, but for a zero-annotation tool this leaves meaningful gaps.

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 clause-packed sentence that front-loads the resource (the list) and its owner. No filler or repetition, though the dense clause list is slightly hard to parse on first read.

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?

The tool has an output schema, so the description is not obligated to detail the return shape, and the fields it enumerates (owner, edition, terms, file URLs and SHA-256s) align with what an output schema would expose. What's missing is operation framing – the description reads as a list of fields rather than an action – and any sibling differentiation.

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?

With zero parameters there is nothing to document, so the baseline is 4. The description appropriately doesn't discuss inputs, which is correct for a parameterless tool.

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?

Names the resource (a 'list' in the Darc Dok source) and enumerates specific data points: owner, served edition, terms, and owner's files' URLs and SHA-256s. This is more specific than a tautology, but it never names a verb or operation – is this a query? A fetch? – and it doesn't differentiate itself from siblings like darc_dok_lookup or get_version_info, which could plausibly return overlapping information.

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?

The description gives no when-to-use context and no comparison to alternatives. With five sibling tools, an agent has no signal for choosing this one without opening the schemas.

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

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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose non-obvious behavior: special DOKs only count inside DARC's published window, and merged DOKs surface replaced_by (with the A49→A12 example). It omits auth/error behavior, but for a read-style validation query the edge-case semantics are the important part.

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?

Three tight sentences, front-loaded with the core question, followed by two edge-case clarifications that each earn their place. Slightly dense phrasing in the special-DOK clause but no filler.

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?

For a two-parameter query with an output schema present, the description covers the semantics an agent needs and even foreshadows the replaced_by return field. Nothing essential is missing, though it could note what a false/invalid result implies.

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 parameters are already documented with examples and formats; baseline 3 applies. The description adds only marginal value by reinforcing that 'code' may be a DOK or a special DOK, which the schema already states.

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 check ('Whether a DOK ... was valid on a date') with the resource and the temporal dimension, which distinguishes it from siblings like darc_dok_lookup or darc_dok_search that fetch rather than validate. It does not explicitly name those siblings, but the verb+resource is unambiguous.

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 by the validity-check framing, so an agent can infer it wants this tool when the question is 'was code X valid on date Y'. There is no explicit when-to-use/when-not guidance and no pointer to alternatives such as darc_dok_lookup for plain code resolution.

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

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

Returns: service_name, service_version (PyPI), and spec_version (the owner's edition).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are supplied, but this is a zero-parameter, self-evidently side-effect-free read, so the burden is light. The description usefully clarifies what each returned value means (spec_version is the owner's edition), adding context beyond the field names, but says nothing about caching, freshness, or auth, and the output schema already enumerates the fields.

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 short sentences, purpose first and returns second, with no filler. Every clause carries information the agent can use.

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?

For a zero-arg version tool with an output schema, the description covers what an agent needs to select and call it. The only omission is a note on when in a workflow to call it, which is minor here.

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 no parameters, so by convention the baseline is 4. There is nothing for the description to compensate for.

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 and resource: retrieves the service's own version plus the edition of DARC's list it serves. That is clearly distinct in function from the lookup/search siblings, though the description never explicitly names them as alternatives. A reader knows exactly what this tool returns.

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 when-to-use guidance is given. Version/edition checks are conventionally diagnostic, but the description does not say so, nor does it contrast with darc_dok_source_info, which sounds like it could cover related metadata. The agent must infer the trigger condition.

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

Disambiguation4/5

Each tool serves a distinct role, but get_version_info and darc_dok_source_info both return service/list metadata, and darc_dok_lookup overlaps with darc_dok_valid_on since both take a DOK and could expose validity info. Descriptions do help clarify the boundaries.

Naming Consistency3/5

Four tools share a clean darc_dok_ prefix, but get_version_info breaks the pattern entirely, and within the prefix naming mixes verb-style (lookup, search) with noun-style (source_info, codes_for). Still readable, though conventions are not uniform.

Tool Count5/5

Six tools is well-scoped for a read-only reference dataset server: version, provenance, single lookup, search, entity mapping and date validity each earn their place without redundancy.

Completeness4/5

The surface covers provenance, discovery via search, single-code lookup, entity scoping and date-based validity—the core read-only lifecycle for reference data. A bulk/enumerate-all tool would round it out, but search largely compensates.

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.
    -
  • 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.
    1
    Apache 2.0