# Workiz MCP tools

> Every Workiz 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/workiz

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 Workiz on the Cotlet MCP server. Your agent picks them from tools/list.

- MCP server: `https://cotlet.dev/mcp/v1`
- Connects with: Your own Workiz account (the permissions of your role apply)
- Integration page: https://cotlet.dev/integrations/workiz-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `workiz_list_jobs` | read | Jobs by scheduled date, with status, client, address, assigned techs and amount due. |
| `workiz_get_job` | read | Full job: client, address, time window, job type, notes, items, total, amount due and payments. |
| `workiz_get_schedule` | read | Jobs and time off per technician for a day or range, as on the Workiz calendar. |
| `workiz_list_leads` | read | Leads with status, source, client details and assigned team member. |
| `workiz_list_clients` | read | Search clients by name, phone, email or address, with past jobs and balance due. |
| `workiz_list_estimates` | read | Estimates with client, total, status and the date they were sent. |
| `workiz_list_invoices` | read | Invoices with job, client, total, amount due and due date. |
| `workiz_create_job` | write | New job for an existing or new client, with job type, time window and notes. |
| `workiz_reschedule_job` | write | Move a job to a new time window. Changes the client's appointment. |
| `workiz_assign_job` | write | Assign or unassign team members on a job. |
| `workiz_create_estimate` | write | Draft estimate for a client with items from your Price Book. Nothing is sent yet. |
| `workiz_send_estimate` | write | Email or text an estimate to the client, with a link to approve it. |
| `workiz_create_invoice` | write | Invoice for a job with its items and total. Nothing is sent yet. |
| `workiz_send_invoice` | write | Email or text an invoice to the client, with a link to pay online. |
| `workiz_record_payment` | write | Record a payment you already received on a job. Does not charge a card. |

## List jobs

MCP tool: `workiz_list_jobs`

Access: read.

Returns jobs in a date range, newest first, with status, client, address, assigned team members, total and amount due. Pages hold up to 100 jobs; pass next_cursor back as cursor for the next page. Filter by status or by team member to narrow the list.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `from` | date | no | First scheduled date. Default: 14 days ago. |
| `to` | date | no | Last scheduled date. Default: today. |
| `status` | string[] | no | Job statuses to include, e.g. Submitted, In progress, Done, Canceled. |
| `tech_id` | string | no | Only jobs assigned to this team member. |
| `limit` | integer | no | 1 to 100. Default: 50. |
| `cursor` | string | no | Next page cursor from the previous call. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "jobs": [
      {
        "job_id": "7c1e5a90-2b4d-4f6e-9a31-0d8e2c4b6f17",
        "status": "Done",
        "job_type": "Water heater install",
        "scheduled_start": "2026-10-09T09:00:00-07:00",
        "client": {
          "client_id": "cl_5521",
          "name": "Dana Whitfield"
        },
        "address": "12 Oak St, Sacramento, CA",
        "techs": [
          "Mike R."
        ],
        "total": "480.00",
        "amount_due": "480.00"
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## Get job

MCP tool: `workiz_get_job`

Access: read.

Returns one job with everything on its page: client, address, time window, job type, notes, line items, total, amount due and the payments recorded so far. Use it before invoicing or recording a payment.

### Parameters

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

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "7c1e5a90-2b4d-4f6e-9a31-0d8e2c4b6f17",
    "status": "Done",
    "job_type": "Water heater install",
    "client": {
      "client_id": "cl_5521",
      "name": "Dana Whitfield",
      "phone": "(555) 010-2231"
    },
    "address": "12 Oak St, Sacramento, CA",
    "window": {
      "start": "2026-10-09T09:00:00-07:00",
      "end": "2026-10-09T11:00:00-07:00"
    },
    "notes": "Gas line on the left wall.",
    "items": [
      {
        "name": "40 gal water heater",
        "quantity": 1,
        "price": "380.00"
      },
      {
        "name": "Install labor",
        "quantity": 1,
        "price": "100.00"
      }
    ],
    "total": "480.00",
    "amount_due": "480.00",
    "payments": []
  },
  "isError": false
}
```

## Get schedule

MCP tool: `workiz_get_schedule`

Access: read.

Returns each team member with their jobs and time off for the days you ask, ordered by start time, so your agent can see who has open slots. Time off is the future time off set in Workiz.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `from` | date | yes | First day. |
| `to` | date | no | Last day. Default: same as from. |
| `tech_ids` | string[] | no | Limit to these team members. Default: everyone. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "workiz_get_schedule",
    "arguments": {
      "from": "2026-10-01"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "days": [
      {
        "date": "2026-10-12",
        "techs": [
          {
            "tech_id": "u_204",
            "name": "Mike R.",
            "jobs": [
              {
                "job_id": "3a9d41f2-85c0-4b7e-b6d2-91e7f0a35c48",
                "start": "2026-10-12T09:00:00-07:00",
                "end": "2026-10-12T11:00:00-07:00",
                "job_type": "Drain cleaning"
              }
            ],
            "time_off": []
          }
        ]
      }
    ]
  },
  "isError": false
}
```

## List leads

MCP tool: `workiz_list_leads`

Access: read.

Returns leads, newest first, with status, source, contact details and the assigned team member. Open is the default, so converted and lost leads appear only when you ask for them. Pages hold up to 100 leads.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `status` | enum | no | open, converted or lost. Default: open. |
| `since` | date | no | Only leads created on or after this date. |
| `limit` | integer | no | 1 to 100. Default: 50. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "leads": [
      {
        "lead_id": "ld_8841",
        "status": "open",
        "source": "Website",
        "name": "Priya Nair",
        "phone": "(555) 010-7714",
        "created_at": "2026-10-10T08:12:00-07:00",
        "assigned_to": null
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## List clients

MCP tool: `workiz_list_clients`

Access: read.

Searches your Workiz clients and returns matches with contact details, their past jobs and the balance due. Use the client_id in create_job, create_estimate and the other tools.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `query` | string | no | Name, phone, email or address. |
| `limit` | integer | no | 1 to 100. Default: 25. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "clients": [
      {
        "client_id": "cl_5521",
        "name": "Dana Whitfield",
        "phone": "(555) 010-2231",
        "email": "dana@example.com",
        "address": "12 Oak St, Sacramento, CA",
        "jobs": 3,
        "balance_due": "480.00"
      }
    ]
  },
  "isError": false
}
```

## List estimates

MCP tool: `workiz_list_estimates`

Access: read.

Returns estimates, newest first, with client, total, status and the date sent. Filter by status to find the ones still waiting for an answer. Pages hold up to 100 estimates.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `status` | enum | no | draft, sent, approved or declined. Default: all. |
| `since` | date | no | Only estimates created on or after this date. |
| `limit` | integer | no | 1 to 100. Default: 50. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "estimates": [
      {
        "estimate_id": "est_1187",
        "client": "Priya Nair",
        "total": "1,250.00",
        "status": "sent",
        "sent_at": "2026-10-01T10:15:00-07:00"
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## List invoices

MCP tool: `workiz_list_invoices`

Access: read.

Returns invoices, newest first, with the job, client, total, amount due and due date. Unpaid is the default. Pages hold up to 100 invoices.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `status` | enum | no | unpaid, partially_paid or paid. Default: unpaid. |
| `since` | date | no | Only invoices created on or after this date. |
| `limit` | integer | no | 1 to 100. Default: 50. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "invoices": [
      {
        "invoice_id": "inv_30214",
        "job_id": "7c1e5a90-2b4d-4f6e-9a31-0d8e2c4b6f17",
        "client": "Dana Whitfield",
        "total": "480.00",
        "amount_due": "240.00",
        "due_date": "2026-10-23",
        "status": "partially_paid"
      }
    ],
    "next_cursor": null
  },
  "isError": false
}
```

## Create job

MCP tool: `workiz_create_job`

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

Creates a job for an existing client (client_id) or a new one (client object). Job type must be one of your Workiz job types. The job books an appointment for the client at the time you give. Returns the new job_id. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | no | Existing client from list_clients. Or pass client below. |
| `client` | object | no | New client: first_name, last_name, phone, email, address. |
| `job_type` | string | yes | One of your Workiz job types. |
| `start` | datetime | yes | ISO 8601 with time zone. |
| `end` | datetime | no | End of the time window. |
| `notes` | string | no | Job notes for the tech. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "workiz_create_job",
    "arguments": {
      "client_id": "cl_5521",
      "job_type": "Water heater install",
      "start": "2026-10-14T09:00:00-07:00",
      "end": "2026-10-14T11:00:00-07:00",
      "notes": "From lead ld_8841: tank leaking at the base."
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "9e2b7d14-6c35-4a08-8f1d-3b5a0c7e92d6",
    "status": "Submitted",
    "job_type": "Water heater install",
    "client_id": "cl_5521",
    "start": "2026-10-16T09:00:00-07:00",
    "notes": "Gas line on the left wall."
  },
  "isError": false
}
```

## Reschedule job

MCP tool: `workiz_reschedule_job`

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

Moves one job to a new start and, if given, a new end. The job keeps its assigned team members and its status. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job UUID from list_jobs. |
| `start` | datetime | yes | New start, ISO 8601 with time zone. |
| `end` | datetime | no | New end. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "workiz_reschedule_job",
    "arguments": {
      "job_id": "3a9d41f2-85c0-4b7e-b6d2-91e7f0a35c48",
      "start": "2026-10-13T09:00:00-07:00",
      "end": "2026-10-13T11:00:00-07:00"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "3a9d41f2-85c0-4b7e-b6d2-91e7f0a35c48",
    "status": "Submitted",
    "start": "2026-10-13T09:00:00-07:00",
    "end": "2026-10-13T11:00:00-07:00",
    "previous_start": "2026-10-12T09:00:00-07:00"
  },
  "isError": false
}
```

## Assign job

MCP tool: `workiz_assign_job`

Access: write.

Adds team members to a job, or replaces the current ones when replace is true. It runs without asking first: it sends nothing to the client and one more call changes the assignment back.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job UUID from list_jobs. |
| `tech_ids` | string[] | yes | Team members to assign. |
| `replace` | boolean | no | Remove current assignees first. Default: false. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "workiz_assign_job",
    "arguments": {
      "job_id": "job_8c41d2",
      "tech_ids": [
        "tech ids"
      ]
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "7c1e5a90-2b4d-4f6e-9a31-0d8e2c4b6f17",
    "techs": [
      {
        "tech_id": "u_204",
        "name": "Mike R."
      }
    ]
  },
  "isError": false
}
```

## Create estimate

MCP tool: `workiz_create_estimate`

Access: write.

Creates an estimate in Draft for one client. Item names match items in your Workiz Price Book. Nothing is sent to the client until send_estimate runs, so this call runs without asking.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `client_id` | string | yes | Client from list_clients. |
| `items` | object | yes | List of {name, quantity, price}; names match Price Book items. |
| `notes` | string | no | Note shown to the client. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "workiz_create_estimate",
    "arguments": {
      "client_id": "client_8c41d2",
      "items": "items"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "estimate_id": "est_1192",
    "client_id": "cl_5521",
    "status": "draft",
    "items": [
      {
        "name": "Tankless water heater",
        "quantity": 1,
        "price": "1,250.00"
      }
    ],
    "total": "1,250.00"
  },
  "isError": false
}
```

## Send estimate

MCP tool: `workiz_send_estimate`

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

Sends the estimate by email, text or both, with a link to view and approve it in the Workiz client portal. An unsent estimate becomes Pending; approval in the portal moves it to Approved. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `estimate_id` | string | yes | Estimate from list_estimates or create_estimate. |
| `via` | enum | no | email, sms or both. Default: email. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "estimate_id": "est_1187",
    "status": "pending",
    "sent_via": "email",
    "sent_at": "2026-10-11T09:00:00-07:00"
  },
  "isError": false
}
```

## Create invoice

MCP tool: `workiz_create_invoice`

Access: write.

Creates an invoice from a job, with the job's items and total. Nothing is sent to the client until send_invoice runs, so this call runs without asking. Returns the invoice_id.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job UUID from list_jobs. |
| `due_date` | date | no | Payment due date. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "invoice_id": "inv_30214",
    "job_id": "7c1e5a90-2b4d-4f6e-9a31-0d8e2c4b6f17",
    "items": [
      {
        "name": "40 gal water heater",
        "quantity": 1,
        "price": "380.00"
      },
      {
        "name": "Install labor",
        "quantity": 1,
        "price": "100.00"
      }
    ],
    "total": "480.00",
    "amount_due": "480.00",
    "due_date": "2026-10-23",
    "status": "unsent"
  },
  "isError": false
}
```

## Send invoice

MCP tool: `workiz_send_invoice`

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

Sends the invoice by email, text or both, with a link to the Workiz client portal. The client sees the amount due there. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `invoice_id` | string | yes | Invoice from list_invoices or create_invoice. |
| `via` | enum | no | email, sms or both. Default: email. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "workiz_send_invoice",
    "arguments": {
      "invoice_id": "inv_30214",
      "via": "email"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "invoice_id": "inv_30214",
    "status": "sent",
    "sent_via": "email",
    "amount_due": "480.00",
    "sent_at": "2026-10-11T18:00:00-07:00"
  },
  "isError": false
}
```

## Record payment

MCP tool: `workiz_record_payment`

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

Records a payment you already received on a job, as cash, check or credit, with an optional reference such as a check number. It does not charge a card. Returns the job total and the amount still due. By default you confirm each call; you can switch that off for this tool.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job UUID from list_jobs. |
| `amount` | string | yes | Amount, e.g. 240.00. |
| `method` | enum | yes | cash, check or credit. |
| `paid_at` | datetime | no | When it was paid. Default: now. |
| `reference` | string | no | Check number or confirmation number. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "workiz_record_payment",
    "arguments": {
      "job_id": "7c1e5a90-2b4d-4f6e-9a31-0d8e2c4b6f17",
      "amount": "240.00",
      "method": "check",
      "paid_at": "2026-10-09T15:30:00-07:00",
      "reference": "1042"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "7c1e5a90-2b4d-4f6e-9a31-0d8e2c4b6f17",
    "payment_id": "pay_88213",
    "amount": "240.00",
    "method": "check",
    "reference": "1042",
    "job_total": "480.00",
    "amount_due": "240.00",
    "status": "recorded"
  },
  "isError": false
}
```
