Planeron
Book appointments online with local businesses on Planeron — fast, simple scheduling.
This listing identifies a third-party MCP server. MCPBundles is not affiliated with, sponsored by, or endorsed by the service or its operator unless stated on this page.
https://planeron.com/https://planeron.com/mcpLast probed Nov 2, 2026 · planeron.com
25tools discovered
Get
Business
Check
Consumer
Create
Search
Verify
Other capabilities
Search Businesses
search_businessesSearch for businesses offering specific services around a location. Results are always limited to a radius around the search center — provide either `location` (city/address, geocoded automatically) or `lat`/`lng`. If the user has not told you where to search, ask them first. Returns individual services sorted by distance. Supports pagination. If form template IDs are shown in the result, treat them as user-completed questionnaires, ask the user for the answers before booking, and do not auto-fi
Description may be truncated on the public preview.
Add to workspace[
{
"name": "search_businesses",
"description": "Search for businesses offering specific services around a location. Results are always limited to a radius around the search center — provide either `location` (city/address, geocoded automatically) or `lat`/`lng`. If the user has not told you where to search, ask them first. Returns individual services sorted by distance. Supports pagination. If form template IDs are shown in the result, treat them as user-completed questionnaires, ask the user for the answers before booking, and do not auto-fill them from context.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"lat": {
"type": "number",
"maximum": 90,
"minimum": -90,
"description": "User latitude for distance-based search"
},
"lng": {
"type": "number",
"maximum": 180,
"minimum": -180,
"description": "User longitude for distance-based search"
},
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number for pagination (default: 1)"
},
"query": {
"type": "string",
"description": "Search query for service type (e.g., \"haircut\", \"massage\", \"dental\", \"makeup\"). Optional — omit to list all services around the location."
},
"radius": {
"type": "number",
"default": 10,
"maximum": 100,
"minimum": 1,
"description": "Search radius in kilometers (default: 10)"
},
"category": {
"type": "string",
"description": "Filter by service category"
},
"industry": {
"type": "string",
"description": "Filter by calendar industry (e.g., \"beauty_salon\", \"fitness_center\", \"dental\")"
},
"location": {
"type": "string",
"minLength": 2,
"description": "Free-text place to search around (city or address, e.g. \"Skopje\"). Required unless lat/lng are provided — results are always limited to the search radius."
},
"pageSize": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Results per page (default: 10, max: 50)"
}
}
}
},
{
"name": "get_available_slots",
"description": "Get available booking time slots for a specific service at a business. Use this after finding a business to check when bookings are available. The slot output is intentionally compact and displays times in the requested timezone; create_booking still expects requestedStartAt as a UTC ISO 8601 timestamp ending in Z, so convert the chosen displayed slot before booking. If booking form template IDs are shown for the service, ask the user for the answers before booking and do not skip that step. For participant-based calendars, ask the user whether they do not care which participant performs the service or want to choose a specific participant before booking. The response includes the participant IDs that can actually take the slot.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"calendarId",
"serviceId",
"startDate",
"endDate"
],
"properties": {
"endDate": {
"type": "string",
"description": "End date in YYYY-MM-DD format (e.g., 2025-12-22)"
},
"timezone": {
"type": "string",
"description": "IANA timezone for formatting the slot times shown to you (e.g., \"Europe/Skopje\", \"America/New_York\"). The available slots themselves are always determined by the calendar's configured timezone on the server — this parameter only affects how the times are displayed in the response. Defaults to your saved consumer timezone, then the server timezone, then UTC."
},
"serviceId": {
"type": "string",
"description": "The unique service ID (NOT the name). This is the alphanumeric ID like \"01KBX1J5T3VBK5FAJN2PPCHC9H\" returned from search_businesses. Do NOT use the service name like \"haircut\"."
},
"startDate": {
"type": "string",
"description": "Start date in YYYY-MM-DD format (e.g., 2025-12-15)"
},
"calendarId": {
"type": "string",
"description": "The unique calendar ID (NOT the name). This is the alphanumeric ID like \"01KBX1MC2WJMZNXF7DBHMECPF3\" returned from search_businesses."
},
"participantId": {
"type": "string",
"description": "Optional specific staff member ID (alphanumeric ID, not name)"
},
"firstAvailable": {
"type": "boolean",
"description": "When true, if the selected range has no slots the system scans forward and returns the first future month with availability."
}
}
}
},
{
"name": "create_booking",
"description": "Create one or more bookings for the authenticated consumer. Use selection.calendarId and selection.items for every booking. Include formResponses using the exact payload shape shown by get_business_details. TemplateId belongs inside each response entry; each formResponses key should be the serviceId#1-style booking unit. Booking intake templates are user-completed questionnaires: do not invent answers, do not copy values from context unless the user explicitly gave them, and use UTC ISO 8601 requestedStartAt values ending in Z. On participant-based calendars, ask the user whether they want any available participant or a specific participant before booking. If a service has booking intake templates, ask the user for those answers before booking and do not skip or auto-fill them. For services with locationType=CLIENT_LOCATION you MUST first call search_locations to let the user pick a real geocoded address, then attach the chosen candidate (verbatim, including countryCode + latitude + longitude) into selection.items[i].slotPreferences[].customerLocation. For CAPACITY-mode calendars set the location on slotIndex 0 (a single entry is sufficient — the backend collapses the row). For STAFF-mode calendars set one customerLocation per slot, covering every slotIndex from 0 to quantity-1.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"selection",
"requestedStartAt"
],
"properties": {
"timezone": {
"type": "string",
"description": "IANA timezone for formatting the booking times shown back to you (e.g., \"Europe/Skopje\"). Booking validation uses the calendar timezone on the server. If omitted, the tool uses your saved consumer timezone, then server timezone, then UTC."
},
"selection": {
"type": "object",
"required": [
"calendarId",
"items"
],
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"serviceId"
],
"properties": {
"note": {
"type": "string",
"description": "Optional note for this specific booking item"
},
"quantity": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "How many times to book this service"
},
"serviceId": {
"type": "string",
"minLength": 1,
"description": "The unique service ID (NOT the name). This is the alphanumeric ID like \"01KBX1J5T3VBK5FAJN2PPCHC9H\"."
},
"clientItemId": {
"type": "string",
"description": "Optional stable ID for this line item"
},
"assignmentMode": {
"enum": [
"AUTO",
"FIXED",
"MIXED"
],
"type": "string",
"description": "Participant assignment strategy. AUTO lets the backend choose; FIXED pins to slotPreferences; MIXED lets the backend combine both."
},
"slotPreferences": {
"type": "array",
"items": {
"type": "object",
"required": [
"slotIndex"
],
"properties": {
"note": {
"type": "string"
},
"userId": {
"type": [
"string",
"null"
]
},
"slotIndex": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"customerLocation": {
"type": "object",
"required": [
"countryCode",
"latitude",
"longitude"
],
"properties": {
"city": {
"type": "string"
},
"address": {
"type": "string"
},
"country": {
"type": "string"
},
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"postcode": {
"type": "string"
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
},
"countryCode": {
"type": "string",
"pattern": "^[A-Z]{2}$"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "Canonical booking items. Use one item per service line; quantity lets you book multiple units of the same service without repeating it."
},
"calendarId": {
"type": "string",
"minLength": 1,
"description": "The unique calendar ID (NOT the name). This is the alphanumeric ID like \"01KBX1MC2WJMZNXF7DBHMECPF3\" returned from search_businesses or get_business_details."
}
},
"description": "Booking selection to create. Use the calendar ID and service IDs returned from search_businesses or get_business_details.",
"additionalProperties": false
},
"description": {
"type": "string",
"description": "Optional booking note. The tool maps this onto the booking items unless a note is already present on the item."
},
"attendeePhone": {
"type": "string",
"description": "Optional phone number"
},
"formResponses": {
"type": "object",
"description": "Booking intake form responses keyed by service unit, for example { \"<serviceId>#1\": [{ templateId: \"...\", values: { fieldId: value } }] }. The answers must come from the user, not from model inference or context guesses.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "object",
"required": [
"templateId",
"values"
],
"properties": {
"values": {
"type": "object",
"description": "Field values keyed by template field IDs. Pass the values expected by the backend booking form template.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"templateId": {
"type": "string",
"minLength": 1,
"description": "The booking form template ID"
}
},
"additionalProperties": false
},
"minItems": 1
}
},
"requestedStartAt": {
"type": "string",
"minLength": 1,
"description": "Start time for the FIRST service as a UTC ISO 8601 timestamp ending in Z (e.g., 2025-12-15T10:00:00.000Z). Offset timestamps are accepted and normalized to UTC before the backend call."
}
}
}
},
{
"name": "get_business_details",
"description": "Get detailed information about a specific business/calendar including services, pricing, booking mode, staff members, and service-level booking intake forms. Use this after finding a business with search so you can build create_booking.selection and collect the user-provided answers for any required BOOKING_INTAKE forms. For participant-based calendars, ask the user whether they do not care who performs the service or want to select a specific participant before booking. Do not auto-fill templates from context.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"calendarId"
],
"properties": {
"calendarId": {
"type": "string",
"description": "The calendar ID to get detailed information for"
}
}
}
},
{
"name": "get_booking_intake_data",
"description": "Get the stored form-template intake data for a specific booking using the active business or consumer session automatically. Use this after get_my_bookings or get_my_schedule. Requires authentication.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"bookingId"
],
"properties": {
"bookingId": {
"type": "string",
"minLength": 1,
"description": "The unique booking ID to fetch intake data for. Use get_my_bookings or get_my_schedule to find it."
}
}
}
},
{
"name": "search_locations",
"description": "Resolve a free-text address into geocoded candidates (with latitude, longitude, and ISO 2-letter country code). Use this BEFORE create_booking whenever a selected service has locationType=CLIENT_LOCATION, so the customer location can be persisted with full coordinates. Always present the returned candidates to the user and let THEM pick one — never select on the user's behalf. Pass the selected candidate (verbatim, including countryCode) into create_booking via selection.items[i].slotPreferences[0].customerLocation (for CAPACITY services) or via each slot 0..quantity-1 (for STAFF services).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "Maximum number of candidates to return (default 5, max 10)."
},
"query": {
"type": "string",
"minLength": 2,
"description": "Free-text address query, e.g. \"12 Rue Foo, Paris\" or \"Skopje city centre\". The user must provide this; do not invent it."
}
}
}
},
{
"name": "consumer_login",
"description": "Send a 6-digit verification code to the consumer's email for authentication. After calling this, ask the user for the code they received and use verify_consumer_auth to complete login.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"email"
],
"properties": {
"name": {
"type": "string",
"description": "Optional name of the consumer (used if creating new account)"
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Email address of the consumer to authenticate"
}
}
}
},
{
"name": "verify_consumer_auth",
"description": "Verify the 6-digit code to complete consumer authentication. Call this after consumer_login with the email and code the user provides.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"email",
"otp"
],
"properties": {
"otp": {
"type": "string",
"maxLength": 6,
"minLength": 6,
"description": "The 6-digit verification code the user received via email"
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "The email address used for consumer_login"
}
}
}
},
{
"name": "check_auth_status",
"description": "Check if a consumer is currently authenticated. Returns authentication status and session details if logged in.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}
},
{
"name": "get_my_profile",
"description": "Read the authenticated consumer's saved profile snapshot.\n\nReturns: id, name, email, phone, language, timezone, and — most relevant for booking — the saved `location` (lat, lng, ISO-2 countryCode, address). The location field is `null` if the consumer has never saved one.\n\nWhen to use: before calling `create_booking` for a calendar that includes any CLIENT_LOCATION service. If the consumer has a saved location, surface it in your reply (e.g., \"I see you have <address> saved — should I use it for this booking?\") and only copy it into each `slotPreferences[].customerLocation` if the consumer confirms. Saved locations are seed data, NOT a free pass — never reuse them silently. If no saved location exists, call `search_locations` to let the consumer pick a fresh one.\n\nRequires an authenticated consumer session (`consumer_login` first). Admin sessions are rejected with a 403.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}
},
{
"name": "consumer_logout",
"description": "Log out the currently authenticated consumer and clear the session.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}
},
{
"name": "get_my_bookings",
"description": "Get the authenticated consumer's scheduled bookings. Requires authentication via consumer_login first. Use includeIntake='indicator' for quick list views, includeIntake='full' when the user asks what they should know about a specific booking, and includeIntake='none' when they only need the booking list. Use get_booking_intake_data for a dedicated lookup when needed.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "number",
"default": 20,
"maximum": 50,
"minimum": 1,
"description": "Maximum number of bookings to return (default: 20)"
},
"status": {
"enum": [
"all",
"upcoming",
"past",
"cancelled"
],
"type": "string",
"default": "upcoming",
"description": "Filter bookings by status: \"upcoming\" (future bookings), \"past\" (completed), \"cancelled\", or \"all\""
},
"includeIntake": {
"enum": [
"none",
"indicator",
"full"
],
"type": "string",
"default": "indicator",
"description": "How much booking intake data to include inline: none omits it, indicator shows Booking Intake Data: Available/None/Unavailable, and full includes the full intake block. Default: indicator. Use full when the user asks what they should know about a booking or wants prep details."
}
}
}
},
{
"name": "cancel_my_booking",
"description": "Cancel a booking using authenticated sessions. By default, if both consumer and business sessions are active, consumer flow is preferred. You can override with cancelAs=\"business\" or cancelAs=\"consumer\" (no \"auto\" option). If user intent is ambiguous between personal and admin/staff cancellation, ask a clarifying question before calling this tool.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"bookingId"
],
"properties": {
"reason": {
"type": "string",
"description": "Optional reason for cancellation."
},
"cancelAs": {
"enum": [
"consumer",
"business"
],
"type": "string",
"description": "Optional flow override: \"consumer\" or \"business\". If omitted, consumer flow is preferred when both sessions are active, otherwise business flow is used."
},
"bookingId": {
"type": "string",
"description": "The unique booking ID to cancel. Get this from get_my_bookings (shown as \"Booking ID\" in the results)."
},
"useRefundPolicy": {
"type": "boolean",
"description": "Business flow only: use business refund policy (default true when refundPercentage is not provided)."
},
"refundPercentage": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Business flow only: custom refund percentage (0-100). Requires refund permissions on backend."
}
}
}
},
{
"name": "reschedule_my_booking",
"description": "Reschedule one of the authenticated consumer's bookings to a new time. Requires authentication via consumer_login first. Use get_available_slots to find available times before rescheduling.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"bookingId",
"newStartTime"
],
"properties": {
"timezone": {
"type": "string",
"description": "IANA timezone for displaying the proposed reschedule time back to you (e.g., \"Europe/Skopje\"). Work-hour feasibility is always evaluated against the calendar's configured timezone on the server — this parameter only affects how the proposed time is shown in the response. If omitted, reuses your last timezone from get_available_slots, then server timezone, then UTC."
},
"bookingId": {
"type": "string",
"description": "The unique booking ID to reschedule. Get this from get_my_bookings (shown as \"Booking ID\" in the results)."
},
"newStartTime": {
"type": "string",
"description": "The new start time for the booking as an ISO 8601 date-time with a timezone (e.g., 2025-12-15T10:00:00.000Z). Offset timestamps are accepted and converted to UTC. Use get_available_slots to find available times first."
}
}
}
},
{
"name": "business_login",
"description": "Send a 6-digit verification code to the business user's email for authentication. This is for business account holders (staff, managers, admins) - not consumers. After calling this, ask the user for the code they received and use verify_business_auth to complete login.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Email address of the business user to authenticate"
}
}
}
},
{
"name": "verify_business_auth",
"description": "Verify the 6-digit code to complete business user authentication. Use this after business_login to complete the login process.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"email",
"otp"
],
"properties": {
"otp": {
"type": "string",
"maxLength": 6,
"minLength": 6,
"description": "The 6-digit verification code from the email"
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Email address of the business user"
}
}
}
},
{
"name": "check_business_auth_status",
"description": "Check if a business user is currently authenticated and get session details including role and permissions.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}
},
{
"name": "business_logout",
"description": "Log out the currently authenticated business user and clear the session.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}
},
{
"name": "get_my_schedule",
"description": "Get the authenticated business user's assigned bookings. Shows bookings where you are assigned as a participant. Requires business authentication via business_login first. Use includeIntake='indicator' for quick list views, includeIntake='full' when the user asks what they should know about a booking, and includeIntake='none' when they only need the schedule. Use get_booking_intake_data for a dedicated lookup when needed.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "number",
"default": 20,
"maximum": 50,
"minimum": 1,
"description": "Maximum number of bookings to return (default: 20)"
},
"status": {
"enum": [
"all",
"upcoming",
"past",
"pending"
],
"type": "string",
"default": "upcoming",
"description": "Filter bookings by status: \"upcoming\" (future bookings), \"past\" (completed), \"pending\" (awaiting approval), or \"all\""
},
"endDate": {
"type": "string",
"description": "Optional ISO end datetime filter (exclusive), passed to backend as endDate query param"
},
"startDate": {
"type": "string",
"description": "Optional ISO start datetime filter (inclusive), passed to backend as startDate query param"
},
"calendarId": {
"type": "string",
"description": "Optional calendar ID to filter bookings for a specific calendar"
},
"includeIntake": {
"enum": [
"none",
"indicator",
"full"
],
"type": "string",
"default": "indicator",
"description": "How much booking intake data to include inline: none omits it, indicator shows Booking Intake Data: Available/None/Unavailable, and full includes the full intake block. Default: indicator. Use full when the user asks what they should know about a booking or wants prep details."
}
}
}
},
{
"name": "get_pending_approvals",
"description": "Get pending approvals for bookings and booking reschedule requests. Only available to ADMIN and MANAGER roles. Requires business authentication. Use includeIntake='indicator' for quick approval lists, includeIntake='full' when staff need prep details inline, and includeIntake='none' when only the queue matters. Use get_booking_intake_data for a dedicated intake lookup when needed.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"status": {
"enum": [
"HELD",
"CONFIRMED",
"CANCELED",
"COMPLETED",
"NO_SHOW",
"EXPIRED"
],
"type": "string",
"description": "Optional booking lifecycle status filter"
},
"calendarId": {
"type": "string",
"description": "Optional calendar ID to filter pending approvals for a specific calendar"
},
"includeIntake": {
"enum": [
"none",
"indicator",
"full"
],
"type": "string",
"default": "indicator",
"description": "How much booking intake data to include inline for pending booking approvals: none omits it, indicator shows Booking Intake Data: Available/None/Unavailable, and full includes the full intake block. Default: indicator. Use full when staff need prep details inline. Use get_booking_intake_data for a dedicated intake lookup when needed."
}
}
}
},
{
"name": "approve_booking",
"description": "Approve a pending booking approval or a pending reschedule request. Only available to ADMIN and MANAGER roles. Requires business authentication.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"bookingId": {
"type": "string",
"description": "Booking ID to approve when approvalType is \"booking\""
},
"approvalType": {
"enum": [
"booking",
"reschedule"
],
"type": "string",
"default": "booking",
"description": "Type of approval to process: \"booking\" for pending booking approvals, or \"reschedule\" for pending reschedule requests"
},
"rescheduleToken": {
"type": "string",
"description": "Reschedule token to approve when approvalType is \"reschedule\""
}
}
}
},
{
"name": "reject_booking",
"description": "Reject a pending booking approval or a pending reschedule request. Only available to ADMIN and MANAGER roles. Requires business authentication.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"reason": {
"type": "string",
"description": "Optional reason for rejection, for staff reference only. Never sent to the client and not stored."
},
"bookingId": {
"type": "string",
"description": "Booking ID to reject when approvalType is \"booking\""
},
"approvalType": {
"enum": [
"booking",
"reschedule"
],
"type": "string",
"default": "booking",
"description": "Type of rejection to process: \"booking\" for pending booking approvals, or \"reschedule\" for pending reschedule requests"
},
"rescheduleToken": {
"type": "string",
"description": "Reschedule token to reject when approvalType is \"reschedule\""
}
}
}
},
{
"name": "get_non_working_days",
"description": "Get non-working days (holidays, absences, closures) for the business. Requires business user authentication. ADMINs can view all non-working days in the company, while other staff can only view their own.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"endDate": {
"type": "string",
"description": "Filter non-working days that start on or before this date (ISO 8601 format)"
},
"startDate": {
"type": "string",
"description": "Filter non-working days that end on or after this date (ISO 8601 format)"
},
"calendarId": {
"type": "string",
"description": "Filter by calendar ID"
},
"participantId": {
"type": "string",
"description": "Filter by participant/staff member ID"
}
}
}
},
{
"name": "create_non_working_day",
"description": "Create a non-working day (holiday, absence, closure) for a calendar or participant. Requires business user authentication. ADMINs can create for any calendar/participant, while other staff can only create for themselves.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"startDate",
"endDate",
"description"
],
"properties": {
"endDate": {
"type": "string",
"description": "End date in ISO 8601 format (e.g., \"2025-12-26\")"
},
"startDate": {
"type": "string",
"description": "Start date in ISO 8601 format (e.g., \"2025-12-25\")"
},
"calendarId": {
"type": "string",
"description": "Calendar ID (for calendar-level non-working days). If not provided, applies to participant only."
},
"description": {
"type": "string",
"minLength": 1,
"description": "Description of the non-working period (e.g., \"Christmas Holiday\")"
},
"participantId": {
"type": "string",
"description": "Participant/staff member ID (for participant-specific absences). If not provided and you are not an ADMIN, defaults to your user ID."
}
}
}
},
{
"name": "delete_non_working_day",
"description": "Delete a non-working day (holiday, absence, closure). Requires business user authentication. ADMINs can delete any non-working days, while other staff can only delete their own.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "The ID of the non-working day to delete"
}
}
}
}
]Get your MCP into directories
A working endpoint is step one. Directory coverage is the coordinated launch across ChatGPT, Claude, Cursor, the MCP Registry, and community indexes.
Directory coverage for brandsBook appointments online with local businesses on Planeron — fast, simple scheduling.
Use the MCP endpoint listed on this page in your MCP client configuration. One-click install pills support Claude, Cursor, VS Code, and other hosts. Copy the remote MCP URL if your client needs a manual entry.
Request removal if you do not want Planeron listed here, or claim the listing if you want to manage it on MCPBundles.
This server appears in the MCPBundles directory. Verify you operate it to take over the listing — name, description, logo, contact email, and skill content. We email a 6-digit code to a maintainer address your server publishes in /.well-known/security.txt or /.well-known/mcpbundles.json. Free, takes about a minute.
MCPBundles publishes this directory for MCP discovery. Except where we host or operate an offering, third-party services run under their own terms. Product and company names on this page are used in a descriptive, identifying way (including under nominative fair use where applicable); they remain the property of their owners. Nothing here grants you rights in those marks, and nothing here is an offer to sell a third party's services. Terms · Request removal
Other MCP servers in this category from the directory index
MCPBundles probed 25 tools on the live server. The tool list on this page reflects what was discovered at the last refresh — connect your client to see the full set available to your session.
No provider sign-in was required during MCPBundles' probe. Your client may still need MCPBundles credentials depending on how you connect.
Request removal from the MCPBundles directory. We stop publishing this listing on mcpbundles.com.
MCPBundles is an independent platform built on the open Model Context Protocol standard. MCPBundles is not affiliated with, sponsored by, or endorsed by Anthropic PBC.