darc-dok-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@darc-dok-mcpWhich club is DOK A01?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
darc-dok-mcp
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 installRelated MCP server: arma-mcp
Tools
Tool | Description | Key Parameters |
| One DOK or special DOK: district and club, or purpose, callsign, window and sponsoring club | code |
| Whether a DOK or special DOK was valid on a QSO's date | code, on_date |
| Find DOKs by club, town, district or purpose | text, limit |
| Kept for the shared tool set; DOKs map to no ADIF subdivision | dxcc, subdivision |
| Owner, editions, terms, and the owner's files' URLs and SHA-256s | — |
| 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 8018Then 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 pytestscripts/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 toolsdarc_dok_codes_forDarc Dok Codes ForBRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| dxcc | Yes | ADIF DXCC entity code (e.g. 291 for the United States, 1 for Canada). | |
| subdivision | No | ADIF Primary_Administrative_Subdivision code, e.g. "QC" or "AZ". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 LookupBRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | A DOK (e.g. A01) or special DOK (e.g. 1000ER). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_searchDarc Dok SearchBRead-onlyIdempotent
Find codes whose name, prefixes, area wording or attributes contain every word of text.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Words to look for, e.g. "Konstanz", "Baden" or "Jubiläum". | |
| limit | No | Most records to return (1 to 200, default 50). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, closed-world behavior, so the description only needs to add matching semantics, which it does with the "every word" AND constraint. It says nothing about result ordering, relevance ranking, or what happens on zero matches, but that is a modest gap given 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the matched fields and the matching rule front-loaded; zero waste. It is extremely terse, but nothing in it is redundant or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and fully described params, the description covers the core matching behavior adequately. It leaves out sibling routing and result-set expectations (ordering, limits behavior), which matter for a search tool in a family of five siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already documents both params, so baseline is 3. The description adds the key semantic that all words must match (AND, not OR), which the schema's "Words to look for" does not make explicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ("Find codes") plus the matched fields (name, prefixes, area wording, attributes), so an agent knows it is a text search over code records. It does not name or contrast with siblings like darc_dok_lookup or darc_dok_codes_for, so the differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance, and no mention of the sibling tools that might be better choices for lookup or code retrieval. The agent must infer that this is the free-text search entry point.
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 InfoBRead-onlyIdempotent
Who owns this list, which edition is served, its terms, and the owner's files' URLs and SHA-256s.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 OnARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | A DOK (e.g. A01) or special DOK (e.g. 1000ER). | |
| on_date | Yes | The date, YYYY-MM-DD. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 InfoARead-onlyIdempotent
Get darc-dok-mcp's version and the edition of DARC's list it serves.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
v0.1.0- First observed
darc_dok_codes_for - First observed
darc_dok_lookup - First observed
darc_dok_search - First observed
darc_dok_source_info - First observed
darc_dok_valid_on - First observed
get_version_info
TDQS
Scored across 6 tools
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.
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.
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.
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
Related MCP Connectors
Offline, keyless lookup of the US civil aircraft registry — decode N-numbers, search records.
Offline US medical code lookup and crosswalk — ICD-10-CM/PCS, HCPCS Level II, RxNorm. Keyless.
WHO ICD-10/ICD-11 diagnosis codes. Lookup, search, chapters via official WHO API.
Look up ISO 20022 messages, bank transaction codes, legacy MT replacements, schemes and code sets.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables 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.91MIT
- FlicenseNot gradedqualityBmaintenanceProvides 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-
- AlicenseNot gradedqualityAmaintenanceEnables 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 npm1Apache 2.0
- AlicenseAqualityAmaintenanceEnables 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.6165 PyPIGPL 3.0