Practice Pickleball
Find pickleball drills and generate personalized drill sessions based on your level and goals
Hosted MCP Server
npx add-mcp 'https://practicepickleball.app/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
Practice Pickleball API
Give players a ready-to-use practice session or help them find a drill. The API uses the same catalog, generator and session-building approach as this website.
Download the OpenAPI 3.1 specification. No API key is required. Use the REST endpoints below or the stateless MCP endpoint at https://practicepickleball.app/mcp for compatible AI tools. Both call the same services.
Automated discovery is available through the API catalog, with links to this documentation and the specification. The API has two operations described below.
Adding a planner or session preview to a club website or article? Use the free embed configurator and integration instructions for interactive, HTML, and responsive image exports.
MCP for AI tools
Connect a server-side MCP client using Streamable HTTP at /mcp. Tool discovery exposes generate_practice_session and find_drills, with input and output schemas. Their arguments follow the settings documented below; MCP search takes focus_skills as an array of IDs rather than a comma-separated query string.
Clients that support MCP prompts can discover two conversation starters: plan_practice (plan a session) and explore_drills (find drills). Both take no arguments and guide the assistant to use your existing preferences, ask for relevant missing details, and call the tools above. Retrieving a prompt returns text; it does not run a tool or generate a session. Prompt availability and presentation depend on your client.
Successful tool results contain the same data as REST in structuredContent, with a JSON text fallback. Domain failures are tool results with isError: true; protocol errors use JSON-RPC errors. HTTP safety limits can return 4xx or 503 before tool execution. The endpoint stores no client sessions and needs no login. Connecting or enabling it in an AI application is a separate, explicit step; it is not automatically available in every assistant.
Generate a practice session
POST https://practicepickleball.app/api/v1/sessions/generate with Content-Type: application/json:
{
"skill_level": 3.5,
"number_of_players": 2,
"duration_minutes": 60,
"focus_skills": [
"third-shot-drop",
"reset"
],
"seed": 42
}
The response includes the session title, choices, resolved themes, ordered blocks, exact timings, player roles, setup, instructions and canonical drill links. Scoring rules, when present, are part of the instructions. The returned session_url opens that plan on the website.
- Levels: 2.5, 3.0, 3.5, 4.0, 4.5 or 5 (the site's 5.0+ option).
- One player: 30, 45, 60, 90 or 120 minutes; also supply
solo_environment:court,wallorcourt-wall. Wall includes rebounders. - Two or four players: 30, 45, 60, 90 or 120 minutes. Omit
solo_environment. - Focus: at most one theme for 30 minutes, two for 45 or 60, three for 90 or 120. Omit
focus_skillsor use an empty array for an automatically chosen focus. - Omit
seedfor variety, or supply an integer from 0 to 4294967295 for reproducibility. The response includes the seed and catalog/generator versions.
Arbitrary durations are not supported. Neither are free-text notes, weaknesses, intensity preferences or equipment restrictions. Unsupported choices receive an error, not an approximate or silently relaxed plan.
Prepare → Build → Add Pressure → Play describes the progression. Group core blocks develop skills and add pressure; the closing block is a game. Solo finishers combine pressure and a measurable challenge. Changeovers, water and pack-up are labeled support, not drills. These labels describe block positions, not a promise that every later drill is physically harder.
Find drills
GET https://practicepickleball.app/api/v1/drills?skill_level=3.5&number_of_players=2&focus_skills=reset&limit=5
Optional filters: q (text search), skill_level, number_of_players, focus_skills (comma-separated IDs), solo_environment and format (timed, reps, live-game or overlay). Filters combine with AND. Solo environment matches the library's exact court, wall or anywhere category and requires one player.
Results contain total, offset, limit, has_more and a drills array. Use offset to paginate, with a maximum of 20 results per request. An empty result is valid.
Focus IDs
serve
Serve
return
Return
third-shot-drop
Third-shot drop
third-shot-drive
Third-shot drive
fourth-shot
Fourth shot
footwork
Footwork
dink
Dink
reset
Reset
fast-hands
Fast hands
transition
Transition
anticipation
Anticipation
lob
Lob
overhead
Overhead
speed-up
Speed-up
counter
Counter
volley
Volley
shape
Shape
out-balls
Out balls
communication
Communication
targeting
Targeting
Errors and limits
Errors contain error.code, message, field-level issues, suggestions and a request_id. Invalid settings or an infeasible session return 422. Malformed JSON returns 400; wrong methods return 405; oversized bodies return 413. A temporary service failure returns 503.
Bodies are limited to 8 KiB, query strings to 2048 characters, and body delivery to 10 seconds. Generation allows approximately 10 requests per IP per minute; search allows 60. Limits are enforced per Cloudflare location and are not exact global quotas. A 429 response includes Retry-After: 60. Shared networks and AI-tool egress addresses share these limits.
REST and MCP share the generation and search quotas. MCP additionally allows approximately 60 total requests per IP per minute for discovery, notifications and calls. Its entire JSON-RPC envelope must fit the same 8 KiB body limit. Send one message per POST; batching, persistent sessions and standalone event subscriptions are not supported.
Cross-origin browser access is disabled. CORS is not authentication: server-side clients can access the public API. No request bodies or search queries are deliberately included in application logs; Cloudflare still processes requests and IP addresses for delivery and abuse prevention. See Privacy and Terms of Use. Keep sensitive information out of requests.
Sessions are not saved to a database. Shared links replay the existing generator and may need updating when the catalog or generator changes. Link players back to the returned public URLs for the full courtside experience.