Skip to main content
Glama
n1mm-mcp

n1mm-mcp

by qso-graph

n1mm-mcp

PyPI MCP Registry

MCP server for N1MM Logger+: live contest state — station, QSOs, bandmap, score and rate, multipliers, and contest clock — through any MCP-compatible AI assistant.

Data from N1MM Logger+'s UDP broadcasts on your local network. Part of the qso-graph project. No authentication required.

Install

uvx n1mm-mcp            # run it; nothing to install

Related MCP server: qrz-mcp

Tools

Tool

Description

Key Parameters

n1mm_current_state

Station snapshot: connection, contest, operator, radios

station_name

n1mm_lookup

The callsign being entered (pre-log) plus current band and mode

station_name

n1mm_contacts

QSO log: recent contacts, edits and deletes

count, since, band, mode, call_pattern

n1mm_bandmap

Live spots, multiplier targets, band activity

band, mode, callsign, mults_only

n1mm_performance

Score, rate, bands, run/S&P, hourly timeline

band, mode

n1mm_multipliers

Multiplier grid, needs, value analysis

band

n1mm_clock

Contest timing, off-time, pacing

duration_hours, target_score, target_qsos, min_gap_minutes

n1mm_diagnostics

Server health, parse errors, memory

station_name

n1mm_so2r

Two radios: each radio now, transmit/receive focus, same-band warning, transmit time and minutes per band, focus swaps, QSOs per radio and while the other radio runs

station_name

n1mm_network

Every networked station: operator, radios, rate, idle time, band, shared score per contest call, stations sharing a band and mode, QSOs per operator

—

n1mm_pileup

DXpedition pileup: rate, unique calls, dupes, continents and countries calling, split, dead air

window_minutes

get_version_info

Service version + upstream spec version (fleet identity attestation)

—

Every tool except n1mm_network (which covers all stations) takes an optional station_name for multi-station setups.

Everything comes from N1MM's UDP broadcasts; n1mm-mcp never talks to a radio. N1MM reports transmitting only when it keys the radio itself (macros, its CW keyer), so a paddle or microphone PTT doesn't count as transmit time in n1mm_so2r.

What is N1MM Logger+?

N1MM Logger+ is a Windows contest logger. It can broadcast its state over UDP: contacts, spots, radio info and score. n1mm-mcp listens to those broadcasts and keeps the contest state in memory, so an assistant can answer questions about it. N1MM doesn't know it's there.

N1MM Logger+ (Windows)
    │ UDP broadcast (port 12060, XML)
    ▼
n1mm-mcp (Python: the same PC, or any OS on the LAN)
    ├── UDP listener (background)
    ├── State engine (in memory, per StationName)
    │   MCP protocol (stdio)
    ▼
AI assistant

Quick Start

Turn on N1MM's broadcasts

  1. In N1MM: Config → Configure Ports → Broadcast Data, and enable all message types.

  2. Set the destination to 127.0.0.1:12060, N1MM's address for "this PC". n1mm-mcp listens there by default, and nothing outside the PC can reach it.

N1MM on another PC

Give one address of this PC and name who may send:

n1mm-mcp --bind 192.168.1.20 --allow 192.168.1.40

Then point N1MM at this PC's address (192.168.1.20:12060), or at your subnet's broadcast address (192.168.1.255:12060) to reach every PC on it. N1MM accepts several destinations separated by spaces. Don't use 255.255.255.255: N1MM's own documentation warns that it risks broadcasting to the internet (N1MM: External UDP Broadcasts).

--allow is required whenever --bind is a network address, and is repeatable for more than one PC. A datagram from any other address is dropped without being read, and counted — n1mm_diagnostics shows the count and the addresses, so traffic you did not expect is visible rather than silent.

--bind 0.0.0.0 is refused. It listened on every interface at once, including whatever Wi-Fi a laptop happened to be joined to, and it cannot be narrowed afterwards. Name the interface you mean.

What the allow-list does and does not do

A UDP sender's address can be forged by anything on the same network, so the list keeps other machines out; it is not proof of who sent a datagram. What limits the damage is that n1mm-mcp only reads: it has no tool that writes to N1MM, your log, or anything else. A forged packet can therefore mislead you about contest state — a wrong frequency, a spot that was never spotted — but it cannot act, and nothing it contains is written anywhere. Treat the state as reported, not as verified, and run on a network you trust.

Configure your MCP client

n1mm-mcp works with any MCP-compatible client. Add the server config and restart. The tools appear automatically.

Claude Desktop

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

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

Claude Code

Add to .claude/settings.json:

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

ChatGPT Desktop

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

Cursor

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

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

VS Code / GitHub Copilot

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

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

Gemini CLI

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

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

Ask questions

"What's my rate over the last hour?"

"Which multipliers do I still need on 20m?"

"Is the station on the bandmap a new multiplier?"

"How much off-time have I used, and am I on pace for my target?"

"Show me the last 10 QSOs."

CLI Options

Option

Default

Description

--port

12060

UDP listen port

--bind

127.0.0.1

Address to listen on. One address of this PC; 0.0.0.0 is refused

--allow

this PC

An address that may send to us; repeatable. Required with a network --bind

--transport

stdio

MCP transport (stdio or streamable-http)

--heartbeat-timeout

60

Seconds before the connection goes stale

--stale-timeout

900

Seconds before the connection goes disconnected

--max-spots

2000

Maximum spots in the bandmap buffer

--spot-ttl

30

Spot time-to-live in minutes

Testing Without N1MM

N1MM_MCP_MOCK=1 n1mm-mcp

MCP Inspector

n1mm-mcp --transport streamable-http

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

Development

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

License

GPL-3.0-or-later

Available Tools

12 tools
get_version_infoGet Version InfoA
Read-onlyIdempotent

Get n1mm-mcp service version and upstream UDP contract version.

Returns the running PyPI version of n1mm-mcp and the N1MM Logger+ UDP broadcast contract 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.

Note: n1mm_diagnostics remains the canonical health probe (heartbeat, parse errors, memory). get_version_info is a lighter-weight identity attestation that succeeds even when N1MM isn't broadcasting.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds a genuinely non-obvious behavioral trait beyond them: it is a 'lighter-weight identity attestation that succeeds even when N1MM isn't broadcasting,' which tells the agent this call is reliable in a degraded upstream state. It does not describe cost/latency or caching, so it stops short of 5.

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?

Front-loaded with the verb and resource, then usage, then the sibling disambiguation — a sensible order with no wasted preamble. Slightly padded by 'without going outside the MCP protocol' and a parenthetical listing diagnostics' internals, which is context for a different tool.

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 zero-argument read-only tool with an output schema, the description covers purpose, the two returned version fields, the intended cross-server comparison workflow, and the degraded-upstream behavior. Nothing an agent needs to decide whether and how to call it is missing.

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, which sets the baseline at 4 per the rubric. The description additionally names the two values the caller will compare (service_version, spec_version), reinforcing what the empty-arg call is for.

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 (get) and resource (service version + upstream UDP contract version), and names the concrete return fields service_version and spec_version. It explicitly separates itself from n1mm_diagnostics, so an agent can pick between them without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit use case (confirm fleet alignment, compare versions across servers to detect drift) and an explicit exclusions clause: 'n1mm_diagnostics remains the canonical health probe (heartbeat, parse errors, memory).' The when-to-use and when-not-to-use are both stated with the alternative named.

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

n1mm_bandmapN1Mm BandmapA
Read-onlyIdempotent

Live bandmap — spots, mult targets, and activity summary.

Returns active spots (with TTL eviction), unworked multipliers, and per-band spot activity counts in one snapshot.

NameRequiredDescriptionDefault
bandNoFilter by band (e.g., "20m").
modeNoFilter by mode.
callsignNoSearch by callsign prefix.
mults_onlyNoIf true, only return spots flagged as multipliers.
station_nameNoStation to query.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the description adds genuinely new traits: TTL eviction of spots (ephemeral data, results change between calls) and 'one snapshot' semantics. It omits pagination or size limits, which is a minor gap given the annotation coverage.

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 compact sentences, with the resource identity front-loaded and the returned contents immediately after. 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?

With an output schema present, the description only needs to convey what the tool is and how it behaves; it covers snapshot semantics and TTL eviction well. The remaining gap is routing versus the multipliers sibling.

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% and all five filter parameters are documented there. The description only implies that band/mode/callsign filters shape the returned spot set, adding no syntax or interaction detail beyond the schema. 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 resource (live bandmap) and enumerates its contents: spots, mult targets, activity summary. However, it does not distinguish this from the sibling n1mm_multipliers, despite overlapping output ('unworked multipliers'), so an agent cannot fully separate them from the description alone.

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 word 'Live' implies a real-time usage context, but there is no explicit guidance on when to use this instead of n1mm_multipliers, n1mm_pileup, or n1mm_contacts. No prerequisites or exclusions are stated.

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

n1mm_clockN1Mm ClockC
Read-onlyIdempotent

Contest clock — timing, off-time, and pacing in one view.

NameRequiredDescriptionDefault
target_qsosNoTarget QSO count for pacing.
station_nameNoStation to query.
target_scoreNoTarget score for pacing.
duration_hoursNoContest length (e.g., 48 for CQ WW, 24 for ARRL DX).
min_gap_minutesNoMinimum gap to count as off-time (default 30).

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.5/5.0
Behavior2/5

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

Annotations already declare this as a read-only, idempotent, non-destructive open-world query. The description only restates the title's concepts ('timing, off-time, and pacing') and adds no behavioral context such as how min_gap_minutes affects off-time calculation, whether results are cached, or what the clock view includes beyond the obvious.

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

Conciseness3/5

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

The description is a single short phrase and front-loaded, but it is under-specified rather than genuinely concise. Every word earns its place in the sense that there are no wasted sentences, but the phrase carries too little information for a five-parameter tool.

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

Completeness2/5

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

Although an output schema and annotations exist, the description does not explain the relationship to sibling tools, how to use the pacing targets, or what practical view the clock returns. For a tool with optional configuration parameters and several related status tools, this leaves meaningful gaps.

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 all five parameters are documented in the schema itself, including target_qsos, target_score, duration_hours, station_name, and min_gap_minutes. The description adds no parameter meaning beyond what the schema provides; baseline 3 is appropriate.

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 names the resource (contest clock) and three concepts (timing, off-time, pacing), which gives a rough idea of what the tool shows. However, it stops short of a specific verb or outcome, and it does not distinguish this from siblings like n1mm_current_state or n1mm_performance that likely overlap with timing/status views.

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 guidance about when to use this clock versus n1mm_current_state, n1mm_performance, or other status-oriented siblings. The phrase 'in one view' hints at a consolidated display but does not state a selection condition or exclusion.

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

n1mm_contactsN1Mm ContactsB
Read-onlyIdempotent

QSO log — recent contacts, edits, and deletes.

Returns the last QSO, filtered recent QSOs, recent edits, and recent deletes in one coherent snapshot.

NameRequiredDescriptionDefault
bandNoFilter by band (e.g., "20m").
modeNoFilter by mode (e.g., "CW").
countNoNumber of recent QSOs to return (default 10, max 100).
sinceNoISO timestamp — return only QSOs after this time.
call_patternNoFilter by callsign prefix.
station_nameNoStation to query (auto-detected if only one).

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so the safety profile is covered. The description adds one genuinely useful behavioral fact beyond that: the return is a composite snapshot combining last QSO, filtered QSOs, edits and deletes, which prevents misreading 'edits and deletes' as mutations. It says nothing about volume limits or snapshot consistency, though, so it is additive but not rich.

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 resource label before the detail. There is mild redundancy between 'recent contacts, edits, and deletes' and the expansion that follows, but nothing is wasted enough to hurt.

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

Completeness3/5

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

An output schema exists and all six parameters are documented, so the description needn't explain return shapes. What remains missing for correct selection is routing guidance against the many similarly named n1mm siblings — a meaningful gap for a tool in a crowded cluster.

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%, with band, mode, count, since, call_pattern and station_name each documented including the count default and 100 maximum. The description only alludes to filtering in general terms and adds no syntax or interaction semantics (e.g. how since combines with count), so 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?

The description names a specific resource (the QSO log) and enumerates exactly what is returned: the last QSO, filtered recent QSOs, recent edits, and recent deletes. It is clear what the tool does, but it never distinguishes itself from adjacent siblings such as n1mm_current_state, which an agent could reasonably assume also surfaces the last QSO.

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 statement of when to reach for this tool versus the other eleven n1mm_* tools, and no exclusions or prerequisites. The only hint is the word 'filtered', which implies the schema filters exist, but an agent must infer the selection criteria entirely on its own.

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

n1mm_current_stateN1Mm Current StateA
Read-onlyIdempotent

Complete station snapshot — connection, contest, operator, radios.

Returns connection status, contest info, operator callsign, and full radio state for Radio 1 (and Radio 2 if SO2R). This is the first tool any AI session should call.

NameRequiredDescriptionDefault
station_nameNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

The annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the bar is lower. The description adds useful behavioral context by listing what the snapshot contains and noting that Radio 2 state is included only for SO2R.

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?

The description is two tight sentences, front-loaded with the core snapshot purpose and followed by return details and session-start guidance. Every sentence contributes materially.

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

Completeness4/5

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

An output schema exists, so the description does not need to fully document return values, and the annotations cover safety behavior. The main remaining gap is that the optional station_name parameter is not explained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the only parameter, station_name, is never mentioned in the description. The phrase 'station snapshot' weakly implies station scoping, but it does not explain how station_name selects or affects the returned state.

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 gives a specific verb-and-resource framing: it returns a complete station snapshot covering connection, contest, operator, and radios. This clearly distinguishes it from narrower siblings such as n1mm_bandmap, n1mm_clock, or n1mm_so2r.

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 says this is the first tool any AI session should call, which gives strong usage context. It does not name when to use alternatives instead, but the 'first call' guidance is clear enough for a session-start snapshot tool.

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

n1mm_diagnosticsN1Mm DiagnosticsB
Read-onlyIdempotent

Server health and diagnostics — connection, parse errors, memory.

Essential for production debugging. First tool to call when something goes wrong during a contest.

NameRequiredDescriptionDefault
station_nameNo

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

Annotations already declare readOnly, idempotent, non-destructive, open-world, so safety is covered. The description adds the diagnostic-triage framing, but says nothing about cost, whether it touches the network, or scoping behavior. Since an output schema exists, the return shape need not be described.

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?

Short, front-loaded, and the most actionable line (call this first when something breaks) is emphasized early. "Essential for production debugging" is slightly redundant with the following sentence but does not waste much space.

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?

Annotations plus an output schema carry the safety and return-value burden, so the description only needs to cover purpose and scoping. Purpose is covered; the meaning of the sole optional parameter is left entirely unaddressed, which is a real gap for a scoped diagnostics call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single parameter is an undescribed nullable string; the description never mentions station_name at all. With low coverage the description is expected to compensate, and it does not — an agent cannot tell whether omitting it means 'all stations' or 'default station'.

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 concrete resource plus the specific facets covered (connection, parse errors, memory), which distinguishes it from siblings like n1mm_network and n1mm_current_state. It is not a forced verb phrase, but the scope 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 Guidelines4/5

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

"First tool to call when something goes wrong during a contest" gives an explicit trigger condition, which is genuinely useful triage routing. It does not, however, say how it differs from n1mm_network, the most plausible alternative when the symptom is connectivity.

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

n1mm_lookupN1Mm LookupA
Read-onlyIdempotent

Pre-log callsign lookup — THE Contest-Copilot trigger.

Fires when operator types a callsign and presses spacebar in N1MM. Returns the lookup data plus current band/mode from RadioInfo. Check lookup_age_ms — if >30000, the advice window has closed.

NameRequiredDescriptionDefault
station_nameNo

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive behavior, so the description need not restate safety. It adds useful context beyond annotations: the trigger event, the inclusion of current band/mode from RadioInfo, and the lookup_age_ms >30000 staleness cutoff.

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?

Three short sentences, front-loaded with the core purpose, then the trigger, return context, and staleness rule. Every sentence contributes operational information with no waste.

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?

The output schema and rich annotations reduce the description's burden, and it covers the trigger, return context, and staleness handling well. However, the only input parameter remains unexplained despite 0% schema description coverage, leaving a real gap for callers that need station_name.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions the sole station_name parameter. Because it adds no meaning for that parameter—and may even make the agent think only callsign context matters—it does not compensate for the low schema coverage.

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

Purpose4/5

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

The description states a specific action and context: a pre-log callsign lookup that fires on a callsign plus spacebar in N1MM. It is clearly distinct in practice from siblings like n1mm_current_state or n1mm_contacts, but it does not explicitly name or contrast those alternatives.

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 gives a clear when-to-use trigger: operator types a callsign and presses spacebar in N1MM. It does not state when not to use it or name alternative tools, so it stops short of full routing guidance.

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

n1mm_multipliersN1Mm MultipliersB
Read-onlyIdempotent

Multiplier status — worked mults, mult map, and available needs.

Returns total mults worked, per-band mult grid, unworked mults currently spotted, and mult value analysis.

NameRequiredDescriptionDefault
bandNoFilter to specific band.
station_nameNoStation to query.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is handled. The description adds useful detail about what data comes back (worked totals, per-band grid, unworked spotted mults, value analysis), but says nothing about cost, freshness relative to the live N1MM instance, or empty-state behavior.

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?

Roughly two sentences, front-loaded with the purpose before the enumeration of outputs, and every clause contributes content. Slightly list-like phrasing but no filler.

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

Completeness3/5

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

An output schema exists, so re-describing the return payload is largely redundant; the real gaps are the missing sibling differentiation and usage context for a zero-required-parameter tool. What is present is accurate but doesn't cover everything an agent needs to choose this tool confidently.

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% — band and station_name are each documented in the schema — so the description adds no parameter meaning beyond that baseline. It does not explain, for example, that omitting band yields an all-band grid.

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 resource ('multiplier status') and enumerates the four reports it produces, so an agent knows this is a read-only multiplier-analysis tool rather than a contact or bandmap listing. It never explicitly contrasts itself with siblings like n1mm_contacts or n1mm_bandmap, so it stops short of a 5.

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 statement of when to reach for this tool versus n1mm_contacts, n1mm_bandmap, or n1mm_performance, and no mention of prerequisites such as an active contest or log. Usage must be inferred purely from the resource name.

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

n1mm_networkN1Mm NetworkA
Read-onlyIdempotent

Every networked N1MM station at once (multi-op).

Per station: operator, radios (band, mode, running, transmitting), QSOs, rate over 10 and 60 minutes, mults in the last hour, minutes since the last QSO, the band of its recent QSOs with minutes on it and band changes in the last hour, and when it was last heard. Also: which stations are on each band, stations sharing a band and mode, each station's contest score (shared per contest call), and QSOs per operator this hour against the hour before.

NameRequiredDescriptionDefault

No parameters

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

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds genuinely new context: that data is aggregated across all networked stations and what cross-station relationships (band occupancy, shared band+mode, shared contest score) are computed. It does not address behavior when no network is configured, which is the main remaining gap.

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

Conciseness3/5

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

The key framing is front-loaded, but the bulk is a long enumeration of return fields that largely duplicates what the output schema already documents. It is informative yet padded rather than tight.

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 safety, an output schema covering return shape, and zero parameters, the description does more than enough to let an agent call it correctly. Minor omission: no mention of standalone/non-networked behavior or performance cost across many stations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter semantics to explain; baseline 4 applies. The description correctly signals the no-argument, whole-network snapshot nature of the call.

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?

Opening line 'Every networked N1MM station at once (multi-op)' gives a specific resource and scope, distinguishing it implicitly from single-station siblings like n1mm_current_state. However, it never names a sibling explicitly, so the differentiation is left to inference.

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?

The '(multi-op)' tag implies this is the tool for networked/multi-operator setups, which is useful context. But there is no explicit when-to-use statement, no exclusion such as 'for a single local station use n1mm_current_state', and no prerequisites.

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

n1mm_performanceN1Mm PerformanceA
Read-onlyIdempotent

Complete performance snapshot — score, rate, bands, run/S&P, timeline.

Returns score, rolling rates (10m/30m/60m), rate derivative for band exhaustion detection, per-band breakdown, per-mode breakdown, hourly summary, and run vs S&P stats in one coherent view.

NameRequiredDescriptionDefault
bandNoFilter rate/breakdown to specific band.
modeNoFilter to specific mode.
station_nameNoStation to query.

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 readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description adds domain context — notably that the rate derivative is intended for band-exhaustion detection — but says nothing about cost, latency, or behavior when filters are omitted. Since an output schema exists, its enumeration of returned fields is largely duplicative.

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 sentences, well front-loaded with the summary claim first and details second. The long field enumeration in sentence two overlaps the output schema and is the main trimming candidate, but it is not padded or redundant internally.

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 description adequately conveys the aggregate nature of the tool, and the output schema plus rich annotations carry the return shape and safety semantics. The one real gap is default scope: with three optional filters and zero required parameters, it never says what is returned when no band/mode/station is supplied.

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% and all three filters (band, mode, station_name) are documented inline, so the description has no compensation burden. It nonetheless never mentions the filters at all and instead presents the tool as 'complete', which slightly obscures that results can be scoped.

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-and-resource framing: 'Complete performance snapshot' with an enumeration of what is aggregated (score, rate, bands, run/S&P, timeline). An agent can tell it's an aggregate analytics view rather than a raw-data tool. It does not explicitly differentiate itself from the closest sibling, n1mm_current_state, which an agent could plausibly confuse with a performance/rate snapshot.

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?

The phrase 'in one coherent view' implies this is the consolidated alternative to calling several narrower tools, but no explicit when-to-use, when-not-to-use, or named alternative is given. With eleven siblings including n1mm_current_state, n1mm_diagnostics and n1mm_contacts, the choice is left to inference.

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

n1mm_pileupN1Mm PileupA
Read-onlyIdempotent

DXpedition pileup view: rate, who's calling, dupes, split, dead air.

Over the last window_minutes (default 60, 5 to 1440): QSOs, unique calls, dupes (a call already worked on that band and mode), run share, rate over 5, 15 and 60 minutes and the best 10 minutes in the window, QSOs and share by continent, the top 10 country prefixes, QSOs by band and mode, gaps of 2 minutes or more between QSOs, and the active radio's split (RX, TX, kHz up).

NameRequiredDescriptionDefault
station_nameNoStation to query.
window_minutesNoHow far back to look, in minutes.

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds real behavioral context by defining what counts as a dupe (already worked on that band and mode), how dead air is measured (gaps of 2+ minutes), and how split is reported (RX, TX, kHz up). It does not mention ordering, cost, or empty-result behavior, keeping it below a 5.

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

Conciseness5/5

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

One-line purpose up front, then a single structured sentence enumerating the metrics with the window constraint stated first. Dense but every clause maps to a reported value; 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?

Two optional parameters, full schema coverage, complete annotations, and an output schema mean the description only needs to explain intent and scope, which it does. The remaining gap is the absence of routing guidance against the many sibling analytics tools.

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 3 baseline applies; the description goes beyond it by stating the window default (60) and its valid range (5 to 1440), which the schema does not express. station_name is not further explained, so it stops short of full parameter coverage.

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?

Lead sentence names a specific view ('DXpedition pileup view') and enumerates the exact dimensions it reports: rate, callers, dupes, split, dead air. This is clearly distinguishable from raw-contact siblings like n1mm_contacts, but no sibling is named explicitly, so the agent must infer which of the other N1MM analytics tools overlaps.

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 framing ('pileup view') and by the window_minutes parameter, but the description never states when to reach for this versus n1mm_performance, n1mm_bandmap, or n1mm_current_state. No exclusions or prerequisites are given.

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

n1mm_so2rN1Mm So2RA
Read-onlyIdempotent

Two-radio (SO2R) view: both radios now, and how they've been used.

Returns each radio's band, frequency, mode and run/transmit state, N1MM's transmit focus and receive focus, whether both radios are on the same band, each radio's share of N1MM-keyed transmit time (a paddle or PTT isn't reported by N1MM) and minutes per band, transmit- and receive-focus swaps, QSOs per radio, and QSOs made on one radio while the other was running. Timing covers the RadioInfo packets seen since the MCP server started (or the contest changed). Read from N1MM's broadcasts; no rig is read.

NameRequiredDescriptionDefault
station_nameNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds real value beyond them: data provenance (derived from N1MM broadcasts, not rig reads), the measurement window ('RadioInfo packets seen since the MCP server started (or the contest changed)'), and a disclosed blind spot (paddle/PTT transmit time is not reported). It stops short of describing failure behavior when N1MM is disconnected.

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

Conciseness3/5

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

The purpose sentence is well front-loaded, but the body is one dense run-on enumerating every return field, which duplicates the existing output schema and bloats the definition. Several listed metrics could be compressed or left to the output schema.

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?

Since an output schema exists, the lengthy field enumeration is largely redundant, while the genuinely missing pieces — what station_name does, behavior when N1MM is not connected, and routing versus n1mm_current_state — go unaddressed. Adequate but with clear gaps for a complex multi-metric tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter station_name is entirely undocumented in the schema (0% coverage) and never mentioned in the description, so an agent cannot tell whether it selects a station, filters a multi-station setup, or is purely cosmetic. With such low coverage the description needed to compensate and does not.

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?

Opening sentence names a specific resource and scope ('Two-radio (SO2R) view: both radios now, and how they've been used') plus a concrete field inventory (band, frequency, mode, run/transmit state, focus swaps, QSO counts). This is clearly distinguishable from single-radio siblings like n1mm_current_state or performance-oriented tools such as n1mm_performance.

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 this applies when two radios are in play, and the closing clause 'Read from N1MM's broadcasts; no rig is read' hints at a prerequisite (N1MM must be running). But there is no explicit when-to-use/when-not statement and no named alternative (e.g., 'use n1mm_current_state for a single-radio snapshot').

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. 3 tool updatesv0.3.2
    • Addedn1mm_network
    • Addedn1mm_pileup
    • Addedn1mm_so2r
  2. 9 tool updatesv0.1.6
    • First observedget_version_info
    • First observedn1mm_bandmap
    • First observedn1mm_clock
    • First observedn1mm_contacts
    • First observedn1mm_current_state
    • First observedn1mm_diagnostics
    • First observedn1mm_lookup
    • First observedn1mm_multipliers
    • First observedn1mm_performance

TDQS

A3.6/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a clearly distinct contest-operating concern: station snapshot, callsign lookup, QSO log, diagnostics, bandmap, performance, multipliers, clock, SO2R, network, pileup, and version identity. Overlaps such as bandmap vs. multipliers and performance vs. pileup are resolved by descriptions emphasizing different scopes and use cases.

Naming Consistency4/5

Eleven of twelve tools follow a clear n1mm_<domain> prefix pattern, making the family easy to recognize. get_version_info breaks both the prefix and the noun-style convention, though it remains readable.

Tool Count5/5

Twelve tools is well-suited to a rich contest-station telemetry domain. Each tool represents a distinct operational view and none appears redundant or forced.

Completeness4/5

The surface comprehensively covers read-only contest monitoring: state, lookup, contacts, diagnostics, bandmap, performance, multipliers, clock, SO2R, network, and pileup. Minor gaps exist around arbitrary historical QSO search or write/control operations, but those may be intentionally outside the read-only Copilot scope.

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
    770 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
    870 PyPI
    4
    GPL 3.0
  • A
    license
    A
    quality
    A
    maintenance
    Enables logging amateur-radio QSOs to N3FJP logging software via MCP tools, including automatic logging, dupe checking, and band/mode management.
    10
    24 PyPI
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    An MCP server that controls WSJT-X for amateur radio weak-signal modes (FT8/FT4, etc.) via UDP, enabling observation of status and decodes, and transmit operations like replying to CQs or sending free text.
    14
    24 PyPI
    1
    MIT