The MCP tool reference

Every tool your AI assistant gets when it connects to an OnlineFitness.app coach account: 129 tools across 13 areas, 46 of them read-only.

Updated · Connector URL: https://onlinefitness.app/mcp · Setup guide

How to read this

Tools follow a verb_entity grammar: list_* returns summaries, get_* one full card, plus create_ / update_ / delete_* and domain actions like assign_program or archive_client. Each parameter shows its type — enums list every allowed value — and ? marks it optional.

Read-only never changes data Writes creates or updates Irreversible hard delete, no undo

Clients & onboarding 9

list_clients

Read-only

Lists all of the coach's clients with status and last workout date.

get_client

Read-only

Returns one client's full card by id, including compliance stats, tags and the client's AI system prompt.

clientId: string

list_inactive_clients

Read-only

Lists active clients with no scheduled workout in the last N days (default 7), including clients who never had one.

days?: integer (1–365)

create_client

Writes

Creates a client and SENDS an invitation email to the given address. Calling it again for the same email does not duplicate the client — it re-sends the invitation (use this to re-invite a pending client). Returns the client card plus the invitation link the coach can share directly.

email: string displayName: string

update_client

Writes

Sets the system prompt of the client's built-in AI assistant (persona/instructions). An empty string resets it to the default. Name and email cannot be changed here. Returns the updated client card.

clientId: string systemPrompt: string

archive_client

Writes

Archives a client (status archivedByCoach, hides from the active list). Reversible via activate_client. Returns the updated client card.

clientId: string

activate_client

Writes

Restores an archived client to active status. Reverse of archive_client. Returns the updated client card.

clientId: string

list_client_tags

Read-only

Lists all of the coach's client tags grouped into cohorts: each tag with the ids of clients labeled by it. Use it to see existing tags before set_client_tags and to resolve tag-based audiences.

set_client_tags

Writes

REPLACES a client's whole tag set: pass the complete desired list, not a diff (an empty list clears all tags). Tags are normalized to lowercase, trimmed, and a leading '#' is stripped; reuse existing tags from list_client_tags where possible. Returns the client's resulting tags.

clientId: string tags: string[]

Paid access, payments & service plans 8

set_client_access

Writes

Grants or extends a client's paid access until a calendar date (inclusive, end of day in the client's timezone) — a date in the past is accepted and ends access immediately, so double-check the year. Pass amount (with optional currency, default USD, and paidAtIso) to also record a payment in the coach's private ledger. Works only for active clients. On the free plan this is the only paid gate: opening access for a client who is not billable yet fails when the coach already has 3 such clients (extending an already billable client always works, and revoke_client_access is never gated). Returns the updated client card (see accessSummary; trialUntil marks access granted automatically as a trial, which does not take a plan slot).

clientId: string accessUntil: date (YYYY-MM-DD) amount?: number (≥ 0) currency?: string paidAtIso?: datetime (ISO 8601)

revoke_client_access

Writes

Revokes a client's paid access immediately (accessSummary keeps the period as history with cancelledAt set). Reversible by granting access again via set_client_access. Not idempotent: each call re-stamps cancelledAt and logs the action — don't retry a successful call. Returns the updated client card.

clientId: string

list_client_payments

Read-only

Lists a client's payments from the coach's private ledger, newest first (by paidAt). Payments are created by set_client_access when amount is passed. limit defaults to 20, max 100; offset skips newer entries (capped at 1000).

clientId: string limit?: integer (1–100) offset?: integer (≥ 0)

delete_client_payment

Irreversible

Deletes one payment record from the coach's private ledger (IRREVERSIBLE). Does NOT change the client's access period — adjust that via set_client_access. No-op if missing (deleted:false).

clientId: string paymentId: string

list_service_plans

Read-only

Lists the coach's service plans (pricing offers), newest first, including hidden and archived ones — filter by status (active/hidden/archived). limit defaults to 20, max 100; offset skips newer entries (capped at 1000).

limit?: integer (1–100) offset?: integer (≥ 0)

create_service_plan

Writes

Creates a service plan (pricing offer): name, optional price (omit for free/negotiable), duration (value + unit days/weeks/months) and included items. status defaults to active; hidden keeps it out of pickers. Returns the created plan.

name: string description?: string priceAmount?: number (≥ 0) currency?: string durationValue: integer (≥ 1) durationUnit: days | weeks | months status?: active | hidden | archived includedItems?: string[]

update_service_plan

Writes

Updates a service plan. Pass only the fields to change; description/priceAmount/currency accept null to clear. includedItems REPLACES the whole list. Renaming does not affect clients already granted access (they keep a name snapshot). Returns the updated plan.

servicePlanId: string name?: string description?: string priceAmount?: number (≥ 0) currency?: string durationValue?: integer (≥ 1) durationUnit?: days | weeks | months status?: active | hidden | archived includedItems?: string[]

archive_service_plan

Writes

Archives a service plan (status → archived, kept for history; clients already granted access are unaffected). To bring it back use update_service_plan with status. Returns the updated plan.

servicePlanId: string

Client workouts 9

list_client_workouts

Read-only

Lists a client's workouts within a date window (summaries, no exercises). Defaults to today±30 days. If more than 100 match, the most recent are returned with truncated=true — narrow from/to.

clientId: string from?: date (YYYY-MM-DD) to?: date (YYYY-MM-DD)

get_client_workout

Read-only

Returns one client workout with full exercise cards (descriptions, video, completion).

clientId: string workoutId: string

create_client_workout

Writes

Creates a client workout as an empty shell — add exercises separately. type: workout (regular) or rest_day. Returns the created workout (lean).

clientId: string title: string date: date (YYYY-MM-DD) type: workout | rest_day description?: string

update_client_workout

Writes

Updates a client workout. Pass only the fields to change (omitted fields keep their value). exerciseIds may only reorder/remove EXISTING exercise ids (unknown ids are rejected); to add new exercises use add_exercises_to_client_workout. Returns the updated workout (lean).

clientId: string workoutId: string title?: string description?: string date?: date (YYYY-MM-DD) type?: workout | rest_day exerciseIds?: string[]

delete_client_workout

Irreversible

Deletes a client workout (IRREVERSIBLE, hard delete). Cascades: its exercises, the workout chat (comments/media) and the calendar event are deleted; the workout disappears from the client's schedule. No-op if missing (deleted:false).

clientId: string workoutId: string

add_exercises_to_client_workout

Writes

Adds exercises from the coach's library to a client workout, in the given order (each is copied; library video carries over). Set per-exercise instructions (e.g. '3×12, rest 60s') right away. Items are applied independently: a failed item is reported in results[] and the rest continue; exercises already in the workout are skipped as duplicates — retrying a batch is safe. Returns per-item results and the updated workout (lean).

clientId: string workoutId: string exercises: { exerciseId, instructions? }[]

create_client_workout_exercise

Writes

Creates a custom exercise directly in a client workout (not from the library). videoUrl: YouTube only. Prefer add_exercises_to_client_workout for library exercises. Returns the updated workout (lean).

clientId: string workoutId: string title: string instructions?: string description?: string videoUrl?: string

update_client_workout_exercise

Writes

Updates an exercise inside a client workout (exerciseId from get_client_workout). Pass only the fields to change; omitted fields keep their value, including video. videoUrl: YouTube only. Returns the updated workout (lean).

clientId: string workoutId: string exerciseId: string title?: string instructions?: string description?: string videoUrl?: string

delete_client_workout_exercise

Irreversible

Removes an exercise from a client workout (IRREVERSIBLE). Cascades: the exercise chat (comments/media) is deleted. exerciseId is the id inside the workout. No-op if already gone (deleted:false). Returns {deleted, workout} with the updated workout (lean).

clientId: string workoutId: string exerciseId: string

Program templates 14

list_programs

Read-only

Lists the coach's program templates (newest first) — headers only; get_program returns the full tree. limit defaults to 50, max 100; offset for pagination (capped at 1000); truncated=true if more exist.

limit?: integer (1–100) offset?: integer (≥ 0)

get_program

Read-only

Returns a program template as a full tree: header plus days (ordered by day) with exercise summaries. For full exercise cards of one day call get_program_workout.

programId: string

create_program

Writes

Creates a program template (title/description only — add days with create_program_workout). Returns the program tree.

title: string description?: string

update_program

Writes

Updates a program's title/description. Pass only the fields to change (omitted fields keep their value). Returns the program tree.

programId: string title?: string description?: string

delete_program

Irreversible

Deletes a program template (IRREVERSIBLE). Cascades: its days and their exercises. Workouts already assigned to clients are NOT affected (snapshots). No-op if missing (deleted:false).

programId: string

assign_program

Writes

Assigns a program to a client: expands its days into real client workouts (day N lands on startDate + N-1). Only ADDS workouts — assigning the same program again creates a duplicate set, so never retry a successful assign. Returns how many workouts and exercises were created (0 if the program has no days).

programId: string clientId: string startDate: date (YYYY-MM-DD)

get_program_workout

Read-only

Returns one program day with full exercise cards (descriptions and video info). workoutId comes from the get_program tree.

programId: string workoutId: string

create_program_workout

Writes

Creates a day in a program template as an empty shell — add exercises separately. day is the ordinal number within the program (>= 1), not a date. type: workout (regular) or rest_day. Returns the created day (lean).

programId: string type: workout | rest_day title: string description?: string day: integer (≥ 1)

update_program_workout

Writes

Updates a program day. Pass only the fields to change (omitted fields keep their value). exerciseIds may only reorder/remove EXISTING exercise ids (unknown ids are rejected); to add new exercises use add_exercises_to_program_workout. Returns the updated day (lean).

programId: string workoutId: string type?: workout | rest_day title?: string description?: string day?: integer (≥ 1) exerciseIds?: string[]

delete_program_workout

Irreversible

Deletes a day from a program (IRREVERSIBLE). Cascades: the day's exercises are deleted too. No-op if missing (deleted:false).

programId: string workoutId: string

add_exercises_to_program_workout

Writes

Adds library exercises to a program day, in the given order (each is copied; library video carries over). Set per-exercise instructions (e.g. '4×8') right away. This is the right tool for filling a program. Items are applied independently: a failed item is reported in results[] and the rest continue; exercises already in the day are skipped as duplicates — retrying a batch is safe. Returns per-item results and the updated day (lean).

programId: string workoutId: string exercises: { exerciseId, instructions? }[]

create_program_workout_exercise

Writes

Creates a custom exercise directly in a program day (not from the library). videoUrl: YouTube only. Prefer add_exercises_to_program_workout for library exercises (video carries over). Returns the updated day (lean).

programId: string workoutId: string title: string instructions?: string description?: string videoUrl?: string exerciseType?: strength | cardio | flexibility | timed

update_program_workout_exercise

Writes

Updates an exercise inside a program day (exerciseId from get_program_workout). Pass only the fields to change; omitted fields keep their value, including video. videoUrl: YouTube only. Returns the updated day (lean).

programId: string workoutId: string exerciseId: string title?: string instructions?: string description?: string videoUrl?: string exerciseType?: strength | cardio | flexibility | timed

delete_program_workout_exercise

Irreversible

Removes an exercise from a program day (IRREVERSIBLE). exerciseId is the id inside the day. No-op if already gone (deleted:false). Returns {deleted, workout} with the updated day (lean).

programId: string workoutId: string exerciseId: string

Exercise library 10

list_exercises

Read-only

Lists the coach's exercise library as summaries (no descriptions — use get_exercise for the full card). Filters: tag (exact match), query (case-insensitive substring of the title) and folderId (see list_exercise_folders). limit defaults to 50, max 100; truncated=true if more matched.

tag?: string query?: string folderId?: string limit?: integer (1–100)

get_exercise

Read-only

Returns one library exercise by id with the full description. The same id serves as sourceExerciseId for get_exercise_progress.

exerciseId: string

create_exercise

Writes

Creates an exercise in the coach's library. videoUrl: YouTube link only (video files cannot be uploaded via MCP). Returns the created exercise.

title: string description?: string exerciseType?: strength | cardio | flexibility | timed videoUrl?: string

update_exercise

Writes

Updates a library exercise. Pass only the fields to change; omitted fields keep their value. Video cannot be cleared via MCP — omitting videoUrl keeps the current one. Returns the updated exercise.

exerciseId: string title?: string description?: string tags?: string[] exerciseType?: strength | cardio | flexibility | timed videoUrl?: string

delete_exercise

Irreversible

Deletes a library exercise (IRREVERSIBLE, hard delete). Workouts it was copied into are NOT affected (they hold snapshots). No-op if missing (deleted:false).

exerciseId: string

list_exercise_folders

Read-only

Lists the coach's exercise library folders (sorted by name). isAutoMonthFolder marks auto-created per-month video folders (their names are localized in the app until renamed). Filter exercises by folder via list_exercises folderId. limit defaults to 20, max 100; offset for pagination (capped at 1000).

limit?: integer (1–100) offset?: integer (≥ 0)

create_exercise_folder

Writes

Creates a folder in the exercise library. Returns the created folder.

name: string

update_exercise_folder

Writes

Renames an exercise library folder (renaming an auto month folder makes its name permanent). Returns the updated folder.

folderId: string name: string

delete_exercise_folder

Irreversible

Deletes an exercise library folder. Exercises inside are NOT deleted — they move to the library root. No-op if missing (deleted:false).

folderId: string

move_exercises_to_folder

Writes

Moves library exercises into a folder, or to the library root when folderId is null. exerciseIds are LIBRARY ids (from list_exercises). Atomic: any unknown/foreign id rejects the whole batch. Returns the applied move.

exerciseIds: string[] folderId: string

Client progress & check-ins (read-only) 6

get_exercise_progress

Read-only

Returns a client's latest results for one movement by sourceExerciseId (newest first). limit defaults to 20, max 100; offset skips newer results to reach older ones (capped at 1000).

clientId: string sourceExerciseId: string limit?: integer (1–100) offset?: integer (≥ 0)

list_client_measurements

Read-only

Lists a client's measurement entries (weight/circumferences), newest first. values holds the metrics; hasPhotos tells whether progress photos exist. limit defaults to 20, max 100; offset skips newer entries (capped at 1000).

clientId: string limit?: integer (1–100) offset?: integer (≥ 0)

list_client_health_records

Read-only

Lists a client's health form entries, newest first. answers maps each condition (chronic_conditions, hormonal_medications, injuries_and_surgeries, pain, varicose, diastasis) to the client's answer: present tells yes/no, details holds their explanation. A condition missing from answers means the client did not answer it — that is not the same as 'no'. limit defaults to 20, max 100; offset skips newer entries (capped at 1000).

clientId: string limit?: integer (1–100) offset?: integer (≥ 0)

list_client_fitness_goals

Read-only

Lists a client's fitness goal entries, newest first. Each entry is what the client wanted at that moment: desiredWeight plus their own wording for the month (monthResult, monthGoal). The newest entry is the current request; older ones show how it changed. limit defaults to 20, max 100; offset skips newer entries (capped at 1000).

clientId: string limit?: integer (1–100) offset?: integer (≥ 0)

list_client_inventory

Read-only

Lists the equipment the client says they have (their own wording, e.g. 'dumbbells 5 kg', 'resistance bands'), oldest first. Read-only: the client edits it in the app. An empty list means the client has not filled it in — it does NOT mean they have no equipment. Check it before building a program so the exercises match what they actually own.

clientId: string

list_client_form_answers

Read-only

Lists a client's form answers as question–answer pairs (newest first). formId narrows to one form. truncated=true if more than 200 matched — narrow by formId.

clientId: string formId?: string

Forms 5

list_forms

Read-only

Lists the coach's forms (questionnaires/check-ins) with their questions. Use a form's id with list_client_form_answers to narrow answers to that form.

get_form

Read-only

Returns one form by id (questionnaire questions).

formId: string

create_form

Writes

Creates a form (questionnaire/check-in) with an ordered list of question texts. Questions are shown to clients verbatim — write them in the client's language. Returns the created form.

title: string description?: string questions?: string[]

update_form

Writes

Updates a form. Pass only the fields to change (omitted fields keep their value). questions REPLACES the whole list — pass the complete new list, not a diff. Returns the updated form.

formId: string title?: string description?: string questions?: string[]

delete_form

Irreversible

Deletes a form (IRREVERSIBLE, hard delete). Already submitted client answers are kept — they store question/answer snapshots. No-op if missing (deleted:false).

formId: string

Chat & broadcasts 11

list_client_chats

Read-only

One row per client with the last message of their coach↔client chat (who sent it, when, a short preview), newest conversations first. awaitingReply=true means the client wrote last — that is the answer to "who is waiting for a reply". Read the thread with get_client_chat and answer with send_client_chat_message. Covers up to 100 clients; truncated=true means the coach has more.

get_client_chat

Read-only

Returns the latest coach↔client chat messages in chronological order. Each message has from (coach/client), text and attachments (image/video/file/audio). The client's AI chat is not included. limit defaults to 30, max 100.

clientId: string limit?: integer (1–100)

get_exercise_chat

Read-only

Returns the comment thread of one exercise in a client workout (form-check photos/videos, notes), oldest first. clientId/workoutId/exerciseId come from get_client_workout. limit defaults to 30, max 100.

clientId: string workoutId: string exerciseId: string limit?: integer (1–100)

send_client_chat_message

Writes

Sends a text message from the coach to the client's chat. The client sees it in the app immediately and gets a push notification — write in the client's language. Text only (attachments are app-only). Do not retry a successful call: it would post a duplicate.

clientId: string text: string

send_exercise_chat_message

Writes

Sends a text comment from the coach into one exercise's thread (form feedback). clientId/workoutId/exerciseId come from get_client_workout; the client gets a push notification — write in the client's language. Text only. Do not retry a successful call: it would post a duplicate.

clientId: string workoutId: string exerciseId: string text: string

list_broadcasts

Read-only

Lists the coach's broadcasts, newest first: status (draft/scheduled/sending/sent/failed), audience, delivery counters and a content preview. Full text — get_broadcast. limit defaults to 20, max 100; offset skips newer entries (capped at 1000).

limit?: integer (1–100) offset?: integer (≥ 0)

get_broadcast

Read-only

Returns one broadcast by id with the full message text, audience, delivery counters and the recipients snapshot (filled after dispatch).

broadcastId: string

create_broadcast

Writes

Creates a broadcast that WILL BE SENT to every client in the audience — at scheduledAtIso, or within a minute if omitted. Each client receives it as a personal 1:1 chat message (with push); {{name}} in the text is replaced by the client's name. Until it is dispatched you can still update or delete it. Returns the broadcast card.

content: string audience: { type, tags?, clientIds? } scheduledAtIso?: datetime (ISO 8601)

update_broadcast

Writes

Rewrites an unsent broadcast (draft/scheduled only). NOT a partial update: content and audience fully REPLACE the current ones; omitting scheduledAtIso reschedules to now (send asap). Returns the updated card.

broadcastId: string content: string audience: { type, tags?, clientIds? } scheduledAtIso?: datetime (ISO 8601)

delete_broadcast

Irreversible

Cancels and deletes an UNSENT broadcast (draft/scheduled). A broadcast that already started sending cannot be deleted (error). No-op if missing (deleted:false).

broadcastId: string

retry_broadcast

Writes

Requeues a FAILED broadcast for immediate sending (already delivered messages are skipped — clients get no duplicates). Returns the updated card.

broadcastId: string

Funnels & leads 13

list_funnels

Read-only

Lists the coach's funnels (lead-capture questionnaire pages), newest first: slug, status (draft/published), locale, step count. Full steps — get_funnel. limit defaults to 20, max 100; offset skips newer entries (capped at 1000).

limit?: integer (1–100) offset?: integer (≥ 0)

get_funnel

Read-only

Returns one funnel by id with its full ordered steps (raw step objects: id, type and type-specific fields).

funnelId: string

get_funnel_stats

Read-only

Returns funnel analytics: unique page views, per-step drop-off (unique sessions reaching each step), submitted leads and conversion. days narrows the window (e.g. 7 or 30); omit for all time.

funnelId: string days?: integer (≥ 1)

create_funnel

Writes

Creates a funnel as a DRAFT (not public until publish_funnel). steps are optional raw step objects ({id, type, ...fields}) — copy the shape from an existing funnel (get_funnel); invalid steps are rejected. The slug is the public URL segment; a duplicate slug is allowed in a draft but blocks publish_funnel until changed (uniqueness among the coach's published funnels is enforced at publish, not here). Returns the funnel card.

slug: string locale: string title: string description?: string steps?: { id, type }[]

update_funnel

Writes

Updates a funnel. Pass only the fields to change (omitted fields keep their value); steps REPLACES the whole ordered list — pass the complete new list. Editing a published funnel goes live immediately and must stay compliant (invalid updates are rejected). Returns the updated card.

funnelId: string slug?: string locale?: string title?: string description?: string steps?: { id, type }[]

publish_funnel

Writes

Publishes a funnel — its public page goes LIVE at {origin}/{coachHandle}/join/{slug}. Requires a compliant step set: exactly one age-gate, at least one disclaimer, at least one consent (ALWAYS required, even without sensitive questions; must precede any sensitive step), application as the last step — violations are rejected with the reason. Returns the updated card.

funnelId: string

unpublish_funnel

Writes

Takes a funnel offline (status → draft); the public page stops being served. Reversible via publish_funnel. Returns the updated card.

funnelId: string

delete_funnel

Irreversible

Deletes a funnel (IRREVERSIBLE, hard delete); a published page disappears. Leads already submitted are kept. Prefer unpublish_funnel to just take it offline. No-op if missing (deleted:false).

funnelId: string

list_leads

Read-only

Lists funnel leads (newest first). Without from/to returns the most recent (up to 100, then truncated=true). Each lead has status (new/seen/archived) and converted (became a client).

from?: date (YYYY-MM-DD) to?: date (YYYY-MM-DD)

get_lead

Read-only

Returns one lead by id: questionnaire answers, contact, UTM attribution, conversion status.

leadId: string

mark_lead_seen

Writes

Marks a lead as seen (status new → seen). Idempotent (no-op on an already seen lead). Returns the updated lead.

leadId: string

archive_lead

Writes

Archives a lead (removes it from the active inbox). Reversible via restore_lead. Returns the updated lead.

leadId: string

restore_lead

Writes

Restores an archived lead back to the inbox (status archived → seen, not new). Returns the updated lead.

leadId: string

Lead magnets 9

list_lead_magnets

Read-only

Lists the coach's lead magnets (public freebie pages), newest first: slug, status (draft/published), block count, whether a CTA is set. Full content — get_lead_magnet. limit defaults to 20, max 100; offset skips newer entries (capped at 1000).

limit?: integer (1–100) offset?: integer (≥ 0)

get_lead_magnet

Read-only

Returns one lead magnet by id: intro, cover, CTA and the full ordered blocks (raw block objects: id, type text/exercise/image and type-specific fields).

leadMagnetId: string

get_lead_magnet_stats

Read-only

Returns lead magnet analytics: page views, video plays (total and per exercise block), CTA clicks and leads attributed to the magnet, with conversion percentages. days narrows the window (e.g. 7 or 30); omit for all time.

leadMagnetId: string days?: integer (≥ 1)

create_lead_magnet

Writes

Creates a lead magnet as a DRAFT (not public until publish_lead_magnet). Add exercise blocks with add_exercise_to_lead_magnet; text/image blocks can be passed here ({id, type, ...fields}). slug is the public URL segment: kebab-case, and unique among the coach's published magnets. Returns the card.

slug: string locale: string title: string intro?: string seoDescription?: string blocks?: { id, type }[] cta?: { label, url }

update_lead_magnet

Writes

Updates a lead magnet. Pass only the fields to change (omitted fields keep their value); blocks REPLACES the whole ordered list (reorder/remove existing raw blocks from get_lead_magnet); cta: object to set, null to remove. Cover image can only be uploaded in the app. Editing a published magnet goes live immediately. Returns the updated card.

leadMagnetId: string slug?: string title?: string intro?: string seoDescription?: string blocks?: { id, type }[] cta?: { label, url }

add_exercise_to_lead_magnet

Writes

Appends a library exercise to a lead magnet as an exercise block (snapshot copy with video; instructions override the library text). Duplicates are allowed by design. Returns {blockId, leadMagnet}.

leadMagnetId: string exerciseId: string instructions?: string

publish_lead_magnet

Writes

Publishes a lead magnet — its public page goes LIVE at {origin}/{coachHandle}/free/{slug}. Requires at least one block and a CTA. Returns the updated card.

leadMagnetId: string

unpublish_lead_magnet

Writes

Takes a lead magnet offline (status → draft); the public page stops being served. Reversible via publish_lead_magnet. Returns the updated card.

leadMagnetId: string

delete_lead_magnet

Irreversible

Deletes a lead magnet (IRREVERSIBLE, hard delete); a published page disappears. Prefer unpublish_lead_magnet to just take it offline. No-op if missing (deleted:false).

leadMagnetId: string

Content planner & assets 15

list_content

Read-only

Lists the coach's planned social content, newest first. Summary cards (channel, format, status, pillar, hook, scheduledAt) without the post body — use get_content for the full text. limit defaults to 20, max 100; offset skips newer items (capped at 1000).

limit?: integer (1–100) offset?: integer (≥ 0)

get_content

Read-only

Returns one content item's full card by id, including the post body.

contentId: string

create_content

Writes

Creates a content item for the coach and returns its full card. channel and format are required; status defaults to draft — pass published to log an already-posted item, or scheduled together with scheduledAtIso (ISO 8601 slot time).

channel: instagram | tiktok | youtube | telegram format: reels | carousel | story | post | short | video | text status?: idea | draft | review | scheduled | published | missed | analyzed | archived pillar?: education | results | behindTheScenes | engagement hook?: string body?: string scheduledAtIso?: datetime (ISO 8601)

update_content

Writes

Updates a content item's fields (channel, format, pillar, hook, body). Pass only the fields to change; omitted fields keep their value. Status and slot are changed by dedicated tools. Returns the updated card.

contentId: string channel?: instagram | tiktok | youtube | telegram format?: reels | carousel | story | post | short | video | text pillar?: education | results | behindTheScenes | engagement hook?: string body?: string

promote_content

Writes

Turns an idea from the idea bank into a draft (status → draft). Allowed only from idea. Returns the updated card.

contentId: string

submit_content_for_review

Writes

Sends a draft for the coach's approval (status → review). Allowed only from draft. Returns the updated card.

contentId: string

return_content_to_draft

Writes

Returns content to draft and clears its slot (status → draft) — use to reject a review, unschedule, or replan a missed slot. Allowed from review, scheduled or missed. Returns the updated card.

contentId: string

schedule_content

Writes

Puts a draft or in-review content item into a calendar slot (status → scheduled). scheduledAtIso is the ISO 8601 slot time. Returns the updated card.

contentId: string scheduledAtIso: datetime (ISO 8601)

publish_content

Writes

Marks a scheduled content item as published (status → published) — use once it has been posted to the channel. Returns the updated card.

contentId: string

archive_content

Writes

Moves a content item into the archive (status → archived) — use to shelve an idea or draft you no longer plan to publish. Allowed from any non-terminal status; rejected for already-analyzed or archived items. Returns the updated card.

contentId: string

delete_content

Irreversible

Deletes a content item (IRREVERSIBLE, hard delete). Prefer archive_content to keep a record. No-op if missing (deleted:false).

contentId: string

list_content_assets

Read-only

Lists the coach's content library assets (video or image), newest first: title, tags and media metadata (video is null until a file is uploaded in the app; image carries the Storage url). limit defaults to 20, max 100; offset skips newer entries (capped at 1000).

limit?: integer (1–100) offset?: integer (≥ 0)

get_content_asset

Read-only

Returns one content library asset by id.

assetId: string

create_content_asset

Writes

Creates a VIDEO content library asset record (title, description, tags); the video file itself is uploaded in the app afterwards. Image assets cannot be created via MCP — an image requires the file at creation, which only the app can attach. Returns the created asset.

title: string type: value description?: string tags?: string[]

delete_content_asset

Irreversible

Deletes a content library asset record (the uploaded media file is intentionally kept in storage). No-op if missing (deleted:false).

assetId: string

Documents 10

list_documents

Read-only

Lists the coach's documents (newest first) as summaries without content — fetch full text with get_document. folderId filters by folder. limit defaults to 50, max 100; offset for pagination (capped at 1000); truncated=true if more exist.

folderId?: string limit?: integer (1–100) offset?: integer (≥ 0)

get_document

Read-only

Returns one document by id with full Markdown content.

documentId: string

search_documents

Read-only

Semantic (meaning-based) search over the coach's Markdown documents. Returns up to limit most relevant summaries without content — fetch full text with get_document. limit defaults to 5, max 20.

query: string limit?: integer (1–20)

create_document

Writes

Creates a Markdown document (note/plan). folderId must reference an existing folder. Indexed for semantic search (search_documents). Returns the created document.

title: string content: string folderId?: string tags?: string[]

update_document

Writes

Updates a document. Pass only the fields to change (omitted fields keep their value). folderId: a folder id to move, null to remove from its folder. Re-indexed for search when title/content change. Returns the updated document.

documentId: string title?: string content?: string folderId?: string tags?: string[]

delete_document

Irreversible

Deletes a document (IRREVERSIBLE, hard delete, no cascade). No-op if missing (deleted:false).

documentId: string

list_document_folders

Read-only

Lists the coach's document folders as a flat list (sorted by title); parentId links nested folders. Use a folder's id with list_documents folderId or update_document to move documents. limit defaults to 20, max 100; offset for pagination (capped at 1000) — with many folders a parentId may point outside the current page, so page through to rebuild the full tree.

limit?: integer (1–100) offset?: integer (≥ 0)

create_document_folder

Writes

Creates a document folder; parentId nests it under an existing folder. Returns the created folder.

title: string parentId?: string

update_document_folder

Writes

Updates a document folder. Pass only the fields to change: title renames; parentId moves under another folder, null moves to the root. Returns the updated folder.

folderId: string title?: string parentId?: string

delete_document_folder

Irreversible

Deletes a document folder. Documents inside are NOT deleted — they move to the root. No-op if missing (deleted:false).

folderId: string

Profile & team 10

get_my_profile

Read-only

Returns the coach's own profile: display name, language, time zone, country, plus the public handle and profile URL that funnel and lead magnet links are built from (handle is null until one is assigned).

update_my_profile

Writes

Updates the coach's own profile. Pass only the fields to change: displayName (shown to clients), language (UI locale: en or ru), timeZone (IANA, e.g. Europe/Belgrade), country (ISO code), brandColor (accent hex #RRGGBB used by generated content). Email, password, photo and the public handle can only be changed in the app. Returns the updated profile.

displayName?: string language?: en | ru timeZone?: string country?: string brandColor?: string

list_teams

Read-only

Lists teams the coach belongs to (own and joined), by title. isOwner marks teams the coach owns. limit defaults to 20, max 100; offset for pagination (capped at 1000).

limit?: integer (1–100) offset?: integer (≥ 0)

get_team

Read-only

Returns one team with its members (memberId, name, email, role owner/admin/member, status pending/active).

teamId: string

create_team

Writes

Creates a team owned by the coach. Returns the team card (the owner is the first member).

title: string description?: string

update_team

Writes

Updates a team's title/description (owner only). Pass only the fields to change. Returns the updated team card.

teamId: string title?: string description?: string

delete_team

Irreversible

Deletes a team with its member records (IRREVERSIBLE, owner only). Members' own accounts are not affected. No-op if missing (deleted:false).

teamId: string

create_team_member

Writes

Invites a person into the team by email and SENDS an invitation email. Returns the member id, the invitation link to share and the updated team card.

teamId: string email: string displayName: string

update_team_member

Writes

Updates a team member's displayName and/or role (admin/member; ownership is not transferable). Returns the updated team card.

teamId: string memberId: string displayName?: string role?: admin | member

delete_team_member

Irreversible

Removes a member from the team (their account is not affected). No-op if already gone (deleted:false). Returns {deleted, team}.

teamId: string memberId: string