ProhostAI MCP
Vendor MCP268 toolsOAuth 2.1/DCRCustomer SupportAutomationProhostAI is an AI-powered property management platform for Airbnb hosts and property managers, offering AI guest messaging, task/cleaning automation...
ProhostAI MCP connector
-
Install the SDK
Section titled “Install the SDK”Terminal window npm install @scalekit-sdk/nodeTerminal window pip install scalekit -
Set your credentials
Section titled “Set your credentials”Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret> -
Authorize and make your first call
Section titled “Authorize and make your first call”quickstart.ts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENV_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'prohostaimcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize ProhostAI MCP:', link)process.stdout.write('Press Enter after authorizing...')await new Promise(r => process.stdin.once('data', r))// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'prohostaimcp_drive_list',toolInput: {},})console.log(result)quickstart.py import osfrom scalekit.client import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENV_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "prohostaimcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize ProhostAI MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="prohostaimcp_drive_list",connection_name=connection_name,identifier=identifier,)print(result)
What you can do
Section titled “What you can do”Connect this agent connector to let your agent:
- Photo upload place, upload contact — Return a presigned PUT URL for uploading a place photo to S3
- Image upload guidebook — Return a presigned PUT URL for uploading a guidebook image to S3
- Attachment upload cleaning — Register one or more attachment URLs on a cleaning
- Update workflow, upgrade option, task checklist — Update an existing automation workflow in place
- Dates unblock, block — Unblock (mark available) a list of dates on a listing’s calendar
- Checklist translate task — Translate a task checklist to a target language
Tool list
Section titled “Tool list”Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.
prohostaimcp_add_cleaning_checklist_item#Add a new item to a cleaning checklist.6 params
Add a new item to a cleaning checklist.
checklist_idstringrequiredThe unique identifier of the checklist to add an item to.cleaning_idstringrequiredThe unique identifier of the cleaning job the checklist belongs to.titlestringrequiredThe title of the new checklist item.orderstringoptionalThe sort order for this item within the checklist.photo_requiredbooleanoptionalWhether the cleaner must submit a photo to mark this item complete.reference_photo_urlstringoptionalA reference photo URL showing what this item should look like when done correctly.prohostaimcp_add_cleaning_comment#Add a comment on a cleaning.2 params
Add a comment on a cleaning.
cleaning_idstringrequiredThe unique identifier of the cleaning job to comment on.contentstringrequiredThe text content of the comment.prohostaimcp_add_place_tag#Attach a listing tag to a place (idempotent).2 params
Attach a listing tag to a place (idempotent).
listing_tag_idstringrequiredThe unique identifier of the listing tag to attach to the place.place_idstringrequiredThe unique identifier of the place to tag.prohostaimcp_add_pricing_override#Upsert a single date-specific price override on PriceLabs. ``date`` is an ISO date; ``price`` and ``min_stay`` are optional (at least one should be supplied). ``reason`` is short free-form context — the reason recorded in PriceLabs is built deterministically as '<price> — requested by host via ProhostAI (<reason>)' so the PL UI always shows the applied price and attribution. Returns a structured ``pricelabs_not_authoritative`` error (mirroring the REST 409) when PriceLabs is not the authoritative price writer for this listing — map the listing to PriceLabs first (it becomes authoritative once linked).6 params
Upsert a single date-specific price override on PriceLabs. ``date`` is an ISO date; ``price`` and ``min_stay`` are optional (at least one should be supplied). ``reason`` is short free-form context — the reason recorded in PriceLabs is built deterministically as '<price> — requested by host via ProhostAI (<reason>)' so the PL UI always shows the applied price and attribution. Returns a structured ``pricelabs_not_authoritative`` error (mirroring the REST 409) when PriceLabs is not the authoritative price writer for this listing — map the listing to PriceLabs first (it becomes authoritative once linked).
datestringrequiredThe ISO date (YYYY-MM-DD) to set a price override for.listing_idstringrequiredThe unique identifier of the listing to add a price override for.currencystringoptionalThe currency code for the override price.min_staystringoptionalThe minimum stay (in nights) required for this date. Optional if price is supplied.pricestringoptionalThe nightly price to set for this date. Optional if min_stay is supplied.reasonstringoptionalShort free-form context for the override, recorded in PriceLabs for attribution.prohostaimcp_approve_approval_request#Approve a pending approval request that an external agent filed, on behalf of the account owner/admin you are authenticated as. Only requests with `source: external` can be decided here — the agent then performs its own action and the decision reaches it on the `agent.approval_resolved` webhook. Requests filed by in-app AI employees or by autopilot (a drafted guest reply) are refused with `not_externally_decidable`: approving one sends a message or spends money in-app, so it must be decided in the ProhostAI app where the card is rendered. Requires the `approvals:decide` scope, which an AI-employee credential can never hold — an agent may not approve its own asks. Read the request with `get_approval_request` first; approving is not reversible.1 param
Approve a pending approval request that an external agent filed, on behalf of the account owner/admin you are authenticated as. Only requests with `source: external` can be decided here — the agent then performs its own action and the decision reaches it on the `agent.approval_resolved` webhook. Requests filed by in-app AI employees or by autopilot (a drafted guest reply) are refused with `not_externally_decidable`: approving one sends a message or spends money in-app, so it must be decided in the ProhostAI app where the card is rendered. Requires the `approvals:decide` scope, which an AI-employee credential can never hold — an agent may not approve its own asks. Read the request with `get_approval_request` first; approving is not reversible.
approval_idstringrequiredThe id of the approval request to approve.prohostaimcp_ask_ai_question#Ask ProhostAI's Ask AI assistant a question about this account (properties, reservations, guests, operations) and get its answer. Pass `session_id` from a previous call to continue the same conversation with context; omit it to start a new chat session. Turns are credit-metered against the account's AI subscription/credits and can take a while on tool-heavy questions. Requires the `ai_chat:write` scope.2 params
Ask ProhostAI's Ask AI assistant a question about this account (properties, reservations, guests, operations) and get its answer. Pass `session_id` from a previous call to continue the same conversation with context; omit it to start a new chat session. Turns are credit-metered against the account's AI subscription/credits and can take a while on tool-heavy questions. Requires the `ai_chat:write` scope.
questionstringrequiredThe question to ask the Ask AI assistant.session_idstringoptionalSession id from a previous call to continue that conversation. Omit to start a new chat session.prohostaimcp_assign_cleaning#Assign or unassign the primary cleaner on a cleaning. Pass ``cleaner_id=null`` (omit the argument) to unassign.2 params
Assign or unassign the primary cleaner on a cleaning. Pass ``cleaner_id=null`` (omit the argument) to unassign.
cleaning_idstringrequiredThe unique identifier of the cleaning to assign a cleaner to.cleaner_idstringoptionalThe unique identifier of the cleaner to assign as primary. Omit or pass null to unassign.prohostaimcp_assign_conversation#Set who owns one or more conversations. Full-array replace: the ids you pass BECOME the assignee list, so pass the complete set (an empty list unassigns everyone). Assignees must be members of the conversation's own account — AI employees included, since assigning a thread to an AI employee is how you hand it work. Re-sending the same array is a no-op that notifies nobody. Account-wide: listing-scoped API keys are rejected. A conversation that does not exist on the account, or whose account has not enabled assignment, is reported under `failed` / `skipped` rather than failing the whole call.2 params
Set who owns one or more conversations. Full-array replace: the ids you pass BECOME the assignee list, so pass the complete set (an empty list unassigns everyone). Assignees must be members of the conversation's own account — AI employees included, since assigning a thread to an AI employee is how you hand it work. Re-sending the same array is a no-op that notifies nobody. Account-wide: listing-scoped API keys are rejected. A conversation that does not exist on the account, or whose account has not enabled assignment, is reported under `failed` / `skipped` rather than failing the whole call.
assignee_user_idsarrayrequiredThe complete list of user IDs (or AI employee IDs) that should own the conversation. This replaces the existing assignee list entirely; pass an empty list to unassign everyone.conversation_idsarrayrequiredThe conversations to set the assignee list on.prohostaimcp_block_dates#Block (mark unavailable) a list of dates on a listing's calendar. Sugar over `update_calendar_days` with `available=false` — dispatched asynchronously via the listing's OTA.2 params
Block (mark unavailable) a list of dates on a listing's calendar. Sugar over `update_calendar_days` with `available=false` — dispatched asynchronously via the listing's OTA.
datesarrayrequiredThe dates to block on the listing's calendar.listing_idstringrequiredThe unique identifier of the listing to block dates on.prohostaimcp_bulk_assign_listing_tags#Assign every tag in `tag_ids` to every listing in `listing_ids`.2 params
Assign every tag in `tag_ids` to every listing in `listing_ids`.
listing_idsarrayrequiredThe listings to assign the tags to.tag_idsarrayrequiredThe tags to assign to the listings.prohostaimcp_bulk_create_tasks#Create many tasks in ONE call, each optionally with its own subtasks. Use this for punch lists — a property walkthrough, an inspection report, a meeting's action items — instead of calling create_task in a loop. Up to 100 tasks per call. Apply shared values (listing_id, priority, category, assignee_ids, due_date) by repeating them on each entry. Entries are independent: a bad entry is reported in `failed` with its index and the rest are still created, so retry only the failed indices — re-sending a created entry makes a duplicate task.1 param
Create many tasks in ONE call, each optionally with its own subtasks. Use this for punch lists — a property walkthrough, an inspection report, a meeting's action items — instead of calling create_task in a loop. Up to 100 tasks per call. Apply shared values (listing_id, priority, category, assignee_ids, due_date) by repeating them on each entry. Entries are independent: a bad entry is reported in `failed` with its index and the rest are still created, so retry only the failed indices — re-sending a created entry makes a duplicate task.
tasksarrayrequiredArray of task objects to create in one call, up to 100. Each object accepts the same fields as create_task (title required; description, priority, category, listing_id, assignee_ids, due_date, source optional).prohostaimcp_bulk_delete_expenses#Delete multiple expenses by ID. Max 100 IDs; missing/foreign IDs appear in `failed`.1 param
Delete multiple expenses by ID. Max 100 IDs; missing/foreign IDs appear in `failed`.
expense_idsarrayrequiredThe expenses to delete (max 100).prohostaimcp_bulk_remove_listing_tags#Remove every tag in `tag_ids` from every listing in `listing_ids`.2 params
Remove every tag in `tag_ids` from every listing in `listing_ids`.
listing_idsarrayrequiredThe listings to remove the tags from.tag_idsarrayrequiredThe tags to remove from each listing.prohostaimcp_bulk_update_conversations#Apply the same patch (e.g. ``{"ai_muted": true}``) to many conversations. Account-wide — listing-scoped API keys are rejected. Works on conversations in your account and on connected-teams merged threads in your inbox scope — ProhostAI-Support threads you participate in included — but for a merged (cross-account) thread only PER-USER fields land — thread-level flags (is_done, is_spam, is_starred, autopilot_disabled, and needs_response) are reported under ``skipped`` with reason ``cross_account_thread_level_flag_not_supported`` so a partner team's inbox state is never mutated. ``ai_muted`` is the exception and DOES land on a merged thread, matching the web app and the pause_ai / resume_ai tools, which have always written it there; on another account's ProhostAI-Support thread it is skipped with reason ``cross_account_support_thread_flag_not_supported``, because that bridge is two-sided and muting the AI would change the other side's thread. A merged ProhostAI-Support thread otherwise follows the same rule: mark-read and needs_follow_up land (both per-user), while is_done is skipped — the web tracks done-ness per user on an internal thread (plus a support-side group-done), which this bulk path does not implement, so writing the shared thread flag here would mark the customer's thread done. Use the web support inbox to resolve a support thread. ``needs_response`` goes through the shared guarded mutation: internal team-chat conversations (which track needs_response per user) and conversations with a newer needs_response update are reported under ``skipped`` instead of patched. ``needs_follow_up`` is likewise guarded, but internal team chats are patched rather than skipped — the flag lands on the acting user's per-user row (their Follow Up tab); only a conversation carrying a newer follow-up update is reported under ``skipped``.2 params
Apply the same patch (e.g. ``{"ai_muted": true}``) to many conversations. Account-wide — listing-scoped API keys are rejected. Works on conversations in your account and on connected-teams merged threads in your inbox scope — ProhostAI-Support threads you participate in included — but for a merged (cross-account) thread only PER-USER fields land — thread-level flags (is_done, is_spam, is_starred, autopilot_disabled, and needs_response) are reported under ``skipped`` with reason ``cross_account_thread_level_flag_not_supported`` so a partner team's inbox state is never mutated. ``ai_muted`` is the exception and DOES land on a merged thread, matching the web app and the pause_ai / resume_ai tools, which have always written it there; on another account's ProhostAI-Support thread it is skipped with reason ``cross_account_support_thread_flag_not_supported``, because that bridge is two-sided and muting the AI would change the other side's thread. A merged ProhostAI-Support thread otherwise follows the same rule: mark-read and needs_follow_up land (both per-user), while is_done is skipped — the web tracks done-ness per user on an internal thread (plus a support-side group-done), which this bulk path does not implement, so writing the shared thread flag here would mark the customer's thread done. Use the web support inbox to resolve a support thread. ``needs_response`` goes through the shared guarded mutation: internal team-chat conversations (which track needs_response per user) and conversations with a newer needs_response update are reported under ``skipped`` instead of patched. ``needs_follow_up`` is likewise guarded, but internal team chats are patched rather than skipped — the flag lands on the acting user's per-user row (their Follow Up tab); only a conversation carrying a newer follow-up update is reported under ``skipped``.
conversation_idsarrayrequiredList of conversation IDs to apply the patch to.patchobjectrequiredFields to patch on each conversation, e.g. {"ai_muted": true}. Supported keys include ai_muted, is_done, is_spam, is_starred, autopilot_disabled, needs_response, and needs_follow_up — see the tool description for per-field behavior on merged and cross-account threads.prohostaimcp_bulk_update_expenses#Update a common set of fields across multiple expenses in one call. `updates` is the same shape as `update_expense` (minus `expense_id`). Expenses not owned by the account appear in `failed`. Max 100 IDs.2 params
Update a common set of fields across multiple expenses in one call. `updates` is the same shape as `update_expense` (minus `expense_id`). Expenses not owned by the account appear in `failed`. Max 100 IDs.
expense_idsarrayrequiredThe expenses to update (max 100).updatesobjectrequiredFields to apply to every expense, using the same shape as update_expense minus expense_id.prohostaimcp_cancel_scheduled_message#Cancel a scheduled message that has not yet been sent. Returns an error if the message is already sent / failed / cancelled. Idempotent on MCP request id.2 params
Cancel a scheduled message that has not yet been sent. Returns an error if the message is already sent / failed / cancelled. Idempotent on MCP request id.
conversation_idstringrequiredThe conversation the scheduled message belongs to.scheduled_message_idstringrequiredThe scheduled message to cancel.prohostaimcp_check_missing_custom_fields#For a set of field keys, return which listings (under a tag or an explicit ID list) don't have a value for them in the merged hierarchy. Useful for validating tag-scoped guidebook references before saving.3 params
For a set of field keys, return which listings (under a tag or an explicit ID list) don't have a value for them in the merged hierarchy. Useful for validating tag-scoped guidebook references before saving.
field_keysarrayrequiredThe custom-field keys to check for missing values.listing_idsstringoptionalRestrict the check to this explicit list of listing IDs.tag_idstringoptionalRestrict the check to listings assigned to this tag.prohostaimcp_classify_bank_transaction#AI-suggest the best expense category for a Plaid bank transaction. Combines fuzzy text matching over the account's expense categories with an LLM pick. Read-only — suggests a category id + a ranked candidate shortlist; makes no changes and needs no confirmation. Use the suggested category_id with create_expense_from_transaction.1 param
AI-suggest the best expense category for a Plaid bank transaction. Combines fuzzy text matching over the account's expense categories with an LLM pick. Read-only — suggests a category id + a ranked candidate shortlist; makes no changes and needs no confirmation. Use the suggested category_id with create_expense_from_transaction.
transaction_idstringrequiredThe unique identifier of the Plaid bank transaction to classify.prohostaimcp_classify_ramp_transaction#AI-suggest the best expense category for a Ramp corporate-card transaction. Combines fuzzy text matching over the account's expense categories with an LLM pick. Read-only — suggests a category id + a ranked candidate shortlist; makes no changes and needs no confirmation. Use the suggested category_id with create_expense_from_ramp_transaction.1 param
AI-suggest the best expense category for a Ramp corporate-card transaction. Combines fuzzy text matching over the account's expense categories with an LLM pick. Read-only — suggests a category id + a ranked candidate shortlist; makes no changes and needs no confirmation. Use the suggested category_id with create_expense_from_ramp_transaction.
transaction_idstringrequiredThe unique identifier of the Ramp corporate-card transaction to classify.prohostaimcp_community_create_post#Post into a community lounge as the acting user's pseudonymous community profile. The body is rendered as plain text — newlines are preserved, markdown is NOT rendered — and is limited to 5000 characters. Joins the lounge first by default (idempotent; set join_first=false to post without joining). The user's credentials must satisfy the lounge's eligibility rule. Rate-limited to 5 posts per minute. Requires the `community:write` scope.3 params
Post into a community lounge as the acting user's pseudonymous community profile. The body is rendered as plain text — newlines are preserved, markdown is NOT rendered — and is limited to 5000 characters. Joins the lounge first by default (idempotent; set join_first=false to post without joining). The user's credentials must satisfy the lounge's eligibility rule. Rate-limited to 5 posts per minute. Requires the `community:write` scope.
bodystringrequiredPlain-text post body. Newlines are preserved, markdown is not rendered. Limited to 5000 characters.lounge_slugstringrequiredSlug of the community lounge to post into. Use community_list_lounges to find valid slugs.join_firstbooleanoptionalWhether to join the lounge first if not already a member. Idempotent; set to false to post without joining.prohostaimcp_community_list_lounges#List every community lounge with the acting user's standing in each: slug, name, kind, emoji, member count, whether the user has joined, and whether their credentials make them eligible. Also returns the user's pseudonymous community handle — every join and post is attributed to that handle, never their real name. Call this before community_create_post to pick a valid lounge slug. Requires the `community:read` scope.0 params
List every community lounge with the acting user's standing in each: slug, name, kind, emoji, member count, whether the user has joined, and whether their credentials make them eligible. Also returns the user's pseudonymous community handle — every join and post is attributed to that handle, never their real name. Call this before community_create_post to pick a valid lounge slug. Requires the `community:read` scope.
prohostaimcp_configure_ai_employee#Update an existing AI employee. Only the provided fields are written.12 params
Update an existing AI employee. Only the provided fields are written.
agent_idstringrequiredThe id of the AI employee to configure.avatar_emojistringoptionalAn emoji to use as the employee's avatar. Omit or leave null to leave unchanged.confidence_thresholdstringoptionalMinimum confidence score (0-100) required before the employee acts autonomously. Omit or leave null to leave unchanged.goalsstringoptionalNew list of goals for the AI employee, replacing the existing list. Omit or leave null to leave unchanged.heartbeat_enabledstringoptionalWhether proactive heartbeat runs are enabled for this employee. Omit or leave null to leave unchanged.heartbeat_interval_secondsstringoptionalHow often, in seconds, the employee runs proactive heartbeat checks. Omit or leave null to leave unchanged.namestringoptionalNew name for the AI employee. Omit or leave null to leave unchanged.proactivenessstringoptionalHow proactively the employee should act. Omit or leave null to leave unchanged.reports_to_agent_idstringoptionalThe id of the AI employee this employee reports to. Omit or leave null to leave unchanged.responsibilitiesstringoptionalNew list of responsibilities for the AI employee, replacing the existing list. Omit or leave null to leave unchanged.system_promptstringoptionalNew system prompt for the AI employee. Omit or leave null to leave unchanged.titlestringoptionalNew job title for the AI employee. Omit or leave null to leave unchanged.prohostaimcp_create_ai_employee#Create a brand-new custom AI employee (not from a template). It is created inactive.5 params
Create a brand-new custom AI employee (not from a template). It is created inactive.
namestringrequiredThe AI employee's name.system_promptstringrequiredThe system prompt defining the AI employee's role and behavior.goalsstringoptionalA list of goals for the AI employee. Omit or leave null for none.responsibilitiesstringoptionalA list of responsibilities for the AI employee. Omit or leave null for none.titlestringoptionalThe AI employee's job title. Omit or leave null for no title.prohostaimcp_create_ai_employee_trigger#Wire an event trigger to an AI employee.6 params
Wire an event trigger to an AI employee.
agent_idstringrequiredThe id of the AI employee to wire the trigger to.trigger_typestringrequiredThe type of event that fires this trigger.cooldown_secondsintegeroptionalMinimum number of seconds between successive firings of this trigger.descriptionstringoptionalWhat the trigger is for. This text is injected into the prompt of every run the trigger fires, so on a 'schedule' trigger it is the routine's instructions. Omit or leave null for none.enabledbooleanoptionalWhether the trigger is active immediately after creation.namestringoptionalA display name for the trigger. Omit or leave null for none.prohostaimcp_create_approval_request#File an approval request for a proposed action that needs human sign-off — use this BEFORE performing anything risky or irreversible (sending payments, cancelling reservations, bulk changes, external side effects). The request appears on the customer's home page and as an interactive card in their team chat; a team member approves or rejects it there. The decision arrives on your webhook subscription as `agent.approval_requested` → `agent.approval_resolved` events, or poll `get_approval_request`. Requires a paired agent identity (an agent-pairing API key) and the `approvals:write` scope. `proposed_action` is a JSON object describing exactly what you intend to do if approved; keep it complete enough for a human to judge.5 params
File an approval request for a proposed action that needs human sign-off — use this BEFORE performing anything risky or irreversible (sending payments, cancelling reservations, bulk changes, external side effects). The request appears on the customer's home page and as an interactive card in their team chat; a team member approves or rejects it there. The decision arrives on your webhook subscription as `agent.approval_requested` → `agent.approval_resolved` events, or poll `get_approval_request`. Requires a paired agent identity (an agent-pairing API key) and the `approvals:write` scope. `proposed_action` is a JSON object describing exactly what you intend to do if approved; keep it complete enough for a human to judge.
proposed_actionobjectrequiredA JSON object describing exactly what you intend to do if approved; keep it complete enough for a human to judge.titlestringrequiredA short human-readable title for the approval request.action_kindstringoptionalThe category of action being proposed.descriptionstringoptionalAdditional context or justification for the proposed action. Omit or leave null for none.risk_levelstringoptionalThe risk level of the proposed action.prohostaimcp_create_cleaning#Schedule a new cleaning job for a listing. Datetimes are ISO-8601.6 params
Schedule a new cleaning job for a listing. Datetimes are ISO-8601.
listing_idstringrequiredThe unique identifier of the listing to schedule the cleaning for.scheduled_ends_atstringrequiredThe ISO-8601 datetime the cleaning is scheduled to end.scheduled_starts_atstringrequiredThe ISO-8601 datetime the cleaning is scheduled to start.titlestringrequiredA short title for the cleaning job.descriptionstringoptionalFree-form notes about the cleaning job.typestringoptionalThe type of cleaning job.prohostaimcp_create_cleaning_checklist#Create a new checklist on a cleaning.4 params
Create a new checklist on a cleaning.
cleaning_idstringrequiredThe unique identifier of the cleaning job to add a checklist to.titlestringrequiredThe title of the new checklist.descriptionstringoptionalAn optional description for the checklist.itemsstringoptionalOptional initial list of item objects to create on the checklist.prohostaimcp_create_contact#Create a new contact record on the account.7 params
Create a new contact record on the account.
first_namestringrequiredThe contact's first name.companystringoptionalThe contact's company.emailstringoptionalThe contact's email address.last_namestringoptionalThe contact's last name.notesstringoptionalFree-text notes about the contact.phonestringoptionalThe contact's phone number.rolestringoptionalThe contact's role.prohostaimcp_create_expense_category#Create a new custom expense category for the account.1 param
Create a new custom expense category for the account.
namestringrequiredThe name of the new expense category.prohostaimcp_create_expense_from_ramp_transaction#Create an expense from a Ramp corporate-card transaction and reconcile the transaction onto it. CONFIRMATION-GATED: call with confirm=false (default) first to get a preview of the proposed expense; only call with confirm=true after the host approves. On confirm it creates the Expense (name, amount, date, category, listing) and sets the transaction's expense_id. The created expense carries the category + listing the accounting-push tool needs.5 params
Create an expense from a Ramp corporate-card transaction and reconcile the transaction onto it. CONFIRMATION-GATED: call with confirm=false (default) first to get a preview of the proposed expense; only call with confirm=true after the host approves. On confirm it creates the Expense (name, amount, date, category, listing) and sets the transaction's expense_id. The created expense carries the category + listing the accounting-push tool needs.
transaction_idstringrequiredThe unique identifier of the Ramp corporate-card transaction to create an expense from.category_idstringoptionalThe expense category ID to assign to the created expense.confirmbooleanoptionalSet to true to actually create the expense; when false (default), returns a preview of the proposed expense without creating it.listing_idstringoptionalThe listing ID to associate with the created expense.namestringoptionalName/description for the created expense.prohostaimcp_create_expense_from_transaction#Create an expense from a Plaid bank transaction and reconcile the transaction onto it. CONFIRMATION-GATED: call with confirm=false (default) first to get a preview of the proposed expense; only call with confirm=true after the host approves. On confirm it creates the Expense (name, amount, date, category, listing) and sets the transaction's expense_id. The created expense carries the category + listing the accounting-push tool needs.5 params
Create an expense from a Plaid bank transaction and reconcile the transaction onto it. CONFIRMATION-GATED: call with confirm=false (default) first to get a preview of the proposed expense; only call with confirm=true after the host approves. On confirm it creates the Expense (name, amount, date, category, listing) and sets the transaction's expense_id. The created expense carries the category + listing the accounting-push tool needs.
transaction_idstringrequiredThe unique identifier of the Plaid bank transaction to create the expense from.category_idstringoptionalThe expense category id to assign. Defaults to null; use classify_bank_transaction to get a suggested category_id.confirmbooleanoptionalSet to true to actually create the expense. Defaults to false, which returns a preview only.listing_idstringoptionalThe listing id to associate with the created expense. Defaults to null.namestringoptionalThe name to give the created expense. Defaults to null.prohostaimcp_create_guest#Create a new guest record on the account.11 params
Create a new guest record on the account.
first_namestringrequiredThe guest's first name.addressstringoptionalThe guest's street address.citystringoptionalThe guest's city.countrystringoptionalThe guest's country.emailstringoptionalThe guest's email address.last_namestringoptionalThe guest's last name.notesstringoptionalFree-text notes about the guest.phonestringoptionalThe guest's phone number.photo_urlstringoptionalURL of the guest's photo.postal_codestringoptionalThe guest's postal code.tagsstringoptionalTags to associate with the guest.prohostaimcp_create_guidebook#Create a new guidebook attached to a listing. Does NOT seed default sections.4 params
Create a new guidebook attached to a listing. Does NOT seed default sections.
listing_idstringrequiredThe unique identifier of the listing to attach the guidebook to.titlestringrequiredThe title of the guidebook.default_languagestringoptionalThe default language locale for the guidebook.descriptionstringoptionalAn optional description of the guidebook.prohostaimcp_create_guidebook_section#Create a guidebook-scoped section.8 params
Create a guidebook-scoped section.
guidebook_idstringrequiredThe unique identifier of the guidebook to add the section to.section_typestringrequiredThe type of section.titlestringrequiredThe title of the section.contentstringoptionalThe body content of the section.iconstringoptionalAn icon identifier for the section. Omit or leave null for no icon.parent_idstringoptionalThe unique identifier of a parent section, to nest this section under it. Omit or leave null for a top-level section.positionstringoptionalThe sort position of the section among its siblings. Omit or leave null to append at the end.unlock_before_checkinstringoptionalNumber of hours before check-in that this section unlocks for the guest. Omit or leave null to have no lock.prohostaimcp_create_listing#Create a new manual property listing. Thin wrapper over the REST POST /v1/listings endpoint. Supports manual listings only — OTA-backed listings must be created via OTA connection sync.15 params
Create a new manual property listing. Thin wrapper over the REST POST /v1/listings endpoint. Supports manual listings only — OTA-backed listings must be created via OTA connection sync.
titlestringrequiredThe title of the listing.addressstringoptionalThe street address of the listing.citystringoptionalThe city the listing is located in.countrystringoptionalThe country the listing is located in.currencystringoptionalThe currency code used for the listing's pricing.descriptionstringoptionalA description of the listing.internal_titlestringoptionalAn internal-only title for the listing, not shown to guests.latstringoptionalThe latitude coordinate of the listing.lngstringoptionalThe longitude coordinate of the listing.max_guestsstringoptionalThe maximum number of guests the listing accommodates.num_bathroomsstringoptionalThe number of bathrooms.num_bedroomsstringoptionalThe number of bedrooms.num_bedsstringoptionalThe number of beds.postal_codestringoptionalThe postal/ZIP code of the listing.timezonestringoptionalThe IANA timezone for the listing.prohostaimcp_create_listing_tag#Create a new listing tag on the account.5 params
Create a new listing tag on the account.
namestringrequiredThe name of the new tag.tag_typestringrequiredThe type of tag to create.colorstringoptionalOptional color for the tag.custom_fieldsstringoptionalOptional custom field key/value pairs to store on the tag.iconstringoptionalOptional icon identifier for the tag.prohostaimcp_create_memory#Create a new memory in the property knowledge base. `scope` is one of `listing` (requires `listing_id`), `all_listings`, or `listing_group` (requires `listing_tag_id`). Keys bound to an AI employee always create INTERNAL memories — `is_internal` is forced true so the memory can inform a guest-facing reply but is never quoted to a guest verbatim.5 params
Create a new memory in the property knowledge base. `scope` is one of `listing` (requires `listing_id`), `all_listings`, or `listing_group` (requires `listing_tag_id`). Keys bound to an AI employee always create INTERNAL memories — `is_internal` is forced true so the memory can inform a guest-facing reply but is never quoted to a guest verbatim.
contentstringrequiredThe memory's text content.scopestringrequiredOne of listing (requires listing_id), all_listings, or listing_group (requires listing_tag_id).is_internalbooleanoptionalWhether this memory is internal-only (never quoted to a guest verbatim). Forced true for keys bound to an AI employee.listing_idstringoptionalRequired when scope is listing; the ID of the listing this memory applies to.listing_tag_idstringoptionalRequired when scope is listing_group; the ID of the listing tag/group this memory applies to.prohostaimcp_create_message_template#Create a message template. ``type`` is one of ``booking_confirmed``, ``check_in``, ``checkout``, ``recurring_weekly``. ``time_offset_minutes`` is signed: NEGATIVE fires BEFORE the event (e.g. -60 = one hour before check-in), positive after, 0 at the event. For ``check_in`` / ``checkout`` templates, a reservation booked AFTER the computed send time is silently skipped unless ``send_if_past_due=True``. Set ``apply_to_existing_reservations=True`` to also schedule messages for already-existing reservations with future events (otherwise the template only applies to reservations booked from now on).13 params
Create a message template. ``type`` is one of ``booking_confirmed``, ``check_in``, ``checkout``, ``recurring_weekly``. ``time_offset_minutes`` is signed: NEGATIVE fires BEFORE the event (e.g. -60 = one hour before check-in), positive after, 0 at the event. For ``check_in`` / ``checkout`` templates, a reservation booked AFTER the computed send time is silently skipped unless ``send_if_past_due=True``. Set ``apply_to_existing_reservations=True`` to also schedule messages for already-existing reservations with future events (otherwise the template only applies to reservations booked from now on).
messagestringrequiredMessage body to send. Use placeholders such as {guest_first_name} — see list_conversation_message_variables for the full list of valid placeholders.titlestringrequiredInternal title for the message template (not shown to guests).typestringrequiredTemplate trigger type. One of booking_confirmed, check_in, checkout, or recurring_weekly.apply_to_existing_reservationsbooleanoptionalIf true, also schedule messages for already-existing reservations with future events. If false, the template only applies to reservations booked from now on.day_of_weekstringoptionalFor recurring_weekly templates, the day of week to send on.is_enabledbooleanoptionalWhether the template is active and will schedule messages.listing_idsstringoptionalListing IDs this template applies to. Omit or leave null to apply to all listings.max_nightsstringoptionalOnly apply this template to reservations with at most this many nights.min_nightsstringoptionalOnly apply this template to reservations with at least this many nights.past_due_delay_minutesintegeroptionalMinutes to delay a past-due send when send_if_past_due is true.send_if_past_duebooleanoptionalFor check_in / checkout templates, if true the message still sends even when the reservation was booked after the computed send time (otherwise it is silently skipped).time_of_daystringoptionalFor recurring_weekly templates, the time of day to send at (24-hour HH:MM).time_offset_minutesstringoptionalMinutes relative to the check-in/checkout event when the message should send. Negative fires before the event (e.g. -60 = one hour before), positive fires after, 0 fires at the event.prohostaimcp_create_owner#Create a new property owner on the account. Optionally pass ``listing_ids`` to assign existing listings to the new owner in the same call.15 params
Create a new property owner on the account. Optionally pass ``listing_ids`` to assign existing listings to the new owner in the same call.
emailstringrequiredEmail address of the property owner.namestringrequiredFull name of the property owner.address_line1stringoptionalFirst line of the owner's mailing address.address_line2stringoptionalSecond line of the owner's mailing address (apartment, suite, etc.).citystringoptionalCity of the owner's mailing address.commission_ratestringoptionalCommission rate charged to this owner.commission_typestringoptionalHow the commission is calculated (e.g. percentage or flat_fee).company_namestringoptionalCompany name associated with the property owner, if applicable.countrystringoptionalCountry of the owner's mailing address.listing_idsstringoptionalExisting listing IDs to assign to the new owner.notesstringoptionalFree-form internal notes about the owner.phonestringoptionalPhone number of the property owner.postal_codestringoptionalPostal or ZIP code of the owner's mailing address.state_provincestringoptionalState or province of the owner's mailing address.tax_idstringoptionalTax identification number (e.g. SSN or EIN) for the owner.prohostaimcp_create_owner_statement#Create a new owner statement covering ``[from_date, to_date]``.19 params
Create a new owner statement covering ``[from_date, to_date]``.
from_datestringrequiredStart date of the statement period (ISO 8601).owner_idstringrequiredThe unique identifier of the owner this statement is for.titlestringrequiredTitle of the owner statement.to_datestringrequiredEnd date of the statement period (ISO 8601).invoice_numberstringoptionalInvoice number to associate with the statement.logostringoptionalURL or reference to a logo image to display on the statement.notesstringoptionalFree-form notes to include on the statement.property_manager_addressstringoptionalProperty manager's mailing address to display on the statement.property_manager_emailstringoptionalProperty manager's email to display on the statement.property_manager_namestringoptionalProperty manager's name to display on the statement.property_manager_phonestringoptionalProperty manager's phone number to display on the statement.property_manager_tax_numberstringoptionalProperty manager's tax identification number to display on the statement.property_owner_addressstringoptionalProperty owner's mailing address to display on the statement.property_owner_emailstringoptionalProperty owner's email to display on the statement.property_owner_namestringoptionalProperty owner's name to display on the statement.property_owner_phonestringoptionalProperty owner's phone number to display on the statement.property_owner_tax_numberstringoptionalProperty owner's tax identification number to display on the statement.rental_activity_display_typestringoptionalHow rental activity line items are displayed on the statement.statusstringoptionalStatus of the statement (e.g. draft, sent, paid).prohostaimcp_create_place#Create a new place on the account.10 params
Create a new place on the account.
namestringrequiredThe name of the place.addressstringoptionalThe street address of the place.descriptionstringoptionalA free-text description of the place.google_place_idstringoptionalThe associated Google Place ID, if this place was created from a Google Places lookup.latitudestringoptionalThe latitude coordinate of the place.listing_tag_idsstringoptionalList of listing tag IDs to attach to the place upon creation.longitudestringoptionalThe longitude coordinate of the place.phonestringoptionalThe place's contact phone number.photo_urlstringoptionalURL of a photo representing the place.website_urlstringoptionalThe place's website URL.prohostaimcp_create_saved_reply#Create a saved reply (canned message).4 params
Create a saved reply (canned message).
messagestringrequiredMessage body inserted when this saved reply is used.titlestringrequiredTitle of the saved reply, shown in the saved-reply picker.categorystringoptionalCategory to group this saved reply under.shortcutstringoptionalText shortcut that expands to this saved reply.prohostaimcp_create_suggestion#Create an AI message-suggestion draft on a guest conversation. Nothing is sent — the host reviews the draft in the ProhostAI inbox (the AI-suggestion modal) and can send, edit, or dismiss it. Not supported on internal team-chat conversations. The draft anchors on the conversation's latest message. If a draft already exists there, the call is rejected (with the existing draft under `existing`) unless `replace_existing=true` is passed; use `list_suggestions` to review existing drafts first. A scheduled/paused autopilot reply is always rejected regardless of `replace_existing`.3 params
Create an AI message-suggestion draft on a guest conversation. Nothing is sent — the host reviews the draft in the ProhostAI inbox (the AI-suggestion modal) and can send, edit, or dismiss it. Not supported on internal team-chat conversations. The draft anchors on the conversation's latest message. If a draft already exists there, the call is rejected (with the existing draft under `existing`) unless `replace_existing=true` is passed; use `list_suggestions` to review existing drafts first. A scheduled/paused autopilot reply is always rejected regardless of `replace_existing`.
conversation_idstringrequiredThe unique identifier of the conversation to create the AI suggestion draft on.messagestringrequiredThe suggestion text to save as an AI draft on the conversation.replace_existingbooleanoptionalWhether to replace an existing draft suggestion on this conversation if one already exists.prohostaimcp_create_tag_section#Create a tag-scoped section. Account-wide mutation.7 params
Create a tag-scoped section. Account-wide mutation.
listing_tag_idstringrequiredThe unique identifier of the listing tag to attach the section to.titlestringrequiredThe title of the section.contentstringoptionalThe body content of the section.iconstringoptionalAn icon identifier for the section. Omit or leave null for no icon.parent_idstringoptionalThe unique identifier of a parent section, to nest this section under it. Omit or leave null for a top-level section.positionstringoptionalThe sort position of the section among its siblings. Omit or leave null to append at the end.section_typestringoptionalThe type of section.prohostaimcp_create_task#Create a new task.8 params
Create a new task.
titlestringrequiredThe title of the task.assignee_idsstringoptionalUser IDs to assign this task to.categorystringoptionalCategory to classify the task under.descriptionstringoptionalDetailed description of the task.due_datestringoptionalISO 8601 due date for the task.listing_idstringoptionalThe listing this task relates to.prioritystringoptionalPriority level for the task.sourcestringoptionalWhere this task originated from. One of review, message, or manual.prohostaimcp_create_task_checklist#Create a checklist on a task.4 params
Create a checklist on a task.
task_idstringrequiredThe unique identifier of the task to add the checklist to.titlestringrequiredTitle of the checklist.descriptionstringoptionalOptional description of the checklist.itemsstringoptionalInitial checklist items to create along with the checklist.prohostaimcp_create_task_checklist_from_template#Instantiate a task checklist from a template.2 params
Instantiate a task checklist from a template.
task_idstringrequiredThe unique identifier of the task to add the checklist to.template_idstringrequiredThe unique identifier of the checklist template to instantiate.prohostaimcp_create_upgrade_option#Create a paid upgrade option attached to a guidebook.6 params
Create a paid upgrade option attached to a guidebook.
guidebook_idstringrequiredThe unique identifier of the guidebook to attach this upgrade option to.titlestringrequiredThe title of the upgrade option.descriptionstringoptionalA description of the upgrade option.enabledbooleanoptionalWhether the upgrade option is enabled and visible to guests.pricenumberoptionalThe price of the upgrade option.upgrade_typestringoptionalThe type/scope of the upgrade option.prohostaimcp_create_webhook_subscription#Create a webhook subscription. The signing secret is returned ONCE in the response — store it securely. URL must be HTTPS. See the REST /v1/webhooks/events endpoint for the list of supported event types.3 params
Create a webhook subscription. The signing secret is returned ONCE in the response — store it securely. URL must be HTTPS. See the REST /v1/webhooks/events endpoint for the list of supported event types.
eventsarrayrequiredThe list of event types to subscribe to. See the REST /v1/webhooks/events endpoint for supported event types.urlstringrequiredThe HTTPS endpoint that will receive webhook event payloads.descriptionstringoptionalAn optional description to help identify this webhook subscription.prohostaimcp_create_workflow#Propose a NEW automation workflow. A workflow runs a fixed sequence of steps whenever its trigger fires. Because it keeps running on every future trigger, creation ALWAYS requires human approval: this validates the definition and files an approval card, returning status='pending_approval' with the approval id. The workflow is created only when a human approves the card — it is never created inline. Each step is {order, instruction, tool_name?, skill_key?, delay_seconds?}.7 params
Propose a NEW automation workflow. A workflow runs a fixed sequence of steps whenever its trigger fires. Because it keeps running on every future trigger, creation ALWAYS requires human approval: this validates the definition and files an approval card, returning status='pending_approval' with the approval id. The workflow is created only when a human approves the card — it is never created inline. Each step is {order, instruction, tool_name?, skill_key?, delay_seconds?}.
namestringrequiredThe name of the new workflow.stepsarrayrequiredThe ordered list of steps the workflow runs when triggered.trigger_typestringrequiredThe type of trigger that starts this workflow.descriptionstringoptionalAn optional description of what the workflow does.enabledbooleanoptionalWhether the workflow should be enabled immediately after approval.listing_idsstringoptionalListing IDs to scope this workflow to.trigger_configstringoptionalConfiguration object for the trigger, depending on trigger_type.prohostaimcp_crm_add_comment#Add a comment/note to a CRM object (opportunity, contact, company, or meeting).3 params
Add a comment/note to a CRM object (opportunity, contact, company, or meeting).
bodystringrequiredThe text content of the comment or note.object_idstringrequiredThe unique identifier of the CRM object to attach the comment to.object_typestringrequiredThe type of CRM object to attach the comment to (e.g. opportunity, contact, company, or meeting).prohostaimcp_crm_archive_opportunity#Archive (soft-delete) a CRM opportunity.1 param
Archive (soft-delete) a CRM opportunity.
opportunity_idstringrequiredThe unique identifier of the CRM opportunity to archive.prohostaimcp_crm_create_company#Create a CRM company (an organization).2 params
Create a CRM company (an organization).
namestringrequiredThe name of the company to create.domainstringoptionalThe company's website domain, if known.prohostaimcp_crm_create_contact#Create a CRM contact (a person).5 params
Create a CRM contact (a person).
namestringrequiredThe name of the contact.company_idstringoptionalThe company to associate with this contact.emailstringoptionalThe email address of the contact.phonestringoptionalThe phone number of the contact.titlestringoptionalThe job title of the contact.prohostaimcp_crm_create_field_definition#Define a new CRM custom field (e.g. a 'number' field on opportunities). Define the field once, then set per-object values with crm_set_custom_field.8 params
Define a new CRM custom field (e.g. a 'number' field on opportunities). Define the field once, then set per-object values with crm_set_custom_field.
field_typestringrequiredThe data type of the field (e.g. text, number, boolean, date, or select).keystringrequiredThe unique key used to reference this custom field programmatically.labelstringrequiredThe human-readable label shown for this field in the CRM UI.object_typestringrequiredThe type of CRM object this field applies to (e.g. opportunity, contact, or company).default_valuestringoptionalThe default value to use for this field when none is set.optionsstringoptionalThe list of selectable values for a 'select' type field. Not needed for other field types.pipeline_idstringoptionalRestrict this field definition to a specific pipeline, if applicable.requiredbooleanoptionalWhether this custom field must be filled in when creating or editing the CRM object.prohostaimcp_crm_create_followup#Create a follow-up task tied to a CRM opportunity.5 params
Create a follow-up task tied to a CRM opportunity.
opportunity_idstringrequiredThe unique identifier of the opportunity this follow-up task is tied to.titlestringrequiredThe title of the follow-up task.assignee_idstringoptionalThe unique identifier of the user to assign this follow-up task to. Defaults to the current user if omitted.descriptionstringoptionalAdditional details or notes about the follow-up task.due_datestringoptionalThe due date for the follow-up task, in ISO 8601 format.prohostaimcp_crm_create_opportunity#Create a CRM opportunity (a deal card) on a pipeline.7 params
Create a CRM opportunity (a deal card) on a pipeline.
pipeline_idstringrequiredThe pipeline to create the opportunity on.titlestringrequiredThe title of the opportunity.company_idstringoptionalThe company to associate with this opportunity.primary_contact_idstringoptionalThe primary contact to associate with this opportunity.stage_idstringoptionalThe pipeline stage to place the opportunity in. Defaults to the pipeline's first stage.value_amountstringoptionalThe monetary value of the opportunity.value_currencystringoptionalThe currency of the opportunity's value.prohostaimcp_crm_get_opportunity#Fetch a single CRM opportunity by id.1 param
Fetch a single CRM opportunity by id.
opportunity_idstringrequiredThe unique identifier of the CRM opportunity to fetch.prohostaimcp_crm_list_companies#List or search CRM companies (organizations) for the account.2 params
List or search CRM companies (organizations) for the account.
limitintegeroptionalMaximum number of companies to return.querystringoptionalSearch text to match against company names.prohostaimcp_crm_list_contacts#List or search CRM contacts (people) for the account.3 params
List or search CRM contacts (people) for the account.
company_idstringoptionalFilter results to contacts belonging to this company.limitintegeroptionalMaximum number of contacts to return.querystringoptionalSearch text to match against contact names, emails, or phone numbers.prohostaimcp_crm_list_field_definitions#List the account's CRM custom-field definitions, optionally filtered by object type. Use this to check whether a field already exists before creating it.1 param
List the account's CRM custom-field definitions, optionally filtered by object type. Use this to check whether a field already exists before creating it.
object_typestringoptionalFilter field definitions to only this CRM object type. Omit to list definitions for all object types.prohostaimcp_crm_list_opportunities#List or search CRM opportunities (deal cards) for the account.5 params
List or search CRM opportunities (deal cards) for the account.
limitintegeroptionalMaximum number of opportunities to return.pipeline_idstringoptionalFilter results to opportunities in this pipeline.querystringoptionalSearch text to match against opportunity titles.stage_idstringoptionalFilter results to opportunities in this pipeline stage.statusstringoptionalFilter results by opportunity status.prohostaimcp_crm_list_pipelines#List the account's CRM pipelines with their ordered stages.0 params
List the account's CRM pipelines with their ordered stages.
prohostaimcp_crm_log_meeting#Log (or book) a CRM meeting / call against a deal, contact, or company.6 params
Log (or book) a CRM meeting / call against a deal, contact, or company.
titlestringrequiredThe title of the meeting or call being logged.company_idstringoptionalThe unique identifier of the company to associate with this meeting, if any.contact_idstringoptionalThe unique identifier of the contact to associate with this meeting, if any.opportunity_idstringoptionalThe unique identifier of the opportunity to associate with this meeting, if any.outcomestringoptionalThe outcome or result of the meeting or call.summarystringoptionalA summary of what was discussed during the meeting.prohostaimcp_crm_move_opportunity#Move a CRM opportunity to a different stage (auto-closes on won/lost stages).3 params
Move a CRM opportunity to a different stage (auto-closes on won/lost stages).
opportunity_idstringrequiredThe unique identifier of the CRM opportunity to move.stage_idstringrequiredThe pipeline stage to move the opportunity to.positionintegeroptionalThe position of the opportunity within the destination stage.prohostaimcp_crm_set_custom_field#Set a custom field by key on a CRM object.4 params
Set a custom field by key on a CRM object.
keystringrequiredThe key of the custom field to set. Use crm_list_field_definitions to check existing keys.object_idstringrequiredThe unique identifier of the CRM object to set the custom field on.object_typestringrequiredThe type of CRM object the custom field belongs to (e.g. opportunity, contact, or company).valuestringoptionalThe value to set for the custom field. The accepted type depends on the field's definition (e.g. text, number, boolean, or list).prohostaimcp_crm_update_opportunity#Update fields on an existing CRM opportunity.7 params
Update fields on an existing CRM opportunity.
opportunity_idstringrequiredThe unique identifier of the CRM opportunity to update.company_idstringoptionalNew company to associate with this opportunity.lost_reasonstringoptionalReason the opportunity was lost, if applicable.primary_contact_idstringoptionalNew primary contact to associate with this opportunity.titlestringoptionalNew title for the opportunity.value_amountstringoptionalNew monetary value of the opportunity.value_currencystringoptionalNew currency for the opportunity's value.prohostaimcp_delete_ai_employee#Permanently delete a custom AI employee. The default agent cannot be deleted.1 param
Permanently delete a custom AI employee. The default agent cannot be deleted.
agent_idstringrequiredThe id of the AI employee to permanently delete.prohostaimcp_delete_ai_employee_trigger#Remove an AI employee's event trigger.1 param
Remove an AI employee's event trigger.
trigger_idstringrequiredThe unique identifier of the trigger to remove.prohostaimcp_delete_cleaning_attachment#Delete an attachment on a cleaning.2 params
Delete an attachment on a cleaning.
attachment_idstringrequiredThe unique identifier of the attachment to delete.cleaning_idstringrequiredThe unique identifier of the cleaning the attachment belongs to.prohostaimcp_delete_cleaning_checklist#Delete a checklist on a cleaning.2 params
Delete a checklist on a cleaning.
checklist_idstringrequiredThe unique identifier of the checklist to delete.cleaning_idstringrequiredThe unique identifier of the cleaning job the checklist belongs to.prohostaimcp_delete_cleaning_checklist_item#Delete a cleaning checklist item.3 params
Delete a cleaning checklist item.
checklist_idstringrequiredThe unique identifier of the checklist the item belongs to.cleaning_idstringrequiredThe unique identifier of the cleaning job the checklist item belongs to.item_idstringrequiredThe unique identifier of the checklist item to delete.prohostaimcp_delete_cleaning_comment#Delete a cleaning comment (author only).2 params
Delete a cleaning comment (author only).
cleaning_idstringrequiredThe unique identifier of the cleaning job the comment belongs to.comment_idstringrequiredThe unique identifier of the comment to delete. Only the original author can delete it.prohostaimcp_delete_contact#Delete a contact. Cascades to listing associations. Returns `{"id": ..., "success": true}` on success. Returns `{"error": ..., "code": "contact_has_records"}` when the contact is referenced by records that must be kept, such as orders.1 param
Delete a contact. Cascades to listing associations. Returns `{"id": ..., "success": true}` on success. Returns `{"error": ..., "code": "contact_has_records"}` when the contact is referenced by records that must be kept, such as orders.
contact_idstringrequiredThe unique identifier of the contact to delete.prohostaimcp_delete_contact_custom_fields#Remove the named keys from `custom_fields` on every contact in `contact_ids`.2 params
Remove the named keys from `custom_fields` on every contact in `contact_ids`.
contact_idsarrayrequiredThe contact IDs to update.field_keysarrayrequiredThe custom_fields keys to remove.prohostaimcp_delete_expense_category#Delete a custom expense category. System categories cannot be deleted.1 param
Delete a custom expense category. System categories cannot be deleted.
category_idstringrequiredThe unique identifier of the category to delete.prohostaimcp_delete_guest_custom_fields#Remove the named keys from `custom_fields` on every guest in `guest_ids`.2 params
Remove the named keys from `custom_fields` on every guest in `guest_ids`.
field_keysarrayrequiredThe custom_fields keys to remove.guest_idsarrayrequiredThe guest IDs to update.prohostaimcp_delete_guidebook_section#Delete a guidebook-scoped section.2 params
Delete a guidebook-scoped section.
guidebook_idstringrequiredThe unique identifier of the guidebook the section belongs to.section_idstringrequiredThe unique identifier of the section to delete.prohostaimcp_delete_listing_custom_fields#Batch-delete custom-field keys from listings, a tag, or the account.4 params
Batch-delete custom-field keys from listings, a tag, or the account.
field_keysarrayrequiredThe custom field keys to delete.scopestringrequiredThe layer to delete custom-field keys from: account, tag, or listing.dry_runbooleanoptionalIf true, preview the fields that would be deleted without deleting them.targetsstringoptionalThe targets to delete the fields from. Supports listing_ids, tag_ids (for scope=tag), or target_tag_id / target_tag_name / all_listings (for scope=listing).prohostaimcp_delete_listing_tag#Delete a listing tag and all of its assignments.1 param
Delete a listing tag and all of its assignments.
tag_idstringrequiredThe unique identifier of the tag to delete.prohostaimcp_delete_memory#Move a memory to the trash by ID. Soft-deleted memories stop appearing in lists and AI recall but can be restored from the app's trash. Not available to keys bound to an AI employee.1 param
Move a memory to the trash by ID. Soft-deleted memories stop appearing in lists and AI recall but can be restored from the app's trash. Not available to keys bound to an AI employee.
memory_idstringrequiredID of the memory to move to the trash.prohostaimcp_delete_message_template#Soft-delete a message template by ID. Any scheduled messages still pending from this template are cancelled asynchronously.1 param
Soft-delete a message template by ID. Any scheduled messages still pending from this template are cancelled asynchronously.
template_idstringrequiredThe unique identifier of the message template to delete.prohostaimcp_delete_owner_statement#Delete an owner statement. Returns ``{"id": ..., "success": true}`` on success.1 param
Delete an owner statement. Returns ``{"id": ..., "success": true}`` on success.
statement_idstringrequiredThe unique identifier of the owner statement to delete.prohostaimcp_delete_pin#Delete a pin.1 param
Delete a pin.
pin_idstringrequiredThe unique identifier of the pin to delete.prohostaimcp_delete_place#Delete a place; cascades to pins and tag associations.1 param
Delete a place; cascades to pins and tag associations.
place_idstringrequiredThe unique identifier of the place to delete.prohostaimcp_delete_pricing_override#Delete one or more date-specific price overrides from PriceLabs. ``dates`` is a list of ISO dates (YYYY-MM-DD).2 params
Delete one or more date-specific price overrides from PriceLabs. ``dates`` is a list of ISO dates (YYYY-MM-DD).
datesarrayrequiredThe ISO dates (YYYY-MM-DD) whose price overrides should be deleted.listing_idstringrequiredThe unique identifier of the listing to delete price overrides from.prohostaimcp_delete_reservation_custom_fields#Remove the named keys from `custom_fields` on every reservation in `reservation_ids`.2 params
Remove the named keys from `custom_fields` on every reservation in `reservation_ids`.
field_keysarrayrequiredThe custom field keys to remove.reservation_idsarrayrequiredThe reservation IDs to update.prohostaimcp_delete_saved_reply#Soft-delete a saved reply by ID.1 param
Soft-delete a saved reply by ID.
saved_reply_idstringrequiredThe unique identifier of the saved reply to delete.prohostaimcp_delete_tag_section#Move a tag-scoped section (and its sub-sections) to the trash. It disappears from every guidebook the tag renders into, and the account owner can restore it from the ProhostAI app — report it as recoverable, not permanent.1 param
Move a tag-scoped section (and its sub-sections) to the trash. It disappears from every guidebook the tag renders into, and the account owner can restore it from the ProhostAI app — report it as recoverable, not permanent.
section_idstringrequiredThe unique identifier of the tag-scoped section to delete.prohostaimcp_delete_task_checklist#Delete a checklist on a task.2 params
Delete a checklist on a task.
checklist_idstringrequiredThe unique identifier of the checklist to delete.task_idstringrequiredThe unique identifier of the task the checklist belongs to.prohostaimcp_delete_upgrade_option#Delete an upgrade option.2 params
Delete an upgrade option.
guidebook_idstringrequiredThe unique identifier of the guidebook that owns this upgrade option.upgrade_option_idstringrequiredThe unique identifier of the upgrade option to delete.prohostaimcp_delete_workflow#Delete an automation workflow. This is a soft-delete: the workflow is marked deleted and disabled so it immediately stops matching any future trigger, then external runs are cancelled in the background. Safe to call more than once — deleting an already-deleted workflow succeeds without error.1 param
Delete an automation workflow. This is a soft-delete: the workflow is marked deleted and disabled so it immediately stops matching any future trigger, then external runs are cancelled in the background. Safe to call more than once — deleting an already-deleted workflow succeeds without error.
workflow_idstringrequiredThe unique identifier of the workflow to delete.prohostaimcp_docs_append_section#Append a new heading-titled section to a doc.3 params
Append a new heading-titled section to a doc.
body_mdstringrequiredThe Markdown content of the new section body.headingstringrequiredThe heading title for the new section.path_or_idstringrequiredThe path or unique identifier of the Drive document to append the new section to.prohostaimcp_docs_read#Read a Drive document by path or id.1 param
Read a Drive document by path or id.
path_or_idstringrequiredThe path or unique identifier of the Drive document to read.prohostaimcp_docs_read_section#Read a single section of a doc by heading text.2 params
Read a single section of a doc by heading text.
headingstringrequiredThe heading text of the section to read.path_or_idstringrequiredThe path or unique identifier of the Drive document to read from.prohostaimcp_docs_write#Replace a Drive document body.2 params
Replace a Drive document body.
body_mdstringrequiredThe new document body, in Markdown, that will replace the existing content.path_or_idstringrequiredThe path or unique identifier of the Drive document to write to.prohostaimcp_docs_write_section#Replace a section's body. `heading` accepts either heading text (case-insensitive, trimmed) or a stable block ULID returned from `docs_read_section` / the docs API — the ULID path survives heading renames, while the text path only works against the current heading.3 params
Replace a section's body. `heading` accepts either heading text (case-insensitive, trimmed) or a stable block ULID returned from `docs_read_section` / the docs API — the ULID path survives heading renames, while the text path only works against the current heading.
body_mdstringrequiredThe new Markdown content that will replace the section's current body.headingstringrequiredHeading text (case-insensitive, trimmed) or a stable block ULID returned from docs_read_section. The ULID form survives heading renames; the text form only matches the current heading.path_or_idstringrequiredThe path or unique identifier of the Drive document containing the section to replace.prohostaimcp_draft_reply#Generate a non-persisting AI reply draft for a conversation. Uses the same draft-assist pipeline as the in-app Inbox suggestion UI, but does NOT write any message — returns only the suggested text. Use this to preview what the host could send; call send_message to actually deliver.2 params
Generate a non-persisting AI reply draft for a conversation. Uses the same draft-assist pipeline as the in-app Inbox suggestion UI, but does NOT write any message — returns only the suggested text. Use this to preview what the host could send; call send_message to actually deliver.
conversation_idstringrequiredThe unique identifier of the conversation to draft a reply for.instructionstringoptionalOptional instruction steering how the reply should be drafted.prohostaimcp_drive_create#Create a Drive item (folder/doc/sheet). `parent_path` is the parent folder path (use '' for root). `kind` is one of folder, doc, sheet.3 params
Create a Drive item (folder/doc/sheet). `parent_path` is the parent folder path (use '' for root). `kind` is one of folder, doc, sheet.
kindstringrequiredThe kind of Drive item to create. One of: folder, doc, sheet.namestringrequiredThe name of the new Drive item.parent_pathstringoptionalThe parent folder path. Use '' for the root folder.prohostaimcp_drive_delete#Soft-delete a Drive item by path or id.1 param
Soft-delete a Drive item by path or id.
path_or_idstringrequiredThe path or unique identifier of the Drive item to delete.prohostaimcp_drive_get#Fetch a single Drive item by path or id.1 param
Fetch a single Drive item by path or id.
path_or_idstringrequiredThe path or unique identifier of the Drive item to fetch.prohostaimcp_drive_list#List children of a Drive folder by path. Omit path for the root.1 param
List children of a Drive folder by path. Omit path for the root.
pathstringoptionalThe Drive folder path to list children for. Omit for the root folder.prohostaimcp_drive_move#Move a Drive item to a new parent (by path).2 params
Move a Drive item to a new parent (by path).
path_or_idstringrequiredThe path or unique identifier of the Drive item to move.new_parent_pathstringoptionalThe new parent folder path. Use '' to move the item to the root folder.prohostaimcp_drive_search#Search Drive items by name (case-insensitive substring).2 params
Search Drive items by name (case-insensitive substring).
qstringrequiredThe search text to match against Drive item names (case-insensitive substring).limitintegeroptionalMaximum number of results to return.prohostaimcp_edit_cleaning_comment#Edit a previously-posted cleaning comment (author only).3 params
Edit a previously-posted cleaning comment (author only).
cleaning_idstringrequiredThe unique identifier of the cleaning job the comment belongs to.comment_idstringrequiredThe unique identifier of the comment to edit. Only the original author can edit it.contentstringrequiredThe new text content for the comment.prohostaimcp_edit_message#Edit the body of a previously-sent message. Only supported on internal team chat conversations — OTA/SMS/WhatsApp/Gmail edits are blocked.3 params
Edit the body of a previously-sent message. Only supported on internal team chat conversations — OTA/SMS/WhatsApp/Gmail edits are blocked.
conversation_idstringrequiredThe conversation the message belongs to.messagestringrequiredNew message body.message_idstringrequiredThe message to edit.prohostaimcp_get_ai_chat_messages#Read the message history of one of this credential's Ask AI chat sessions, oldest first. Requires the `ai_chat:read` scope.1 param
Read the message history of one of this credential's Ask AI chat sessions, oldest first. Requires the `ai_chat:read` scope.
session_idstringrequiredThe id of the chat session to read.prohostaimcp_get_ai_employee_replies#Poll your 1:1 DM with an AI employee for messages, oldest first. Pass `since` (ISO 8601 — use the `sent_at` of the last message you've seen) to fetch only newer messages; the employee's replies have `from_agent: true`. Returns `conversation_id: null` when no DM exists yet. Requires the `agents:converse` scope.3 params
Poll your 1:1 DM with an AI employee for messages, oldest first. Pass `since` (ISO 8601 — use the `sent_at` of the last message you've seen) to fetch only newer messages; the employee's replies have `from_agent: true`. Returns `conversation_id: null` when no DM exists yet. Requires the `agents:converse` scope.
agentstringrequiredThe AI employee's id or handle whose DM thread to poll.limitintegeroptionalMaximum number of messages to return.sincestringoptionalISO 8601 timestamp; only messages sent after this time are returned. Pass the sent_at of the last message you've already seen. Omit or leave null to fetch from the start of the conversation.prohostaimcp_get_approval_request#Get one approval request by id, including its current status (pending / approved / rejected / expired), who responded, and any rejection reason. Poll this after `create_approval_request` if you are not subscribed to the `agent.approval_resolved` webhook event.1 param
Get one approval request by id, including its current status (pending / approved / rejected / expired), who responded, and any rejection reason. Poll this after `create_approval_request` if you are not subscribed to the `agent.approval_resolved` webhook event.
approval_idstringrequiredThe id of the approval request to retrieve.prohostaimcp_get_autopilot_schedule#Read the account's autopilot schedule windows — the per-weekday time ranges during which autopilot may auto-send. Returns whether scheduling is enabled, the schedule timezone, and each window's day, enabled flag, start/end (HH:MM), and whether it spans past midnight. Scheduling only takes effect when schedule_enabled is true.0 params
Read the account's autopilot schedule windows — the per-weekday time ranges during which autopilot may auto-send. Returns whether scheduling is enabled, the schedule timezone, and each window's day, enabled flag, start/end (HH:MM), and whether it spans past midnight. Scheduling only takes effect when schedule_enabled is true.
prohostaimcp_get_autopilot_settings#Read the account's autopilot (automated-messaging) configuration: the master switch, message delay, confidence + sentiment thresholds, schedule flags, and the per-category and per-channel auto-send rules.0 params
Read the account's autopilot (automated-messaging) configuration: the master switch, message delay, confidence + sentiment thresholds, schedule flags, and the per-category and per-channel auto-send rules.
prohostaimcp_get_availability#Get calendar availability for a listing over a date range.3 params
Get calendar availability for a listing over a date range.
end_datestringrequiredThe end of the date range to check, inclusive.listing_idstringrequiredThe unique identifier of the listing to check.start_datestringrequiredThe start of the date range to check, inclusive.prohostaimcp_get_bank_accounts#List bank/credit-card accounts connected via Plaid for the current account. Returns balances, mask, type/subtype, institution, and Plaid Item status (e.g. login_required). Read-only — never returns Plaid access tokens or other credential material.0 params
List bank/credit-card accounts connected via Plaid for the current account. Returns balances, mask, type/subtype, institution, and Plaid Item status (e.g. login_required). Read-only — never returns Plaid access tokens or other credential material.
prohostaimcp_get_contact_custom_fields#Return the resolved custom-field values for a contact, with provenance. Merge order: account → contact. Contact-level values win on conflict.1 param
Return the resolved custom-field values for a contact, with provenance. Merge order: account → contact. Contact-level values win on conflict.
contact_idstringrequiredThe unique identifier of the contact.prohostaimcp_get_conversation_messages#Get messages for a conversation. Returns newest first. Openable scope matches search_conversations: the caller's own account plus — when this credential resolves to a user and is not listing-scoped — the connected-team host threads the user participates in (a merged thread surfaced by search is openable here). A thread outside that scope returns {"error": "Conversation not found"} (the same not-found as a nonexistent id — never an existence oracle). For a merged ProhostAI-Support thread the support-privacy stack is applied: internal notes are side-filtered (a customer-side caller never receives a support-side note, and vice versa), and a support-employee's message renders as the single branded 'ProhostAI Support' identity (no employee name/email) for a customer-side caller; a support-team caller sees real identities.2 params
Get messages for a conversation. Returns newest first. Openable scope matches search_conversations: the caller's own account plus — when this credential resolves to a user and is not listing-scoped — the connected-team host threads the user participates in (a merged thread surfaced by search is openable here). A thread outside that scope returns {"error": "Conversation not found"} (the same not-found as a nonexistent id — never an existence oracle). For a merged ProhostAI-Support thread the support-privacy stack is applied: internal notes are side-filtered (a customer-side caller never receives a support-side note, and vice versa), and a support-employee's message renders as the single branded 'ProhostAI Support' identity (no employee name/email) for a customer-side caller; a support-team caller sees real identities.
conversation_idstringrequiredThe conversation to fetch messages for.limitintegeroptionalMaximum number of messages to return.prohostaimcp_get_dashboard_summary#Get a composite dashboard summary: today's check-ins/outs, pending tasks, and inbox counts. needs_response_count and follow_up_count are the HONEST inbox-tab badges — they mirror the web get_conversation_counts formula: not-done, not currently snoozed, non-internal base slice PLUS the caller's per-user internal (team-chat) slice (needs_response / needs_follow_up on their ConversationUserMetadata). needs_response_count = the 'Respond' badge; follow_up_count = the 'Follow Up' badge (needs_follow_up OR is_starred, with the internal arm counting per-user needs_follow_up only). Connected-teams merged visibility: when this credential resolves to a user (OAuth resource owner or the key's created_by) and is not listing-scoped, the internal slice folds in the user's team-chat threads from connected host accounts, minus agent-operational purposes. ProhostAI-Support threads ARE counted here (member hosts contribute only support; other hosts contribute support alongside their team-chat), so the badge matches search_conversations, which surfaces those threads with the support-privacy stack applied. An API-key credential with no resolved user skips the per-user internal slice (there is no single requesting user to attribute a per-user flag to), and a listing-scoped key also skips it (merged threads are listing-less). unread_conversations is a LEGACY field — COUNT(needs_response=true AND is_done=false) with NO snooze filter, NO channel filter, and NO connected-teams fan-out, so it over-counts; prefer needs_response_count. Known parity nuance (shared with the web badge): the INTERNAL (team-chat) slice of needs_response_count / follow_up_count does not apply a snooze filter, so a currently-snoozed team-chat thread still counts here even though search_conversations(..., snoozed=False) excludes it. The non-internal base slice does exclude snoozed threads.0 params
Get a composite dashboard summary: today's check-ins/outs, pending tasks, and inbox counts. needs_response_count and follow_up_count are the HONEST inbox-tab badges — they mirror the web get_conversation_counts formula: not-done, not currently snoozed, non-internal base slice PLUS the caller's per-user internal (team-chat) slice (needs_response / needs_follow_up on their ConversationUserMetadata). needs_response_count = the 'Respond' badge; follow_up_count = the 'Follow Up' badge (needs_follow_up OR is_starred, with the internal arm counting per-user needs_follow_up only). Connected-teams merged visibility: when this credential resolves to a user (OAuth resource owner or the key's created_by) and is not listing-scoped, the internal slice folds in the user's team-chat threads from connected host accounts, minus agent-operational purposes. ProhostAI-Support threads ARE counted here (member hosts contribute only support; other hosts contribute support alongside their team-chat), so the badge matches search_conversations, which surfaces those threads with the support-privacy stack applied. An API-key credential with no resolved user skips the per-user internal slice (there is no single requesting user to attribute a per-user flag to), and a listing-scoped key also skips it (merged threads are listing-less). unread_conversations is a LEGACY field — COUNT(needs_response=true AND is_done=false) with NO snooze filter, NO channel filter, and NO connected-teams fan-out, so it over-counts; prefer needs_response_count. Known parity nuance (shared with the web badge): the INTERNAL (team-chat) slice of needs_response_count / follow_up_count does not apply a snooze filter, so a currently-snoozed team-chat thread still counts here even though search_conversations(..., snoozed=False) excludes it. The non-internal base slice does exclude snoozed threads.
prohostaimcp_get_earnings_summary#Get an earnings summary for a date range. Only CONFIRMED reservations are counted — cancelled, pending, and inquiry stays are excluded, matching the app's Earnings page and the REST /v1/earnings/summary endpoint. Attribution is by stay containment (the whole stay must fall inside the range), NOT by channel payout date, so this does not reconcile line-for-line to a channel host-earnings report that pays out on check-in. `fees` breaks the total down: accommodation_fare, cleaning_fee, service_fee (guest-side channel fee), pet_fee, other_fees, taxes, discounts, refunds, host_fees (the channel's host commission) and host_payout (what you net). A null amount means no line item of that category exists on any reservation in range — never a fabricated zero. Pass `group_by_listing=true` to get the same figures per listing as well as in aggregate.4 params
Get an earnings summary for a date range. Only CONFIRMED reservations are counted — cancelled, pending, and inquiry stays are excluded, matching the app's Earnings page and the REST /v1/earnings/summary endpoint. Attribution is by stay containment (the whole stay must fall inside the range), NOT by channel payout date, so this does not reconcile line-for-line to a channel host-earnings report that pays out on check-in. `fees` breaks the total down: accommodation_fare, cleaning_fee, service_fee (guest-side channel fee), pet_fee, other_fees, taxes, discounts, refunds, host_fees (the channel's host commission) and host_payout (what you net). A null amount means no line item of that category exists on any reservation in range — never a fabricated zero. Pass `group_by_listing=true` to get the same figures per listing as well as in aggregate.
end_datestringrequiredThe end of the date range (inclusive) to summarize earnings for.start_datestringrequiredThe start of the date range (inclusive) to summarize earnings for.group_by_listingbooleanoptionalWhether to also break the totals down per listing, in addition to the aggregate figures.listing_idstringoptionalRestrict the summary to a single listing. Omit to summarize across all listings.prohostaimcp_get_guest_custom_fields#Return the resolved custom-field values for a guest, with provenance. Merge order: account -> guest. Guest-level values win on conflict.1 param
Return the resolved custom-field values for a guest, with provenance. Merge order: account -> guest. Guest-level values win on conflict.
guest_idstringrequiredThe unique identifier of the guest to fetch resolved custom fields for.prohostaimcp_get_guidebook#Get guidebook content for a listing.1 param
Get guidebook content for a listing.
listing_idstringrequiredThe unique identifier of the listing whose guidebook to retrieve.prohostaimcp_get_listing#Get a single listing by id, including title, address, capacity, and timezone.1 param
Get a single listing by id, including title, address, capacity, and timezone.
listing_idstringrequiredThe unique identifier of the listing to retrieve.prohostaimcp_get_listing_channel_urls#Return deterministic OTA URLs for a listing. Currently resolves the Airbnb URL when sourced directly from Airbnb; OTA-managed channels (Hostaway/Hospitable) require the internal management API.1 param
Return deterministic OTA URLs for a listing. Currently resolves the Airbnb URL when sourced directly from Airbnb; OTA-managed channels (Hostaway/Hospitable) require the internal management API.
listing_idstringrequiredThe unique identifier of the listing to resolve channel URLs for.prohostaimcp_get_listing_custom_fields#Resolve the merged custom-field dict for a listing using the ``account → tag → source → listing`` precedence. Set ``with_provenance=true`` to include where each value originated.2 params
Resolve the merged custom-field dict for a listing using the ``account → tag → source → listing`` precedence. Set ``with_provenance=true`` to include where each value originated.
listing_idstringrequiredThe unique identifier of the listing to resolve custom fields for.with_provenancebooleanoptionalInclude where each resolved value originated (account, tag, source, or listing).prohostaimcp_get_listing_customizations#Return a listing's PriceLabs pricing customizations — standing lead-time / rule-based settings, NOT per-date prices. Surfaces the ``last_minute_prices`` block (adjusts prices as check-in approaches) and the ``far_out_premium`` block (raises far-out dates). Read this first when pricing depends on how far ahead a booking is made, or when diagnosing flat/clamped calendar prices — a last-minute discount is silently clamped at the listing's min price (see get_listing_pricing).1 param
Return a listing's PriceLabs pricing customizations — standing lead-time / rule-based settings, NOT per-date prices. Surfaces the ``last_minute_prices`` block (adjusts prices as check-in approaches) and the ``far_out_premium`` block (raises far-out dates). Read this first when pricing depends on how far ahead a booking is made, or when diagnosing flat/clamped calendar prices — a last-minute discount is silently clamped at the listing's min price (see get_listing_pricing).
listing_idstringrequiredThe unique identifier of the listing to fetch PriceLabs pricing customizations for.prohostaimcp_get_listing_group#Get the parent/child relationships for a listing group.1 param
Get the parent/child relationships for a listing group.
listing_idstringrequiredThe unique identifier of the parent listing whose group to retrieve.prohostaimcp_get_listing_pricing#Return the current min/base/max for a listing on PriceLabs. Returns nulls when the listing has no PriceLabs counterpart yet.1 param
Return the current min/base/max for a listing on PriceLabs. Returns nulls when the listing has no PriceLabs counterpart yet.
listing_idstringrequiredThe unique identifier of the listing to fetch min/base/max pricing for.prohostaimcp_get_notification_settings#Get the acting user's complete notification preferences for the selected account: every scope array, the full category x channel delivery matrix, the AI-employee email cadence, the reminder / needs-attention sub-toggles, the per-guest-channel message matrix, and the read-only escalation reachability cap. The response carries a `help` block listing the legal values for every field. Call this before update_notification_settings on any partial change, so you can describe what is changing from what. Requires the `notifications:read` scope.0 params
Get the acting user's complete notification preferences for the selected account: every scope array, the full category x channel delivery matrix, the AI-employee email cadence, the reminder / needs-attention sub-toggles, the per-guest-channel message matrix, and the read-only escalation reachability cap. The response carries a `help` block listing the legal values for every field. Call this before update_notification_settings on any partial change, so you can describe what is changing from what. Requires the `notifications:read` scope.
prohostaimcp_get_owner#Get full details for a single owner by ID.1 param
Get full details for a single owner by ID.
owner_idstringrequiredThe unique identifier of the owner to retrieve.prohostaimcp_get_owner_statement#Get a single owner statement by ID.1 param
Get a single owner statement by ID.
statement_idstringrequiredThe unique identifier of the owner statement to retrieve.prohostaimcp_get_owner_statement_expenses#Return expense totals for the statement window, broken down per listing.1 param
Return expense totals for the statement window, broken down per listing.
statement_idstringrequiredThe unique identifier of the owner statement to retrieve expense totals for.prohostaimcp_get_owner_statement_rental_activity#Return rental-activity totals for the statement window: per-reservation and per-listing breakdowns plus aggregate totals.1 param
Return rental-activity totals for the statement window: per-reservation and per-listing breakdowns plus aggregate totals.
statement_idstringrequiredThe unique identifier of the owner statement to retrieve rental-activity totals for.prohostaimcp_get_place#Get a single place by ID.1 param
Get a single place by ID.
place_idstringrequiredThe unique identifier of the place to retrieve.prohostaimcp_get_plaid_connection_status#Get the Plaid bank connection(s) (Items) for the current account: institution, status (active / login_required / pending_expiration / pending_disconnect / error / disconnected), last-sync time, and the Plaid error code driving an unhealthy status. Read-only — never returns Plaid access tokens or other credential material.0 params
Get the Plaid bank connection(s) (Items) for the current account: institution, status (active / login_required / pending_expiration / pending_disconnect / error / disconnected), last-sync time, and the Plaid error code driving an unhealthy status. Read-only — never returns Plaid access tokens or other credential material.
prohostaimcp_get_pricelabs_listings_mapping#Return the PriceLabs ↔ ProhostAI listing mapping. Each row carries an ``eligibility`` of ``auto_matched`` (PMS id match), ``needs_attention`` (fuzzy name match — host should confirm), or ``ineligible_no_pms`` (no source_listing_id; can't bind). The PL-only listings (PriceLabs has, ProhostAI doesn't) are returned in ``pl_only``. Cached per-account for 60s on the REST side.0 params
Return the PriceLabs ↔ ProhostAI listing mapping. Each row carries an ``eligibility`` of ``auto_matched`` (PMS id match), ``needs_attention`` (fuzzy name match — host should confirm), or ``ineligible_no_pms`` (no source_listing_id; can't bind). The PL-only listings (PriceLabs has, ProhostAI doesn't) are returned in ``pl_only``. Cached per-account for 60s on the REST side.
prohostaimcp_get_pricing_neighborhood#Return PriceLabs neighborhood pricing data for a listing. PriceLabs's payload is large and not strictly typed — the raw object is returned under ``data``.1 param
Return PriceLabs neighborhood pricing data for a listing. PriceLabs's payload is large and not strictly typed — the raw object is returned under ``data``.
listing_idstringrequiredThe unique identifier of the listing to fetch neighborhood pricing data for.prohostaimcp_get_pricing_rate_plans#Return rate plans configured on PriceLabs for the listing.1 param
Return rate plans configured on PriceLabs for the listing.
listing_idstringrequiredThe unique identifier of the listing to fetch PriceLabs rate plans for.prohostaimcp_get_pricing_recommendations#Return PriceLabs recommended prices for a listing. ``date_from`` and ``date_to`` are optional ISO dates; omit them to fetch a default forward-looking window from PriceLabs.3 params
Return PriceLabs recommended prices for a listing. ``date_from`` and ``date_to`` are optional ISO dates; omit them to fetch a default forward-looking window from PriceLabs.
listing_idstringrequiredThe unique identifier of the listing to fetch PriceLabs price recommendations for.date_fromstringoptionalThe start of the date window to fetch recommendations for. Omit to use PriceLabs's default forward-looking window.date_tostringoptionalThe end of the date window to fetch recommendations for. Omit to use PriceLabs's default forward-looking window.prohostaimcp_get_property_knowledge#Get all memories (property knowledge) for a listing, grouped by scope.1 param
Get all memories (property knowledge) for a listing, grouped by scope.
listing_idstringrequiredThe unique identifier of the listing to get property knowledge for.prohostaimcp_get_ramp_cards#List corporate cards connected via Ramp for the current account. Returns display name, last four, cardholder, and card state. Read-only — never returns Ramp tokens or other credential material.0 params
List corporate cards connected via Ramp for the current account. Returns display name, last four, cardholder, and card state. Read-only — never returns Ramp tokens or other credential material.
prohostaimcp_get_ramp_connection_status#Get the Ramp connection(s) for the current account: connected business, status (active / error / disconnected), last-sync time, and — when unhealthy — how long the connection has been in error. Read-only — never returns Ramp tokens or other credential material.0 params
Get the Ramp connection(s) for the current account: connected business, status (active / error / disconnected), last-sync time, and — when unhealthy — how long the connection has been in error. Read-only — never returns Ramp tokens or other credential material.
prohostaimcp_get_reservation#Get full details for a single reservation by ID.1 param
Get full details for a single reservation by ID.
reservation_idstringrequiredThe unique identifier of the reservation to retrieve.prohostaimcp_get_reservation_custom_fields#Return the resolved custom-field values for a reservation, with provenance. Merge order: account → listing tags by specificity → reservation source → reservation. Reservation-level values win on conflict.1 param
Return the resolved custom-field values for a reservation, with provenance. Merge order: account → listing tags by specificity → reservation source → reservation. Reservation-level values win on conflict.
reservation_idstringrequiredThe unique identifier of the reservation to look up.prohostaimcp_get_workflow#Get one workflow's full definition (steps + trigger config) plus a summary of its most recent executions.2 params
Get one workflow's full definition (steps + trigger config) plus a summary of its most recent executions.
workflow_idstringrequiredThe unique identifier of the workflow to retrieve.recent_executionsintegeroptionalNumber of most recent executions to include in the summary.prohostaimcp_google_places_autocomplete#Server-side proxy to Google Places Autocomplete (v1).3 params
Server-side proxy to Google Places Autocomplete (v1).
qstringrequiredThe search text to autocomplete (e.g. a partial address or place name).near_listing_idstringoptionalOptional listing ID to bias autocomplete results toward this place's location.session_tokenstringoptionalOptional session token to group this autocomplete request with a subsequent Google Places Details call for billing purposes.prohostaimcp_google_places_details#Server-side proxy to Google Places Details (v1). Result is NOT persisted.2 params
Server-side proxy to Google Places Details (v1). Result is NOT persisted.
google_place_idstringrequiredThe Google Place ID to fetch details for (returned by google_places_autocomplete).session_tokenstringoptionalOptional session token matching the one used in the preceding google_places_autocomplete call, for billing purposes.prohostaimcp_hire_ai_employee#Hire (activate) one of the pre-built template AI employees — a launch-lineup template (pre-seeded inert on the account) or a catalog-only template (created and activated on first hire).2 params
Hire (activate) one of the pre-built template AI employees — a launch-lineup template (pre-seeded inert on the account) or a catalog-only template (created and activated on first hire).
template_keystringrequiredThe key of the template AI employee to hire.heartbeat_interval_secondsstringoptionalHow often, in seconds, the hired employee should run proactive heartbeat checks. Omit or leave null to use the default.prohostaimcp_leave_internal_note#Leave a team-only internal note on a conversation. Notes appear in the conversation timeline with an 'Internal note' badge and are NEVER delivered to the guest — this works on any channel (guest OTA/email threads included), unlike send_message. Works on conversations in your account and on connected-teams merged threads in your inbox scope (the note is posted to the connected team's account so its members see it). On a ProhostAI-Support thread a note is SIDE-PRIVATE — it reaches only one side of the support bridge — so a note on another account's support thread is written only for a first-party support credential (posted as the ProhostAI Support voice, support-side); any other credential gets support_note_side_not_supported rather than a note on the wrong side. Supports <@user_id> mentions. severity: 'act' always pushes, 'inform' is an FYI, 'log' (default) notifies nobody.4 params
Leave a team-only internal note on a conversation. Notes appear in the conversation timeline with an 'Internal note' badge and are NEVER delivered to the guest — this works on any channel (guest OTA/email threads included), unlike send_message. Works on conversations in your account and on connected-teams merged threads in your inbox scope (the note is posted to the connected team's account so its members see it). On a ProhostAI-Support thread a note is SIDE-PRIVATE — it reaches only one side of the support bridge — so a note on another account's support thread is written only for a first-party support credential (posted as the ProhostAI Support voice, support-side); any other credential gets support_note_side_not_supported rather than a note on the wrong side. Supports <@user_id> mentions. severity: 'act' always pushes, 'inform' is an FYI, 'log' (default) notifies nobody.
conversation_idstringrequiredThe unique identifier of the conversation to leave the internal note on.messagestringrequiredThe internal note text to post to the conversation timeline.severitystringoptionalThe urgency of the note: 'act' always pushes a notification, 'inform' is an FYI, 'log' (default) notifies nobody.source_namestringoptionalOptional label identifying the source or system posting the note, shown alongside the note in the timeline.prohostaimcp_link_ramp_transaction_to_expense#Link a Ramp corporate-card transaction to an existing expense for reconciliation. Both the transaction and expense must belong to the caller's account. Idempotent: re-linking the same pair returns the same status.2 params
Link a Ramp corporate-card transaction to an existing expense for reconciliation. Both the transaction and expense must belong to the caller's account. Idempotent: re-linking the same pair returns the same status.
expense_idstringrequiredThe unique identifier of the expense to link the transaction to.transaction_idstringrequiredThe unique identifier of the Ramp corporate-card transaction to link.prohostaimcp_link_transaction_to_expense#Link a bank transaction to an existing expense for reconciliation. Both the transaction and expense must belong to the caller's account. Idempotent: re-linking the same pair returns the same status.2 params
Link a bank transaction to an existing expense for reconciliation. Both the transaction and expense must belong to the caller's account. Idempotent: re-linking the same pair returns the same status.
expense_idstringrequiredThe unique identifier of the expense to link the transaction to.transaction_idstringrequiredThe unique identifier of the Plaid bank transaction to link.prohostaimcp_list_ai_chat_sessions#List this credential's Ask AI chat sessions, newest first. Use a returned session id with `ask_ai_question` to continue a conversation or `get_ai_chat_messages` to read its history. Requires the `ai_chat:read` scope.2 params
List this credential's Ask AI chat sessions, newest first. Use a returned session id with `ask_ai_question` to continue a conversation or `get_ai_chat_messages` to read its history. Requires the `ai_chat:read` scope.
limitintegeroptionalMaximum number of chat sessions to return.offsetintegeroptionalNumber of chat sessions to skip, for pagination.prohostaimcp_list_ai_employee_triggers#List the event triggers wired to an AI employee.1 param
List the event triggers wired to an AI employee.
agent_idstringrequiredThe AI employee's id whose triggers to list.prohostaimcp_list_ai_employees#List the AI employees on the account, with each one's activation state.0 params
List the AI employees on the account, with each one's activation state.
prohostaimcp_list_approval_requests#List approval requests on this account, newest first. Filter by `status` (pending / approved / rejected / expired) and/or `source` (`external` = filed by external agents like you, `ai_agent` = in-app AI employees, `autopilot` = escalated guest-reply drafts). Defaults to the 20 most recent across all statuses.3 params
List approval requests on this account, newest first. Filter by `status` (pending / approved / rejected / expired) and/or `source` (`external` = filed by external agents like you, `ai_agent` = in-app AI employees, `autopilot` = escalated guest-reply drafts). Defaults to the 20 most recent across all statuses.
limitintegeroptionalMaximum number of approval requests to return.sourcestringoptionalFilter by source: external (filed by external agents like you), ai_agent (in-app AI employees), or autopilot (escalated guest-reply drafts). Omit for all sources.statusstringoptionalFilter by status: pending, approved, rejected, or expired. Omit for all statuses.prohostaimcp_list_cleaning_attachments#List uploaded attachments on a cleaning.1 param
List uploaded attachments on a cleaning.
cleaning_idstringrequiredThe unique identifier of the cleaning to list attachments for.prohostaimcp_list_cleaning_checklists#List all checklists on a cleaning, with their items.1 param
List all checklists on a cleaning, with their items.
cleaning_idstringrequiredThe unique identifier of the cleaning job whose checklists you want to list.prohostaimcp_list_conversation_message_variables#List valid placeholders for conversation scheduled messages and message templates. Use placeholders with single curly braces, for example {guest_first_name}. Pass ``listing_id`` to also receive per-device smart-door-code tokens (``{smart_door_code:<slug>}``) for that listing's assigned smart locks.1 param
List valid placeholders for conversation scheduled messages and message templates. Use placeholders with single curly braces, for example {guest_first_name}. Pass ``listing_id`` to also receive per-device smart-door-code tokens (``{smart_door_code:<slug>}``) for that listing's assigned smart locks.
listing_idstringoptionalRestrict the returned placeholder list to a specific listing, to also include that listing's per-device smart-door-code placeholders (e.g. {smart_door_code:<slug>}). Omit to list only the generic account-wide placeholders.prohostaimcp_list_expense_categories#List expense categories for the account. System categories are created lazily on first read.0 params
List expense categories for the account. System categories are created lazily on first read.
prohostaimcp_list_guidebook_pins#List pins for a guidebook plus tag-scoped pins inherited via the guidebook's listing tags.1 param
List pins for a guidebook plus tag-scoped pins inherited via the guidebook's listing tags.
guidebook_idstringrequiredThe unique identifier of the guidebook to list pins for.prohostaimcp_list_guidebook_sections#List the guidebook-scoped sections of a guidebook.1 param
List the guidebook-scoped sections of a guidebook.
guidebook_idstringrequiredThe unique identifier of the guidebook whose sections to list.prohostaimcp_list_listing_photos#List the photos attached to a listing, ordered by the ``order`` field.1 param
List the photos attached to a listing, ordered by the ``order`` field.
listing_idstringrequiredThe unique identifier of the listing whose photos should be listed.prohostaimcp_list_listing_tags#List all listing tags on the account, optionally filtered by tag_type. Each tag carries `listing_count` (how many listings it is assigned to) and `system_key` (non-null for backend-managed tags such as 'All Listings', which cannot be renamed, deleted, or unassigned).1 param
List all listing tags on the account, optionally filtered by tag_type. Each tag carries `listing_count` (how many listings it is assigned to) and `system_key` (non-null for backend-managed tags such as 'All Listings', which cannot be renamed, deleted, or unassigned).
tag_typestringoptionalOptional tag type to filter the returned tags by.prohostaimcp_list_listings#List all listings (properties) for the account.0 params
List all listings (properties) for the account.
prohostaimcp_list_message_templates#List all message templates on the account.0 params
List all message templates on the account.
prohostaimcp_list_owner_statements#List owner statements for the account, optionally filtered by status, owner, or title search.4 params
List owner statements for the account, optionally filtered by status, owner, or title search.
limitintegeroptionalMaximum number of statements to return.owner_idstringoptionalFilter statements by owner ID.searchstringoptionalSearch statements by title text.statusstringoptionalFilter statements by status (e.g. draft, sent, paid).prohostaimcp_list_place_tags#List the listing tags attached to a place.1 param
List the listing tags attached to a place.
place_idstringrequiredThe unique identifier of the place whose tag associations to list.prohostaimcp_list_places#List the account's places with optional filters (tag, category, text search).6 params
List the account's places with optional filters (tag, category, text search).
categorystringoptionalFilter results to places in this category.has_google_idstringoptionalFilter to places that do (true) or do not (false) have an associated Google Place ID.limitintegeroptionalMaximum number of places to return.listing_tag_idstringoptionalFilter results to places tagged with this listing tag ID.offsetintegeroptionalNumber of places to skip before starting to return results, for pagination.qstringoptionalFree-text search query to filter places by name or other text fields.prohostaimcp_list_pricing_overrides#List date-specific price overrides currently set on PriceLabs for the listing.1 param
List date-specific price overrides currently set on PriceLabs for the listing.
listing_idstringrequiredThe unique identifier of the listing to list price overrides for.prohostaimcp_list_saved_replies#List all saved replies on the account.0 params
List all saved replies on the account.
prohostaimcp_list_scheduled_messages#List scheduled messages on a conversation, optionally filtered by status.3 params
List scheduled messages on a conversation, optionally filtered by status.
conversation_idstringrequiredThe conversation to list scheduled messages for.limitintegeroptionalMaximum number of scheduled messages to return.statusstringoptionalOptional status filter.prohostaimcp_list_skills#List the account's skill library (host playbooks): named, reusable procedure packs the AI follows for specific situations (e.g. early check-in requests). Returns routing metadata per skill — key, name, when-to-use description, category, enabled state, and whether it is a built-in or customized — WITHOUT bodies. Use load_skill to read one skill's full instructions.0 params
List the account's skill library (host playbooks): named, reusable procedure packs the AI follows for specific situations (e.g. early check-in requests). Returns routing metadata per skill — key, name, when-to-use description, category, enabled state, and whether it is a built-in or customized — WITHOUT bodies. Use load_skill to read one skill's full instructions.
prohostaimcp_list_suggestions#List AI suggestions / drafts for a conversation, newest first.2 params
List AI suggestions / drafts for a conversation, newest first.
conversation_idstringrequiredThe unique identifier of the conversation to list AI suggestions for.limitintegeroptionalMaximum number of suggestions to return.prohostaimcp_list_task_checklists#List all checklists on a task.1 param
List all checklists on a task.
task_idstringrequiredThe unique identifier of the task whose checklists to list.prohostaimcp_list_upgrade_options#List the upgrade options attached to a guidebook.1 param
List the upgrade options attached to a guidebook.
guidebook_idstringrequiredThe unique identifier of the guidebook whose upgrade options should be listed.prohostaimcp_list_webhook_subscriptions#List active webhook subscriptions for the account.0 params
List active webhook subscriptions for the account.
prohostaimcp_list_workflows#List automation workflows on the account. Optionally filter by status ('active' or 'paused'). Returns each workflow's trigger, schedule, and run stats.2 params
List automation workflows on the account. Optionally filter by status ('active' or 'paused'). Returns each workflow's trigger, schedule, and run stats.
limitintegeroptionalMaximum number of workflows to return.statusstringoptionalFilter workflows by status. One of 'active' or 'paused'.prohostaimcp_load_skill#Load one skill (host playbook) by key and return its full body — the host's standing instructions for that situation. Follow the returned guidance when handling matching work; it cannot grant new permissions or bypass approvals. Get keys from list_skills.1 param
Load one skill (host playbook) by key and return its full body — the host's standing instructions for that situation. Follow the returned guidance when handling matching work; it cannot grant new permissions or bypass approvals. Get keys from list_skills.
keystringrequiredThe skill key to load.prohostaimcp_mark_conversation_read#Mark a conversation's messages as read for the API user. If ``message_ids`` is omitted, all unread messages NOT sent by the user are marked. Works on conversations in your account and on connected-teams merged threads in your inbox scope — ProhostAI-Support threads you participate in included (read state is per-user, so this only affects your own unread badge).2 params
Mark a conversation's messages as read for the API user. If ``message_ids`` is omitted, all unread messages NOT sent by the user are marked. Works on conversations in your account and on connected-teams merged threads in your inbox scope — ProhostAI-Support threads you participate in included (read state is per-user, so this only affects your own unread badge).
conversation_idstringrequiredThe conversation to mark as read.message_idsstringoptionalSpecific message IDs to mark as read.prohostaimcp_message_ai_employee#Send a message to one of the account's AI employees in your 1:1 DM thread and dispatch them to work on it. `agent` is the employee's id or handle (list them with the AI-employee tools). The reply is ASYNCHRONOUS — the employee posts it back into the same DM, typically within seconds to a few minutes; poll `get_ai_employee_replies` (pass the returned `sent_at` as `since`) or subscribe to the `message.team_chat` webhook event. `run_id` is null when a dispatch guard (credit budget, billing gate, agent-chain depth, in-flight dedup) suppressed the run — the message still lands in the thread. Requires the `agents:converse` scope.2 params
Send a message to one of the account's AI employees in your 1:1 DM thread and dispatch them to work on it. `agent` is the employee's id or handle (list them with the AI-employee tools). The reply is ASYNCHRONOUS — the employee posts it back into the same DM, typically within seconds to a few minutes; poll `get_ai_employee_replies` (pass the returned `sent_at` as `since`) or subscribe to the `message.team_chat` webhook event. `run_id` is null when a dispatch guard (credit budget, billing gate, agent-chain depth, in-flight dedup) suppressed the run — the message still lands in the thread. Requires the `agents:converse` scope.
agentstringrequiredThe AI employee's id or handle to message.messagestringrequiredThe message text to send to the AI employee in your 1:1 DM thread.prohostaimcp_move_pin_scope#Move a pin between guidebook scope and tag scope. Exactly one target must be set.3 params
Move a pin between guidebook scope and tag scope. Exactly one target must be set.
pin_idstringrequiredThe unique identifier of the pin to move.target_guidebook_idstringoptionalThe guidebook to move the pin into (guidebook-scoped). Exactly one of target_guidebook_id or target_listing_tag_id must be set.target_listing_tag_idstringoptionalThe listing tag to move the pin into (tag-scoped). Exactly one of target_guidebook_id or target_listing_tag_id must be set.prohostaimcp_move_section_scope#Move a section between guidebook-scoped and tag-scoped storage. XOR target.3 params
Move a section between guidebook-scoped and tag-scoped storage. XOR target.
section_idstringrequiredThe unique identifier of the section to move.target_guidebook_idstringoptionalThe guidebook to move the section into. Provide exactly one of target_guidebook_id or target_listing_tag_id.target_listing_tag_idstringoptionalThe listing tag to move the section into. Provide exactly one of target_guidebook_id or target_listing_tag_id.prohostaimcp_pause_ai#Pause AI replies on a conversation (mutes the AI for non-@mentions).1 param
Pause AI replies on a conversation (mutes the AI for non-@mentions).
conversation_idstringrequiredThe unique identifier of the conversation to pause AI replies on.prohostaimcp_pin_place_to_guidebook#Pin a place to a guidebook (guidebook-scoped pin).5 params
Pin a place to a guidebook (guidebook-scoped pin).
categorystringrequiredThe category to file this pin under (e.g. restaurants, activities).guidebook_idstringrequiredThe unique identifier of the guidebook to pin the place to.place_idstringrequiredThe unique identifier of the place to pin.host_note_overridestringoptionalOptional host note that overrides the place's default note for this pin.positionstringoptionalOptional sort position for the pin within its category. Leave unset to append at the end.prohostaimcp_pin_place_to_tag#Pin a place to a listing tag (tag-scoped pin). Account-wide mutation.5 params
Pin a place to a listing tag (tag-scoped pin). Account-wide mutation.
categorystringrequiredThe category to file this pin under (e.g. restaurants, activities).listing_tag_idstringrequiredThe unique identifier of the listing tag to pin the place to.place_idstringrequiredThe unique identifier of the place to pin.host_note_overridestringoptionalOptional host note that overrides the place's default note for this pin.positionstringoptionalOptional sort position for the pin within its category. Leave unset to append at the end.prohostaimcp_publish_review_reply#Publish a previously-generated AI-authored review reply (an 'auto-review') to the upstream OTA. `review_id` is the auto-review's UUID — not a guest review ID. The auto-review must be in `scheduled` state; a review without a pre-generated auto-review row cannot be published here.1 param
Publish a previously-generated AI-authored review reply (an 'auto-review') to the upstream OTA. `review_id` is the auto-review's UUID — not a guest review ID. The auto-review must be in `scheduled` state; a review without a pre-generated auto-review row cannot be published here.
review_idstringrequiredThe unique identifier of the auto-review (AI-generated draft reply) to publish. This is the auto-review's UUID, not a guest review ID.prohostaimcp_publish_suggestion#Send the suggestion text (or its edited override) as a host message on the conversation. Subject to the same channel/tier paywall as `send_message`.2 params
Send the suggestion text (or its edited override) as a host message on the conversation. Subject to the same channel/tier paywall as `send_message`.
conversation_idstringrequiredThe unique identifier of the conversation the suggestion belongs to.suggestion_idstringrequiredThe unique identifier of the AI suggestion draft to publish as a message.prohostaimcp_reject_approval_request#Reject a pending approval request that an external agent filed, on behalf of the account owner/admin you are authenticated as. `rejection_reason` is required and is delivered to the filing agent on the `agent.approval_resolved` webhook — say what would need to change. Same eligibility rules as `approve_approval_request`: `source: external` only, and the `approvals:decide` scope, which an AI-employee credential can never hold.2 params
Reject a pending approval request that an external agent filed, on behalf of the account owner/admin you are authenticated as. `rejection_reason` is required and is delivered to the filing agent on the `agent.approval_resolved` webhook — say what would need to change. Same eligibility rules as `approve_approval_request`: `source: external` only, and the `approvals:decide` scope, which an AI-employee credential can never hold.
approval_idstringrequiredThe id of the approval request to reject.rejection_reasonstringrequiredThe reason for rejecting this request; delivered to the filing agent on the agent.approval_resolved webhook.prohostaimcp_remove_place_tag#Detach a listing tag from a place.2 params
Detach a listing tag from a place.
listing_tag_idstringrequiredThe unique identifier of the listing tag to detach from the place.place_idstringrequiredThe unique identifier of the place to detach the tag from.prohostaimcp_reorder_guidebook_pins#Bulk-update positions of guidebook-scoped pins. `pins` is a list of {id, position}.2 params
Bulk-update positions of guidebook-scoped pins. `pins` is a list of {id, position}.
guidebook_idstringrequiredThe unique identifier of the guidebook whose pins will be reordered.pinsarrayrequiredList of {id, position} objects specifying the new position for each pin.prohostaimcp_reorder_guidebook_sections#Bulk-reorder guidebook-scoped sections. `sections` is a list of {id, position, parent_id}.2 params
Bulk-reorder guidebook-scoped sections. `sections` is a list of {id, position, parent_id}.
guidebook_idstringrequiredThe unique identifier of the guidebook whose sections to reorder.sectionsarrayrequiredA list of {id, position, parent_id} objects specifying the new order and nesting of sections.prohostaimcp_reorder_tag_pins#Bulk-update positions of tag-scoped pins. `pins` is a list of {id, position}.2 params
Bulk-update positions of tag-scoped pins. `pins` is a list of {id, position}.
listing_tag_idstringrequiredThe unique identifier of the listing tag whose pins will be reordered.pinsarrayrequiredList of {id, position} objects specifying the new position for each pin.prohostaimcp_reorder_tag_sections#Bulk-reorder tag-scoped sections.2 params
Bulk-reorder tag-scoped sections.
listing_tag_idstringrequiredThe unique identifier of the listing tag whose sections should be reordered.sectionsarrayrequiredThe full list of sections in their new order, each as an object (e.g. containing id and position).prohostaimcp_reorder_task_checklists#Reorder checklists on a task.2 params
Reorder checklists on a task.
itemsarrayrequiredArray of objects specifying the new order of checklists, e.g. {checklist_id, order} pairs.task_idstringrequiredThe unique identifier of the task whose checklists to reorder.prohostaimcp_report_cleaning_issue#Report a new issue on a cleaning.2 params
Report a new issue on a cleaning.
cleaning_idstringrequiredThe unique identifier of the cleaning to report an issue on.titlestringrequiredThe title of the issue.prohostaimcp_resolve_cleaning_issue#Delete (resolve) a cleaning issue.2 params
Delete (resolve) a cleaning issue.
cleaning_idstringrequiredThe unique identifier of the cleaning the issue belongs to.issue_idstringrequiredThe unique identifier of the issue to resolve.prohostaimcp_resume_ai#Resume AI replies on a conversation that was previously paused.1 param
Resume AI replies on a conversation that was previously paused.
conversation_idstringrequiredThe unique identifier of the conversation to resume AI replies on.prohostaimcp_revise_suggestion#Stage a host instruction on an AI suggestion so the next agent run can pick it up.3 params
Stage a host instruction on an AI suggestion so the next agent run can pick it up.
conversation_idstringrequiredThe unique identifier of the conversation the suggestion belongs to.instructionstringrequiredThe instruction to stage on the AI suggestion for the next agent run to apply.suggestion_idstringrequiredThe unique identifier of the AI suggestion to stage a revision instruction on.prohostaimcp_run_workflow#Manually trigger a workflow run now. The workflow must be enabled and have steps. Pass reservation_id for reservation-scoped workflows.2 params
Manually trigger a workflow run now. The workflow must be enabled and have steps. Pass reservation_id for reservation-scoped workflows.
workflow_idstringrequiredThe unique identifier of the workflow to run now.reservation_idstringoptionalThe reservation to scope this run to, for reservation-scoped workflows.prohostaimcp_schedule_message#Schedule a host message to be sent at a future time. Arguments: ``conversation_id``, ``reservation_id``, ``listing_id``, ``message``, ``scheduled_at`` (ISO 8601, must be in the future), and optional ``channel``. The scheduled message is tagged ``source=mcp`` so downstream analytics and the send pipeline can distinguish MCP-origin sends. Channel rules — internal: all tiers; OTA: Pro only; the host's own SMS/WhatsApp/Gmail conversations CAN be scheduled on, with the same credential the live send requires (an OAuth credential whose user has inbox write, or an API key granted the conversations:write_guest_external scope). Pass ``channel`` (one of whatsapp, sms, email, ota) to pin the delivery channel — on an OTA thread these select that OTA's sub-channels, and on the host's own threads they select ProhostAI's own senders. The send falls back to the conversation's default routing if the channel cannot carry the message at send time. Omit it for default routing. Only conversations in your own account are supported — a connected-teams merged thread returns cross_account_not_supported (switch into that team's workspace to schedule). Idempotent on MCP request id — a retried call returns the cached response.6 params
Schedule a host message to be sent at a future time. Arguments: ``conversation_id``, ``reservation_id``, ``listing_id``, ``message``, ``scheduled_at`` (ISO 8601, must be in the future), and optional ``channel``. The scheduled message is tagged ``source=mcp`` so downstream analytics and the send pipeline can distinguish MCP-origin sends. Channel rules — internal: all tiers; OTA: Pro only; the host's own SMS/WhatsApp/Gmail conversations CAN be scheduled on, with the same credential the live send requires (an OAuth credential whose user has inbox write, or an API key granted the conversations:write_guest_external scope). Pass ``channel`` (one of whatsapp, sms, email, ota) to pin the delivery channel — on an OTA thread these select that OTA's sub-channels, and on the host's own threads they select ProhostAI's own senders. The send falls back to the conversation's default routing if the channel cannot carry the message at send time. Omit it for default routing. Only conversations in your own account are supported — a connected-teams merged thread returns cross_account_not_supported (switch into that team's workspace to schedule). Idempotent on MCP request id — a retried call returns the cached response.
conversation_idstringrequiredThe conversation to schedule the message in.listing_idstringrequiredThe listing the scheduled message relates to.messagestringrequiredThe message body to send at the scheduled time.reservation_idstringrequiredThe reservation the scheduled message relates to.scheduled_atstringrequiredISO 8601 timestamp when the message should be sent (must be in the future).channelstringoptionalOptional delivery channel to pin the send to.prohostaimcp_search_bank_transactions#Search bank/credit-card transactions from Plaid-connected accounts. Filter by date range, amount range, merchant substring, Plaid account, pending state, personal-finance category, or reconciliation state. Returns up to 200 rows, newest first. Read-only.10 params
Search bank/credit-card transactions from Plaid-connected accounts. Filter by date range, amount range, merchant substring, Plaid account, pending state, personal-finance category, or reconciliation state. Returns up to 200 rows, newest first. Read-only.
amount_maxstringoptionalOnly include transactions with an amount less than or equal to this value.amount_minstringoptionalOnly include transactions with an amount greater than or equal to this value.date_fromstringoptionalOnly include transactions on or after this date (ISO-8601).date_tostringoptionalOnly include transactions on or before this date (ISO-8601).limitintegeroptionalMaximum number of transactions to return (up to 200).merchantstringoptionalFilter by a substring match against the merchant name.pendingstringoptionalFilter to pending or posted transactions only.pfc_primarystringoptionalFilter by Plaid personal-finance-category primary label.plaid_account_idstringoptionalFilter to transactions from a specific Plaid-connected bank account.reconciledstringoptionalFilter to reconciled or unreconciled transactions only.prohostaimcp_search_cleanings#Search cleanings. Filter by listing, reservation, status, or scheduled-date range (ISO dates). Pass reservation_id to find the turnover cleaning for a specific stay (e.g. to attribute a review to the assigned cleaner). Each result lists all cleaners in `assignees`; the singular `assignee_id`/`assignee_name` are set only when there is exactly one. `cost` is the cleaning's own cost figure. `payment_summary` carries the cleaner-payment lifecycle the app's Payments Log shows — `total_amount`, `overall_status`, and a per-payee list with `amount`, `net_amount`, `status` and `paid_at` — so cleaner spend can be reconciled without a manual export. It is null when the cleaning has no payment record.6 params
Search cleanings. Filter by listing, reservation, status, or scheduled-date range (ISO dates). Pass reservation_id to find the turnover cleaning for a specific stay (e.g. to attribute a review to the assigned cleaner). Each result lists all cleaners in `assignees`; the singular `assignee_id`/`assignee_name` are set only when there is exactly one. `cost` is the cleaning's own cost figure. `payment_summary` carries the cleaner-payment lifecycle the app's Payments Log shows — `total_amount`, `overall_status`, and a per-payee list with `amount`, `net_amount`, `status` and `paid_at` — so cleaner spend can be reconciled without a manual export. It is null when the cleaning has no payment record.
date_fromstringoptionalOnly include cleanings scheduled on or after this date.date_tostringoptionalOnly include cleanings scheduled on or before this date.limitintegeroptionalMaximum number of cleanings to return.listing_idstringoptionalFilter cleanings to only this listing.reservation_idstringoptionalFilter cleanings to the turnover cleaning for this reservation.statusstringoptionalFilter cleanings by their current status.prohostaimcp_search_contacts#Search contacts by name, email, company, or role. Returns compact contact summaries.3 params
Search contacts by name, email, company, or role. Returns compact contact summaries.
limitintegeroptionalMaximum number of contacts to return.querystringoptionalFree-text search across name, email, company, or role.rolestringoptionalFilter contacts by role.prohostaimcp_search_conversations#Search conversations with optional inbox-status filters. Each filter is an INDEPENDENT, composable predicate — none of them implies any of the others. Base filters: query (name/guest/message text), listing_id, channel (single) or channels (list, OR logic — takes precedence over channel when both are given; the 'Calls' tab is channels=['voice','sms']). Status filters (each optional, omit to leave unfiltered): needs_response, needs_follow_up, is_starred, is_done (bool equality on the thread flag); follow_up (True = needs_follow_up OR is_starred; False = neither); snoozed (True = currently snoozed, i.e. snoozed_until in the future; False = not currently snoozed); business_purpose (equality, e.g. 'support_messaging_thread' for the Airbnb Support tab). When no status filter is passed the result set is unchanged from the base search (done and snoozed threads are still returned). To reproduce a web inbox tab exactly, COMBINE filters: the 'Follow Up' tab is follow_up=True + is_done=False + snoozed=False (the 'Respond' tab is needs_response=True + is_done=False + snoozed=False); passing follow_up=True alone still returns done or currently snoozed starred/follow-up threads. This mirrors the honest get_dashboard_summary counts, which apply is_done=False + not-snoozed + non-internal internally. Internal team-chat threads track needs_response / needs_follow_up / is_done per-user on ConversationUserMetadata, leaving the thread-level flags false for them. needs_response, needs_follow_up, and follow_up are all channel-aware: they resolve internal threads against THIS credential's own per-user flag (the same rows the app inbox and bulk_update_conversations write), so needs_response=true now matches internal threads flagged for this user just as it matches guest / OTA / account-wide threads on the thread-level column. The needs_response and needs_follow_up fields on a returned internal thread report that per-user value. (is_done is not yet channel-aware here — it still matches only the thread-level flag, which stays false for internal threads.) Pagination: results are capped at 50 per call (sorted by updated_at descending). To enumerate beyond the cap, pass cursor='' (empty string) to start cursor pagination — the response becomes an envelope {items, limit, has_more, next_cursor}; pass the returned next_cursor back to fetch the next page (next_cursor is null on the last page). Cursors are opaque; treat them as such. Threads that receive new activity mid-pagination jump to the top of the sort and may be missed by later pages — re-run from cursor='' for a fresh snapshot. include_total=true adds a 'total' count of ALL threads matching the filters (and switches a cursor-less response to the same envelope shape). Without cursor or include_total the response stays a bare JSON list (backwards compatible). Connected-teams merged visibility: when this credential resolves to a user (OAuth resource owner or the key's created_by) and is not listing-scoped, results fold in the user's participant threads from connected host accounts, minus agent-operational purposes (agent DMs, agent approvals, autopilot clarifications). ProhostAI-Support threads in connected hosts ARE merged, with the support-privacy stack applied: for a customer-side caller each support-employee identity is collapsed to the single branded 'ProhostAI Support' identity (no employee name/email in the participants array), and a support thread's opposite-side internal notes are never searchable. A caller who is themselves on the support team sees real identities (staff keep each other's). A user-less API key (or a listing-scoped key) keeps single-account scope with no fan-out. Every returned item carries account_id (the source/home account of the thread) and account_name so a merged page can be attributed per account. The business_purpose filter is plain equality for every value EXCEPT 'prohost_support', which uses DERIVED membership (stamped business_purpose='prohost_support' OR a seam-routed support conversation that carries a NULL business_purpose column) so canonical seam-routed support threads are matched just as the web ProhostAI-Support tab matches them. Caveat on merged internal threads: like the caller's own internal threads, is_done on a merged team-chat thread is per-user (on ConversationUserMetadata) and the thread-level is_done column stays false, so an is_done filter and the serialized is_done still reflect the thread-level column only — a thread done for this user alone reads as is_done=false here (the honest get_dashboard_summary count excludes it). Merged threads (including support threads) are openable via get_conversation_messages, which applies the same per-side note filtering and identity masking.14 params
Search conversations with optional inbox-status filters. Each filter is an INDEPENDENT, composable predicate — none of them implies any of the others. Base filters: query (name/guest/message text), listing_id, channel (single) or channels (list, OR logic — takes precedence over channel when both are given; the 'Calls' tab is channels=['voice','sms']). Status filters (each optional, omit to leave unfiltered): needs_response, needs_follow_up, is_starred, is_done (bool equality on the thread flag); follow_up (True = needs_follow_up OR is_starred; False = neither); snoozed (True = currently snoozed, i.e. snoozed_until in the future; False = not currently snoozed); business_purpose (equality, e.g. 'support_messaging_thread' for the Airbnb Support tab). When no status filter is passed the result set is unchanged from the base search (done and snoozed threads are still returned). To reproduce a web inbox tab exactly, COMBINE filters: the 'Follow Up' tab is follow_up=True + is_done=False + snoozed=False (the 'Respond' tab is needs_response=True + is_done=False + snoozed=False); passing follow_up=True alone still returns done or currently snoozed starred/follow-up threads. This mirrors the honest get_dashboard_summary counts, which apply is_done=False + not-snoozed + non-internal internally. Internal team-chat threads track needs_response / needs_follow_up / is_done per-user on ConversationUserMetadata, leaving the thread-level flags false for them. needs_response, needs_follow_up, and follow_up are all channel-aware: they resolve internal threads against THIS credential's own per-user flag (the same rows the app inbox and bulk_update_conversations write), so needs_response=true now matches internal threads flagged for this user just as it matches guest / OTA / account-wide threads on the thread-level column. The needs_response and needs_follow_up fields on a returned internal thread report that per-user value. (is_done is not yet channel-aware here — it still matches only the thread-level flag, which stays false for internal threads.) Pagination: results are capped at 50 per call (sorted by updated_at descending). To enumerate beyond the cap, pass cursor='' (empty string) to start cursor pagination — the response becomes an envelope {items, limit, has_more, next_cursor}; pass the returned next_cursor back to fetch the next page (next_cursor is null on the last page). Cursors are opaque; treat them as such. Threads that receive new activity mid-pagination jump to the top of the sort and may be missed by later pages — re-run from cursor='' for a fresh snapshot. include_total=true adds a 'total' count of ALL threads matching the filters (and switches a cursor-less response to the same envelope shape). Without cursor or include_total the response stays a bare JSON list (backwards compatible). Connected-teams merged visibility: when this credential resolves to a user (OAuth resource owner or the key's created_by) and is not listing-scoped, results fold in the user's participant threads from connected host accounts, minus agent-operational purposes (agent DMs, agent approvals, autopilot clarifications). ProhostAI-Support threads in connected hosts ARE merged, with the support-privacy stack applied: for a customer-side caller each support-employee identity is collapsed to the single branded 'ProhostAI Support' identity (no employee name/email in the participants array), and a support thread's opposite-side internal notes are never searchable. A caller who is themselves on the support team sees real identities (staff keep each other's). A user-less API key (or a listing-scoped key) keeps single-account scope with no fan-out. Every returned item carries account_id (the source/home account of the thread) and account_name so a merged page can be attributed per account. The business_purpose filter is plain equality for every value EXCEPT 'prohost_support', which uses DERIVED membership (stamped business_purpose='prohost_support' OR a seam-routed support conversation that carries a NULL business_purpose column) so canonical seam-routed support threads are matched just as the web ProhostAI-Support tab matches them. Caveat on merged internal threads: like the caller's own internal threads, is_done on a merged team-chat thread is per-user (on ConversationUserMetadata) and the thread-level is_done column stays false, so an is_done filter and the serialized is_done still reflect the thread-level column only — a thread done for this user alone reads as is_done=false here (the honest get_dashboard_summary count excludes it). Merged threads (including support threads) are openable via get_conversation_messages, which applies the same per-side note filtering and identity masking.
business_purposestringoptionalFilter by exact business purpose.channelstringoptionalFilter by a single channel.channelsstringoptionalFilter by multiple channels using OR logic; takes precedence over channel when both are given.cursorstringoptionalOpaque pagination cursor.follow_upstringoptionalCombined follow-up filter: needs_follow_up OR is_starred.include_totalbooleanoptionalInclude a total count of all matching threads.is_donestringoptionalFilter on the thread's done flag.is_starredstringoptionalFilter to starred threads.limitintegeroptionalMaximum number of conversations to return per page.listing_idstringoptionalFilter to conversations for a specific listing.needs_follow_upstringoptionalFilter to threads flagged as needing follow-up.needs_responsestringoptionalFilter to threads that need a response.querystringoptionalFree-text search matched against conversation/guest name and message text.snoozedstringoptionalFilter by current snooze state.prohostaimcp_search_expenses#Search expenses. Filter by listing, category, or date range.4 params
Search expenses. Filter by listing, category, or date range.
date_fromstringoptionalOnly include expenses on or after this date (ISO-8601).date_tostringoptionalOnly include expenses on or before this date (ISO-8601).limitintegeroptionalMaximum number of expenses to return.listing_idstringoptionalFilter to expenses for a specific listing.prohostaimcp_search_guests#Search and filter guests by name, email, or listing. Returns compact guest summaries.3 params
Search and filter guests by name, email, or listing. Returns compact guest summaries.
limitintegeroptionalMaximum number of guests to return.listing_idstringoptionalFilter guests to those associated with this listing.querystringoptionalFree-text search across guest name and email.prohostaimcp_search_memories#Search the property knowledge base. Returns up to `limit` memories matching the optional natural-language `query` and `scope` / `listing_id` filters.4 params
Search the property knowledge base. Returns up to `limit` memories matching the optional natural-language `query` and `scope` / `listing_id` filters.
limitintegeroptionalMaximum number of memories to return.listing_idstringoptionalOptional listing ID filter; restricts results to memories scoped to this listing.querystringoptionalOptional natural-language search query to match against memory content.scopestringoptionalOptional scope filter, e.g. listing, all_listings, or listing_group.prohostaimcp_search_owners#Search owners/investors. Returns owner details, commission info, and assigned listing_ids.2 params
Search owners/investors. Returns owner details, commission info, and assigned listing_ids.
limitintegeroptionalMaximum number of owners to return.searchstringoptionalSearch term to filter owners by name, email, or company.prohostaimcp_search_ramp_transactions#Search corporate-card transactions from Ramp-connected accounts. Filter by date range, amount range, merchant substring, Ramp card, cardholder name, clearing state, or reconciliation state. Returns up to 200 rows, newest first. Read-only.10 params
Search corporate-card transactions from Ramp-connected accounts. Filter by date range, amount range, merchant substring, Ramp card, cardholder name, clearing state, or reconciliation state. Returns up to 200 rows, newest first. Read-only.
amount_maxstringoptionalOnly include transactions with an amount less than or equal to this value. Defaults to null (no upper bound).amount_minstringoptionalOnly include transactions with an amount greater than or equal to this value. Defaults to null (no lower bound).card_idstringoptionalOnly include transactions on this Ramp card. Defaults to null (no filter).cardholderstringoptionalOnly include transactions by this cardholder name. Defaults to null (no filter).date_fromstringoptionalOnly include transactions on or after this date. Defaults to null (no lower bound).date_tostringoptionalOnly include transactions on or before this date. Defaults to null (no upper bound).limitintegeroptionalMaximum number of transactions to return, up to 200.merchantstringoptionalSubstring to match against the merchant name. Defaults to null (no filter).reconciledstringoptionalOnly include transactions with this reconciliation state. Defaults to null (no filter).statestringoptionalOnly include transactions in this clearing state. Defaults to null (no filter).prohostaimcp_search_reservations#Search and filter reservations. Returns compact reservation summaries.6 params
Search and filter reservations. Returns compact reservation summaries.
end_datestringoptionalOnly include reservations on or before this date.limitintegeroptionalMaximum number of reservation summaries to return.listing_idstringoptionalRestrict results to reservations for this listing.querystringoptionalFree-text search across reservation fields such as guest name, email, or confirmation code.start_datestringoptionalOnly include reservations on or after this date.statusstringoptionalFilter reservations by their current status.prohostaimcp_search_reviews#Search guest reviews. Filter by listing or star rating.3 params
Search guest reviews. Filter by listing or star rating.
limitintegeroptionalMaximum number of reviews to return.listing_idstringoptionalFilter reviews to only this listing.min_starsstringoptionalOnly return reviews with at least this star rating.prohostaimcp_search_tasks#Search tasks. Filter by status, priority, or listing.5 params
Search tasks. Filter by status, priority, or listing.
categorystringoptionalFilter tasks by category.limitintegeroptionalMaximum number of tasks to return.listing_idstringoptionalFilter tasks to a specific listing.prioritystringoptionalFilter tasks by priority level.statusstringoptionalFilter tasks by their current status.prohostaimcp_send_message#Send a message in a conversation through the real delivery pipeline. Works on conversations in your account and on connected-teams merged threads in your inbox scope — internal team chat AND guest channels — whenever you are a participant of the thread via an active team connection. On a merged thread the gates evaluate against the account that OWNS the thread, not yours: the OTA Pro gate reads the host's tier (a non-Pro host returns that host's upgrade_required), the message persists in the host's account attributed to you, and an approval routes to the host's team. The host's own SMS/WhatsApp/Gmail senders stay reachable only with the conversations:write_guest_external scope when the thread is not yours. A ProhostAI-Support thread you participate in is sendable as the internal support bridge, and your reply carries the branded 'ProhostAI Support' identity for the customer side, never your name; a support thread replying on a guest channel returns cross_account_not_supported. Tier gates — internal channel: all tiers; OTA channel: Pro only. The host's own SMS/WhatsApp/Gmail channels are sendable (no tier gate) when you authenticate with OAuth as a user holding inbox write access, or with an API key granted the conversations:write_guest_external scope; otherwise they return channel_not_api_sendable. Returns the persisted message id plus the final send status ('sent' if delivery completed synchronously, 'pending' if queued). On the internal team-chat channel this also wakes the AI employees the message addressed, exactly as an in-app send does: a 1:1 thread with an employee always wakes that employee, and <@user_id> mentions wake each mentioned employee in any internal thread. ``run_id`` is the dispatched run (``run_ids`` lists them all when a mention fan-out woke several), and is null when nobody was addressed or a dispatch guard (credit budget, billing gate, agent-chain depth, in-flight dedup) suppressed the run — the message is still delivered either way. The employee's reply arrives asynchronously in the same thread; poll get_conversation_messages for it. An un-mentioned employee in a GROUP thread is not woken from this surface. ``dispatch_error`` appears only if the enqueue itself failed, in which case send a fresh message rather than retrying this one.2 params
Send a message in a conversation through the real delivery pipeline. Works on conversations in your account and on connected-teams merged threads in your inbox scope — internal team chat AND guest channels — whenever you are a participant of the thread via an active team connection. On a merged thread the gates evaluate against the account that OWNS the thread, not yours: the OTA Pro gate reads the host's tier (a non-Pro host returns that host's upgrade_required), the message persists in the host's account attributed to you, and an approval routes to the host's team. The host's own SMS/WhatsApp/Gmail senders stay reachable only with the conversations:write_guest_external scope when the thread is not yours. A ProhostAI-Support thread you participate in is sendable as the internal support bridge, and your reply carries the branded 'ProhostAI Support' identity for the customer side, never your name; a support thread replying on a guest channel returns cross_account_not_supported. Tier gates — internal channel: all tiers; OTA channel: Pro only. The host's own SMS/WhatsApp/Gmail channels are sendable (no tier gate) when you authenticate with OAuth as a user holding inbox write access, or with an API key granted the conversations:write_guest_external scope; otherwise they return channel_not_api_sendable. Returns the persisted message id plus the final send status ('sent' if delivery completed synchronously, 'pending' if queued). On the internal team-chat channel this also wakes the AI employees the message addressed, exactly as an in-app send does: a 1:1 thread with an employee always wakes that employee, and <@user_id> mentions wake each mentioned employee in any internal thread. ``run_id`` is the dispatched run (``run_ids`` lists them all when a mention fan-out woke several), and is null when nobody was addressed or a dispatch guard (credit budget, billing gate, agent-chain depth, in-flight dedup) suppressed the run — the message is still delivered either way. The employee's reply arrives asynchronously in the same thread; poll get_conversation_messages for it. An un-mentioned employee in a GROUP thread is not woken from this surface. ``dispatch_error`` appears only if the enqueue itself failed, in which case send a fresh message rather than retrying this one.
conversation_idstringrequiredThe conversation to send the message in.messagestringrequiredThe message body to send.prohostaimcp_set_contact_custom_fields#Merge `fields` into `custom_fields` on every contact in `contact_ids`.2 params
Merge `fields` into `custom_fields` on every contact in `contact_ids`.
contact_idsarrayrequiredThe contact IDs to update.fieldsobjectrequiredKey/value custom fields to merge into each contact's custom_fields.prohostaimcp_set_guest_custom_fields#Merge `fields` into `custom_fields` on every guest in `guest_ids`.2 params
Merge `fields` into `custom_fields` on every guest in `guest_ids`.
fieldsobjectrequiredKey/value custom fields to merge into each guest's custom_fields.guest_idsarrayrequiredThe guest IDs to update.prohostaimcp_set_listing_custom_fields#Batch-set custom fields on listings, a tag, or the account. ``scope`` selects the layer; ``mode='merge'`` keeps existing keys, ``mode='replace'`` overwrites the dict. ``targets`` supports ``listing_ids``, ``tag_ids`` (for scope=tag), or ``target_tag_id`` / ``target_tag_name`` / ``all_listings`` (for scope=listing).5 params
Batch-set custom fields on listings, a tag, or the account. ``scope`` selects the layer; ``mode='merge'`` keeps existing keys, ``mode='replace'`` overwrites the dict. ``targets`` supports ``listing_ids``, ``tag_ids`` (for scope=tag), or ``target_tag_id`` / ``target_tag_name`` / ``all_listings`` (for scope=listing).
fieldsobjectrequiredThe custom field key/value pairs to set.scopestringrequiredThe layer to set custom fields on: account, tag, or listing.dry_runbooleanoptionalIf true, preview the change without applying it.modestringoptionalWhether to merge new fields with existing ones or replace the dict entirely.targetsstringoptionalThe targets to apply the fields to. Supports listing_ids, tag_ids (for scope=tag), or target_tag_id / target_tag_name / all_listings (for scope=listing).prohostaimcp_set_listing_group_children#Replace the child-listings list for a parent listing (a 'listing group'). Cycles, self-references, and listings already in another group are rejected.2 params
Replace the child-listings list for a parent listing (a 'listing group'). Cycles, self-references, and listings already in another group are rejected.
child_listing_idsarrayrequiredThe full list of child listing IDs to assign to this group.listing_idstringrequiredThe unique identifier of the parent listing.prohostaimcp_set_listing_host_role#Set the host role (owner / cohost) for a Hospitable-connected listing. Use `apply_to_all=true` to fan out to every sibling listing on the same connection.3 params
Set the host role (owner / cohost) for a Hospitable-connected listing. Use `apply_to_all=true` to fan out to every sibling listing on the same connection.
listing_idstringrequiredThe unique identifier of the listing to set the host role on.user_idstringrequiredThe unique identifier of the user to assign as owner or cohost.apply_to_allbooleanoptionalIf true, apply the host role change to every sibling listing on the same connection.prohostaimcp_set_mystay_section_order#Set the order of sections shown on the My Stay tab of the guidebook.2 params
Set the order of sections shown on the My Stay tab of the guidebook.
guidebook_idstringrequiredThe unique identifier of the guidebook whose My Stay tab order should be set.section_idsarrayrequiredThe full ordered list of section IDs to display on the My Stay tab.prohostaimcp_set_reservation_custom_fields#Merge `fields` into `custom_fields` on every reservation in `reservation_ids`. Existing keys are overwritten; keys absent from `fields` are preserved.2 params
Merge `fields` into `custom_fields` on every reservation in `reservation_ids`. Existing keys are overwritten; keys absent from `fields` are preserved.
fieldsobjectrequiredThe key/value pairs to merge into each reservation's custom_fields. Existing keys are overwritten; keys not present here are preserved.reservation_idsarrayrequiredThe reservation IDs to update.prohostaimcp_sheets_delete_row#Delete a row from a sheet by row id.2 params
Delete a row from a sheet by row id.
path_or_idstringrequiredThe path or unique ID of the sheet containing the row.row_idstringrequiredThe unique ID of the row to delete.prohostaimcp_sheets_get#Fetch sheet metadata (row_count, schema) by path or id.1 param
Fetch sheet metadata (row_count, schema) by path or id.
path_or_idstringrequiredThe path or unique ID of the sheet to fetch metadata for.prohostaimcp_sheets_insert_rows#Bulk-insert rows into a sheet.2 params
Bulk-insert rows into a sheet.
path_or_idstringrequiredThe path or unique ID of the sheet to insert rows into.rowsarrayrequiredArray of row objects to insert, each a {column_id: value} map.prohostaimcp_sheets_list#List sheets in the account.1 param
List sheets in the account.
limitintegeroptionalMaximum number of sheets to return.prohostaimcp_sheets_query#Filter rows via a simple {column_id: value} equality DSL (like read_rows without sort).2 params
Filter rows via a simple {column_id: value} equality DSL (like read_rows without sort).
filterobjectrequiredEquality filter as a {column_id: value} map. Only rows matching all key/value pairs are returned.path_or_idstringrequiredThe path or unique ID of the sheet to query.prohostaimcp_sheets_read_rows#Read rows from a sheet. `filter` is a {column_id: value} equality map; `sort` is a column_id prefixed with '-' for descending.4 params
Read rows from a sheet. `filter` is a {column_id: value} equality map; `sort` is a column_id prefixed with '-' for descending.
path_or_idstringrequiredThe path or unique ID of the sheet to read rows from.filterstringoptionalEquality filter as a {column_id: value} map. Only rows matching all key/value pairs are returned.limitintegeroptionalMaximum number of rows to return.sortstringoptionalColumn ID to sort by. Prefix with '-' for descending order.prohostaimcp_sheets_schema#Fetch a sheet's column schema by path or id.1 param
Fetch a sheet's column schema by path or id.
path_or_idstringrequiredThe path or unique ID of the sheet to fetch the column schema for.prohostaimcp_sheets_update_row#Partial-patch a row in a sheet by row id.3 params
Partial-patch a row in a sheet by row id.
patchobjectrequiredA {column_id: value} map of fields to update on the row. Unspecified columns are left unchanged.path_or_idstringrequiredThe path or unique ID of the sheet containing the row.row_idstringrequiredThe unique ID of the row to update.prohostaimcp_submit_feedback#Submit a bug report, feature request, or question to the ProhostAI team. Valid types: bug_report, feature_request, question.5 params
Submit a bug report, feature request, or question to the ProhostAI team. Valid types: bug_report, feature_request, question.
descriptionstringrequiredA detailed description of the bug, feature request, or question.titlestringrequiredA short summary title for the feedback.typestringrequiredThe type of feedback being submitted. One of: bug_report, feature_request, question.attachmentsstringoptionalOptional list of attachments (e.g. screenshots or log excerpts) to include with the feedback.steps_to_reproducestringoptionalStep-by-step instructions to reproduce the issue, if reporting a bug.prohostaimcp_toggle_reaction#Add or remove the API user's reaction with this emoji on a message. Reactions are per-emoji: the same emoji again removes it, a different emoji is added alongside.3 params
Add or remove the API user's reaction with this emoji on a message. Reactions are per-emoji: the same emoji again removes it, a different emoji is added alongside.
conversation_idstringrequiredThe conversation the message belongs to.emojistringrequiredThe emoji to toggle.message_idstringrequiredThe message to react to.prohostaimcp_toggle_workflow#Enable (resume) or disable (pause) a workflow.2 params
Enable (resume) or disable (pause) a workflow.
enabledbooleanrequiredSet to true to enable (resume) the workflow, or false to disable (pause) it.workflow_idstringrequiredThe unique identifier of the workflow to enable or disable.prohostaimcp_translate_task_checklist#Translate a task checklist to a target language.4 params
Translate a task checklist to a target language.
checklist_idstringrequiredThe unique identifier of the checklist within the task to translate.target_languagestringrequiredThe target language to translate the checklist into.task_idstringrequiredThe unique identifier of the task whose checklist should be translated.forcebooleanoptionalWhether to force re-translation even if a translation to the target language already exists.prohostaimcp_unblock_dates#Unblock (mark available) a list of dates on a listing's calendar. Sugar over `update_calendar_days` with `available=true` — dispatched asynchronously via the listing's OTA.2 params
Unblock (mark available) a list of dates on a listing's calendar. Sugar over `update_calendar_days` with `available=true` — dispatched asynchronously via the listing's OTA.
datesarrayrequiredThe dates to unblock on the listing's calendar.listing_idstringrequiredThe unique identifier of the listing to unblock dates on.prohostaimcp_update_ai_employee_trigger#Update an AI employee's event trigger. Only the provided fields are written. 'description' is what the trigger is for — it is injected into the prompt of every run the trigger fires, so on a 'schedule' trigger it is the routine's instructions.6 params
Update an AI employee's event trigger. Only the provided fields are written. 'description' is what the trigger is for — it is injected into the prompt of every run the trigger fires, so on a 'schedule' trigger it is the routine's instructions.
trigger_idstringrequiredThe id of the trigger to update.cooldown_secondsstringoptionalNew minimum number of seconds between successive firings of this trigger. Omit or leave null to leave unchanged.descriptionstringoptionalNew description of what the trigger is for. This text is injected into the prompt of every run the trigger fires, so on a 'schedule' trigger it is the routine's instructions. Omit or leave null to leave unchanged.enabledstringoptionalWhether the trigger is active. Omit or leave null to leave unchanged.namestringoptionalNew display name for the trigger. Omit or leave null to leave unchanged.trigger_typestringoptionalNew type of event that fires this trigger. Omit or leave null to leave unchanged.prohostaimcp_update_autopilot_schedule#Replace the account's autopilot schedule windows. This is a FULL replace — send the complete set of windows you want (read them first with get_autopilot_schedule). Each window is {day_of_week (monday..sunday), start_at (HH:MM), end_at (HH:MM), enabled?}. A window whose start_at is after its end_at wraps past midnight. Optionally also set schedule_enabled and schedule_timezone. Windows must be non-empty; to turn scheduling off, set schedule_enabled=false (via this tool or update_autopilot_settings) instead of clearing windows.3 params
Replace the account's autopilot schedule windows. This is a FULL replace — send the complete set of windows you want (read them first with get_autopilot_schedule). Each window is {day_of_week (monday..sunday), start_at (HH:MM), end_at (HH:MM), enabled?}. A window whose start_at is after its end_at wraps past midnight. Optionally also set schedule_enabled and schedule_timezone. Windows must be non-empty; to turn scheduling off, set schedule_enabled=false (via this tool or update_autopilot_settings) instead of clearing windows.
windowsarrayrequiredComplete list of schedule windows to set (this is a full replace). Each item is {day_of_week (monday..sunday), start_at (HH:MM), end_at (HH:MM), enabled?}. Must be non-empty.schedule_enabledstringoptionalWhether to also enable/disable enforcement of the schedule windows.schedule_timezonestringoptionalOptionally also set the IANA timezone used to interpret the schedule windows.prohostaimcp_update_autopilot_settings#Partially update the account's autopilot configuration. Only the fields you pass change (read-modify-write). Thresholds are clamped to allowed values (confidence: 80/90/95/99; sentiment: 0/30/40/50). unsure_behavior controls what Autopilot does when it is unsure and drafts an informational deferral: 'reply_and_follow_up' (auto-send, default) or 'hold_for_host' (hold the reply and escalate to the host); an unknown value is rejected. category_rules is a list of {category, enabled?, custom_instructions?}; channel_rules a list of {channel, enabled}; booking_channel_rules a list of {channel_id, enabled}. Unknown categories or channels are rejected.14 params
Partially update the account's autopilot configuration. Only the fields you pass change (read-modify-write). Thresholds are clamped to allowed values (confidence: 80/90/95/99; sentiment: 0/30/40/50). unsure_behavior controls what Autopilot does when it is unsure and drafts an informational deferral: 'reply_and_follow_up' (auto-send, default) or 'hold_for_host' (hold the reply and escalate to the host); an unknown value is rejected. category_rules is a list of {category, enabled?, custom_instructions?}; channel_rules a list of {channel, enabled}; booking_channel_rules a list of {channel_id, enabled}. Unknown categories or channels are rejected.
booking_channel_rulesstringoptionalList of per booking-channel rule overrides, each {channel_id, enabled}.category_rulesstringoptionalList of per-category rule overrides, each {category, enabled?, custom_instructions?}. Unknown categories are rejected.channel_rulesstringoptionalList of per-channel rule overrides, each {channel, enabled}. Unknown channels are rejected.clear_personalize_for_user_idbooleanoptionalIf true, clears any personalize_for_user_id currently set instead of applying a new one.confidence_thresholdstringoptionalMinimum confidence score required before Autopilot auto-sends a reply. Clamped to 80, 90, 95, or 99.default_for_new_listingsstringoptionalWhether Autopilot is enabled by default on newly added listings.enabledstringoptionalWhether Autopilot is turned on for the account. Omit to leave unchanged.escalation_ack_enabledstringoptionalWhether Autopilot sends the guest an acknowledgement message when escalating to the host.message_delay_secondsstringoptionalDelay, in seconds, before Autopilot sends an auto-generated reply. Omit to leave unchanged.personalize_for_user_idstringoptionalID of the team member whose tone/style Autopilot should personalize replies after.schedule_enabledstringoptionalWhether the autopilot schedule windows (see get_autopilot_schedule) are enforced.schedule_timezonestringoptionalIANA timezone used to interpret the autopilot schedule windows.sentiment_escalation_thresholdstringoptionalSentiment score below which Autopilot escalates the conversation to the host. Clamped to 0, 30, 40, or 50.unsure_behaviorstringoptionalWhat Autopilot does when it is unsure and drafts an informational deferral: 'reply_and_follow_up' (auto-send, default) or 'hold_for_host' (hold the reply and escalate to the host). An unknown value is rejected.prohostaimcp_update_calendar_days#Update price, availability, and/or minimum-stay for a listing's calendar. Dispatched asynchronously via the listing's OTA. Either pass `updates` (list of per-date dicts) or `dates` + the shared values to apply. Up to 1095 dates per call.6 params
Update price, availability, and/or minimum-stay for a listing's calendar. Dispatched asynchronously via the listing's OTA. Either pass `updates` (list of per-date dicts) or `dates` + the shared values to apply. Up to 1095 dates per call.
listing_idstringrequiredThe unique identifier of the listing to update.availablestringoptionalWhether each date in dates should be marked available.datesstringoptionalThe dates to apply the shared price/available/min_stay values to. Omit if passing per-date updates instead.min_staystringoptionalThe minimum stay (in nights) to apply to each date in dates.pricestringoptionalThe nightly price to apply to each date in dates.updatesstringoptionalA list of per-date update objects, each specifying a date and the values to set for it. Use instead of dates + shared values when different dates need different settings.prohostaimcp_update_cleaning_checklist#Update a checklist on a cleaning.5 params
Update a checklist on a cleaning.
checklist_idstringrequiredThe unique identifier of the checklist to update.cleaning_idstringrequiredThe unique identifier of the cleaning job the checklist belongs to.descriptionstringoptionalNew description for the checklist.orderstringoptionalNew sort order for the checklist relative to other checklists on the cleaning.titlestringoptionalNew title for the checklist.prohostaimcp_update_cleaning_checklist_item#Update fields on a cleaning checklist item (title, completion, photo, etc.).8 params
Update fields on a cleaning checklist item (title, completion, photo, etc.).
checklist_idstringrequiredThe unique identifier of the checklist the item belongs to.cleaning_idstringrequiredThe unique identifier of the cleaning job the checklist item belongs to.item_idstringrequiredThe unique identifier of the checklist item to update.completedstringoptionalWhether the item is marked complete.orderstringoptionalNew sort order for the item within the checklist.photo_urlstringoptionalURL of the photo submitted by the cleaner as proof of completion.reference_photo_urlstringoptionalNew reference photo URL showing what this item should look like when done correctly.titlestringoptionalNew title for the checklist item.prohostaimcp_update_cleaning_issue#Update the title of a cleaning issue.3 params
Update the title of a cleaning issue.
cleaning_idstringrequiredThe unique identifier of the cleaning the issue belongs to.issue_idstringrequiredThe unique identifier of the issue to update.titlestringoptionalThe new title for the issue.prohostaimcp_update_cleaning_status#Transition a cleaning to a new status. Valid values: not_started, in_progress, paused, ready_for_inspection, completed.2 params
Transition a cleaning to a new status. Valid values: not_started, in_progress, paused, ready_for_inspection, completed.
cleaning_idstringrequiredThe unique identifier of the cleaning to update.statusstringrequiredThe new status to transition the cleaning to.prohostaimcp_update_contact#Update an existing contact. Only provided fields are written.9 params
Update an existing contact. Only provided fields are written.
contact_idstringrequiredThe unique identifier of the contact to update.companystringoptionalThe contact's company.custom_fieldsstringoptionalCustom field key/value pairs to merge onto the contact.emailstringoptionalThe contact's email address.first_namestringoptionalThe contact's first name.last_namestringoptionalThe contact's last name.notesstringoptionalFree-text notes about the contact.phonestringoptionalThe contact's phone number.rolestringoptionalThe contact's role.prohostaimcp_update_expense#Update fields on an existing expense. Only provided fields are modified. Pass `amount` as a number (treated as decimal), `date` as ISO-8601 (YYYY-MM-DD).9 params
Update fields on an existing expense. Only provided fields are modified. Pass `amount` as a number (treated as decimal), `date` as ISO-8601 (YYYY-MM-DD).
expense_idstringrequiredThe unique identifier of the expense to update.amountstringoptionalNew amount for the expense, treated as a decimal.category_idstringoptionalNew expense category to assign.currencystringoptionalNew ISO 4217 currency code for the expense.datestringoptionalNew date for the expense, in ISO-8601 format (YYYY-MM-DD).descriptionstringoptionalNew free-text description for the expense.listing_idstringoptionalNew listing to associate the expense with.namestringoptionalNew name/title for the expense.payment_statusstringoptionalNew payment status for the expense.prohostaimcp_update_expense_category#Rename an expense category.2 params
Rename an expense category.
category_idstringrequiredThe unique identifier of the category to rename.namestringrequiredThe new name for the category.prohostaimcp_update_guest#Update an existing guest. Only provided fields are written.13 params
Update an existing guest. Only provided fields are written.
guest_idstringrequiredThe unique identifier of the guest to update.addressstringoptionalThe guest's street address.citystringoptionalThe guest's city.countrystringoptionalThe guest's country.custom_fieldsstringoptionalGuest-level custom field values to set.emailstringoptionalThe guest's email address.first_namestringoptionalThe guest's first name.last_namestringoptionalThe guest's last name.notesstringoptionalFree-text notes about the guest.phonestringoptionalThe guest's phone number.photo_urlstringoptionalURL of the guest's photo.postal_codestringoptionalThe guest's postal code.tagsstringoptionalTags to associate with the guest.prohostaimcp_update_guidebook#Patch fields on a guidebook (title, description, theme, branding).13 params
Patch fields on a guidebook (title, description, theme, branding).
guidebook_idstringrequiredThe unique identifier of the guidebook to update.corner_radiusstringoptionalNew corner radius style for UI elements. Omit or leave null to leave unchanged.custom_brand_textstringoptionalNew brand text shown in the guidebook footer. Omit or leave null to leave unchanged.custom_fontstringoptionalNew font family for the guidebook. Omit or leave null to leave unchanged.custom_logo_dark_urlstringoptionalNew logo image URL for dark backgrounds. Omit or leave null to leave unchanged.custom_logo_urlstringoptionalNew logo image URL for light backgrounds. Omit or leave null to leave unchanged.custom_primary_colorstringoptionalNew primary brand color, as a hex code. Omit or leave null to leave unchanged.custom_secondary_colorstringoptionalNew secondary brand color, as a hex code. Omit or leave null to leave unchanged.descriptionstringoptionalNew description for the guidebook. Omit or leave null to leave unchanged.hide_brandingstringoptionalWhether to hide ProhostAI branding on the guidebook. Omit or leave null to leave unchanged.listing_idstringoptionalNew listing to attach the guidebook to. Omit or leave null to leave unchanged.themestringoptionalNew visual theme for the guidebook. Omit or leave null to leave unchanged.titlestringoptionalNew title for the guidebook. Omit or leave null to leave unchanged.prohostaimcp_update_guidebook_section#Patch fields on a guidebook-scoped section.8 params
Patch fields on a guidebook-scoped section.
guidebook_idstringrequiredThe unique identifier of the guidebook the section belongs to.section_idstringrequiredThe unique identifier of the section to update.contentstringoptionalNew body content for the section. Omit or leave null to leave unchanged.iconstringoptionalNew icon identifier for the section. Omit or leave null to leave unchanged.parent_idstringoptionalNew parent section identifier to nest this section under. Omit or leave null to leave unchanged.section_typestringoptionalNew section type. Omit or leave null to leave unchanged.titlestringoptionalNew title for the section. Omit or leave null to leave unchanged.unlock_before_checkinstringoptionalNew number of hours before check-in that this section unlocks for the guest. Omit or leave null to leave unchanged.prohostaimcp_update_last_minute_pricing#Configure PriceLabs last-minute (lead-time based) pricing for a listing — the ``last_minute_prices`` customization, a standing rule that adjusts nightly prices as check-in approaches. ``factor_type`` is one of linear / linear_gradual (percent, -75..+500, negative = discount), fixed (flat nightly price, PriceLabs requires >= 20% of base), or the presets recommended / conservative / aggressive / none (auto-fill value + window). ``days_from_checkin`` (1-90) is where the rule starts. ``enabled=false`` turns the rule off preserving its stored configuration. The rule adjusts FROM the listing's base price and is clamped AT its min price (see update_listing_pricing). Untouched customization blocks (far_out_premium, seasonality, …) are preserved via read-modify-write. Returns a structured ``pricelabs_not_authoritative`` error (mirroring the REST 409) when PriceLabs is not the authoritative price writer for this listing.5 params
Configure PriceLabs last-minute (lead-time based) pricing for a listing — the ``last_minute_prices`` customization, a standing rule that adjusts nightly prices as check-in approaches. ``factor_type`` is one of linear / linear_gradual (percent, -75..+500, negative = discount), fixed (flat nightly price, PriceLabs requires >= 20% of base), or the presets recommended / conservative / aggressive / none (auto-fill value + window). ``days_from_checkin`` (1-90) is where the rule starts. ``enabled=false`` turns the rule off preserving its stored configuration. The rule adjusts FROM the listing's base price and is clamped AT its min price (see update_listing_pricing). Untouched customization blocks (far_out_premium, seasonality, …) are preserved via read-modify-write. Returns a structured ``pricelabs_not_authoritative`` error (mirroring the REST 409) when PriceLabs is not the authoritative price writer for this listing.
enabledbooleanrequiredWhether the last-minute pricing rule is turned on.listing_idstringrequiredThe unique identifier of the listing to configure last-minute pricing for.days_from_checkinstringoptionalHow many days before check-in the last-minute pricing rule starts adjusting price.factor_typestringoptionalThe type of last-minute pricing adjustment to apply.factor_valuestringoptionalThe magnitude of the adjustment, interpreted according to factor_type.prohostaimcp_update_listing#Update fields on a listing — title, description, address, capacity, wifi, custom_fields, etc. Only supplied fields are changed. OTA-managed fields (host roles, connection role, import status) are not exposed.29 params
Update fields on a listing — title, description, address, capacity, wifi, custom_fields, etc. Only supplied fields are changed. OTA-managed fields (host roles, connection role, import status) are not exposed.
listing_idstringrequiredThe unique identifier of the listing to update.addressstringoptionalThe street address of the listing.amenitiesstringoptionalA dict of amenities for the listing.amenities_liststringoptionalA list of amenity names for the listing.aptstringoptionalThe apartment or unit number for the listing.building_namestringoptionalThe building name for the listing, if applicable.check_in_time_endstringoptionalThe latest check-in time for the listing.check_in_time_startstringoptionalThe earliest check-in time for the listing.check_out_timestringoptionalThe check-out time for the listing.citystringoptionalThe city the listing is located in.countrystringoptionalThe country the listing is located in.currencystringoptionalThe currency code used for the listing's pricing.custom_fieldsstringoptionalA dict of custom field key/value pairs for the listing.descriptionstringoptionalA description of the listing.internal_titlestringoptionalAn internal-only title for the listing, not shown to guests.latstringoptionalThe latitude coordinate of the listing.lngstringoptionalThe longitude coordinate of the listing.max_guestsstringoptionalThe maximum number of guests the listing accommodates.num_bathroomsstringoptionalThe number of bathrooms.num_bedroomsstringoptionalThe number of bedrooms.num_bedsstringoptionalThe number of beds.postal_codestringoptionalThe postal/ZIP code of the listing.private_notesstringoptionalInternal private notes about the listing, not shown to guests.rulesstringoptionalThe house rules for the listing.thumbnail_urlstringoptionalThe URL of the listing's thumbnail image.timezonestringoptionalThe IANA timezone for the listing.titlestringoptionalThe title of the listing.wifi_networkstringoptionalThe WiFi network name for the listing.wifi_passwordstringoptionalThe WiFi password for the listing.prohostaimcp_update_listing_photos#Replace the photo set for a listing. Existing photos are deleted first; pass an empty list to clear all photos. On a connected listing this takes photo ownership from the channel. Up to 100 photos per call.2 params
Replace the photo set for a listing. Existing photos are deleted first; pass an empty list to clear all photos. On a connected listing this takes photo ownership from the channel. Up to 100 photos per call.
listing_idstringrequiredThe unique identifier of the listing whose photos should be replaced.photosarrayrequiredThe new list of photo objects to set on the listing, replacing all existing photos. Pass an empty list to clear all photos. Up to 100 photos per call.prohostaimcp_update_listing_pricing#Push min/base/max to PriceLabs for the listing. Returns a structured ``pricelabs_not_authoritative`` error (mirroring the REST 409) when PriceLabs is not the authoritative price writer for this listing — map the listing to PriceLabs first (it becomes authoritative once linked).4 params
Push min/base/max to PriceLabs for the listing. Returns a structured ``pricelabs_not_authoritative`` error (mirroring the REST 409) when PriceLabs is not the authoritative price writer for this listing — map the listing to PriceLabs first (it becomes authoritative once linked).
basenumberrequiredThe base nightly price PriceLabs uses as its starting point for dynamic pricing.listing_idstringrequiredThe unique identifier of the listing to update pricing for.maxnumberrequiredThe maximum nightly price PriceLabs will not price above.minnumberrequiredThe minimum nightly price PriceLabs will not price below.prohostaimcp_update_listing_tag#Update one or more fields on an existing listing tag.5 params
Update one or more fields on an existing listing tag.
tag_idstringrequiredThe unique identifier of the tag to update.colorstringoptionalNew color for the tag.custom_fieldsstringoptionalNew custom field key/value pairs for the tag.iconstringoptionalNew icon for the tag.namestringoptionalNew name for the tag.prohostaimcp_update_memory#Update an existing memory. `content`, `scope`, and `is_internal` are all optional; at least one must be provided. Restricted internal-only writers cannot update existing memories; they may only create new internal memories.4 params
Update an existing memory. `content`, `scope`, and `is_internal` are all optional; at least one must be provided. Restricted internal-only writers cannot update existing memories; they may only create new internal memories.
memory_idstringrequiredID of the memory to update.contentstringoptionalNew text content for the memory. Optional; at least one of content, scope, is_internal must be provided.is_internalstringoptionalWhether the memory should be internal-only. Optional; at least one of content, scope, is_internal must be provided.scopestringoptionalNew scope for the memory. Optional; at least one of content, scope, is_internal must be provided.prohostaimcp_update_message_template#Update a message template by ID. ``time_offset_minutes`` is signed: NEGATIVE fires BEFORE the event, positive after, 0 at the event. For ``check_in`` / ``checkout`` templates a reservation booked after the computed send time is silently skipped unless ``send_if_past_due=True``. Changing any scheduling field (offset, min/max nights, type, listings, day/time, past-due, or message) reconciles EXISTING scheduled messages to match — cancelling rows that no longer qualify and rescheduling on an offset change — without creating new ones. Set ``apply_to_existing_reservations=True`` to ALSO create messages for existing reservations that don't yet have one.14 params
Update a message template by ID. ``time_offset_minutes`` is signed: NEGATIVE fires BEFORE the event, positive after, 0 at the event. For ``check_in`` / ``checkout`` templates a reservation booked after the computed send time is silently skipped unless ``send_if_past_due=True``. Changing any scheduling field (offset, min/max nights, type, listings, day/time, past-due, or message) reconciles EXISTING scheduled messages to match — cancelling rows that no longer qualify and rescheduling on an offset change — without creating new ones. Set ``apply_to_existing_reservations=True`` to ALSO create messages for existing reservations that don't yet have one.
template_idstringrequiredThe unique identifier of the message template to update.apply_to_existing_reservationsbooleanoptionalIf true, also create messages for existing reservations that don't yet have one.day_of_weekstringoptionalFor recurring_weekly templates, the day of week to send on.is_enabledstringoptionalWhether the template is active and will schedule messages.listing_idsstringoptionalNew set of listing IDs this template applies to.max_nightsstringoptionalOnly apply this template to reservations with at most this many nights.messagestringoptionalNew message body. Use placeholders such as {guest_first_name} — see list_conversation_message_variables for the full list of valid placeholders.min_nightsstringoptionalOnly apply this template to reservations with at least this many nights.past_due_delay_minutesstringoptionalMinutes to delay a past-due send when send_if_past_due is true.send_if_past_duestringoptionalFor check_in / checkout templates, if true the message still sends even when the reservation was booked after the computed send time.time_of_daystringoptionalFor recurring_weekly templates, the time of day to send at (24-hour HH:MM).time_offset_minutesstringoptionalMinutes relative to the check-in/checkout event when the message should send. Negative fires before the event, positive fires after, 0 fires at the event.titlestringoptionalNew internal title for the message template.typestringoptionalNew template trigger type. One of booking_confirmed, check_in, checkout, or recurring_weekly.prohostaimcp_update_notification_settings#Update the acting user's notification preferences. Only the fields you pass are written: a scope array REPLACES that category's subscriptions wholesale (pass [] to silence the category), while channel_preferences and message_channel_preferences merge per key, so categories and channels you omit keep their stored values. Read the current settings first — get_notification_settings returns the legal values for every field. Only push and email delivery can be changed here; sms and slack are entitlement-gated, and escalation_reachability is read-only, both refused by name rather than silently dropped. Requires the `notifications:write` scope; a listing-scoped API key cannot call it.14 params
Update the acting user's notification preferences. Only the fields you pass are written: a scope array REPLACES that category's subscriptions wholesale (pass [] to silence the category), while channel_preferences and message_channel_preferences merge per key, so categories and channels you omit keep their stored values. Read the current settings first — get_notification_settings returns the legal values for every field. Only push and email delivery can be changed here; sms and slack are entitlement-gated, and escalation_reachability is read-only, both refused by name rather than silently dropped. Requires the `notifications:write` scope; a listing-scoped API key cannot call it.
ai_employee_cadencestringoptionalHow often AI employee digest notifications are sent.ai_employee_preferencesstringoptionalNotification event scopes to subscribe to for AI employee notifications. Replaces the entire category wholesale; pass [] to silence it.autopilot_nudge_preferencesstringoptionalNotification event scopes to subscribe to for autopilot nudge notifications. Replaces the entire category wholesale; pass [] to silence it.channel_preferencesstringoptionalPer-category delivery-channel toggles, keyed by category then channel name. Merged per key, so categories and channels you omit keep their stored values.cleaning_guest_checkout_enabledstringoptionalWhether guest-checkout cleaning notifications are enabled.cleaning_needs_attention_enabledstringoptionalWhether "cleaning needs attention" notifications are enabled.cleaning_preferencesstringoptionalNotification event scopes to subscribe to for cleaning notifications. Replaces the entire category wholesale; pass [] to silence it.cleaning_reminders_enabledstringoptionalWhether cleaning reminder notifications are enabled.message_channel_preferencesstringoptionalPer-channel toggles for message notifications, keyed by channel name. Merged per key, so channels you omit keep their stored values.message_preferencesstringoptionalNotification event scopes to subscribe to for guest message notifications. Replaces the entire category wholesale; pass [] to silence it.reservation_preferencesstringoptionalNotification event scopes to subscribe to for reservation notifications. Replaces the entire category wholesale; pass [] to silence it.task_needs_attention_enabledstringoptionalWhether "task needs attention" notifications are enabled.task_preferencesstringoptionalNotification event scopes to subscribe to for task notifications. Replaces the entire category wholesale; pass [] to silence it.task_reminders_enabledstringoptionalWhether task reminder notifications are enabled.prohostaimcp_update_owner#Update an existing owner. Only provided fields are written. Passing ``listing_ids`` REASSIGNS the owner's listings — the owner ends up owning exactly the listings supplied (unlinking any others); pass ``[]`` to unlink all. Unlike the REST ``PATCH /owners`` endpoint, this MCP tool supports listing reassignment.17 params
Update an existing owner. Only provided fields are written. Passing ``listing_ids`` REASSIGNS the owner's listings — the owner ends up owning exactly the listings supplied (unlinking any others); pass ``[]`` to unlink all. Unlike the REST ``PATCH /owners`` endpoint, this MCP tool supports listing reassignment.
owner_idstringrequiredThe unique identifier of the owner to update.address_line1stringoptionalUpdated first line of the owner's mailing address.address_line2stringoptionalUpdated second line of the owner's mailing address.citystringoptionalUpdated city of the owner's mailing address.commission_ratestringoptionalUpdated commission rate charged to this owner.commission_typestringoptionalUpdated commission calculation type (e.g. percentage or flat_fee).company_namestringoptionalUpdated company name associated with the property owner.countrystringoptionalUpdated country of the owner's mailing address.emailstringoptionalUpdated email address of the property owner.listing_idsstringoptionalListing IDs to reassign to this owner. This REPLACES the owner's current listings — the owner ends up owning exactly the listings supplied (unlinking any others). Pass an empty array to unlink all listings.namestringoptionalUpdated full name of the property owner.notesstringoptionalUpdated free-form internal notes about the owner.phonestringoptionalUpdated phone number of the property owner.postal_codestringoptionalUpdated postal or ZIP code of the owner's mailing address.state_provincestringoptionalUpdated state or province of the owner's mailing address.statusstringoptionalUpdated status of the owner (e.g. active or inactive).tax_idstringoptionalUpdated tax identification number (e.g. SSN or EIN) for the owner.prohostaimcp_update_owner_statement#Update an existing owner statement. Only provided fields are written.20 params
Update an existing owner statement. Only provided fields are written.
statement_idstringrequiredThe unique identifier of the owner statement to update.from_datestringoptionalUpdated start date of the statement period (ISO 8601).invoice_numberstringoptionalUpdated invoice number to associate with the statement.logostringoptionalUpdated URL or reference to a logo image to display on the statement.notesstringoptionalUpdated free-form notes to include on the statement.owner_idstringoptionalUpdated owner ID this statement is associated with.property_manager_addressstringoptionalUpdated property manager's mailing address to display on the statement.property_manager_emailstringoptionalUpdated property manager's email to display on the statement.property_manager_namestringoptionalUpdated property manager's name to display on the statement.property_manager_phonestringoptionalUpdated property manager's phone number to display on the statement.property_manager_tax_numberstringoptionalUpdated property manager's tax identification number to display on the statement.property_owner_addressstringoptionalUpdated property owner's mailing address to display on the statement.property_owner_emailstringoptionalUpdated property owner's email to display on the statement.property_owner_namestringoptionalUpdated property owner's name to display on the statement.property_owner_phonestringoptionalUpdated property owner's phone number to display on the statement.property_owner_tax_numberstringoptionalUpdated property owner's tax identification number to display on the statement.rental_activity_display_typestringoptionalUpdated display type for rental activity line items on the statement.statusstringoptionalUpdated status of the statement (e.g. draft, sent, paid).titlestringoptionalUpdated title of the owner statement.to_datestringoptionalUpdated end date of the statement period (ISO 8601).prohostaimcp_update_pin#Update a pin's category, position, or host note override.4 params
Update a pin's category, position, or host note override.
pin_idstringrequiredThe unique identifier of the pin to update.categorystringoptionalNew category to file this pin under. Leave unset to keep the current category.host_note_overridestringoptionalNew host note override for this pin. Leave unset to keep the current value.positionstringoptionalNew sort position for the pin within its category. Leave unset to keep the current position.prohostaimcp_update_place#Patch fields on an existing place. Only fields with a non-null value are applied — the MCP/JSON-RPC binding cannot distinguish an explicit `null` from an omitted argument, so this tool cannot clear nullable fields. To clear a field, use `PUT /v1/places/{id}` with an explicit `null` in the JSON body.10 params
Patch fields on an existing place. Only fields with a non-null value are applied — the MCP/JSON-RPC binding cannot distinguish an explicit `null` from an omitted argument, so this tool cannot clear nullable fields. To clear a field, use `PUT /v1/places/{id}` with an explicit `null` in the JSON body.
place_idstringrequiredThe unique identifier of the place to update.addressstringoptionalNew street address for the place. Omit to leave unchanged.descriptionstringoptionalNew free-text description for the place. Omit to leave unchanged.latitudestringoptionalNew latitude coordinate for the place. Omit to leave unchanged.listing_tag_idsstringoptionalNew list of listing tag IDs to associate with the place. Omit to leave unchanged.longitudestringoptionalNew longitude coordinate for the place. Omit to leave unchanged.namestringoptionalNew name for the place. Omit to leave unchanged.phonestringoptionalNew contact phone number for the place. Omit to leave unchanged.photo_urlstringoptionalNew photo URL for the place. Omit to leave unchanged.website_urlstringoptionalNew website URL for the place. Omit to leave unchanged.prohostaimcp_update_reservation#Update a public-safe subset of fields on a reservation: `custom_fields` (full replace) and guest contact details. Status, cancel, and Airbnb actions are deferred.10 params
Update a public-safe subset of fields on a reservation: `custom_fields` (full replace) and guest contact details. Status, cancel, and Airbnb actions are deferred.
reservation_idstringrequiredThe unique identifier of the reservation to update.custom_fieldsstringoptionalFull replacement for the reservation's custom fields. Provide the complete set of key/value pairs; this replaces existing custom fields rather than merging.guest_addressstringoptionalThe guest's street address.guest_citystringoptionalThe guest's city.guest_countrystringoptionalThe guest's country.guest_emailstringoptionalThe guest's email address.guest_first_namestringoptionalThe guest's first name.guest_last_namestringoptionalThe guest's last name.guest_phonestringoptionalThe guest's phone number.guest_postal_codestringoptionalThe guest's postal or ZIP code.prohostaimcp_update_saved_reply#Update fields on a saved reply.6 params
Update fields on a saved reply.
saved_reply_idstringrequiredThe unique identifier of the saved reply to update.categorystringoptionalNew category to group this saved reply under.messagestringoptionalNew message body for the saved reply.shortcutstringoptionalNew text shortcut that expands to this saved reply.sort_orderstringoptionalPosition of this saved reply in the picker list (lower sorts first).titlestringoptionalNew title for the saved reply.prohostaimcp_update_scheduled_message#Edit the body and/or send time of a scheduled message that hasn't been sent. Only ``scheduled``/``paused`` rows from source=``api`` or source=``mcp`` are editable.4 params
Edit the body and/or send time of a scheduled message that hasn't been sent. Only ``scheduled``/``paused`` rows from source=``api`` or source=``mcp`` are editable.
conversation_idstringrequiredThe conversation the scheduled message belongs to.scheduled_message_idstringrequiredThe scheduled message to edit.messagestringoptionalNew message body.scheduled_atstringoptionalNew ISO 8601 send time.prohostaimcp_update_tag_section#Patch fields on a tag-scoped section.7 params
Patch fields on a tag-scoped section.
section_idstringrequiredThe unique identifier of the tag-scoped section to update.contentstringoptionalNew markdown content for the section. Omit to leave the existing content unchanged.iconstringoptionalNew icon identifier for the section. Omit to leave unchanged.parent_idstringoptionalID of a new parent section to nest this section under. Omit to leave unchanged.section_typestringoptionalNew section type. Omit to leave the existing type unchanged.titlestringoptionalNew title for the section. Omit to leave the existing title unchanged.unlock_before_checkinstringoptionalHow many hours before check-in this section becomes visible to guests. Omit to leave unchanged.prohostaimcp_update_task#Update a task's status, priority, description, or other fields. Changing status runs the task work-session timer: 'in_progress' starts it (and snapshots the assignee's rate), any other status stops it, and 'completed' also finalizes the billable duration. Re-sending the status a task already has does not restart the timer.9 params
Update a task's status, priority, description, or other fields. Changing status runs the task work-session timer: 'in_progress' starts it (and snapshots the assignee's rate), any other status stops it, and 'completed' also finalizes the billable duration. Re-sending the status a task already has does not restart the timer.
task_idstringrequiredThe unique identifier of the task to update.assignee_idsstringoptionalNew complete list of user IDs to assign this task to.categorystringoptionalNew category for the task.descriptionstringoptionalNew description for the task.due_datestringoptionalNew ISO 8601 due date for the task.prioritystringoptionalNew priority level for the task.sourcestringoptionalNew source for the task. One of review, message, or manual.statusstringoptionalNew status for the task.titlestringoptionalNew title for the task.prohostaimcp_update_task_checklist#Update fields on a task checklist.5 params
Update fields on a task checklist.
checklist_idstringrequiredThe unique identifier of the checklist to update.task_idstringrequiredThe unique identifier of the task the checklist belongs to.descriptionstringoptionalNew description for the checklist.orderstringoptionalNew position for the checklist among the task's checklists.titlestringoptionalNew title for the checklist.prohostaimcp_update_upgrade_option#Patch fields on an existing upgrade option.7 params
Patch fields on an existing upgrade option.
guidebook_idstringrequiredThe unique identifier of the guidebook that owns this upgrade option.upgrade_option_idstringrequiredThe unique identifier of the upgrade option to update.descriptionstringoptionalNew description for the upgrade option. Omit to leave unchanged.enabledstringoptionalWhether the upgrade option should be enabled/visible to guests. Omit to leave unchanged.pricestringoptionalNew price for the upgrade option. Omit to leave unchanged.titlestringoptionalNew title for the upgrade option. Omit to leave unchanged.upgrade_typestringoptionalNew type/scope for the upgrade option. Omit to leave unchanged.prohostaimcp_update_workflow#Update an existing automation workflow in place. Only the fields you pass change (partial update). Pass steps to REPLACE the workflow's entire step list (each step is {order, instruction, tool_name?, skill_key?, delay_seconds?}); omit it to leave the steps untouched. listing_ids replaces the workflow's listing scope. Editing an existing workflow does not require approval (unlike create_workflow).8 params
Update an existing automation workflow in place. Only the fields you pass change (partial update). Pass steps to REPLACE the workflow's entire step list (each step is {order, instruction, tool_name?, skill_key?, delay_seconds?}); omit it to leave the steps untouched. listing_ids replaces the workflow's listing scope. Editing an existing workflow does not require approval (unlike create_workflow).
workflow_idstringrequiredThe unique identifier of the workflow to update.descriptionstringoptionalNew description for the workflow.enabledstringoptionalEnable or disable the workflow.listing_idsstringoptionalReplacement list of listing IDs to scope the workflow to.namestringoptionalNew name for the workflow.stepsstringoptionalReplacement list for the workflow's entire step list.trigger_configstringoptionalNew configuration object for the trigger.trigger_typestringoptionalNew trigger type for the workflow.prohostaimcp_upload_cleaning_attachment#Register one or more attachment URLs on a cleaning. Clients upload to S3 first via the in-app presigned URLs, then pass the resulting URLs here.2 params
Register one or more attachment URLs on a cleaning. Clients upload to S3 first via the in-app presigned URLs, then pass the resulting URLs here.
attachment_urlsarrayrequiredThe already-uploaded attachment URLs to register on the cleaning.cleaning_idstringrequiredThe unique identifier of the cleaning to attach files to.prohostaimcp_upload_contact_photo#Generate a presigned S3 PUT URL for a contact's photo. The client should upload the bytes to the returned `presigned_url`. Allowed content types: `image/jpeg`, `image/png`.2 params
Generate a presigned S3 PUT URL for a contact's photo. The client should upload the bytes to the returned `presigned_url`. Allowed content types: `image/jpeg`, `image/png`.
contact_idstringrequiredThe unique identifier of the contact to upload a photo for.content_typestringrequiredThe MIME content type of the photo being uploaded. Allowed values: image/jpeg, image/png.prohostaimcp_upload_guidebook_image#Return a presigned PUT URL for uploading a guidebook image to S3. After PUT, embed the public S3 URL (presigned URL minus query string) in a section's markdown content.2 params
Return a presigned PUT URL for uploading a guidebook image to S3. After PUT, embed the public S3 URL (presigned URL minus query string) in a section's markdown content.
content_typestringrequiredThe MIME content type of the image being uploaded.guidebook_idstringrequiredThe unique identifier of the guidebook to upload an image for.prohostaimcp_upload_place_photo#Return a presigned PUT URL for uploading a place photo to S3. After PUT, call update_place with photo_url=<public S3 URL>.2 params
Return a presigned PUT URL for uploading a place photo to S3. After PUT, call update_place with photo_url=<public S3 URL>.
content_typestringrequiredThe MIME type of the photo file to upload (e.g. image/jpeg).place_idstringrequiredThe unique identifier of the place to upload a photo for.