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 naturally. Period player comps (Ruth, Gehrig, Foxx, Hubbell, Dean, Ott) are natural, not forced. The masthead date matches the source date.
references/vintage-phrases.mdHe 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).
---