{"name":"Booksy Admin MCP Server","version":"0.1.0","description":"Hybrid Booksy MCP: customer API for read (services/staff/availability) + biz API for write (booking/cancel/reschedule). Bypasses prepayment validation by booking from owner account.","endpoints":{"mcp":"/mcp","elevenlabs":{"personalization_webhook":"POST /api/elevenlabs/personalization - pre-call webhook dla ElevenLabs Conversational AI. Body: { caller_id, agent_id, called_number?, call_sid? }. Auth: header 'x-mcp-secret: <MCP_SECRET>' lub '<MCP_SECRET_LEGACY>' (ten sam handshake co /mcp endpoint, akceptowane oba podczas okna rotacji). Zwraca 200 z conversation_initiation_client_data + 15 dynamic_variables: identyfikacja (customer_known, customer_name, customer_first_name, customer_id, salon_name) + nadchodzaca wizyta (upcoming_appointment_count/_summary/_date/_time) + historia wizyt (past_visit_count, last_visit_date, last_visit_service, last_visit_staff, past_visits_summary) + is_returning_customer. Dla nieznanych klientow zwraca te same pola z domyslnymi wartosciami - rozmowa zawsze startuje."},"rest":{"services":"POST /api/services { business_id }","staff":"POST /api/staff { business_id }","availability":"POST /api/availability { business_id, service_variant_id, staffer_id, start_date, end_date }","book":"POST /api/book { business_id, access_token, ... }","reschedule":"POST /api/reschedule { access_token, appointment_uid, ... }","reschedule_by_phone":"POST /api/reschedule-by-phone { business_id, client_phone, new_datetime, [service_variant_id, staffer_id, client_name] }","cancel":"POST /api/cancel { access_token, appointment_uid }","cancel_by_phone":"POST /api/cancel-by-phone { business_id, client_phone }","appointment":"POST /api/appointment { access_token, appointment_uid }","health":"POST /api/health { access_token }"},"admin":{"register_from_widget":"POST /api/admin/register { widget_snippet }","list_salons":"POST /api/admin/salons {}","register_salon_manual":"POST /api/admin/salon { business_id, widget_api_key, web_api_key, country, setup_status?: 'pending'|'active'|'suspended' }","get_salon":"POST /api/admin/salon/get { business_id }","suspend_salon":"POST /api/admin/salon/suspend { business_id, reason? } - wylacza alarmy CRITICAL (SMS) dla salonu (np. expired subscription, urlop)","activate_salon":"POST /api/admin/salon/activate { business_id } - przywraca alarmy CRITICAL po wczesniejszym suspend","store_token":"POST /api/admin/token { business_id, access_token }","store_credentials":"POST /api/admin/credentials { business_id, email, password }","configure_captcha":"POST /api/admin/captcha { solvers: [{provider, api_key}, ...] } or { provider, api_key }","status":"POST /api/admin/status {}","manual_refresh":"POST /api/admin/refresh {}","refresh_single_token":"POST /api/admin/refresh-token { business_id }","rotate_tokens":"POST /api/admin/rotate-tokens {} - manualny token rotation (samouleczenie auth_token, ten sam co daily cron 30 4 * * *)","view_queue":"POST /api/admin/queue {}","process_queue":"POST /api/admin/queue/process {}","upsert_agent":"POST /api/admin/agent { agent_id, business_id, salon_name?, notes? } - rejestruje mapping agent_id (voice MCP) -> business_id","list_agents":"POST /api/admin/agents {} - lista wszystkich agent_id mappings","get_agent":"POST /api/admin/agent/get { agent_id } - pobierz mapping dla pojedynczego agenta","delete_agent":"POST /api/admin/agent/delete { agent_id } - usun mapping","seed_agents":"POST /api/admin/agent/seed {} - idempotentnie wstaw defaultowe mappingi z DEFAULT_AGENT_MAPPINGS","analytics_stats":"GET /api/admin/analytics?agent_id=...&date_from=YYYY-MM-DD&date_to=YYYY-MM-DD - agregaty umowionych wizyt (KPI + by_service/staff/day/weekday). Auth: x-api-secret lub x-mcp-secret. Bez dat = wszystkie dane.","analytics_appointments":"GET /api/admin/appointments?agent_id=...&limit=&offset=&status=&date_from=&date_to= - paginowana lista umowionych wizyt (tabela panelu)."}}}