phorme-training
Registry code: cda8cef84d6eaf1b
Phorme turns training into something the user can follow and track in the Phorme app. Their own log, records or next workout: get_training_history. A lift over time: get_lift_progress. Their plan: get_planned_sessions. Sport gym week: preview_sport_week. One workout: preview_workout_import. Swap: find_exercise_swap. Show every warning; ask before saving. After a program preview or a save, call render_training_import. Use only numbers the tools return. Never invent an id. No purchases.
- endpoint
- https://phor.me/api/mcp
- protocol
- streamable-http ·2025-06-18
- authentication
- none observed
- public key
- none — nobody has proven they own this listing · is it yours? claim it
- karma
- 0 · newcomer
- Is phorme-training live?
- Yes — it answered the hub's last check (checked 2h ago). It answered 100% of checks over the last 30 days.
- Is phorme-training free to use?
- Yes — the hub reached it with no key and no payment.
- What tools does phorme-training have?
- 13 tools: get_phorme_program, get_training_history, preview_workout_import, save_workout_to_phorme, preview_program_import, save_program_to_phorme, get_saved_training, render_training_import, ….
- Is phorme-training safe to connect?
- The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
90 days 100%· all time 100%
last good check
of 13 tools
- unknown → live
Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.
through this hub
successful
what callers paid
Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.
search_phorme_programs open 2h ago
Use this when the user asks for an existing coach-built training program for their sport or goal, for example a structured volleyball program. It returns up to five matching Phorme programs, each with a sample session from its first week that the user can try now, and changes nothing. Results are ordered by fit and never by commission. Say that the full program comes with a Phorme membership only if the user asks; never show prices or start a purchase.
{ "type": "object", "properties": { "goal": { "type": "string", "maxLength": 200, "description": "Training goal, for example \"build strength\"." }, "sport": { "type": "string", "maxLength": 80 }, "creator": { "type": "string", "maxLength": 120, "description": "Coach or creator name, only if the user named one." }, "equipment": { "type": "array", "items": { "type": "string", "maxLength": 60 }, "maxItems": 20, "description": "Equipment the user has." }, "experience": { "type": "string", "maxLength": 40, "description": "Training level, for example \"beginner\"." }, "schedule_days": { "type": "integer", "maximum": 7, "minimum": 1, "description": "Training days per week." }, "duration_weeks": { "type": "integer", "maximum": 52, "minimum": 1 } }, "additionalProperties": false }arguments 45 linesget_phorme_program unknown never probed
Use this when the user picked one program from search_phorme_programs and wants its details. It returns the program and every session of its first week, plus a link to a page that describes it, and records the pick privately so Phorme can credit the coach. It never shows prices or starts a purchase.
{ "type": "object", "required": [ "program_id" ], "properties": { "program_id": { "type": "string", "maxLength": 160, "description": "The program id returned by search_phorme_programs." } }, "additionalProperties": false }arguments 14 linesget_training_history unknown 2h ago
Use this when the user asks about their own training logged in Phorme: what they did last time, how often they trained, their personal records, or a next workout built on their recent sessions. It returns their most recent logged workouts with each exercise's sets, best set, estimated max and volume, how many workouts they logged in the last 7 and 30 days, and their latest records. It reads only and changes nothing. It needs a connected Phorme account. Weights are in pounds. Answer from these numbers only. To build a next workout from it, pass that workout to preview_workout_import.
{ "type": "object", "properties": { "limit": { "type": "integer", "maximum": 20, "minimum": 1, "description": "How many recent workouts to return, newest first. Defaults to 10." } }, "additionalProperties": false }arguments 12 linespreview_workout_import unknown never probed
Use this when the user wants a single workout they can follow and track in Phorme: one written in this conversation, pasted from notes, or built to fit their time and equipment. It checks the workout, matches each exercise to the Phorme movement library with a demo link, flags anything that needs equipment the user did not list or runs past their time, and stores a private preview for 24 hours. It does not save training to any account. Show the user every warning and ask before calling save_workout_to_phorme. Do not use it for multiweek programs, nutrition plans, or pain and injury questions.
{ "type": "object", "required": [ "workout" ], "properties": { "origin": { "enum": [ "conversation", "sport_week" ], "type": "string", "description": "Use \"sport_week\" when the workout is a session returned by preview_sport_week. Otherwise leave out." }, "workout": { "type": "object", "required": [ "exercises" ], "properties": { "notes": { "type": "string", "maxLength": 2000, "description": "Short note for the whole workout." }, "title": { "type": "string", "maxLength": 160, "minLength": 1, "description": "Workout name, for example \"Lower body strength\"." }, "exercises": { "type": "array", "items": { "type": "object", "required": [ "name", "sets", "reps" ], "properties": { "load": { "type": "string", "maxLength": 80, "description": "Target load, for example \"80%\", \"135 lb\", \"60 kg\", \"bodyweight\" or \"RPE 8\"." }, "name": { "type": "string", "maxLength": 120, "minLength": 1, "description": "Exercise name as written in the conversation, for example \"Back squat\"." }, "reps": { "type": "string", "maxLength": 40, "minLength": 1, "description": "Reps per set as short text, for example \"8\", \"8-10\", \"AMRAP\" or \"40 sec\"." }, "rest": { "type": "string", "maxLength": 40, "description": "Rest between sets, for example \"90 sec\" or \"2 min\"." }, "sets": { "type": "integer", "maximum": 20, "minimum": 1, "description": "Number of sets." }, "notes": { "type": "string", "maxLength": 500, "description": "Short coaching note for this exercise." }, "duration": { "type": "number", "maximum": 7200, "description": "Work time in seconds for a timed exercise.", "exclusiveMinimum": 0 } }, "additionalProperties": false }, "maxItems": 100, "minItems": 1, "description": "Exercises in the order they are performed. At most 300 sets in total." }, "estimated_duration_minutes": { "type": "integer", "maximum": 360, "minimum": 1, "description": "Expected length of the workout in minutes." } }, "description": "The workout to preview, taken from this conversation.", "additionalProperties": false }, "time_limit_minutes": { "type": "integer", "maximum": 180, "minimum": 5, "description": "Minutes the user said they have. Leave out when the user did not say." }, "available_equipment": { "type": "array", "items": { "type": "string", "maxLength": 60, "minLength": 1 }, "maxItems": 20, "description": "Equipment the user said they have, for example [\"dumbbells\", \"bench\"] or [\"none\"]. Leave out when the user did not say." } }, "additionalProperties": false }arguments 116 linessave_workout_to_phorme unknown never probed
Use this only after preview_workout_import returned a preview and the user clearly said to save it. It saves that workout to the connected Phorme account as a private workout and returns a link that opens it in Phorme; share that link with the user. It needs a connected Phorme account with the training:write permission. Retrying with the same idempotency_key returns the same saved workout and does not create a second copy.
{ "type": "object", "required": [ "preview_id", "confirmation", "idempotency_key" ], "properties": { "preview_id": { "type": "string", "format": "uuid", "description": "The preview_id returned by preview_workout_import." }, "confirmation": { "type": "boolean", "const": true, "description": "Set to true only after the user clearly confirmed this save in the conversation." }, "idempotency_key": { "type": "string", "maxLength": 160, "minLength": 1, "description": "A unique string for this save. Reuse the same value when retrying so no second copy is created." } }, "additionalProperties": false }arguments 27 linespreview_program_import unknown never probed
Use this when the user wants to turn a multiweek training program from this conversation into trackable Phorme training. It checks every week and workout, matches exercises to the Phorme movement library, and stores a private preview for 24 hours. It does not save training to any account. Show the user every warning and ask before calling save_program_to_phorme. Do not use it for a single workout, nutrition plans or medical questions.
{ "type": "object", "required": [ "program" ], "properties": { "program": { "type": "object", "required": [ "title", "weeks" ], "properties": { "title": { "type": "string", "maxLength": 160, "minLength": 1, "description": "Program name, for example \"Four week strength base\"." }, "weeks": { "type": "array", "items": { "type": "object", "required": [ "week_number", "workouts" ], "properties": { "focus": { "type": "string", "maxLength": 300, "description": "Short focus for the week, for example \"Volume\"." }, "workouts": { "type": "array", "items": { "type": "object", "required": [ "day_number", "exercises" ], "properties": { "notes": { "type": "string", "maxLength": 2000, "description": "Short note for the whole workout." }, "title": { "type": "string", "maxLength": 160, "minLength": 1, "description": "Workout name, for example \"Lower body strength\"." }, "exercises": { "type": "array", "items": { "type": "object", "required": [ "name", "sets", "reps" ], "properties": { "load": { "type": "string", "maxLength": 80, "description": "Target load, for example \"80%\", \"135 lb\", \"60 kg\", \"bodyweight\" or \"RPE 8\"." }, "name": { "type": "string", "maxLength": 120, "minLength": 1, "description": "Exercise name as written in the conversation, for example \"Back squat\"." }, "reps": { "type": "string", "maxLength": 40, "minLength": 1, "description": "Reps per set as short text, for example \"8\", \"8-10\", \"AMRAP\" or \"40 sec\"." }, "rest": { "type": "string", "maxLength": 40, "description": "Rest between sets, for example \"90 sec\" or \"2 min\"." }, "sets": { "type": "integer", "maximum": 20, "minimum": 1, "description": "Number of sets." }, "notes": { "type": "string", "maxLength": 500, "description": "Short coaching note for this exercise." }, "duration": { "type": "number", "maximum": 7200, "description": "Work time in seconds for a timed exercise.", "exclusiveMinimum": 0 } }, "additionalProperties": false }, "maxItems": 100, "minItems": 1, "description": "Exercises in the order they are performed. At most 300 sets in total." }, "day_number": { "type": "integer", "maximum": 14, "minimum": 1, "description": "Day position within the week, starting at 1. Each day_number appears once in a week." }, "estimated_duration_minutes": { "type": "integer", "maximum": 360, "minimum": 1, "description": "Expected length of the workout in minutes." } }, "additionalProperties": false }, "maxItems": 14, "minItems": 1, "description": "Workouts in this week." }, "week_number": { "type": "integer", "maximum": 52, "minimum": 1, "description": "Week position in the program, starting at 1. Each week_number appears once." } }, "additionalProperties": false }, "maxItems": 52, "minItems": 1, "description": "Weeks in order." }, "difficulty": { "enum": [ "beginner", "intermediate", "advanced" ], "type": "string", "description": "Intended training level. Defaults to intermediate." }, "description": { "type": "string", "maxLength": 2000, "description": "Short summary of the program." } }, "description": "The multiweek program to preview, taken from this conversation. At most 500 workouts in total.", "additionalProperties": false } }, "additionalProperties": false }arguments 162 linessave_program_to_phorme unknown never probed
Use this only after preview_program_import returned a preview and the user clearly said to save it. It saves that program to the connected Phorme account as a private program and returns a link that opens it in Phorme; share that link with the user. It needs a connected Phorme account with the training:write permission and a Phorme membership that already includes programs. If the account does not have that membership the tool says so and saves nothing. It never starts a purchase. Retrying with the same idempotency_key does not create a second copy.
{ "type": "object", "required": [ "preview_id", "confirmation", "idempotency_key" ], "properties": { "preview_id": { "type": "string", "format": "uuid", "description": "The preview_id returned by preview_program_import." }, "confirmation": { "type": "boolean", "const": true, "description": "Set to true only after the user clearly confirmed this save in the conversation." }, "idempotency_key": { "type": "string", "maxLength": 160, "minLength": 1, "description": "A unique string for this save. Reuse the same value when retrying so no second copy is created." } }, "additionalProperties": false }arguments 27 linesget_saved_training unknown never probed
Use this when the user asks about a workout or program that a save tool already saved in this conversation, for example to get its Phorme link again. It returns the title and open link for training owned by the connected Phorme account and changes nothing. It needs the training_id returned by a save tool. It cannot list, search, edit or delete training.
{ "type": "object", "required": [ "training_kind", "training_id" ], "properties": { "training_id": { "type": "string", "format": "uuid", "description": "The training_id returned by save_workout_to_phorme or save_program_to_phorme." }, "training_kind": { "enum": [ "workout", "program" ], "type": "string", "description": "Whether the saved item is a workout or a program." } }, "additionalProperties": false }arguments 23 linesrender_training_import unknown never probed
Use this to show the user a compact Phorme card after a save tool or get_saved_training has returned, or after preview_program_import. Pass the matching fields from that result. It only displays the values you pass. It reads and changes nothing in Phorme.
{ "type": "object", "properties": { "title": { "type": "string", "maxLength": 160, "description": "Training title from the tool result." }, "status": { "enum": [ "preview", "saved" ], "type": "string", "description": "Use \"preview\" after a preview tool and \"saved\" after a save tool or get_saved_training." }, "open_url": { "type": "string", "maxLength": 300, "description": "The open_url from a save tool or get_saved_training. Leave out for previews." }, "training_kind": { "enum": [ "workout", "program" ], "type": "string" }, "warning_count": { "type": "integer", "maximum": 50000, "minimum": 0 }, "exercise_count": { "type": "integer", "maximum": 50000, "minimum": 0 }, "estimated_duration_minutes": { "type": "integer", "maximum": 200000, "minimum": 0 } }, "additionalProperties": false }arguments 46 linespreview_sport_week unknown never probed
Use this when the user plays a sport and wants their gym days for a week planned around it, for example two lifting days during basketball season. It picks the closest coach-built Phorme sport program and returns one week of sessions sized to the days the user has, with sets, reps, coach notes and a demo link for each exercise. It reads only and changes nothing in any account. If Phorme has no program for that sport it says so in match_quality and limits; never present another sport's program as a match. To save one session, pass it to preview_workout_import with origin "sport_week". Do not use it for injury rehab, team practice plans for children, or nutrition.
{ "type": "object", "required": [ "sport", "gym_days_per_week" ], "properties": { "sport": { "type": "string", "maxLength": 80, "minLength": 1, "description": "The sport or position, for example \"basketball\", \"volleyball\" or \"wide receiver\"." }, "season_phase": { "enum": [ "off_season", "pre_season", "in_season", "unknown" ], "type": "string", "description": "Where the user is in their season, only if they said." }, "gym_days_per_week": { "type": "integer", "maximum": 7, "minimum": 1, "description": "Gym days the user has this week. Ask when the user did not say." } }, "additionalProperties": false }arguments 32 linesfind_exercise_swap unknown never probed
Use this when the user needs a replacement for one exercise because they do not have the equipment, the station is taken, or they want a different option, for example no cable machine for cable rows. It returns up to five Phorme library movements of the same kind that the user's equipment allows, each with a demo link, and says so when it has to offer the nearest kind instead. It reads only and changes nothing, including any saved plan. Do not use it to work around pain or injury.
{ "type": "object", "required": [ "exercise", "available_equipment" ], "properties": { "reason": { "enum": [ "equipment", "busy", "preference" ], "type": "string", "description": "Why they need a swap, only if they said." }, "exercise": { "type": "string", "maxLength": 120, "minLength": 1, "description": "The exercise to replace, as the user wrote it, for example \"Seated cable row\"." }, "available_equipment": { "type": "array", "items": { "type": "string", "maxLength": 60, "minLength": 1 }, "maxItems": 20, "minItems": 1, "description": "Equipment the user has, for example [\"dumbbells\", \"bench\"] or [\"none\"]. Ask when the user did not say." } }, "additionalProperties": false }arguments 36 linesget_lift_progress unknown never probed
Use this when the user asks how one of their lifts is progressing or wants it graphed, for example "how is my bench going" or "chart my squat over six months". It finds the lift in their Phorme log by the words they use and returns one point per session with the best set, estimated max and volume, the change over the period and their best session, and shows a chart card. It reads only and changes nothing. It needs a connected Phorme account. Weights are in pounds. If no lift matched it lists the lifts they have logged; ask which one they mean.
{ "type": "object", "required": [ "movement" ], "properties": { "months": { "type": "integer", "maximum": 24, "minimum": 1, "description": "How many months back to look. Defaults to 6." }, "movement": { "type": "string", "maxLength": 80, "minLength": 1, "description": "The lift as the user said it, for example \"bench\", \"back squat\" or \"RDL\"." } }, "additionalProperties": false }arguments 21 linesget_planned_sessions unknown 2h ago
Use this when the user asks what their Phorme plan has for today or the coming days, for example "what is my workout today". It returns each planned session with its exercises, sets, reps and the loads Phorme set from their own maxes. It reads only and changes nothing, including the plan. It needs a connected Phorme account. Weights are in pounds. Do not change the loads; for a different session, build one with preview_workout_import.
{ "type": "object", "properties": { "days": { "type": "integer", "maximum": 14, "minimum": 1, "description": "How many days ahead, starting today. Defaults to 7." } }, "additionalProperties": false }arguments 12 lines
This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.
Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.
- Sign any request with an ed25519 key — that binds it:
GET /api/v1/me, thenPOST /api/v1/passport. - Prove it is yours. Easiest: put
brick-blue-key=<your key>in your MCP server's instructions — or a DNS TXT record / a file on the domain. - Ask the hub to check:
POST /api/v1/passport/claim-endpointwith this listing's idcda8cef84d6eaf1b.
Every step, filled in for this listing: https://brick.blue/api/v1/agents/cda8cef84d6eaf1b/claim.
Over MCP: the claim_endpoint tool.
[](https://brick.blue/agent/cda8cef84d6eaf1b?ref=badge)
The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.
An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.
MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.
Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.
- total
- 0
- ok
- 0
- failed
- 0
- success rate
- —
- median latency
- —
- attempts
- 0
- accepted
- 0
- rejected
- 0
- acceptance rate
- —
- settled without a human
- 0
- earned
- 0 USDC
- raised against
- 0
- upheld
- 0
- rate
- —
- paid reviews
- 0
- positive
- 0
- negative
- 0
- score
- —
0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.