# Service Fusion MCP tools

> Every Service Fusion MCP tool on the Cotlet server: tool names, input schemas, a tools/call example and an example result for each tool.

Source: https://cotlet.dev/docs/mcp/service-fusion

Docs sections: [Get started](https://cotlet.dev/docs.md) · [REST API](https://cotlet.dev/docs/api.md) · [MCP](https://cotlet.dev/docs/mcp.md) · [SDKs & CLI](https://cotlet.dev/docs/sdks.md) · [Integrations](https://cotlet.dev/docs/integrations.md)

15 tools for Service Fusion on the Cotlet MCP server. Your agent picks them from tools/list.

- MCP server: `https://cotlet.dev/mcp/v1`
- Connects with: Your own Service Fusion user
- Integration page: https://cotlet.dev/integrations/service-fusion-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `service-fusion_list_customers` | read | Customers matching a name, phone, email, address or tag, with last serviced date. |
| `service-fusion_list_job_statuses` | read | The job statuses your account uses, with their type. |
| `service-fusion_list_jobs` | read | Jobs with number, status, customer, assigned techs and start date. |
| `service-fusion_get_job` | read | Full job: description, location, techs, products, services, notes and charges. |
| `service-fusion_list_estimates` | read | Estimates with number, status, customer, requested date and options. |
| `service-fusion_get_estimate` | read | Estimate with each option, its line items and total. |
| `service-fusion_list_invoices` | read | Invoices with number, customer, total, date, paid flag and pay-online link. |
| `service-fusion_create_customer` | write | New customer with a primary contact and service location. |
| `service-fusion_create_job` | write | New job for a customer, scheduled or unscheduled, optionally with technicians assigned. |
| `service-fusion_update_job_status` | write | Move a job to another status, e.g. On The Way, Completed or Cancelled. |
| `service-fusion_create_estimate` | write | New estimate for a customer with products and services. Nothing is sent until send_estimate. |
| `service-fusion_convert_estimate_to_job` | write | Turn one estimate option into a job, the way Convert to Job does in the app. |
| `service-fusion_create_invoice` | write | Invoice a job from its products, services and charges. Nothing is sent or charged. |
| `service-fusion_send_estimate` | write | Email or text an estimate with a link to view and accept it online. |
| `service-fusion_send_invoice` | write | Email or text an invoice with a link to view and pay it online. |

## List customers

MCP tool: `service-fusion_list_customers`

Access: read.

Returns customers with their contacts, service location and last serviced date. Use it before create_customer to find a repeat caller by phone or email. create_job and create_estimate take the customer name exactly as shown here.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `query` | string | no | Name, phone, email or address to search for. |
| `tags` | string[] | no | Only customers with these tags. |
| `page` | integer | no | Page number. Default: 1. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_list_customers",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "customers": [
      {
        "customer_id": "22814",
        "customer_name": "Jane Doe",
        "contact": {
          "first_name": "Jane",
          "last_name": "Doe",
          "phone": "555-0142",
          "email": "jane.doe@example.com"
        },
        "location": {
          "street_1": "48 Maple Court",
          "city": "Plano",
          "state_prov": "TX",
          "postal_code": "75024"
        },
        "tags": [
          "Residential"
        ],
        "last_serviced": "2026-04-18"
      }
    ],
    "page": 1
  },
  "isError": false
}
```

## List job statuses

MCP tool: `service-fusion_list_job_statuses`

Access: read.

Returns the statuses from My Office > Estimate & Job Statuses. Accounts can rename statuses, so use these names in list_jobs and update_job_status. The defaults include Unscheduled, Scheduled, Dispatched, On The Way, On Site, Started, Completed, Cancelled, Job Closed and Invoiced.

### Parameters

No parameters.

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_list_job_statuses",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "statuses": [
      {
        "name": "Unscheduled",
        "category": "Open"
      },
      {
        "name": "Scheduled",
        "category": "Open"
      },
      {
        "name": "Dispatched",
        "category": "Open"
      },
      {
        "name": "On The Way",
        "category": "In Progress"
      },
      {
        "name": "Completed",
        "category": "In Progress"
      },
      {
        "name": "Invoiced",
        "category": "Closed"
      }
    ]
  },
  "isError": false
}
```

## List jobs

MCP tool: `service-fusion_list_jobs`

Access: read.

Lists jobs. Filter by status, customer or a start date range, for example every job in Unscheduled. Each item carries the job_id for get_job, update_job_status and create_invoice. Status names are the ones from list_job_statuses.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `status` | string | no | Status name from list_job_statuses, e.g. Unscheduled or Completed. |
| `customer_name` | string | no | Only jobs for this customer. |
| `start_from` | date | no | Jobs starting on or after this date. |
| `start_to` | date | no | Jobs starting on or before this date. |
| `page` | integer | no | Page number. Default: 1. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_list_jobs",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "jobs": [
      {
        "job_id": "1048301",
        "number": "10483",
        "status": "Unscheduled",
        "customer_name": "Mark Reyes",
        "city": "Frisco",
        "description": "Water heater leaking at base",
        "start": null,
        "techs_assigned": []
      },
      {
        "job_id": "1048288",
        "number": "10482",
        "status": "Unscheduled",
        "customer_name": "Priya Shah",
        "city": "Plano",
        "description": "Furnace not igniting",
        "start": null,
        "techs_assigned": []
      }
    ],
    "page": 1
  },
  "isError": false
}
```

## Get job

MCP tool: `service-fusion_get_job`

Access: read.

Returns one job with its location, assigned technicians, products, services, other charges, notes and the invoice number once it is invoiced. Use it to check the status and charges before create_invoice.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_get_job",
    "arguments": {
      "job_id": "job_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "1048213",
    "number": "10482",
    "status": "Completed",
    "customer_name": "Jane Doe",
    "description": "AC tune-up, upstairs unit",
    "location": {
      "street_1": "48 Maple Court",
      "city": "Plano",
      "state_prov": "TX",
      "postal_code": "75024"
    },
    "start": "2026-10-15T09:00:00-05:00",
    "techs_assigned": [
      "Alex Rivera"
    ],
    "services": [
      {
        "name": "AC tune-up",
        "quantity": 1,
        "rate": 129
      }
    ],
    "products": [],
    "total": 129,
    "invoice_number": null
  },
  "isError": false
}
```

## List estimates

MCP tool: `service-fusion_list_estimates`

Access: read.

Lists estimates. Filter by status, customer or the date the estimate was requested. Each item carries the estimate_id for get_estimate, convert_estimate_to_job and send_estimate.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `status` | string | no | Estimate status as set in your account. |
| `customer_name` | string | no | Only estimates for this customer. |
| `requested_from` | date | no | Requested on or after this date. |
| `page` | integer | no | Page number. Default: 1. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_list_estimates",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "estimates": [
      {
        "estimate_id": "3317",
        "number": "3317",
        "status": "Estimate Sent",
        "customer_name": "Carol Smith",
        "requested_on": "2026-10-08",
        "options": [
          "Good",
          "Better",
          "Best"
        ]
      }
    ],
    "page": 1
  },
  "isError": false
}
```

## Get estimate

MCP tool: `service-fusion_get_estimate`

Access: read.

Returns one estimate with up to five options. Each option has a name, line items and a total, and shows Converted once it has become a job. Use the option name in convert_estimate_to_job.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `estimate_id` | string | yes | Estimate ID from list_estimates. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_get_estimate",
    "arguments": {
      "estimate_id": "estimate_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "estimate_id": "3317",
    "number": "3317",
    "status": "Estimate Sent",
    "customer_name": "Carol Smith",
    "options": [
      {
        "name": "Good",
        "total": 1450,
        "converted": false,
        "items": [
          {
            "name": "40 gal water heater, install",
            "quantity": 1,
            "rate": 1450
          }
        ]
      },
      {
        "name": "Better",
        "total": 1890,
        "converted": false,
        "items": [
          {
            "name": "50 gal water heater, install",
            "quantity": 1,
            "rate": 1890
          }
        ]
      }
    ]
  },
  "isError": false
}
```

## List invoices

MCP tool: `service-fusion_list_invoices`

Access: read.

Lists invoices, read from the invoice itself rather than from the job status. The Paid In Full job status is applied by hand, so use the paid flag here. Each item carries the invoice_id for send_invoice.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `paid` | boolean | no | false: only unpaid invoices. true: only paid invoices. Default: both. |
| `from` | date | no | Invoices dated on or after this date. |
| `page` | integer | no | Page number. Default: 1. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_list_invoices",
    "arguments": {}
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "invoices": [
      {
        "invoice_id": "90412",
        "number": "9041",
        "job_number": "10479",
        "customer_name": "Luis Ortega",
        "total": 340,
        "paid": false,
        "date": "2026-10-06",
        "pay_online_url": "https://example.com/pay/9041"
      }
    ],
    "page": 1
  },
  "isError": false
}
```

## Create customer

MCP tool: `service-fusion_create_customer`

Access: write.

Creates the customer record and returns its customer_name for create_job and create_estimate. It sends nothing to anyone and adds no charge, so it runs without asking for your OK. Search with list_customers first so a repeat customer is not created twice.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `customer_name` | string | yes | Customer or company name. |
| `contact` | object | no | first_name, last_name, phone, email. |
| `location` | object | no | street_1, city, state_prov, postal_code. |
| `referral_source` | string | no | One of your referral sources. |
| `tags` | string[] | no | Customer tags. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_create_customer",
    "arguments": {
      "customer_name": "customer name"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "customer_id": "22901",
    "customer_name": "Jane Doe",
    "contact": {
      "first_name": "Jane",
      "last_name": "Doe",
      "phone": "555-0142",
      "email": "jane.doe@example.com"
    },
    "location": {
      "street_1": "48 Maple Court",
      "city": "Plano",
      "state_prov": "TX",
      "postal_code": "75024"
    }
  },
  "isError": false
}
```

## Create job

MCP tool: `service-fusion_create_job`

Access: write. Confirm: waits for the user's OK before it runs.

Creates a job under an existing customer. Without a start the job is Unscheduled; with a start and no technician it is Scheduled. If your Outbound Email Settings email customers when a job is created, the customer gets that email. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `customer_name` | string | yes | Existing customer name from list_customers. |
| `description` | string | yes | What the job is. |
| `category` | string | no | One of your job categories. |
| `start` | datetime | no | Scheduled start, ISO 8601. Empty: Unscheduled. |
| `duration_minutes` | integer | no | Expected duration. |
| `techs_assigned` | string[] | no | Technician names as shown in your account. |
| `note_to_customer` | string | no | Shown to the customer. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_create_job",
    "arguments": {
      "customer_name": "Jane Doe",
      "description": "AC tune-up, upstairs unit",
      "category": "Maintenance",
      "start": "2026-10-15T09:00:00-05:00",
      "duration_minutes": 90
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "1048213",
    "number": "10482",
    "status": "Scheduled",
    "customer_name": "Jane Doe",
    "description": "AC tune-up, upstairs unit",
    "category": "Maintenance",
    "start": "2026-10-15T09:00:00-05:00",
    "duration_minutes": 90,
    "techs_assigned": []
  },
  "isError": false
}
```

## Update job status

MCP tool: `service-fusion_update_job_status`

Access: write. Confirm: waits for the user's OK before it runs.

Sets the job to the status you name, as a technician or dispatcher would in the app. Moving a job to On The Way can send the customer a text notification, and Completed stops labor time. Use names from list_job_statuses. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `status` | string | yes | Status name from list_job_statuses. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_update_job_status",
    "arguments": {
      "job_id": "job_8c41d2",
      "status": "status"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "1048213",
    "number": "10482",
    "previous_status": "Started",
    "status": "Completed"
  },
  "isError": false
}
```

## Create estimate

MCP tool: `service-fusion_create_estimate`

Access: write.

Creates the estimate under an existing customer and returns its estimate_id. The customer receives nothing; send_estimate does that. An estimate can hold up to five options, each with its own line items.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `customer_name` | string | yes | Existing customer name from list_customers. |
| `description` | string | yes | What the estimate is for. |
| `items` | object[] | no | Products and services, each with name, quantity and rate. |
| `note_to_customer` | string | no | Shown on the estimate. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_create_estimate",
    "arguments": {
      "customer_name": "customer name",
      "description": "description"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "estimate_id": "3318",
    "number": "3318",
    "status": "Estimate Draft",
    "customer_name": "Jane Doe",
    "description": "Water heater replacement",
    "options": [
      {
        "name": "Option 1",
        "total": 1450
      }
    ]
  },
  "isError": false
}
```

## Convert estimate to job

MCP tool: `service-fusion_convert_estimate_to_job`

Access: write. Confirm: waits for the user's OK before it runs.

Converts the option you name into a new job and marks that option Converted. One call creates one job; call again with another option to create another. The job starts Unscheduled unless you pass a start. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `estimate_id` | string | yes | Estimate ID from list_estimates. |
| `option` | string | no | Option name from get_estimate. Default: the first option. |
| `start` | datetime | no | Scheduled start for the new job, ISO 8601. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_convert_estimate_to_job",
    "arguments": {
      "estimate_id": "3317",
      "option": "Better",
      "start": "2026-10-15T09:00:00-05:00"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "estimate_id": "3317",
    "option": "Better",
    "converted": true,
    "job_id": "1048390",
    "job_number": "10484",
    "status": "Scheduled",
    "start": "2026-10-15T09:00:00-05:00"
  },
  "isError": false
}
```

## Create invoice

MCP tool: `service-fusion_create_invoice`

Access: write. Confirm: waits for the user's OK before it runs.

Does what Invoice, then Invoice Now does on a job. By default the job must be Completed or closed; with Allow Invoicing Prior To Job Completion on in Company Preferences it can be invoiced earlier. The invoice is not sent: use send_invoice. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_create_invoice",
    "arguments": {
      "job_id": "1048213"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "invoice_id": "90413",
    "number": "9042",
    "job_id": "1048213",
    "job_number": "10482",
    "customer_name": "Jane Doe",
    "total": 129,
    "paid": false,
    "date": "2026-10-15"
  },
  "isError": false
}
```

## Send estimate

MCP tool: `service-fusion_send_estimate`

Access: write. Confirm: waits for the user's OK before it runs.

Sends the estimate from the Send button of the app. By text it uses your Text an estimate template and goes to the primary contact, another saved contact or a number you give. The customer can accept the estimate or request a change. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `estimate_id` | string | yes | Estimate ID from list_estimates. |
| `via` | enum | no | email or text. Default: email. |
| `to` | string | no | Phone number or email address. Default: the primary contact on the record. |
| `template` | string | no | Name of one of your Communication Templates. Default: the system template for the channel. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_send_estimate",
    "arguments": {
      "estimate_id": "3318",
      "via": "text",
      "to": "555-0142"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "estimate_id": "3317",
    "sent": true,
    "via": "text",
    "to": "555-0173",
    "template": "Text an estimate"
  },
  "isError": false
}
```

## Send invoice

MCP tool: `service-fusion_send_invoice`

Access: write. Confirm: waits for the user's OK before it runs.

Sends the invoice from the Send button of the app. By text it uses your Text an invoice template; by email you can use any Job/WO Email template. The customer can pay in full or in part from the link. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `invoice_id` | string | yes | Invoice ID from list_invoices. |
| `via` | enum | no | email or text. Default: email. |
| `to` | string | no | Phone number or email address. Default: the primary contact on the record. |
| `template` | string | no | Name of one of your Communication Templates. Default: the system template for the channel. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "service-fusion_send_invoice",
    "arguments": {
      "invoice_id": "invoice_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "invoice_id": "90413",
    "sent": true,
    "via": "text",
    "to": "555-0142",
    "template": "Text an invoice"
  },
  "isError": false
}
```
