add_favorite
ChatGPTAdd a photographer to your favorites.
cancel_booking
ChatGPTCancel an existing booking.
create_booking
ChatGPTCreate a booking draft with a photographer. Before collecting intake answers for a paid booking, check paidBookingEligibility from get_pro, get_pro_services, or get_booking_intake_questions. If canBook is false, tell the user its message clearly and stop the paid booking flow. Do not call it INVALID_ARGUMENT or blame the user's answers. Offer another pro; do not suggest the website as a workaround for verification. Eligibility is not confirmed availability or pro acceptance. No payment is taken here: the draft is held until expiresAt and the user must pay the deposit themselves at checkoutUrl in theCam. The booking request only exists once get_booking_draft_status reports paid, and it is confirmed only after the pro accepts it. intakeAnswers is required in practice: first call get_booking_intake_questions with the same photographerId and services (optionally passing your intakeAnswers to check them without creating anything), and ask the user every required question. Every booking requires: "deliverables" (What kind of deliverables do you need?; multi_select, required; choices ["Edited Files","RAW Files (unedited)","Photo Album","Other"]). A JSON-encoded array of choices, sent as a string (not a raw array); pick at least one. If the user picks "Other", also set otherText to their description. Encoding example: {"questionId":"deliverables","value":"[\"Edited Files\",\"RAW Files (unedited)\"]"}. Ask the user every required intake question, and offer the optional ones, before calling create_booking. Never infer, guess or pick defaults for answers — including deliverables. Send each answer as { questionId, value } with value always a string: select → one choice exactly as listed; multi_select → a JSON-encoded array string such as "[\"Edited Files\",\"Photo Album\"]" (not a raw array); boolean → "true" or "false"; number → a numeric string; text → free text. If the user picks "Other", also send otherText with their own description. Idempotency: generate a fresh idempotencyKey (e.g. a UUID) for each new action. If a call's outcome is uncertain (timeout, dropped connection), retry with the SAME key and the exact same arguments. If you change any argument — including after a validation error — use a NEW key; a key is bound to the arguments it was first used with.
create_review
ChatGPTLeave a review for a photographer after a completed booking.
dispute_booking
ChatGPTOpen a dispute for a booking awaiting delivery review.
get_booking
ChatGPTGet details of a specific booking.
get_booking_draft_status
ChatGPTCheck a booking draft created by create_booking: pending_payment (open checkoutUrl in theCam to pay), processing (payment submitted, not yet confirmed), paid (deposit paid and the booking request exists — bookingId is set; the pro still has to accept it) or expired. No payment details are returned.
get_booking_intake_questions
ChatGPTRead-only. Before collecting intake answers for a paid booking, check paidBookingEligibility from get_pro, get_pro_services, or get_booking_intake_questions. If canBook is false, tell the user its message clearly and stop the paid booking flow. Do not call it INVALID_ARGUMENT or blame the user's answers. Offer another pro; do not suggest the website as a workaround for verification. Eligibility is not confirmed availability or pro acceptance. Lists every intake question a booking of these services must answer — the universal questions plus each service category's own — with exact questionId, type, required flag, choices, value encoding and an encoding example. Pass intakeAnswers to check them without creating anything; the result then includes validation.problems. For a package booking, pass the package's parent service. Every booking requires: "deliverables" (What kind of deliverables do you need?; multi_select, required; choices ["Edited Files","RAW Files (unedited)","Photo Album","Other"]). A JSON-encoded array of choices, sent as a string (not a raw array); pick at least one. If the user picks "Other", also set otherText to their description. Encoding example: {"questionId":"deliverables","value":"[\"Edited Files\",\"RAW Files (unedited)\"]"}. Ask the user every required intake question, and offer the optional ones, before calling create_booking. Never infer, guess or pick defaults for answers — including deliverables. Send each answer as { questionId, value } with value always a string: select → one choice exactly as listed; multi_select → a JSON-encoded array string such as "[\"Edited Files\",\"Photo Album\"]" (not a raw array); boolean → "true" or "false"; number → a numeric string; text → free text. If the user picks "Other", also send otherText with their own description.
get_messages
ChatGPTGet message history from a conversation.
get_pro
ChatGPTGet detailed profile of a specific photographer or videographer. Before collecting intake answers for a paid booking, check paidBookingEligibility from get_pro, get_pro_services, or get_booking_intake_questions. If canBook is false, tell the user its message clearly and stop the paid booking flow. Do not call it INVALID_ARGUMENT or blame the user's answers. Offer another pro; do not suggest the website as a workaround for verification. Eligibility is not confirmed availability or pro acceptance. For work samples, call get_pro_portfolio with this result's userId. UI presentation: Default to text for general pro questions, discovery, pricing and availability answers. Render UI only when presenting a specific resolved professional, when the user explicitly asks to see images, or when presenting a curated short list. Never render more than four profiles across all UI tool calls in a single response; do not split a larger list into multiple galleries. Use view=compact by default: horizontal profile photo, name, services offered and short bio. Use view=full only for selected professionals when the user expresses clear interest (for example, tell me more about this one), asks for more information, or requests portfolio images. Do not infer interest from a generic pro question or repeat unchanged cards on factual follow-ups. Keep larger result sets in text and offer to narrow them. Never substitute Markdown image galleries to bypass these limits. Image attribution: Only use exact image URLs returned by theCam MCP tools for a photographer's profile or work; preserve the URLs unchanged. Never use web search or image search, stock images, generated images, or substitute images for profiles or their work. Keep each image tied to its returned photographer ID (userId in search_pros/get_pro; proId in get_pro_portfolio), even when display names match. Label profileImageUrl as a profile photo, not a portfolio/work sample; label portfolio images as work by the returned owner. Never mix images between photographers. If an image is missing or cannot render, provide a labeled source link using a returned URL when available, or say the image is unavailable; never invent a URL or replace the image. To show profile photos or portfolio work in ChatGPT, call render_pro_gallery with up to four returned pro IDs. Its embedded UI renders authoritative photos; do not substitute Markdown image links for the gallery.
get_pro_availability
ChatGPTCheck availability calendar for a photographer.
get_pro_portfolio
ChatGPTGet portfolio images and deliverables from a photographer. The returned proId and displayName identify the owner of the portfolio array. UI presentation: Default to text for general pro questions, discovery, pricing and availability answers. Render UI only when presenting a specific resolved professional, when the user explicitly asks to see images, or when presenting a curated short list. Never render more than four profiles across all UI tool calls in a single response; do not split a larger list into multiple galleries. Use view=compact by default: horizontal profile photo, name, services offered and short bio. Use view=full only for selected professionals when the user expresses clear interest (for example, tell me more about this one), asks for more information, or requests portfolio images. Do not infer interest from a generic pro question or repeat unchanged cards on factual follow-ups. Keep larger result sets in text and offer to narrow them. Never substitute Markdown image galleries to bypass these limits. Image attribution: Only use exact image URLs returned by theCam MCP tools for a photographer's profile or work; preserve the URLs unchanged. Never use web search or image search, stock images, generated images, or substitute images for profiles or their work. Keep each image tied to its returned photographer ID (userId in search_pros/get_pro; proId in get_pro_portfolio), even when display names match. Label profileImageUrl as a profile photo, not a portfolio/work sample; label portfolio images as work by the returned owner. Never mix images between photographers. If an image is missing or cannot render, provide a labeled source link using a returned URL when available, or say the image is unavailable; never invent a URL or replace the image. To show profile photos or portfolio work in ChatGPT, call render_pro_gallery with up to four returned pro IDs. Its embedded UI renders authoritative photos; do not substitute Markdown image links for the gallery.
get_pro_reviews
ChatGPTGet reviews and ratings for a photographer.
get_pro_services
ChatGPTList services offered by a photographer (shooting types, packages). Before collecting intake answers for a paid booking, check paidBookingEligibility from get_pro, get_pro_services, or get_booking_intake_questions. If canBook is false, tell the user its message clearly and stop the paid booking flow. Do not call it INVALID_ARGUMENT or blame the user's answers. Offer another pro; do not suggest the website as a workaround for verification. Eligibility is not confirmed availability or pro acceptance.
list_bookings
ChatGPTList your bookings as a client or photographer.
list_conversations
ChatGPTList your active chat conversations.
list_favorites
ChatGPTList photographers you have favorited.
open_support_request
ChatGPTOpen a support ticket.
remove_favorite
ChatGPTRemove a photographer from your favorites.
render_pro_gallery
ChatGPTUI presentation: Default to text for general pro questions, discovery, pricing and availability answers. Render UI only when presenting a specific resolved professional, when the user explicitly asks to see images, or when presenting a curated short list. Never render more than four profiles across all UI tool calls in a single response; do not split a larger list into multiple galleries. Use view=compact by default: horizontal profile photo, name, services offered and short bio. Use view=full only for selected professionals when the user expresses clear interest (for example, tell me more about this one), asks for more information, or requests portfolio images. Do not infer interest from a generic pro question or repeat unchanged cards on factual follow-ups. Keep larger result sets in text and offer to narrow them. Never substitute Markdown image galleries to bypass these limits. Read-only authoritative profile cards. Pass 1–4 exact proIds from discovery; never supply invented profile data. Full cards include public portfolio, services/packages and posted weekly hours, which are not confirmed bookable slots. Unavailable/non-public pros are omitted.
search_pros
ChatGPTSearch photographers and videographers by location (text or lat/lng). Returns public, eligible pros (portfolio media boosts ranking but is not required). Bounded: query ≤ 100 chars, radius 1–100 miles, limit ≤ 50, at most 300 candidates ranked per request; page with cursor. UI presentation: Default to text for general pro questions, discovery, pricing and availability answers. Render UI only when presenting a specific resolved professional, when the user explicitly asks to see images, or when presenting a curated short list. Never render more than four profiles across all UI tool calls in a single response; do not split a larger list into multiple galleries. Use view=compact by default: horizontal profile photo, name, services offered and short bio. Use view=full only for selected professionals when the user expresses clear interest (for example, tell me more about this one), asks for more information, or requests portfolio images. Do not infer interest from a generic pro question or repeat unchanged cards on factual follow-ups. Keep larger result sets in text and offer to narrow them. Never substitute Markdown image galleries to bypass these limits. Image attribution: Only use exact image URLs returned by theCam MCP tools for a photographer's profile or work; preserve the URLs unchanged. Never use web search or image search, stock images, generated images, or substitute images for profiles or their work. Keep each image tied to its returned photographer ID (userId in search_pros/get_pro; proId in get_pro_portfolio), even when display names match. Label profileImageUrl as a profile photo, not a portfolio/work sample; label portfolio images as work by the returned owner. Never mix images between photographers. If an image is missing or cannot render, provide a labeled source link using a returned URL when available, or say the image is unavailable; never invent a URL or replace the image. To show profile photos or portfolio work in ChatGPT, call render_pro_gallery with up to four returned pro IDs. Its embedded UI renders authoritative photos; do not substitute Markdown image links for the gallery.
send_message
ChatGPTSend a message in a conversation.
start_chat
ChatGPTStart a new conversation with a photographer.
whoami
ChatGPTGet your authenticated user profile and session info.