kicksite-mcp
First MCP (Model Context Protocol) server for theKicksite martial-arts-school management API. Read andwrite students, prospects, memberships, recurring billings, invoices, classsessions, attendance, belt promotions, communications, and notes — all inplain English from Claude, Cursor, or any MCP client.
What is Kicksite?
Kicksite is the leading SaaS for US martial-arts schools (taekwondo, karate,jiu-jitsu, MMA, Krav Maga, etc.). Schools use it to manage students, run thetrial-to-active funnel, schedule classes, take attendance, promote beltranks, and bill via EFT or credit-card autopay. Public REST API since themid-2010s — but no one had wrapped it for MCP clients until now.
Quick start
1. Create OAuth credentials in Kicksite
- Log in to your school's Kicksite web UI (
https://{yourschool}.kicksite.net) - Click Quick Links → Settings → Integrations
- Click the Zapier card → Get Started
- Kicksite will show three values — copy all of them:
- Subdomain (the bit before
.kicksite.netin your school URL) - Client ID
- Client Secret (shown only once)
- Subdomain (the bit before
2. Install + run
pip install kicksite-mcp
export KICKSITE_SUBDOMAIN=dragonkarate
export KICKSITE_CLIENT_ID=<your_client_id>
export KICKSITE_CLIENT_SECRET=<your_client_secret>
kicksite_mcp
The MCP server runs over stdio. Wire it into Claude Desktop, Cursor, or anyMCP client:
{
"mcpServers": {
"kicksite": {
"command": "kicksite_mcp",
"env": {
"KICKSITE_SUBDOMAIN": "dragonkarate",
"KICKSITE_CLIENT_ID": "your_client_id",
"KICKSITE_CLIENT_SECRET": "your_client_secret"
}
}
}
}
Tools (25)
| Tool | What it does |
|---|---|
health_check |
Verify credentials work, return the authenticated school profile |
list_students / get_student / search_students |
List, fetch, or free-text-search students |
create_student / update_student_status |
Create students directly or change status (Active / Frozen / Inactive) |
list_prospects / get_prospect / search_prospects |
List, fetch, or search prospects (leads in the trial funnel) |
create_prospect |
Add a new lead to the trial funnel |
list_memberships / get_membership |
List a student's memberships or fetch one by id |
list_recurring_billings |
List EFT / credit-card autopay plans (filter by student) |
list_invoices |
List one-time charges (filter by student or date range) |
list_classes |
List class definitions (the recurring class schedule) |
list_class_sessions |
List scheduled class sessions in a date range |
list_attendance / record_attendance |
View and write attendance records |
list_belt_promotions / create_belt_promotion |
View and write rank history (martial-arts-specific) |
list_programs |
List program definitions (Little Dragons, Adult Karate, BJJ, etc.) |
list_locations |
List school branch locations |
list_staff |
List school staff (instructors, admins, front-desk) |
list_communications / send_communication |
View and log email / SMS communications |
list_notes / create_note |
View and write internal notes |
Real-world queries it unlocks
- "Show me all active trial prospects from the Westside location this month"
- "Find student by phone 555-1234"
- "Who got promoted to black belt in the last 5 years?"
- "List every class session for the Adult Karate program next Tuesday"
- "Record student 1234 as late to class session 4455 with note 'traffic'"
- "Add a follow-up note to prospect 4321 - 'Call tomorrow at 5pm'"
- "List the recurring billings for student 5678 and the autopay date"
- "Find all one-time invoices from last month"
- "Send student 1234 a 'Welcome to the dojo' email"
Architecture
Built on the industry-leading patterns documented inengineering-playbook.md:
- Shared
httpx.AsyncClientwith connection pooling (100 max, 20 keepalive)and transport-level retries (3x) for transient network blips. - OAuth 2 client_credentials with proactive token refresh — 60s bufferbefore expiry,
asyncio.Lockto serialize concurrent refreshes, andforced refresh on a 401 (single retry, then surface the auth error). - Typed exception hierarchy —
KicksiteAuthError,KicksiteNotFoundError,KicksiteRateLimitError,KicksiteAPIError,KicksiteConnectionError—each carrying structured fields (http_status,error_code,request_id,retry_after) so callers can branch on cause, not message text. - Application-level retry with exponential backoff + full jitter, honoringthe
Retry-Afterheader on 429s. 5xx responses are retried up to 3x. - HTTP status dispatch table — one row per status code → exception class.Adding a new status code = one row, no new
if/elifbranches. - Async iterator pagination —
iter_students,iter_prospectsauto-pageuntil the server returns a short page. - isError-compliance per the Blackwell MCP security audit — every toolraises typed exceptions on failure; FastMCP wraps them with
isError=trueon the wire response. The oldreturn _format_error(e)pattern (which leavesisError=false) is NOT used. - JSONL audit logging per tool call (
audit.py) — one structured recordper call withts,tool,args(secrets redacted),result_size,is_error,error_type,duration_ms,request_id. Sink defaults tostderr; override withKICKSITE_AUDIT_LOG=/path/to/audit.jsonl. Fail-opensemantics — sink failure never breaks the tool.
Development
git clone https://github.com/sanjibani/kicksite-mcp
cd kicksite-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest
Code quality
- ruff — full rule set (
E,F,W,I,N,UP,B,A,C4,DTZ,T20,PT,Q,RET,SIM,TID,ARG,PTH,ERA,PL,RUF) - mypy — strict mode, every function annotated, all union types narrowed
- pytest — 50 tests via
respx+hypothesis, async-mode auto, no liveAPI calls - pre-commit — ruff + ruff-format + mypy
ruff check src tests
ruff format --check src tests
mypy src tests
pytest --cov=kicksite_mcp --cov-fail-under=80 tests
Distribution
- 89.8K-star
awesome-mcp-serversPR (pending) mcp.so+Glamaauto-index via GitHub topics- Direct vendor outreach to Kicksite's partner team (cold-email track via
vertical-mcp-distributecron)
License
MIT — see LICENSE.
Related MCPs
Part of the same vertical-MCP portfolio (all MIT, all sanjibani/<name>-mcp):
hawksoft, open-dental, ezyvet, jobber, practicepanther,cox-automotive, qualia, campspot, cleancloud, playmetrics, foreup,storedge, courtreserve, procare, passare, funraise.
Also: mcp-shield (Tier 3 — MCP security sidecar for any untrusted MCP) andpaid-skills / skill-sandbox / mcp-skills-pack (Skills monetization andsandbox runtime).