{
  "markdown": "# @opengolfapi/mcp-server\n\n**Golf, for AI agents — the open data layer for golf.** Give your assistant every US golf course (16,845), free, and let it contribute back, sign players in, and run tournaments. Build a whole golf app from a prompt.\n\n[OpenGolfAPI](https://opengolfapi.org) is a community-owned commons. One free key, and your agent can read the world's golf data and write to four open standards.\n\n---\n\n## The standards (the whole story)\n\nOpenGolfAPI is built on open, composable protocols — implement one or all:\n\n| Standard | What it is | You use it to… |\n|---|---|---|\n| **OpenShot** | A CC0 shape for a launch-monitor shot — one schema every device maps to (Trackman, GSPro, Garmin, …). | Ingest shots from any monitor/sim → `log_shot`. |\n| **Moments** | The universal event ingest — *any* sensor signal (GPS breadcrumb, swing, putt, club, score, pin, condition, presence) as one flexible event. | Send whatever signal you have → `submit_moment`. |\n| **OpenJoin** | Signed, scoped, **expiring** join tokens. One QR/link → everyone who redeems lands in the same round/tournament = the group, linked. | Onboard a foursome or a whole tournament in one tap → `create_tournament_invite` / `join_tournament`. |\n| **OpenGolf ID** | A portable golf identity — *\"Sign in with OpenGolf.\"* One pseudonymous `player_id` across **every** app; handicap + history follow the player everywhere (engines fold by `player_id`, so a claimed identity's cross-app record just exists). | Give a player one identity the whole ecosystem shares → `sign_in_with_opengolf`. |\n\n**The big idea:** every shot, moment, and round contributed makes the shared commons better for everyone — a true two-way data layer. Read is free; contributing is how you earn your place in the standard.\n\n---\n\n## What your agent gets\n\n- **Read (free, no key):** search & compare courses · full scorecards (par / handicap / yardages) · hazards · live weather & climate · nearby places · tee advice.\n- **Contribute (free key):** `log_shot`, `submit_moment` → write to the open standards · `get_my_shots` → read your own data back.\n- **Identity & tournaments (free key):** `sign_in_with_opengolf` (portable ID) · `create_tournament_invite` + `join_tournament` (run an event — **handicaps optional**, gross or net).\n\nA great golf app is an afternoon, not a year.\n\n## Install (MCP client config)\n```json\n{\n  \"mcpServers\": {\n    \"opengolfapi\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@opengolfapi/mcp-server\"],\n      \"env\": {\n        \"OPENGOLFAPI_KEY\": \"<free, optional — enables contributing, identity & tournaments>\"\n      }\n    }\n  }\n}\n```\nGet a free `OPENGOLFAPI_KEY` at https://courses.opengolfapi.org/api-keys. Read tools work with **no key**.\n\n> **Claude Desktop:** the config file is `claude_desktop_config.json` (Settings → Developer → Edit Config). **Claude Code:** `claude mcp add opengolfapi -- npx -y @opengolfapi/mcp-server`. **Going keyless?** Delete the whole `env` block — every read tool works without it (do NOT paste the placeholder as a key).\n\n**First prompt to try:** *\"Find golf courses near Chicago and show me the hardest one.\"*\n\n**Which score tool when:** casual one-shot scoring → `score_round` · leagues/tournaments (scores arrive over time, standings matter) → `create_competition` → `record_attempt` → `finalize_competition` · streaming devices/live apps → `submit_moment`. Canonical domain model: https://api.opengolfapi.org/api/v1/model\n\n## Tools\n\n<!-- TOOLS:START (auto-generated from src by gen-manifest.mjs — do not edit by hand) -->\n_56 tools:_\n\n- `search_courses` — Search US golf courses by name, US state, or location (lat/lng + radius). Returns matching courses with location, type, par. Free, ODbL data.\n- `get_course` — Full detail for one course by id: scorecard (par + handicap per hole), tees, location, contact, nearby. Free.\n- `get_tees` — All tee sets for a course with ratings, slopes, and yardages. Free.\n- `get_weather` — Live weather forecast for a course location (Weather.gov). Free.\n- `get_climate` — Monthly climate normals + best months to play for a course. Free.\n- `get_nearby` — Nearby hotels, restaurants, and other courses for a course. Free.\n- `log_shot` — Contribute a golf shot to the open OpenShot standard (any launch monitor). Requires a key. Units: speed mph, angles deg, spin rpm, distance yds.\n- `submit_moment` — Contribute an Open Connect event from any sensor/wearable/phone. The whole sensor spectrum rides through here — type-specific data goes in `payload`. Requires a key.\n- `get_my_shots` — Read back your own contributed shots by player or session. Requires a key.\n- `get_my_moments` — Read back your own contributed moments (breadcrumbs, swings, putts, conditions…) by player, session, or type. Requires a key.\n- `propose_correction` — Propose a fix to a course FACT field (phone, website, address, architect, year_built, course_name, city, postal_code, course_type). Our AI reviews it (approve/reject/needs_info). Requires a key. Geometry is not correctable here.\n- `respond_to_review` — Respond to a correction that came back as needs_info — add a source or explanation and re-open it for review. Requires a key.\n- `get_correction` — Check the status/verdict of a correction you proposed (approved | rejected | needs_info | applied). Requires a key.\n- `how_to_build` — The safe playbook for building on OpenGolfAPI and contributing data the right way. Call this once before contributing.\n- `get_passport` — FREE (public, no key). Any golfer's shareable record — display name, OpenGolf Member #, courses played, rounds, trophies, referrals. Show a player's golf resume in your app.\n- `record_referral` — Record that one user referred another (a REFERRED_BY edge) — build YOUR app's invite loop on the shared graph, namespaced to your app. Needs a key.\n- `get_referrals` — How many golfers a user has referred (+ the list) — the viral-loop metric for your app. Needs a key.\n- `about` — What OpenGolfAPI is and how to use this MCP server.\n- `request_sign_in_code` — Start \"Sign in with OpenGolf\" for a person: emails them a 6-digit code. No API key needed. They read you the code, then call complete_sign_in.\n- `complete_sign_in` — Finish sign-in: exchange the 6-digit code for their OpenGolf ID + access token (use as X-OpenGolf-Token to act as them). Pass ref=<inviter player_id> when another player's invite brought them — it credits the referral.\n- `create_dev_key` — Mint a developer API key bound to an OpenGolf ID (sign in first via request_sign_in_code → complete_sign_in). Returns the key ONCE. First-party rail: no OpenGolf ID, no key.\n- `sign_in_with_opengolf` — Derive a user's OpenGolf ID deterministically from their email (sub = ogid_ + sha256(lower(trim(email)))[:16]) — one line, no redirect. For a VERIFIED session token use request_sign_in_code → complete_sign_in.\n- `register_webhook` — Register an https URL for your domain events (HMAC-signed deliveries, owner-scoped). Requires your key (Authorization: Bearer ogapi_…).\n- `create_tournament_invite` — Create a shareable invite (QR/link); everyone who redeems it joins the SAME event/session. max_uses caps size (foursome=4). Requires key.\n- `join_tournament` — Redeem an invite token — the player joins the group/event. Requires key.\n- `list_game_formats` — Every OpenMatch scoring format. GROSS scoring is free & keyless.\n- `score_round` — Score a round in any format — GROSS, FREE, no key. players:[{player_id,holes:{\"1\":4}}] or entries:[{player_id,hole,value}]; holes:[{hole,par,stroke_index?}].\n- `plays_like` — Effective distance — THE canonical \"plays like\" number (wind/elevation/temp/altitude), factors itemized. FREE, no key. Pair with get_conditions for live wind.\n- `get_conditions` — LIVE weather at a course (temp/wind/precip, forecast-model, 15-min cache). FREE. Feeds plays_like.\n- `link_dev_key` — Confirm your OpenGolf ID on an EXISTING key. Sign in first; pass that access_token + the key.\n- `list_dev_keys` — List the keys owned by your OpenGolf ID (prefixes only). Needs access_token from complete_sign_in.\n- `get_profile` — A player's public OpenGolf ID card — name, avatar, links, prefs. Free.\n- `update_profile` — Edit a player's self-asserted profile fields (derived facts can't be set). Requires key (claimed players need their grant).\n- `get_awards` — A player's OpenAwards — derived trophies + course passport. Requires key.\n- `set_beacon` — Broadcast a consented, EXPIRING presence/availability beacon (present|available|open). Requires key.\n- `find_beacons` — Discover ACTIVE public beacons (find-my-group / matchmaking). Requires key.\n- `record_consent` — Record a player's consent grant (auditable, revocable). Requires key.\n- `create_competition` — Create a Competition (any OpenMatch format). Requires key.\n- `list_competitions` — List Competitions (free). Filter org/course/status.\n- `get_competition` — A Competition + live gross standings (free).\n- `record_attempt` — Record an Attempt (score or side-game value). Idempotent. Requires key.\n- `finalize_competition` — Finalize — run the kernel, store the gross Result. Requires key.\n- `broadcast_feed` — OpenBroadcast P1 — ONE typed feed for a session: broadcast-worthy items (score/side_game/money/award/condition) in ascending (recorded_at, seq) order, each with template narration (headline<=60/ticker<=80). Money appears only via settled records. Replaces stitching moments+results+live_state. Requires key + session access (participant or compute).\n- `get_handicap` — OpenIndex (beta) — a player's estimated handicap computed from real, notarized rounds (every score stamped when it happened; verifiable by anyone). Not official — provable. Reading your OWN is free with your key; player_id must be the ogid_… form.\n- `get_showcase` — A player's public showcase — the collectibles/records on their OpenGolf ID (og.* namespaces + course.*). Free, keyless: pass their ogid_. Tombstoned (revoked/expired) records hidden. The provable trophy wall.\n- `verify_record` — Verify a record/collectible against the OpenGolf Chain (a signed, hash-linked, Bitcoin-anchored transparency log). Returns the hash + whether it matches + the CLIENT-RECOMPUTE recipe (sha256 of the canonical record) + the anchor. Then you can go further, all keyless: pull a merkle inclusion proof (GET /chain/anchors/:id/inclusion?hash=), verify the checkpoint's RS256 signature against /.well-known/jwks.json, and resolve the Bitcoin (OpenTimestamps) anchor. Free. Trust no one — recompute the hash, check inclusion, resolve Bitcoin yourself.\n- `list_webhooks` — List your active webhook subscriptions. Requires key.\n- `remove_webhook` — Deactivate one of your webhook subscriptions by id (audit row kept). Requires key.\n- `list_orgs` — Public directory of verified orgs (free).\n- `mint_asset` — Mint an Asset (trophy/badge/stamp/coupon/membership) into the owner's trophy case + chain. Requires key.\n- `file_claim` — File a Claim in the trust ledger (ownership/attestation/identity/record/correction). Requires key.\n- `list_claims` — List Claims (free). Filter claimant/subject/status.\n- `post_beta` — Drop local course knowledge (\"beta\") on a hole — the AI-caddie's fuel. Requires key.\n- `get_beta` — Read local course knowledge for a course/hole (free).\n- `get_my_chain` — Export YOUR tamper-evident OpenGolf Chain + checkpoints. Requires key (own-read free).\n- `verify_chain` — Verify a Chain export OR walk the public transparency log (GET /chain/log?subject=), public + keyless — recompute the hash-links, verify each RS256 checkpoint signature against the JWKS, and resolve the Bitcoin anchors; reports tampering and where. The whole history (registry, per-course, master) is independently auditable — trust no one.\n<!-- TOOLS:END -->\n\n## The bigger ecosystem — two front doors\nAgents come through this MCP; **sensors/devices** come through **OpenGolf Connect** (one open connector streaming shots from any launch monitor — R10, MLM2PRO, Uneekor, SkyTrak, Foresight — into `POST /v1/shots`). Both write to the same open commons. → https://opengolfapi.org/connect\n\n## Learn more\n- **Full AI-coder guide:** https://api.opengolfapi.org/llms-full.txt\n- Machine spec (OpenAPI 3.1): https://api.opengolfapi.org/openapi.json\n- OpenShot field catalog: https://api.opengolfapi.org/api/v1/openshot/fields\n- Moments field catalog: https://api.opengolfapi.org/api/v1/moments/fields\n\nMIT licensed. Course data ODbL. Shots CC0.\n\n**Attribution (required if you display or redistribute the data):**\nCourse data © [OpenStreetMap contributors](https://www.openstreetmap.org/copyright) ([ODbL 1.0](https://opendatacommons.org/licenses/odbl/1-0/)) via OpenGolfAPI ·\nWeather data by [Open-Meteo.com](https://open-meteo.com/) (CC BY 4.0) ·\nDescriptions from Wikipedia (CC BY-SA 4.0) ·\nContact + social from Foursquare / Overture (Apache 2.0).\nFull list: https://opengolfapi.org/attribution\n",
  "bytes": 12851,
  "sha": "07949be08c05bd7e07f3a2647c7d371d358de9663dcc158f1dc6a08d4c57c6b0",
  "repo_slug": "opengolfapi/mcp-server",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_opengolfapi_mcp_server_61057b87/readme"
}