Skip to main content
Glama

Caddie

The AI caddie that has actually seen every shot you've hit.

Caddie is an MCP server that connects Claude (or any MCP-capable LLM) to your Garmin golf data — every round, every GPS shot, strokes gained, real club distances, plays-like yardages, and the sleep/recovery context behind each score. Ask anything: "why do I blow up on par 5s?", "map my drives at my home course", "does bad sleep actually cost me strokes?"

  • Local-first and private: your data syncs once into a DuckDB file on your machine; credentials and health data never leave it.

  • Unofficial: Caddie uses the same private API as the Garmin Connect app (via python-garminconnect). It reads your own account only — and it can break whenever Garmin changes things, until the ecosystem catches up. Know that going in.

  • Support: best-effort, issues and PRs welcome. By the maker of OneClub.

How it works

Garmin Connect  ──sync──►  local DuckDB cache  ──MCP tools──►  your LLM

Your data is synced once into a local database (~/.caddiemcp/golf.duckdb) and every question is answered from the cache — fast, private, and kind to Garmin's servers. Credentials never leave your machine.

Related MCP server: garmin-mcp

Setup

From source (this directory):

python3 -m venv .venv && .venv/bin/pip install -e .
.venv/bin/caddie-mcp login              # one-time; MFA supported
.venv/bin/caddie-mcp sync --max-rounds 50

Prefer a browser to a terminal? caddie-mcp login --web opens a local page (127.0.0.1 only) with proper email/password/MFA fields — same token store, friendlier surface.

From the built wheel (no checkout needed — dist/ ships both):

pipx install ./dist/caddie_mcp-1.0.0-py3-none-any.whl   # or pip install
caddie-mcp login && caddie-mcp sync

Once published to PyPI, this becomes uvx caddie-mcp / pipx install caddie-mcp.

Claude Desktop / Claude Code

Add to claude_desktop_config.json (or .mcp.json for Claude Code):

{
  "mcpServers": {
    "caddie-mcp": {
      "command": "/ABSOLUTE/PATH/TO/caddie-mcp",
      "args": ["serve"]
    }
  }
}

Use which caddie-mcp (pipx) or /path/to/caddie-mcp/.venv/bin/caddie-mcp (source install) for the command path. This repo's .mcp.json already wires it up for Claude Code sessions started in this folder.

Remote server (multi-user, HTTP)

The same server runs over streamable-HTTP with bearer-token auth and full per-user isolation — each user gets their own database and Garmin token store under ~/.caddiemcp/users/<name>/ (or $CADDIEMCP_HOME).

caddie-mcp user add marcos          # prints the access token (shown once)
caddie-mcp serve-http --host 0.0.0.0 --port 8724

Users link their own Garmin account in a browser — no admin terminal needed: send them https://your-host/garmin/login, where they enter their access token plus Garmin credentials (two-step MFA supported); tokens land in their private server directory. Admin-assisted caddie-mcp user login <name> still works as a fallback.

Clients connect to http://host:8724/mcp with header Authorization: Bearer <token> — e.g. for Claude Code:

claude mcp add --transport http golf http://host:8724/mcp \
  --header "Authorization: Bearer <token>"

Docker:

python -m build                     # wheel must exist in dist/
docker build -t caddie-mcp .
docker run -d -v caddie_data:/data -p 8724:8724 caddie-mcp
docker exec -it <container> caddie-mcp user add marcos
docker exec -it <container> caddie-mcp user login marcos

Security notes: tokens are 256-bit secrets stored only as SHA-256 hashes and compared in constant time; rotate with caddie-mcp user rotate-token <name>. Run behind TLS (Caddy/nginx/Cloudflare Tunnel) — tokens travel in headers. --no-auth mode exists for localhost-only single-user use and refuses to bind to non-loopback addresses. /health is the only unauthenticated route. The /data volume contains Garmin credentials — treat backups accordingly.

claude.ai custom connectors (OAuth)

claude.ai connects to remote MCP servers via OAuth (dynamic client registration + PKCE), not bearer headers. Enable it with:

caddie-mcp serve-http --host 0.0.0.0 --oauth \
  --public-url https://golf.example.com

Then add https://golf.example.com/mcp as a custom connector in claude.ai. On first connect the user lands on a consent page and pastes their caddie-mcp access token once; after that, OAuth tokens (1 h access + rotating refresh, stored hashed) keep the connection alive, scoped to that user's data. Static bearer tokens keep working alongside OAuth. A real domain with TLS is required — claude.ai will not talk to plain HTTP.

Background sync

In server mode, keep every linked user fresh automatically:

caddie-mcp serve-http --host 0.0.0.0 --sync-every 6h

Users are synced sequentially (incremental, with jitter and per-user error isolation) so the Garmin API never sees a thundering herd.

Claude Desktop Extension

python scripts/build_mcpb.py produces dist/caddie-mcp.mcpb — a double-click install bundle for Claude Desktop that launches the published package via uvx. Requires uv on the machine and the package on PyPI; the one-time uvx caddie-mcp login still happens in a terminal (credentials never pass through the desktop app).

Publishing to PyPI (maintainer)

.venv/bin/python -m build          # sdist + wheel into dist/
pipx run twine upload dist/*       # needs a PyPI API token

Data quality & repair

caddie-mcp repair re-derives every computed field across the cache with no Garmin calls (club names, lie/shot-type normalization, GPS-to-pin distances, GIR/fairway inference). It runs automatically at the end of every sync, so you only need it manually after upgrading the connector.

Known Garmin quirks handled: watches report TEEBOX/TEE/UNKNOWN enums; putts are often a per-hole count with no green shots; the end position of green-reaching shots is snapped to the pin (so post-shot proximity on green hits is honestly NULL, and strokes-gained putting uses a flagged estimate).

Tools

Tool

What it answers

garmin_status

Am I connected? How much is cached vs still on Garmin?

sync_garmin_data

Pull rounds/shots/clubs from Garmin — chunked (25/call, reports rounds_remaining) so full multi-year histories load safely from chat

list_rounds

"Show my recent rounds" — compact summaries

get_round

One round in depth: scorecard, holes, shots

get_shots

Shot-level GPS/club/lie data; format="geojson" for maps

get_club_stats

Real measured distances per club vs Garmin's estimates

get_strokes_gained

Broadie strokes gained per round: off-tee / approach / short game / putting, vs your handicap level or scratch

get_performance_stats

~40 PGA-style stats (driving, GIR by distance, scrambling, putting, scoring) with optional handicap benchmarks

get_handicap

WHS-style index, counting differentials, and trend

get_course_intel

Per-hole difficulty and usual tee club at one course

get_health_context

Sleep, HRV, Body Battery, readiness, and stress for a round's date

correlate_health_performance

"Do I score worse on bad sleep?" — paired data + honest correlation

query_golf_data

Any question, as read-only SQL over the cache

Sync also fills daily_health (4 extra Garmin calls per round date): sleep score/duration, resting HR, HRV status, Body Battery range, training readiness, stress, steps — plus round-window enrichment on each round: Body Battery at tee time and drain during play, average/max heart rate and stress during the round, and the round's weather (temperature, wind, humidity, conditions) via its matched Garmin activity.

When Garmin sends no dispersion data, shot miss offsets (dx/dy) are derived from GPS geometry: drives laterally vs the tee→pin line, approaches/chips relative to the pin — powering miss-direction and miss-tendency stats on any watch with shot GPS.

Every shot also gets plays-like distance: terrain elevations for shot and pin positions come from the free Open-Meteo elevation API (cached forever in the local DB), and plays_like_yds applies the standard 1:1 uphill/downhill heuristic — so "my 150-yd shots" can be analyzed by what they actually played as.

Prompts (packaged workflows): post_round_report, practice_plan, course_strategy, health_check_in, season_review.

Resources: schema://data-dictionary (columns, units, enums), docs://metric-definitions (how every stat is computed), and docs://getting-started (recommended tool flow).

Conventions

  • Distances in yards, coordinates in decimal degrees, times in ISO 8601.

  • Lies: tee | fairway | rough | sand | green | recovery | penalty.

  • Shot types: drive | approach | chip | putt | penalty.

  • Unknown values are NULL, never fabricated — the last shot of a hole has no measured end-distance, and tools say so.

Security notes

  • Garmin tokens live at ~/.garminconnect (mode 0600) — treat like a password.

  • The SQL tool is read-only, single-statement, SELECT-only, and capped.

  • This is an unofficial connector for your own Garmin data.

Development

.venv/bin/python -m pytest tests/ -q

mcp-name: io.github.mbrionesalvarez/caddie-mcp

Available Tools

13 tools
correlate_health_performanceA

Does recovery (or weather) affect your golf? Joins each round to its health/conditions data and computes a Pearson correlation. Daily metrics (sleep_score, hrv, readiness...) come from the night/day around the round; round-window metrics (bb_at_tee, avg_hr_during_round, avg_stress_during_ round, temp_c, wind_speed_mph) are measured DURING the round itself. Returns the paired table, r, and an honest interpretation — small samples are flagged loudly. Remember lower is better for score/putts: a NEGATIVE r between sleep_score and score_to_par means better sleep, better golf.

ParametersJSON Schema
NameRequiredDescriptionDefault
health_metricNosleep_score
last_n_roundsNo
performance_metricNoscore_to_par

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden and does well: it discloses that the tool returns a paired table, r, and an interpretation, and that small samples are flagged loudly. It also clarifies the timing of metrics (night/day vs during round), which is a key behavioral trait for correct interpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively long but every sentence adds value: purpose, method, metric timing, output, and interpretation. It is well-structured and front-loaded, though it could be slightly more compact without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description does not need to detail return fields. It covers the purpose, parameter semantics, output shape, and important caveats (small samples, correlation sign), making it complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must compensate. It does so by explicitly categorizing health_metric options into daily vs round-window metrics and explaining the lower-is-better sign interpretation for score/putts. This adds crucial meaning beyond the enum arrays.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool computes a Pearson correlation between health/conditions and performance for each round. It distinguishes itself from sibling tools like get_health_context or get_performance_stats by focusing on the relationship between the two, not just returning raw data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear context ('Does recovery affect your golf?') and explains the distinction between daily and round-window metrics, which helps the agent decide when to use this tool. However, it does not explicitly name alternative tools or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

garmin_statusA

Check connector health: Garmin auth state, last sync, cached data coverage (rounds, shots, GPS %, club %). Call this first in a session.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral transparency. It discloses what the tool checks (auth state, last sync, cached data coverage), but does not explicitly state whether the operation is read-only, has side effects, or what happens on failure. The phrase 'check' implies non-destructive, but this is not explicitly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, immediately front-loaded with the core action ('Check connector health'), followed by specifics. Every word adds value; the directive 'Call this first in a session' is pragmatic and concise. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete enough for a zero-parameter status tool. It enumerates what is covered and gives session-level usage context. An output schema exists, so return values are handled by the schema. The only minor gap is that it doesn't mention if any state changes occur, but given the output schema and simple nature, this is adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the input schema already conveys all parameter information. The description adds value by explaining the scope of the status check (rounds, shots, GPS %, club %), which is not directly in the schema. No parameter documentation is needed, and the baseline of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: checking connector health including Garmin auth state, last sync, and cached data coverage. It distinguishes itself from sibling tools like sync_garmin_data (which performs syncing) and data retrieval tools by focusing on health and session-first usage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to call this tool first in a session, providing clear contextual guidance. It does not mention exclusions or alternatives, but the timing instruction is a strong usage guideline that differentiates this tool from its siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_club_statsA

Per-club performance over the last N rounds: measured avg/min/max/ stddev carry distance (excludes putts and penalties), sample size, usage share, lateral miss bias from Garmin's dx offsets, plus Garmin's own average and 'advice' distances for comparison.

ParametersJSON Schema
NameRequiredDescriptionDefault
last_n_roundsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does well: it discloses that putts and penalties are excluded, details the metrics (avg/min/max/stddev, sample size, usage share, lateral miss bias from dx offsets), and mentions Garmin's own averages and advice distances. It stops short of stating side effects, but this is clearly a read-only statistics tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, dense sentence that front-loads the core purpose and then efficiently lists the included metrics and caveats. Every clause adds value, with zero fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description need not detail return values. It thoroughly covers the tool's scope, data sources, and exclusions, making it complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only defines last_n_rounds with a default, and the description enriches this by explaining 'over the last N rounds,' making the parameter's meaning clear. It doesn't specify the exact parameter name, but the correspondence is obvious.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Per-club performance over the last N rounds' with a detailed list of metrics. It is specific about the resource (club performance) and the action (getting stats), and it distinguishes itself from sibling tools like get_performance_stats or get_shots by focusing on club-level aggregates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies clear usage context: when you need per-club aggregate statistics over a rolling number of rounds. It does not explicitly name alternatives or exclusions, but the context is unambiguous enough for an agent to select this tool over siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_course_intelA

Personal course intelligence for one course (name substring match): per-hole scoring average vs par, hardest and easiest holes, most common tee club per hole, and round history there. Use for strategy questions like 'how should I play X next time?'.

ParametersJSON Schema
NameRequiredDescriptionDefault
courseYes
last_n_roundsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses notable behavior: name substring match for course selection, and the specific stats returned. While it doesn't mention read-only nature or data freshness, it's clear this is an analysis/query tool. The description adds value beyond what annotations would provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the main purpose and immediately providing concrete details and a usage example. Every word earns its place, with zero fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values are presumably documented elsewhere. The description covers the key behavioral aspects: scope, matching, and intended use case. It could mention prerequisites like having synced data, but this is not a critical omission given the tool's simplicity and sibling context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It clarifies that 'course' uses name substring matching, adding meaning to that parameter. However, 'last_n_rounds' is not mentioned, though its purpose is fairly inferable from its name and default value. The compensation is partial, so a 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool provides 'personal course intelligence for one course' with specific outputs (scoring average vs par, hardest/easiest holes, tee club per hole, round history). It distinguishes itself from sibling tools like get_club_stats and get_performance_stats by focusing on per-course analysis. The verb 'get' and resource 'course intel' are specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit example of when to use it: 'Use for strategy questions like "how should I play X next time?"' This provides clear context. However, it does not explicitly mention alternatives or when not to use it, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_handicapA

WHS-style Handicap Index: best-N-of-20 differentials, which rounds count, and the index trend over time. Needs rounds with tee rating and slope (Garmin records these when a tee box is selected on the watch).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It adds valuable context beyond the schema by explaining the calculation method (best-N-of-20), the data requirements, and that the output includes both which rounds count and trend over time. This is a read-only operation and the description gives sufficient transparency about prerequisites and what the tool computes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, consisting of two sentences with no redundant information. The first sentence front-loads the core purpose and output, and the second sentence adds a crucial prerequisite. Every word earns its place, making it highly scannable for an AI agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and an output schema exists (so return values need not be described), the description covers all essential context: what the handicap index is, how it is calculated, the data needed, and that a trend is provided. It is complete enough for an agent to select and invoke the tool correctly, especially since there are no arguments to configure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline for this dimension is 4 as per the rubric. The description does not need to clarify parameter semantics because there are none. It instead focuses on the output and prerequisites, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states this tool provides a WHS-style Handicap Index, detailing that it includes best-N-of-20 differentials, which rounds count, and index trend. This distinguishes it from sibling tools like get_club_stats or get_strokes_gained, which focus on other metrics. The resource (handicap index) and the specific outputs are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context about the prerequisite data: rounds with tee rating and slope, and notes that Garmin records these when a tee box is selected. This implicitly tells the user when this tool is usable but does not explicitly mention alternatives or when not to use it, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_health_contextA

Health context for a round or date (YYYY-MM-DD): sleep score and duration the night before, HRV status, Body Battery range, training readiness, average stress, resting HR, steps. With round_id, also returns the round summary so performance and recovery sit side by side. NULL fields mean the watch/feature didn't record — say so, don't guess.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo
round_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of behavioral disclosure. It explicitly states that NULL fields mean the watch didn't record and instructs the agent not to guess. It also reveals the round summary behavior. It doesn't explicitly mention read-only, but that is implied by the context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place. The purpose is front-loaded, the metric list is compact, and the NULL handling instruction is actionable. No filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given only 2 optional params and an output schema, the description covers key functionality, round_id special case, and data-missing handling. A small gap is the exact interaction of date and round_id together, but overall it is sufficiently complete for a read-only health data tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains the date format (YYYY-MM-DD) and the effect of round_id (adds round summary). It does not clarify behavior when both parameters are provided, but the core usage is clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves health context for a round or date, listing all specific metrics (sleep, HRV, Body Battery, etc.). This distinguishes it from sibling tools like garmin_status or sync_garmin_data by focusing on round/date correlation and concrete health data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: use with a date or a round_id to get health context. It clarifies that round_id also returns round summary, giving a hint about when to choose it over date. However, it does not explicitly mention alternatives or exclusion conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_performance_statsA

PGA-style performance stats over the last N rounds: driving distance/ accuracy + miss direction, GIR and proximity by distance bucket, scrambling and sand saves, putting (make % by feet, 3-putt avoidance), scoring (par 3/4/5 averages, bounce-back, distribution). Optionally pass benchmark_handicap to compare every metric against that handicap level.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoall
last_n_roundsNo
benchmark_handicapNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It thoroughly describes the output metrics and mentions the optional benchmark_handicap, but does not disclose potential edge cases (e.g., behavior when insufficient rounds exist) or explicitly confirm it is a read-only operation, which is implied but not stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but avoids extraneous words, fitting a wealth of metric detail into two sentences. The structure is slightly run-on with a long list, but every clause contributes meaning and it is appropriately sized for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and covers return structure, the description focuses on metric scope and is quite complete. The main gap is the missing explanation of the category parameter, but the metric list maps naturally to the enum values, making the tool usable without explicit parameter documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains benchmark_handicap explicitly and last_n_rounds via 'last N rounds', but category is only indirectly implied through the metric list and is not directly described. Partial compensation, with a notable gap for the category parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool provides PGA-style performance stats over a specified number of rounds, with a detailed enumeration of metrics. This distinguishes it from siblings like get_club_stats (per-club data) or get_strokes_gained (single metric), though the distinction is implied rather than explicitly stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for comprehensive performance analysis and offers an optional benchmark comparison, but it does not explicitly state when to prefer this tool over alternatives like get_club_stats or get_strokes_gained. No exclusions or when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_roundA

Get one round in depth: header, hole-by-hole scorecard, and optionally every shot. round_id comes from list_rounds. Prefer get_shots (with filters or geojson) when the goal is shot analysis or mapping.

ParametersJSON Schema
NameRequiredDescriptionDefault
round_idYes
include_holesNo
include_shotsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden for behavioral disclosure. It describes the return content and optionality of shots, but does not explicitly state read-only semantics, potential performance implications of include_shots, or any side effects. It adds some context but leaves room for more transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded: the first sentence gives the core purpose and content, the second provides usage guidance and sibling differentiation. Every sentence earns its place with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return value details are covered. The description adequately covers the tool's scope, input source, and optional behavior of shots. It does not explain include_holes, but that is relatively self-explanatory given the schema and the context. Slightly more detail on what 'header' contains could improve completeness, but it's sufficient for a moderate-complexity tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It meaningfully explains round_id (from list_rounds) and clarifies include_shots ('optionally every shot'). However, it does not mention include_holes beyond the schema's default, so it's slightly incomplete. Overall, it adds value beyond the schema for the most important parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: 'Get one round in depth' with specific return content (header, hole-by-hole scorecard, optionally every shot). It also distinguishes itself from sibling get_shots by noting when to prefer that tool for shot analysis/mapping.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage guidance is provided: round_id comes from list_rounds, and the description explicitly recommends using get_shots instead when the goal is shot analysis or mapping. This clearly delineates when to use this tool versus the alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_shotsA

Get shot-level data (GPS, club, lie, distance, miss offsets dx/dy). Filter by round_id, holes, club name substring, or shot_type (drive|approach|chip|putt|penalty). format="geojson" returns a FeatureCollection (shot LineStrings + pin Points) ready for Mapbox or Leaflet — ideal for shot maps and dashboards.

ParametersJSON Schema
NameRequiredDescriptionDefault
clubNo
holesNo
limitNo
formatNojson
round_idNo
shot_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It explains filtering options and the geojson output format, but does not mention default limit (500), read-only nature, or behavior when no filters are applied. The 'get' verb implies safety but not explicitly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences: the first defines the core purpose and filters, the second explains the geojson output and use case. Every sentence adds value, with no redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 optional params) and presence of an output schema, the description sufficiently covers purpose, filters, and output format. It misses a few behavioral details like limit defaults and explicit differentiation from siblings, but is adequate for most use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains round_id, holes, club (substring match), shot_type (with allowed values), and format (geojson meaning). However, limit is only visible in schema, and no defaults or optionality are mentioned, leaving a small gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Get shot-level data' and enumerates specific data fields (GPS, club, lie, distance, miss offsets), clearly distinguishing it from sibling tools like get_round or get_club_stats. The filterable dimensions are also listed, making the tool's scope unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context for when to use the tool ('ideal for shot maps and dashboards') and implies use for granular shot analysis. However, it does not explicitly mention alternatives or when not to use it, which is a minor gap given the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_strokes_gainedA

Strokes Gained (Broadie method) per round: total plus off-tee / approach / short-game / putting. baseline: "auto" grades each round against the player's own handicap level; or force one of scratch, 5hcp, 10hcp, 15hcp, 20hcp, bogey (scratch = the number seen on TV). estimated_share > 0 means some shots lacked GPS and used inferred lies/distances — hedge conclusions accordingly.

ParametersJSON Schema
NameRequiredDescriptionDefault
baselineNoauto
round_idNo
last_n_roundsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral transparency. It discloses a key nuance: 'estimated_share > 0 means some shots lacked GPS and used inferred lies/distances — hedge conclusions accordingly,' which is valuable for interpreting results. It also explains how the 'auto' baseline leverages the player's handicap. However, it does not explicitly state read-only behavior or other safety aspects, though that is less critical for a get operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the tool's purpose and output breakdown. It packs essential details about baseline selection and the estimated_share caveat without redundancy. Every clause adds value, and the structure is clear: purpose → baseline options → data quality warning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, return values are likely covered there. The description covers the metric breakdown, baseline semantics, and a data quality warning. However, it leaves unclear how 'round_id' and 'last_n_rounds' interact (e.g., precedence) and what the default behavior is when neither is provided. This ambiguity reduces completeness for an agent needing to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage, leaving the description to compensate. It thoroughly explains the 'baseline' parameter, listing all allowed values and meanings. However, it does not explain 'round_id' or 'last_n_rounds' — their semantics, defaults, and interaction (e.g., priority when both are provided) remain ambiguous. This gap is significant given the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Strokes Gained (Broadie method) per round: total plus off-tee / approach / short-game / putting,' which clearly states the tool's purpose and output breakdown. It differentiates itself from sibling tools like get_club_stats or get_performance_stats by focusing specifically on strokes gained metrics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for strokes gained analysis but does not explicitly state when to use this tool over alternatives such as get_round or get_shots. It explains baseline options and the estimated_share caveat, but lacks direct when/when-not guidance or mention of alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_roundsA

List golf rounds, newest first, as compact summaries (date, course, score, putts, fairways, GIR, ratings). Dates are YYYY-MM-DD; course is a case-insensitive substring match. Use get_round for hole-by-hole detail.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
courseNo
end_dateNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of disclosing behavior. It specifies newest-first ordering, compact summary fields, date format (YYYY-MM-DD), and case-insensitive substring matching for course. It does not mention limit behavior or pagination, but the output schema likely covers return structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short, informative sentences. The first sentence gives the core action and output format, the second clarifies parameter conventions, and the third points to an alternative tool. No filler or repetition exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the core list behavior, output format, and key matching rules, and explicitly points to get_round for detailed data. With an output schema present, return values are covered. It could explicitly state that start_date and end_date filter rounds, but overall it is sufficient for safe use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no property descriptions (0% coverage), so the description's added meaning is valuable: course is a case-insensitive substring, and dates use YYYY-MM-DD. However, it does not explain how start_date and end_date filter results, nor what limit does, leaving some parameters under-specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List'), resource ('golf rounds'), and scope ('newest first, as compact summaries'), and lists the fields included. It also distinguishes itself from the sibling get_round tool by explicitly noting that get_round provides hole-by-hole detail.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly directs users to get_round for hole-by-hole detail, signaling when not to use this tool. It also sets expectations for date format and course matching, providing clear context for when to use this list versus other golf analytics tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_golf_dataA

Run a read-only SQL SELECT over the golf database (DuckDB dialect). Tables: rounds, holes, shots, clubs, daily_health. Read the schema://data-dictionary resource for columns, units, and enums. Single statement, SELECT/WITH only, capped at 200 rows — aggregate server-side instead of selecting raw rows when possible.

ParametersJSON Schema
NameRequiredDescriptionDefault
sqlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses read-only behavior, dialect, statement restrictions, and row limit. It also guides toward aggregation, which is a useful behavioral hint. It stops short of describing error handling or permissions, but the key operational traits are well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is four sentences, front-loaded with the core purpose, then adding necessary constraints. No filler or repetition. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema and only one parameter, the description covers tables, dialect, statement type, row cap, and points to the data dictionary for detail. It fully enables correct use without needing more context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only defines 'sql' as a string with no description, so schema coverage is 0%. The description fully compensates by explaining what the SQL should contain: a single SELECT/WITH statement in DuckDB dialect, with links to table names and data dictionary. This gives the parameter clear semantic meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: 'Run a read-only SQL SELECT over the golf database' with the DuckDB dialect. It lists target tables and clearly differentiates from sibling tools like get_round or get_shots by identifying itself as a generic SQL query interface.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage constraints: single statement, SELECT/WITH only, 200-row cap, and a recommendation to aggregate server-side. It also points to the data-dictionary for schema details. It doesn't explicitly name sibling alternatives, but the context makes it clear this is for ad-hoc queries beyond the specialized getters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sync_garmin_dataA

Pull golf data from Garmin Connect into the local cache, plus daily health (sleep, HRV, Body Battery, stress, readiness) for round dates.

Incremental and CHUNKED: each call syncs up to max_rounds new rounds (default 25, newest first, ~2-4 minutes) and reports rounds_remaining. To load a full multi-year history, simply keep calling this tool until rounds_remaining is 0 — tell the user the total and give a brief progress update between batches. Nothing is lost between calls; every batch is permanent. full=True refetches already-cached rounds (least-recently-synced first; pass max_rounds to bound it, otherwise it runs unbounded). include_health=False skips the health pass. (Very large backfills can also run outside chat: caddie-mcp sync in a terminal does it in one go.)

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNo
max_roundsNo
include_healthNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even without annotations, the description fully discloses behavior: it is incremental and chunked, each call syncs up to max_rounds (default 25, ~2-4 minutes), reports rounds_remaining, and guarantees permanence ('Nothing is lost between calls; every batch is permanent'). It also explains the unbounded nature of full=True without max_rounds and the skip behavior of include_health=False, covering side effects and performance.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but every sentence earns its place. It front-loads the main purpose, then logically covers incremental behavior, progress loop, permanence, full mode, and an alternative execution path. No filler or repetition, and technical details are compactly parenthesized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (sync with chunking, progress tracking, multiple modes) and the presence of an output schema (so return structure is covered), the description fully equips an agent to use the tool correctly across scenarios. It even addresses the batching loop and provides an out-of-band alternative, leaving no critical gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description adds rich semantics for all three parameters. full is explained as 'refetches already-cached rounds (least-recently-synced first)', max_rounds bounds the run and defaults to 25, and include_health controls the health pass. This goes beyond the schema's bare types and defaults, giving actionable meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action: 'Pull golf data from Garmin Connect into the local cache, plus daily health...' This clearly identifies the resource (Garmin Connect data), the mechanism (sync to local cache), and the scope (golf rounds + health metrics). It distinguishes itself from siblings like list_rounds or get_round, which operate on already-cached data, by emphasizing the fetch-and-store behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit operational guidance: for full history, 'keep calling this tool until rounds_remaining is 0' with progress updates, and for very large backfills, recommends using `caddie-mcp sync` in a terminal. It also explains when to use include_health=False and full=True, giving clear context on how the tool should be invoked for different scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv1.0.1
    • First observedcorrelate_health_performance
    • First observedgarmin_status
    • First observedget_club_stats
    • First observedget_course_intel
    • First observedget_handicap
    • First observedget_health_context
    • First observedget_performance_stats
    • First observedget_round
    • First observedget_shots
    • First observedget_strokes_gained
    • First observedlist_rounds
    • First observedquery_golf_data
    • First observedsync_garmin_data

TDQS

A4.1/5.0

Scored across 13 tools

Disambiguation4/5

Most tools have clearly distinct purposes, but get_round and get_shots both involve shot data, and query_golf_data could potentially retrieve anything. The descriptions do a good job of clarifying boundaries, so ambiguity is minimal.

Naming Consistency4/5

Almost all tools follow the verb_noun pattern (get_*, sync_*, correlate_*, query_*), except garmin_status which is a noun phrase. This minor deviation is easily understood and does not undermine predictability.

Tool Count5/5

With 13 tools, the server is well-scoped for a golf analytics platform. Each tool covers a distinct aspect of data ingestion, retrieval, analysis, and querying, without unnecessary bloat or thin coverage.

Completeness5/5

The tool set provides comprehensive coverage of the golf performance domain: syncing data, listing and inspecting rounds, shot-level details, stats (club, strokes gained, overall), handicap, course intelligence, health context, correlation analysis, and a general SQL query interface. No obvious dead ends or missing core operations.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    A local, single-user, read-only MCP server that gives Claude Code access to your Garmin health and training data, exposing tools for health snapshots, training status, run details, body metrics, and training analysis.
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    This MCP server exposes Garmin Connect health data—sleep, heart rate, HRV, stress, VO2max, and activities—to Claude through local tools, enabling natural language queries, data syncing, and statistical analysis like correlations and night-out detection.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A local, read-only MCP server that gives Claude access to your Garmin health and training data, exposing tools for health snapshots, training status, run details, body metrics, and training analysis.
    MIT