Easy!Appointments
Find open slots, book, move and cancel Easy!Appointments bookings, with OAuth and a call log.
사용해야 할까요
품질 및 안전성
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"easyappointments": {
"url": "https://ea-mcp-demo.qiyuanlabs.ai/mcp"
}
}
}원격 엔드포인트
https://ea-mcp-demo.qiyuanlabs.ai/mcpstreamable-http할 수 있는 일
도구 목록
도구 (7)
🟢list_services(query)
Lists the services this business offers (length, price) and which providers offer each one. Call this first to get the service_id and provider_id that the other tools need.
입력 스키마
{
"type": "object",
"properties": {
"query": {
"description": "Optional words to filter services by name, for example \"massage\".",
"type": "string"
}
}
}🟢find_open_slots(service_id, provider_id, date_from, days, part_of_day)
Finds open start times for one service over a range of days, across every provider who offers it or just one. Times are in the time zone of each provider, given in the result. Use this before booking or rescheduling.
입력 스키마
{
"type": "object",
"properties": {
"service_id": {
"description": "The service, from list_services.",
"type": "integer"
},
"provider_id": {
"description": "Optional: only this provider.",
"type": "integer"
},
"date_from": {
"description": "First day to search, YYYY-MM-DD. Defaults to today.",
"format": "date",
"type": "string"
},
"days": {
"description": "How many days to search, 1 to 14. Default 7.",
"default": 7,
"minimum": 1,
"maximum": 14,
"type": "integer"
},
"part_of_day": {
"description": "morning is before 12:00, afternoon 12:00 to 17:00, evening from 17:00.",
"default": "any",
"enum": [
"any",
"morning",
"afternoon",
"evening"
],
"type": "string"
}
},
"required": [
"service_id"
]
}🟢find_customer(query)
Searches customers by name, email or phone and returns up to 10 matches with their customer_id. If several people match, ask which one is meant before booking.
입력 스키마
{
"type": "object",
"properties": {
"query": {
"description": "Part of a name, an email address or a phone number.",
"type": "string"
}
},
"required": [
"query"
]
}🟢list_appointments(customer_id, provider_id, date_from, date_to)
Lists appointments for a customer, a provider and/or a date range, earliest first. Give at least one of customer_id, provider_id or date_from. Without dates it shows the next 30 days.
입력 스키마
{
"type": "object",
"properties": {
"customer_id": {
"description": "From find_customer.",
"type": "integer"
},
"provider_id": {
"description": "From list_services.",
"type": "integer"
},
"date_from": {
"description": "YYYY-MM-DD. Defaults to today; give an earlier date to see past visits.",
"format": "date",
"type": "string"
},
"date_to": {
"description": "YYYY-MM-DD, inclusive. Defaults to 30 days after date_from.",
"format": "date",
"type": "string"
}
}
}🟢book_appointment(service_id, provider_id, start, customer_id, new_customer, ...)
Books an appointment for an existing customer (customer_id) or a new one (new_customer). Two steps: first call without confirm to get a preview and show it to the person; only after they agree, call again with the same arguments, confirm: true, the confirmation_token from the preview and an idempotency_key. Easy!Appointments then sends its usual confirmation emails.
입력 스키마
{
"type": "object",
"properties": {
"service_id": {
"description": "From list_services.",
"type": "integer"
},
"provider_id": {
"description": "From list_services or find_open_slots.",
"type": "integer"
},
"start": {
"description": "Start time \"YYYY-MM-DD HH:MM\" in the provider's time zone, exactly as find_open_slots returned it.",
"pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$",
"type": "string"
},
"customer_id": {
"description": "An existing customer, from find_customer. Give this or new_customer.",
"type": "integer"
},
"new_customer": {
"description": "Details for someone not yet in the system. If the email already belongs to a customer, that customer is used. Some businesses also require phone, address, city or zip_code; the preview says which are missing.",
"properties": {
"first_name": {
"type": "string"
},
"last_name": {
"type": "string"
},
"email": {
"format": "email",
"type": "string"
},
"phone": {
"type": "string"
},
"address": {
"type": "string"
},
"city": {
"type": "string"
},
"zip_code": {
"type": "string"
}
},
"type": "object",
"required": [
"first_name",
"last_name",
"email"
]
},
"notes": {
"description": "Optional note visible to staff.",
"maxLength": 500,
"type": "string"
},
"confirm": {
"description": "Leave false (the default) to get a preview without changing anything. Set true only after the person has seen the preview and agreed.",
"type": "boolean"
},
"confirmation_token": {
"description": "Required when confirm is true: the confirmation_token from the preview of exactly these arguments. It expires after a few minutes; if it has, get a new preview.",
"type": "string"
},
"idempotency_key": {
"description": "Required when confirm is true. Any unique string, for example a UUID. Reusing it with the same arguments returns the first result instead of acting twice.",
"type": "string"
}
},
"required": [
"service_id",
"provider_id",
"start"
]
}🔴reschedule_appointment(appointment_id, new_start, provider_id, confirm, confirmation_token, ...)
Moves an appointment to a new start time, optionally with another provider who offers the same service. Two steps: call without confirm for a preview, then, after the person agrees, again with confirm: true, the confirmation_token from the preview and an idempotency_key. Easy!Appointments emails the customer about the change.
입력 스키마
{
"type": "object",
"properties": {
"appointment_id": {
"description": "From list_appointments.",
"type": "integer"
},
"new_start": {
"description": "New start \"YYYY-MM-DD HH:MM\" in the time zone of the provider it moves to, from find_open_slots.",
"pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$",
"type": "string"
},
"provider_id": {
"description": "Optional: move to this provider. Defaults to the current one.",
"type": "integer"
},
"confirm": {
"description": "Leave false (the default) to get a preview without changing anything. Set true only after the person has seen the preview and agreed.",
"type": "boolean"
},
"confirmation_token": {
"description": "Required when confirm is true: the confirmation_token from the preview of exactly these arguments. It expires after a few minutes; if it has, get a new preview.",
"type": "string"
},
"idempotency_key": {
"description": "Required when confirm is true. Any unique string, for example a UUID. Reusing it with the same arguments returns the first result instead of acting twice.",
"type": "string"
}
},
"required": [
"appointment_id",
"new_start"
]
}🔴cancel_appointment(appointment_id, reason, confirm, confirmation_token, idempotency_key)
Cancels an upcoming appointment. Easy!Appointments deletes it and emails the customer a cancellation notice; this cannot be undone. Two steps: call without confirm for a preview, then, after the person agrees, again with confirm: true, the confirmation_token from the preview and an idempotency_key.
입력 스키마
{
"type": "object",
"properties": {
"appointment_id": {
"description": "From list_appointments.",
"type": "integer"
},
"reason": {
"description": "Optional reason. It is kept in this server's call log; Easy!Appointments has nowhere to store it.",
"maxLength": 300,
"type": "string"
},
"confirm": {
"description": "Leave false (the default) to get a preview without changing anything. Set true only after the person has seen the preview and agreed.",
"type": "boolean"
},
"confirmation_token": {
"description": "Required when confirm is true: the confirmation_token from the preview of exactly these arguments. It expires after a few minutes; if it has, get a new preview.",
"type": "string"
},
"idempotency_key": {
"description": "Required when confirm is true. Any unique string, for example a UUID. Reusing it with the same arguments returns the first result instead of acting twice.",
"type": "string"
}
},
"required": [
"appointment_id"
]
}커뮤니티
증거