Skip to main content
Glama

pushinglimits-mcp

Lokaler MCP-Server (stdio) für Trainingsdaten aus Pushing Limits Club. Liefert Plan, Ist, TSS und CTL/ATL/TSB ohne Browser, damit Claude Desktop jeden Morgen das Trainings-Cockpit befüllen kann, so wie mit dem Garmin-MCP.

Spezifikation und Login-Analyse: SPEC.md.

Privates Hobbyprojekt ohne Verbindung zu Pushing Limits Club. Der Server liest ausschließlich die Daten des eigenen Accounts über die interne API der Web-App, die sich jederzeit ändern kann. Nutzung auf eigene Verantwortung.

Wie der Login funktioniert

  • Zugangsdaten liegen ausschließlich im macOS-Schlüsselbund (Service pushinglimits-mcp). Der Server liest E-Mail und Passwort zur Laufzeit mit security find-generic-password.

  • Login: POST /api/user/login_session mit {email, password}. Die Antwort setzt ein HttpOnly-Session-Cookie. Alle weiteren Aufrufe laufen nur mit diesem Cookie.

  • Das Cookie wird unter ~/Library/Application Support/pushinglimits-mcp/session.json (Rechte 600) gespeichert. Cloudflare-Cookies (__cf_bm) werden nicht gespeichert.

  • Ablauf pro Request: Session laden, Request, bei 401/403 genau ein Re-Login, Request wiederholen. Schlägt das fehl, kommt {"error": "login_failed", "reason": ...} zurück. Es gibt keinen Retry-Loop; Timeout 20 s.

Related MCP server: Whoop MCP Server

Einrichtung

  1. Passwort einmalig in den Schlüsselbund legen (ohne spitze Klammern, Passwort wird abgefragt):

    security add-generic-password -s pushinglimits-mcp -a deine@mail.de -w
  2. Repo klonen und Abhängigkeiten installieren:

    git clone https://github.com/davidpetras92-sys/pushing-limits-mcp.git ~/mcp/pushinglimits-mcp
    cd ~/mcp/pushinglimits-mcp && uv sync
  3. In ~/Library/Application Support/Claude/claude_desktop_config.json unter mcpServers eintragen. Claude Desktop braucht absolute Pfade, ~ also durch den eigenen Home-Ordner ersetzen (Pfad zu uv mit which uv prüfen):

    "pushinglimits": {
      "command": "/Users/DEIN-NAME/.local/bin/uv",
      "args": ["--directory", "/Users/DEIN-NAME/mcp/pushinglimits-mcp", "run", "pushinglimits-mcp"]
    }
  4. Claude Desktop neu starten. Beim ersten Zugriff fragt macOS einmal nach Erlaubnis für den Schlüsselbund. Dort „Immer erlauben" wählen, sonst hängt der Server im Hintergrund.

Tools

Datumsparameter immer YYYY-MM-DD, Tagesgrenzen in Europe/Berlin.

pl_status()

{"logged_in": true, "user_name": "deine@mail.de", "checked_at": "2026-09-25T13:17:03+02:00"}

pl_get_pmc(start_date, end_date)

Eine Zeile pro Tag, eine Nachkommastelle. tss ist die Tageslast (load der API).

[{"date": "2026-09-24", "ctl": 100.1, "atl": 133.6, "tsb": -33.6, "tss": 98.0},
 {"date": "2026-09-25", "ctl": 98.4, "atl": 116.1, "tsb": -17.7, "tss": 0.0}]

pl_get_workouts(start_date, end_date)

Kompakte Liste ohne description. Dauer in Minuten, Distanz in km (wie von der API geliefert), tss_is = pss, tss_plan = loadEstimate, planned = belongsToActivatedPlan.

[{"date": "2026-09-22", "order": 1, "name": "Aktivierungslauf", "sport": "Laufen", "planned": true,
  "duration_min_is": 37.7, "duration_min_plan": 40.0, "distance_is": 5.6, "distance_plan": 0,
  "tss_is": 28.0, "tss_plan": 29.0, "hr_avg_is": 145, "hr_avg_plan": 0, "power_avg_is": 345}]

pl_get_week(date)

Montag bis Sonntag der Woche, mit Summen und Status je Einheit: erledigt (Ist-Dauer vorhanden), ausgelassen (Tag vorbei, keine Ist-Dauer), sonst offen. Einheiten des heutigen Tages bleiben bis Mitternacht offen.

{"week_start": "2026-09-21", "week_end": "2026-09-27", "tss_is_sum": 418.0, "tss_plan_sum": 584.0,
 "workouts": [{"date": "2026-09-23", "order": 3, "name": "30min Mobility/Blackroll", "sport": "Kraft",
               "planned": true, "duration_min_is": 0.0, "duration_min_plan": 30.0, "tss_is": 0.0,
               "tss_plan": 23.0, "status": "ausgelassen"}]}

pl_get_thresholds()

{"ftp": 271, "threshold_run": 311, "threshold_swim": 110, "weight": 93.2,
 "max_hr": 198, "resting_hr": 55, "updated_at": "2026-09-24T18:31:40.683Z"}

Fehlerbehebung

Antwort

Bedeutung

Abhilfe

login_failed / keychain

Kein Eintrag pushinglimits-mcp im Schlüsselbund oder Zugriff verweigert

Befehl aus Schritt 1 ausführen; beim macOS-Dialog „Immer erlauben" wählen

login_failed / bad_credentials

Server lehnt E-Mail/Passwort ab

Eintrag löschen (security delete-generic-password -s pushinglimits-mcp) und neu anlegen

login_failed / captcha_required

Pushing Limits verlangt ein Cloudflare-Captcha (HTTP 428)

Später erneut versuchen oder einmal im Browser einloggen; tritt das dauerhaft auf, Browser-Login-Skript ergänzen

login_failed / session_rejected

Direkt nach erfolgreichem Login weiterhin 401/403

Session-Datei löschen und erneut versuchen; sonst API-Änderung prüfen

login_failed / network

Timeout (20 s) oder keine Verbindung

Netz prüfen, erneut versuchen

api_error

Unerwarteter Status oder kein JSON

Endpoint in SPEC.md gegen die Web-App prüfen (JS-Bundle /js/app.*.js)

Abgelaufene Session

Wird automatisch erkannt (401) und einmal erneuert

Nichts zu tun; notfalls session.json löschen

Session-Datei zurücksetzen:

rm ~/Library/Application\ Support/pushinglimits-mcp/session.json

Entwicklung

uv sync
uv run pytest

Die Tests nutzen gemockte HTTP-Antworten und keine echten Zugangsdaten.

Lizenz

MIT, siehe LICENSE.

Available Tools

5 tools
pl_get_pmcA

Performance management chart (CTL/ATL/TSB/TSS per day). Dates YYYY-MM-DD, Europe/Berlin.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateYes
start_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 burden. It discloses the date format and timezone, which is useful behavioral context, but it does not mention whether this is a read-only operation, how data is aggregated, or what the response structure contains. The output schema exists, so return values are covered elsewhere, but the description adds only modest behavioral detail.

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 sentence that front-loads the resource and immediately provides the critical date/timezone context. Every word earns its place; there is no filler or repetition of the schema.

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?

For a two-parameter read-only chart tool, the description covers the essential input semantics (date format and timezone) and the output schema exists to document return values. However, with no annotations and no explicit read-only or usage guidance, an agent is left to infer safety and when to choose this tool over siblings. It is adequate but not complete.

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 that dates are YYYY-MM-DD and Europe/Berlin, which adds meaning to start_date and end_date beyond the bare schema. However, it does not clarify whether the range is inclusive, how far back data is available, or any constraints on the date values.

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 resource ('Performance management chart') and the data it contains (CTL/ATL/TSB/TSS per day), which clearly distinguishes it from sibling tools like pl_status or pl_get_workouts. It lacks a verb like 'get' or 'retrieve', but the tool name supplies that and the resource is unambiguous.

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 by specifying the date range and timezone, but it does not explicitly state when to use this tool versus alternatives. It gives no exclusions or conditions, so an agent must infer that this is the chart-specific tool from the resource name.

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

pl_get_thresholdsB

Current thresholds: ftp, threshold_run, threshold_swim, weight, max_hr, resting_hr, updated_at.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.1/5.0
Behavior2/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 disclosureblatt. It only lists fields and implies current state; it does not state that this is a read-only operation, describe the response shape, or mention any side effects or requirements.

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 a single compact sentence with no filler, front-loading the resource and following with a useful field list. It misses a main verb and reads as a fragment, which prevents a top score.

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?

For a zero-parameter getter, the field list provides the core information an agent needs. However, with no output schema or annotations, the description leaves response format and read semantics somewhat ambiguous, making it adequate but not complete.

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 and an empty schema with full coverage, so there is nothing for the description to add. The baseline of 4 applies because parameter semantics are entirely moot here.

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 identifies the resource as current thresholds and enumerates the fields exposed, making the tool's purpose clear. It lacks an explicit verb and does not differentiate itself from sibling tools, so it stops short of 5.

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 guidance about when to use this tool versus pl_status, pl_get_pmc, pl_get_workouts, or pl_get_week. The field list implies it is for reading threshold values, but no usage context or exclusions are stated.

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

pl_get_weekB

Monday-Sunday week containing the date: TSS sums plus workouts with status erledigt/offen/ausgelassen.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYes

TDQS

B3.1/5.0
Behavior2/5

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

There are no annotations, so the description carries the full burden. It reveals that the tool returns TSS sums and workouts by status, but it does not explain whether this is read-only, how sums are computed, how date is interpreted, or what the response shape is.

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 entire description is one dense sentence with no filler. The core concept (week range starting Monday) is front-loaded, and every phrase contributes meaning.

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?

For a one-parameter getter, the description covers the main input and output substance. Yet with no output schema and no annotations, it leaves gaps around date format, response structure, and behavior when no workouts exist, so it is adequate but incomplete.

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 coverage is 0%, but the description explains that the date parameter selects the containing Monday-Sunday week, adding real meaning to the bare 'date' string. However, it omits the expected date format, timezone handling, or any constraints.

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 resource: a Monday-Sunday week containing a given date, with TSS sums and filtered workouts. This is more specific than a bare name and distinguishes it from sibling get_* tools, though it never explicitly names an alternative.

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?

The description provides no guidance on when to choose pl_get_week over pl_get_workouts, pl_get_pmc, pl_get_thresholds, or pl_status. The intended use is only implied by the name and the date-based week selection.

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

pl_get_workoutsA

Planned and completed workouts between two dates (YYYY-MM-DD, inclusive, Europe/Berlin).

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateYes
start_dateYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/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 of behavioral context, and it does so well by disclosing the inclusive date range and the Europe/Berlin timezone. It also clarifies that both planned and completed workouts are included. It does not discuss authorization, rate limits, or edge cases, but the read-only nature is implied by 'get' and the simple scope.

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, front-loaded sentence with no filler. Every element earns its place by specifying the resource, date format, inclusivity, and timezone.

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?

For a two-parameter read-only tool with an output schema, this description covers the required semantics: what data is returned, the date range behavior, and the applicable timezone. No critical input expectations are left unexplained, and the output schema handles return-value details.

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 adds meaningful details beyond the parameter names: date format YYYY-MM-DD, inclusivity, and Europe/Berlin timezone. The start_date and end_date roles are clear from their names)Skip, and the description reinforces that they define a range.

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 identifies the resource (workouts), the scope (planned and completed), and the date-range constraint. It does not use an explicit verb like 'retrieve,' but the tool name supplies 'get' and the meaning is unambiguous. It also distinguishes itself from sibling tools by focusing on workouts rather than status, PMC, week, or thresholds.

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 for when to use the tool: for planned and completed workouts between two dates, with the exact format and timezone. It does not explicitly name alternatives or state when not to use the tool, but the resource and scope make the intended use evident alongside the sibling tool names.

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

pl_statusA

Login check against Pushing Limits Club. Returns logged_in, user_name, checked_at.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior2/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 of behavioral disclosure. It mentions the return fields but does not explicitly state that this is a read-only operation, whether it requires authentication, or if it has any side effects. For a simple status check, this is a notable gap.

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 and front-loaded. It opens with the primary purpose and immediately lists the return fields in two short sentences, with no unnecessary words or filler.

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?

For a zero-parameter tool with no output schema, the description adequately explains what it returns and its purpose. It could benefit from noting that it is a read-only operation, but overall it provides sufficient context for an agent to invoke it 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 tool has zero parameters, so the schema trivially provides 100% coverage. The baseline for 0 parameters is 4; the description does not need to add parameter details since there are none to document.

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 verb and resource ('Login check against Pushing Limits Club') and explicitly lists the return fields (logged_in, user_name, checked_at). This clearly distinguishes it from sibling tools like pl_get_workouts or pl_get_thresholds, which fetch specific data.

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 guidance on when to use this tool versus the alternatives, no mention of exclusions, and no prerequisites such as authentication requirements. The description simply states what it does, leaving the agent to infer usage from context.

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. 5 tool updatesv0.1.0
    • First observedpl_get_pmc
    • First observedpl_get_thresholds
    • First observedpl_get_week
    • First observedpl_get_workouts
    • First observedpl_status

TDQS

A3.6/5.0

Scored across 5 tools

Disambiguation4/5

pl_get_workouts and pl_get_week both expose workout data, with pl_get_week adding TSS aggregation, so an agent may need to read descriptions carefully. The other three tools are clearly distinct.

Naming Consistency4/5

All tools share the pl_ prefix and most use pl_get_<resource>; pl_status breaks the pattern slightly but is still predictable.

Tool Count5/5

Five tools is well-scoped for a read-only training-data server; each endpoint covers a distinct data area without bloat.

Completeness4/5

Core athlete data is covered: auth status, performance management chart, workouts, weekly summaries, and thresholds. Missing write operations or single-workout detail are not significant if the server is intentionally read-only, but the overlap between workouts and week leaves a small gap for more granular queries.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Exposes Whoop fitness data (recovery, sleep, strain, workouts) to Claude for use as a daily training coach, enabling natural language queries about your health metrics and training readiness.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables querying WHOOP fitness data (workouts, recovery, sleep, cycles) through Claude Desktop using the Model Context Protocol, with all data stored locally and privately.
    371 npm
    MIT