{"name":"DiveAdmin MCP Server","version":"1.0.0","protocolVersion":"2024-11-05","transport":"streamable-http","endpoint":"https:\/\/diveadmin.com\/api\/v1\/mcp","methods":"POST","authentication":{"type":"oauth2","authorizationServerMetadataUrl":"https:\/\/diveadmin.com\/.well-known\/oauth-authorization-server","protectedResourceMetadataUrl":"https:\/\/diveadmin.com\/.well-known\/oauth-protected-resource","pkce":"required","dynamicRegistration":true},"description":"MCP server for DiveAdmin dive school management. Tools are scoped per dive school. Auth required to invoke; static catalogue published here for indexers.","documentation":"https:\/\/diveadmin.com\/api-documentation#mcp","tools":[{"name":"search_divers","description":"Search for divers by name, email, or phone number.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Full or partial name to search for"},"email":{"type":"string","description":"Email address to search for"},"phone":{"type":"string","description":"Phone or mobile number to search for"},"limit":{"type":"integer","description":"Maximum number of results (default 25, max 50)","default":25}}}},{"name":"get_diver","description":"Get detailed information about a specific diver by ID.","inputSchema":{"type":"object","properties":{"id":{"type":"integer","description":"The diver ID"}},"required":["id"]}},{"name":"search_trips","description":"Search dive trips by date, site, boat, or status.","inputSchema":{"type":"object","properties":{"date_from":{"type":"string","description":"Start date filter (YYYY-MM-DD)"},"date_to":{"type":"string","description":"End date filter (YYYY-MM-DD)"},"site":{"type":"string","description":"Dive site name to filter by"},"boat":{"type":"string","description":"Boat name to filter by"},"status":{"type":"string","description":"Trip status"},"limit":{"type":"integer","description":"Maximum number of results (max 50)"}}}},{"name":"get_trip","description":"Get detailed information about a specific dive trip by ID.","inputSchema":{"type":"object","properties":{"id":{"type":"integer","description":"The trip ID"}},"required":["id"]}},{"name":"search_invoices","description":"Search invoices by diver name, status, date range, or reference.","inputSchema":{"type":"object","properties":{"diver_name":{"type":"string","description":"Diver name to filter by"},"status":{"type":"string","description":"Invoice status (open, paid, cancel, refund)"},"date_from":{"type":"string","description":"Start date filter (YYYY-MM-DD)"},"date_to":{"type":"string","description":"End date filter (YYYY-MM-DD)"},"reference":{"type":"string","description":"Invoice reference number"},"inc_num":{"type":"string","description":"Invoice sequential number"},"limit":{"type":"integer","description":"Maximum number of results (max 50)"}}}},{"name":"search_expenses","description":"Search expenses by status, date range, supplier, or reference.","inputSchema":{"type":"object","properties":{"status":{"type":"string","description":"Expense status"},"date_from":{"type":"string","description":"Start date filter (YYYY-MM-DD)"},"date_to":{"type":"string","description":"End date filter (YYYY-MM-DD)"},"supplier":{"type":"string","description":"Supplier name to filter by"},"reference":{"type":"string","description":"Expense reference"},"limit":{"type":"integer","description":"Maximum number of results (max 50)"}}}},{"name":"search_leads","description":"Search leads by status, source channel, staff, or diver name.","inputSchema":{"type":"object","properties":{"status":{"type":"string","description":"Lead status"},"source_channel":{"type":"string","description":"Lead source channel"},"staff_name":{"type":"string","description":"Staff member name"},"diver_name":{"type":"string","description":"Diver\/prospect name"},"date_from":{"type":"string","description":"Created from date (YYYY-MM-DD)"},"date_to":{"type":"string","description":"Created to date (YYYY-MM-DD)"},"limit":{"type":"integer","description":"Maximum number of results (max 50)"}}}},{"name":"search_equipment","description":"Search equipment items by name, serial number, owner type, or diver.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Equipment name or type"},"serial_number":{"type":"string","description":"Serial number to search for"},"owner_type":{"type":"string","description":"Owner type (school, diver, etc.)"},"diver_name":{"type":"string","description":"Owner diver name"},"limit":{"type":"integer","description":"Maximum number of results (max 50)"}}}},{"name":"search_courses","description":"Search dive courses by name or type.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Course name to search for"},"type":{"type":"string","description":"Course type"},"limit":{"type":"integer","description":"Maximum number of results (max 50)"}}}},{"name":"search_products","description":"Search products and services by name, status, or category.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Product name to search for"},"status":{"type":"string","description":"Product status"},"is_sale":{"type":"boolean","description":"Filter by sale items"},"is_stock":{"type":"boolean","description":"Filter by stock items"},"category":{"type":"string","description":"Product category name"},"limit":{"type":"integer","description":"Maximum number of results (max 50)"}}}},{"name":"search_forms","description":"Search forms and waivers by status, diver, or form name.","inputSchema":{"type":"object","properties":{"status":{"type":"string","description":"Form status"},"diver_name":{"type":"string","description":"Diver name to filter by"},"form_name":{"type":"string","description":"Form template name"},"limit":{"type":"integer","description":"Maximum number of results (max 50)"}}}},{"name":"search_staff","description":"Search staff members by name or status.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Staff member name to search for"},"status":{"type":"string","description":"Staff status"},"limit":{"type":"integer","description":"Maximum number of results (max 50)"}}}},{"name":"get_statistics","description":"Get statistics for divers, trips, invoices, leads, revenue, or expenses. Supports totals, time-based trends (month\/week\/day), and entity-based breakdowns (site, boat, country, status, source). Use filters to drill down (e.g. trips at a specific site). Default totals include enriched summaries like avg_divers_per_trip, top_countries, by_status breakdowns.","inputSchema":{"type":"object","properties":{"type":{"type":"string","enum":["divers","trips","invoices","leads","revenue","expenses"],"description":"The type of statistics to retrieve"},"period":{"type":"string","enum":["today","this_week","this_month","last_month","this_year","last_year","all"],"description":"Shortcut time period (ignored if date_from\/date_to set)"},"date_from":{"type":"string","description":"Custom start date (YYYY-MM-DD)"},"date_to":{"type":"string","description":"Custom end date (YYYY-MM-DD)"},"group_by":{"type":"string","enum":["month","week","day","site","boat","country","status","source"],"description":"Break down results: time-based (month\/week\/day) or entity-based (site for trips, boat for trips, country for divers, status for invoices\/leads, source for leads)"},"site":{"type":"string","description":"Filter trips by dive site name (partial match)"},"boat":{"type":"string","description":"Filter trips by boat name (partial match)"},"country":{"type":"string","description":"Filter divers by country (partial match)"},"status":{"type":"string","description":"Filter invoices\/leads\/expenses by status"},"source":{"type":"string","description":"Filter leads by source channel"},"staff":{"type":"string","description":"Filter leads by staff member name (partial match)"}},"required":["type"]}},{"name":"create_trip","description":"Create a new dive trip with a name, departure time, and optional location, boat, dive site, and number of dives.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Trip name or title (e.g. \"Morning Dive\" or \"Ko Haa Trip\")"},"depart_time":{"type":"string","description":"Departure date and time (e.g. \"2026-04-14 09:00\" or \"tomorrow 9am\")"},"depart_location":{"type":"string","description":"Departure location or meeting point"},"boat_name":{"type":"string","description":"Name of the boat to use (partial match)"},"site_name":{"type":"string","description":"Dive site name (partial match)"},"number_of_dives":{"type":"integer","description":"Number of dives on this trip (default 2)"}},"required":["name","depart_time"]}},{"name":"add_diver_to_trip","description":"Add a diver to a dive trip. Pass diver_name to search \u2014 if multiple matches are found, the tool returns a clarify action with options. Do NOT search separately and pick one yourself; always pass the name and let the tool handle disambiguation.","inputSchema":{"type":"object","properties":{"trip_id":{"type":"integer","description":"The trip ID to add divers to"},"diver_id":{"type":"integer","description":"A single diver ID to add"},"diver_name":{"type":"string","description":"Diver name to search for and add (use when diver_id is unknown)"}},"required":["trip_id"]}},{"name":"remove_diver_from_trip","description":"Remove a diver from a dive trip. Pass diver_name to search \u2014 if multiple matches, the tool returns a clarify action. Always call first WITHOUT confirmed to preview, then ask the user to confirm, then call again WITH confirmed=true to execute.","inputSchema":{"type":"object","properties":{"trip_id":{"type":"integer","description":"The trip ID to remove a diver from"},"diver_id":{"type":"integer","description":"The diver ID to remove"},"diver_name":{"type":"string","description":"Diver name to search for (use when diver_id is unknown)"},"confirmed":{"type":"boolean","description":"Set to true ONLY after the user has explicitly confirmed the removal"}},"required":["trip_id"]}},{"name":"create_diver","description":"Create a new diver (customer) in the system.","inputSchema":{"type":"object","properties":{"first_name":{"type":"string","description":"First name (required)"},"surname":{"type":"string","description":"Last name \/ surname"},"email":{"type":"string","description":"Email address"},"phone":{"type":"string","description":"Phone number"},"mobile":{"type":"string","description":"Mobile number"},"country":{"type":"string","description":"Country"},"notes":{"type":"string","description":"Notes about the diver"}},"required":["first_name"]}},{"name":"update_diver","description":"Update an existing diver's details (contact info, notes, address, etc).","inputSchema":{"type":"object","properties":{"diver_id":{"type":"integer","description":"The diver ID to update"},"first_name":{"type":"string","description":"First name"},"surname":{"type":"string","description":"Last name"},"email":{"type":"string","description":"Email address"},"phone":{"type":"string","description":"Phone number"},"mobile":{"type":"string","description":"Mobile number"},"country":{"type":"string","description":"Country"},"notes":{"type":"string","description":"Notes"},"emergency_contact":{"type":"string","description":"Emergency contact name"},"emergency_phone":{"type":"string","description":"Emergency contact phone"}},"required":["diver_id"]}},{"name":"create_lead","description":"Create a new sales lead\/enquiry. Automatically creates a diver record if diver_id is not provided.","inputSchema":{"type":"object","properties":{"first_name":{"type":"string","description":"Contact first name (required if no diver_id)"},"surname":{"type":"string","description":"Contact last name"},"email":{"type":"string","description":"Contact email"},"phone":{"type":"string","description":"Contact phone"},"diver_id":{"type":"integer","description":"Link to existing diver instead of creating new one"},"source_channel":{"type":"string","description":"Lead source (manual, email, phone, walk-in, website, social, referral)"},"status":{"type":"string","description":"Lead status (enquiry, sale, process, lost). Default: enquiry"},"message":{"type":"string","description":"Lead notes or enquiry message"},"value":{"type":"number","description":"Estimated value of the lead"}},"required":["first_name"]}},{"name":"update_lead_status","description":"Update the status of an existing lead (enquiry, sale, process, lost).","inputSchema":{"type":"object","properties":{"lead_id":{"type":"integer","description":"The lead ID to update"},"status":{"type":"string","enum":["enquiry","sale","process","lost"],"description":"New lead status"}},"required":["lead_id","status"]}},{"name":"update_trip","description":"Update an existing dive trip's details (name, time, boat, location, dives, site).","inputSchema":{"type":"object","properties":{"trip_id":{"type":"integer","description":"The trip ID to update"},"name":{"type":"string","description":"New trip name"},"depart_time":{"type":"string","description":"New departure date\/time"},"depart_location":{"type":"string","description":"New departure location"},"boat_name":{"type":"string","description":"Boat name to assign (partial match)"},"site_name":{"type":"string","description":"Dive site to add (partial match)"},"number_of_dives":{"type":"integer","description":"Number of dives"}},"required":["trip_id"]}},{"name":"enroll_diver_in_course","description":"Enroll a diver in a dive course. Can specify course and diver by ID or name.","inputSchema":{"type":"object","properties":{"course_id":{"type":"integer","description":"Course ID"},"course_name":{"type":"string","description":"Course name (partial match, use if ID unknown)"},"diver_id":{"type":"integer","description":"Diver ID"},"diver_name":{"type":"string","description":"Diver name (use if ID unknown)"}}}},{"name":"send_invoice_email","description":"Email an invoice PDF to the diver or a specified email address.","inputSchema":{"type":"object","properties":{"invoice_id":{"type":"integer","description":"The invoice ID to email"},"email":{"type":"string","description":"Override email address (defaults to diver's email)"},"subject":{"type":"string","description":"Custom email subject"},"message":{"type":"string","description":"Custom email message body"}},"required":["invoice_id"]}},{"name":"print_trip","description":"Print a trip manifest\/boat list. If autoprint is configured, sends to printer. Otherwise returns PDF link. ALWAYS use mode=diving unless the user explicitly asks for transfers or equipment.","inputSchema":{"type":"object","properties":{"trip_id":{"type":"integer","description":"The trip ID to print"},"mode":{"type":"string","enum":["diving","transfer","equipment"],"description":"Print mode (default: diving)"}},"required":["trip_id"]}},{"name":"print_invoice","description":"Print an invoice. If autoprint is configured, sends to printer. Otherwise returns PDF link.","inputSchema":{"type":"object","properties":{"invoice_id":{"type":"integer","description":"The invoice ID to print"}},"required":["invoice_id"]}},{"name":"update_trip_diver_status","description":"Update a diver's status on a trip (default, unconfirmed, confirmed, issue).","inputSchema":{"type":"object","properties":{"trip_id":{"type":"integer","description":"The trip ID"},"diver_id":{"type":"integer","description":"The diver ID"},"diver_name":{"type":"string","description":"Diver name (use if ID unknown)"},"status":{"type":"string","enum":["default","unconfirmed","confirmed","issue"],"description":"New status"},"status_notes":{"type":"string","description":"Notes about the status change"}},"required":["trip_id","status"]}},{"name":"check_trip_capacity","description":"Check the capacity and current booking count for a trip. Shows customers, staff, available spaces.","inputSchema":{"type":"object","properties":{"trip_id":{"type":"integer","description":"The trip ID to check"}},"required":["trip_id"]}},{"name":"assign_staff_to_trip_diver","description":"Assign a staff member (instructor\/divemaster) to a specific diver on a trip.","inputSchema":{"type":"object","properties":{"trip_id":{"type":"integer","description":"The trip ID"},"diver_id":{"type":"integer","description":"The diver ID"},"diver_name":{"type":"string","description":"Diver name (use if ID unknown)"},"staff_id":{"type":"integer","description":"The staff ID to assign"},"staff_name":{"type":"string","description":"Staff name (use if ID unknown)"}},"required":["trip_id"]}},{"name":"send_form_to_diver","description":"Send a form\/waiver to a diver via email. The diver must have an email address on file.","inputSchema":{"type":"object","properties":{"diver_id":{"type":"integer","description":"The diver ID"},"diver_name":{"type":"string","description":"Diver name (use if ID unknown)"},"form_id":{"type":"integer","description":"Form template ID"},"form_name":{"type":"string","description":"Form template name (partial match, use if ID unknown)"}}}},{"name":"start_form_for_diver","description":"Generate a link and QR code page for a diver to complete a form on this device or by scanning.","inputSchema":{"type":"object","properties":{"diver_id":{"type":"integer","description":"The diver ID"},"diver_name":{"type":"string","description":"Diver name (use if ID unknown)"},"form_id":{"type":"integer","description":"Form template ID"},"form_name":{"type":"string","description":"Form template name (partial match, use if ID unknown)"}}}},{"name":"create_expense","description":"Create a new expense record. Returns a link to add items and details.","inputSchema":{"type":"object","properties":{"reference":{"type":"string","description":"Expense reference or description"}}}},{"name":"navigate_to","description":"Get the URL for a specific page in the application for navigation.","inputSchema":{"type":"object","properties":{"page":{"type":"string","enum":["dashboard","divers","diver","trips","trip","invoices","invoice","leads","lead","equipment","forms","courses","finance","settings","expenses"],"description":"The page to navigate to"},"id":{"type":"integer","description":"Record ID for detail pages (diver, trip, invoice, lead)"}},"required":["page"]}},{"name":"contact_support","description":"Connect the user with the human support team. Use this when the user asks to speak to a person, requests help you cannot provide, wants to report a bug, or needs human assistance.","inputSchema":{"type":"object","properties":{}}}],"capabilities":{"tools":{},"resources":{},"prompts":{}}}