iota-mcp
Provides tools for looking up IOTA groups, searching islands, mapping DXCC, and retrieving programme statistics, usable through GitHub Copilot in VS Code.
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., "@iota-mcpShow me all islands in EU-005"
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.
iota-mcp
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
pip install iota-mcpRelated MCP server: qrz-mcp
Tools
Tool | Description |
| Look up an IOTA group by reference number (e.g., NA-005) |
| Search groups and islands by name (e.g., Hawaii, Shetland) |
| List all islands and subgroups in an IOTA group |
| Bidirectional DXCC-to-IOTA mapping |
| Programme summary — totals by continent, most/least credited |
| Find IOTA groups nearest to a lat/lon location |
| 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": "iota-mcp"
}
}
}Claude Code
Add to .claude/settings.json:
{
"mcpServers": {
"iota": {
"command": "iota-mcp"
}
}
}ChatGPT Desktop
{
"mcpServers": {
"iota": {
"command": "iota-mcp"
}
}
}Cursor
Add to .cursor/mcp.json (project-level) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"iota": {
"command": "iota-mcp"
}
}
}VS Code / GitHub Copilot
Add to .vscode/mcp.json in your workspace:
{
"servers": {
"iota": {
"command": "iota-mcp"
}
}
}Gemini CLI
Add to ~/.gemini/settings.json (global) or .gemini/settings.json (project):
{
"mcpServers": {
"iota": {
"command": "iota-mcp"
}
}
}Example Prompts
"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).
Development
git clone https://github.com/qso-graph/iota-mcp.git
cd iota-mcp
pip install -e .
# Run with mock data (no network)
IOTA_MCP_MOCK=1 python -m iota_mcp.server
# Run with MCP Inspector
iota-mcp --transport streamable-http --port 8010
# Security tests
pip install pytest
pytest tests/test_security.py -vLicense
GPL-3.0-or-later
Available Tools
7 toolsget_version_infoA
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.
Returns: service_name, service_version (PyPI), and spec_version (IOTA programme data).
| 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?
With no annotations, the description carries full burden. It explicitly discloses that this is a read operation (get) and specifies the exact return fields (service_name, service_version, spec_version). No destructive behavior is implied.
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 three sentences long: first sentence states the core purpose, second provides a use case, third lists return values. Every sentence adds value with no redundancy or filler.
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 zero parameters and an output schema present, the description provides sufficient context: what the tool does, why to use it, and what it returns. It is complete for a version info tool without missing details.
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 no parameters, so schema coverage is 100%. The description does not need to cover param semantics, but it adds value by detailing the output fields, which helps the agent understand what the tool returns without needing the output 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 clearly states 'Get iota-mcp service version and upstream programme data version', specifying the exact resources and operation. It distinguishes itself from sibling tools like iota_dxcc or iota_search by focusing on version information.
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?
The description provides a clear use case: 'confirm fleet alignment across MCP deployments'. It explains when to use (to detect drift) but lacks explicit guidance on when not to use or alternatives, though the sibling tools cover different IOTA functions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iota_dxccA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dxcc_num | No | DXCC entity number (e.g., 291 for USA, 223 for England). | |
| refno | No | IOTA reference number (e.g., EU-005). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the burden of behavioral disclosure. It explains the bidirectional nature and conditional usage, but does not specify behavior when both parameters are provided, when none are provided, or any side effects, authentication requirements, or rate limits.
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 only two sentences, front-loaded with the core purpose. Every sentence adds value with no redundancy or waste. It is appropriately concise.
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 existence of an output schema, the description does not need to detail return values. It adequately covers the two modes of operation. However, it lacks guidance on handling invalid inputs (e.g., both parameters provided or none), which slightly reduces completeness.
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?
Input schema already has 100% description coverage with examples. The tool description adds functional meaning by clarifying the direction of mapping for each parameter ('find all IOTA groups for a DXCC entity' vs 'find which DXCC entities an IOTA group belongs to'), which goes beyond the schema's brief descriptions.
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 clearly states the tool's purpose: bidirectional mapping between DXCC entities and IOTA groups. It specifies two distinct use cases (dxcc_num or refno) and uses a specific verb (mapping) that distinguishes it from sibling tools like general lookup or search.
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?
The description provides clear usage conditions: use dxcc_num to find IOTA groups or refno to find DXCC entities. It implies the tool should be used when such bidirectional mapping is needed, though it does not explicitly mention when not to use it or compare with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iota_islandsA
List all islands and subgroups in an IOTA group.
Returns the full hierarchy: subgroups containing individual islands.
| Name | Required | Description | Default |
|---|---|---|---|
| refno | Yes | IOTA reference number (e.g., NA-005, EU-005). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It indicates a read operation (list) and explains the return structure (hierarchy), but does not disclose error handling, rate limits, or any side effects. Minimal disclosure beyond the core function.
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 extremely concise with two sentences, no wasted words, and directly states the purpose and output structure. It is front-loaded and efficiently communicates the key information.
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 presence of an output schema (indicated by context signals), the description explains the returned hierarchy adequately. It could be slightly more complete by defining an IOTA group, but for a simple list tool it is sufficient.
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 input schema has 100% coverage with a clear description for the refno parameter. The tool description does not add additional parameter semantics beyond the schema, so baseline 3 is appropriate.
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 clearly states the tool lists all islands and subgroups in an IOTA group, with a specific verb (list) and resource (islands and subgroups). It distinguishes itself from sibling tools like iota_search or iota_lookup by focusing on the full hierarchy of a single group.
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?
The description implies usage when needing a complete hierarchy of a specific IOTA group, but does not explicitly state when to use this tool over alternatives like iota_search or iota_lookup, nor does it mention any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iota_lookupA
Look up an IOTA group by reference number.
Returns group details including name, DXCC entity, bounding box, center coordinates, credit percentage, and island count.
| Name | Required | Description | Default |
|---|---|---|---|
| refno | Yes | IOTA reference number (e.g., NA-005, EU-005, AF-001). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses that the tool is a read operation and lists return fields, providing adequate transparency for a lookup. Missing error handling details but acceptable.
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 sentences, zero waste. The first sentence states the action, the second lists return fields. Efficient and front-loaded.
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 presence of an output schema and the simple nature of a lookup, the description is complete. It tells what it does and what it returns. No need for further detail.
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% (refno described with examples). The tool description adds no extra parameter detail beyond restating 'reference number', so baseline 3 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?
The description 'Look up an IOTA group by reference number' uses a specific verb and resource, clearly differentiating it from siblings like iota_search or iota_nearby.
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?
The description implies usage when a reference number is available, but lacks explicit when-not or alternative guidance. However, the context is clear for a direct lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iota_nearbyA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | Latitude in decimal degrees (e.g., 43.6 for Boise). | |
| longitude | Yes | Longitude in decimal degrees (e.g., -116.2 for Boise). | |
| limit | No | Maximum results to return (default 20). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the algorithm (great-circle distance, bounding box center) but lacks other behavioral traits such as authentication needs, data freshness, or any side effects. With no annotations, the description partially fulfills the transparency burden.
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 only two sentences, front-loading the main action. Every word serves a purpose, with no repetition or unnecessary detail.
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 tool's simplicity and the presence of an output schema, the description adequately covers the key aspects: what it does and how it computes results. It could optionally mention what constitutes an IOTA group, but this is not critical.
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 schema provides descriptions for all parameters (100% coverage). The tool description adds value by explaining how coordinates and limit are used in the distance calculation, which helps the agent understand parameter purpose 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 clearly states the tool finds IOTA groups nearest to a location and explains the great-circle distance computation. It distinguishes from siblings by focusing on geospatial proximity, which is unique among the listed sibling tools.
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 guidance is provided on when to use this tool versus alternatives like iota_search or iota_lookup. The description does not mention prerequisites, limitations, or scenarios where this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iota_searchB
Search IOTA groups and islands by name.
Searches both group names and individual island names. Results are deduplicated by IOTA reference number.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search text (e.g., Hawaii, Shetland, Comoro). | |
| limit | No | Maximum results to return (default 25). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that it searches both groups and islands and deduplicates by reference number. With no annotations, it lacks details on read-only nature, rate limits, or error handling.
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?
Three concise sentences, each adding value: purpose, scope, and deduplication. No filler.
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 output schema present, return values are covered, but lacks context on when to search vs. other operations. Could mention that it is a simple name-based search.
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 covers both parameters with descriptions; description adds no additional meaning beyond what schema provides, so baseline 3 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?
Description clearly states it searches IOTA groups and islands by name, including both group and island names. However, it does not explicitly differentiate from sibling tools like iota_lookup or iota_nearby, leaving some ambiguity.
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 guidance on when to use this tool versus alternatives (e.g., iota_lookup for specific reference numbers). No mention of prerequisites or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iota_statsA
Get IOTA programme summary statistics.
Returns total groups and islands, breakdown by continent, DXCC entity count, and most/least credited groups.
Returns: Programme-wide statistics and summaries.
| 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?
With no annotations, the description carries full burden. It describes returns but does not state side effects or safety (e.g., read-only). Assumes no destructive behavior but should explicitly confirm.
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?
Mostly concise, with a clear summary and specifics. Minor redundancy in the last line ('Returns: Programme-wide statistics and summaries') repeats earlier content.
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 no inputs and presence of output schema, description adequately covers what the tool does. Could mention that no arguments are needed, but overall sufficient for a simple stats tool.
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?
No parameters exist, and schema coverage is 100%. Description adds value by detailing the output structure, compensating for the lack of parameter info (baseline 4 for 0 params).
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?
Clearly states it returns summary statistics for the IOTA programme, listing specific breakdowns (total groups/islands, continent, DXCC count, credited groups). This differentiates it from sibling tools that focus on specific islands or searches.
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?
Lacks explicit guidance on when to use vs alternatives, but the purpose is self-evident given the tool name and description. No exclusionary context is provided.
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.
7 tool updates
v0.1.2- First observed
get_version_info - First observed
iota_dxcc - First observed
iota_islands - First observed
iota_lookup - First observed
iota_nearby - First observed
iota_search - First observed
iota_stats
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose: version info, DXCC mapping, islands listing, group lookup, nearby search, name search, and statistics. No overlap.
Six tools follow the 'iota_xxx' pattern, but 'get_version_info' breaks it with a 'get_' prefix, a minor inconsistency.
7 tools cover the core IOTA data exploration needs without redundancy; the count is well-scoped for the domain.
Missing a tool to list all IOTA groups or DXCC entities, which could hinder agents lacking prior knowledge; search requires a query, leaving no entry point.
Maintenance
Related MCP Connectors
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Automate 1,000+ services from any MCP-compatible AI agent: build Applets, run actions and queries.
Read and update your Everway trips and itineraries from any MCP-compatible AI assistant.
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for HamQTH.com — callsign lookup, DX cluster spots, Reverse Beacon Network, DXCC resolution, and more through any MCP-compatible AI assistant.8GPL 3.0
- AlicenseAqualityFmaintenanceMCP server for QRZ.com — callsign lookups, DXCC entity resolution, and logbook queries through any MCP-compatible AI assistant.639 PyPI3GPL 3.0
- AlicenseAqualityDmaintenanceMCP 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.81GPL 3.0
- AlicenseAqualityDmaintenanceMCP server for Summits on the Air (SOTA) — live spots, activation alerts, summit info, and nearby summits through any MCP-compatible AI assistant.59 PyPIGPL 3.0