mcp-garmin-connect
A local, LLM-agnostic MCP server that exposes your Garmin Connect health and training data as tools any MCP client can call.
Recovery & wellness —
get_recovery(readiness, HRV, sleep, body battery, status),get_sleep(duration + scores for last N days),get_stress(daily stress levels and buckets),get_health_summary(compact combined snapshot).Activities —
get_recent_activities(normalized sport-aware summaries),get_activity_detail(one activity by ID with training effect fields),get_recent_load(volume by sport).Training & fitness —
get_training_load(acute/chronic load, load focus),get_fitness(VO2 max, FTP, race predictions),get_zones(HR/power zones, PII-trimmed),get_personal_records.Running analysis —
get_running_summary(distance, pace, HR, longest/fastest run),get_monthly_running_stats.Holistic analysis —
get_full_snapshotpulls a broad multi-section picture for composite review.Runs anywhere MCP runs — stdio or Streamable HTTP at
http://127.0.0.1:8765/mcp, with client configs for Claude Desktop/Code, Cursor, Continue, opencode, Hermes, etc.Fast and resilient I/O — endpoint-level TTL cache, single-flight deduplication, global concurrency cap, failures never cached, and an
errorsarray for partial failures.Demo without credentials —
serve --demoserves deterministic fictional sample data.Optional provider bridge —
askagainst DeepSeek, OpenAI, Claude, OpenRouter, or Gemini, gated by--allow-external-health-data.
Note: the README also advertises get_resting_heart_rate, but that tool is absent from this server schema.
Provides tools to retrieve Garmin Connect data including recovery, sleep, stress, activities, training load, fitness, zones, personal records, and running summaries.
Allows sending Garmin health and activity data to OpenAI's Chat Completions API for natural language queries about training and recovery.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-garmin-connectWhat should my training focus be this week based on my recovery?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LLM-agnostic Garmin Connect MCP server for training, recovery, sleep, stress, VO2 Max, race predictions, and running summaries.
Use the same local Garmin tools from any MCP client — Claude Desktop, Claude Code, Cursor, Continue, Hermes, opencode — or from provider-backed demo agents using DeepSeek, OpenAI, Claude, OpenRouter, or Gemini.
See It In Action

Recorded with garmin-mcp serve --demo, which serves deterministic fictional sample data — no Garmin credentials and no real health data involved:
uvx mcp-garmin-connect serve --demoRelated MCP server: claude-garmin
Works With Any MCP Harness
This server implements standard MCP over stdio and Streamable HTTP, so there is no harness-specific adapter to maintain. If your tool speaks MCP, it works:
Harness | Connection |
Claude Code / Claude Desktop |
|
Codex CLI | MCP server config |
Gemini CLI | MCP server config |
Cursor, Windsurf, Zed, VS Code Copilot, Continue | MCP server settings (stdio or HTTP) |
opencode |
|
Hermes | stdio or HTTP |
Custom agents, web bots, scripts | Streamable HTTP at |
Any client that supports MCP over stdio or Streamable HTTP can use every tool and prompt in this server with no extra code.
Why This Exists
Most fitness advice from LLMs is generic. This server lets an LLM inspect your real Garmin Connect data first, then answer with context from your activities, recovery markers, HRV, sleep, stress, VO2 Max, and running history.
The core server is provider-neutral. DeepSeek, OpenAI, Claude, OpenRouter, and Gemini integrations are optional demo bridges for clients that do not speak MCP directly.
Features
Published on PyPI — run it with
uvx mcp-garmin-connect, no clone or manual install.15 Garmin tools and 4 prompt templates for training and recovery analysis.
Demo mode —
serve --demoruns on fictional sample data with no credentials, for try-outs and recordings.Local MCP server over
stdioor Streamable HTTP (/mcp).Endpoint-level TTL cache with single-flight factories — concurrent tool calls share one Garmin request instead of stampeding the API.
Global request concurrency cap so parallel snapshots stay within a safe request rate.
Partial-error reporting — composite tools include an
errorsarray when an endpoint fails, instead of silently returning nulls.Provider demo bridge for
deepseek,openai,claude,openrouter, andgemini.Explicit opt-in before Garmin health/activity data is sent to any external LLM provider.
Mocked test suite plus optional live Garmin smoke tests.
Quick Start
Option A — published package (no clone needed)
uvx mcp-garmin-connect login
uvx mcp-garmin-connect serve --transport stdiouvx runs the latest PyPI release in an isolated environment. Export GARMIN_EMAIL / GARMIN_PASSWORD (or keep a .env in the directory you launch it from) before the first login.
Option B — from source
git clone https://github.com/kavakoss/mcp-garmin-connect
cd mcp-garmin-connect
uv sync
cp .env.example .envSet Garmin credentials in .env:
GARMIN_EMAIL=you@example.com
GARMIN_PASSWORD=your-passwordAuthenticate once (interactive MFA supported):
uv run garmin-mcp login
uv run garmin-mcp doctor --liveList available MCP tools, then run the server:
uv run garmin-mcp tools
uv run garmin-mcp serve --transport stdioHTTP transport:
uv run garmin-mcp serve --transport http --host 127.0.0.1 --port 8765
# clients connect to http://127.0.0.1:8765/mcpWindows (PowerShell) equivalents:
uv sync,Copy-Item .env.example .env,notepad .env, then the sameuv run garmin-mcp ...commands.
MCP Client Setup
Generic stdio config using the published package (uvx):
{
"mcpServers": {
"garmin": {
"command": "uvx",
"args": ["mcp-garmin-connect", "serve", "--transport", "stdio"],
"env": {
"GARMIN_EMAIL": "you@example.com",
"GARMIN_PASSWORD": "your-password"
}
}
}
}From a local checkout, replace command/args with:
{
"mcpServers": {
"garmin": {
"command": "uv",
"args": [
"--directory",
"/path/to/mcp-garmin-connect",
"run",
"garmin-mcp",
"serve",
"--transport",
"stdio"
]
}
}
}With the local checkout, credentials are also read from the repo's .env file, so the env block is optional.
opencode (opencode.json):
{
"mcp": {
"garmin": {
"type": "local",
"command": [
"uv",
"--directory",
"/path/to/mcp-garmin-connect",
"run",
"garmin-mcp",
"serve",
"--transport",
"stdio"
],
"enabled": true
}
}
}Per-client examples (Claude Desktop, Claude Code, Cursor, Continue, Hermes, generic stdio/HTTP) live in docs/clients.
MCP Tools
Tool | Purpose |
| Readiness, HRV, sleep, body battery, resting HR, training status if available |
| Sleep duration and sleep score trends |
| Daily RHR with 7-day and 30-day trend summaries, up to 30 days |
| Daily stress buckets and average stress |
| Recent normalized activity summaries |
| One activity with training effect fields |
| Volume by sport based on recent activities |
| Native Garmin Training Load when the device/account exposes it |
| VO2 Max, FTP, and race predictions |
| Heart-rate zones and thresholds from Garmin user settings |
| Garmin personal records |
| Running summary with pace, HR, longest and fastest run |
| Monthly running breakdown |
| Compact recovery, sleep, RHR, and stress snapshot |
| Broad multi-section Garmin snapshot |
MCP Prompts
recovery_checkweekly_training_reviewactivity_analysisrace_plan_context
Configuration
All settings come from environment variables (.env is loaded automatically).
Variable | Default | Purpose |
| — | Garmin Connect account email (required) |
| — | Garmin Connect password (required) |
|
| Directory for the OAuth token cache |
|
| TTL for cached Garmin endpoint responses |
|
| Global cap on in-flight Garmin requests |
| unset |
|
Provider bridge variables (optional): DEEPSEEK_API_KEY, OPENAI_API_KEY, ANTHROPIC_API_KEY, OPENROUTER_API_KEY, GEMINI_API_KEY, plus the matching *_BASE_URL and *_MODEL overrides.
How It Stays Fast And Quiet
Endpoint-level cache. Sleeping, stress, RHR, and activity fetches are cached per day/limit and shared across every tool that needs them — a
get_full_snapshotburst reuses the same responses instead of refetching.Single-flight. If two tool calls ask for the same missing key, only one hits Garmin; the other waits and reuses the result.
Failures are never cached. A failed endpoint is retried on the next call.
Concurrency cap. All outbound Garmin calls pass through one bounded semaphore (
GARMIN_MAX_CONCURRENCY) so parallel sections cannot flood the API.Visible partial failures. When an optional endpoint fails, composite tools add an
errorsarray (source + exception) to their output.
Provider Demo Agents
Provider API access may require a paid account or credits even if the provider's web app has a free tier.
DEEPSEEK_API_KEY=sk-...
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
OPENROUTER_API_KEY=sk-or-...
GEMINI_API_KEY=...Provider | Env key | Default model | API style |
DeepSeek |
|
| OpenAI-compatible Chat Completions |
OpenAI |
|
| OpenAI Chat Completions |
Claude |
|
| Anthropic Messages API |
OpenRouter |
|
| OpenAI-compatible Chat Completions |
Gemini |
|
| Gemini Generate Content API |
uv run garmin-mcp ask "How is my recovery today?" --provider deepseek --allow-external-health-data
uv run garmin-mcp ask "Summarize my running for 90 days." --provider openai --allow-external-health-data
uv run garmin-mcp ask "What should I focus on this week?" --provider claude --allow-external-health-dataThe --allow-external-health-data flag is required because Garmin tool results can be sent to the selected provider.
Privacy And Safety
Your
.envfile and Garmin token cache stay local and are ignored by git.MCP clients that run locally can call Garmin tools without sending provider API keys to this project.
Provider demo commands such as
garmin-mcp askcan send Garmin health/activity results to the selected LLM provider, so the CLI requires--allow-external-health-data.get_zonesreturns only zone/threshold fields from the Garmin profile, not the raw profile (gender, birth date, weight, and similar PII are trimmed).
Testing
uv run garmin-mcp doctor
uv run garmin-mcp doctor --live
uv run garmin-mcp tools
uv run ruff check .
uv run pytestCI runs on Linux (Python 3.11, 3.12, 3.13) and Windows (3.12). Optional live tests are gated and never run in CI:
$env:GARMIN_LIVE_TEST = "1"
uv run pytest tests/liveTroubleshooting
Garmin rate-limited the request— lowerGARMIN_MAX_CONCURRENCY(for example to3) and retry after a few minutes.Garmin authentication failed— checkGARMIN_EMAIL/GARMIN_PASSWORD, then runuv run garmin-mcp loginfrom a real terminal (MFA prompts need interactive input).A tool returns
errors— the array names the endpoint that failed; the rest of the payload is still valid partial data.
Garmin Disclaimer
This project uses the community garminconnect Python package and Garmin Connect endpoints. Garmin Connect is not a public API for individual open-source projects, and authentication or endpoint behavior may change without notice.
Some metrics depend on Garmin device capabilities. For example, a device may expose VO2 Max and Training Effect but not native Garmin Training Load or Training Status. Zone availability depends on what the Garmin user settings endpoint exposes for your account.
License
This project is licensed under the MIT License.
Made by kavakoss. Inspired by Jack-Abyss/claude-garmin, with a clean-room implementation focused on LLM-agnostic MCP usage.
Available Tools
15 toolsget_activity_detailC
Detailed summary for one activity by Garmin activity ID.
| Name | Required | Description | Default |
|---|---|---|---|
| activity_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 only says 'detailed summary' without disclosing what metrics are included, whether any side effects exist, or the response format. This is minimal behavioral disclosure for a data-retrieval tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence with no redundant words. It is front-loaded with 'Detailed summary' and immediately clarifies the key identifier, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While an output schema exists, the description is otherwise minimal. It lacks usage guidance, behavioral detail, and sufficient parameter semantics. For a tool with one parameter and no annotations, this is adequate but leaves clear gaps in when and how to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one parameter with 0% description coverage. The description clarifies that the parameter is a Garmin activity ID, adding meaning beyond the bare schema. However, it does not provide format, range, or examples, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly indicates the tool returns a detailed summary for one activity, and specifies the unique identifier (Garmin activity ID). It distinguishes this from sibling tools like get_recent_activities, though it lacks an explicit verb like 'retrieves' or 'gets'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, such as get_recent_activities for listing activities. The description implies you need a specific activity ID but does not state prerequisites, use cases, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fitnessB
VO2 max, cycling FTP, and race predictions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description should disclose behavioral traits like read-only nature, data source, or units. It merely lists output metrics without any behavioral context. There is no contradiction, but the description fails to carry the transparency burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise phrase, listing three key metrics. It is front-loaded and contains no fluff. However, it's so brief that it verges on being a title rather than a descriptive sentence, so it doesn't earn a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (0 params, output schema present), but the description could offer more context about what these metrics represent or how they're calculated. It's enough to know the tool returns fitness data, but it lacks clarity on scope or source. An output schema may fill the gap, but the description alone is minimal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the input schema is empty. Per the rubric, a baseline of 4 applies for 0 params. The description doesn't need to explain parameters, and it doesn't, which is acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's purpose: it provides VO2 max, cycling FTP, and race predictions. These specific metrics distinguish it from sibling tools like get_recovery or get_sleep. Though it's a noun phrase rather than a full sentence, the meaning is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. It doesn't state 'for fitness metrics' or recommend get_recovery for recovery data. The agent must infer usage solely from the listed metrics and sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_full_snapshotC
Comprehensive Garmin data snapshot for holistic analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| load_days | No | Training load window in days. | |
| activity_days | No | Activity window in days. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden and fails it: nothing about which metrics are bundled, whether this is an expensive/aggregating call, caching, or any permission requirement. The only hint is 'comprehensive', which is not a behavioral trait an agent can act on.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no padding, front-loaded with the resource. It is efficient, though the brevity here reflects under-specification rather than tight writing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, but for a tool whose entire value proposition is breadth, the description never says what data is aggregated or how the two windows interact with the result. Against a dense sibling set, this leaves the agent unable to judge when the snapshot is the right call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both windows (load_days, activity_days) are fully documented with defaults and bounds in the schema. The description adds no syntax, format, or interaction detail beyond that, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a resource ('Garmin data snapshot') and an implied retrieval action, but the verb is nominal and the scope is vague — 'comprehensive' and 'holistic' do not tell an agent what is actually inside the snapshot. It also never distinguishes itself from the many targeted siblings (get_fitness, get_recovery, get_training_load), so the agent cannot tell whether this duplicates or aggregates them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance at all. With 14 siblings covering individual metrics, the description should say to use this for a broad overview instead of several targeted calls — that routing information is entirely absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_health_summaryB
Compact health snapshot combining recovery, sleep, and stress.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window in days. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 does disclose the content composition (recovery, sleep, stress) and implicitly what is excluded, which is useful, but says nothing about aggregation behavior, freshness, or how values are summarized. The presence of an output schema offloads return-shape disclosure, which keeps this at a 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with the core value proposition ('compact health snapshot') followed by the domains covered. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only aggregate tool with a fully documented schema and an output schema, the description covers what the tool returns well enough. The one real gap is routing guidance against get_full_snapshot and the single-domain siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% ('Lookback window in days.'), so the single parameter is already fully documented in the schema. The description adds no meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (health snapshot) and its scope: it combines recovery, sleep, and stress. The word 'compact' implicitly distinguishes it from get_full_snapshot and from the single-domain siblings (get_recovery, get_sleep, get_stress), though it never names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is given. The agent is left to infer that a compact combined snapshot is preferable to get_full_snapshot or to three separate calls; nothing in the description says so.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_monthly_running_statsC
Monthly running stats for the last N calendar-ish months based on recent activities.
| Name | Required | Description | Default |
|---|---|---|---|
| months | No | How many recent months to summarize. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It hints at the data source ('based on recent activities') and the windowing semantics ('calendar-ish months'), but discloses nothing about aggregation method, permissions, or how partial months are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single, front-loaded sentence with no padding, which is structurally sound. However, the hedge word 'calendar-ish' undermines precision for an API contract and doesn't earn its place in a spec.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, return values needn't be explained, and a one-parameter read tool is simple. Still, the core ambiguity with get_running_summary and the vague windowing term leave the agent without enough to call this confidently over its sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the single 'months' parameter (with default, min, max) is already fully documented in the schema. The phrase 'last N months' merely echoes the parameter and adds no format or interpretation detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource (monthly running stats) and scope (last N months), but 'Monthly running stats' largely restates the tool name rather than adding a distinguishing verb+resource framing. It never differentiates from the sibling get_running_summary, which an agent could easily confuse with this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of prerequisites, and no routing to or away from alternatives. Given the very close sibling get_running_summary, the absence of any disambiguation leaves the agent to guess which one to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_personal_recordsC
Personal records returned by Garmin Connect.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior but only says data is 'returned'. It does not explain whether the data is live, filtered, or what scope personal records cover, nor any side effects or limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very brief—a single fragment—but this brevity results in under-specification. It lacks a clear verb or complete sentence structure, making it less useful despite being short.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich set of sibling tools and no annotations, the description is inadequate. It fails to clarify what 'personal records' means, when to use this tool, or what distinguishes it from similar health/fitness tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, the schema fully covers the invocation contract (none required). The description adds no parameter info, but no params minimizes the need; baseline 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states that personal records are returned from Garmin Connect, giving a resource and source, but uses no imperative verb and lacks specificity about what constitutes 'personal records'. It does not distinguish from siblings like get_fitness or get_running_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description only identifies the resource, offering no context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_activitiesC
Recent Garmin activities with normalized sport-aware summary fields.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | How many days back to include. | |
| limit | No | Maximum number of activities to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses only that returned fields are 'normalized' and 'sport-aware'; it says nothing about ordering, read-only nature, pagination or truncation at the limit cap, or rate limits. An output schema existing removes the need to describe return values, but the tool's operational behavior remains undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, and the resource plus its key output trait come first. It is efficient, though its brevity shades into under-specification rather than ideal conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (two optional integer parameters, fully documented, with an output schema that covers return values), so not much is strictly required. Still, with no annotations and no sibling routing, the definition leaves the agent to infer when this list tool is the right call versus get_activity_detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'days' and 'limit' fully documented including defaults and min/max ranges. The description adds no parameter meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (recent Garmin activities) and hints at the return shape ('sport-aware summary fields'), so an agent can guess it lists activity summaries rather than full detail. However, it is a noun phrase with no verb and no differentiation from the obvious sibling get_activity_detail, leaving the list-vs-detail distinction to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of when to prefer get_activity_detail or get_full_snapshot, and no note about default lookback windows. The word 'recent' weakly implies a time-bounded list, but nothing explicitly routes the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_loadB
Training volume aggregated by sport over the last N days.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window in days. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that the result is an aggregation grouped by sport rather than raw activities, which is meaningful context. It omits any mention of read-only safety, auth needs, or data source, but these are low-risk for a simple aggregation and an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with zero filler, and the aggregation scope is front-loaded before the time window. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one optional parameter, output schema present), so the description need not explain return values or bounds. It is nearly complete, with the only real gap being lack of differentiation from the closely named sibling get_training_load.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'days' parameter is fully documented in the schema as 'Lookback window in days.' The description reinforces the windowing concept ('last N days') but adds no syntax, bounds, or default information beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource and scope: training volume aggregated by sport over a configurable day window. It is far more specific than the bare name 'get_recent_load'. However, it does not differentiate itself from sibling 'get_training_load', leaving ambiguity about which load tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no prerequisites, and no mention of alternatives such as get_training_load or get_fitness. The only hint is the word 'recent', which is implied usage at best.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recoveryB
Current recovery state: readiness, HRV, sleep, body battery, and status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full responsibility. It discloses the data content but does not indicate whether this is a read-only operation, whether it has any latency or prerequisites, or any other behavioral traits. A simple getter like this would benefit from a statement about it being a read-only snapshot.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded phrase that directly names the resource and its key components. Every word adds value, with no filler or unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with zero parameters and an output schema present, the description adequately identifies the resource and enumerates the main data points. It could optionally clarify that it returns only the current state, but the tool's simplicity makes the description sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is 100% with empty properties. Since there are no parameters to explain, the description is not required to compensate; per the baseline for zero-parameter tools, a score of 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the specific resource (recovery state) and lists its components (readiness, HRV, sleep, body battery, and status), which distinguishes it from sibling tools like get_sleep and get_fitness. However, it uses a noun phrase rather than an explicit verb like 'Gets', making it slightly less direct than ideal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus its many siblings. The description simply states what it returns, leaving the agent to infer the appropriate context without any exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_resting_heart_rateB
Daily resting heart rate with 7-day and 30-day trend summaries, up to 30 days.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window in days. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that results include 7-day and 30-day trend summaries (not just raw daily values), but it says nothing about permissions, rate limits, or whether trends are returned even when a shorter window is requested. As a read-only metric fetch the risk is low, so a 3 is fair.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence that front-loads the core resource and immediately follows with the aggregation scope and cap. Every clause carries information; nothing is padded or repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and the single optional parameter is fully covered by the schema. The only material gap is the absence of sibling-differentiation guidance against get_health_summary/get_full_snapshot, which leaves tool selection partly ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the single 'days' parameter is fully documented with a default of 30 and a max of 30. The phrase 'up to 30 days' echoes that constraint but adds no new syntax or format meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific metric (resting heart rate) and the aggregation it returns (daily values plus 7-day and 30-day trend summaries), which is a clear verb+resource statement. It does not, however, distinguish itself from metric-adjacent siblings like get_health_summary or get_full_snapshot, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no mention of alternatives such as get_health_summary or get_full_snapshot, which could also surface heart-rate data. The agent receives no routing signal for choosing this tool over its many siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_running_summaryC
Running summary: sessions, distance, pace, HR, longest run, fastest run, monthly split.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window in days. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It never states that this is a read-only aggregation, says nothing about the lookback window semantics, pagination, or result shape, and gives no permission or rate-limit context. The metric list hints at aggregation behavior but does not constitute behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence fragment with no filler; the metric enumeration is the most useful content and appears first. It is terse to the point of being clipped, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is low complexity, the parameter schema is complete, and an output schema exists so return values need not be explained. However, with zero annotations the description still owes the agent a read-only signal and some distinction from the overlapping monthly-stats sibling, which it does not supply.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single `days` parameter is fully documented in the schema (default 90, range 1-365, meaning stated), giving 100% coverage. The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The phrase 'Running summary' largely restates the tool name, but the trailing metric list (sessions, distance, pace, HR, longest run, fastest run, monthly split) does specify what the summary contains. It does not differentiate from siblings like get_monthly_running_stats, whose name overlaps with the 'monthly split' element, so the agent cannot resolve the overlap from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use guidance, no exclusions, and never mentions an alternative tool. With near-duplicate siblings such as get_monthly_running_stats and get_recent_activities, the absence of routing guidance is a real gap rather than a minor omission.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sleepB
Sleep duration and sleep scores for the last N days.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window in days. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing: no data source, sync freshness, timezone handling for sleep windows, or permissions. It only restates the resource and the lookback window, leaving the read semantics to be assumed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and scope come first. It is a fragment rather than a full sentence, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with an output schema and full schema coverage, the description covers what the agent needs to call it correctly. The remaining gap is routing among the numerous sibling summary tools, which is a usage rather than a completeness problem.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the days parameter is fully documented in the schema with a default of 7 and a 1-30 range. The description's 'last N days' merely echoes the schema, adding no format or interpretation detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete resource (sleep) plus the two data types returned (duration and scores) and the scope (last N days). It is clearly distinguishable from siblings like get_activity_detail or get_stress by resource, though it never names an alternative to route between them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no exclusions, and no mention of the many overlapping siblings (get_recovery, get_health_summary, get_full_snapshot). The agent must infer that this is the sleep-specific read tool purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stressB
Daily all-day stress levels and stress duration buckets.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Lookback window in days. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it only names the data returned. It doesn't state that this is a read-only operation, how the duration buckets are derived, or any granularity/aggregation behavior. The output schema covers return shape, but the operation's behavior is left unexplained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler that immediately states the resource and the data provided. Appropriately sized for a simple single-parameter getter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema means return values needn't be explained, and schema coverage is complete for the lone parameter. What's missing is any usage context or relation to the many sibling health metrics, leaving a small but real gap for an agent choosing among 14 similar tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter (days) exists and the schema documents it fully at 100% coverage, so the schema does the heavy lifting. The description adds nothing about the lookback parameter, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (stress) and the metric shape (daily all-day stress levels and duration buckets), which is clear enough to distinguish from most siblings. However it doesn't explicitly differentiate itself from related recovery/fitness tools like get_recovery or get_fitness, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no mention of the lookback window, and no routing to or away from sibling tools such as get_recovery or get_fitness. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_training_loadB
Garmin training load status, acute/chronic load, and load focus.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears the full burden of disclosing behavioral traits. It only lists the data categories, but does not mention whether the operation is safe/read-only, whether any authentication is required, or any rate limits. It also doesn't describe the time period or units, though the output schema may cover those details. This falls short of the transparency expected for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact phrase that lists exactly the essential data elements. Every word earns its place, with no filler or repetition. It is appropriately sized for a simple no-parameter getter and is easily scanned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters) and presence of an output schema, the description is nearly complete. It conveys the core purpose and the kind of data returned. It does not elaborate on edge cases or typical use contexts, but for a basic read-only getter, this is sufficient. A slightly more explicit statement about data scope would push it to 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is 100% (vacuously). The baseline for 0 params is 4. The description adds no parameter-specific explanation, but none is needed since there are no parameters to clarify. The short description does not detract from schema adequacy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource as Garmin training load and lists specific components (status, acute/chronic load, load focus), which distinguishes it from sibling tools like get_recovery or get_sleep. However, it lacks an explicit verb (e.g., 'returns' or 'gets'), relying on the tool name to imply the action, so it falls just short of a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention any prerequisites, typical use cases, or cases where another sibling tool (e.g., get_recent_load) would be more appropriate. The only context is the data content, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_zonesB
Heart-rate zones and thresholds from Garmin user settings when available.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 does disclose one genuinely useful behavior: zones come from user settings and may not exist ('when available'), which warns the agent about empty or missing results. It says nothing about read-only nature, auth, or data staleness, but the conditional-availability caveat is real added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource is stated first and the sourcing caveat second. It is perhaps too terse to be maximally useful, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and with zero parameters there is no argument surface to cover. The main omission is the absence of any sibling routing or usage context, which is a modest gap for a low-complexity read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No parameter-related claims are made that could mislead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (heart-rate zones and thresholds) and their source (Garmin user settings), so an agent can tell this apart from get_resting_heart_rate or get_training_load by resource. It does not, however, explicitly differentiate itself from broader aggregators like get_health_summary or get_full_snapshot, which may also surface zone data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus the many sibling metrics tools, nor any prerequisites or exclusions. The only contextual cue is the 'when available' qualifier, which hints at conditional data but is not usage guidance.
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.
9 tool updates
v0.2.0- Changed
get_full_snapshot6 fields changed- added
Input schema / properties / activity_days / descriptionAdded value: +"Activity window in days." - added
Input schema / properties / activity_days / maximumAdded value: +365 - added
Input schema / properties / activity_days / minimumAdded value: +1 - added
Input schema / properties / load_days / descriptionAdded value: +"Training load window in days." - added
Input schema / properties / load_days / maximumAdded value: +365 - added
Input schema / properties / load_days / minimumAdded value: +1
- Changed
get_health_summary3 fields changed- added
Input schema / properties / days / descriptionAdded value: +"Lookback window in days." - added
Input schema / properties / days / maximumAdded value: +30 - added
Input schema / properties / days / minimumAdded value: +1
- Changed
get_monthly_running_stats3 fields changed- added
Input schema / properties / months / descriptionAdded value: +"How many recent months to summarize." - added
Input schema / properties / months / maximumAdded value: +12 - added
Input schema / properties / months / minimumAdded value: +1
- Changed
get_recent_activities6 fields changed- added
Input schema / properties / days / descriptionAdded value: +"How many days back to include." - added
Input schema / properties / days / maximumAdded value: +365 - added
Input schema / properties / days / minimumAdded value: +1 - added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of activities to return." - added
Input schema / properties / limit / maximumAdded value: +200 - added
Input schema / properties / limit / minimumAdded value: +1
- Changed
get_recent_load3 fields changed- added
Input schema / properties / days / descriptionAdded value: +"Lookback window in days." - added
Input schema / properties / days / maximumAdded value: +365 - added
Input schema / properties / days / minimumAdded value: +1
- Added
get_resting_heart_rate - Changed
get_running_summary3 fields changed- added
Input schema / properties / days / descriptionAdded value: +"Lookback window in days." - added
Input schema / properties / days / maximumAdded value: +365 - added
Input schema / properties / days / minimumAdded value: +1
- Changed
get_sleep3 fields changed- added
Input schema / properties / days / descriptionAdded value: +"Lookback window in days." - added
Input schema / properties / days / maximumAdded value: +30 - added
Input schema / properties / days / minimumAdded value: +1
- Changed
get_stress3 fields changed- added
Input schema / properties / days / descriptionAdded value: +"Lookback window in days." - added
Input schema / properties / days / maximumAdded value: +30 - added
Input schema / properties / days / minimumAdded value: +1
14 tool updates
v0.1.0- First observed
get_activity_detail - First observed
get_fitness - First observed
get_full_snapshot - First observed
get_health_summary - First observed
get_monthly_running_stats - First observed
get_personal_records - First observed
get_recent_activities - First observed
get_recent_load - First observed
get_recovery - First observed
get_running_summary - First observed
get_sleep - First observed
get_stress - First observed
get_training_load - First observed
get_zones
TDQS
Scored across 15 tools
Most tools target distinct data domains (sleep, stress, HRV, zones), but several aggregate tools overlap heavily: get_health_summary recombines get_recovery/get_sleep/get_stress, get_full_snapshot subsumes nearly everything, and get_running_summary vs get_monthly_running_stats vs get_recent_load blur the line on running/training aggregation. An agent could reasonably pick the wrong summary tool.
Every tool follows the same get_<noun> snake_case convention with no deviations. Predicable and easy to scan.
15 tools is well within a healthy range for a multi-domain fitness server, and each surface maps to a real Garmin data area. Slightly heavy on overlapping summary/snapshot tools, but not excessive.
Broad read coverage: activities, fitness, recovery, sleep, stress, RHR, zones, PRs, and running stats. As a read-only analytics server it is fairly complete, though there is no way to list workouts/planned activities or fetch raw timeseries detail beyond the summaries.
Maintenance
Related MCP Connectors
Adaptive running coach MCP server — training data, plans, and recovery for AI assistants.
Remote MCP server for training, nutrition, wellness, and performance data with OAuth 2.0.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
Related MCP Servers
- FlicenseBqualityDmaintenanceA Model Context Protocol server that integrates Garmin Connect data with LLMs to provide personalized running analysis and training plans. It enables users to monitor performance metrics, manage training loads, and receive data-driven workout suggestions based on health indicators like VO2 Max and recovery status.435-
- AlicenseNot gradedqualityCmaintenanceMCP server that connects Garmin Connect data to Claude, enabling training analysis, recovery checks, and personalized plans based on real metrics like HRV, training load, and activities.21MIT
- AlicenseAqualityBmaintenanceA Model Context Protocol (MCP) server for Garmin Connect integration. Access your activities, health data, training metrics, and more through Claude and other LLMs.2264MIT
- AlicenseNot gradedqualityCmaintenanceMCP server to interact with Garmin Connect, enabling retrieval of health, activity, and device data through natural language.64MIT