golf-coach
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@golf-coach What's my Trackman handicap?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Golf Coach
A golf coach that trains you purely on your stats — round after round, closer to scratch.
Golf Coach logs into Trackman Golf with your own account and turns your stats — course rounds, practice sessions, shot-level launch-monitor data, club gapping, and handicap — into a diagnosis of where you're losing strokes, then hands you a specific practice plan with drills and YouTube links for your next session and grades your progress over time. It ships as an MCP server (the data tools) plus Claude skills (the coaching brain).
What you get
You don't read the charts — you get a coach. Point it at your Trackman data and it:
Finds where you're actually losing strokes — not "work on your irons," but "your driver has a two-way miss spreading landings across a ~115 m corridor — the speed is real, the face isn't yet."
Hands you one specific session — clubs, distances, reps, a Trackman target, and a drill with a real YouTube link. Stuck indoors? It has an at-home, no-ball routine too.
Grades your progress — it saves the plan and checks your next session against it, so you actually know whether it worked.
Shows you the picture — an animated view of your ball flight, the swing path behind the miss, and how close you are to each target.

A real session diagnosis: what's wrong, why, how close you are to your targets, and exactly what to practice next.
Name note. "Golf Coach" is the product name. The technical ids stay
golf-coach(MCP server / plugin) andgolf-coach(the published package), so existing installs keep working.
Unofficial. This project is not affiliated with or endorsed by Trackman. It talks to Trackman's private web API using a token from your own authenticated session, and automates a browser login on your behalf. This may conflict with Trackman's Terms of Service — use it on your own account, at your own risk. Never use it to access anyone else's data.
Related MCP server: Pierre Fitness Platform MCP Server
Design boundary
MCP server = raw data fetch + auth only. No opinions.
Skills = all the coaching (analysis, plans, drills).
See CLAUDE.md for the full architecture and auth/secret rules.
Install
Pick the path for how you use Claude. Each takes about two minutes, then do the one-time Authentication step.
🖥️ Claude Desktop — one-click (recommended, no terminal)
Download
golf-coach.mcpb(from the latest release).Open Claude Desktop → Settings → Extensions, drag the file in (or double-click it), and click Install. Leave the token field blank.
In a chat, say "log in to Trackman" → a browser window opens → sign in once with your Trackman email + password (Apple / Google sign-in works too). The window stays open until you finish — take your time, it won't close on its own. When you're done, tell Claude and it confirms you're signed in.
Ask Claude: "What's my Trackman handicap?"
Nothing to install and no config to edit — Claude Desktop runs everything and opens the sign-in browser for you. (First sign-in may take a moment if it needs to fetch a browser. You may also see an "unsigned extension" note — expected for one installed from a file.)
Platforms: macOS, Linux, and Windows — Claude Desktop runs the server via
uv on all three, and the browser sign-in uses Playwright (cross-platform). One
caveat on Windows: the local token/data files are protected by your Windows user
profile (ACLs) rather than POSIX 0600 modes. The optional cron/launchd
auto-refresh script is macOS/Linux only — on Windows use Task Scheduler, or just
re-run the in-app "log in to Trackman" when the ~7-day token lapses.
⌨️ Claude Code — plugin (server and coaching skills)
/plugin marketplace add bjornj12/golf-coach
/plugin install golf-coach@golf-coachInstalls the MCP server (run via uvx) and all ten coaching skills.
🔌 Other MCP clients (or Claude Desktop without the extension)
Requires uv (curl -LsSf https://astral.sh/uv/install.sh | sh).
Add this to your client's MCP config:
{
"mcpServers": {
"golf-coach": { "command": "uvx", "args": ["golf-coach"] }
}
}For Claude Desktop's manual config (
~/Library/Application Support/Claude/claude_desktop_config.jsonon macOS), use the absolute path touvx— e.g./opt/homebrew/bin/uvx— because the app doesn't inherit your shellPATH. The.mcpbinstall above avoids this entirely.
Authentication (one-time)
The server needs to sign in to your Trackman account. Trackman has no public login API, so it captures a token from a real signed-in browser session once; it's then cached locally and refreshes itself. Your password is never seen or stored by the tool, and nothing leaves your machine.
Easiest — just ask Claude to log in (Claude Desktop / Claude Code)
Say "log in to Trackman." A browser window opens (an isolated profile, not
your normal Chrome); sign in once, at your own pace — the window is driven by a
background task, so it stays open until you're done and won't be closed out
from under you (even a slow Apple/Google 2FA is fine). When you've finished,
tell Claude and it confirms. The token caches at ~/.golf-coach/token.json
(mode 0600) and the MCP uses it automatically from then on. No terminal, no
token to copy — the extension fetches a browser itself if you don't have one.
Terminal alternative (CLI users)
uv tool install "golf-coach[login]"
golf-coach login # opens a browser; sign in once
golf-coach login --headless # silent refresh later (tokens last ~7 days)
scripts/install-refresh-schedule.sh # optional: auto-refresh twice weeklyAdvanced — paste a token
portal.trackmangolf.com → DevTools → Network → a graphql request → copy
the Authorization: Bearer … value → paste into the extension's Trackman
token field (or set TRACKMAN_TOKEN). Tokens expire after ~7 days, so the
sign-in flows above are easier.
Verify it worked
Ask Claude "Am I signed in to Trackman?" — it runs auth(action="status") and
replies with your name (never the token).
MCP tools
All tools return raw data only; the skills interpret it.
8 tools. trackman and gamebook each take an action (so the agent
picks one tool with a mode rather than many near-identical tools).
Setup: setup — one call returns an always-on coach system prompt (for a
Project), the skills as upload-ready files, and per-client steps. There's a
matching setup prompt in the picker.
Auth: auth(action: status | login, source?)
Trackman data (read-only): trackman(action: profile | handicap | sessions | session | rounds | clubs | summary) — profile+handicap, handicap history,
activity list, one activity in full (incl. shot-level metrics), course rounds,
club gapping, activity counts.
Gamebook rounds (local, deterministic): gamebook(action: save | list | get | compare) — on-course rounds ingested from Golf GameBook screenshots,
rolling last 5, coverage-aware (only score-per-hole is trusted).
Cross-source synthesis (local, deterministic): synthesize() — aligns
Trackman's and GameBook's per-source Findings by skill area (no verdict; see
CLAUDE.md's "Sources & normalization").
Session analysis (local, deterministic): session_analysis(action: analyze | get | list)
Training-plan memory: training_plan(action: save | next | list | done | verify)
Visualization: build_visualization (self-contained animated HTML artifact)
See CLAUDE.md for the full table and backing GraphQL.
Skills (coaching brain)
The skills under skills/ are delivered two ways:
Claude Code: installed automatically with the plugin.
Any MCP client (incl. Claude Desktop): the server serves them as MCP prompts, so they show up in your client's prompt picker — no separate install.
Skill | What it does |
| Diagnose weaknesses from the data |
| Turn the diagnosis into an actionable practice plan (visual-first; auto-grades progress) |
| Curated drills + vetted links — incl. at-home / no-ball drills — plus live search |
| Build a daily no-ball routine for a diagnosed fault, animated per drill |
| A single mobile-first drill card with built-in feedback: prop, validation checkpoint, budget tier, video |
| Ingest + normalize recent sessions |
| Ingest GameBook round screenshots into a coverage-aware round record; scoring-led progress that feeds the coach |
| Frame-by-frame visual check of a filmed swing (one angle per clip) against the current practice card |
| Grade the grip (too weak / too strong) from two face-forward photos — the coach's gate before any new prescription |
| Animate a diagnosis (or a single drill's mechanics) as an HTML artifact |
To check a filmed swing: drop a clip named DATE_CLUB_ACTION.mp4 (e.g.
2026-07-17_driver_grip-reset.mp4) into the project in Claude Code and say
"check my swing" — you get an angle-scoped checklist and one swing thought
(needs ffmpeg).
(trackman-api-discovery is a project/dev skill and isn't served as a prompt.)
Development
uv venv && uv pip install -e '.[login,dev]' # [login] = Playwright, [dev] = test/lint tools
golf-coach # run the MCP server (stdio)
uv run python scripts/validate.py # sanity-check stats coverage with your token
uv run pytest # tests
uv run ruff check # lint
uv run mypy # type-checkReleasing (PyPI + MCP Registry + the Desktop .mcpb) is one command —
scripts/release.sh patch — see PUBLISHING.md.
License
Available Tools
8 toolsauthA
Check or (re)establish your Trackman sign-in.
Actions:
status(default): report whether the current token works and who you're signed in as. Use this first; it never opens anything.login: (re)authenticate. If already signed in, confirms instantly. If the saved session expired andopen_browseris true, it opens a sign-in window and returns immediately withpending: true— the window stays open for a few minutes and the user signs in at their own pace (the browser is driven by a background task, so it won't close on its own). After the user says they've finished, callauth(action='status')to confirm. Do NOT re-callloginwhile one is pending — it won't open a second window.
source selects the data source to authenticate; only trackman needs auth
(other sources, e.g. GameBook, are local). Never echoes the token.
Inputs: action, source, open_browser. Returns: object
build_visualizationARead-onlyIdempotent
Render a coaching diagnosis into a self-contained animated HTML page.
Returns {html} — one standalone document (inline canvas/JS, no network, no
external resources) ready to drop straight into a Claude HTML artifact.
data shape (all optional; the viz adapts): {title, subtitle, diagnosis,
handedness "RH"|"LH", shots:[{launchDirection,launchAngle,carry,total,
totalSide,curve,maxHeight,landingAngle,hangTime}],
swing:{clubPath,faceAngle,faceToPath}, targets:[{label,value,target,low,
high,met}], blocks:[{name,detail,goal,where "range"|"home",
links:[{label,url}]}]}. Renders the measured flight (side view + top-down,
animated) and drills grouped range/home. See the trackman-visualizer prompt.
Inputs: data (required). Returns: object
gamebookA
On-course rounds ingested from Golf GameBook screenshots (local, last 5).
The gamebook-screenshot-analysis skill extracts a round from screenshots
and saves it here. Only score-per-hole is trusted; every other dimension
carries a coverage flag (full|partial|none) and analysis respects it.
Actions:
save(needsround): a coverage-aware record — {date, course:{par,cr,slope}, result:{gross,net,to_par,position}, holes:[{hole,par,score,putts?,fairway?, gir?,bunkers?,chips?,penalties?}], coverage:{...}, dimensions:{...}}. Runs a self-check (hole sums vs gross/par); refuses inconsistent reads. Computes thescoringblock, stores it (last 5), returns the stored record.list: index of stored rounds (id, date, gross, net, to_par, coverage), newest first.get(needsround_id): one full stored round.compare(optionalround_id, default latest): deterministic deltas vs the rounds before it — scoring always, other dimensions only where both tracked them. Returns measurement; the coach narrates progress from it.
Inputs: action (required), round, round_id. Returns: object
session_analysisA
Per-session analysis (deterministic classification + metrics, stored locally).
Actions:
analyze(needsactivity_id): fetch a session, classify it (warm-up vs serious practice vs game), compute metrics, normalize vs prior stored sessions, store the record (last 30 kept), and return it.get(needsactivity_id): return one stored analysis record.list: return the index of stored analyses (most recent first).
Drive this with the trackman-session-analyzer prompt.
Inputs: action (required), activity_id. Returns: object
setupARead-onlyIdempotent
One-call onboarding for the Trackman golf coach.
Returns everything needed to set the coach up in your client:
system_prompt: paste into a Claude/ChatGPT Project's custom instructions so every chat in it is the coach (with this MCP connected);skills: upload-readySKILL.mdfiles (Settings → Capabilities → Skills) for always-on auto-activation;instructions: per-client steps (Claude Projects, Desktop Skills, ChatGPT, Claude Code).
An MCP server can't create the Project or enable Skills itself — this hands
you the content + steps. In Claude Code, the assistant can write the files
for you directly from this kit. (Pairs with the setup prompt.)
Inputs: no named parameters. Returns: object
synthesizeARead-onlyIdempotent
Cross-source, context-aware view: runs each source's expert analyzer and aligns their findings by skill area (no verdicts — the coach interprets).
Also returns two extra FACTUAL sections (measurement-only): delivery — the
driver club-delivery facts (path / face-to-path / spin-axis / attack / spin);
and leak_ranking — skill areas ordered by measured deviation-from-band
severity. If the Trackman token has expired (and a silent refresh failed),
this raises loudly rather than returning an empty view — re-auth with
auth(action='login') and retry.
Inputs: no named parameters. Returns: object
trackmanARead-onlyIdempotent
Trackman data reads (controlled/flat-lie launch-monitor data). Raw only.
Actions:
profile: identity + current handicap (hcp.currentHcp, latest record).handicap(pagingskip/takedefault 20,only_in_avg): handicap history — per-round differentials and how the index moved.sessions(skip/takedefault 25,kinds,time_from/time_to,include_hidden): list activities (practice sessions and course rounds) — totalCount + a page of item summaries. Usesessionwith an item's id for full detail.session(needsactivity_id): one activity in full, with shot-level launch metrics (RANGE_PRACTICE strokes) or the scorecard (COURSE_PLAY).rounds(skip/takedefault 20,completed): course rounds (scorecards) — per-hole scores and roundstataggregates.completed=Nonereturns all rounds regardless of completion state.clubs(include_retired): per-club gapping and dispersion ("My Bag" / Find My Distance) — the source for gapping analysis.summary(time_from/time_to,skip/takedefault 50): activity counts grouped by kind over an optional time window.
take defaults to each action's own historical default (20 for handicap
and rounds, 25 for sessions, 50 for summary) when omitted; pass it
explicitly to override.
Inputs: action (required), skip, take, kinds, +7 more. Returns: object
training_planA
The coach's memory: save prescribed practice plans and recall/grade them.
Actions:
save(needsplan): persist a prescribed plan to the pending queue. Theplanis a structured dict — title, focus, diagnosis, blocks [{name, club, reps, detail, link, goal}], and optionaltarget_specs(machine-readable targets, e.g. {metric:'clubPath', club:'DRIVER', op:'between', low:-1, high:2}) used byverify. Returns the stored plan (with id). Capped at the most recent 50.next: return the next pending plan — the answer to "what's today's training?".list(optionalstatus='pending'|'done'): list plans, oldest→newest.done(needsplan_id, optionalresult_session_id): mark a plan complete.verify(needsplan_id, optionalactivity_id): grade a recent session's real shot metrics against the plan'starget_specs; returns per-target session-mean vs target,all_met, and a recommendation.
Inputs: action (required), plan, status, plan_id, +2 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 8 tools
Each tool targets a distinct domain: authentication, Trackman data queries, session analysis, training plan management, visualization rendering, setup/onboarding, cross-source synthesis, and GameBook round management. No two tools have overlapping purposes; the only minor overlap is between `source`'s `rounds` and `gamebook`'s stored rounds, but they are clearly separated by data source.
The tool names use inconsistent styles: some are noun-like (`auth`, `source`, `setup`, `gamebook`), some are verb-like (`synthesize`, `build_visualization`), and some are underscore-separated nouns (`session_analysis`, `training_plan`). There is no consistent verb_noun pattern across the set, though each name is self-explanatory and readable.
With 8 tools, the server is well-scoped for a golf coaching workflow. Each tool covers a distinct functional area, and the number falls within the ideal 3-15 range, so the tool count is appropriate.
The tool surface covers the full coaching lifecycle: data ingestion (Trackman, GameBook), raw data queries, session analysis, training plan creation and verification, cross-source synthesis, visualization output, and setup/onboarding. There are no obvious dead ends; the only minor gap might be lack of explicit delete/update operations, but the retention caps and completed statuses handle that in practice.
Maintenance
Related MCP Connectors
Your own golf rounds, stats, handicap record and swings. Logs practice and rounds with your OK.
Your golf caddie in your AI: reads your rounds, handicap and swings, and saves what you tell it.
Training log for coaches: your AI assistant finds clients, reads history, logs and plans workouts.
AI coach for Garmin: builds training plans and structured workouts, synced straight to your watch.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI-powered racing coaching and telemetry analysis for iRacing, providing real-time racing advice, car spotting, lap analysis, and conversational interaction with racing data through live telemetry streaming.2MIT
- FlicenseNot gradedqualityNot gradedmaintenanceConnects AI assistants to fitness data from over 150 wearables including Strava, Garmin, and Fitbit through the Model Context Protocol. It provides 47 tools for sports science-based analysis, training load management, recovery tracking, and personalized nutrition planning.16-
- FlicenseNot gradedqualityDmaintenancePulls golf data from Arccos, GHIN, and 18Birdies, and generates interactive HTML and PDF round reports with shot maps and stats via local MCP tools.-
- FlicenseNot gradedqualityAmaintenanceGrants AI assistants read-only access to your WHOOP recovery, sleep, HRV, strain, and workout history so you can ask natural-language questions about daily readiness, personal baselines, sleep debt, trends, and weekly reviews. It also rebuilds HYROX and triathlon sessions, tracks race load and readiness, and runs a local dashboard for auditing and correcting performance data.21 npm-