kicksite-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@kicksite-mcplist active students"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
kicksite-mcp
First MCP (Model Context Protocol) server for the Kicksite martial-arts-school management API. Read and write students, prospects, memberships, recurring billings, invoices, class sessions, attendance, belt promotions, communications, and notes — all in plain 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 the trial-to-active funnel, schedule classes, take attendance, promote belt ranks, and bill via EFT or credit-card autopay. Public REST API since the mid-2010s — but no one had wrapped it for MCP clients until now.
Related MCP server: evo-mcp
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)
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_mcpThe MCP server runs over stdio. Wire it into Claude Desktop, Cursor, or any MCP 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 |
| Verify credentials work, return the authenticated school profile |
| List, fetch, or free-text-search students |
| Create students directly or change status (Active / Frozen / Inactive) |
| List, fetch, or search prospects (leads in the trial funnel) |
| Add a new lead to the trial funnel |
| List a student's memberships or fetch one by id |
| List EFT / credit-card autopay plans (filter by student) |
| List one-time charges (filter by student or date range) |
| List class definitions (the recurring class schedule) |
| List scheduled class sessions in a date range |
| View and write attendance records |
| View and write rank history (martial-arts-specific) |
| List program definitions (Little Dragons, Adult Karate, BJJ, etc.) |
| List school branch locations |
| List school staff (instructors, admins, front-desk) |
| View and log email / SMS communications |
| 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 in
engineering-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 buffer before expiry,
asyncio.Lockto serialize concurrent refreshes, and forced 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, honoring the
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-page until the server returns a short page.isError-compliance per the Blackwell MCP security audit — every tool raises 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 record per call withts,tool,args(secrets redacted),result_size,is_error,error_type,duration_ms,request_id. Sink defaults to stderr; override withKICKSITE_AUDIT_LOG=/path/to/audit.jsonl. Fail-open semantics — 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]"
pytestCode 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 live API callspre-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 testsDistribution
89.8K-star
awesome-mcp-serversPR (pending)mcp.so+Glamaauto-index via GitHub topicsDirect 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) and
paid-skills / skill-sandbox / mcp-skills-pack (Skills monetization and
sandbox runtime).
This server cannot be deployed
Maintenance
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
MCP server for Zooza — class scheduling, attendance, and booking for activity businesses.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for Mindbody, enabling AI agents to fetch client info, query class schedules, book classes/appointments (env-gated), and process checkout (payment-gated).5MIT
- FlicenseBqualityDmaintenanceMCP server for integrating with the EVO gym management API, enabling access control, member management, activity scheduling, sales, and workout management through natural language.12-
- AlicenseNot gradedqualityCmaintenanceMCP server for the FieldRoutes pest-control / lawn-care operations platform — talk to your data from Claude, Cursor, or any MCP client.MIT
- AlicenseAqualityCmaintenanceMCP server for CourtReserve racquet-sports club management, enabling AI clients to manage members, reservations, events, and transactions via natural language.29MIT