add_day_audience
ChatGPTAdd audiences to a limited day. Widens only — never removes anyone — and repeating it changes nothing. Returns a restoreToken.
add_guest
ChatGPTAdd a guest-list entry to a tour day. passes[].passId values come from list_pass_types. Returns { id }. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
add_parallel_day
ChatGPTAdd a parallel day on a date the tour already has, beside its days (a second show, a split crew); add new dates with update_tour (404 DATE_NOT_FOUND here). Optional name (≤50), typeId, location+time_zone, place_id (resolved via Google Places) and audience: isPublic false + targets = limited, false alone = admins only. Returns the day, days, and a restoreToken for undo_day_change (15 min). Needs manage-tour trust or org admin (403 MANAGE_TOUR_REQUIRED). After undo_day_change, re-adding the SAME day within ~10 minutes returns the undone day again unless you pass a new idempotency_key. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
add_tour_member
ChatGPTAttach somebody who is ALREADY in the organisation to this tour, at the seat you name (1 org admin, 2 editor, 3 viewer). Costs no paid seat, because seats are counted from organisation membership and pending invitations and not from tour membership. It does NOT add anybody new to the organisation — that is a billing decision and stays with an org admin. The person lands with the seat you give them and no memberships; set those with set_personnel_memberships and their access with set_personnel_access.
apply_schedule_template
ChatGPTCreate the template's items on a tour day. The day must belong to the template's own tour. MERGE (default) adds them alongside whatever is there; REPLACE first soft-deletes the day's existing items you may delete (the rest stay) — reversible with undo_applied_schedule_template. Returns { ids } of the created items. Private-account boundary: it copies the template's items, with their reminders and attachment links, onto a day of that tour in the connected user's own Daysync account — nothing is booked and no booking or other outside service is called on your behalf. Notifications: applying sends none; copied reminders later notify the people who can see each item (in app, plus push/email per their settings). Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
attach_file
ChatGPTAttach a file you have already uploaded to a schedule item, venue, stay or pass type. key is the value upload_file returned. This is ADDITIVE — it never touches the entity's existing attachments. It is also idempotent: attaching the same key to the same entity twice returns the first attachment and reports alreadyAttached, so a retry is safe. Only to an entity you can edit, on that tour. It checks the uploaded object in Daysync's own storage and refuses it if it is missing (an expired or unfinished upload), empty, larger than 25 MB, or of a type that is not allowed; it downloads nothing from the internet and sends no notification. Bulletins do not support attachments. Supported entityType values: schedule_item, venue, accommodation, pass_type.
attach_flight
ChatGPTAttach a searched flight to a tour day, creating the item or re-connecting an existing one. Pass ONLY the key of a search_flights option — no route, time or duration is accepted, so nothing you supply becomes trusted scheduled data. Omit itemId to create; pass it to replace an item's connection and every auto-filled value in one commit. The OWNING DAY NEVER MOVES: a day-before or day-after departure leaves the item where it is, and on a re-attach dayId is ignored in favour of the item's own day. A created item is Unconfirmed and visible to everyone on the tour. A key that no longer resolves, or departs outside the three-day window, is refused and writes NOTHING. The TITLE is rewritten only when the item is not already wearing one a human gave it, so read the returned name; data.replaceManualValues: true is the only way past that rule. It also fills the Flight Information fields Airline and Flight number under that same rule. Returns the item id, the code and that title; the legs it wrote are in the text content, and get_flight_legs reads them back. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
calculate_drive_route
ChatGPTCalculate a drive's arrival time, duration and distance for a given vehicle and set of avoided road types. Persists nothing and is safe to repeat. THREE outcomes to distinguish: (1) a normal result; (2) noRouteFound=true, a DEFINITE answer that no road route exists for this vehicle — do not retry, change the vehicle or the avoids; (3) a non-empty constraintViolations, meaning the route is usable but the provider could NOT honour something you asked for — never present this as a clean success.
clear_date
ChatGPTReset a date: every day on it is removed and one fresh, empty, public day replaces them; the date's name is cleared. 403 HIDDEN_DAYS_ON_DATE when a day on it is hidden from you. Returns the new day and a restoreToken for undo_day_change (15 min).
clear_day
ChatGPTEmpty a day's schedule: soft-deletes the schedule items on it that you may delete; others stay. The day, its venues, stays and guest lists are kept. Returns affectedItemCount and a restoreToken for undo_day_change (15 min).
clear_flight
ChatGPTRemove the link AND every value the flight filled in — route, times, timezones, airline, duration, all legs and any layovers — leaving an empty flight ready to search again. The title reverts to the placeholder ONLY if it is still the one the lookup wrote; a typed title is kept, so read the returned name. DESTRUCTIVE and not reversible; use disconnect_flight to keep the values. The Airline and Flight number rows go too, unless a human edited them, and the item is left with no legs at all. Notes, tags, reminders and attachments are NOT touched. Safe to repeat.
confirm_all_schedule_items
ChatGPTMark every schedule item on a day as confirmed. Returns the ids that were previously unconfirmed or had no status, so the change can be undone.
create_accommodation
ChatGPTCreate an accommodation stay. CAMELCASE ids (tourId/dayId); check-in/out are epoch-millisecond numbers; formatted_address needs geometry.location + geometry.viewport. Audience: aims says who it is for; see the field for the rules. Any create ending with NO audience is PUBLIC to the permission ladder and needs the Public permission — that includes isAdminsOnly, which is a no-audience create — so a selected-parties editor must name their own scope in aims. visibilityList still works. isAdminsOnly does not round-trip: the item reads back is_admin_only: false, and it is visible to you and to anyone with See-everything sight. Returns { id, name }. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
create_bulletin
ChatGPTCreate a bulletin on a tour day (dayId only — the tour is resolved from the day). Content field is "body". Returns { bulletin_id }. Notifications: without scheduledFor it is posted at once, its audience sees it in the app, and this call sends no notification for it — hasNotification takes effect only with scheduledFor. With a future scheduledFor it stays hidden until then, and if hasNotification is true Daysync then notifies its audience (in app, plus push/email per their settings), not you. A scheduledFor already in the past is refused (400) when hasNotification is true; with hasNotification false it is posted at once without a notification. Private-account boundary: the connected user's own Daysync tour; no outside service is called on your behalf. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
create_key_contact
ChatGPTAdd a person to the organization's key-contact book, then link them to a venue or stay with set_venue_key_contacts / set_stay_key_contacts. Returns { id, ... }. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
create_open_role
ChatGPTCreate an open role — a seat on the roster with nobody in it, so counts, coverage and aims are right before the hire lands. A seat carries places in the structure and NO access whatsoever: whoever fills it starts at own/none with every toggle off. Repeating this call creates a second seat.
create_pass_type
ChatGPTCreate a guest-list pass type on a tour. day_ids are the days it applies to. Audience: aims says who it is for; see the field for the rules. Any create ending with NO audience is PUBLIC to the permission ladder and needs the Public permission — that includes isAdminOnly (note the singular), which is a no-audience create — so a selected-parties editor must name their own scope in aims. visibilityList still works. isAdminOnly (note the singular) does not round-trip: the item reads back is_admin_only: false, and it is visible to you and to anyone with See-everything sight. Permission: an org admin, or a tour member whose editMode is not none and who holds the guests permission (public for a no-audience create, as above). Returns { id }. Private-account boundary: a pass type is a guest-list category (such as AAA or Guest) on a tour in the connected user's own Daysync account — no ticket is issued, sold or printed, no ticketing or other outside service is called on your behalf, and no notification is sent. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
create_room
ChatGPTAdd a room to a stay. roomType comes from list_reference_types (hotelRoomTypes); dates and times are epoch milliseconds. generalNotes and confirmationNumber are required by the API — pass "" if empty. Returns { id, name }. Private-account boundary: it writes a room record on a stay in the connected user's own Daysync account — no hotel booking or reservation is made and no booking or other outside service is called on your behalf. Notifications: unless hasNotification is false, Daysync sends a room-assignment notification (in app, plus push/email per their settings) to everyone who can see this stay — org admins included, and occupants unless the stay is sealed without naming them — but not to you; an unchanged retry within the idempotency window does not send it again. Send hasNotification: false to suppress it. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
create_schedule_item
ChatGPTCreate a schedule item on a tour day. Times are HH:mm time-of-day strings (NOT ISO — the date comes from day_id); travel items (type 2–6) require origin. Audience: aims says who it is for; see the field for the rules. Any create ending with NO audience is PUBLIC to the permission ladder and needs the Public permission — that includes isAdminsOnly, which is a no-audience create — so a selected-parties editor must name their own scope in aims. visibilityList still works. isAdminsOnly does not round-trip: the item reads back is_admin_only: false, and it is visible to you and to anyone with See-everything sight. Returns { id, route_stale, route_computed_at } — plus reminders with their server-generated ids when the request sent a reminder list. Private-account boundary: it writes a schedule entry on a tour in the connected user's own Daysync account. A flight, hotel or transfer item is a record only — nothing is booked, bought or reserved, no booking or other outside service is called on your behalf, and attachment links are stored, not downloaded. Notifications: the create itself sends none; each reminder later notifies the people who can see the item (in app, plus push/email per their settings). Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
create_schedule_items
ChatGPTCreate MANY schedule items in one call — use this instead of looping create_schedule_item when adding a set of items. Same body shape per item, aims included — each item carries its own audience. Returns { ids } in request order. All or nothing: up to 1,000 items (within the 512 KB request limit) are written in one transaction, so if any item is refused none is created. Private-account boundary: the connected user's own Daysync tour; nothing is booked and no booking or other outside service is called on your behalf. Notifications: the create sends none; reminder entries notify later, as on create_schedule_item. Safe to retry unchanged within ~10 minutes (returns the original ids). Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
create_tag
ChatGPTCreate a tag on a tour. colorId is an AvatarColor id — get one from list_reference_types (group "avatarColors"). Returns the new tag. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
create_tour
ChatGPTCreate a tour with its days (at least one). Needs org_id from list_organizations and day_type_id values from list_day_types. Only org_admin users can create tours. Returns { id } — the new tour's UUID; call list_tours afterwards to get the created day ids. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
create_tour_party
ChatGPTCreate a party — the top level of a tour's structure, e.g. "Audio" or "Band". Repeating this call creates a SECOND party with the same name; read get_tour_structure first if you are unsure whether it exists.
create_tour_split
ChatGPTCreate a split — a cross-cutting group that ignores the party tree, like "Bus A" or "Early flight".
create_tour_subgroup
ChatGPTCreate a subgroup under a party. A subgroup may hold members from ANY party — joining it gives access to what it is aimed at, and to nothing else its parent party has. Set sharesToParent when items aimed at it should also be visible to the parent party (viewing only, never editing).
create_tour_vehicle
ChatGPTSave a vehicle on a tour so drives can be routed for its size, weight and speed. Units are METRIC. lengthM and trailerLengthM are stored but do NOT affect routing — the provider constrains on height, width and weight only. A trailer's height and width DO: the route is constrained by max(vehicle, trailer) for each. maxSpeedKph and avgSpeedKph DO affect the result, applied to the provider's durations afterwards rather than sent to it. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
create_venue
ChatGPTCreate a venue on a tour day. venueCategoryId is required in practice (1=commercial, 2=private). Audience: aims says who it is for; see the field for the rules. Any create ending with NO audience is PUBLIC to the permission ladder and needs the Public permission — that includes isAdminsOnly, which is a no-audience create — so a selected-parties editor must name their own scope in aims. visibility_list still works. isAdminsOnly does not round-trip: the item reads back is_admin_only: false, and it is visible to you and to anyone with See-everything sight. Returns { id }. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
delete_accommodation
ChatGPTDelete an accommodation.
delete_bulletin
ChatGPTSoft-delete a bulletin.
delete_guest
ChatGPTDelete a guest-list entry.
delete_pass_type
ChatGPTSoft-delete a pass type. WITHOUT force it is a SAFE CHECK: if any guest still holds this pass, nothing is deleted and the blocking entries come back in data.guestLists. With force:true those allocations are deleted too, and any guest left holding no pass at all is soft-deleted with them. Reversible with restore_pass_type.
delete_room
ChatGPTSoft-delete a room. Reversible with restore_room.
delete_schedule_item
ChatGPTDelete a schedule item.
delete_schedule_template
ChatGPTSoft-delete a template. Reversible with restore_schedule_template. Schedule items previously created FROM the template are not affected.
delete_structure_group
ChatGPTDelete a party, subgroup or split. Deleting a party deletes its subgroups — INCLUDING subgroups sitting under other parties — and clears the affected members' memberships; splits survive. Editing lanes and viewing grants pointing at it are removed in the same transaction. Run preview_structure_delete first. aimCascade decides what happens to items aimed at the group: keep_reach (the default) replaces the aim with the people it reached at that moment, so nobody's visibility changes; remove deletes the aim, and an item left with no aim at all enters AWAITING RE-AIM — visible only to people who can see the whole tour, NOT public, and not visible to its own creator.
delete_tag
ChatGPTPermanently delete a tag. This is a HARD delete — the tag is removed from every schedule item that carries it and cannot be restored. Check get_tag_usage first.
delete_tour
ChatGPTSoft-delete a tour.
delete_tour_vehicle
ChatGPTRetire a vehicle. Every drive using it switches to Car (default) and is marked for recalculation; the drives themselves are not deleted. Check get_vehicle_usage first to see how many are affected.
delete_venue
ChatGPTDelete a venue.
describe_operations
ChatGPTGet the exact typed input for named operations — the same JSON Schema each one carries in the tool list. On this connection (tools=all) all 151 operations it is authorised for are already advertised as their own tools with these schemas, so you only need this to re-read one. Returns each operation's full description, inputSchema, outputSchema and read/destructive/idempotent flags. Ask for at most 10 at a time.
disconnect
ChatGPTDisconnect this MCP session from its Daysync account. Use this when whoami shows the wrong account: it revokes the current session so your NEXT request prompts you to sign in again — reconnect with the correct account. Does not delete any Daysync data.
disconnect_flight
ChatGPTRemove the LINK between a flight item and the lookup, KEEPING every value it filled in so a human can edit them. Reversible and safe to repeat. NOT clear_flight: use it when the figures are right but should stop tracking the lookup. The legs survive unchanged — read them with get_flight_legs. The title is not touched at all.
export_day_sheet
ChatGPTRender one tour day as a PDF day sheet and get a short-lived download URL back. Answers { url, expiresAt, fileName, pageCount, bytes, ignoredIdCount, cached } — the URL expires, so fetch it promptly rather than storing it. Read-only: it creates nothing on the tour and changes no record (the rendered PDF is cached, nothing else is stored), so it is safe to repeat. Start with a preset (FULL, SCHEDULE or MINIMAL) and narrow it with options if needed; ids you pass that you cannot see are dropped and reported in ignoredIdCount.
fill_open_role
ChatGPTPut an existing organisation member into an open role. They inherit the seat's party, subgroups and splits — and nothing else: they land at sight own, edit none, no permissions. The previous occupant's names on sealed items do NOT transfer, because a seal names a person and never a seat. Costs no paid seat.
get_accommodation
ChatGPTGet one stay in full — including its custom fields, emails/phones/urls and visibility. list_accommodation returns a leaner projection.
get_approved_guest_count
ChatGPTTotal guests across a day's APPROVED guest-list entries — the number a day's cap is checked against. It is a SUM of party sizes, not a row count, and it is not derivable from a paged get_guest_list.
get_conversation
ChatGPTGet one channel or group chat: name, description, whether it is public/archived, and its member count.
get_day_audience_candidates
ChatGPTParties, subgroups, splits and people that could be added to a day's audience, each with how many people it would add.
get_day_sheet_data
ChatGPTRead one tour day as a print-ready day sheet MODEL: header, running order, venues, stays, consolidated key contacts, guest-list totals, bulletins and the upcoming-days strip, filtered to what you can see. Use it to decide what to include before calling export_day_sheet; the ids it returns are the ids that tool accepts. For the raw records instead, use get_tour_data.
get_day_visibility
ChatGPTWho can see a day: mode (public/limited/admins), its audiences, day and tour headcounts, whether you are on it and can manage it, and the dayRevision.
get_file
ChatGPTGet a download URL and the authoritative size/content-type for ONE file from list_files. The URL is signed and EXPIRES in about five minutes — fetch or hand it to the user straight away, and never store it or paste it into a document as a permanent link; call this again for a fresh one. Returns 404 both when the file does not exist and when the connected user is not allowed to see it, so it cannot be used to probe for files on other tours.
get_flight_legs
ChatGPTThe persisted legs of a flight item, in order, plus the code it is auto-filled from — stops, terminals, coordinates, each airport's street address and per-leg times, all UTC. flightLookupCode null means the item is manual or was disconnected. A null originFormattedAddress is usually FINAL, not pending: an airport we asked about and could not place is cached as a permanent negative and is never re-asked, so do not poll for it and never synthesise one from the name. An airport name can EQUAL its municipality (ZQN is 'Queenstown' at every provider endpoint): compare them rather than reading it as missing, and never append 'Airport'. A null airlineIcao means fall back to IATA, never derive one.
get_guest_list
ChatGPTGet the guest list for a specific tour day. Each guest includes its current pass allocation under passes ([{ passType, count }]) — read these before update_guest, which hard-replaces the whole pass set. Pass limit/offset to page large days.
get_item_aims
ChatGPTWhat an item is aimed at right now — the audience BEFORE you change it, with group identity preserved. Read this before set_item_aims: the item reads carry a flat visibilityList of the people a group aim currently REACHES, so writing that list back would turn one aim at "Crew" into twelve individual ones. It also separates the three states that all look like an empty audience: isPublic (everyone), sealed (the named list and nobody else), and awaitingReaim (a structure delete stranded it and nobody has chosen an outcome).
get_item_custom_fields
ChatGPTGet a schedule item's custom fields (its "extra info" rows).
get_message_reactions
ChatGPTList the reactions on a message, grouped by emoji with who reacted.
get_messages
ChatGPTRead a conversation's messages, NEWEST FIRST. Paging is cursor-based on message id, not offset: pass the returned nextCursor back as cursor to fetch the next (older) page. Max 100 per call. To jump to a specific message pass aroundMessageId with before/after instead. Thread replies are not in this feed — use get_thread_replies.
get_schedule
ChatGPTGet the schedule items for a specific tour day. The server returns at most 1000 items per call — for larger days pass limit/offset to page.
get_schedule_template_items
ChatGPTRead the items a template holds — times, notes, locations, attachments, reminders, travel details and visibility. Use it to see what apply_schedule_template would create.
get_stay_contacts
ChatGPTGet a stay's own emails, phone numbers and urls.
get_stay_custom_fields
ChatGPTGet a stay's custom fields.
get_stay_key_contacts
ChatGPTGet the people from the org contact book linked to a stay.
get_tag_usage
ChatGPTCount how many schedule items currently carry a tag — use before delete_tag to see what would be affected.
get_thread_replies
ChatGPTRead the replies on a threaded message, oldest first. Cursor is a message id and returns replies NEWER than it (the opposite direction to get_messages).
get_tour_data
ChatGPTLoad a whole tour in ONE call: every day with its schedule items, venues, stays, guest lists, bulletins and pass types, plus per-day counts. Prefer this over paging the per-resource endpoints day by day. Narrow it with dayIds and the per-resource limits for big tours. Because it spans several resources it needs read access to all of them (tours, schedule, venues, accommodation, guestlist, bulletins).
get_tour_personnel
ChatGPTThe tour roster: members, pending invites and open roles, each with their four settings — what they can see (own/all), how far their editing reaches (none/selected/all_visible), which kinds of thing they may edit, and whether they manage personnel. Use this before changing anyone's access. Needs the personnel-management trust on this tour (or an organisation admin role) — without it this answers 403; list_tour_members is the ungated lighter read that answers only who is on the tour.
get_tour_structure
ChatGPTThe parties, subgroups and splits of a tour, with live member counts. Parties are the top level; a subgroup belongs to one party but can hold members from any; a split is a cross-cutting group like a bus or a flight. Needs the personnel-management trust on this tour (or an organisation admin role) — without it this answers 403, and you can still aim at individual people by name using get_tour_personnel's lighter sibling list_tour_members.
get_vehicle_usage
ChatGPTCount how many drives currently route as a vehicle — use before delete_tour_vehicle to see what would be reassigned.
get_venue
ChatGPTGet one venue in full — including its custom fields, emails/phones/urls, age restriction and visibility. list_venues returns a leaner projection.
get_venue_contacts
ChatGPTGet a venue's own emails, phone numbers and urls.
get_venue_custom_fields
ChatGPTGet a venue's custom fields.
get_venue_key_contacts
ChatGPTGet the people from the org contact book linked to a venue.
invoke_operation
ChatGPTRun a Daysync operation by name. On this connection (tools=all) all 151 operations it is authorised for are also advertised as their own tools — prefer calling those directly: each carries its own read-only / destructive / open-world hints, while this dispatcher must carry the worst case of anything it can reach. operation is a name from list_capabilities; input is that operation's arguments, validated against its real schema, so a wrong shape is rejected with the expected fields rather than half-applied. Only operations your connection is authorised for are reachable; this cannot call arbitrary URLs or endpoints. Operations reported as idempotent are safe to retry: re-sending the same operation with the same input within ~10 minutes returns the original record rather than creating a second one, and passing a new idempotency_key in input forces a genuine duplicate.
is_chat_enabled
ChatGPTCheck whether chat is switched on for a tour. Call before the other chat tools — they return nothing useful on a tour with chat disabled.
list_accommodation
ChatGPTList the accommodation for a tour. Pass limit/offset to page large tours.
list_age_restrictions
ChatGPTList venue age restrictions (ageRestrictionId for create_venue/update_venue). Not part of list_reference_types. Each entry is { id, label }.
list_bulletins
ChatGPTList the bulletins for a tour. Pass limit/offset to page large tours.
list_capabilities
ChatGPTMap of everything this Daysync connection can do. This connection uses the full tool surface (tools=all): all 151 operations it is authorised for are already advertised as their own tools, so you can call any of them directly. Call it with no arguments for the domains (tours, schedule, venues, accommodation, guest list, bulletins, chat, files, organizations) and how many operations each holds; call it with domain for that domain's operation names, one-line summaries and read-only / destructive / idempotent flags. Cheap, and makes no Daysync API call.
list_conversation_members
ChatGPTList who is in a channel or group chat.
list_conversations
ChatGPTList the tour's chat channels and group chats that the user belongs to, each with its unread count and last message. 1:1 direct messages are not available through this API.
list_day_types
ChatGPTList the available day types — day_type_id values for create_tour days[] and update_tour day_list[].
list_files
ChatGPTList the files attached to a tour — across its schedule items, venues, stays and pass types — with id, name, size, which entity holds it and when it was added. Returns only files the connected user is allowed to see: a file on a private item they are not on is not listed. Narrow it with entityTypes, dayId or a file-name search, and page with limit/offset (max 200 per call). Each row's fileId is what get_file takes. Chat files are NOT here — use search_chat_files for those.
list_guestlist_requesters
ChatGPTList the tour users who can be set as a guest-list entry's requester.
list_org_key_contacts
ChatGPTList the organization's key-contact book — the people who can be linked to venues and stays.
list_organization_members
ChatGPTList the members of an organization.
list_organizations
ChatGPTList the organizations the authenticated Daysync user belongs to.
list_pass_types
ChatGPTList the guest-list pass types for a tour (pass type ids are required to add guests). Pass limit/offset to page a tour with many pass types.
list_pinned_messages
ChatGPTList a conversation's pinned messages — usually the load-in details, addresses and running order worth surfacing first.
list_recent_flight_searches
ChatGPTThe flight numbers this user recently searched on this tour — up to 5, newest first, with the airline for each. Useful for offering a repeat rather than asking for a code again. A search that found nothing is deliberately not recorded, so this list never suggests a typo back.
list_reference_types
ChatGPTLook up the id values the create/update tools require. Returns 24 reference tables in one call under data.types[] — each { name, type: [{ id, type, description }] }. Includes statusTypes, scheduleItemTypes, scheduleItemTimeTypes, scheduleItemTravelTypes, reminderTypes, avatarColors (colorId for tags and item colours), dayTypes, guestlistStatuses, pickupMethods, passMaterialTypes, venueTypes, venueCategories and hotelRoomTypes. Call once and reuse.
list_rooms
ChatGPTList a stay's rooms with their occupants and pending invites.
list_schedule_templates
ChatGPTList YOUR saved schedule templates for a tour, with how many items each holds. Templates are per-user: this never shows another member's templates. Call it before apply_schedule_template — template ids cannot be guessed.
list_stay_field_templates
ChatGPTList the premade accommodation custom-field templates — the templateKey values and their labels.
list_tags
ChatGPTList the tags defined on a tour, with their colours. Call this before set_item_tags or before passing tagIds to create_schedule_item — tag ids are per-tour and cannot be guessed.
list_tour_members
ChatGPTList the members of a tour.
list_tour_vehicles
ChatGPTList the saved vehicles on a tour, with their dimensions. Call this before calculate_drive_route to get a vehicleProfileId — ids are per-tour and cannot be guessed. Pass the same id to create_schedule_item / update_schedule_item to record which vehicle a drive's saved figures belong to. A drive with no vehicle routes as Car (default), which is not a row in this list.
list_tours
ChatGPTList tours in an organization as memberships ({ role, member_count, tour }). Returns { items, total, offset, limit, hasMore } — pages of 50 by default; pass offset (and limit) to fetch the rest when hasMore is true. Chaining: items[].tour.id is the tourId; items[].tour.tourDays[].day.id is the dayId for the schedule and guest-list tools (NOT tourDays[].id, which is the join-row id). For very large organizations pass include_days:false to replace each tour's tourDays with a day_count.
list_venue_field_templates
ChatGPTList the premade venue custom-field templates — the templateKey values and their labels/types.
list_venues
ChatGPTList the venues for a tour. Pass limit/offset to page large tours.
name_date
ChatGPTSet the name shared by every day on a date, like "Festival weekend". Null, empty or omitted clears it. Returns tourDate and a restoreToken for undo_day_change (15 min).
preview_day_visibility_change
ChatGPTChanges nothing. Shows what set_day_visibility WOULD remove: each dropped audience with its item count, totals, headcount before/after, and the dayRevision to pass to it.
preview_structure_delete
ChatGPTWhat deleting a party, subgroup or split WOULD affect — members who lose the membership, subgroups cascaded with a party (including ones under other parties), editing lanes and viewing grants removed, and items that would be left awaiting re-aim. Changes nothing. Call this before delete_structure_group so the cascade is a choice rather than a surprise.
remove_day
ChatGPTRemove one day from a date that has several. Soft: the day and its items disappear and come back with undo_day_change (restoreToken, 15 min). 409 LAST_DAY_ON_DATE for a date's only day — use clear_date. 404 DAY_NOT_FOUND also means hidden or on another tour.
remove_tour_personnel
ChatGPTRemove somebody from the tour. With keepRoleOpen the seat survives as an open role with its party, subgroups and splits — but NOT its permissions, so a replacement starts from nothing. Without it the row is removed entirely and re-adding the person later starts them from scratch. Either way their name comes off every seal on this tour, and created_by keeps pointing at them because it is audit, not access.
rename_schedule_template
ChatGPTRename a template. This is the only edit possible — a template's items are fixed when it is saved; to change them, save a new template. Returns { id }.
restore_guest
ChatGPTRestore a soft-deleted guest-list entry, with its pass allocations.
restore_pass_type
ChatGPTRestore a soft-deleted pass type, along with the guest allocations and guest-list entries that were removed with it. Refused if a live pass type in the same tour now uses its name or abbreviation — rename or delete that one first.
restore_room
ChatGPTRestore a soft-deleted room.
restore_schedule_item
ChatGPTRestore a soft-deleted schedule item.
restore_schedule_template
ChatGPTRestore a soft-deleted template, with its items.
restore_tour_vehicle
ChatGPTUndo a delete_tour_vehicle: bring the vehicle back and put its drives back on it. Safe to repeat — restoring a vehicle that is not deleted answers alreadyActive=true and changes nothing. reattachedDriveCount can be lower than the delete reported: a drive somebody edited, or pointed at another vehicle, afterwards keeps what they chose.
save_schedule_template
ChatGPTSave a set of existing schedule items as a reusable template. itemIds come from get_schedule and must ALL be on the same tour — that tour becomes the template's tour, and the template can only ever be applied to days of it. Returns { id }. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
seal_item
ChatGPTSEAL an item: from now on it is visible to the people NAMED on it and to nobody else. A seal beats every role — an organisation owner who is not named cannot see it, there is no half-view, and it is absent from every count and day sheet for everyone else. You are named automatically. An open role cannot be named; fill the role first.
search_chat
ChatGPTSearch a tour's chat history for a phrase, across every channel and group chat the user is in. Returns matches newest first with their conversation; cursor-paged by message id.
search_chat_files
ChatGPTFind files and images shared in a conversation by name.
search_flights
ChatGPTLook up a real flight by number (QF1, BA16) for a tour day and get the departures that can be attached. Searches THREE days — the day before, the day, the day after — anchored on dayId. Writes one thing: it adds the number to your recent-search list (nothing on the tour itself is touched). READ data.status FIRST: it is a string enum, NOT the boolean envelope status. OK = options found; NO_RESULTS = the code matches nothing anywhere (almost always a typo — do not retry unchanged); NOT_OPERATING = a REAL flight that does not fly on these dates, and only then does operatingWeekdays say which days it does; TAIL_NUMBER = an aircraft registration, so re-send the SAME query with treatAsFlightNumber true; INVALID_QUERY = not a flight number at all. None of the five is a failure — a provider failure is an error. data.lookupConfigured false means this environment has NO provider credential: a configuration problem, never 'no departures'. days is ALWAYS the three window dates. Each option's key goes to attach_flight verbatim; a multi-leg number offers the WHOLE service (kind SERVICE) plus EACH leg (kind LEG), and a SERVICE creates ONE item containing every leg.
search_tour_content
ChatGPTFind something on a tour when you do not know which day it is on: searches schedule items, venues, stays, guests, files and bulletins by name in one call, ranked by relevance and grouped by kind, with an exact per-kind total. Scope TOUR searches one tour; scope ORG searches every tour the user can reach in that org (never another org). Returns only what the connected user is allowed to see — a private item they are not on never appears, and that now includes bulletins, which became an aimed item type and are filtered by the same rule as the rest. Each result carries dayId + section + navigateItemId, which together locate the item. Prefer this over paging get_tour_data across days to look for something. Because it spans several resources it needs read access to all of them (tours, schedule, venues, accommodation, guestlist, bulletins).
set_day_visibility
ChatGPTSet who can see a day — the complete audience. isPublic true = everyone; false + targets = only those; false alone = admins only. Narrowing strips removed audiences from the day's items: call preview_day_visibility_change first and pass its dayRevision (409 STALE_DAY_PREVIEW otherwise). Returns a restoreToken.
set_guestlist_config
ChatGPTSet a day's guest-list configuration: total cap and whether it is enforced (send both together), whether the list is locked, the request cut-off, and per-pass-type allocation caps. Pass venue_id to configure one venue on the day instead of the day's defaults. Requires tour-admin.
set_item_aims
ChatGPTSet who an item is aimed at — the complete audience, replacing what is there. Works on a schedule item (travel included: a flight IS a schedule item), a venue, a stay or a pass type. An EMPTY aims array makes the item PUBLIC; it does not hide it. Group targets follow membership, individual ones do not, and a viewer reached by several paths gets the STRONGEST level. times_only is a schedule-item-only level that shows the real title and time and nothing else.
set_item_custom_fields
ChatGPTAdd, update or remove a schedule item's custom fields. Each entry carries its own operation, so one call can mix all three; only the fields you list are touched. When creating an item you can pass customFields inline instead.
set_item_tags
ChatGPTSet the tags on a schedule item. This REPLACES the item's whole tag set, so include every tag it should end up with (pass [] to clear). Read the current set from get_schedule (items[].schedule_item_tags). Tags must belong to the same tour.
set_personnel_access
ChatGPTSet somebody's access settings: what they can see, how far their editing reaches, which kinds of thing they may edit, whether they manage personnel, and whether they manage the tour itself (name, dates, days, day types and locations — org admins only may set that one). These are INDEPENDENT — none implies another — and permissions is a complete set, so a kind you leave out is switched off. Sight is the ceiling: nothing can be edited that cannot be seen in full. An organisation admin is pinned to full rights and cannot be reduced here.
set_personnel_memberships
ChatGPTSet which party, subgroups and splits somebody belongs to. Each list you send REPLACES what is there; omit a list to leave it alone, send [] to clear it. A null partyId is "No party yet", which is a valid permanent state.
set_seal_names
ChatGPTReplace the list of people who may see a sealed item. The list you send is the COMPLETE one — anyone omitted loses sight of the item immediately. A seal may never be left naming nobody.
set_stay_contacts
ChatGPTAdd, update or remove a stay's own emails, phone numbers and urls. Each entry carries its own operation; at least one of emails/numbers/urls must be present.
set_stay_custom_fields
ChatGPTAdd, update or remove a stay's custom fields. Each entry carries its own operation. Use templateKey (from list_stay_field_templates) for a premade field, or a title for a free-form one.
set_stay_key_contacts
ChatGPTLink or unlink org contact-book people on a stay. Only the links you list change. Create the contact first with create_key_contact.
set_venue_contacts
ChatGPTAdd, update or remove a venue's own emails, phone numbers and urls. Each entry carries its own operation; at least one of emails/numbers/urls must be present.
set_venue_custom_fields
ChatGPTAdd, update or remove a venue's custom fields. Each entry carries its own operation. Use templateKey (from list_venue_field_templates) for a premade field, or a title for a free-form one.
set_venue_key_contacts
ChatGPTLink or unlink org contact-book people on a venue. Only the links you list change. The contact must already exist — create it with create_key_contact and find ids with list_org_key_contacts.
undo_applied_schedule_template
ChatGPTUndo an apply: soft-delete the items this template created on that day. Only items stamped with this template id, and only ones you can see, are touched.
undo_day_change
ChatGPTUndo one day change with the restoreToken it returned, within 15 minutes; each token works once. 410 RESTORE_EXPIRED after the window, 409 RESTORE_CONFLICT when later edits block it.
unseal_item
ChatGPTRemove an item's seal, returning it to ordinary aim-based visibility.
update_accommodation
ChatGPTUpdate an accommodation stay. All body fields optional; tourId/dayId/daysList/subtitle are silently ignored on edit. Returns { id, name }. To change who it is for, send aims here and it is applied in the SAME transaction as the content change — omit it and the audience is left untouched, send [] to clear it and make the item public. set_item_aims does the same thing on its own when the audience is all you are changing. The legacy visibility fields on this body still replace only the LEGACY half.
update_bulletin
ChatGPTUpdate a bulletin. All body fields optional — send only what changes. Returns no data (status only). Overwrites the fields you send. Notifications: this call sends none. Only a bulletin created with a scheduledFor is ever notified, once, when that time arrives with hasNotification true (a past scheduledFor with hasNotification true is refused, 400). Until then, editing scheduledFor or hasNotification changes when — or whether — its audience is notified, even if it is already posted. A future scheduledFor also hides a posted bulletin again until that time. Private-account boundary: the connected user's own Daysync tour; no outside service is called on your behalf.
update_guest
ChatGPTUpdate a guest-list entry — send the FULL record (firstName/lastName/numberOfGuests/pickupMethodId/statusId/passes stay required on edit), not a delta. The passes array HARD-REPLACES the guest's entire pass allocation (omitted pass types are deleted), so first read the guest's current passes via get_guest_list and resend them (adjusted) — sending a partial or empty passes set wipes the rest. Returns { id }.
update_guest_statuses
ChatGPTApprove, deny or waitlist guest-list entries in bulk. Every id must belong to this tour — one foreign id rejects the WHOLE batch and changes nothing. Use this rather than looping update_guest, which requires the guest's full record.
update_key_contact
ChatGPTUpdate a person in the organization's key-contact book. Send only what changes. NOTE number/country are strings here but numbers on create — an upstream quirk.
update_pass_type
ChatGPTUpdate a pass type — send the FULL record, not a delta: name, abbv, tour_id and day_ids are all required, and day_ids REPLACES the days it applies to. Read the current values from list_pass_types first. Permission: an org admin, or a tour member whose editMode is not none, who can see the pass type and holds the guests permission (public if it is public) — a selected editor only within their lanes. Returns { id }. To change who it is for, send aims here and it is applied in the SAME transaction as the content change — omit it and the audience is left untouched, send [] to clear it and make the item public. set_item_aims does the same thing on its own when the audience is all you are changing. The legacy visibility fields on this body still replace only the LEGACY half. Overwrites: a day left out of day_ids is unlinked from the pass type (guests already given this pass for that day keep it). Private-account boundary: the connected user's own Daysync tour — no ticket is issued or sold, no ticketing or other outside service is called on your behalf, and no notification is sent.
update_personnel_details
ChatGPTUpdate somebody's job title, or an open role's name and note. Display only — none of this grants access.
update_room
ChatGPTUpdate a room. Send only what changes — but note guestList and pendingInvites together REPLACE the room's occupants: sending either one removes every existing occupant first, so guestList alone also drops the pending-invite occupants (and pendingInvites alone the users). Send both, with everyone the room should end up with. Private-account boundary: it edits a room record in the connected user's own Daysync account — no hotel booking or reservation is made or changed and no booking or other outside service is called on your behalf. Notifications: unless hasNotification is false, Daysync sends a room-update notification (in app, plus push/email per their settings) to everyone who can see this stay after the change — org admins included, and occupants unless the stay is sealed without naming them — but not to you. Send hasNotification: false to suppress it.
update_schedule_item
ChatGPTUpdate a schedule item. All body fields optional — send only what changes; tour_id and type cannot be changed. Returns { id, route_stale, route_computed_at } — plus reminders with their server-generated ids when the request sent a reminder list (keep these: a reminder re-sent without its id is added again as a new one). To change who it is for, send aims here and it is applied in the SAME transaction as the content change — omit it and the audience is left untouched, send [] to clear it and make the item public. set_item_aims does the same thing on its own when the audience is all you are changing. The legacy visibility fields on this body still replace only the LEGACY half. Overwrites: each field you send replaces the stored value (a list such as travel breaks or custom fields replaces the whole list), except attachments and reminder: a new entry is ADDED and the ones you leave out are kept, so sending them never clears the others. Private-account boundary: the connected user's own Daysync tour; nothing is booked and no booking or other outside service is called on your behalf. Notifications: this call sends none; a reminder notifies the people who can see the item at its lead time.
update_structure_group
ChatGPTRename a party, subgroup or split, or change its colour, order, or (subgroups only) whether it shares to its parent party. Send only what changes.
update_tag
ChatGPTRename a tag or change its colour. Send only the fields that change.
update_tour
ChatGPTUpdate a tour. All body fields are optional — send only what changes. day_list is ADD/UPDATE-ONLY here (day_id present = update that day, absent = add a day); days you don't mention are PRESERVED — unlike the raw API, omitting a day never deletes it. To delete days, pass their ids in delete_day_ids. Whenever you change days (day_list or delete_day_ids), also pass orgId (the org you used for list_tours) so the tour's other days can be protected. Returns no data (status only).
update_tour_vehicle
ChatGPTChange a saved vehicle. Send only the fields that change. Editing a routing dimension or a speed limit marks every drive using it for recalculation.
update_venue
ChatGPTUpdate a venue. All body fields optional — send only what changes; tour_id/day_id cannot be changed. Returns { id }. To change who it is for, send aims here and it is applied in the SAME transaction as the content change — omit it and the audience is left untouched, send [] to clear it and make the item public. set_item_aims does the same thing on its own when the audience is all you are changing. The legacy visibility fields on this body still replace only the LEGACY half.
upload_attachment
ChatGPTUpload a file by URL for attaching to a tour item. The server fetches the file at url and stores it, returning { link, fileName, fileSize }. Then pass that link as an attachment on a create/update — e.g. create_item/update_item, create_venue/update_venue, create_accommodation/update_accommodation, add_guest — via attachment: { link, fileName, fileSize } (or the plural attachments: [...]). Attachments are NOT supported on bulletins. Safe to retry: repeating this call with the same details within ~10 minutes returns the ORIGINAL record instead of creating a second one — if you get back an id you have already seen, that is what happened. To create a genuine duplicate, pass a new idempotency_key.
upload_file
ChatGPTStore a file and get back the key to attach with attach_file. Pick a source: • "content" — you HAVE the bytes: pass base64 in content plus contentType and tourId. Max 256KB; this is the only source an assistant can drive unaided. • "url" — the file is at a public https URL: pass url. The server fetches it (max 25MB, redirects not followed). No tourId needed. • "ticket" — the file is large and local to your app: pass tourId, fileName, contentType and the exact contentLength, then PUT the bytes to the returned signed URL with the returned headers EXACTLY as given. An assistant cannot do this itself. Uploading does not attach anything — call attach_file next, or pass the returned key as attachment.link on a create/update. Allowed content types: application/json, application/msword, application/pdf, application/rtf, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/vnd.openxmlformats-officedocument.presentationml.presentation, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/x-zip-compressed, application/zip, audio/aac, audio/mp4, audio/mpeg, audio/wav, audio/webm, image/bmp, image/gif, image/heic, image/heif, image/jpeg, image/jpg, image/png, image/tiff, image/vnd.microsoft.icon, image/webp, image/x-icon, text/calendar, text/csv, text/markdown, text/plain, video/mp4, video/quicktime, video/webm. Safe to retry: the "content" and "url" sources store the file exactly once — repeating the same upload within ~10 minutes returns the ORIGINAL key rather than storing a second copy. Pass a new idempotency_key to force a distinct copy. ("ticket" only mints a signature, so it stores nothing to duplicate.)
whoami
ChatGPTShow which Daysync account this MCP session is connected as — its email, name, and Cognito subject id. Use this to confirm you're acting on the RIGHT account before reading or changing data; the account here can differ from app.daysync.com. If it's the wrong account, call disconnect and reconnect.
attach_file
Claudedescribe_operations
Claudedisconnect
Claudeget_accommodation
Claudeget_file
Claudeget_guest_list
Claudeget_messages
Claudeget_schedule
Claudeget_tour_data
Claudeget_venue
Claudeinvoke_operation
Claudelist_accommodation
Claudelist_bulletins
Claudelist_capabilities
Claudelist_conversations
Claudelist_files
Claudelist_organizations
Claudelist_pass_types
Claudelist_reference_types
Claudelist_tags
Claudelist_tour_members
Claudelist_tours
Claudelist_venues
Claudesearch_tour_content
Claudeupload_file
Claudewhoami
Claude