Skip to main content
Glama
durability-mcp
by ata412

durability-mcp

A local, read-only MCP tool that summarises running durability from your own FIT files.

Your files stay on your computer: the tool runs on your machine, reads one folder, and returns no GPS coordinates. It makes no prediction. This is a research measure, not a diagnosis.

Requires uv.

Try it on generated files

uvx --from git+https://github.com/ata412/durability-mcp durability-mcp-demo

The demo uses SYNTHETIC files whose answers were set in advance. It shows that the tool works as designed, not that it is accurate.

Related MCP server: vitals-mcp

Use it with your own files

Add this to your MCP client's configuration, such as Claude Desktop:

{
  "mcpServers": {
    "durability": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/ata412/durability-mcp", "durability-mcp"],
      "env": {"DURABILITY_FIT_DIR": "/path/to/your/fit/folder"}
    }
  }
}

Your MCP client may send tool results to its own AI service, so read its privacy terms. Results can include dates, durations and index values.

Tool

Returns

list_durability_runs

Outdoor runs with status and reason

get_durability_indices

Drift, magnitude, onset and status for one run

get_durability_trend

Status counts and latest runs against your own earlier runs

Statuses: signal (both gate conditions met), no_signal (QC passed, gate not met), not_evaluable (first failing QC rule given).

Limits

  • Tested on one runner's COROS export only, where most runs were not evaluable (MEASURED: 73 of 76). Other brands may behave differently.

  • Needs an outdoor run with GPS and heart rate, 45 to 240 minutes long, at a steady pace.

  • One run is weak evidence. Prefer the trend over several runs.

Available Tools

3 tools
get_durability_indicesA
Read-onlyIdempotent

Return drift, magnitude, onset and gate status for one run, or why it cannot be evaluated. No GPS is returned.

NameRequiredDescriptionDefault
fileYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds value beyond that: it discloses the failure mode ('or why it cannot be evaluated') and an explicit negative constraint ('No GPS is returned'), which prevents a wrong expectation about return content.

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?

Two short sentences with zero filler; the primary output content is front-loaded and the two caveats (failure case, no GPS) follow compactly. Every clause carries information.

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?

An output schema exists, so return values need not be detailed, and annotations cover the safety profile, making the short description mostly sufficient. The remaining gap is the opaque 'file' parameter, and there is no hint about how a run is identified or what happens with an unknown file.

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?

Schema description coverage is 0% for the single required parameter 'file', so the description must carry the meaning and it does not. 'For one run' weakly hints that 'file' identifies a run, but it never clarifies whether this is a path, a run ID, or a formatted identifier, leaving the only parameter effectively undocumented.

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 states a specific verb ('Return') and enumerates the concrete outputs (drift, magnitude, onset, gate status) for a single run. 'For one run' implicitly separates it from the sibling list_durability_runs, but it never names or contrasts with get_durability_trend, so sibling differentiation is only partial.

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?

Usage is implied by 'for one run' (single-run lookup rather than listing or trending), but there is no explicit when-to-use/when-not statement and no reference to the sibling tools as alternatives. An agent must infer the routing from the phrasing.

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

get_durability_trendB
Read-onlyIdempotent

Summarise runs over time and compare the latest runs with this runner's own earlier runs. No prediction is made.

NameRequiredDescriptionDefault
end_dateNo
start_dateNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds one genuine behavioral fact beyond them: 'No prediction is made', telling the agent the output is descriptive rather than a forecast. It says nothing about aggregation windows, behaviour on empty ranges, or units.

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?

Two short sentences with no filler, and the core capability is stated first. The second sentence ('No prediction is made') is a caveat rather than structure, but it carries real information.

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?

An output schema exists, so return values needn't be described, and annotations cover the safety profile. However, with two completely undocumented date parameters, the definition leaves an agent guessing about accepted date formats and default window, which matters for correct invocation.

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?

Schema description coverage is 0% and both start_date and end_date are bare strings with no format, timezone, or default guidance in the schema. The description never references these parameters at all, so it fails to compensate for the documentation gap on a date-bounded tool.

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?

States specific verbs (summarise, compare) against a specific resource (runs over time, latest runs vs this runner's earlier runs), which distinguishes it from a plain listing tool. It does not name the sibling tools list_durability_runs or get_durability_indices, so the differentiation is left partly to inference.

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?

Usage is only implied: one would reach for this when wanting a time-series summary or a self-comparison rather than a raw run list. There is no explicit when-to-use/when-not statement and no pointer to the alternative siblings, so an agent must infer the routing.

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

list_durability_runsB
Read-onlyIdempotent

List outdoor runs with status signal, no_signal or not_evaluable. Dates are YYYY-MM-DD. No GPS is returned.

NameRequiredDescriptionDefault
limitNo
offsetNo
end_dateNo
start_dateNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered. The description adds genuinely new behavioral context ('No GPS is returned') that prevents an agent from expecting coordinate data, plus a date format note. It still says nothing about pagination behavior, result ordering, or the missing/null-date case, so it adds some value rather than rich context.

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?

Three compact sentences with no filler, and the core scope statement comes first. The comma-separated status list ('status signal, no_signal or not_evaluable') is slightly awkward and its relationship to the arguments is ambiguous, but nothing is wasted.

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?

Annotations and an output schema carry much of the burden, so the description needn't explain return values. For a paginated list tool, however, key facts are missing: whether results are ordered, how limit/offset interact, whether the status filter is fixed or selectable, and what the tool does when no dates are supplied.

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% for four parameters, so the description must compensate. 'Dates are YYYY-MM-DD' usefully pins the format for start_date and end_date, but limit and offset are left entirely unexplained beyond their defaults. Worse, the description foregrounds a status filter ('status signal, no_signal or not_evaluable') that has no corresponding parameter, which can send an agent hunting for a non-existent argument.

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?

States a specific verb and resource ('List outdoor runs') plus the status scope ('status signal, no_signal or not_evaluable'), so the agent knows the operation and its filter. It does not differentiate from the siblings get_durability_indices and get_durability_trend, leaving the choice between 'list runs' and 'get indices/trend' to inference.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance and no alternative named. The status clause hints at scope, but an agent is never told when to pick this list endpoint over get_durability_indices or get_durability_trend, nor when a date range is required versus optional.

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. 3 tool updatesv0.1.0
    • First observedget_durability_indices
    • First observedget_durability_trend
    • First observedlist_durability_runs

TDQS

A3.8/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a distinct scope: listing runs, evaluating one run's indices, and summarizing/trending over time. The descriptions explicitly delimit one-run vs aggregate analysis, so boundaries are clear.

Naming Consistency5/5

All three names follow the same snake_case verb_durability_noun pattern: list_durability_runs, get_durability_indices, get_durability_trend. No mixed conventions or vague verbs.

Tool Count5/5

Three tools are well-scoped for a focused read-only durability analytics server: list, detail, and trend. Each earns its place without redundancy.

Completeness5/5

The surface covers the natural read-only workflow: discover runs, inspect per-run durability indices with non-evaluable explanations, and compare trends over time. No create/update/delete is needed for this analysis-only domain.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    Enables local, read-only access to Oura API v2 data, returning pre-shaped physiology such as sleep, chronotype, temperature shifts, and baseline drift for interpretation by AI clients.
    9
    1
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables MCP clients to query locally computed recovery, strain, sleep, workout, and heart-rate data from a personal SQLite database, with tools for daily and sleep summaries, workout details, heart-rate buckets, schema inspection, reports, sync, and read-only SQL.
    4
    8
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables read-only access to WHOOP recovery, sleep, HRV, strain, and workout data so users can ask natural-language questions about daily readiness, personal baselines, sleep debt, and trends, plus HYROX and triathlon performance readiness and auditing. It runs locally with summary and aggregate modes, keeping data on the user's machine and sharing results only with the chosen AI assistant.
    14 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables read-only access to WHOOP recovery, sleep, HRV, strain, workout, and race-performance data so assistants like Claude, Codex, and GitHub Copilot can answer personal health questions, compare trends against personal baselines, and audit HYROX or triathlon training with local, evidence-backed dashboards. Includes aggregate mode, local-only race logging, and verification tools for recomputing claims.
    14 npm
    MIT