# Knowify MCP tools

> Every Knowify 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/knowify

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

- MCP server: `https://cotlet.dev/mcp/v1`
- Connects with: Your own Knowify account (admin permissions for costs and invoicing)
- Integration page: https://cotlet.dev/integrations/knowify-api-mcp-server

## Endpoints

| Endpoint | Access | Description |
|---|---|---|
| `knowify_list_jobs` | read | Contract jobs with client, contract status, revenue, cost and profitability. |
| `knowify_get_job` | read | One job: client, jobsite address, contract style, contract lines, change orders and phases. |
| `knowify_get_job_cost` | read | Cost to date vs budget for the job and each phase, from Plan & Track. |
| `knowify_list_invoices` | read | Invoices with job, client, amount, balance due and date. |
| `knowify_list_clients` | read | Clients with contact email, phone and address. |
| `knowify_list_time_entries` | read | Time entries from Review Time: person, job, phase, hours, billable and approval state. |
| `knowify_create_client` | write | Add a client to your client list. |
| `knowify_create_job` | write | New contract job. It starts as a lead until a proposal is saved. |
| `knowify_save_proposal` | write | Save the draft proposal (bid) of a job. The job moves to bidding. Nothing is sent. |
| `knowify_send_proposal_for_signature` | write | Email the proposal to the client for e-signature. The job turns active when they sign. |
| `knowify_add_change_order` | write | Add a change order to a fixed price job, as a draft or active so it can be invoiced. |
| `knowify_create_invoice` | write | Invoice an active job by percent of progress or dollar amount per line, as a draft or finalized. |
| `knowify_send_invoice` | write | Email a finalized invoice to the client. |
| `knowify_record_payment` | write | Record a full or partial client payment on an invoice. |
| `knowify_log_time` | write | Enter hours on a job phase in the Time Tracker and submit them for review. |

## List jobs

MCP tool: `knowify_list_jobs`

Access: read.

Returns contract jobs with client, status, revenue, cost and profit. Without a status filter it returns all open jobs, newest first. Search matches job name, client name, address or tag. Use job_id from each item in the other tools.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `status` | enum | no | lead, bidding, out_for_signature, active, rejected or closed. Default: all open. |
| `search` | string | no | Job name, client name, address or tag. |
| `limit` | integer | no | 1 to 100. Default: 25. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "jobs": [
      {
        "job_id": "418203",
        "name": "Maple St Remodel",
        "client": "Dana Whitfield",
        "status": "active",
        "contract_style": "fixed_price",
        "revenue": 42400,
        "cost": 22500,
        "profit": 19900
      },
      {
        "job_id": "418410",
        "name": "Riverside Dental Office",
        "client": "Riverside Dental",
        "status": "lead",
        "contract_style": "fixed_price",
        "revenue": 0,
        "cost": 0,
        "profit": 0
      }
    ]
  },
  "isError": false
}
```

## Get job

MCP tool: `knowify_get_job`

Access: read.

Returns one job with its contract lines, change orders and phases. Contract line and change order IDs go into create_invoice; phase IDs go into log_time. Phases show whether labor is enabled.

### 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": "knowify_get_job",
    "arguments": {
      "job_id": "job_8c41d2"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "418203",
    "name": "Maple St Remodel",
    "client": {
      "client_id": "cl-2201",
      "name": "Dana Whitfield"
    },
    "jobsite_address": "214 Maple St, Springfield",
    "contract_style": "fixed_price",
    "contract_lines": [
      {
        "line_id": "line-1",
        "description": "Rough-in electrical",
        "price": 22000
      },
      {
        "line_id": "line-2",
        "description": "Fixtures and finish",
        "price": 18000
      }
    ],
    "change_orders": [
      {
        "change_order_id": "co-1",
        "description": "Extra outlets in the kitchen",
        "price": 2400,
        "status": "active"
      }
    ],
    "phases": [
      {
        "phase_id": "ph-1",
        "name": "Framing",
        "labor_enabled": true
      },
      {
        "phase_id": "ph-2",
        "name": "Rough-in",
        "labor_enabled": true
      }
    ]
  },
  "isError": false
}
```

## Get job cost

MCP tool: `knowify_get_job_cost`

Access: read.

Returns cost to date against budget for the whole job and for each phase, the figures from Plan & Track. Phases over budget have a negative variance. The job totals are the sums of the phases.

### 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": "knowify_get_job_cost",
    "arguments": {
      "job_id": "418203"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "418203",
    "budget_total": 29000,
    "cost_total": 22500,
    "phases": [
      {
        "phase": "Framing",
        "budget": 14000,
        "cost": 15200,
        "variance": -1200
      },
      {
        "phase": "Rough-in",
        "budget": 9000,
        "cost": 6100,
        "variance": 2900
      },
      {
        "phase": "Finish",
        "budget": 6000,
        "cost": 1200,
        "variance": 4800
      }
    ]
  },
  "isError": false
}
```

## List invoices

MCP tool: `knowify_list_invoices`

Access: read.

Returns invoices newest first with job, client, amount, balance due and date. Set unpaid_only to see invoices with a balance due. Use invoice_id in send_invoice and record_payment.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | no | Only invoices of this job. |
| `unpaid_only` | boolean | no | Skip invoices that are fully paid. |
| `since` | date | no | Only invoices dated on or after this date. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "invoices": [
      {
        "invoice_id": "90488",
        "job_id": "418120",
        "client": "Riverside Dental",
        "amount": 12500,
        "balance_due": 12500,
        "date": "2026-09-28"
      }
    ]
  },
  "isError": false
}
```

## List clients

MCP tool: `knowify_list_clients`

Access: read.

Returns clients with contact email, phone and address. Search matches the client name. Use client_id in create_job.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `search` | string | no | Client name. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "clients": [
      {
        "client_id": "cl-3310",
        "name": "Riverside Dental",
        "email": "office@riverside-dental.example",
        "phone": "555-0142",
        "address": "88 River Rd, Springfield"
      }
    ]
  },
  "isError": false
}
```

## List time entries

MCP tool: `knowify_list_time_entries`

Access: read.

Returns the time entries you see in Review Time between two dates, with person, job, phase, hours, billable flag and approval state. Filter by job or by approved and unapproved to find entries waiting for review.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | no | Only entries on this job. |
| `from` | date | yes | First day. |
| `to` | date | yes | Last day. |
| `approved` | enum | no | all, approved or unapproved. Default: all. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "entries": [
      {
        "entry_id": "te-7701",
        "person": "Sam Ortiz",
        "job_id": "418203",
        "phase": "Framing",
        "date": "2026-10-09",
        "hours": 8,
        "billable": true,
        "approved": false
      }
    ]
  },
  "isError": false
}
```

## Create client

MCP tool: `knowify_create_client`

Access: write.

Adds a client to your client list and returns its client_id for create_job. The email is used for proposals and invoices. It reaches no one, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `name` | string | yes | Client name. |
| `email` | string | no | Contact email, used for proposals and invoices. |
| `phone` | string | no | Contact phone. |
| `address` | string | no | Billing address. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "client_id": "cl-3311",
    "name": "Lakeview Dental",
    "email": "office@lakeview-dental.example",
    "status": "created"
  },
  "isError": false
}
```

## Create job

MCP tool: `knowify_create_job`

Access: write.

Creates a contract job for a client. The job starts as a lead and moves to bidding when save_proposal runs. Contract style is fixed_price or cost_plus. It reaches no one, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `name` | string | yes | Job name. |
| `client_id` | string | yes | Client ID from list_clients or create_client. |
| `contract_style` | enum | yes | fixed_price or cost_plus. |
| `jobsite_address` | string | no | Jobsite address. |
| `bid_due_date` | date | no | When the bid is due. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "knowify_create_job",
    "arguments": {
      "name": "Jane Doe",
      "client_id": "client_8c41d2",
      "contract_style": "fixed_price"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "418410",
    "name": "Riverside Dental Office",
    "client_id": "cl-3310",
    "contract_style": "fixed_price",
    "status": "lead"
  },
  "isError": false
}
```

## Save proposal

MCP tool: `knowify_save_proposal`

Access: write.

Saves the contract lines of the proposal as a draft and moves the job to bidding. Nothing is sent to the client; send_proposal_for_signature does that. It reaches no one, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `line_items` | object | yes | List of { description, price } contract lines. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "418410",
    "status": "bidding",
    "proposal_total": 38500,
    "line_items": 2
  },
  "isError": false
}
```

## Send proposal for signature

MCP tool: `knowify_send_proposal_for_signature`

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

Emails the saved proposal to the client for e-signature. The recipient is the client's contact email unless you pass to_email. The job turns active when the client signs. 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. |
| `to_email` | string | no | Recipient. Default: the client's contact email. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "knowify_send_proposal_for_signature",
    "arguments": {
      "job_id": "418410",
      "to_email": "pm@riverside-dental.example"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "job_id": "418410",
    "status": "out_for_signature",
    "sent_to": "office@riverside-dental.example"
  },
  "isError": false
}
```

## Add change order

MCP tool: `knowify_add_change_order`

Access: write.

Adds a change order to a fixed price job. It is a draft unless make_active is true, and only an active change order can be invoiced. It reaches no client, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `description` | string | yes | What changed. |
| `price` | string | yes | Change order price as a decimal, e.g. 2400.00. |
| `make_active` | boolean | no | Make it active right away. Default: false. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "change_order_id": "co-1",
    "job_id": "418203",
    "description": "Extra outlets in the kitchen",
    "price": 2400,
    "status": "active"
  },
  "isError": false
}
```

## Create invoice

MCP tool: `knowify_create_invoice`

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

Invoices an active job by percent of progress or by dollar amount per contract line or change order. It saves a draft unless finalize is true. The invoice amount is the sum of the billed lines. It does not email anyone; send_invoice does. 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. |
| `method` | enum | yes | percent or amount. |
| `lines` | object | yes | Map of contract line or change order ID to percent or amount to bill. |
| `finalize` | boolean | no | Verify and finalize instead of saving a draft. Default: false. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "knowify_create_invoice",
    "arguments": {
      "job_id": "418203",
      "method": "percent",
      "lines": {
        "line-1": 40,
        "line-2": 40,
        "co-1": 100
      },
      "finalize": false
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "invoice_id": "90517",
    "job_id": "418203",
    "status": "draft",
    "amount": 18400,
    "balance_due": 18400,
    "date": "2026-10-10"
  },
  "isError": false
}
```

## Send invoice

MCP tool: `knowify_send_invoice`

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

Emails a finalized invoice to the client. The recipient is the client's contact email unless you pass to_email. 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 or create_invoice. |
| `to_email` | string | no | Recipient. Default: the client's contact email. |

### tools/call

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

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "invoice_id": "90517",
    "status": "sent",
    "sent_to": "dana.whitfield@example.com"
  },
  "isError": false
}
```

## Record payment

MCP tool: `knowify_record_payment`

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

Records a full or partial client payment on an invoice and returns the new balance due. The memo holds a check number or note. 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. |
| `amount` | string | yes | Amount received as a decimal, e.g. 12500.00. |
| `date` | date | yes | Payment date. |
| `memo` | string | no | Check number or note. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "knowify_record_payment",
    "arguments": {
      "invoice_id": "invoice_8c41d2",
      "amount": "amount",
      "date": "2026-10-01"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "invoice_id": "90488",
    "amount": 12500,
    "date": "2026-10-09",
    "memo": "Check 4471",
    "balance_due": 0
  },
  "isError": false
}
```

## Log time

MCP tool: `knowify_log_time`

Access: write.

Enters hours on a job phase in the Time Tracker and submits them for review, where they appear in Review Time. The phase must have labor enabled. It reaches no client, so it runs without asking first.

### Parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `job_id` | string | yes | Job ID from list_jobs. |
| `phase_id` | string | yes | Phase ID from get_job. The phase must have labor enabled. |
| `date` | date | yes | Day worked. |
| `hours` | string | yes | Hours worked as a decimal, e.g. 7.5. |
| `description` | string | no | What was done. |

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "knowify_log_time",
    "arguments": {
      "job_id": "job_8c41d2",
      "phase_id": "phase_8c41d2",
      "date": "2026-10-01",
      "hours": "hours"
    }
  }
}
```

### Example response

```json
{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "entry_id": "te-7702",
    "job_id": "418203",
    "phase": "Framing",
    "date": "2026-10-09",
    "hours": 8,
    "status": "submitted"
  },
  "isError": false
}
```
