BlueSuite Developers
MCPTool reference

Jobs

BlueSuite MCP tools for jobs

See connection and authentication and workflow rules before calling these tools.

Related REST API and behavior.

list_jobs

List jobs with optional pagination and search

Parameters

FieldType / accepted valuesRequiredDetails
pageintegerNoPage number (default: 1)
per_pageintegerNoResults per page (default: 25) minimum: 1. maximum: 100.
searchstringNoSearch jobs
sort_by"id", "number", "name", "status", "type", "total", "expected_end_date", "created_at", "modified_at"NoField to sort by. Unknown values fall back to the default sort.
sort_direction"asc", "desc"NoSort direction
contact_idintegerNoFilter by contact ID
quote_idJSON valueNoFilter by quote ID
statusarray of "draft", "scheduled", "in_progress", "on_hold", "completed", "cancelled"NoFilter by one or more statuses.
derived_statearray of "missed", "overdue", "action_required", "needs_invoicing", "unscheduled", "awaiting_payment"NoFilter by one or more derived conditions: needs_invoicing (work done, not yet invoiced), unscheduled (no appointment booked), missed, overdue, awaiting_payment, action_required. Use this for questions about what needs attention rather than filtering on status.
tag_idsarray of JSON valueNoFilter to records carrying ANY of these tag IDs (not all). Use list_tags with the matching taggable_type to resolve tag names to IDs first.

Result

FieldType / accepted valuesRequiredDetails
dataarray of objectYesThe matching records for this page.
paginationobjectNoHow many more pages of results exist. Absent when the API returned an unpaged result.
pagination.pageintegerWhen parent suppliedCurrent page number, 1-based.
pagination.per_pageintegerWhen parent suppliedNumber of results per page.
pagination.total_pagesintegerWhen parent suppliedTotal number of pages available.

create_job

Create a new job

Parameters

FieldType / accepted valuesRequiredDetails
namestringNoJob name/title
contact_idintegerNoAssociated contact ID
property_idJSON valueNoAssociated property ID
request_idJSON valueNoAssociated request ID
quote_idJSON valueNoAssociated quote ID
salesperson_idstringNoUUID of salesperson. Use list_users to resolve names. Format: uuid.
line_itemsarray of object or objectNoArray of line item objects. Two shapes are accepted: a regular priced row ({ name, quantity, unit_price }) or an inline image row ({ _type: "image", image_path, image_id, description }). For image rows: first call upload_file with module_type="workspace", category="line_item", is_public=true to upload the image, then pass the returned path as image_path and id as image_id.
line_items[]._type"lineItem"NoFor lineItem rows. Defaults to lineItem when omitted.
line_items[].namestringFor this variantFor lineItem rows. Item name
line_items[].descriptionstringNoFor lineItem rows. Plain text description for this line item. Omit when not needed. Default: "".
line_items[].quantitynumberNoFor lineItem rows. Quantity Default: 1.
line_items[].unit_pricenumberFor this variantFor lineItem rows. Price per unit
line_items[].taxablebooleanNoFor lineItem rows. Whether the item is taxable
line_items[].optionalbooleanNoFor lineItem rows. Whether the item is optional
line_items[]._type"image"For this variantFor image rows.
line_items[].image_pathstringFor this variantFor image rows. Storage path returned by a prior upload_file call. Upload with module_type="workspace", category="line_item", is_public=true to get a usable path. minLength: 1.
line_items[].image_idintegerNoFor image rows. Upload link ID (id) returned by the same upload_file call.
line_items[].descriptionstringNoFor image rows. Caption shown beneath the image in the line items list.
discountnumberNoDiscount amount (default: 0)
discount_unit"percent", "amount"NoHow the discount is expressed. One of: 'percent' (a percentage of the subtotal) or 'amount' (a fixed currency amount). Default: 'percent'.
depositnumberNoDeposit amount (default: 0)
deposit_unitJSON valueNoHow the deposit is expressed. One of: 'percent' or 'amount'. Default: 'percent'.
tax_ratenumberNoTax rate percentage (default: 0)
tax_rate_idJSON valueNoTax rate preset ID
totalnumberNoJob total
type"one-off", "recurring"NoJob type (default: one-off)
status"completed", "cancelled"NoInitial status. Only completed and cancelled can be set; otherwise status follows the job's appointments.
billing_type"per_visit", "manual"NoHow the job gets invoiced. 'per_visit' automatically creates and sends an invoice each time an appointment is completed. 'manual' means the business invoices on its own schedule. Defaults to 'per_visit', ask the user which they want for recurring work rather than assuming, because the default sends real invoices to their client.
invoice_autopaybooleanNoCharge the client's saved payment method automatically when an invoice is auto-created. Only meaningful with billing_type='per_visit'. Default: false.
invoice_payment_terms"due_on_receipt", "net_7", "net_14", "net_30", "net_60", "net_90"NoPayment terms applied to invoices generated from this job.
waive_credit_card_feebooleanNoSkip the workspace's online processing fee for this record. Only meaningful when the workspace passes processing fees on to clients. Nothing is charged against a job directly; the waiver rides onto invoices created from it. Default: false.
expected_end_datestringNoExpected end date (YYYY-MM-DD)
custom_fieldsobjectNoCustom field values

Result

FieldType / accepted valuesRequiredDetails
dataobject or nullYesThe affected record, or the result of the operation. Null when nothing matched.

get_job

Get a single job by ID with expanded details

Parameters

FieldType / accepted valuesRequiredDetails
idintegerYesJob ID

Result

FieldType / accepted valuesRequiredDetails
dataobject or nullYesThe affected record, or the result of the operation. Null when nothing matched.

update_job

Update an existing job. For an in-progress job that requires change orders, line items, discounts, and taxes cannot be changed here; create a change order in the dashboard. Omit line_items when only updating job details. Setting status here applies the same completion rules as update_job_status (for example, required forms must be filled in before a job can be completed), so prefer that tool when status is the only change.

Parameters

FieldType / accepted valuesRequiredDetails
idintegerYesJob ID
namestringNoJob name/title
status"completed", "cancelled", "reopen"NoChange the job status as part of this update. Prefer update_job_status when status is the only thing changing. Draft, Scheduled and Ongoing are derived from appointments and cannot be set.
contact_idJSON valueNoAssociated contact ID
property_idJSON valueNoAssociated property ID
request_idJSON valueNoAssociated request ID
quote_idJSON valueNoAssociated quote ID
salesperson_idstringNoUUID of salesperson. Use list_users to resolve names. Format: uuid.
line_itemsarray of object or objectNoArray of line item objects. Two shapes are accepted: a regular priced row ({ name, quantity, unit_price }) or an inline image row ({ _type: "image", image_path, image_id, description }). For image rows: first call upload_file with module_type="workspace", category="line_item", is_public=true to upload the image, then pass the returned path as image_path and id as image_id.
line_items[]._type"lineItem"NoFor lineItem rows. Defaults to lineItem when omitted.
line_items[].namestringFor this variantFor lineItem rows. Item name
line_items[].descriptionstringNoFor lineItem rows. Plain text description for this line item. Omit when not needed. Default: "".
line_items[].quantitynumberNoFor lineItem rows. Quantity Default: 1.
line_items[].unit_pricenumberFor this variantFor lineItem rows. Price per unit
line_items[].taxablebooleanNoFor lineItem rows. Whether the item is taxable
line_items[].optionalbooleanNoFor lineItem rows. Whether the item is optional
line_items[]._type"image"For this variantFor image rows.
line_items[].image_pathstringFor this variantFor image rows. Storage path returned by a prior upload_file call. Upload with module_type="workspace", category="line_item", is_public=true to get a usable path. minLength: 1.
line_items[].image_idintegerNoFor image rows. Upload link ID (id) returned by the same upload_file call.
line_items[].descriptionstringNoFor image rows. Caption shown beneath the image in the line items list.
discountnumberNoDiscount amount
discount_unit"percent", "amount"NoHow the discount is expressed. One of: 'percent' (a percentage of the subtotal) or 'amount' (a fixed currency amount).
depositnumberNoDeposit amount
deposit_unitJSON valueNoHow the deposit is expressed. One of: 'percent' or 'amount'.
tax_ratenumberNoTax rate percentage
tax_rate_idJSON valueNoTax rate preset ID
totalnumberNoJob total
type"one-off", "recurring"NoJob type
billing_type"per_visit", "manual"NoHow the job gets invoiced. 'per_visit' automatically creates and sends an invoice each time an appointment is completed. 'manual' means the business invoices on its own schedule. Defaults to 'per_visit', ask the user which they want for recurring work rather than assuming, because the default sends real invoices to their client.
invoice_autopaybooleanNoCharge the client's saved payment method automatically when an invoice is auto-created. Only meaningful with billing_type='per_visit'.
invoice_payment_terms"due_on_receipt", "net_7", "net_14", "net_30", "net_60", "net_90"NoPayment terms applied to invoices generated from this job.
waive_credit_card_feebooleanNoSkip the workspace's online processing fee for this record. Only meaningful when the workspace passes processing fees on to clients. Nothing is charged against a job directly; the waiver rides onto invoices created from it. Default: false.
expected_end_datestringNoExpected end date (YYYY-MM-DD)
custom_fieldsobjectNoCustom field values

Result

FieldType / accepted valuesRequiredDetails
dataobject or nullYesThe affected record, or the result of the operation. Null when nothing matched.

setup_recurring_job

Put a job on a recurring appointment schedule, weekly lawn care, quarterly maintenance, and so on. Use this rather than create_event for anything tied to a job: it marks the job recurring, saves the billing settings the completion flow reads, and creates the appointment series in one step. A recurring job created without this stays unscheduled and never generates visits. Confirm the billing_type with the user first, since per_visit sends real invoices to their client after every visit.

Parameters

FieldType / accepted valuesRequiredDetails
idintegerYesJob ID to schedule.
start_datestringYesDate of the first appointment (YYYY-MM-DD).
end_dateJSON valueNoEnd date of each appointment, for visits spanning more than one day.
start_timestringNoStart time (HH:MM). Required unless all_day is true.
end_timeJSON valueNoEnd time (HH:MM). Required unless all_day is true.
all_daybooleanNoWhether each visit takes the whole day.
multi_dayJSON valueNoWhether each visit spans multiple days.
is_flexibleJSON valueNoWhether scheduling may move the visit within the day.
duration_minutesintegerNoExpected length of each visit in minutes.
assignee_idsarray of stringNoUUIDs of the team members assigned. Use list_users to resolve names.
billing_type"per_visit", "manual"NoHow the job gets invoiced. 'per_visit' automatically creates and sends an invoice each time an appointment is completed. 'manual' means the business invoices on its own schedule. Defaults to 'per_visit', ask the user which they want for recurring work rather than assuming, because the default sends real invoices to their client.
payment_terms"due_on_receipt", "net_7", "net_14", "net_30", "net_60", "net_90"NoPayment terms on invoices generated from these visits.
repeat_frequencyJSON valueNoInterval between visits, used when repeat_frequency_unit is 'custom' (2 with a custom weekly unit means every 2 weeks). Default: 1.
repeat_frequency_unit"daily", "weekly", "monthly", "yearly", "custom", "forever", "occurrences"NoHow often the visit repeats: daily, weekly, monthly, yearly, or 'custom'. Default: weekly.
repeat_frequency_unit_custom"daily", "weekly", "monthly", "yearly", "custom", "forever", "occurrences"NoUnit the custom interval counts in. Only used when repeat_frequency_unit is 'custom'.
repeat_frequency_scheduleobjectNoWhich days a custom weekly or monthly pattern lands on. Required for those patterns.
repeat_frequency_schedule.daysarray of JSON valueWhen parent suppliedDays to repeat on: 1-7 for weekdays, 1-31 for days of the month.
repeat_frequency_schedule.type"weekDays", "monthWeekDays", "monthDays"When parent supplied
repeat_durationJSON valueNoHow long the schedule runs. With repeat_duration_unit='occurrences' this is a visit count. Required unless it repeats forever.
repeat_duration_unit"daily", "weekly", "monthly", "yearly", "custom", "forever", "occurrences"NoHow the schedule ends: 'forever', 'occurrences' (a fixed number of visits), or a time unit. Default: forever.

Result

FieldType / accepted valuesRequiredDetails
dataobject or nullYesThe affected record, or the result of the operation. Null when nothing matched.

end_recurring_job_schedule

Stop a job's recurring schedule from a given date. Use this when the user says to stop, cancel or end repeating work, do NOT delete the job, which would take its history with it. This is a cutoff, not a delete: visits after the date are removed, while visits on or before it, and anything already completed or invoiced, are kept. Confirm the date with the user, since "stop after this month" and "stop immediately" remove different visits.

Parameters

FieldType / accepted valuesRequiredDetails
idintegerYesJob ID whose schedule should end.
end_datestringYesLast date the schedule runs (YYYY-MM-DD). Visits after this date are removed.

Result

FieldType / accepted valuesRequiredDetails
dataobject or nullYesThe affected record, or the result of the operation. Null when nothing matched.

delete_job

Delete a job and everything that hangs off it. Every appointment cascades away, including completed visits, along with expenses and change orders; invoices and time entries survive but lose their link to the job. For a recurring job this destroys the whole visit history, to stop repeating work use end_recurring_job_schedule, which keeps the past and only removes visits after a cutoff. Confirm with the user first; there is no undo.

Parameters

FieldType / accepted valuesRequiredDetails
idintegerYesJob ID

Result

FieldType / accepted valuesRequiredDetails
dataobject or nullYesThe affected record, or the result of the operation. Null when nothing matched.

hold_job

Place a job on hold with a reason, optional notes, and an optional follow-up date. Confirm whether upcoming unstarted appointments should be cancelled to release their time slots or kept booked. Completed and in-progress visits are preserved. Existing invoices and payments are unaffected. The person placing the hold receives email and dashboard follow-ups when due. For recurring jobs, cancel_appointments=true also pauses new visits; false keeps existing appointments and continues normal generation. Service plans are not supported.

Parameters

FieldType / accepted valuesRequiredDetails
idintegerYesJob ID
reason"customer", "materials", "approval", "weather", "other"Yes
notesstringNomaxLength: 2000.
follow_up_onstringNoOptional follow-up date, YYYY-MM-DD. Does not automatically resume the job.
cancel_appointmentsbooleanYesRequired explicit choice: true cancels upcoming unstarted appointments; false keeps them booked.

Result

FieldType / accepted valuesRequiredDetails
dataobject or nullYesThe affected record, or the result of the operation. Null when nothing matched.

resume_job

Resume an on-hold job. For recurring jobs whose hold_cancel_appointments is true and whose schedule has not been explicitly ended, resume_on is required: visits restart on the original recurrence pattern from that date without catch-up visits. If all schedules have been explicitly ended, omit resume_on; resuming clears the hold without restarting them. If hold_cancel_appointments is false, omit resume_on; appointments continue unchanged. End dates and occurrence limits stay unchanged. Read the current job first and pass its held_at timestamp so a stale request cannot resume a newer hold. Status is recalculated from existing work. Cancelled records stay in history. Recurring visits are generated again from resume_on; one-off appointments must be scheduled separately.

Parameters

FieldType / accepted valuesRequiredDetails
idintegerYesJob ID
expected_held_atstringYesExact held_at timestamp from get_job. Format: date-time.
resume_onstringNoRequired only when hold_cancel_appointments is true on a recurring job with a schedule that has not been explicitly ended: resume appointments on or after this date (YYYY-MM-DD), today or later.

Result

FieldType / accepted valuesRequiredDetails
dataobject or nullYesThe affected record, or the result of the operation. Null when nothing matched.

update_job_status

Change a job's status with completion rules enforced. Use hold_job and resume_job to manage holds. Draft, Scheduled and Ongoing are derived from the job's appointments and cannot be set by hand. Use "reopen" to bring a completed or cancelled job back; the correct status is then re-derived from its appointments.

Parameters

FieldType / accepted valuesRequiredDetails
idintegerYesJob ID
status"completed", "cancelled", "reopen"Yescompleted, cancelled, or reopen. Completing fails if the job has required forms that are not filled in yet.

Result

FieldType / accepted valuesRequiredDetails
dataobject or nullYesThe affected record, or the result of the operation. Null when nothing matched.

The downloadable tool schemas include the full input and output contracts. Tables describe schema-level required fields; cross-field rules still apply.

On this page