Use when the user asks for a 1930s-style radio broadcast transcript, period-accurate old-time announcer call, vintage play-by-play, "Red Barber / Graham McNamee version", or any "make it sound like a 1930s broadcast" transformation of a game. Consumes the Markdown product of the `mlb-game-report` skill (with its structured ATMOSPHERE, SCORING, PLAY-BY-PLAY + Statcast sections) and produces a transcript written in the voice of a Golden Age radio sportscaster, with modern Statcast metrics translated into period-appropriate color commentary.
Transforms a structured MLB game report into a transcript of a live radio broadcast, as if called by a 1930s-era sportscaster who has time-traveled to the present and is gamely calling a contemporary game. Takes the structured product of the mlb-game-report skill (PBP + Statcast + atmosphere + captivating-moment data) and re-voices it in period-accurate radio English.
The announcer's voice is always Depression-era. What changes with the source game's date is whether he is in his own time or time-traveling.
Always read the date field from the source frontmatter before writing and pick the right mode.
He is simply calling a game he was scheduled to call. Drop the time-travel framing entirely. No "year of our Lord" slips, no marveling at modern players, no "the tracking apparatus tells me" translations — there is no tracking apparatus. There is a press-box telephone, a pair of field microphones, and a guy with a stopwatch. Use the full period vocabulary from references/vintage-phrases.md naturally. Period player comps (Ruth, Gehrig, Foxx, Hubbell, Dean, Ott) are natural, not forced. The masthead date matches the source date.
He is in our century but keeps his 1930s voice and vocabulary. The humor and charm come from the translation: a Depression-era voice describing a later-era game fluently but in his own words. He is informed — he has been here a while, he's been briefed — and he knows what Statcast, Sabermetrics, ABS, replay review, and the pitch clock actually are. But he lacks the native language for them and reaches for period-accurate analogues (tabulating machines, Signal Corps apparatus, photoelectric cells, cinematograph review, the slide-rule school, the log-book boys).
references/translations.md for the full vocabulary table. Examples:
Baseball radio broadcasting did not meaningfully exist before August 1921 (KDKA's Pirates-Phillies broadcast). For a game from 1920 or earlier, tell the user you can't produce a "live radio call" for a game that predates baseball radio, and offer alternatives: (a) a period-newspaper wire recap via mlb-game-report, or (b) a "what it would have sounded like if radio had existed" broadcast with that caveat front-and-center in the transcript. Don't silently produce a live-radio call for a pre-1921 game.
Triggers:
Find the source report. The skill expects a game produced by mlb-game-report, under ~/games-attended/. Each game has two co-located artifacts:
~/games-attended/<slug>/ containing game.csv, plays.csv, pitches.csv, batting.csv, pitching.csv, linescore.csv — this is your primary data source.~/games-attended/<slug>.md — useful for the precomposed ATMOSPHERE narrative (sunlight arc, weather phrasing) and KEY TAKEAWAYS, but not the primary source of facts.If the user hasn't specified a game, list candidate slugs with ls -d ~/games-attended/*/ and ask which one. If they reference a team + date, find the matching slug.
Backward compat: if only a .md exists (pre-refactor report with no dataset directory), fall back to parsing the Markdown sections — the old trigger phrases and structure still work. Consider suggesting the user regenerate via mlb-game-report so the CSV dataset is available; the transcript will be more accurate.
Read the CSV dataset first (primary data). The CSVs are structured rows — far cleaner than regex-parsing the .md.
| File | What's in it | How the announcer uses it |
|---|---|---|
game.csv | 1 row: gamePk, date, teams, venue + coords, weather, wind, attendance, WP/LP/SV, records, attended metadata, captivating_play_idx | Masthead, dateline, AT-A-GLANCE setup, moment-of-game lookup key |
plays.csv | 1 row per plate appearance: idx, inning, half, batter, pitcher, event, event_tag, description, balls, strikes, pitch_count, away_score_after, home_score_after, is_scoring_play, captivating_index, rbi | The call-by-call skeleton — walk through in order |
pitches.csv | 1 row per pitch, joined to plays by play_idx: pitch type, speed, spin, EV, LA, distance, trajectory, hit location, hardness | Statcast embellishment on big ABs — translate via translations.md |
batting.csv / pitching.csv | 1 row per player who appeared | Starting lineup intros, pitcher bios, decision tags (W/L/S) |
linescore.csv | 1 row per inning + R/H/E summary | Inning-by-inning context, between-innings recaps |
Consult the rendered .md only for narrative text you want to borrow. The .md ATMOSPHERE block has a precomposed sunlight-arc phrase ("Late-afternoon start — sun still up at first pitch, setting at 7:24 PM; middle innings slide into dusk. Full dark around 7:50 PM.") and a one-sentence HOW IT HAPPENED. Both are handy to weave into the call. Don't re-parse the .md for play-level facts — use the CSVs.
Optional — extra color via the MLB MCP. The announcer loves an aside, and the MCP gives him things to chew on that aren't in the dataset. Use sparingly — one or two per broadcast, woven into natural pauses (between batters, mid-inning lulls, after the moment-of-the-game). The dataset CSVs remain the authority on what happened; MCP data is garnish.
| Tool | In-character usage |
|---|---|
mcp__mlb__search_player → mcp__mlb__get_player_bio | Birthplace and handedness for featured batters/pitchers. "A left-hander out of Bluefield, West Virginia — not often you find 'em built like that down in the coal country." |
mcp__mlb__get_player_stats (season or career) | Contextualize a performance. "That makes thirty-one round-trippers on the summer, which if the log-book boys have it right puts him one clear of his mark from a year ago." |
mcp__mlb__get_stat_leaders | League leaderboard placement. "Eight whiffs tonight — the tabulating fellows tell me that's good for fourth in the junior circuit." |
mcp__mlb__get_standings | Post-game pennant-race line. "With tonight's verdict the club sits two and a half back of the front-runners — ground to make up, ladies and gentlemen, but the calendar's on their side." |
mcp__mlb__get_transactions (around game date) | Roster-move explanations. "You'll note a fresh face behind the dish — called up from the farm club just yesterday, according to the wire." For IL activity: "back from the sick bay" / "off the hospital list". |
mcp__mlb__get_team_info | Venue history / franchise factoid for scene-setting. |
Period vocabulary for MCP-sourced facts: IL/injured list → "the sick bay", "the hospital list"; transactions wire → "the roster wire", "the teleprinter"; leaderboard → "the batting ledger", "the circuit's pacesetters"; standings → "the pennant chase", "the standings as the log-book boys have 'em"; call-up → "up from the farm", "fresh off the minor-league train".
Load the style references. Before writing, read these in order:
references/style-guide.md — era voice, rules, and structural conventionsreferences/vintage-phrases.md — period vocabulary catalog to draw from (don't copy-paste; use as inspiration)references/translations.md — how to translate modern baseball tech/analytics (Statcast, ABS, sabermetrics, replay review, pitch clock) into period-accurate 1930s framingsreferences/example-calls.md — worked examples of how to transform PBP+Statcast into live-radio callsCompose the transcript (see "Output structure" below). Write to ~/games-attended/<slug>-broadcast.md — next to the source .md and dataset dir. For the April 17 Angels game, that's ~/games-attended/2026-04-17-padres-at-angels-broadcast.md.
Offer HTML. If the user said "open it", "make HTML", or similar, render with pandoc using the bundled stylesheet:
pandoc --from=gfm+yaml_metadata_block+smart --to=html5 --standalone \
--wrap=preserve \
-V document-css=false --metadata title=" " --metadata lang=en \
OUT.md -o OUT.html
Then inline scripts/broadcast.css into the <head> (strip pandoc's default <style> block first, same trick as the mlb-game-report renderer does).
---