Appointedd MCP by usefulapi
io.usefulapi/appointeddusefulapi.iostreamable-httpv1.0.0Scanned
Read Appointedd bookings, customers and availability; create, change and cancel bookings.
20 tools: 5 can delete or cancel things, 3 change things and 12 only read.
- Reads private data · 2
- Reads text others write · 20
- Can send data out · 1
- No findings
Anlyon alternative
8 of these tools change something. Run those as governed actions.
Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.
Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.
Import an OpenAPI spec →Tools
Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.
20 tools
Deletes or cancels 5Claude Code: deny
appointedd_cancel_bookingWRITE (cannot be undone): cancel a whole booking.Reads text others writeNo findings
Why it is in this group
- The name "appointedd_cancel_booking" says "cancel": a word for removing or ending something.
- The description says "cannot be undone".
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it WRITE (cannot be undone): cancel a whole booking. Appointedd may notify the customers according to the organisation's settings. To remove one customer from a group booking use appointedd_cancel_booking_customer. POST /bookings/{booking_id}/cancel.
Annotations the server declares
- title: Cancel booking
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
appointedd_cancel_booking_customerWRITE (cannot be undone): cancel one customer's place on a booking (the booking stays for the others).Reads text others writeNo findings
Why it is in this group
- The name "appointedd_cancel_booking_customer" says "cancel": a word for removing or ending something.
- The description says "cannot be undone".
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it WRITE (cannot be undone): cancel one customer's place on a booking (the booking stays for the others). customer_booking_id is the `customer_booking_id` in the booking's customers list. POST /bookings/{booking_id}/customers/{customer_booking_id}/cancel.
Annotations the server declares
- title: Cancel customer on booking
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
appointedd_update_bookingWRITE: change a booking's service, resource, label or total spaces, or move it by giving `parts` with new start/end times.Reads text others writeNo findings
Why it is in this group
- The name "appointedd_update_booking" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it WRITE: change a booking's service, resource, label or total spaces, or move it by giving `parts` with new start/end times. Customers are NOT emailed unless send_notifications is true. PUT /bookings/{booking_id}.
Annotations the server declares
- title: Update booking
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
appointedd_update_booking_customerWRITE: set the arrival status (Arrived, Complete, No Show, No Status) and/or notes of one customer on a booking.Reads text others writeNo findings
Why it is in this group
- The name "appointedd_update_booking_customer" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it WRITE: set the arrival status (Arrived, Complete, No Show, No Status) and/or notes of one customer on a booking. customer_booking_id is the customer's `customer_booking_id` (or `customer_id`) in the booking's customers list. PUT /bookings/{booking_id}/customers/{customer_booking_id}.
Annotations the server declares
- title: Update customer on booking
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
appointedd_update_customerWRITE: change a customer's name, email, mobile, phone or tags.Reads text others writeNo findings
Why it is in this group
- The name "appointedd_update_customer" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it WRITE: change a customer's name, email, mobile, phone or tags. Only the fields you pass are sent; `tags` replaces the customer's tag list. PUT /customers/{customer_id}.
Annotations the server declares
- title: Update customer
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
Changes things 3Claude Code: ask
appointedd_create_bookingWRITE: turn an active reservation into a booking (step 3) for one or more customers; Appointedd matches each customer to the CRM by name/email/mobile or creates it.Reads text others writeNo findings
Why it is in this group
- The name "appointedd_create_booking" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it WRITE: turn an active reservation into a booking (step 3) for one or more customers; Appointedd matches each customer to the CRM by name/email/mobile or creates it. Payment requests are NOT sent unless send_payment_request is true. With an empty customers list an empty booking is created. POST /bookings.
Annotations the server declares
- title: Create booking
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
appointedd_create_customerWRITE: create a customer in the CRM (first and last name required; email, mobile, phone, tags optional).Reads text others writeCan send data outNo findings
Why it is in this group
- The name "appointedd_create_customer" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- outboundThe input takes a destination (input.phone): what the tool writes goes there.
Description, as the server wrote it WRITE: create a customer in the CRM (first and last name required; email, mobile, phone, tags optional). POST /customers.
Annotations the server declares
- title: Create customer
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
appointedd_create_reservationWRITE: hold a date and time for a booking (step 2).Reads text others writeNo findings
Why it is in this group
- The name "appointedd_create_reservation" says "create": a word for a change.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it WRITE: hold a date and time for a booking (step 2). The reservation blocks that slot for `expires_after` minutes (default: the organisation's setting); then call appointedd_create_booking with the returned reservation id. Without resource_id a free resource assigned to the service is picked. POST /availability/slots.
Annotations the server declares
- title: Create reservation
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
Only reads 12Show 12 read-only tools
appointedd_find_available_datesFind which days in the given ranges have any availability for a service (a calendar view; use appointedd_find_available_intervals for the times).Reads private dataReads text others writeNo findings
Why it is in this group
- The name "appointedd_find_available_dates" says "find": a word for reading.
What it can reach
- private-dataThe description's first sentence says "find" and "calendar": it reads calendars.
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Find which days in the given ranges have any availability for a service (a calendar view; use appointedd_find_available_intervals for the times). Read-only. POST /availability/days/search.
Annotations the server declares
- title: Find available days
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
appointedd_find_available_intervalsFind the start times at which a service can be booked in the given ranges, with the free resource ids for each (and existing group bookings with room).Reads text others writeNo findings
Why it is in this group
- The name "appointedd_find_available_intervals" says "find": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Find the start times at which a service can be booked in the given ranges, with the free resource ids for each (and existing group bookings with room). Step 1 of making a booking: pick a start, then appointedd_create_reservation. Read-only. POST /availability/intervals/search.
Annotations the server declares
- title: Find available times
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
appointedd_get_customerOne customer by id.Reads text others writeNo findings
Why it is in this group
- The name "appointedd_get_customer" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it One customer by id. GET /customers/{customer_id}.
Annotations the server declares
- title: Get customer
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
appointedd_get_reservationOne reservation (availability slot) by id: its service, resource, times and expiry.Reads text others writeNo findings
Why it is in this group
- The name "appointedd_get_reservation" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it One reservation (availability slot) by id: its service, resource, times and expiry. GET /availability/slots/{reservation_id}.
Annotations the server declares
- title: Get reservation
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
appointedd_get_serviceOne service by id, including its booking questions, durations, prices and buffers.Reads text others writeNo findings
Why it is in this group
- The name "appointedd_get_service" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it One service by id, including its booking questions, durations, prices and buffers. GET /services/{service_id}.
Annotations the server declares
- title: Get service
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
appointedd_get_service_categoryOne service category by id.Reads text others writeNo findings
Why it is in this group
- The name "appointedd_get_service_category" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it One service category by id. GET /services/categories/{category_id}.
Annotations the server declares
- title: Get service category
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
appointedd_list_bookingsList bookings, newest first by default.Reads text others writeNo findings
Why it is in this group
- The name "appointedd_list_bookings" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it List bookings, newest first by default. Filter by time window (after/before), customer, service, resource, category, status or creation/update time. Each booking has its service, resource, start/end, status and the customers on it (with their notes, questions and statuses). Page with `next`. GET /bookings.
Annotations the server declares
- title: List bookings
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
appointedd_list_customersList customers in the CRM: name, email, phone/mobile, address, tags, custom fields, marketing opt-in.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "appointedd_list_customers" says "list": a word for reading.
What it can reach
- private-dataThe description's first sentence says "list" and "email": it reads mail.
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
- untrusted-inputThe description's first sentence says "list" and "email": it reads inbound email, which other people can write.
Description, as the server wrote it List customers in the CRM: name, email, phone/mobile, address, tags, custom fields, marketing opt-in. Page with `next`. GET /customers.
Annotations the server declares
- title: List customers
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
appointedd_list_resource_groupsList resource groups (id and name).Reads text others writeNo findings
Why it is in this group
- The name "appointedd_list_resource_groups" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it List resource groups (id and name). Page with `next`. GET /resources/groups.
Annotations the server declares
- title: List resource groups
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
appointedd_list_resourcesList resources (the staff members, rooms or equipment that bookings are made for): name, assigned service ids and resource group ids.Reads text others writeNo findings
Why it is in this group
- The name "appointedd_list_resources" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it List resources (the staff members, rooms or equipment that bookings are made for): name, assigned service ids and resource group ids. Page with `next`. GET /resources.
Annotations the server declares
- title: List resources
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
appointedd_list_service_categoriesList service categories (id and name).Reads text others writeNo findings
Why it is in this group
- The name "appointedd_list_service_categories" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it List service categories (id and name). Page with `next`. GET /services/categories.
Annotations the server declares
- title: List service categories
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
appointedd_list_servicesList services (what can be booked): name, category, durations and prices, buffers, occupancy and booking type.Reads text others writeNo findings
Why it is in this group
- The name "appointedd_list_services" says "list": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it List services (what can be booked): name, category, durations and prices, buffers, occupancy and booking type. Page with `next`. GET /services.
Annotations the server declares
- title: List services
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
40 paths in this server alone from private data, through text someone else wrote, to a way out. Denying 1 outbound tool breaks every one.
- Reads private data2
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write20
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- appointedd_cancel_booking
- appointedd_cancel_booking_customer
- appointedd_create_booking
- appointedd_create_customer
- appointedd_create_reservation
- appointedd_find_available_dates
- appointedd_find_available_intervals
- appointedd_get_customer
- appointedd_get_reservation
- appointedd_get_service
- appointedd_get_service_category
- appointedd_list_bookings
- and 8 more
- Can send data out1
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
{
"permissions": {
"deny": [
"mcp__appointedd__appointedd_create_customer"
]
}
}Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Findings
Matches of fixed checks, with the text they matched.
No check matched anything in these tool definitions. That is not a safety guarantee.
History
Changes to its tool definitions and to its remote endpoint, newest first.
No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.
Install
Pinned to version 1.0.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http appointedd https://appointedd.usefulapi.io/mcpclaude mcp add --transport http appointedd https://appointedd.usefulapi.io/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__appointedd__appointedd_list_bookings",
"mcp__appointedd__appointedd_list_customers",
"mcp__appointedd__appointedd_get_customer",
"mcp__appointedd__appointedd_list_resources",
"mcp__appointedd__appointedd_list_resource_groups",
"mcp__appointedd__appointedd_list_services",
"mcp__appointedd__appointedd_get_service",
"mcp__appointedd__appointedd_list_service_categories",
"mcp__appointedd__appointedd_get_service_category",
"mcp__appointedd__appointedd_find_available_intervals",
"mcp__appointedd__appointedd_find_available_dates",
"mcp__appointedd__appointedd_get_reservation"
],
"ask": [
"mcp__appointedd__appointedd_create_customer",
"mcp__appointedd__appointedd_create_reservation",
"mcp__appointedd__appointedd_create_booking"
],
"deny": [
"mcp__appointedd__appointedd_update_customer",
"mcp__appointedd__appointedd_update_booking",
"mcp__appointedd__appointedd_update_booking_customer",
"mcp__appointedd__appointedd_cancel_booking",
"mcp__appointedd__appointedd_cancel_booking_customer"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as appointedd. Review it before you use it.
Capability tags behind 20 rules
- mcp__appointedd__appointedd_list_bookings untrusted-input
- mcp__appointedd__appointedd_list_customers private-data, untrusted-input
- mcp__appointedd__appointedd_get_customer untrusted-input
- mcp__appointedd__appointedd_list_resources untrusted-input
- mcp__appointedd__appointedd_list_resource_groups untrusted-input
- mcp__appointedd__appointedd_list_services untrusted-input
- mcp__appointedd__appointedd_get_service untrusted-input
- mcp__appointedd__appointedd_list_service_categories untrusted-input
- mcp__appointedd__appointedd_get_service_category untrusted-input
- mcp__appointedd__appointedd_find_available_intervals untrusted-input
- mcp__appointedd__appointedd_find_available_dates private-data, untrusted-input
- mcp__appointedd__appointedd_get_reservation untrusted-input
- mcp__appointedd__appointedd_create_customer untrusted-input, outbound
- mcp__appointedd__appointedd_update_customer untrusted-input
- mcp__appointedd__appointedd_create_reservation untrusted-input
- mcp__appointedd__appointedd_create_booking untrusted-input
- mcp__appointedd__appointedd_update_booking untrusted-input
- mcp__appointedd__appointedd_update_booking_customer untrusted-input
- mcp__appointedd__appointedd_cancel_booking untrusted-input
- mcp__appointedd__appointedd_cancel_booking_customer untrusted-input
Pin
Keep the decision: fail CI when the tools change, follow every change, or show a badge.
Pin in CI
Fail a build when the tools you reviewed are not the tools the server serves today.
curl -s "https://anlyon.dev/api/v1/servers/io.usefulapi/appointedd/verify?hash=d059cca1faedfaa9fe0b114f8207f26428afb6d019a91c8b2a2cc56b50ef3a08" | jq -e '.changed == false'Pinned hash d059cca1faed, from Oct 26, 2026, 00:25 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/io.usefulapi/appointedd/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/io.usefulapi/appointedd)Source: MCP Registry · repository. Synced Oct 26, 2026, 00:25 UTC.