{"openapi":"3.1.0","info":{"title":"ServiceM8 Catalog (BYOK) API","version":"0.1.0","description":"ServiceM8 Catalog (BYOK) lets an AI assistant read your own ServiceM8 Catalog data through the ServiceM8 Catalog API with a key you supply (ServiceM8 API key). Read-only: 8 tools (list_materials, list_material_bundles, list_tax_rates, list_job_templates, list_service_templates, list_suppliers, list_asset_types, list_asset_type_fields). The BYOK key travels with each request, is used for that one...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-servicem8-catalog.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-servicem8-catalog/docs"},"termsOfService":"https://connectorbay.com/byok-servicem8-catalog/terms"},"servers":[{"url":"https://byok-servicem8-catalog.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-servicem8-catalog/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_materials":{"post":{"operationId":"list_materials","summary":"List materials, products and labour rates with name, item number, sell price, cost, stock quantity, inventory flag and t","description":"List materials, products and labour rates with name, item number, sell price, cost, stock quantity, inventory flag and tax rate. Use for \"What materials and labour rates are in my ServiceM8 price list\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_materialsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_material_bundles":{"post":{"operationId":"list_material_bundles","summary":"List material bundles (kits of materials sold together) with name and item number. Use for \"Which material bundles are s","description":"List material bundles (kits of materials sold together) with name and item number. Use for \"Which material bundles are set up in ServiceM8\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_material_bundlesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_tax_rates":{"post":{"operationId":"list_tax_rates","summary":"List tax rates with name, percentage amount and whether it is the default. Use for \"What tax rates does my ServiceM8 acc","description":"List tax rates with name, percentage amount and whether it is the default. Use for \"What tax rates does my ServiceM8 account use\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_tax_ratesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_job_templates":{"post":{"operationId":"list_job_templates","summary":"List job templates with name. Use for \"Which job templates exist in ServiceM8\".","description":"List job templates with name. Use for \"Which job templates exist in ServiceM8\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_job_templatesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_service_templates":{"post":{"operationId":"list_service_templates","summary":"List bookable service templates with name, booking type, pricing method, default job category, customer booking flag and","description":"List bookable service templates with name, booking type, pricing method, default job category, customer booking flag and displayed price. Cursor paging: send cursor -1 first. Use for \"Which services can customers book online in ServiceM8\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"},"cursor":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Use -1 on the first request to turn on cursor paging.","title":"Cursor"},"limit":{"anyOf":[{"maximum":999,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Maximum records per page when cursor paging is on (1 to 999).","title":"Limit"}},"title":"list_service_templatesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_suppliers":{"post":{"operationId":"list_suppliers","summary":"List suppliers with name, business number, account number and city (no email or phone). Use for \"Which suppliers are sav","description":"List suppliers with name, business number, account number and city (no email or phone). Use for \"Which suppliers are saved in ServiceM8\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_suppliersArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_asset_types":{"post":{"operationId":"list_asset_types","summary":"List asset types (categories of customer equipment) with name. Use for \"What asset types does ServiceM8 track\".","description":"List asset types (categories of customer equipment) with name. Use for \"What asset types does ServiceM8 track\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_asset_typesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_asset_type_fields":{"post":{"operationId":"list_asset_type_fields","summary":"List the custom fields defined for asset types with the asset type, field name and sort order. Use for \"What fields are ","description":"List the custom fields defined for asset types with the asset type, field name and sort order. Use for \"What fields are recorded for each ServiceM8 asset type\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_asset_type_fieldsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}