Skip to main content
Glama
Packi1992

CalisthenicsCompanion-MCP

by Packi1992

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
CALICOMP_KEYYesAES-256 encryption key in raw base64 (no prefix). Exported from the app alongside the PAT.
CALICOMP_PATYesPersonal Access Token (prefixed calicomp_pat_). Created in the CalisthenicsCompanion app.
CALICOMP_SERVER_URLNoOverride the API base URL. Defaults to https://api.calicompany.de.https://api.calicompany.de

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
get_historyA

Return sessions and set-logs within a date range (YYYY-MM-DD), newest-first, for a TARGETED detail lookup — a specific window, a specific exercise. For the athlete's overall standing, call get_training_state first; use this tool once you need the underlying raw sessions and set-logs. Optionally filter by exercise UUID. Results are capped by limit (default 200, max 500). Set outputFile: true to write the full result to a local file instead of returning it inline — the tool result then reports only the file path, byte size and item count.

get_statsA

Compute app-consistent training statistics (e1RM, volume, set/session counts, trend) for a specific exercise (by: "exercise") or all exercises targeting a muscle group (by: "muscle"), or break down over every capability axis at once with no further argument (by: "capabilities" — balance, mobility, breath, etc.). e1RM uses the same Epley formula as the app. trend.points carries the full per-session e1RM series alongside the existing first-vs-last delta.

get_profileA

Return the authenticated user's profile: email, displayName, avatarUrl, isPremium, and account createdAt epoch.

list_templatesA

Return all non-deleted workout templates with their block and exercise counts. Use get_template to fetch a specific template's full detail (blocks + exercises).

get_templateA

Return one workout template with its blocks and template-exercises joined. Pass the UUID from list_templates. Returns an error if the template is not found.

get_exercise_catalogA

Return the full exercise catalog with muscle groups, equipment, and optional localized names. Provide lang (e.g. "de", "fr") to add a localizedName field (falls back to nameEn when no translation exists). Use muscleGroups[].key with get_stats { by: "muscle" } to query aggregates by muscle group.

get_planned_workoutsA

Return concrete calendar occurrences and their planned-workout roots for a required date window (from/to, YYYY-MM-DD, both mandatory, span at most 366 days). Cancelled occurrences (deletedOccurrences) are already excluded. Completed occurrences are NOT excluded — a past date alone is not evidence of a missed workout. Each root also carries structured series fields (freq, interval, byDay, until, weekOffset) alongside the raw recurrenceRule, so a series can be described ("every 2 days", "every other week on Monday and Friday") without parsing the RRULE string.

get_training_stateA

The standard entry point for "how is the athlete doing" — a query-time-computed overview, rather than raw session-by-session history. In one call: the current and longest training streak in weeks plus session-frequency counts (consistency); the same radar-chart muscle balance data as the app's Analytics dashboard in all three app windows (muscleBalance); a plan-adherence short form — counts, ratio, and an honesty explanation about what removedOccurrenceCount does and does not mean (adherence); the most recently trained exercises with their direction labels (recentExercises); all-time personal records (personalRecords); and a short, deterministic narrative sentence built from these already-computed numbers, never a second model call. This tool stays narrow on purpose: it carries no point series and no pair lists. For per-exercise or per-format progress series, call get_progress. For the full adherence pair/missed lists, call get_adherence. For raw session history, call get_history. All calendar-day mapping binds to the athlete's own synchronized time zone, never the coach's own clock.

propose_plan_updateA

Propose a structural change to an existing workout template for human review. Against a CLASSIC template, pass an ops[] diff (add/remove/update-sets-reps/reorder). Against a format template (CIRCUIT/EMOM/AMRAP/TABATA/LADDER/FOR_TIME/CHIPPER/DEATH_BY — check get_template's workoutType), pass formatParams instead: the complete new authoring parameters for that format, never an ops[] diff — the compiled rows are recomputed from formatParams on every save and an ops[] diff against them would be silently discarded. Exactly one of ops/formatParams may be set. Never mutates directly — the proposal is transported to the coach inbox for accept/reject. Fast-fails with an error (no network call) if the templateId is not found in the local snapshot, or if the proposal shape does not match the target template's own format. Inline newExercises[] entries that match an existing catalog exercise are automatically resolved to that catalog UUID instead of being proposed as duplicates.

propose_new_planA

Propose a brand-new workout plan (blocks + exercises) for human review. Never creates it directly — the proposal is transported to the coach inbox for accept/reject. Inline newExercises[] entries that match an existing catalog exercise are automatically resolved to that catalog UUID instead of being proposed as duplicates.

propose_new_exerciseA

Propose a brand-new custom exercise for human review. Never creates it directly — the proposal is transported to the coach inbox for accept/reject. If the name matches an existing catalog exercise, returns the existing UUID instead of proposing a duplicate.

propose_planned_updateA

Propose a change to the calendar for human review — name an intent, never a raw envelope. Four intents: move_occurrence (reschedule one occurrence, identified by rootId + occurrenceDate, to newDate), cancel_occurrence (cancel one occurrence, identified by rootId + occurrenceDate), schedule_workout (create a standalone or recurring root for templateId on date, optionally recurrenceRule), and change_series_rule (replace rootId's recurrence rule at scope whole_series or this_and_following — the latter requires cutoffDate and splits the series there). All root/template ids and dates come from get_planned_workouts. Rejects with a named cause — no network call — for an unknown root or template, an occurrenceDate that is not actually an occurrence of that root, a recurrence rule that fails allowlist validation, a root with no recurrence rule to change, or a recurrenceGroupId group that is not fully intact. Never mutates directly — the proposal is transported to the coach inbox for accept/reject.

get_suggestionsA

List the coach's own proposals as cheap summary rows, newest first: id, type, status, created date, a human-readable target label, and a short rationale. No payload included. Call this first; call get_suggestion with one id only when you need the full proposal, including its outcome (appliedPayload for a modified accept). Optional status filter (pending, accepted, accepted_modified, rejected, expired, withdrawn, obsolete); optional limit (default 200, clamped to 1..500). Empty array, never an error, when you have no proposals.

get_suggestionA

Return one of the coach's own proposals in full, including payload and — for a modified accept — appliedPayload. Pass an id from get_suggestions. Returns an error if the proposal is not found (unknown id, or an id that is not one of yours).

withdraw_suggestionA

Retract one of your own proposals that is still pending — the single named exception to the propose-only boundary. Sets its status to withdrawn; the proposal is NOT deleted, its audit row survives and stays fully readable through get_suggestion. Withdrawing an already-withdrawn proposal is a harmless no-op. Fails with an error, worded identically regardless of cause, for an id that is unknown, not yours, or no longer pending (already accepted, rejected, or expired).

get_coach_parametersA

Report the seven training-state tuning parameters: their default values, allowed ranges, and current values in one call. Call this BEFORE calling set_coach_parameters — it is the right first step to learn what can be set and what it currently is, rather than discovering the ranges by trial and error.

set_coach_parametersA

Set one or more of the seven training-state tuning parameters. Call get_coach_parameters first to learn the defaults, allowed ranges, and current values. Rejects an out-of-range value or an invalid uncertainThreshold/matchThreshold combination before any change reaches the server. Returns the resulting overall parameter state.

get_adherenceA

Answer "how well does the athlete keep to the plan" over a window and tolerance you choose. Without from/to, the window ends today (the athlete's own calendar day) and spans back windowWeeks (default: the coach's own adherenceWindowWeeks parameter). toleranceDays and windowWeeks override the coach's persisted parameters for this one call only, without saving them. The result reports plannedCount, matchedCount, uncertainCount, missedCount, removedOccurrenceCount, adherenceRatio, the matched pairs (with their confidence and, for similarity-derived matches, the similarity value), the missed occurrences, and an explanation sentence describing what removedOccurrenceCount does and does NOT mean (verbatim: "removedOccurrenceCount counts how many planned occurrences the athlete removed from the calendar inside this window. The stored data carries no timestamp for a removal, so it cannot say whether a given occurrence was cancelled ahead of its date on purpose or cleaned up afterward because it was missed — ask the athlete rather than assuming either reading. A planned occurrence that was removed entirely (its whole recurring series, or its only single date) leaves no trace inside this window at all, and this calculation treats it exactly as if nothing had ever been planned on that day."). Set outputFile: true to write the full pair/missed lists to a local file instead of returning them inline.

get_progressA

Two progress views in one tool, selected by kind. kind: "exercise" returns the per-exercise progress series across ALL sessions the exercise appears in (even sessions without a template) — each point carries the best single set AND the session total, in the metric appropriate to that exercise (e1RM for weighted exercises, reps or hold time for bodyweight exercises), plus a direction label with its own rule and the raw values it was computed from. Omit exerciseId to get the most recently trained exercises instead of one specific exercise. kind: "format" returns the format-specific progression (AMRAP rounds+reps, Death-By highest round, EMOM intervals) for one template, or all format templates if templateId is omitted. points overrides how many recent points each series returns (3-30) for this one call. A call with no matching data returns an empty series, never an error. Set outputFile: true to write the full point series to a local file instead of returning it inline.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.3/5.0

Scored across 19 tools

Disambiguation4/5

The read-path tools (get_training_state, get_stats, get_adherence, get_progress, get_history) share statistical scope, but each has explicit carve-outs for what it does and does not return, which prevents serious misselection. The propose_* and suggestion tools are cleanly distinct from each other and from the reads.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern: get_* for reads, list_* for collections, propose_* for proposals, set_* for parameters, and withdraw_* for the one mutating exception. There is no mixed casing or vague verb usage.

Tool Count4/5

At 19 tools, the server is slightly above the ideal 3-15 band, but the count is justified by the breadth of the coach workflow: reads, analytics, parameters, proposals, and suggestion management. The set feels dense rather than bloated.

Completeness5/5

The tool surface covers the full coach workflow: raw history, computed training state, adherence, progress, templates, planned workouts, catalog, coach parameters, and proposal-based changes for plans, exercises, and calendar events, plus suggestion lifecycle management. Intentional gaps like accept/reject are external to the MCP boundary and clearly documented.