You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
2.8.0: free gross scoring + identity-gated dev keys (no id, no key)
+5 tools (22→27): list_game_formats, score_round (gross, keyless — the game is free),
create_dev_key + link_dev_key + list_dev_keys (Sign in with OpenGolf → mint/confirm a key
bound to your OpenGolf ID). Guard updated: /compute(gross) + /developer are OPEN; the moat
(settle/events/geo/ads/surface/stats) stays blocked. README + server.json synced.
Copy file name to clipboardExpand all lines: README.md
+6-1Lines changed: 6 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -48,7 +48,7 @@ Get a free `OPENGOLFAPI_KEY` at https://courses.opengolfapi.org/api-keys. Read t
48
48
## Tools
49
49
50
50
<!-- TOOLS:START (auto-generated from src by gen-manifest.mjs — do not edit by hand) -->
51
-
_22 tools:_
51
+
_27 tools:_
52
52
53
53
-`search_courses` — Search golf courses by name, state, or location. Returns full course info. ODbL licensed data from OpenGolfAPI.
54
54
-`get_course` — Get detailed golf course info including full scorecard with par and handicap index per hole. ODbL licensed.
@@ -65,6 +65,11 @@ _22 tools:_
65
65
-`join_tournament` — Join a player into a tournament/round by redeeming its invite token. The player lands in the shared event = part of the field. Handicap is optional: gross by default (no handicap needed); if the player has one it auto-applies for net. Requires OPENGOLFAPI_KEY.
66
66
-`request_sign_in_code` — Start "Sign in with OpenGolf" for a player: emails them a 6-digit code. No API key needed — the email authenticates them. They read you the code, then call complete_sign_in.
67
67
-`complete_sign_in` — Finish "Sign in with OpenGolf": exchange the player's 6-digit code for their OpenGolf ID access token + portable player_id. Use the returned access_token as the X-OpenGolf-Token header to act AS the player, within whatever scopes you were granted. scopes: space-separated (default "identity").
68
+
-`list_game_formats` — List every OpenMatch scoring format (stroke, stableford, match_play, skins, scramble, best_ball, nassau, ctp, longest_drive, greenies, wolf, …) and the free/gated line. GROSS scoring is free + keyless; net/handicap, settlement, strokes-gained & tournament scale are gated. No key needed.
69
+
-`score_round` — Score a round in any format — GROSS, FREE, no key. players: [{player_id, holes:{"1":4,...}}] for stroke formats, or entries:[{player_id,hole,value}] for shot formats (ctp/longest_drive/greenies). holes: [{hole,par,stroke_index?}]. Returns standings. NET/handicap is the gated tier (add a compute key); money-safe settlement lives elsewhere.
70
+
-`create_dev_key` — Sign up to build: mint an API key bound to your OpenGolf ID. Requires an OpenGolf ID access_token (from complete_sign_in) + the SAME email you signed in with. No OpenGolf ID, no key. Returns the key ONCE. Free scope = read + contribute + keyless gross scoring; net/settlement/geometry/game need an entitled key ([email protected]).
71
+
-`link_dev_key` — Confirm your OpenGolf ID on an EXISTING (legacy) key — the simple "add my ID" step. Sign in with the email the key was issued under, then call this with that access_token + the api_key. Verifies + keeps the key and its scopes. (We don't revoke legacy keys — they just confirm their ID.)
72
+
-`list_dev_keys` — List the API keys owned by your OpenGolf ID (prefixes only — never the secret). Requires an OpenGolf ID access_token from complete_sign_in.
68
73
-`get_profile` — Read a player's public OpenGolf ID card — display name, avatar, links, home course, golf prefs, bucket list. Apps render it as a player card. Requires OPENGOLFAPI_KEY.
69
74
-`update_profile` — Edit a player's OpenGolf ID profile — self-asserted fields (display_name, avatar_url, bio, links, home_course_id, bucket_list, preferred_formats…). Derived facts (handicap/stats) cannot be set here. A claimed player needs their grant. Requires OPENGOLFAPI_KEY.
70
75
-`get_awards` — A player's OpenAwards — earned trophies (aces/eagles/birdies/broke-X/money/streaks/loyalty, all derived + unfakeable), organizer-granted custom awards, and the course passport (distinct courses played + logos). Requires OPENGOLFAPI_KEY.
constgated=calls.filter((p)=>/\/(compute|events|geo|ads|surface)\b|settle|players\/[^/]*\/stats/.test(p));// awards/profile/beacon are OPEN (player features)
24
+
constgated=calls.filter((p)=>/\/(events|geo|ads|surface)\b|settle|players\/[^/]*\/stats/.test(p));// compute(gross)/developer/awards/profile/beacon are OPEN
24
25
if(gated.length){console.error('gen-manifest: PUBLIC MCP calls GATED paths — paid/gated must NEVER be public:',gated.join(', '),'\nAborting.');process.exit(1);}
25
26
26
27
// 1) server.json — keep version in sync (the official MCP registry schema is strict: no `tools` field,
Copy file name to clipboardExpand all lines: package.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
{
2
2
"name": "@opengolfapi/mcp-server",
3
-
"version": "2.7.0",
3
+
"version": "2.8.0",
4
4
"description": "Golf for AI agents — every US course free, plus open contribution (OpenShot/Moments), portable identity & tournaments. The open data layer for golf.",
'Score a round in any format — GROSS, FREE, no key. players: [{player_id, holes:{"1":4,...}}] for stroke formats, or entries:[{player_id,hole,value}] for shot formats (ctp/longest_drive/greenies). holes: [{hole,par,stroke_index?}]. Returns standings. NET/handicap is the gated tier (add a compute key); money-safe settlement lives elsewhere.',
// ── Developer — no OpenGolf ID, no dev key. Sign in (request_sign_in_code → complete_sign_in) to get an
641
+
// access_token, then mint/link/list your keys. New keys = free scope (read+contribute+gross). ──────────
642
+
server.tool(
643
+
'create_dev_key',
644
+
'Sign up to build: mint an API key bound to your OpenGolf ID. Requires an OpenGolf ID access_token (from complete_sign_in) + the SAME email you signed in with. No OpenGolf ID, no key. Returns the key ONCE. Free scope = read + contribute + keyless gross scoring; net/settlement/geometry/game need an entitled key ([email protected]).',
645
+
{opengolf_token: z.string().describe('access_token from complete_sign_in'),email: z.string().describe('the email of your OpenGolf ID'),name: z.string().optional(),accept_terms: z.boolean().optional()},
'Confirm your OpenGolf ID on an EXISTING (legacy) key — the simple "add my ID" step. Sign in with the email the key was issued under, then call this with that access_token + the api_key. Verifies + keeps the key and its scopes. (We don\'t revoke legacy keys — they just confirm their ID.)',
656
+
{opengolf_token: z.string().describe('access_token from complete_sign_in'),api_key: z.string().describe('the existing ogapi_ key to link')},
0 commit comments