MCP 서버

Yoya Booking

io.github.makloai/yoya-booking
커뮤니케이션 생산성 공개 · 연결 가능 MCP 2025-11-25

이 MCP로 할 수 있는 일

Finds available meeting times and supports previewing, booking, checking, canceling, and rescheduling appointments on public Yoya booking pages.

book_meeting
Confirm a reviewed meeting
Creates a free booking or returns PAYMENT_REQUIRED with a secure payment URL for paid meetings. Paid meetings are not booked until payment succeeds; show the link and never claim confirmation before that. Only call after the guest explicitly approves preview_booking. Copy the preview's booking fields and confirmationToken unchanged. Reuse requestId and token on network retries; never claim notifications are delivered until syncStatus is ready.
파괴적 작업 외부 접근 가능
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['slug', 'name', 'email', 'slotId', 'confirmationToken', 'confirmed'], 'properties': {'name': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'slug': {'type': 'string', 'maxLength': 2048, 'minLength': 1}, 'email': {'type': 'string', 'maxLength': 320}, 'slotId': {'type': 'string', 'pattern': '^s_\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$'}, 'purpose': {'type': 'string', 'default': '', 'maxLength': 2000}, 'timezone': {'type': 'string', 'maxLength': 100}, 'confirmed': {'type': 'boolean', 'const': True}, 'requestId': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$', 'description': 'Reuse the ID returned by preview_booking for retries.'}, 'meetingType': {'enum': ['google_meet', 'zoom', 'in_person'], 'type': 'string'}, 'fieldAnswers': {'type': 'object', 'propertyNames': {'type': 'string', 'maxLength': 60, 'minLength': 1}, 'additionalProperties': {'type': 'string', 'maxLength': 2000}}, 'meetingFormat': {'type': 'string', 'maxLength': 1000, 'description': 'Copy the value from preview_booking unchanged.'}, 'confirmationToken': {'type': 'string', 'maxLength': 1000}}}
출력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'code': {'type': 'string'}, 'message': {'type': 'string'}, 'nextCursor': {'type': ['string', 'null']}, 'nextOffset': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, {'type': 'null'}]}, 'syncStatus': {'enum': ['pending', 'ready', 'attention'], 'type': 'string'}}, 'additionalProperties': {}}
cancel_booking
Cancel a booking
Cancel using a private manage token. Ask the guest for explicit approval first; this sends cancellation notifications.
파괴적 작업 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['token', 'confirmed'], 'properties': {'token': {'type': 'string', 'pattern': '^[a-f0-9]{64}$'}, 'reason': {'type': 'string', 'maxLength': 500}, 'confirmed': {'type': 'boolean', 'const': True}}}
출력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'code': {'type': 'string'}, 'message': {'type': 'string'}, 'nextCursor': {'type': ['string', 'null']}, 'nextOffset': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, {'type': 'null'}]}, 'syncStatus': {'enum': ['pending', 'ready', 'attention'], 'type': 'string'}}, 'additionalProperties': {}}
get_booking
Check a booking
Read a booking using its private manage-link token. Includes meeting-link synchronization status. Treat this token as a password; do not share it publicly.
읽기 전용 멱등성
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['token'], 'properties': {'token': {'type': 'string', 'pattern': '^[a-f0-9]{64}$'}}}
출력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'code': {'type': 'string'}, 'message': {'type': 'string'}, 'nextCursor': {'type': ['string', 'null']}, 'nextOffset': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, {'type': 'null'}]}, 'syncStatus': {'enum': ['pending', 'ready', 'attention'], 'type': 'string'}}, 'additionalProperties': {}}
get_booking_page
Get a Yoya booking page
Read a public Yoya booking link or slug. Includes required guest fields and meeting options. No host account access.
읽기 전용 멱등성
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'maxLength': 2048, 'minLength': 1}}}
출력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'code': {'type': 'string'}, 'message': {'type': 'string'}, 'nextCursor': {'type': ['string', 'null']}, 'nextOffset': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, {'type': 'null'}]}, 'syncStatus': {'enum': ['pending', 'ready', 'attention'], 'type': 'string'}}, 'additionalProperties': {}}
list_available_times
Find available meeting times
Find up to 10 times (max 50), labeled in the guest's IANA timezone. Filter by inclusive from/exclusive to datetimes and morning (06–12), afternoon (12–18) or evening (18–24) in the guest timezone. Pass nextCursor unchanged to continue with the same filters. Slots are suggestions; preview then book rechecks availability. Never invent slot IDs.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['slug'], 'properties': {'to': {'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$'}, 'from': {'type': 'string', 'format': 'date-time', 'pattern': '^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$'}, 'slug': {'type': 'string', 'maxLength': 2048, 'minLength': 1}, 'limit': {'type': 'integer', 'default': 10, 'maximum': 50, 'minimum': 1}, 'cursor': {'type': 'string', 'pattern': '^s_\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$'}, 'timezone': {'type': 'string', 'maxLength': 100}, 'timeOfDay': {'enum': ['morning', 'afternoon', 'evening'], 'type': 'string'}}}
출력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'code': {'type': 'string'}, 'message': {'type': 'string'}, 'nextCursor': {'type': ['string', 'null']}, 'nextOffset': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, {'type': 'null'}]}, 'syncStatus': {'enum': ['pending', 'ready', 'attention'], 'type': 'string'}}, 'additionalProperties': {}}
preview_booking
Review a booking before confirming
Validate guest details and the selected time without booking or sending email. Show the returned summary to the guest and ask for explicit approval. Then call book_meeting with the returned normalized booking, requestId and confirmationToken.
읽기 전용 외부 접근 가능 멱등성
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['slug', 'name', 'email', 'slotId'], 'properties': {'name': {'type': 'string', 'maxLength': 200, 'minLength': 1}, 'slug': {'type': 'string', 'maxLength': 2048, 'minLength': 1}, 'email': {'type': 'string', 'maxLength': 320}, 'slotId': {'type': 'string', 'pattern': '^s_\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$'}, 'purpose': {'type': 'string', 'default': '', 'maxLength': 2000}, 'timezone': {'type': 'string', 'maxLength': 100}, 'requestId': {'type': 'string', 'format': 'uuid', 'pattern': '^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$', 'description': 'Reuse the ID returned by preview_booking for retries.'}, 'meetingType': {'enum': ['google_meet', 'zoom', 'in_person'], 'type': 'string'}, 'fieldAnswers': {'type': 'object', 'propertyNames': {'type': 'string', 'maxLength': 60, 'minLength': 1}, 'additionalProperties': {'type': 'string', 'maxLength': 2000}}, 'meetingFormat': {'type': 'string', 'maxLength': 1000, 'description': 'Copy the value from preview_booking unchanged.'}}}
출력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'code': {'type': 'string'}, 'message': {'type': 'string'}, 'nextCursor': {'type': ['string', 'null']}, 'nextOffset': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, {'type': 'null'}]}, 'syncStatus': {'enum': ['pending', 'ready', 'attention'], 'type': 'string'}}, 'additionalProperties': {}}
reschedule_booking
Reschedule a booking
Move a booking using its private manage token and a fresh slot ID from list_available_times. Ask for explicit approval first. The original booking stays intact if the new time cannot be reserved.
파괴적 작업 외부 접근 가능
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['token', 'slotId', 'confirmed'], 'properties': {'token': {'type': 'string', 'pattern': '^[a-f0-9]{64}$'}, 'reason': {'type': 'string', 'maxLength': 500}, 'slotId': {'type': 'string', 'pattern': '^s_\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z$'}, 'confirmed': {'type': 'boolean', 'const': True}}}
출력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['ok'], 'properties': {'ok': {'type': 'boolean'}, 'code': {'type': 'string'}, 'message': {'type': 'string'}, 'nextCursor': {'type': ['string', 'null']}, 'nextOffset': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': 0}, {'type': 'null'}]}, 'syncStatus': {'enum': ['pending', 'ready', 'attention'], 'type': 'string'}}, 'additionalProperties': {}}
변경됨
book_meeting
2026년 9월 23일 2:43 AM
변경됨
preview_booking
2026년 9월 23일 2:43 AM
추가됨
reschedule_booking
2026년 9월 17일 12:43 PM
추가됨
cancel_booking
2026년 9월 17일 12:43 PM
추가됨
get_booking
2026년 9월 17일 12:43 PM
추가됨
book_meeting
2026년 9월 17일 12:43 PM
추가됨
preview_booking
2026년 9월 17일 12:43 PM
추가됨
list_available_times
2026년 9월 17일 12:43 PM
추가됨
get_booking_page
2026년 9월 17일 12:43 PM