Phorme Training
REMOTE · PHOR.ME
Coach-built training: coaching brains, programs, race plans, gyms, clinics, demos and your log.
Available components
Last scanned (2 hours ago)
Scores higher than 66% of remote servers
Reachable. Last reached 24 Oct 2026.
Category Health and Science
Recent critical change
Authorization (19 Oct 2026). See the changelog before you install this server.
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (cancel_gym_booking). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability79
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 10195 tokens (~199/item across 51 items; 49 tools + 2 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management57
- Stability observed for 17 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage97
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 91% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 51 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities73
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
- Supports UI / widget rendering.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 24 Oct 26 0
- Tool “find_coaching_brain” rewrote its description, which is the text the model reads security
- New tool “copy_coach_from_code” functional
- New tool “get_my_brain_code” functional
- New tool “set_my_brain_rules” functional
- “find_coaching_brain” added an optional parameter “code” cosmetic
- “find_coaching_brain” reworded the description of “goal” cosmetic
- “find_coaching_brain” made “goal” optional cosmetic
- 23 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.
- 21 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.
- 20 Oct 26 0
- New tool “cover_member”, which the server declares destructive security
- Schema quality: 8191 → 9514 ▼ functional
- Server version: 1.14.0 → 1.15.0 functional
- New tool “get_gym_billing_link” functional
- New tool “get_payout_setup_link” functional
- New tool “get_payouts” functional
- New tool “publish_gym_brain” functional
- New tool “set_booking_notices” functional
- New tool “set_owner_email” functional
- New tool “update_gym_brain” functional
- 19 Oct 26 −6
- Authorization: partial → fail ▼ critical
- The server rewrote its instructions, which are the text every model session reads security
- New tool “answer_held_request”, which the server declares destructive security
- New tool “cancel_gym_booking”, which the server declares destructive security
- New tool “set_class_schedule”, which the server declares destructive security
- New tool “set_member_cover”, which the server declares destructive security
- New tool “unpublish_place”, which the server declares destructive security
- Tool “check_place_in_ai” rewrote its description, which is the text the model reads security
- Tool “find_coaching_brain” rewrote its description, which is the text the model reads security
- Tool “find_gym_class” rewrote its description, which is the text the model reads security
- Schema quality: 174 → 204 ▼ functional
- Server version: 1.11.0 → 1.14.0 functional
- New tool “book_gym_class” functional
- New tool “claim_place” functional
- New tool “create_or_claim_place” functional
- New tool “get_gym_report” functional
- New tool “list_held_requests” functional
- New tool “publish_place” functional
- New tool “start_gym_brain” functional
- New tool “update_place” functional
- New tool “verify_place_claim” functional
- “find_coaching_brain” added an optional parameter “coach” cosmetic
- “find_gym_class” added an optional parameter “radius_km” cosmetic
- 18 Oct 26 0
- Tool “check_place_in_ai” rewrote its description, which is the text the model reads security
- Tool “find_races” rewrote its description, which is the text the model reads security
- Tool “plan_for_race” rewrote its description, which is the text the model reads security
- Server version: 1.9.0 → 1.11.0 functional
- “check_place_in_ai” reworded the description of “city” cosmetic
- “check_place_in_ai” reworded the description of “place” cosmetic
- Tool “check_place_in_ai” changed its title: Check a gym or clinic in AI answers → Check a gym, clinic or race in AI answers cosmetic
- 17 Oct 26 +1
- The server rewrote its instructions, which are the text every model session reads security
- Tool “find_races” rewrote its description, which is the text the model reads security
- Schema quality: 3553 → 4390 ▼ functional
- Server version: 1.5.0 → 1.9.0 functional
- New tool “check_place_in_ai” functional
- New tool “find_clinic” functional
- New tool “find_personal_coach” functional
- New tool “start_my_coaching_brain” functional
- “render_training_import” reworded the description of “open_url” cosmetic
- “render_training_import” reworded the description of “status” cosmetic
- “save_program_to_phorme” reworded the description of “preview_id” cosmetic
- “save_workout_to_phorme” reworded the description of “preview_id” cosmetic
- 16 Oct 26 0
- Resource “Phorme training card” now points somewhere else: ui://phorme/training-card-v7.html → ui://phorme/training-card-v9.html security
- The server rewrote its instructions, which are the text every model session reads security
- Schema quality: 3047 → 3553 ▼ functional
- New tool “find_races” functional
- New tool “plan_for_race” functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 24 Oct 2026 · Probed https://phor.me/api/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=phor.me | CN=YR1,O=Let's Encrypt,C=US | 3 Oct 2026 | 1 Jan 2027 | RSA 2048 | SHA256-RSA | 6d0c4e2262ecc36f3d8eaf8f62430f2360f |
| SANs: phor.me | ||||||
| CN=YR1,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | a20253f15f2691c05dc1ce13b9bcca4e |
| CN=Root YR,O=ISRG,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | RSA 4096 | SHA256-RSA | f24b6d17f9d9ad7cb1c9fea78782699f |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of phor.me. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| me. | present | 45352 | 8 | Verified |
| phor.me. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000 |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | origin-when-cross-origin |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://phor.me/api/mcp | Verified | 200 | |
| http (plaintext) | http://phor.me/api/mcp | HTTPS enforced | 308 | https://phor.me/api/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
answer_held_request Answer an ask waiting for my gym ~220
Use this when an owner wants to accept or decline one ask held for the plan at their place, by its hold_id. Read the ask back to the owner first, and set confirmation to true only after they said yes. Accept books the member in (a paid class is held while they pay on Phorme's own page; a full class puts them on the waitlist), or sends a 1:1 request on to the place's email. Decline ends it, with the owner's short note when they gave one. Either way the member hears. Accepting needs the gym plan at that place; the result then gives plan_url instead. It takes no payment. It needs a connected Phorme account that owns the place.
| Name | Type | Req | Description |
|---|---|---|---|
| answer | string | yes | – |
| confirmation | boolean | yes | Set to true only after the owner said yes to this answer. |
| hold_id | string | yes | The hold_id from list_held_requests. |
| note | string | – | For decline: a short note to the member, in the owner's words. |
| Name | Type | Req | Description |
|---|---|---|---|
| hold | object|null | yes | id, outcome (released, declined or expired) and booking_status. |
| next | string | yes | – |
| plan_url | string|null | – | – |
No examples provided.
book_gym_class Book a Phorme gym class ~250
Use this when a signed-in user wants a place in one class at a Phorme gym or studio. Confirm the class, the day and time, and the gym with the user first, and set confirmation to true only after they said yes. It books the class for the connected Phorme account: booked when there is a spot, on the waitlist when it is full, a spot held for 15 minutes when the class is paid, or a request the gym is told about when the gym has not opened booking on Phorme yet. A paid class is paid on Phorme's own payment page, through a link in the result. This tool takes no payment, names no amount and never sells a subscription or membership. Booking the same class again returns the same booking. It needs a connected Phorme account with the training:write permission.
| Name | Type | Req | Description |
|---|---|---|---|
| class_id | string | yes | The class_id of the class, from find_gym_class. |
| confirmation | boolean | yes | Set to true only after the user said yes to this class, day, time and gym. |
| place_id | string | – | The place_id of its gym or studio, from the same find_gym_class result. |
| Name | Type | Req | Description |
|---|---|---|---|
| book_url | string|null | yes | The class page on phor.me. |
| booking_id | string|null | yes | The booking, for cancel_gym_booking. |
| class | object|null | – | title, starts (local time at the gym) and minutes. |
| next | string | yes | What to tell the user next. |
| pay_url | string|null | – | Phorme's own payment page for this booking, only when status is pending_payment. |
| place | object|null | – | name, city and page_url of the gym or studio. |
| status | string | yes | booked: the user is in. waitlisted: the class is full; Phorme moves them up if a spot opens. pending_payment: the spot is held 15 minutes while they pay at pay_url. requested: the gym is told they as… |
No examples provided.
cancel_gym_booking Cancel a Phorme gym booking ~191
Use this when a signed-in user wants to give up a class they booked, are on the waitlist for, or asked a gym for on Phorme. Confirm which class with the user first, and set confirmation to true only after they said yes. It cancels that booking for the connected Phorme account and frees the spot for the next person on the waitlist. It takes the booking id, or the class id of the booked class. Sales are final, so a paid class is not refunded. It needs a connected Phorme account with the training:write permission.
| Name | Type | Req | Description |
|---|---|---|---|
| booking_id | string | – | The booking_id from book_gym_class. Give this or class_id. |
| class_id | string | – | The class_id of the booked class, when the booking_id is not known. |
| confirmation | boolean | yes | Set to true only after the user said yes to cancelling this class. |
| Name | Type | Req | Description |
|---|---|---|---|
| booking_id | string|null | – | – |
| cancelled | boolean | yes | – |
| next | string | yes | What to tell the user next. |
No examples provided.
check_place_in_ai Check a gym, clinic or race in AI answers ~359
Use this when the owner or manager of a gym, studio, sports clinic or race asks whether ChatGPT knows their place or race or recommends it, for example "does ChatGPT recommend my gym?", "what does AI say about my physio clinic in Austin?" or "does ChatGPT know our triathlon?". It asks OpenAI's model with web search two questions a customer or athlete would ask: about the place or race, and for the best of its kind in its city. It returns whether it was found, whether it was named among the best and who was named instead, which of five facts a customer needs were stated (where, hours, classes or treatments, prices, how to book; for a race: where it starts, race date, course, entry fee, how to register), the pages it cited, and a link to the full result. Prices are reported only as stated or not, and a fact counts as stated only when the answer gave it. It also returns a free next step: a link to claim the place on Phorme (for a race, the race organiser page). It takes up to a minute, reuses a check of the same place from the last week, and saves the result as a share page; it changes nothing about the place on Phorme. It is for owners and managers, not for rating a place for someone choosing where to go.
| Name | Type | Req | Description |
|---|---|---|---|
| city | string | yes | The city it is in (for a race, where it is held). |
| kind | string | – | What kind of place it is, as a customer would search. Defaults to gyms. |
| place | string | yes | The gym, clinic or race's name, as the owner or organiser wrote it. |
| Name | Type | Req | Description |
|---|---|---|---|
| checked_at | string | – | – |
| city | string | – | – |
| facts | array | yes | Each fact a customer needs: fact, stated, value (null for prices). |
| facts_stated | string | – | – |
| identified | boolean | yes | Whether ChatGPT found this specific place. |
| kind | string | – | – |
| limits | array | yes | What this check does not show. Tell the user. |
| named_in_best_of_city | boolean | yes | Whether it was named when asked for the best of its kind in the city. |
| named_instead | array | – | Places named instead, when it was not. |
| next_step | string | – | What the next step does, in one line. |
| next_step_url | string | – | Free next step: claim the place on Phorme (a race: the organiser page). It names no price. |
| place | string | – | – |
| result_url | string | yes | The full result on gyms.phor.me. Share it. |
| sources | array | – | – |
No examples provided.
claim_place Claim a place nobody runs ~199
Use this when an owner says a gym Phorme already lists is theirs and nobody runs it on Phorme yet, for example "that gym is mine". Confirm the place with the owner first, and set confirmation to true only after they said yes. It never hands the place over by itself: Phorme sends a six digit code to the email or phone the place has on file, not to the person asking. Whoever reads that inbox or phone gives them the code, and entering it makes them the owner. A place with neither on file waits for Phorme's team. It takes no payment. It needs a connected Phorme account.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation | boolean | yes | Set to true only after the owner said yes to claiming this place. |
| place_id | string | yes | The place_id of the listed place, from find_gym_class. |
| via | string | – | Where the code goes, when the place has both on file. Default email. |
| Name | Type | Req | Description |
|---|---|---|---|
| claim | object | yes | claim_id, place_id, place_name, status (code_sent or review), channel, sent_to (masked), expires_at. |
| next | string | yes | – |
No examples provided.
copy_coach_from_code Copy a coaching brain from a code ~215
Use this when a coach has another coach's Phorme code and wants to start their own coaching brain from it, for example "start my brain from K7Q2-XR4D". Sent with the code alone, it shows whose brain it is and whether its coach lets other coaches copy it, and changes nothing. Sent with a name and confirmation, it makes a new draft brain from it with its rules and programs, which the coach then makes their own; the coach who made it keeps 10% of what the copy earns. It needs a connected Phorme account; set confirmation to true only after the coach said yes and chose the name.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | The code as the coach gave it, for example "K7Q2-XR4D", or its phor.me/c/ link. |
| confirmation | boolean | – | True only after the coach confirmed the copy and its name. |
| name | string | – | The name the coach chose for their copy. Needed to copy. |
| Name | Type | Req | Description |
|---|---|---|---|
| brain | object | – | – |
| console_url | string | – | – |
| copied | boolean | yes | – |
| found | boolean | – | – |
| next | string | – | – |
| requires_confirmation | boolean | – | – |
No examples provided.
cover_member Cover one member ~267
Use this when an owner on the gym plan wants to see who is covered or asked to be at one place, or to invite, approve or remove one member, for example "invite my member Sam to train free". action list reads who is listed and changes nothing. For invite (by the member's phone), approve (a member who asked) and remove, read it back to the owner first, and set confirmation to true only after they said yes. An invite sends the phone a text to join; the member hears once when they are covered or removed. Cover counts only while the gym plan covers the place, up to its cap; past it, new members pay as normal. It takes no payment here. It needs a connected Phorme account that owns the place.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| confirmation | boolean | – | Set to true only after the owner said yes to this change to who is covered. |
| member_id | string | – | For approve and remove: the member_id from action list. |
| phone | string | – | For invite: the member's phone with its country code, for example +15125550100. |
| place_id | string | yes | The place_id of one of the owner's places, from get_gym_report or create_or_claim_place. |
| Name | Type | Req | Description |
|---|---|---|---|
| cover | object|null | – | on, plan, state (active, needs_plan or off), cap, covered, asked, invited and left. |
| member | object|null | – | The member changed, as in members. |
| members | array | – | For list: member_id, label (a name, or the phone's last four), status (asked, invited, covered), counts, asked_at, invited_at, covered_at. |
| next | string | yes | – |
| place_id | string | yes | – |
| plan_url | string|null | – | The plan on phor.me, a price-free link, when the place is not on it. |
No examples provided.
create_or_claim_place List or claim my place ~540
Use this when a gym, studio or clinic owner wants their place on Phorme, for example after an AI check, or says "list my gym". Confirm the name, city and address with the owner first, and set confirmation to true only after they said yes. It lists the place for the connected account as a draft nobody sees yet, with its page facts, and finds the map pin from the address. If the account already lists a place with that name in that city it returns that place and changes nothing. Listing is free; it takes no payment and starts no plan. It needs a connected Phorme account.
| Name | Type | Req | Description |
|---|---|---|---|
| about | string | – | One or two plain sentences about the place, in the owner's words. |
| address | string | – | The street address. The map pin is found from it. |
| book_label | string | – | The words on its booking button, for example "Book a class". |
| book_url | string | – | The place's own booking page, starting with https://. |
| city | string | yes | – |
| confirmation | boolean | yes | Set to true only after the owner said yes to listing this place. |
| country | string | yes | For example "United States". |
| hours | array | – | Opening hours, one line each, for example ["Mon to Fri, 6 am to 9 pm", "Sat, 8 am to noon"]. |
| kind | string | – | What the place is: gym (also studios and boxes) or a kind of care. |
| lat | number | – | Latitude of the map pin, only to set it by hand. |
| line | string | – | One line on what the place is, in the owner's words. |
| lon | number | – | Longitude of the map pin, only to set it by hand. |
| name | string | yes | The place's name, as the owner wrote it. |
| phone | string | – | The place's public phone number, as the owner gave it. |
| prices | string|array | – | What training at the place costs, shown on its page, in the owner's own words: one line each, for example "Drop-in 25 dollars", or { label, amount (in dollars) or amount_cents, period, note }. At mos… |
| request_email | string | – | Where booking confirmations and requests are emailed. Never shown in public. |
| timezone | string | – | The place's IANA time zone, for example "America/Chicago". |
| website | string | – | The place's own website, starting with https://. |
| Name | Type | Req | Description |
|---|---|---|---|
| next | string | yes | What to tell the owner next. |
| place | object|null | yes | The place: place_id, name, kind, line, city, country, address, hours, about, book_url, request_email, request_phone (texts, never public), prices, phone, timezone, status (draft or live), page_url, u… |
| status | string | yes | – |
No examples provided.
find_clinic Find a Phorme clinic ~198
Use this when the user wants to be seen in person by a physical therapist, sports medicine clinic, chiropractor, sports massage therapist or recovery studio, in a city they name or near a position they share. It returns up to five Phorme clinic and recovery partners, nearest or best matching first, each with the kind of care, the services it lists, its page on phor.me and a link to ask for an appointment there. It takes a place and a kind of care, never symptoms. It reads only, does not diagnose or treat, shows no prices and books nothing.
| Name | Type | Req | Description |
|---|---|---|---|
| care | string | – | The kind of care the user asked for, only if they named one. |
| city | string | – | The city the user named, for example "Austin". |
| near_lat | number | – | Latitude, only if the user shared their position. |
| near_lon | number | – | Longitude, only if the user shared their position. |
| Name | Type | Req | Description |
|---|---|---|---|
| clinics | array | yes | Clinics, nearest or best matching first: name, care, line, city, country, distance_km, page_url, request_url and services. |
| limits | array | yes | What this does not cover. Tell the user. |
No examples provided.
find_coaching_brain Find a Phorme coaching brain ~348
Use this when the user wants a way to train for a goal or sport, for example "I want to get more explosive for basketball", "build muscle three days a week" or "train for a half marathon", or wants to train with a named coach, for example "train with Cameron Goodson", and has not picked a programme, or has a coach code someone gave them, for example K7Q2-XR4D. Phorme coaching brains are curated training methods: a coach, the principles the method trains by, and a coach-built programme. It returns up to three brains that fit, best first, each with its coach, focus, how it trains and its programmes with weeks and days a week; with a coach named, only that coach's brains; with a code, the one brain it belongs to and its page. It reads only and changes nothing. Do not use it for injury rehab or nutrition.
| Name | Type | Req | Description |
|---|---|---|---|
| coach | string | – | A coach the user named, for example "Cameron Goodson". Only that coach's brains are returned. |
| code | string | – | A Phorme coach code exactly as the user gave it, for example "K7Q2-XR4D", or a phor.me/c/ link. Only when they gave one. |
| days_per_week | integer | – | Training days a week, only if the user said. |
| goal | string | – | What the user wants from training, in their words, for example "jump higher" or "first HYROX race". Needed unless a code is given. |
| sport | string | – | The sport or position, only if the user named one. |
| Name | Type | Req | Description |
|---|---|---|---|
| brains | array | yes | Best fit first: id, name, coach, coach_title, focus, how_it_trains, image_url and image_alt (Phorme's own picture of the brain, its programme cover or its coach's room: show it, never a web photo), p… |
| code | string | – | The coach code that was looked up, when one was given. |
| goal | string | yes | – |
| limits | array | yes | What this does not cover. Tell the user. |
No examples provided.
find_exercise_swap Find an exercise swap ~188
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.
| Name | Type | Req | Description |
|---|---|---|---|
| available_equipment | array | yes | Equipment the user has, for example ["dumbbells", "bench"] or ["none"]. Ask when the user did not say. |
| exercise | string | yes | The exercise to replace, as the user wrote it, for example "Seated cable row". |
| reason | string | – | Why they need a swap, only if they said. |
| Name | Type | Req | Description |
|---|---|---|---|
| exercise | string | yes | – |
| limits | array | yes | What the swaps do not cover. Tell the user. |
| match | string | yes | nearest_kind: nothing of the same kind fits the equipment, so these work the same muscles from a different angle. |
| matched | string|null | – | The Phorme library movement the exercise matched. |
| pattern | string|null | – | The kind of movement, for example horizontal_pull. |
| swaps | array | yes | Replacements, best first, each with name, equipment and demo_url. |
No examples provided.
find_gym_class Find a Phorme gym or class ~304
Use this when the user wants a gym, studio or class to train at in person, for example "a strength class in Austin this week" or "a gym near me". It returns up to five Phorme gyms, studios and other places to train in the city named or within 60 km (or radius_km) of the position given, nearest or best matching first, each with its page on phor.me and its classes in the coming days with the class id, local start time, length, places left and a link to book on phor.me. When nothing matches it returns alternatives: the nearest places further out, and a home plan from a Phorme coaching brain. It reads only and shows no prices; booking a class for a signed-in user is a separate step.
| Name | Type | Req | Description |
|---|---|---|---|
| city | string | – | The city the user named, for example "Austin". |
| class_type | string | – | The kind of class, only if the user said, for example "barbell" or "yoga". |
| days | integer | – | How many days ahead to look. Default 7. |
| near_lat | number | – | Latitude, only if the user shared their position. |
| near_lon | number | – | Longitude, only if the user shared their position. |
| radius_km | integer | – | How far from the shared position to look, in km. Default 60. Use a larger one only when the user said they would travel. |
| Name | Type | Req | Description |
|---|---|---|---|
| alternatives | array | – | When nothing matched or no class is scheduled: kind (wider_radius, other_cities, home_plan), line (what to offer), tool, and for wider_radius the nearest places further out. Offer them; never leave t… |
| limits | array | yes | What this does not cover. Tell the user. |
| places | array | yes | Gyms, studios and other places to train, nearest or best matching first: place_id, name, kind, line, city, country, distance_km, page_url and classes (class_id, the id book_gym_class takes, then titl… |
No examples provided.
find_personal_coach Find a personal coach ~167
Use this when the user wants a human coach of their own: 1:1 coaching, someone who writes their program for them, checks in each week, reviews how they move or answers their messages, for example "I want a real coach for basketball" or "can someone coach me one on one?". It returns the Phorme coaches taking 1:1 clients now, with what the coaching includes, how many spots are open and the coach's page, where the terms and joining are. It shows no prices, books nothing and changes nothing. Coaching is training, not medical care.
| Name | Type | Req | Description |
|---|---|---|---|
| goal | string | – | What the user wants coaching for, in their words, only if they said. |
| sport | string | – | Their sport, only if they named one. |
| Name | Type | Req | Description |
|---|---|---|---|
| coaches | array | yes | Each coach taking 1:1 clients: coach, coach_url, offer, summary, includes, spots (status, detail, open), page_url, how_it_starts, and free_review (open, page_url) when the coach has a free plan revie… |
| limits | array | yes | What this does not cover. Tell the user. |
No examples provided.
find_races Find a race ~310
Use this when the user is looking for a race to enter, for example "which 70.3 can I do in South America next spring", "marathons in Europe in April" or "a HYROX near Riga". It lists races from Phorme's verified race listings that fit the kind of race, the place (a country, city or region) and the months asked, by date only, each with its city, date, its own page, its registration as the organiser last showed it, and whether Phorme has a plan that counts back to it. When the organiser has given them, the race's own logistics are included: where to pick up the race packet, the nearest airport, getting there and the official hotels the organiser lists, with the page they came from. It reads only and changes nothing. Only races in Phorme's listings are returned, with the dates the listings give.
| Name | Type | Req | Description |
|---|---|---|---|
| from_month | string | – | First month, YYYY-MM, only if the user gave a window. |
| kind | string | – | The kind of race, for example "70.3", "triathlon", "marathon", "half marathon" or "HYROX". Leave out for any. |
| to_month | string | – | Last month, YYYY-MM, only if the user gave a window. |
| where | string | – | A country, city or region, for example "Colombia", "Barranquilla" or "South America". Leave out for anywhere. |
| Name | Type | Req | Description |
|---|---|---|---|
| limits | array | yes | Where the dates come from and what to check. Tell the user. |
| races | array | yes | Races by date: name, city, country, on (YYYY-MM-DD or null), url (the race's own page), registration (status open, sold_out, opening_soon or closed, its url and checked_on, or null), has_plan, and lo… |
No examples provided.
get_gym_billing_link Get my gym billing link ~84
Use this when an owner on the gym plan wants to change the card, see invoices or change how many places the plan covers. It returns a link to Stripe's own billing page for the owner to open. It is a link only: nothing is paid or changed in the chat, and it changes nothing by itself. It needs a connected Phorme account.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| billing_url | string|null | – | Stripe's own billing page, or null when it opens from the console. |
| console_url | string | yes | The Plan tab of the console on phor.me. |
| next | string | yes | – |
No examples provided.
get_gym_report Get my gym report ~145
Use this when a gym, studio or clinic owner asks about their own places on Phorme: what is listed, what is live, and how each place did, for example "how is my gym doing on Phorme?" or "did anyone book this week?". It returns each place the connected account lists, with its page and status, and its report: times shown by assistants, page views, asks held, bookings, requests, members and the share earned. A place on the free listing shows a little reach and what it missed; the rest is locked, the same as the web console. It reads only and changes nothing. It needs a connected Phorme account.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| claims | array | – | The account's open claims on places nobody ran: claim_id, place_id, place_name, status (code_sent or review), channel, sent_to (masked), expires_at. |
| console_url | string | yes | – |
| next | string | yes | What to tell the owner next. |
| places | array | yes | Each place the account lists, as create_or_claim_place returns it. |
| report | array | yes | One per place. tier free: views_30d, times_shown_30d, ai_check, missed (bookings, asked, members), asks_held, locked and plan_url. tier plan: times_shown, visits, assistant_reads_30d, clicks, booking… |
| visits_unavailable | boolean | – | True when page visits could not be read just now. |
No examples provided.
get_lift_progress Chart my lift progress ~172
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.
| Name | Type | Req | Description |
|---|---|---|---|
| months | integer | – | How many months back to look. Defaults to 6. |
| movement | string | yes | The lift as the user said it, for example "bench", "back squat" or "RDL". |
| Name | Type | Req | Description |
|---|---|---|---|
| also_matched | array | – | Other logged lifts the words also matched. |
| best | object|null | – | – |
| change | object|null | – | from_e1rm_lb, to_e1rm_lb, change_lb and change_pct over the period. |
| found | boolean | yes | – |
| logged_movements | array | – | When nothing matched: the lifts they log most. |
| movement | string|null | – | The logged lift that matched, or null. |
| points | array | – | Oldest first: on, top_set, e1rm_lb, volume_lb, sets. |
No examples provided.
get_my_brain_code Get my coaching brain code ~118
Use this when a Phorme coach asks for the code or link to share one of their coaching brains, for example "what is my coach code?". Each brain has one code, like K7Q2-XR4D, made the first time it is asked for and kept as the brain changes. Anyone who types it in the Phorme app or opens its link starts with that brain. It needs a connected Phorme account that owns the brain.
| Name | Type | Req | Description |
|---|---|---|---|
| brain_id | string | yes | The brain id from the coach's brains. |
| Name | Type | Req | Description |
|---|---|---|---|
| brain_id | string | – | – |
| code | string | yes | – |
| console_url | string | – | – |
| url | string | yes | – |
No examples provided.
get_my_coaching_business Get my coaching brains ~80
Use this when a Phorme coach asks about their own coaching brains: how many members train under each, who went quiet, what they have earned, and whether a note to members can go today. It reads only and changes nothing. It needs a connected Phorme account; an account without a coaching brain gets the address of the coach console.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| brains | array | yes | Each brain with status, member totals, quiet members (labels only), earnings in cents and whether a note may go today. |
| coach | boolean | – | Whether the account has an active coach plan. |
| console_url | string | yes | – |
No examples provided.
get_payout_setup_link Get my payout setup link ~146
Use this when an owner wants their share paid to their bank and has not set it up, for example when no bank is set up yet. Confirm with the owner first, and set confirmation to true only after they said yes. It returns a link to Stripe's own form, where the owner gives their bank to Stripe. It is a link only: the bank is never given in the chat, and it takes no payment. It needs a connected Phorme account.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation | boolean | yes | Set to true only after the owner said yes to setting up payouts. |
| country | string | – | The two letter country of the bank, for example US. Default US. |
| Name | Type | Req | Description |
|---|---|---|---|
| console_url | string | yes | – |
| next | string | yes | – |
| setup_url | string|null | – | Stripe's own form, or null when it opens from the console. |
No examples provided.
get_payouts Get my payouts ~88
Use this when an owner asks what Phorme paid them, or what goes out next, for example "what did Phorme pay my gym?". It returns what the account earned, what was paid out, what is going out, what is owed now, whether a bank is set up, and each recent payout. It reads only and changes nothing. It needs a connected Phorme account.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| balance | object|null | – | earned_cents, paid_cents, going_out_cents, available_cents, min_payout_cents and payouts_ready. Null when it is read in the console. |
| console_url | string | yes | – |
| next | string | yes | – |
| payouts | array | yes | payout_id, amount_cents, status (pending, paid or failed) and created_at, newest first. |
No examples provided.
get_phorme_program Get a Phorme program ~87
Use this when the user picked one Phorme program and wants its details. It returns the program, every session of its first week, where to find it in the Phorme app, and a link to a page that describes it. It reads only, shows no prices and starts no purchase.
| Name | Type | Req | Description |
|---|---|---|---|
| program_id | string | yes | The program id returned by search_phorme_programs. |
| Name | Type | Req | Description |
|---|---|---|---|
| access | string | yes | – |
| first_week | array | yes | Every session of the first week with its exercises and demo links. |
| id | string | yes | – |
| info_url | string | yes | A page that describes the program. It has nothing to buy on it. |
| title | string | yes | – |
No examples provided.
get_planned_sessions Get my planned Phorme sessions ~106
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.
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | How many days ahead, starting today. Defaults to 7. |
| Name | Type | Req | Description |
|---|---|---|---|
| found | boolean | yes | – |
| plan | string|null | – | The name of the plan they follow. |
| sessions | array | – | In date order: on, title, status, minutes and exercises with sets, target, load and note. |
No examples provided.
get_saved_training Get saved Phorme training ~122
Use this when the user asks about a workout or program already saved to Phorme 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 from that save. It cannot list, search, edit or delete training.
| Name | Type | Req | Description |
|---|---|---|---|
| training_id | string | yes | The training_id returned by save_workout_to_phorme or save_program_to_phorme. |
| training_kind | string | yes | Whether the saved item is a workout or a program. |
| Name | Type | Req | Description |
|---|---|---|---|
| open_url | string | yes | Link that opens the saved training in Phorme. |
| status | string | yes | – |
| title | string|null | yes | – |
| training_id | string | yes | – |
| training_kind | string | yes | – |
No examples provided.
get_training_history Get my Phorme training log ~132
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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | How many recent workouts to return, newest first. Defaults to 10. |
| Name | Type | Req | Description |
|---|---|---|---|
| found | boolean | yes | False when this account has no Phorme training yet. |
| last_30_days | integer | – | – |
| last_7_days | integer | – | – |
| records | array | – | Latest personal records: movement, label, value and date. |
| total_logged | integer | – | – |
| workouts | array | – | Newest first: date, title, minutes and exercises with sets, best_set, e1rm_lb and volume_lb. |
No examples provided.
list_held_requests List asks waiting for my gym ~153
Use this when an owner asks who wants to book or visit their place, for example "who asked to book this week?". At a place not on the gym plan, class bookings and 1:1 requests are held for 7 days. It returns each one waiting: its hold_id, the place, the class and its local time (or that it is a 1:1 request), the member's first name, their note and best times, when it expires, and whether it can be accepted now. It reads only and changes nothing. It needs a connected Phorme account that owns the place.
| Name | Type | Req | Description |
|---|---|---|---|
| place_id | string | – | Only this place. Leave out for all of the owner's places. |
| Name | Type | Req | Description |
|---|---|---|---|
| held | array | yes | hold_id, place_id, place_name, kind (class or session), class (title, starts), first_name, note, times, asked_at, expires_at, can_accept and plan_url (the plan on phor.me, a price-free link, when it… |
| next | string | yes | – |
No examples provided.
plan_for_race Plan training for a race ~267
Use this when the user names a race they are training for, for example "IRONMAN 70.3 Barranquilla", "I signed up for the half ironman in Cartagena" or "Chicago Marathon". It finds the race in Phorme's race listings (name, date, city and the race's own page), counts the weeks to race day, and returns the week of Phorme's plan for that kind of race that lines up with race day, with sets, reps, paces, coach notes and a demo link for each exercise. For a triathlon (IRONMAN 70.3, 5150, full) it is swim, bike and run in one plan, with efforts until the athlete's swim and bike tests are in. When the organiser has given them, the race's own logistics come with it (venue, where to pick up the race packet, airport, official hotels from the organiser), with the page and date they were read. It reads only and changes nothing. If the race is not listed it says so; never guess a race date. Do not use it for injury rehab or nutrition.
| Name | Type | Req | Description |
|---|---|---|---|
| race | string | yes | The race as the user named it, for example "IRONMAN 70.3 Barranquilla". |
| Name | Type | Req | Description |
|---|---|---|---|
| brain | object|null | – | The Phorme coaching brain the plan follows: name, coach and how_it_trains. |
| days_out | integer|null | – | – |
| limits | array | yes | What this plan does not cover and where its dates come from. Tell the user. |
| program | object|null | – | The plan: title, weeks and days_per_week, and its summary. |
| race | object|null | yes | The race as listed: name, city, country, on (YYYY-MM-DD, null when not yet published), url (the race's own page), registration, and logistics: the race's own venue, packet_pickup, airport, getting_th… |
| sessions | array | yes | The sessions of that week, each with a title and exercises. |
| starts_on | string|null | – | When the race is further off than the plan, the day the plan's first week starts. |
| week_number | integer|null | – | The week of the plan these sessions are. |
| weeks_out | integer|null | – | – |
No examples provided.
preview_program_import Preview program in Phorme ~108
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. Do not use it for a single workout, nutrition plans or medical questions.
| Name | Type | Req | Description |
|---|---|---|---|
| program | object | yes | The multiweek program to preview, taken from this conversation. At most 500 workouts in total. |
| Name | Type | Req | Description |
|---|---|---|---|
| estimated_duration_minutes | integer|null | yes | – |
| exercise_count | integer | yes | – |
| exercises | array | – | Each exercise with its Phorme library match and demo link. |
| expires_at | string | yes | When the preview can no longer be saved, as an ISO 8601 time. |
| preview_id | string | yes | Identifies this preview when it is saved. |
| requires_confirmation | boolean | yes | Always true: saving needs the user's confirmation. |
| title | string | yes | – |
| training_kind | string | yes | – |
| warning_count | integer | yes | – |
| warnings | array | yes | Items the user should review before saving. |
No examples provided.
preview_sport_week Plan a sport training week ~194
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. Do not use it for injury rehab, team practice plans for children, or nutrition.
| Name | Type | Req | Description |
|---|---|---|---|
| gym_days_per_week | integer | yes | Gym days the user has this week. Ask when the user did not say. |
| season_phase | string | – | Where the user is in their season, only if they said. |
| sport | string | yes | The sport or position, for example "basketball", "volleyball" or "wide receiver". |
| Name | Type | Req | Description |
|---|---|---|---|
| brain | object|null | – | The coaching brain whose method the week follows: name, coach, focus, how_it_trains and image_url (Phorme's own picture). Name it to the user. |
| limits | array | yes | What this week does not cover. Tell the user. |
| match_quality | string | yes | exact_sport: a program written for this sport. related: the closest program. none: a general athletic program. |
| program | object|null | yes | The coach-built program the week comes from. |
| sessions | array | yes | One entry per gym day, each with a title and exercises. |
| sport | string | yes | – |
| week_number | integer|null | – | – |
No examples provided.
preview_workout_import Preview workout in Phorme ~225
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. Do not use it for multiweek programs, nutrition plans, or pain and injury questions.
| Name | Type | Req | Description |
|---|---|---|---|
| available_equipment | array | – | Equipment the user said they have, for example ["dumbbells", "bench"] or ["none"]. Leave out when the user did not say. |
| origin | string | – | Use "sport_week" when the workout is a session returned by preview_sport_week. Otherwise leave out. |
| time_limit_minutes | integer | – | Minutes the user said they have. Leave out when the user did not say. |
| workout | object | yes | The workout to preview, taken from this conversation. |
| Name | Type | Req | Description |
|---|---|---|---|
| estimated_duration_minutes | integer|null | yes | – |
| exercise_count | integer | yes | – |
| exercises | array | – | Each exercise with its Phorme library match and demo link. |
| expires_at | string | yes | When the preview can no longer be saved, as an ISO 8601 time. |
| preview_id | string | yes | Identifies this preview when it is saved. |
| requires_confirmation | boolean | yes | Always true: saving needs the user's confirmation. |
| title | string | yes | – |
| training_kind | string | yes | – |
| warning_count | integer | yes | – |
| warnings | array | yes | Items the user should review before saving. |
No examples provided.
publish_gym_brain Publish my gym's coaching brain ~149
Use this when an owner wants the changes to their place's coaching brain to reach members, for example after its voice, look or programs changed. Confirm with the owner first, and set confirmation to true only after they said yes. It runs the same publish checks as the console and publishes the brain when they pass; when one fails it says what is left and members see no change. It needs a connected Phorme account that owns the place.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation | boolean | yes | Set to true only after the owner said yes to publishing the coaching brain. |
| place_id | string | yes | The place_id of one of the owner's places, from get_gym_report or create_or_claim_place. |
| Name | Type | Req | Description |
|---|---|---|---|
| brain_id | string | yes | – |
| checks | array | – | label, ok and detail for each publish check. |
| next | string | yes | – |
| place_id | string | yes | – |
| published | boolean | yes | – |
No examples provided.
publish_place Put my place live ~202
Use this when an owner wants their place live on Phorme: its page on phor.me, the app's map and the Phorme connector. Confirm with the owner first, and set confirmation to true only after they said yes. Going live needs an email for booking confirmations and requests: request_email, else the place's own, else the account's. Listing is free; when someone asks to book a place that is not on the gym plan, the ask is held 7 days and the owner is told. It takes no payment and starts no plan. It needs a connected Phorme account that owns the place.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation | boolean | yes | Set to true only after the owner said yes to putting this place live. |
| place_id | string | yes | The place_id of one of the owner's places, from get_gym_report or create_or_claim_place. |
| request_email | string | – | Where booking confirmations and requests are emailed. Never shown in public. |
| Name | Type | Req | Description |
|---|---|---|---|
| next | string | yes | – |
| place | object|null | yes | The place: place_id, name, kind, line, city, country, address, hours, about, book_url, request_email, request_phone (texts, never public), prices, phone, timezone, status (draft or live), page_url, u… |
No examples provided.
render_training_import Show Phorme training card ~148
Use this to show a compact Phorme card for a workout or program that was just previewed or saved. It displays only the title, counts, status and link it is given. It reads and changes nothing in Phorme.
| Name | Type | Req | Description |
|---|---|---|---|
| estimated_duration_minutes | integer | – | – |
| exercise_count | integer | – | – |
| open_url | string | – | Link that opens the saved training in Phorme. Not set for previews. |
| status | string | – | "preview" for training not yet saved, "saved" for training saved to Phorme. |
| title | string | – | Training title from the tool result. |
| training_kind | string | – | – |
| warning_count | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| estimated_duration_minutes | integer | – | – |
| exercise_count | integer | – | – |
| open_url | string | – | Link that opens the saved training in Phorme. Not set for previews. |
| status | string | – | "preview" for training not yet saved, "saved" for training saved to Phorme. |
| title | string | – | Training title from the tool result. |
| training_kind | string | – | – |
| warning_count | integer | – | – |
No examples provided.
save_program_to_my_coaching_brain Save a program to my coaching brain ~161
Use this when a Phorme coach has written a program in this conversation and clearly said to save it to one of their coaching brains. It saves the program as a draft on that brain (session names, exercises, sets and reps); members see nothing until the coach adds the draft in the coach console. It needs a connected Phorme account that owns the brain.
| Name | Type | Req | Description |
|---|---|---|---|
| brain_id | string | yes | The brain id from the coach's brains. |
| confirmation | boolean | yes | True only after the coach confirmed this save. |
| sessions | array | yes | One week of sessions; the app repeats and progresses it. |
| title | string | yes | – |
| weeks | integer | – | How many weeks the program runs. Defaults to 4. |
| Name | Type | Req | Description |
|---|---|---|---|
| console_url | string | yes | – |
| draft | object|null | – | – |
| saved | string | yes | – |
No examples provided.
save_program_to_phorme Save program to Phorme ~182
Use this when the user has seen a program preview and clearly said to save it. It saves that preview to the connected Phorme account as a private program and returns a link that opens it in Phorme. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation | boolean | yes | Set to true only after the user clearly confirmed this save in the conversation. |
| idempotency_key | string | yes | A unique string for this save. Reuse the same value when retrying so no second copy is created. |
| preview_id | string | yes | The preview_id of the preview being saved. |
| Name | Type | Req | Description |
|---|---|---|---|
| open_url | string | yes | Link that opens the saved training in Phorme. |
| status | string | yes | – |
| training_id | string | yes | – |
| training_kind | string | yes | – |
No examples provided.
save_workout_to_phorme Save workout to Phorme ~158
Use this when the user has seen a workout preview and clearly said to save it. It saves that preview to the connected Phorme account as a private workout and returns a link that opens it in Phorme. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation | boolean | yes | Set to true only after the user clearly confirmed this save in the conversation. |
| idempotency_key | string | yes | A unique string for this save. Reuse the same value when retrying so no second copy is created. |
| preview_id | string | yes | The preview_id of the preview being saved. |
| Name | Type | Req | Description |
|---|---|---|---|
| open_url | string | yes | Link that opens the saved training in Phorme. |
| status | string | yes | – |
| training_id | string | yes | – |
| training_kind | string | yes | – |
No examples provided.
search_phorme_programs Search Phorme programs ~198
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 where to find it in the Phorme app. Every result is a program a member can train in the Phorme app today. It changes nothing, shows no prices and starts no purchase. Results are ordered by fit and never by commission.
| Name | Type | Req | Description |
|---|---|---|---|
| creator | string | – | Coach or creator name, only if the user named one. |
| duration_weeks | integer | – | – |
| equipment | array | – | Equipment the user has. |
| experience | string | – | Training level, for example "beginner". |
| goal | string | – | Training goal, for example "build strength". |
| schedule_days | integer | – | Training days per week. |
| sport | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| limits | array | yes | – |
| programs | array | yes | Matching programs, best fit first, each with title, coach, weeks, sample_session and access. |
No examples provided.
send_note_to_my_members Send a note to my members ~136
Use this when a Phorme coach has written a short note to everyone training under one of their published coaching brains and clearly said to send it. It sends the coach's words as they are, as a notification and in each member's coach history: up to 400 characters, no links, one note per brain per day. It needs a connected Phorme account with an active coach plan that owns the brain.
| Name | Type | Req | Description |
|---|---|---|---|
| brain_id | string | yes | – |
| confirmation | boolean | yes | True only after the coach confirmed this exact note. |
| text | string | yes | The coach's own words, exactly as they approved them. |
| Name | Type | Req | Description |
|---|---|---|---|
| next_allowed_at | string|null | – | – |
| recipients | integer | yes | – |
| sent | boolean | yes | – |
No examples provided.
set_booking_notices Set where booking notices go ~203
Use this when an owner wants booking and ask notices for a place sent somewhere else, for example "text my bookings to my phone". send_to is an email, or a phone that gets them as texts; one at a time, as in the console. An empty send_to sends them to the account's own phone or email. Read it back to the owner first, and set confirmation to true only after they said yes. The phone is never shown on the place's page. It needs a connected Phorme account that owns the place.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation | boolean | yes | Set to true only after the owner said yes to where booking notices go. |
| place_id | string | yes | The place_id of one of the owner's places, from get_gym_report or create_or_claim_place. |
| send_to | string | yes | An email, or a phone with its country code for texts, for example +15125550100. "" for the account's own. |
| Name | Type | Req | Description |
|---|---|---|---|
| next | string | yes | – |
| place | object|null | yes | The place: place_id, name, kind, line, city, country, address, hours, about, book_url, request_email, request_phone (texts, never public), prices, phone, timezone, status (draft or live), page_url, u… |
No examples provided.
set_class_schedule Set my class schedule ~319
Use this when an owner wants to see, add, change or cancel a class at their place. action list reads the schedule and changes nothing. For add, edit and cancel, read the class, day and time back to the owner first, and set confirmation to true only after they said yes. A class people booked keeps its time, length and price; a class members paid for cannot be cancelled here. Members pay for a paid class on Phorme's own payment page; this tool takes no payment. It needs a connected Phorme account that owns the place.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| capacity | integer | – | How many people it takes. |
| class_id | string | – | For edit and cancel: the class_id from action list. |
| confirmation | boolean | – | Set to true only after the owner said yes to this class change. |
| line | string | – | One line on the class. |
| minutes | integer | – | – |
| place_id | string | yes | The place_id of one of the owner's places, from get_gym_report or create_or_claim_place. |
| price_usd | number | – | What one place in the class costs, as the owner set it. 0 or left out for free. Never repeat it to anyone but the owner. |
| starts_at | string | – | When it starts: "YYYY-MM-DDTHH:MM" in the place's own time, or an ISO time with its offset. |
| title | string | – | The class name, for example "Barbell basics". |
| Name | Type | Req | Description |
|---|---|---|---|
| class | object|null | – | – |
| classes | array | – | class_id, title, line, starts (local), starts_at, minutes, capacity, booked, paid, status. |
| next | string | yes | – |
| place_id | string | yes | – |
No examples provided.
set_member_cover Cover my members ~217
Use this when an owner on the gym plan wants to pay for their members' Phorme membership at one place, so members train free, or wants to stop. Confirm with the owner first, and set confirmation to true only after they said yes. It turns the switch on or off and can lower the cap of members covered (up to 50). Members join from the app and the place approves them. A place not on the gym plan cannot turn it on; the result then gives plan_url, the plan on phor.me. It takes no payment here. It needs a connected Phorme account that owns the place.
| Name | Type | Req | Description |
|---|---|---|---|
| cap | integer | – | Most members covered at this place. Default 50. |
| confirmation | boolean | yes | Set to true only after the owner said yes to this change to member cover. |
| on | boolean | yes | true to cover members, false to stop. |
| place_id | string | yes | The place_id of one of the owner's places, from get_gym_report or create_or_claim_place. |
| Name | Type | Req | Description |
|---|---|---|---|
| cover | object|null | – | on, plan, cap and members covered. |
| next | string | yes | – |
| place_id | string | yes | – |
| plan_url | string|null | – | – |
No examples provided.
set_my_brain_rules Set my coaching brain rules ~262
Use this when a Phorme coach describes how they coach and wants their coaching brain to follow it, for example "every session starts with mobility, main lifts stay in 3 to 6 reps, never two hard days in a row". Sent with the coach's words, it reads them into the brain's rules and saves nothing: it returns the rules, one plain line per rule, and what no rule covers yet. Sent with those rules and confirmation, it saves them, and Phorme checks the brain on sample members and says whether every plan still works. Members train by the saved rules from their next session. It needs a connected Phorme account that owns the brain; set confirmation to true only after the coach said yes to the rules as read back.
| Name | Type | Req | Description |
|---|---|---|---|
| brain_id | string | yes | The brain id from the coach's brains. |
| confirmation | boolean | – | True only after the coach confirmed these rules. Needed to save. |
| rules | object | – | The rules a draft returned, unchanged or as the coach corrected them: method, voice, banned_phrases and share. Sent to save. |
| text | string | – | How the coach coaches, in their own words from this conversation. Never invented. Sent to read a draft. |
| Name | Type | Req | Description |
|---|---|---|---|
| brain_id | string | yes | – |
| console_url | string | – | – |
| next | string | – | – |
| preview_ok | boolean|null | – | After a save: whether every sample member still gets a plan that works. |
| requires_confirmation | boolean | – | – |
| rules | object | yes | – |
| said | array | – | One plain line per rule the draft read: key and line. |
| saved | boolean | yes | False for a draft, true once saved. |
| unread | array | – | Parts of the coach's words no rule covers yet. |
No examples provided.
set_owner_email Set my owner email ~118
Use this when an owner who signed in by phone wants notices about their gym plan sent to an email. Read the email back to the owner first, and set confirmation to true only after they said yes. An empty email clears it, and notices go to the account's own email or phone. It is never shown to members. It needs a connected Phorme account.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation | boolean | yes | Set to true only after the owner said yes to this email. |
| string | yes | The owner's email, or "" to clear it. |
| Name | Type | Req | Description |
|---|---|---|---|
| next | string | yes | – |
| owner_email | string|null | yes | – |
No examples provided.
How do I install the Phorme Training MCP server?
Phorme Training is a hosted endpoint at https://phor.me/api/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · phor.me
claude mcp add --transport http me-phor-phorme-training 'https://phor.me/api/mcp'
What is the Phorme Training MCP server?
Phorme Training is an MCP server listed in the public MCP registry as me.phor/phorme-training. Coach-built training: coaching brains, programs, race plans, gyms, clinics, demos and your log. This page covers its hosted endpoint (https://phor.me/api/mcp).
Is the Phorme Training MCP server safe to use?
Phorme Training scores 74 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Phorme Training MCP server expose?
Phorme Training exposes 49 tools: preview_workout_import, save_workout_to_phorme, preview_program_import, save_program_to_phorme, get_saved_training, and 44 more. Their descriptions and schemas cost roughly 9,939 tokens of context every time the server is loaded.
Does the Phorme Training MCP server require authentication?
No. We connected to Phorme Training without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Phorme Training MCP server still maintained?
Phorme Training is still listed as active in the MCP registry. We last reached this channel on 24 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.