Connecteam
Field service
FloConnector is a hosted ServiceM8 MCP server. Securely connect Claude, ChatGPT and other AI clients to ServiceM8. Ask in plain English; it runs the 167 tools for you, behind one endpoint, with you deciding what it can touch.
Beta. Connect it today and every tool below is live. It is new enough that we are still testing it against real ServiceM8 accounts, so tell us if something looks off and we will fix it fast.
Built in-house. We wrote this connector ourselves and call ServiceM8 directly, with no third party in the path. Nothing in a request or response is retained by anyone but ServiceM8.
Single connection. One ServiceM8 organisation per workspace. Connect another in a separate workspace.
Tools
167 tools your agent gets the moment ServiceM8 is connected.
167 tools
List jobs (quotes, work orders, completed and unsuccessful jobs). Supports a $filter expression and pages via cursor.
Fetch a single job by UUID.
Create a new job (quote or work order) against a client.
Update a job's fields, e.g. change its status to move it through the Dispatch Board, place it in a queue, or set its badges.
Archive (soft-delete) a job — sets active to 0. The record stays readable by UUID but this is NOT reversible through the API: ServiceM8 does not accept `active` as a writable field.
List clients (companies). Supports a $filter expression and pages via cursor.
Fetch a single client by UUID.
Create a new client (company).
Update a client's fields. Clients cannot be archived through this connection — that hides their whole job and invoice history irreversibly, so do it in the ServiceM8 UI.
List notes (e.g. job notes — filter with $filter="related_object eq 'job' and related_object_uuid eq '<uuid>'").
Fetch a single note by UUID.
Attach a new note to a job or other object.
Update a note's text or follow-up action.
Archive (soft-delete) a note — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field.
List payments recorded against jobs. Supports a $filter expression, e.g. by job_uuid.
Fetch a single job payment by UUID.
Record a new payment against a job.
Update a recorded job payment's fields.
Archive (soft-delete) a job payment — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field. This is a FINANCIAL record, and archiving it does NOT clear the job's payment_received / payment_amount fields — clear those explicitly with servicem8_update_job or the job will still look paid.
List dispatch queues (e.g. Workshop, Pending Quotes).
Fetch a single job queue by UUID.
Create a new dispatch queue.
Update a dispatch queue's fields.
Archive (soft-delete) a job queue — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field. Account-wide, and note a job cannot be moved OUT of a queue through the API, only between queues — so archiving a queue that still holds jobs leaves them pointing at a dead queue.
List job activities — the source for timesheets/labour hours. Filter with $filter, e.g. "activity_was_recorded eq 1 and staff_uuid eq '<uuid>'" for one staff member's actual worked time, or add job_uuid to scope to one job.
Fetch a single job activity by UUID.
Log a new job activity — a scheduled slot (activity_was_scheduled) or a recorded worked-time entry (activity_was_recorded).
Update a job activity's fields, e.g. mark it recorded once the work is actually done.
Archive (soft-delete) a job activity — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field. Job activities are the source for timesheets and labour costs, so archiving one changes reported hours.
Free-text search across jobs, companies, and materials in one call, ranked by relevance.
Free-text search scoped to one object type — job, company, material, knowledgearticle, attachment, formresponse, asset, or materialbundle.
AI embedding-based search for jobs by meaning rather than exact keywords — e.g. "leaking pipe" can match a job described as "fixing a burst tap". Returns a similarity_score per result.
List the account's registered locations/sites.
Fetch a single location by UUID.
Create a new location/site record.
Update a location's fields. NOTE ServiceM8 re-geocodes from the address on every update and OVERWRITES lat/lng with its own result — even if you don't send them, and even if they were set explicitly at create. Re-send lat/lng on each update if you need specific coordinates held.
Archive (soft-delete) a location — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field. Account-wide.
List the price-book/inventory catalog of materials, products and labour rates.
Fetch a single material by UUID.
Add a new material/product/labour rate to the catalog.
Update a material's fields, e.g. price or stock quantity.
Archive (soft-delete) a material — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field. Account-wide price book: every job line already referencing this material keeps its values, but the catalog entry is gone.
List staff members. Composio's ServiceM8 toolkit only ever exposed retrieve-by-uuid for this resource — this is the list.
Fetch a single staff member by UUID.
Update an existing staff member's details — job title, mobile, schedule visibility, dispatch colour, security role or labour rate. Note `email` is also their LOGIN name, so changing it changes how they sign in. Staff members cannot be added or archived through this connection: that allocates or frees a licence seat and emails the person, so it belongs in the ServiceM8 UI.
List tasks. Supports a $filter expression, e.g. by related_object/related_object_uuid or assigned_to_staff_uuid.
Fetch a single task by UUID.
Create a new task against a job or other object (related_object and related_object_uuid are both required in practice, despite the docs). SIDE EFFECT: a task on a job also creates a JobChecklist item with its own separate UUID, and servicem8_delete_task does NOT remove it — check servicem8_list_job_checklists if you later clean up. Note ServiceM8 also shifts due_date forward by a day on each write.
Update a task's fields, e.g. mark it complete.
Archive (soft-delete) a task — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field. This leaves behind the JobChecklist item that creating the task also generated — archive that separately with servicem8_delete_job_checklist.
List form templates.
Fetch a single form by UUID.
Create a new form template. badge_name is required — ServiceM8 rejects a form without one.
Update a form template's fields. NOTE `document_template_uuid` is silently ignored here — ServiceM8 returns OK and the link is not stored, so a form cannot be pointed at a document template through this connection. Do that in the ServiceM8 UI.
Archive (soft-delete) a form — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field. Account-wide: existing form responses keep their answers but lose the template that gave them meaning.
List document templates (used by forms and generated documents).
Fetch a single document template by UUID.
Create a new blank document template. LIMITED USE: `name` is the only settable field, and ServiceM8 makes `template_type` and `related_object` read-only, so the result is an untyped template that servicem8_produce_document cannot render and no form can generate into. Build real templates in the ServiceM8 UI; this is only useful as a placeholder to rename later.
Rename a document template.
Archive (soft-delete) a document template — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field. Account-wide: forms and produce_document calls relying on this template will stop rendering.
List tracked assets (equipment/serialised items attached to clients).
Fetch a single asset by UUID.
Update an asset's fields, including its custom AssetType field values.
Archive (soft-delete) an asset — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, and there is no create_asset tool, so an asset archived here CANNOT be recreated through this connection.
Send an email to a customer or staff member through ServiceM8's messaging infrastructure, linked to a job's diary. Supports an HTML body, a plain-text body, cc, reply-to and attachments. The From address is set by ServiceM8 and cannot be overridden.
Send an SMS to a customer or staff member, linked to a job's diary. INCURS PER-MESSAGE ACCOUNT CHARGES on the ServiceM8 account, and messages over 153 characters consume multiple SMS credits. Marketing and promotional SMS is not permitted by ServiceM8.
Render a Quote, Work Order or Invoice for a job as a PDF, using a document template. NOT read-only, and it mutates the job in two separate ways: templateType 'Invoice' stamps the job's invoice_date, and storeToDiary: true ALSO stamps invoice_date even for a Quote or Work Order. So filing any document to the diary marks the job as invoiced — treat this as a billing action, never a preview. storeToDiary is still the only practical way to keep the output, because the returned bytes are large and are not retrievable through this connection; just don't use it on a job you don't intend to invoice.
List file attachments (photos, signed forms, generated documents) with their metadata. Filter to one job with a $filter like "related_object_uuid eq '<job uuid>'". This returns metadata only, NOT the images themselves — to actually look at a job's photos, use servicem8_get_job_photos.
Fetch a single attachment's metadata by UUID. Returns the file name, type and size, not the file itself — use servicem8_get_job_photos to view photos.
Update an attachment's metadata (name, tags, which record it relates to). Does not change the file itself.
LOOK AT the photos attached to a job — returns the actual images, so you can describe damage, read a serial number or meter, check whether work was completed, or compare before/after shots. Use this whenever a question is about what a photo SHOWS. Returns the newest photos first, 5 by default and at most 20; images are downscaled for transfer, so read fine print with care and say so if it is not legible. Use servicem8_list_attachments instead if you only need file names and metadata.
List job contacts. Filter by job with a $filter like "job_uuid eq '<uuid>'" — a job's contact name, phone and email live here, not on the job record.
Fetch a single job contact by UUID.
Add a contact to a job (job contact, billing contact or property manager). This is how you set the phone/email shown on a job. SIDE EFFECT: ServiceM8 also creates a matching client-level CompanyContact with its own separate UUID, which servicem8_delete_job_contact does NOT remove — if you later clean up, check servicem8_list_company_contacts for the twin.
Update a job contact's name, phone, mobile, email or type.
Archive (soft-delete) a job contact — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field. Note this leaves behind the client-level CompanyContact that creating the job contact also generated — archive that separately with servicem8_delete_company_contact.
List client-level contacts. Filter to one client with a $filter like "company_uuid eq '<uuid>'".
Fetch a single company contact by UUID.
Add a contact to a client.
Update a company contact's details.
Archive (soft-delete) a company contact — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here.
List job billing line items (materials and labour charged to jobs). Filter to one job's invoice contents with a $filter like "job_uuid eq '<uuid>'".
Fetch a single job line item by UUID.
Add a billing line item (material or labour) to a job. `displayed_amount` is REQUIRED and must equal the UNIT price, not price x quantity — this holds even when you pass a material_uuid. If you get it wrong the error names the expected value, so it is self-correcting. Passing no material_uuid creates an ad-hoc line AND silently adds a matching Material to the price book.
Update a job line item's quantity, price, cost or description. Unlike create, this does NOT require displayed_amount.
Archive (soft-delete) a job line item — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field.
List material bundles applied to jobs. Filter to one job with a $filter like "job_uuid eq '<uuid>'".
Fetch a single job material bundle by UUID.
Apply a material bundle to a job.
Update a job material bundle's quantity or ordering.
Archive (soft-delete) a job material bundle — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here.
List job allocations (who a job is assigned to and when it's scheduled). Filter by staff or date with a $filter like "staff_uuid eq '<uuid>'".
Fetch a single job allocation by UUID.
Allocate a job to a staff member on a date — i.e. schedule it. Needs an allocation_window_uuid: call servicem8_list_allocation_windows first.
Update a job allocation, e.g. reassign it to different staff or move its date.
Archive (soft-delete) a job allocation — sets active to 0, unscheduling it. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here.
List job checklist items. Filter to one job with a $filter like "job_uuid eq '<uuid>'".
Fetch a single job checklist item by UUID.
Add a checklist item to a job.
Update a job checklist item, e.g. mark it complete or reassign it.
Archive (soft-delete) a job checklist item — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here.
List job templates — pre-built job definitions that can be turned into real jobs with servicem8_create_job_from_template.
Fetch a single job template by UUID.
Create a new job from a job template, inheriting the template's content, line items and badges. Prefer this over servicem8_create_job when a suitable template exists. Returns `{jobUUID, location, message}` — note that is a different shape from every other create tool (which return `recordUuid`) and it does NOT include the job number; read the job back with servicem8_get_job if you need `generated_job_id`.
List job categories (the type-of-work / department classifications shown on the Dispatch Board).
Fetch a single job category by UUID.
Create a new job category.
Update a job category's name or colour.
Archive (soft-delete) a job category — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here. Account-wide: every job already classified with this category is affected.
List the account's badge definitions. To see which badges are ON a job, read the job's `badges` field.
Fetch a single badge definition by UUID.
Create a new badge definition.
Update a badge definition.
Archive (soft-delete) a badge — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here. Account-wide: jobs already carrying this badge are affected.
List material bundles (named groups of price-book materials added to a job together).
Fetch a single material bundle, including its material list.
Create a material bundle from a list of materials and quantities.
Update a material bundle's name, code or material list.
Archive (soft-delete) a material bundle — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here. Account-wide price book: job lines already added from this bundle keep their values.
List the account's tax rates, with each rate's percentage and which one is the default. Use this to resolve a tax_rate_uuid for materials, clients and job line items. Tax rates are read-only through this connection.
Fetch a single tax rate by UUID. Tax rates are read-only through this connection — they are account-wide financial configuration and, on an accounting-integrated account, are managed in the accounting package.
List form fields. Filter to one form with a $filter like "form_uuid eq '<uuid>'".
Fetch a single form field by UUID.
Add a field to a form template.
Update a form field's label, configuration or order.
Archive (soft-delete) a form field — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here. Existing form responses keep their answers but lose this field definition.
List submitted form responses. Filter to one job or form with a $filter like "regarding_object_uuid eq '<uuid>'".
Fetch a single form response, including its submitted field data.
Record a form response (submitted form data) against a job or other object.
Update a form response's submitted data.
Archive (soft-delete) a form response — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here.
List asset types (the classes of tracked equipment).
Fetch a single asset type by UUID.
Create a new asset type.
Rename an asset type.
Archive (soft-delete) an asset type — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here. Account-wide: assets of this type keep their values but lose their type definition.
List asset type fields — the custom field definitions that an asset's field_data values refer to. Read these first to learn the field UUIDs you need before writing an asset's field_data.
Fetch a single asset type field by UUID.
Update an existing asset type field's label, configuration or order. New fields cannot be added through this connection — ServiceM8 makes asset_type_uuid read-only, so an API-created field would be orphaned from every asset type. Add fields in the ServiceM8 UI.
Archive (soft-delete) an asset type field — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field. Assets already holding a value for this field keep it but lose its definition.
List allocation windows (the named arrival windows a scheduled job can be pinned to).
Fetch a single allocation window by UUID.
Create a new allocation window.
Update an allocation window's name, times or ordering.
Archive (soft-delete) an allocation window — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here. Account-wide scheduling config: existing allocations pinned to this window are affected, and create_job_allocation requires a window.
List inbound inbox messages (customer emails, web-form enquiries, partner leads), newest first, with optional status filtering and free-text search. Pages via limit/offset (this endpoint does NOT use the cursor paging the rest of the API uses). Read-only — the inbox cannot be triaged through this connection.
Fetch a single inbox message by UUID, including its text and HTML bodies. Read-only: inbox messages cannot be created, archived, snoozed, noted or converted to jobs through this connection — ServiceM8 grants OAuth apps read access only. To act on an enquiry, read it here and then call servicem8_create_job.
List internal staff-to-staff messages. Filter by staff or job with a $filter like "to_staff_uuid eq '<uuid>'". Read-only: ServiceM8 defines no write scope for staff messages, so this connection cannot send them — use servicem8_send_email or servicem8_send_sms to reach a person.
Fetch a single staff message by UUID.
Archive (soft-delete) a staff message — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field.
List saved email templates. To send one, read its message and pass it to servicem8_send_email.
Fetch a single email template by UUID.
Create a new email template.
Update an email template's name, subject or body.
Archive (soft-delete) an email template — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here. Account-wide.
List saved SMS templates. To send one, read its message and pass it to servicem8_send_sms.
Fetch a single SMS template by UUID.
Create a new SMS template.
Update an SMS template's name or body.
Archive (soft-delete) an SMS template — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so this cannot be undone here. Account-wide.
List customer feedback entries captured by ServiceM8. Filter to one job with a $filter like "related_object_uuid eq '<uuid>'". Feedback cannot be created or edited through this connection — only read and archived.
Fetch a single feedback entry by UUID.
Archive (soft-delete) a feedback entry — sets active to 0. IRREVERSIBLE: ServiceM8 does not accept `active` as a writable field, so an archived entry cannot be restored through the API.
List the account's security roles (the permission sets assigned to staff via security_role_uuid). Read-only — roles are managed in the ServiceM8 UI.
Fetch a single security role by UUID.
List the connected ServiceM8 account's own business record(s) — company name, contact details and default email sender. This is your OWN business, not the suppliers you buy from; suppliers are not available through this connection.
Fetch a single vendor (account business record) by UUID.
No tools match your search.
Create a FloConnector workspace, connect ServiceM8 once from the dashboard, then add your FloConnector endpoint to Claude as a custom connector. Claude handles the sign-in prompt; there is no server to host and no code to write. The same endpoint works in ChatGPT.
167 tools: 78 that read ServiceM8 data and 89 that change it. Every tool is listed on this page, so you can see exactly what the model is able to call before you connect.
No. FloConnector holds the ServiceM8 credential, encrypted before it is stored, and calls ServiceM8 on the model's behalf. The AI client only ever sees the tools and their results, never the credential behind them.
Yes. Each connection is exposed through a profile, and a profile carries only the tools you switch on. Leave the 89 write tools off and the connection is read-only.
Yes. The endpoint is a standard hosted MCP server, so it works in any client that supports MCP connectors, including Claude and ChatGPT.