N1MM Logger+ MCP server. Live contest state: QSOs, bandmap, score, rate, multipliers.
Runs on your machine from its package; the steps are below.
Not assessed yet.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
uvx n1mm-mcp
MCP client config
{
"mcpServers": {
"n1mm": {
"command": "uvx",
"args": [
"n1mm-mcp"
]
}
}
}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.
uvx n1mm-mcp # run it; nothing to install
| 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.
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
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.Run n1mm-mcp with --bind 0.0.0.0 (every network interface) or --bind <this PC's LAN address>,
and point N1MM at it: this PC's address (192.168.1.20:12060), or 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).
Listening on the network means any device on it can send n1mm-mcp packets, so only do it on a network you trust.
n1mm-mcp works with any MCP-compatible client. Add the server config and restart. The tools appear automatically.
Add to claude_desktop_config.json (~/Library/Application Support/Claude/ on macOS, %APPDATA%\Claude\ on Windows):
{
"mcpServers": {
"n1mm": {
"command": "uvx",
"args": ["n1mm-mcp"]
}
}
}
Add to .claude/settings.json:
{
"mcpServers": {
"n1mm": {
"command": "uvx",
"args": ["n1mm-mcp"]
}
}
}
{
"mcpServers": {
"n1mm": {
"command": "uvx",
"args": ["n1mm-mcp"]
}
}
}
Add to .cursor/mcp.json (project-level) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"n1mm": {
"command": "uvx",
"args": ["n1mm-mcp"]
}
}
}
Add to .vscode/mcp.json in your workspace:
{
"servers": {
"n1mm": {
"command": "uvx",
"args": ["n1mm-mcp"]
}
}
}
Add to ~/.gemini/settings.json (global) or .gemini/settings.json (project):
{
"mcpServers": {
"n1mm": {
"command": "uvx",
"args": ["n1mm-mcp"]
}
}
}
"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."
| Option | Default | Description |
|---|---|---|
--port | 12060 | UDP listen port |
--bind | 127.0.0.1 | Address to listen on; 0.0.0.0 for N1MM on another PC |
--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 |
N1MM_MCP_MOCK=1 n1mm-mcp
n1mm-mcp --transport streamable-http
Then open the MCP Inspector at http://localhost:8008.
git clone https://github.com/qso-graph/n1mm-mcp.git
cd n1mm-mcp
uv sync --group dev
uv run pytest
GPL-3.0-or-later