AE5VG  ·  OPERATING SKILLS  ·  FIELD GUIDE
AE5VG
AMATEUR RADIO STATION

The Operating
Skills

A field guide to the operating skills bundled with fldigi-mcp and n3fjp-mcp — how an agent keys the transmitter and returns to receive at the exact instant an over ends, runs a contest QSO from CQ to logged contact, and survives everything a real band throws at it. Every rule in this guide was proven on the air.

FIELD GUIDE  ·  VERSION 0.2  ·  JULY 2026
2
Operating
skills
6
Rules in the
standard
7
Special cases
handled
3
Worked examples
from the air
© 2026 STEFAN BRUNNER · AE5VG FIELD-PROVEN AT ARRL FIELD DAY 2026 · CLASS 2A · BPSK31
Operating Skills · Field Guide

Contents

Before you start
ASkills at a glance
BInstalling the skills
CYour first session — Claude for hams
DHow the system works
EThe operating standard
The skills
01fldigi-operating
02contest-operating
On the air
FThe special-case playbook
GWorked examples from Field Day
Reference
HLogging to N3FJP
IAbout & provenance
Chapter A · Before you start

Skills at a Glance

Two skills, one operating system. Each in one view — what it governs, and what you get. One full page per skill inside.

#SkillShips withWhat it governsWhat you get
01fldigi-operatingfldigi-mcp The radio: keying the transmitter, returning to receive the instant an over ends, and polling the RX stream so no caller is missed. Instant TX→RX handoff + a caller never ignored
02contest-operatingn3fjp-mcp The contest: the QSO state machine from CQ to logged contact, the special-case playbook, and verified N3FJP logging. Completed exchanges + a clean, duplicate-free log
Who reads these skills

You don't invoke these skills by name — the agent does, when you say things like “call CQ on 20 meters” or “run the Field Day loop.” The skills are the agent's operating procedures. This guide is for the human at the station: what the agent will do on your behalf, and how to verify it is doing it right.

Chapter B · Before you start

Installing the Skills

Each skill ships inside its MCP package — install the server, and the skill travels with it. Nothing is configured separately.

In Claude Desktop .mcpb bundle — recommended

1
Install the bundles. Double-click fldigi-mcp.mcpb and n3fjp-mcp.mcpb (or add them under Settings → Extensions). Each bundle carries its skill at skills/<name>/SKILL.md plus this guide.
2
Set the transmit gate. In the fldigi-mcp extension settings, enter your callsign. With no callsign set the station is receive-only — nothing can key the radio.

In Claude Code / Cowork

1
Copy the skill directories from each repo into ~/.claude/skills/ (or a project's .claude/skills/): skills/fldigi-operating/ and skills/contest-operating/.
2
Connect the MCP servers (uvx fldigi-mcp, uvx n3fjp-mcp or from the repos) so the tools the skills reference are available.

Verify thirty seconds

1
Check the radio link. Ask “what's the fldigi status?” — mode, frequency, and T/R state should come back. If not, the diagnostics tool tells you whether it's a network problem before you blame fldigi.
2
Dry-run the handoff. On a dummy load: “send TEST DE <YOURCALL> and return to receive.” fldigi should key, send, and drop PTT on its own — no lingering carrier.
Good to know

fldigi's XML-RPC default port is 7362. A different configured port (e.g. 7372) usually means a localhost→remote forwarder such as mcp-host-bridge is intended — check FLDIGI_PORT before concluding fldigi is down.

Chapter C · Before you start

Your First Session — Claude for Hams

You do not need to know anything about AI to run this station. If you can install fldigi and type a sentence, you can operate. This chapter is the whole learning curve.

What you're actually installing

Claude is an assistant made by Anthropic. It runs in an ordinary desktop program — the Claude Desktop app (Windows or Mac), which looks like a messaging window: you type at the bottom, answers appear above. The two MCP servers in this project are best thought of as rig-interface cables: one plugs Claude into fldigi, the other into N3FJP. You type plain English; Claude works the programs. Nothing about your fldigi or N3FJP setup changes — they run exactly as they always have.

Setup, once

1
Install the Claude Desktop app. Download it from claude.ai/download, install like any program, and sign in (create the account on the same page). A paid plan is recommended — the free tier can run out of messages mid-QSO.
2
Run your shack software as usual. Start fldigi (its XML-RPC interface is on by default). If you want contest logging, start N3FJP and enable its TCP API (Settings → Application Program Interface → checked).
3
Add the two extensions. Double-click fldigi-mcp.mcpb, click Install when Claude Desktop opens, and enter your callsign when asked — that callsign is the transmit gate. Repeat with n3fjp-mcp.mcpb. Done — this is a one-time step.
4
Say hello. Open a new chat and type: “What's the fldigi status?” If mode, frequency, and T/R state come back, your station is connected.

Operating is a conversation

There are no commands to memorize and no syntax to get wrong. You type what you would tell a competent operator sitting at your rig:

You typeWhat happens
What's the fldigi status? Mode, frequency, T/R, and callsign gate — your pre-flight check.
Set the rig to 14.070 USB and BPSK31. Claude QSYs the rig and sets the modem.
Call CQ Field Day until someone answers. Work them — our exchange is 2A STX — log the contact to N3FJP, then keep calling. The full loop in this guide: CQ, listen, exchange, TU, log, repeat. Claude narrates each QSO as it happens.
stop Transmission stops immediately and the radio returns to receive. Works at any moment, mid-over included.
You are still the control operator

Claude operates; you hold the license. Part 97 responsibility — supervision, station identification, staying in the band — remains yours, exactly as if a guest operator sat at your key. Stay at the station while it transmits. Two safeguards are built in: with no callsign configured the station physically cannot key up, and “stop” always works.

First time? Dummy load.

Run your first full session into a dummy load: “call CQ and work whoever comes back”, watch one complete cycle — TX drop, listen window, log entry — then connect the antenna. If anything misbehaves, type “run the fldigi diagnostics” and read the answer; it distinguishes a network problem from an fldigi problem.

Chapter D · Before you start

How the System Works

A QSO is a loop with four states. fldigi-operating governs the radio in every state; contest-operating decides what to say and when to log.

1 · CQ
Anyone out there?
CQ FD CQ FD de <MYCALL> <MYCALL> pse k
2 · Exchange
Caller decoded — send ours
<CALL> de <MYCALL>
Pse copy 2A 2A STX STX
de <MYCALL> BK
3 · TU
They QSL — confirm theirs back
QSL <CLASS> <SECT> TU <CALL> de <MYCALL> GL FD sk sk
4 · Log
Write it, then QRZ
log → log_qso … check logged: true
The habit that matters

Run it on a live band, not a tour. Put fldigi on a dummy load, say “call CQ and work whoever comes back,” and watch one full cycle — TX drop, listen window, log entry — before you connect the antenna.

Chapter E · Before you start

The Operating Standard

Six rules, inherited by both skills. Every one of them exists because we broke it once — on the air, at Field Day 2026.

1
Never poll the TX buffer to decide when to stop. fldigi holds PTT on an empty buffer by design. End every over with ^r (via transmit → send) and fldigi drops to receive at the exact sample the last character finishes. Polling always lags; the lag is transmitted on top of your caller.
2
The RX buffer never contains your own echo. Every character came from an external station. Your callsign in RX means someone is calling you — pursue it. “Dismiss as own echo” logic makes you ignore callers; we wrote it, it did, and we deleted it.
3
Never log without a confirmed callsign. Class and section can be inferred from a repeat; a callsign cannot. An incomplete QSO is not a contact — abandon it and CQ again.
4
Trust logged: true, nothing else. N3FJP's ENTERRESPONSE can report 0 for a QSO that was written (networked mode commits asynchronously). Blind retries on records_added: 0 produced duplicate log records. Retry only when logged is false.
5
Budget two overs for an unreadable station. One AGN, one listen window. Still garble? Back to CQ. A marginal signal that costs five minutes is four QSOs you didn't make.
6
Double what must survive QRM. 2A 2A STX STX, callsign twice on CQ, and echo the other station's exchange back in your TU so they can verify what you logged before you QRZ.
Why this exists

These skills were built by running one real autonomous Field Day session and keeping the after-action report — the full account is in n3fjp-mcp/docs/LESSONS-FIELD-DAY-2026.md, and the worked examples in chapter F retell it verbatim.

Skill 01 · ships with fldigi-mcp

fldigi-operating

Governs the radio: transmit, hand off to receive, listen properly.

Transmitting an over

transmit → send "<over text>\n"   (return_to_rx=true, the default)

One call: clears the TX buffer, appends ^r, keys the radio. End messages with a real newline (\n) — the two-character string ^n transmits literally. If building an over incrementally with text → add_tx, the last fragment must end in ^r, with nothing added after it.

OperationBehaviorUse for
^r via transmit → sendGraceful auto-return the moment the over endsEvery normal over
transmit → abortImmediate stop, discards queued textPanic button — caller back early, wrong message, operator says stop
transmit → rxReturns to RX only after the buffer drainsAlmost never — slow, and not the stop button

Listening

loop:
  transmit → send "CQ CQ de <MYCALL> <MYCALL> pse k\n"
  poll controls → get_trx_status until "rx"
  listen ~10 s  (1–2 polls of text → rx_length)
  if plausible callsign in new RX text → work the station
  else → loop
Skill 02 · ships with n3fjp-mcp

contest-operating

Governs the contest: what to say in each state, when a QSO is real, and when it goes in the log.

The exchange, tuned on the air

Logging in one call

log → log_qso  {"call": "W7XYZ", "contest": "field_day",
                "exchange": {"class": "1D", "section": "AZ"}}

Exchange fields go in the exchange dict — they are not top-level parameters. Success is logged: true in the response; chapter G has the full protocol and its quirks.

The rule that keeps the log clean

Never retry on records_added: 0 alone — that value can be 0 for a QSO that was written. Retry only when logged is false. Blind retries are where duplicate log records come from.

Chapter F · On the air

The Special-Case Playbook

All seven encountered live at Field Day 2026 — none of them hypothetical.

SituationWhat the agent does
Callsign only, no exchange Normal. Send your exchange; theirs arrives in the next over.
Exchange arrives with the first call Also normal (K6ABC de W7XYZ 1D AZ 1D AZ pse k). Send yours; they QSL; straight to TU.
“No copy” / “repeat” Resend once, abbreviated: <CALL> de <MYCALL> · 2A STX 2A STX · BK. Still nothing → QRZ once, then CQ.
Garbled / partial callsign de <MYCALL> AGN AGN pse k, one listen window. Still unreadable → CQ. Two overs maximum.
Two stations doubled Interleaved callsigns and control garbage. One AGN, then CQ — usually one calls again alone.
Another station CQing on frequency PSK's narrow passband decodes neighbors. CQ … de <OTHERCALL> is not a caller — ignore and continue.
Signal lost mid-QSO Exchange never completed → do not log. An incomplete QSO is not a contact.
Field note · N3FJP modal dialogs

Modal dialogs on the logging PC block the entire N3FJP API. If logging calls stop responding mid-contest, a dialog is open and needs human attention — nothing the agent can clear remotely.

Chapter G · On the air

Worked Examples from Field Day

Three real QSOs from the session log, 14.070 MHz BPSK31 — transcribed as decoded, garble included. All callsigns are anonymized (ARRL-style sample calls) out of respect for the stations worked; the exchanges, flow, and garble are verbatim.

Example 1 · W7XYZ — the textbook QSOLOGGED · 1D AZ
TXCQ FD CQ FD de K6ABC K6ABC pse k
RXK6ABC de W7XYZ 1D AZ; 1D AZ  PSE K
Caller sent callsign and full exchange up front — no need to ask.
TXW7XYZ de K6ABC K6ABC · Pse copy 2A 2A STX STX · de K6ABC BK
RXK6ABC QSL TU 73 de W7XYZ · GL es 73 · sk
TXQSL 1D AZ TU W7XYZ de K6ABC GL FD sk sk
Logged while the TU was still transmitting: log_qso → logged: true.
✓ LOGGED — clean copy both ways, exchange confirmed in both directions, one pass through the state machine.
Example 2 · N4DEF — callsign first, exchange afterLOGGED · 1D NFL
TXCQ FD CQ FD de K6ABC K6ABC pse k
RX**4* K6ABr  DE N4DEF N4DEet N4DEF
Callsign only — repeated three times through light garble, readable. No exchange yet: this is normal, not an error.
TXN4DEF de K6ABC K6ABC · Pse copy 2A 2A STX STX · de K6ABC BK
RX**** K6ABC · QSL  PSE COPY 1D  1D  NFL DE N4DEe   K
Their QSL and exchange arrive together in the second over.
TXQSL 1D NFL TU N4DEF de K6ABC GL FD sk sk
✓ LOGGED — the state machine tolerates the exchange arriving one over late; the callsign was confirmed before anything was logged.
Example 3 · K0GHI — no copy, abandoned correctlyNOT LOGGED
TXCQ FD CQ FD de K6ABC K6ABC pse k
RX6ABC de K0GHI K0GH  · pse cpy 1E UT 1E UT
TXK0GHI de K6ABC K6ABC · Pse copy 2A 2A STX STX · de K6ABC BK
RXnt z repeat no cpy
They didn't copy us — resend once, abbreviated (playbook, row 3).
TXK0GHI de K6ABC · 2A STX 2A STX · BK
RXcptt t  te  e t eg
TXK0GHI de K6ABC AGN pse k
RX(silence — two listen windows)
TXCQ FD CQ FD de K6ABC K6ABC pse k
✗ NOT LOGGED — we never confirmed they copied our exchange. Rule 3 of the standard: an incomplete QSO is not a contact. Two overs spent, then back to work.
Chapter H · Reference

Logging to N3FJP

The verified protocol, and every quirk we hit on the air.

Preferred: one call

log → log_qso  {"call": "W7XYZ", "contest": "field_day",
                "exchange": {"class": "1D", "section": "AZ"}}

Manual alternative

log → set_many  {"CALL": "W7XYZ", "CLASS": "1D", "SECTION": "AZ"}
log → enter
Success is logged: true — trust nothing else

Both paths return a logged boolean derived from the QSO-count delta and/or an ENTEREVENT push. records_added can report 0 for a QSO that was written — N3FJP networked (master-table) mode commits asynchronously. Retry only when logged is false.

Quirks, observed live

Chapter I · Reference

About & Provenance

These skills were not designed on paper. They are the distillate of one real autonomous contest session.

At ARRL Field Day 2026, a class-2A club station ran 20-meter BPSK31 with an agent operating fldigi and N3FJP through fldigi-mcp and n3fjp-mcp — calling CQ, working callers, and logging contacts, with the human operator supervising and able to stop transmission at any moment. Every rule, timing, and special case in this guide comes from that session's after-action report, n3fjp-mcp/docs/LESSONS-FIELD-DAY-2026.md.

ResourceWhere
fldigi-mcpgithub.com/sbrunner-atx/fldigi-mcp · PyPI: fldigi-mcp
n3fjp-mcpgithub.com/sbrunner-atx/n3fjp-mcp · PyPI: n3fjp-mcp
Skill sources<repo>/skills/<name>/SKILL.md
This guide's sources<repo>/docs/brand/ (HTML + CSS, WeasyPrint)
After-action reportn3fjp-mcp/docs/LESSONS-FIELD-DAY-2026.md

Corrections and additions are welcome — open an issue on either repository.

73

This is private, personal work by Stefan Brunner, AE5VG — built for amateur radio operators. Not affiliated with fldigi, N3FJP, or any employer. MIT licensed, like the servers it documents. GL es 73 de AE5VG sk.