zooza-dev avatar

Zooza MCP Server

zooza-dev/zooza-mcp-server

Connects Claude to Zooza's class scheduling and attendance platform, built for activity businesses like dance schools, language academies, and sports clubs. Exposes 19 tools covering schedule previews, class creation, attendance tracking, booking management, and term planning. Uses streamable HTTP at mcp.zooza.app with OAuth authentication scoped to your existing Zooza account permissions. Every write operation requires explicit confirmation before committing changes. Includes multilingual terminology negotiation so Claude adapts to your studio's vocabulary, whether you call them kurzy, Kurse, or programmes. Useful if you run a studio or franchise network and want to take attendance, build term schedules, or query bookings through natural language instead of clicking through the dashboard. Works with Claude Desktop, Claude Code, and ChatGPT via OpenAI Actions.

GitHub stars
6
tools
18
transport
HTTP
last updated
Jun 10, 2026

Install

From registry metadata
$ npx add-mcp https://mcp.zooza.app/mcp --name zooza

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http zooza https://mcp.zooza.app/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 18 tools

Verified live against the running server on Nov 6, 2026.

get_terminologySearch the Zooza domain glossary. Returns canonical term names, definitions, cross-language synonyms, disambiguation rules, and AI guidance notes. No Zooza API call is made — purely local lookup against the compiled glossary. Use this to resolve ambiguous user input before cal...3 params

Search the Zooza domain glossary. Returns canonical term names, definitions, cross-language synonyms, disambiguation rules, and AI guidance notes. No Zooza API call is made — purely local lookup against the compiled glossary. Use this to resolve ambiguous user input before cal...

Parameters* required
categorystring
Filter by glossary category.one of product-hierarchy · programme-types · bookings · attendance · payments · clients
languagestring
Restrict intent_keyword matching to this language. Also highlights translations for the given language in the response.one of en · sk · cz · de · pl · ro
querystring
Term, synonym, or keyword to look up. Matched against canonical_en, synonyms, deprecated terms, and intent_keywords (all languages). Case-insensitive substring match.
whoamiReturns the connected user's identity, the companies they can operate on, regional context, and the session's token state. Call ONCE at the start of every conversation. How to interpret the response: - 'status: "ok"' — authenticated, at least one company available. Pick a 'com...

Returns the connected user's identity, the companies they can operate on, regional context, and the session's token state. Call ONCE at the start of every conversation. How to interpret the response: - 'status: "ok"' — authenticated, at least one company available. Pick a 'com...

No parameters. Call it with no arguments.

classes_find_coursesSearch the company's courses by name (substring match) and optionally by registration_type. Returns a slim list of matches — `{id, name, registration_type, target_audience, price, schedules_count, ...}` — enough to disambiguate, not enough to act. Use this whenever the user na...6 params

Search the company's courses by name (substring match) and optionally by registration_type. Returns a slim list of matches — `{id, name, registration_type, target_audience, price, schedules_count, ...}` — enough to disambiguate, not enough to act. Use this whenever the user na...

Parameters* required
company_idinteger
Zooza company id to operate against. Optional: if the user has exactly one company, the server defaults to it — you can omit this field. With multiple companies, you MUST specify which; get the id...
include_archivedboolean
Default false → archived programmes are excluded. Set true to also include archived (retired) programmes.
namestring
Substring match on the programme (course) name, e.g. "Ballet". Matches any programme whose name contains this text.
pageinteger
0-based page index (default 0).
page_sizeinteger
Number of results per page (max 200).
registration_typestring
Registration model. 'single' = drop-in / per-session booking (customer books one event at a time). 'full2' = full-course enrollment (customer signs up for the entire course at once). 'open' = open-...one of single · full2 · open
classes_find_resourceResolve a NAME the operator said into an id, for four kinds of company-level records. Pick `kind`: - `place` — venues. Returns `{id, name, city, street, rooms: [{id, name, capacity}]}`. Rooms are inlined because picking a venue is usually followed by picking a room. Filters: n...9 params

Resolve a NAME the operator said into an id, for four kinds of company-level records. Pick `kind`: - `place` — venues. Returns `{id, name, city, street, rooms: [{id, name, capacity}]}`. Rooms are inlined because picking a venue is usually followed by picking a room. Filters: n...

Parameters* required
citystring
kind=place only.
company_idinteger
Zooza company id to operate against. Optional: if the user has exactly one company, the server defaults to it — you can omit this field. With multiple companies, you MUST specify which; get the id...
course_idinteger
kind=trainer only — narrow to trainers associated with this programme.
include_inactiveboolean
kind=trainer or billing_period. Default false — include former staff / deactivated periods.
kind*string
Which kind of record to resolve. 'place' = venue, 'billing_period' = term block, 'trainer' = team member, 'trainer_rate_type' = named pay rate.one of place · billing_period · trainer · trainer_rate_type
namestring
Substring match on the record's name. Applies to every kind.
pageinteger
kind=place or trainer. Default 0.
page_sizeinteger
kind=place or trainer. Default 25, max 200. billing_period and trainer_rate_type are small bounded sets and are returned in full.
place_idinteger
kind=trainer only — narrow to trainers associated with this venue.
classes_find_classesSearch this company's CLASSES — the scheduled groups inside a programme (a "class" / "group" / "skupina"; internally a *schedule*) — by name (substring) and resolve them to a `schedule_id`. Reach for this whenever the user names a specific group rather than a whole programme (...16 params

Search this company's CLASSES — the scheduled groups inside a programme (a "class" / "group" / "skupina"; internally a *schedule*) — by name (substring) and resolve them to a `schedule_id`. Reach for this whenever the user names a specific group rather than a whole programme (...

Parameters* required
active_onlyboolean
Set true to exclude classes whose schedule has already ENDED (keeps not-yet-started and in-progress classes). Omit to include ended classes too.
billing_period_idvalue
Only classes in this billing period (term block) — or these. Resolve via classes_find_resource kind:'billing_period'.
company_idinteger
Zooza company id to operate against. Optional: if the user has exactly one company, the server defaults to it — you can omit this field. With multiple companies, you MUST specify which; get the id...
course_idinteger
Only classes inside this programme. Resolve the course_id first with classes_find_courses; never guess it.
dayinteger
Day-of-week the class falls on (its start day): 1=Sunday, 2=Monday, … 7=Saturday (MySQL DAYOFWEEK convention).
in_trialboolean
Set true to return only classes that currently have a TRIAL enabled (the schedule in_trial flag). Omit to include all classes regardless of trial.
include_archivedboolean
Default false → returns active + paused (inactive) classes. Set true to search ARCHIVED (retired) classes instead.
lead_onlyboolean
Set true to return only LEAD-COLLECTION schedules (schedule_type='lead_collection' — the lead pipelines that bookings_add_lead attaches leads to). Every row also carries schedule_type, so you can t...
namestring
Substring match on the class (schedule) name, e.g. "Nejaké". Case- and accent-insensitive (DB collation utf8mb4_unicode_ci) — "nejake" matches "Nejaké", so you need not reproduce diacritics.
pageinteger
0-based page index (default 0).
page_sizeinteger
Number of results per page (max 200).
place_idinteger
Only classes at this venue. Resolve with classes_find_resource (kind:'place').
registration_typestring
Filter by the parent course's registration model: 'single' = drop-in / per-session, 'full2' = full-course enrollment, 'open' = open-ended / membership.one of single · full2 · open
sortstring
Result ordering. created_desc = newest class first (the default), created_asc = oldest first, date_asc/date_desc by schedule start date, name_asc alphabetical, registrations_desc most-enrolled firs...one of created_desc · created_asc · date_asc · date_desc · name_asc · registrations_desc
trainer_idinteger
Only classes this trainer is assigned to. Resolve with classes_find_resource (kind:'trainer').
with_sessionsboolean
Set true to return only classes that HAVE at least one session (schedule total_events > 0). Use this for "classes that actually have sessions" instead of scanning sessions_find_events.
bookings_findFind this company's bookings — a client's enrolment in a class (registration; "prihláška"/"Buchung") — and resolve them to a `registration_id`, or a client to a `user_id`. Use for "is X enrolled?", "who's in this class?", "who hasn't paid?" (set `payment_status:["unpaid","part...18 params

Find this company's bookings — a client's enrolment in a class (registration; "prihláška"/"Buchung") — and resolve them to a `registration_id`, or a client to a `user_id`. Use for "is X enrolled?", "who's in this class?", "who hasn't paid?" (set `payment_status:["unpaid","part...

Parameters* required
billing_period_idinteger
Bookings in this billing period (term/season). Resolve via classes_find_resource (kind:'billing_period'); one period per call.
company_idinteger
Zooza company id to operate against. Optional: if the user has exactly one company, the server defaults to it — you can omit this field. With multiple companies, you MUST specify which; get the id...
course_idinteger
Bookings in this programme. Resolve the id with classes_find_courses; never guess it.
created_fromstring
Only bookings CREATED on/after this date (YYYY-MM-DD, inclusive). The "new registrations" lever — e.g. created_from=<Monday> for this week's sign-ups. You supply the literal date; the api does no r...
created_tostring
Only bookings CREATED on/before this date (YYYY-MM-DD, inclusive). Pair with created_from for a window.
distinctboolean
true → one row per CLIENT (deduped by account-holder user_id), person fields only — use to find a person or resolve a name to a single user_id. Default false → one row per booking.
inactive_onlyboolean
true → ONLY clients marked inactive (former clients). Default already includes them; never set it to widen.
include_extra_fieldsboolean
true → each booking gets `extra_fields: [{field, label, value}]`: filled custom booking-form answers, labelled per programme. Not with `distinct`.
namestring
Enrolled person's name (substring, accent-insensitive). Blank for a kids' class? Try `search` (matches the parent too).
pageinteger
0-based page index (default 0).
page_sizeinteger
Number of results per page (max 200).
payment_statusarray
Payment state — the "who hasn't paid" lever, e.g. ["unpaid","partially_paid"].
place_idinteger
Bookings at this venue. Resolve via classes_find_resource (kind:'place').
registration_idinteger
ONE exact booking by id, whatever its status (unlike `search`, which substring-matches: 45 also hits 145).
schedule_idinteger
Bookings in this class (schedule). Resolve the id with classes_find_classes; never guess it.
searchstring
Broad freetext: matches the enrolled person's or account holder's name, email, phone, or id (substring, accent-insensitive). Best for a loose term. Use `name` instead to match only the enrolled per...
statusarray
Enrolment statuses to include (piped to the api). Omit → confirmed enrolments only (registered, late, trial_*); guest, waitlist, canceled and deleted are excluded — pass them to widen. `auto_unenro...
user_idinteger
All bookings of one client, by their user id.
sessions_find_eventsList **events** (scheduled sessions of classes) in the caller's company. Use this whenever you need to resolve an `event_id` from natural language ("my next class," "Monday's ballet," "all swim sessions this week," "Sarah's classes tomorrow") before chaining into another tool...17 params

List **events** (scheduled sessions of classes) in the caller's company. Use this whenever you need to resolve an `event_id` from natural language ("my next class," "Monday's ballet," "all swim sessions this week," "Sarah's classes tomorrow") before chaining into another tool...

Parameters* required
billing_period_idvalue
Restrict to sessions in one or more billing periods (term blocks). Resolve: classes_find_resource kind:billing_period.
company_idinteger
Zooza company id to operate against. Optional: if the user has exactly one company, the server defaults to it — you can omit this field. With multiple companies, you MUST specify which; get the id...
course_idvalue
Restrict to sessions of one or more programmes (courses). Resolve with classes_find_courses.
datestring
YYYY-MM-DD, exact-day match.
fromstring
YYYY-MM-DD, inclusive lower bound on event date. To see PAST sessions, set this (e.g. from a schedule's start) — there is no `past` flag; past + future is simply an unbounded-below range.
idsarray
Specific event (session) ids to fetch. Bypasses the upcoming/scheduled defaults so the requested rows come back as-is.
pageinteger
0-based page index (default 0).
page_sizeinteger
Number of results per page (max 200).
place_idvalue
Restrict to sessions at one or more venues (places). Resolve: classes_find_resource kind:place.
room_idvalue
Restrict to sessions held in one or more specific rooms within a venue.
schedule_idinteger
Restrict to sessions belonging to one class. Resolve with classes_find_classes.
segment_idarray
Schedule-segment id(s). Pass [0] to match events with NO segment assignment (sentinel).
sortstring
Result ordering. date_asc/date_desc sort by session date; event_no_asc/event_no_desc by event number; created_asc/created_desc by record creation time. Default date_asc.one of date_asc · date_desc · event_no_asc · event_no_desc · created_asc · created_desc
statusstring
Event lifecycle status. Default "scheduled" (matches dashboard; attendance can only be tracked on scheduled events). "unplanned" covers cancelled events. "any" expands to (scheduled, unplanned).one of scheduled · unplanned · finished · any
tostring
YYYY-MM-DD, inclusive upper bound on event date.
trainer_idvalue
Restrict to sessions an instructor is connected to (one or more). Resolve: classes_find_resource kind:trainer. See the trainer filter note above — this matches across five trainer relationships.
typestring
Event-shape filter. "cancelled" surfaces events explicitly cancelled (server-side maps to status=unplanned). Other values target dashboard cases: oversold, undersold, ad-hoc replacements, etc.one of over_capacity · under_capacity · custom_replacement · rescheduled · substituted · cancelled
sessions_get_attendanceRead who's enrolled in **one event** (a single session of a class) and their current attendance, so you can show the list and then mark it. Pass an `event_id`; the tool returns each enrolled attendee, their current attendance value (if already marked), and per-row context the...2 params

Read who's enrolled in **one event** (a single session of a class) and their current attendance, so you can show the list and then mark it. Pass an `event_id`; the tool returns each enrolled attendee, their current attendance value (if already marked), and per-row context the...

Parameters* required
company_idinteger
Zooza company id to operate against. Optional: if the user has exactly one company, the server defaults to it — you can omit this field. With multiple companies, you MUST specify which; get the id...
event_id*integer
Target event id (one session of a class). Required.
sessions_mark_attendanceRecord per-attendee attendance for **one event** (a single session of a class — e.g. "Monday Ballet on 2026-06-03 at 09:00"). Pass an `event_id` and a list of attendees, each with their own attendance value (`attended`, `noshow`, `canceled`, `going`, `ignore`). Each value is s...3 params

Record per-attendee attendance for **one event** (a single session of a class — e.g. "Monday Ballet on 2026-06-03 at 09:00"). Pass an `event_id` and a list of attendees, each with their own attendance value (`attended`, `noshow`, `canceled`, `going`, `ignore`). Each value is s...

Parameters* required
attendees*array
Per-attendee marks. At least one item required. Each item targets ONE attendee on the event by registration_id; the attendance value is set per attendee, not on the event as a whole.
company_idinteger
Zooza company id to operate against. Optional: if the user has exactly one company, the server defaults to it — you can omit this field. With multiple companies, you MUST specify which; get the id...
event_id*integer
Target event id (one session of a class). Required.
classes_updateEdit one or more existing classes (a "class"/"timetable" is the recurring group within a programme) — name, price, registration fee, capacity, make-up/replacement extra capacity ("počet miest navyše pre náhradné hodiny" → extra_capacity/extra_capacity_usage, NOT registrations_...7 params

Edit one or more existing classes (a "class"/"timetable" is the recurring group within a programme) — name, price, registration fee, capacity, make-up/replacement extra capacity ("počet miest navyše pre náhradné hodiny" → extra_capacity/extra_capacity_usage, NOT registrations_...

Parameters* required
changesobject
Required on the FIRST call. The fields to change — at least one.
company_idinteger
Zooza company id to operate against. Optional: if the user has exactly one company, the server defaults to it — you can omit this field. With multiple companies, you MUST specify which; get the id...
confirm_course_changeboolean
REQUIRED true to change changes.course_id — reprogramming a class rewrites ALL its sessions AND all registrations (irreversible). Only set after the operator explicitly asked to move the class to a...
confirmedboolean
Required (true) on the apply call, alongside `token`. Asserts that you have SHOWN the user the preview from the first call and they approved it — not that you believe the change is correct. If the...
schedule_idsarray
Required on the FIRST call. One or many class (schedule) ids. Resolve by name with classes_find_classes.
session_scopestring
REQUIRED when changing instructor/venue/duration. 'upcoming' = the class + its future sessions (usual); 'all' = every session; 'class_only' = re-advertise the class only, existing sessions keep the...one of class_only · upcoming · all
tokenstring
Omit on the FIRST call — that call previews the change and returns a token. Pass the token back on the SECOND call to apply the previewed change. Single-use, expires in 15 minutes; if it is expired...
sessions_updateEdit specific individual sessions (events) of a class, OR add new sessions to a class. Two modes, one tool. NOT for a change that holds from a date onward or for every session ("from next week Jana teaches the Monday class", "the class moves to Room B") — that is ONE classes_u...8 params

Edit specific individual sessions (events) of a class, OR add new sessions to a class. Two modes, one tool. NOT for a change that holds from a date onward or for every session ("from next week Jana teaches the Monday class", "the class moves to Room B") — that is ONE classes_u...

Parameters* required
changesobject
EDIT-MODE. The edits to apply to `event_ids`.
company_idinteger
Zooza company id to operate against. Optional: if the user has exactly one company, the server defaults to it — you can omit this field. With multiple companies, you MUST specify which; get the id...
confirmedboolean
Required (true) on the apply call, alongside `token`. Asserts that you have SHOWN the user the preview from the first call and they approved it — not that you believe the change is correct. If the...
event_idsarray
EDIT-MODE. Session ids to change, with `changes`; resolve via sessions_find_events. Not with schedule_id/sessions.
notifyboolean
Default false. true emails enrolled clients — confirm with the operator first. Set on the FIRST call (frozen into the plan).
schedule_idinteger
ADD-MODE. Class to append NEW sessions to; pair with `sessions`. Resolve with classes_find_classes. Not with event_ids/changes.
sessionsarray
ADD-MODE. New sessions on `schedule_id`; each needs a date, time/duration default from the class. "One more at the end": the date after the last session (sessions_find_events).
tokenstring
Omit on the FIRST call — that call previews the change and returns a token. Pass the token back on the SECOND call to apply the previewed change. Single-use, expires in 15 minutes; if it is expired...
sessions_cancelCancel one or more scheduled SESSIONS of a class so they do not take place — "cancel Tuesday's sessions", "the pool is closed on Friday", "Martina is ill all week, cancel her classes". A cancelled session stays visible in Zooza with a cancelled status; it is NOT deleted. Scope...17 params

Cancel one or more scheduled SESSIONS of a class so they do not take place — "cancel Tuesday's sessions", "the pool is closed on Friday", "Martina is ill all week, cancel her classes". A cancelled session stays visible in Zooza with a cancelled status; it is NOT deleted. Scope...

Parameters* required
company_idinteger
Zooza company id to operate against. Optional: if the user has exactly one company, the server defaults to it — you can omit this field. With multiple companies, you MUST specify which; get the id...
confirmedboolean
Required (true) on the apply call, alongside `token`. Asserts that you have SHOWN the user the preview from the first call and they approved it — not that you believe the change is correct. If the...
datestring
SCOPE. One whole day, YYYY-MM-DD, company-wide unless place_id narrows it.
event_idsarray
SCOPE. Exact sessions, at most 7 days apart. Resolve with sessions_find_events. The only scope that may cross classes and instructors.
fromstring
Inclusive range start, YYYY-MM-DD. Only with trainer_id or schedule_id.
include_pastboolean
Default false — past sessions are skipped and reported.
notifyboolean
Default false. Set it on the FIRST call; it is frozen into the plan.
place_idinteger
SCOPE. ONE venue, with date. Resolve with classes_find_resource kind:'place'.
public_reasonstring
Client-facing email text. Required when notify is true.
reasonstring
REQUIRED. Internal, staff-only; Zooza cannot clear it later. The operator's stated reason — ask, never invent.
replacement_datestring
Make-up session date, "YYYY-MM-DD HH:MM:SS" — time defaults to the cancelled session's own. One session in scope only.
replacement_place_idinteger
Make-up venue. Defaults to the cancelled session's.
replacement_room_idinteger
Make-up room; needs replacement_place_id. 0 = no room.
schedule_idinteger
SCOPE. ONE class, with from/to. Resolve with classes_find_classes.
tostring
Inclusive range end, YYYY-MM-DD.
tokenstring
Omit on the FIRST call — that call previews the change and returns a token. Pass the token back on the SECOND call to apply the previewed change. Single-use, expires in 15 minutes; if it is expired...
trainer_idinteger
SCOPE. ONE instructor, with from/to. Resolve with classes_find_resource kind:'trainer'.
bookings_copy_bookingCopy or move a client's existing booking into a different class. COPY creates a second booking and leaves the original in place — use it when the client is continuing into a new term or adding a class alongside their current one. MOVE relocates the booking itself, carrying its...11 params

Copy or move a client's existing booking into a different class. COPY creates a second booking and leaves the original in place — use it when the client is continuing into a new term or adding a class alongside their current one. MOVE relocates the booking itself, carrying its...

Parameters* required
actionstring
Required on the FIRST call. See the tool description for which to pick.one of copy · move
company_idinteger
Zooza company id to operate against. Optional: if the user has exactly one company, the server defaults to it — you can omit this field. With multiple companies, you MUST specify which; get the id...
confirmedboolean
Required (true) on the apply call, alongside `token`. Asserts that you have SHOWN the user the preview from the first call and they approved it — not that you believe the change is correct. If the...
paymentsstring
Required on the FIRST call — NO default, ask the operator. from_target_class = price it by the target class. do_not_change = on copy, no payments on the new booking; on move, leave existing payment...one of from_target_class · do_not_change
registration_idinteger
Required on the FIRST call. The existing booking. Resolve with bookings_find.
send_confirmationboolean
Default false. true emails the client — confirm intent with the operator first.
startstring
Enrolment start, YYYY-MM-DD. Default today. Affects price and session count.
statusstring
Omit to use what Zooza computes for the target class (usual choice).one of registered · waitlist · late · trial_started · trial_not_started
target_event_idinteger
One-off (single-session) programmes only. Resolve with sessions_find_events.
target_schedule_idinteger
Required on the FIRST call. The class it goes into. Resolve with classes_find_classes.
tokenstring
Omit on the FIRST call — that call previews the change and returns a token. Pass the token back on the SECOND call to apply the previewed change. Single-use, expires in 15 minutes; if it is expired...
comms_send_messageEmail clients of this company. Describe the audience (a course/programme, a class schedule, a specific booking, one client, a saved segment, an ad-hoc cohort, or course-level labels) and the content (an existing template `type` from comms_list_templates, or a custom subject +...10 params

Email clients of this company. Describe the audience (a course/programme, a class schedule, a specific booking, one client, a saved segment, an ad-hoc cohort, or course-level labels) and the content (an existing template `type` from comms_list_templates, or a custom subject +...

Parameters* required
audienceobject
Who receives the message. At least one targeting field is required.
bccstring
Comma-separated BCC addresses.
channelstring
Only 'email' is implemented. WhatsApp is specced and coming — do not promise it yet.one of email
company_idinteger
Zooza company id to operate against. Optional: if the user has exactly one company, the server defaults to it — you can omit this field. With multiple companies, you MUST specify which; get the id...
confirm_large_sendboolean
Different from `confirmed`. Set true ONLY on the follow-up call after a send came back requires_second_confirmation: true AND the operator explicitly approved the recipient COUNT. Never set it on t...
confirmedboolean
Required (true) on the apply call, alongside `token`. Asserts that you have SHOWN the user the preview from the first call and they approved it — not that you believe the change is correct. If the...
contentobject
EITHER template_type OR subject+body — not both.
marketingboolean
REQUIRED on the FIRST call. true = promotional content (consent rules apply; say so to the operator). false = operational (schedule changes, payment reminders, session info).
schedule_atobject
Omit to send immediately on commit.
tokenstring
Omit on the FIRST call — that call previews the change and returns a token. Pass the token back on the SECOND call to apply the previewed change. Single-use, expires in 15 minutes; if it is expired...
reports_get_dataReturn the REAL, pre-aggregated numbers for ONE business question about an activity brand — and the basis for SHOWING it. This is how you show an operator a report / dashboard / chart of their business numbers (occupancy, unpaid, churn, attendance, trials, retention, revenue,...4 params

Return the REAL, pre-aggregated numbers for ONE business question about an activity brand — and the basis for SHOWING it. This is how you show an operator a report / dashboard / chart of their business numbers (occupancy, unpaid, churn, attendance, trials, retention, revenue,...

Parameters* required
company_idinteger
Resolved from the session when omitted.
fromstring
First month YYYY-MM-01. Both from+to or neither (default: last 6 months).
tostring
Last month YYYY-MM-01.
viewstring
Question to pull data for. One of: occupancy, unpaid, churn, attendance, trials, retention, clients_by_location, replacements, summary. Default "summary".
get_skillReturns the full markdown playbook for one of the registered skills. Call this BEFORE starting a flow named in the server's instructions — the playbook contains the interview steps, mapping rules, and confirmation pattern for that scenario. Available skills: business-model-val...1 params

Returns the full markdown playbook for one of the registered skills. Call this BEFORE starting a flow named in the server's instructions — the playbook contains the interview steps, mapping rules, and confirmation pattern for that scenario. Available skills: business-model-val...

Parameters* required
name*string
Exact skill name from the available list.
get_tool_schemaReturns the description and exact input schema of a Zooza tool, including tools not in your tool list (call_tool lists them). Call it once per tool before that tool's first call_tool.1 params

Returns the description and exact input schema of a Zooza tool, including tools not in your tool list (call_tool lists them). Call it once per tool before that tool's first call_tool.

Parameters* required
name*string
Tool name, e.g. "todos_add".
call_toolRuns a Zooza tool by name. Use it for every Zooza tool that is NOT in your tool list — these exist and work; never send the user to another app because a Zooza tool isn't listed. Call get_tool_schema(name) first for the arguments. Write tools behave exactly as when called dire...2 params

Runs a Zooza tool by name. Use it for every Zooza tool that is NOT in your tool list — these exist and work; never send the user to another app because a Zooza tool isn't listed. Call get_tool_schema(name) first for the arguments. Write tools behave exactly as when called dire...

Parameters* required
argumentsobject
The tool's arguments, shaped as its get_tool_schema input_schema. Omit when it takes none.
name*string
Tool name, e.g. "todos_add".

Sponsors

Readme

Zooza

Zooza MCP Server — AI-Powered Class Management for Activity Businesses

An open-source Model Context Protocol (MCP) server that connects Claude, ChatGPT, and other AI assistants directly to your Zooza account.
Natural language scheduling, attendance tracking, lead follow-up, and class management — no dashboard required.

Model Context Protocol server Open source — MIT License Official Zooza integration Live MCP endpoint


View the full README on GitHub

Details

Repository
github.com/zooza-dev/zooza-mcp-server
Transport
HTTP
Registry
MCP registry, active
Tools verified
Nov 6, 2026