Skip to main content
Glama
qso-graph

iota-mcp

by qso-graph

iota-mcp

PyPI MCP Registry

MCP server for Islands on the Air (IOTA) — group lookup, island search, DXCC mapping, nearby groups, and programme statistics through any MCP-compatible AI assistant.

Part of the qso-graph project. No authentication required — all IOTA data is public.

Install

uvx iota-mcp            # run it; nothing to install

Related MCP server: qrz-mcp

Tools

Tool

Description

iota_lookup

Look up an IOTA group by reference number (e.g., NA-005)

iota_search

Search groups and islands by name (e.g., Hawaii, Shetland)

iota_islands

List all islands and subgroups in an IOTA group

iota_dxcc

Bidirectional DXCC-to-IOTA mapping

iota_stats

Programme summary — totals by continent, most/least credited

iota_nearby

Find IOTA groups nearest to a lat/lon location

get_version_info

Service version + upstream programme data version (fleet identity attestation)

Quick Start

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

Configure your MCP client

iota-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": {
    "iota": {
      "command": "uvx",
      "args": ["iota-mcp"]
    }
  }
}

Claude Code

Add to .claude/settings.json:

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

ChatGPT Desktop

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

Cursor

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

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

VS Code / GitHub Copilot

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

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

Gemini CLI

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

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

Ask questions

"Look up IOTA group NA-005"

"Search for islands named Shetland"

"What IOTA groups are near Boise, Idaho?"

"Show me all islands in EU-005"

"What IOTA references map to DXCC 291?"

"Give me IOTA programme statistics"

Data Source

Data comes from the official IOTA website JSON downloads:

  • fulllist.json — complete group/subgroup/island hierarchy (~1.3 MB)

  • dxcc_matches_one_iota.json — 1:1 DXCC-to-IOTA mapping (~3.5 KB)

Data is downloaded once and cached for 24 hours (IOTA refreshes daily at 00:00 UTC).

Testing Without Network

IOTA_MCP_MOCK=1 iota-mcp

MCP Inspector

iota-mcp --transport streamable-http --port 8010

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

Development

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

License

GPL-3.0-or-later

Available Tools

7 tools
get_version_infoGet Version InfoA
Read-onlyIdempotent

Get iota-mcp service version and upstream programme data version.

Returns the running PyPI version of iota-mcp and the IOTA programme data revision in use. Use this to confirm fleet alignment across MCP deployments — agents can compare service_version and spec_version across servers to detect drift without going outside the MCP protocol.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/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 covered. The description adds genuine context beyond that: the operation is a lightweight, MCP-protocol-internal check suitable for cross-server drift comparison, which tells an agent it needs no external IOTA API round-trip.

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?

Purpose is front-loaded in the first clause, and the second paragraph gives the operational rationale. There is mild redundancy between 'iota-mcp service version and upstream programme data version' and the restatement as 'running PyPI version ... and IOTA programme data revision in use', but nothing wasteful overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter, read-only version probe with full annotations and an output schema, the description supplies everything needed: what is returned, why an agent would call it, and that it stays within the MCP protocol.

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?

Zero-parameter tool with 100% schema coverage, so the baseline is 4. The description usefully identifies the two outputs (service_version, spec_version) even though the output schema already documents them.

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

Purpose5/5

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

States a specific verb and resource ('Get iota-mcp service version and upstream programme data version') and names the two returned fields, which no sibling tool (iota_lookup, iota_search, etc.) offers. An agent can immediately separate this diagnostics call from the data-lookup siblings.

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?

Gives a concrete use case: confirm fleet alignment across MCP deployments and compare service_version/spec_version to detect drift. It does not explicitly exclude scenarios or name an alternative tool, but for a zero-argument diagnostic the context is clear enough to select it correctly.

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

iota_dxccIota DxccA
Read-onlyIdempotent

Bidirectional DXCC-to-IOTA mapping.

Provide either dxcc_num to find all IOTA groups for a DXCC entity, or refno to find which DXCC entities an IOTA group belongs to.

NameRequiredDescriptionDefault
refnoNoIOTA reference number (e.g., EU-005).
dxcc_numNoDXCC entity number (e.g., 291 for USA, 223 for England).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive, open-world behavior. The description adds useful behavioral context by tying each parameter to a different result direction, though it does not clarify precedence when both or neither parameters are supplied.

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 front-load the bidirectional mapping purpose and then explain parameter selection. There is no redundant or filler text.

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 annotations, full schema coverage, and an output schema, the description is nearly complete for invocation. The only notable gap is that it does not specify behavior when both parameters are provided or when neither is provided.

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 meaning beyond the schema by stating what each parameter returns: all IOTA groups for dxcc_num, or DXCC entities for refno. Examples and format details remain in the schema.

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

Purpose5/5

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

The description states a specific resource and operation: bidirectional DXCC-to-IOTA mapping. It clearly explains both directions of the mapping, which distinguishes it from generic sibling lookup/search tools.

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 tells the agent which parameter to provide for each lookup direction: dxcc_num for DXCC-to-IOTA, refno for IOTA-to-DXCC. It does not name sibling alternatives or exclusions, but the primary usage path is clear.

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

iota_islandsIota IslandsA
Read-onlyIdempotent

List all islands and subgroups in an IOTA group.

Returns the full hierarchy: subgroups containing individual islands.

NameRequiredDescriptionDefault
refnoYesIOTA reference number (e.g., NA-005, EU-005).

Output 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?

Annotations already declare readOnly, idempotent, non-destructive and open-world behavior, so safety is covered. The description adds that results come back as a nested hierarchy (subgroups containing islands), which is useful shape information, but says nothing about depth, ordering, or empty results.

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?

Two short sentences, front-loaded with the action and scope, with no wasted filler. The second sentence is mildly redundant with the first but does add the nesting detail.

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 annotations covering the safety profile and an output schema present, the description needn't explain return values. What it provides—action, scope, and hierarchy shape—is sufficient for an agent to call this correctly; only the relationship to sibling lookup tools is left implicit.

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?

There is a single parameter with 100% schema description coverage, and the description adds no further meaning about the refno format or constraints beyond what the schema provides. Baseline 3 for full schema coverage with no added parameter context.

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 names a specific verb (List) and resource (islands and subgroups in an IOTA group) and clarifies the returned structure as a hierarchy. It is clearly distinguishable from siblings like iota_lookup or iota_stats, though it does not explicitly name those alternatives to sharpen the distinction.

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: an agent can infer you call this when you need the island/subgroup breakdown for a group identified by refno. There is no explicit statement of when to prefer this over iota_lookup or iota_search, and no exclusions or prerequisites.

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

iota_lookupIota LookupA
Read-onlyIdempotent

Look up an IOTA group by reference number.

Returns group details including name, DXCC entity, bounding box, center coordinates, credit percentage, and island count.

NameRequiredDescriptionDefault
refnoYesIOTA reference number (e.g., NA-005, EU-005, AF-001).

Output 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?

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description's field list ('name, DXCC entity, bounding box, center coordinates...') largely duplicates what the existing output schema conveys, and it says nothing about error behavior for an invalid or nonexistent reference number.

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?

Two short sentences, front-loaded with the action and the key. The enumerated return fields are somewhat redundant given the output schema, which is the only minor waste.

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 one-parameter exact lookup with a full annotation set and an output schema, the description covers action, key, and result shape adequately. The remaining gap is routing guidance relative to iota_search, which would be the main thing missing for an agent choosing between 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 coverage is 100% and the single 'refno' parameter already carries a format example (NA-005, EU-005, AF-001). The description adds no format, casing, or validation detail beyond the schema, so the baseline 3 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+resource combination: look up an IOTA group by reference number, and the 'by reference number' qualifier implicitly separates it from the sibling iota_search. It stops short of naming iota_search explicitly, so the differentiation is inferred rather than stated.

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 reference number' signals an exact-key lookup, which contrasts with iota_search, and the presence of iota_nearby/iota_islands suggests other access paths. No sentence states when to prefer this tool or what to do if the refno is unknown.

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

iota_nearbyIota NearbyA
Read-onlyIdempotent

Find IOTA groups nearest to a location.

Computes great-circle distance from the given coordinates to the center of each IOTA group's bounding box.

NameRequiredDescriptionDefault
limitNoMaximum results to return (default 20).
latitudeYesLatitude in decimal degrees (e.g., 43.6 for Boise).
longitudeYesLongitude in decimal degrees (e.g., -116.2 for Boise).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds genuinely useful behavioral detail by disclosing the algorithm — great-circle distance to each group's bounding-box center — which tells the agent results are approximations, not exact polygon distances. It stops short of stating result ordering, which matters for interpreting `limit`.

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: the purpose is front-loaded and the second sentence exists solely to explain the distance computation, which directly affects how results should be read. No filler, no repetition of schema or annotation content.

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 no explanation, and annotations cover the safety profile. The only material omission is whether results are sorted by distance and what happens when fewer than `limit` groups exist — useful for a proximity tool but not required to invoke it correctly.

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 latitude, longitude, and limit are already fully documented with units and an example. The description's "given coordinates" merely restates the schema; baseline 3 applies when the schema carries parameter meaning.

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 ("Find IOTA groups") plus a qualifying scope ("nearest to a location"), which clearly separates it from lookup/search/islands siblings that are name- or criteria-based. It does not explicitly name an alternative, so the differentiation is implicit rather than stated.

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: an agent infers it should call this when it has coordinates and wants proximity-ranked IOTA groups. There is no explicit when-to-use/when-not guidance and no mention of the sibling tools (iota_search, iota_lookup) as alternatives for non-geographic queries.

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

iota_statsIota StatsA
Read-onlyIdempotent

Get IOTA programme summary statistics.

Returns total groups and islands, breakdown by continent, DXCC entity count, and most/least credited groups.

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 readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety and reproducibility are covered. The description adds value by disclosing the actual content of the payload (totals, continent breakdown, DXCC count, most/least credited groups), but says nothing about data provenance, freshness, or cost of the open-world call.

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 sentences, front-loaded with the purpose and followed by a compact enumeration of return categories. No filler, no restatement of the tool name.

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?

A no-parameter tool with an output schema and full annotation coverage needs little, and the description supplies the only missing piece — the shape of the summary. Minor gap: no note on what population or version of the IOTA programme the statistics reflect.

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?

Zero parameters, so the baseline of 4 applies; there is nothing for the description to disambiguate and it correctly makes no parameter claims.

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?

Specific verb ('Get') plus a clearly scoped resource ('IOTA programme summary statistics'), with the returned fields enumerated. It is obviously distinct from the sibling tools (iota_lookup, iota_search, iota_nearby) which all target individual records rather than aggregate counts, though it never names them 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: the word 'summary' signals this is for aggregate/overview needs rather than per-record queries, but there is no explicit statement of when to prefer it over iota_search or iota_islands, and no prerequisites or exclusions are given.

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. 7 tool updatesv0.1.2
    • First observedget_version_info
    • First observediota_dxcc
    • First observediota_islands
    • First observediota_lookup
    • First observediota_nearby
    • First observediota_search
    • First observediota_stats

TDQS

A3.9/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: version metadata, reference lookup, name search, island hierarchy, statistics, DXCC mapping, and proximity search. The only plausible overlap is lookup versus search, but they are separated by reference number versus name, and the descriptions make the boundary clear.

Naming Consistency4/5

Six tools share a predictable iota_ prefix and are readable together, though the pattern is noun-oriented rather than a strict verb_noun convention. get_version_info is a minor deviation as a meta tool with a different prefix, but it is clear and not confusing.

Tool Count5/5

Seven tools is well scoped for a read-only IOTA reference server. Each tool covers a meaningful operation, and there are no redundant or filler endpoints.

Completeness4/5

The surface covers lookup by reference, search by name, island hierarchy, DXCC mapping, proximity search, statistics, and version metadata. Minor gaps such as listing or filtering all groups without a name query are workable through existing search and mapping tools.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

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
    586 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
    575 PyPI
    4
    GPL 3.0
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for Parks on the Air (POTA) providing live activator spots, park details, activator/hunter stats, and scheduled activations through any MCP-compatible AI assistant.
    11
    612 PyPI
    3
    GPL 3.0
  • A
    license
    B
    quality
    A
    maintenance
    MCP server for Summits on the Air (SOTA) — live spots, activation alerts, summit info, and nearby summits through any MCP-compatible AI assistant.
    5
    571 PyPI
    1
    GPL 3.0