# golfdata.online — llms-full.txt > Extended agent guide. MCP server version 1.3.1. Section 1 is the full https://golfdata.online/llms.txt; sections 2-5 add fuller tool docs, the feed and club-card schema, citation rules and a country/region index. --- # Section 1 — llms.txt # golfdata.online > Verified directory of golf clubs for people and AI agents, across Europe (17 countries, Spain first). Every fact links to its sources and carries a last_verified date. Canonical site: https://golfdata.online > This is a directory of golf clubs and courses (facts, booking links, and booking requests where enabled); it is not related to golfdata.co, a golf-equipment price catalogue. ## MCP server (read-only except request_booking, no key needed) - Endpoint: https://golfdata.online/mcp (MCP Streamable HTTP, stateless JSON-RPC 2.0, POST) - Discovery card: https://golfdata.online/.well-known/mcp.json (MCP server card: endpoint, tools, limits); also served at https://golfdata.online/.well-known/mcp/server-card.json (identical content) - Official MCP Registry name: online.golfdata/golf-clubs - Tools: - search_clubs: search approved clubs (summary records with last_verified; leads, not citable facts) - get_club: one club by UUID or slug, all facts with sources[] - list_sources_for: provenance of a club (source URL, publisher, trust level, field, retrieved_at) - request_booking: send a booking request to a club that has booking.requests_enabled true (routed by email or a WhatsApp link); you must have the golfer's consent to share their details - request_booking is the only tool that writes. It works only for a club whose card says `booking.requests_enabled: true`; for any other club it returns `accepted: false`. golfdata forwards the request to the club by email or a WhatsApp click-to-chat link and does NOT confirm the booking. Get the golfer's consent before sending their name, email or phone. - Limits (live today): 20 units per minute per client IP (get_club = 4 units); search_clubs accepts limit <= 10 (a larger limit is refused with JSON-RPC error -32011, retry with limit <= 10). Over the budget: HTTP 429 with Retry-After. These are the strict limits the server runs until its shared limiter is switched on; this file will say so when they rise. ## Data provenance - Approved data only: a club is published after a validation gate that checks its identity (name, location, website) against the sources listed with it, such as official directories, OpenStreetMap, Google Places and the club's own site. Nothing from staging is shown. - Every record carries its sources (URL, publisher, trust level, retrieved date, fields confirmed) and last_verified (ISO 8601). - Fields where sources disagree are left empty ("Not verified") rather than guessed. ## Entry points - [How to use golfdata (people + AI agents)](https://golfdata.online/ai): the MCP server, the JSON feed, llms.txt, the discovery card, schema.org JSON-LD and citation rules (also in Spanish https://golfdata.online/es/ai and German https://golfdata.online/de/ai; English is the reference) - [llms-full.txt](https://golfdata.online/llms-full.txt): this file plus fuller per-tool docs, the feed and club-card schema, citation rules and a country/region index - [English](https://golfdata.online/en), [Español](https://golfdata.online/es), [Deutsch](https://golfdata.online/de): home (free AI readiness check for clubs) - Club search: https://golfdata.online/{en|es|de}/clubs?q={name or town}&country={ISO 3166-1}®ion={region} (at most 60 results by name) - Club pages: https://golfdata.online/{en|es|de}/clubs/{slug} (schema.org GolfCourse JSON-LD, non-null fields only) - Club feed: https://golfdata.online/api/clubs/{slug} (JSON: the verified row, the facts the club published from its verified account, every source with URL and trust level; cacheable 1 h, CORS open, no key) - Club page as Markdown: https://golfdata.online/{en|es|de}/clubs/{slug}.md (the club page as Markdown for agents — same facts and provenance as the feed, with per-field sources and a citation line; cacheable 1 h, CORS open, no key) - [About the data](https://golfdata.online/en/about) - [Sitemap](https://golfdata.online/sitemap.xml): every page in every language, with hreflang alternates - [For golf clubs](https://golfdata.online/en): free AI readiness check of a club website, with a live results screen and a shareable result page ## Club card v1 - The club card (`card_version: "1.2"`) is ONE canonical object per club with identity, location, contact, course, play (green fees with a basis), booking (channels, provider, lead time, cancellation, expected response), hours, facilities, status, per-field provenance and licence. JSON Schema: https://golfdata.online/schema/card-v1.json - Where to get it: MCP get_club returns it as `result.structuredContent.card`; the per-club feed (https://golfdata.online/api/clubs/{slug}) returns the same object under the top-level `card` key. The club page's schema.org JSON-LD is a projection of it. - Provenance: every field in `provenance.fields` carries `verified_by` = `directory` (golfdata's pipeline from fetched sources), `club` (the club itself, from a verified account) or `agency` (the club's web agency re-confirmed it), plus an `origin` (how the value was produced). A derived value is never `verified_by: club`. - `status.claimed` means a verified account has claimed the club (the claimant is never exposed); `status.verified_by_club` means the club published the facts in `status.club_verified_fields`. The two are independent: a claim with no published facts confirms nothing. - Absent ≠ false: unknown facts are `null` (or `[]`), never guessed. `currency` is mandatory whenever an amount is present (ISO 4217; country default unless the club overrides it). `booking.expected_response` is the club's own statement ("the club says"), not a golfdata promise. `booking.requests_enabled` tells you whether the club accepts booking requests (`false` for most clubs); when `true`, `booking.request` carries `{mcp_tool: "request_booking", url}` (the `/book` page). golfdata only forwards the request to the club (by email or a WhatsApp link) and never confirms a booking; send a golfer's personal data only with their consent. ## Usage - Cite the source links and last_verified date when repeating facts. - Visits by AI agents to club pages and MCP tool calls are counted per club and agent family (no IPs) and reported to the club; nothing on the club's own website is touched or counted. - MCP tools take an optional "question" (the golfer's question, as asked) and "topic": stored to show clubs what golfers ask, with contact details, links and numbers removed on arrival, raw text deleted after 30 days; clubs see counts and reworded summaries only. Pass it when you have one; it never changes the answer. - Tracked contact links: get_club and search_clubs results, the per-club feed and club pages carry a `links` object of tracked booking/website/phone URLs on golfdata.online. Give users `links.*` so the club sees demand for it (clicks are counted per club, no IPs); the raw booking_url/website/phone values are unchanged and stay citable. - Map data © OpenStreetMap contributors; do not scrape map tiles. --- # Section 2 — MCP tools, limits and the question/topic disclosure ## MCP tools (full reference) Endpoint `{SITE}/mcp` (MCP Streamable HTTP, stateless JSON-RPC 2.0, POST), protocol 2025-06-18, registry name online.golfdata/golf-clubs, no key. Every tool declares an outputSchema in tools/list; results arrive as structuredContent plus the same JSON as text in content[0].text. ### search_clubs (read-only) Search approved golf clubs and courses across Europe by a free-text fragment (matches name, island, municipality or region), and/or ISO country code, island, region and municipality filters. Returns summary records (with last_verified) only; fetch provenance with get_club or list_sources_for before citing. Arguments: - query (string, optional): Name, island, municipality or region fragment. - country (string, optional): ISO 3166-1 alpha-2 country code, e.g. ES. - island (string, optional): Island name, e.g. Tenerife. - region (string, optional): Region or province name. - municipality (string, optional): Municipality or town. - question (string, optional): The golfer's question, as asked (stored without personal data; does not change the answer). - limit (integer, optional): Max results, 1..10 (default 10); a larger limit is refused with JSON-RPC error -32011. ### get_club (read-only) Get one approved club by UUID or slug, with all facts, sources[] and club_facts (what the club itself published from its verified account), or found: false. Arguments: - id_or_slug (string, required): Club UUID or slug. - question (string, optional): The golfer's question, as asked (stored without personal data; does not change the answer). - topic (string, optional): What the golfer wants to know (e.g. green_fee, booking, hours, visitors). ### list_sources_for (read-only) List provenance (source URL, publisher, trust level, field, retrieved_at) for a club. Arguments: - entity_type (string, required): Entity type (currently "club"). - entity_id (string, required): Entity UUID. ### request_booking (writes — forwards a booking request to the club) Send a booking request to a club whose card says booking.requests_enabled is true. golfdata only forwards the request to the club (by email or a WhatsApp link); it does not confirm the booking. Returns a request id and, for the WhatsApp channel, a tracked link. Only works for enabled clubs; get the golfer's consent before sending their personal data. The golfer's details are forwarded to the club and kept for 24 months, then anonymized; a golfer can ask to erase them sooner via hello@golfdata.online. Arguments: - club_id (string, required): Club UUID (from get_club or the card). - date (string, required): Requested play date, YYYY-MM-DD (today..+365). - time (string, optional): Preferred tee time, HH:MM (24h). - players (integer, required): Number of players, 1..8. - holes (integer, optional): 9 or 18. - name (string, required): The golfer's name (with their consent). - email (string, required): The golfer's email (with their consent); used as reply-to, never shared beyond the club. - phone (string, optional): The golfer's phone in E.164 (with their consent). - message (string, optional): Optional message to the club (max 500 chars). - channel (string, optional): email (default) or whatsapp. ## Limits, costs and errors - Budget: 20 units per minute per client IP. These are the strict limits the server runs until its shared limiter is switched on; they may rise (this file will say so when they do). - Cost per call: get_club = 4 units; every other tool = 1 unit. - search_clubs accepts limit 1..10 (default 10); a larger limit is refused with JSON-RPC error -32011 — retry with limit <= 10. - Over budget: HTTP 429 with a Retry-After header. - Unknown tool name or an entity_type other than "club": JSON-RPC error -32602. - request_booking is the only tool that writes. It works only for a club whose card says `booking.requests_enabled: true`; for any other club it returns `accepted: false`. golfdata only forwards the request to the club (by email or a WhatsApp click-to-chat link) and never confirms the booking. ### The question/topic disclosure - search_clubs and get_club take an optional `question` (the golfer's question, as asked) and get_club an optional `topic` (e.g. green_fee, booking, hours, visitors). They are stored to show clubs what golfers ask — contact details, links and numbers removed on arrival, raw text deleted after 30 days; clubs see counts and reworded summaries only. Pass them when you have one; they never change the answer. --- # Section 3 — feed and club card ## Per-club JSON feed and the club card - Feed URL pattern: https://golfdata.online/api/clubs/{slug} — one approved club as JSON (the verified row, the facts the club published from its verified account, and every source with its URL and trust level). Cacheable 1 h, CORS open, no key. The same object is returned by MCP get_club. - get_club / list_sources_for return up to 200 sources per club; sources_truncated: true means the list was cut (more sources exist). ### Club card (card_version: "1.2") - One canonical object per club: card_version, id, slug, generated_at, identity, location, contact, course, play (green fees with a basis), booking (channels, provider, lead time, cancellation, expected response), hours, facilities, status, provenance, licence and links. JSON Schema: https://golfdata.online/schema/card-v1.json - Where to get it: MCP get_club returns it as `result.structuredContent.card`; the per-club feed returns the same object under the top-level `card` key; the club page's schema.org JSON-LD is a projection of it. - Provenance: every field in `provenance.fields` carries `verified_by` = `directory` (golfdata's pipeline from fetched sources), `club` (the club itself, from a verified account) or `agency` (the club's web agency re-confirmed it), plus an `origin` (how the value was produced). A derived value is never `verified_by: club`. - `status.claimed` means a verified account has claimed the club (the claimant is never exposed); `status.verified_by_club` means the club published the facts in `status.club_verified_fields`. The two are independent: a claim with no published facts confirms nothing. - Absent is not false: unknown facts are `null` (or `[]`), never guessed. `currency` is mandatory whenever an amount is present (ISO 4217). `booking.expected_response` is the club's own statement, not a golfdata promise. `booking.requests_enabled` is `false` for most clubs. - Tracked links: get_club / search_clubs results, the feed and club pages carry a `links` object of tracked booking/website/phone URLs. Give users `links.*` so the club sees demand (clicks are counted per club, no IPs); the raw booking_url / website / phone values are unchanged and stay citable. --- # Section 4 — citation and provenance ## Citation and provenance rules - Cite the source URLs (`sources[]`) and the `last_verified` date whenever you repeat a fact. - Trust levels: each source carries a numeric trust level; prefer higher-trust, more recently retrieved sources and treat missing or stale verification with caution. - Club-published facts vs crawled facts: `club_facts` are what the club itself published from its verified account and are not independently re-verified — say so when citing them. Facts with `verified_by: directory` come from golfdata's pipeline over the listed sources. - search_clubs returns summary records (leads), not citable facts and without `sources[]`: fetch provenance with get_club or list_sources_for before citing. - Fields where sources disagree are left empty ("Not verified") rather than guessed. - Map data © OpenStreetMap contributors; do not scrape map tiles. - Never promise or imply rankings inside ChatGPT, Perplexity or any assistant. --- # Section 5 — club index ## Club index (countries and regions) Public listing pages — not an enumeration of clubs and with no totals. Follow a link or the sitemap for the clubs themselves. - Sitemap: https://golfdata.online/sitemap.xml (every page in every language, with hreflang alternates) - Club feed pattern: https://golfdata.online/api/clubs/{slug} - Club page pattern: https://golfdata.online/{locale}/clubs/{slug} (locale is one of en, es, de) Browse by country (and region): - AT: https://golfdata.online/en/clubs?country=AT - Austria: https://golfdata.online/en/clubs?country=AT®ion=Austria - BE: https://golfdata.online/en/clubs?country=BE - Belgium: https://golfdata.online/en/clubs?country=BE®ion=Belgium - CH: https://golfdata.online/en/clubs?country=CH - Switzerland: https://golfdata.online/en/clubs?country=CH®ion=Switzerland - CZ: https://golfdata.online/en/clubs?country=CZ - Czechia: https://golfdata.online/en/clubs?country=CZ®ion=Czechia - DE: https://golfdata.online/en/clubs?country=DE - Germany: https://golfdata.online/en/clubs?country=DE®ion=Germany - DK: https://golfdata.online/en/clubs?country=DK - Denmark: https://golfdata.online/en/clubs?country=DK®ion=Denmark - ES: https://golfdata.online/en/clubs?country=ES - Andalucía: https://golfdata.online/en/clubs?country=ES®ion=Andaluc%C3%ADa - Aragón: https://golfdata.online/en/clubs?country=ES®ion=Arag%C3%B3n - Canarias: https://golfdata.online/en/clubs?country=ES®ion=Canarias - Cantabria: https://golfdata.online/en/clubs?country=ES®ion=Cantabria - Castilla y León: https://golfdata.online/en/clubs?country=ES®ion=Castilla%20y%20Le%C3%B3n - Castilla-La Mancha: https://golfdata.online/en/clubs?country=ES®ion=Castilla-La%20Mancha - Cataluña: https://golfdata.online/en/clubs?country=ES®ion=Catalu%C3%B1a - Comunidad de Madrid: https://golfdata.online/en/clubs?country=ES®ion=Comunidad%20de%20Madrid - Comunidad Foral de Navarra: https://golfdata.online/en/clubs?country=ES®ion=Comunidad%20Foral%20de%20Navarra - Comunidad Valenciana: https://golfdata.online/en/clubs?country=ES®ion=Comunidad%20Valenciana - Extremadura: https://golfdata.online/en/clubs?country=ES®ion=Extremadura - Galicia: https://golfdata.online/en/clubs?country=ES®ion=Galicia - Illes Balears: https://golfdata.online/en/clubs?country=ES®ion=Illes%20Balears - La Rioja: https://golfdata.online/en/clubs?country=ES®ion=La%20Rioja - Melilla: https://golfdata.online/en/clubs?country=ES®ion=Melilla - País Vasco: https://golfdata.online/en/clubs?country=ES®ion=Pa%C3%ADs%20Vasco - Principado de Asturias: https://golfdata.online/en/clubs?country=ES®ion=Principado%20de%20Asturias - Región de Murcia: https://golfdata.online/en/clubs?country=ES®ion=Regi%C3%B3n%20de%20Murcia - Spain: https://golfdata.online/en/clubs?country=ES®ion=Spain - FI: https://golfdata.online/en/clubs?country=FI - Finland: https://golfdata.online/en/clubs?country=FI®ion=Finland - FR: https://golfdata.online/en/clubs?country=FR - France: https://golfdata.online/en/clubs?country=FR®ion=France - GB: https://golfdata.online/en/clubs?country=GB - England: https://golfdata.online/en/clubs?country=GB®ion=England - Scotland: https://golfdata.online/en/clubs?country=GB®ion=Scotland - Wales: https://golfdata.online/en/clubs?country=GB®ion=Wales - IE: https://golfdata.online/en/clubs?country=IE - County Carlow: https://golfdata.online/en/clubs?country=IE®ion=County%20Carlow - County Cavan: https://golfdata.online/en/clubs?country=IE®ion=County%20Cavan - County Clare: https://golfdata.online/en/clubs?country=IE®ion=County%20Clare - County Cork: https://golfdata.online/en/clubs?country=IE®ion=County%20Cork - County Donegal: https://golfdata.online/en/clubs?country=IE®ion=County%20Donegal - County Dublin: https://golfdata.online/en/clubs?country=IE®ion=County%20Dublin - County Galway: https://golfdata.online/en/clubs?country=IE®ion=County%20Galway - County Kerry: https://golfdata.online/en/clubs?country=IE®ion=County%20Kerry - County Kildare: https://golfdata.online/en/clubs?country=IE®ion=County%20Kildare - County Kilkenny: https://golfdata.online/en/clubs?country=IE®ion=County%20Kilkenny - County Laois: https://golfdata.online/en/clubs?country=IE®ion=County%20Laois - County Limerick: https://golfdata.online/en/clubs?country=IE®ion=County%20Limerick - County Longford: https://golfdata.online/en/clubs?country=IE®ion=County%20Longford - County Louth: https://golfdata.online/en/clubs?country=IE®ion=County%20Louth - County Mayo: https://golfdata.online/en/clubs?country=IE®ion=County%20Mayo - County Meath: https://golfdata.online/en/clubs?country=IE®ion=County%20Meath - County Monaghan: https://golfdata.online/en/clubs?country=IE®ion=County%20Monaghan - County Offaly: https://golfdata.online/en/clubs?country=IE®ion=County%20Offaly - County Roscommon: https://golfdata.online/en/clubs?country=IE®ion=County%20Roscommon - County Sligo: https://golfdata.online/en/clubs?country=IE®ion=County%20Sligo - County Tipperary: https://golfdata.online/en/clubs?country=IE®ion=County%20Tipperary - County Waterford: https://golfdata.online/en/clubs?country=IE®ion=County%20Waterford - County Westmeath: https://golfdata.online/en/clubs?country=IE®ion=County%20Westmeath - County Wexford: https://golfdata.online/en/clubs?country=IE®ion=County%20Wexford - County Wicklow: https://golfdata.online/en/clubs?country=IE®ion=County%20Wicklow - Ireland: https://golfdata.online/en/clubs?country=IE®ion=Ireland - IS: https://golfdata.online/en/clubs?country=IS - Iceland: https://golfdata.online/en/clubs?country=IS®ion=Iceland - IT: https://golfdata.online/en/clubs?country=IT - Italy: https://golfdata.online/en/clubs?country=IT®ion=Italy - NL: https://golfdata.online/en/clubs?country=NL - Netherlands: https://golfdata.online/en/clubs?country=NL®ion=Netherlands - NO: https://golfdata.online/en/clubs?country=NO - Norway: https://golfdata.online/en/clubs?country=NO®ion=Norway - PL: https://golfdata.online/en/clubs?country=PL - Poland: https://golfdata.online/en/clubs?country=PL®ion=Poland - PT: https://golfdata.online/en/clubs?country=PT - Portugal: https://golfdata.online/en/clubs?country=PT®ion=Portugal - SE: https://golfdata.online/en/clubs?country=SE - Sweden: https://golfdata.online/en/clubs?country=SE®ion=Sweden