MCP tools reference

Knowify MCP tools

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
Knowify
Knowify 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

read

MCP tool knowify_list_jobs

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

Parameters: list_jobs
NameTypeDescription
status enum lead, bidding, out_for_signature, active, rejected or closed. Default: all open.
search string Job name, client name, address or tag.
limit integer 1 to 100. Default: 25.

tools/call

JSON-RPC

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

Example response

{
  "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

read

MCP tool knowify_get_job

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

Parameters: get_job
NameTypeDescription
job_id required string Job ID from list_jobs.

tools/call

JSON-RPC

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

Example response

{
  "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
}

MCP tool knowify_get_job_cost

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

Parameters: get_job_cost
NameTypeDescription
job_id required string Job ID from list_jobs.

tools/call

JSON-RPC

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "knowify_get_job_cost",
    "arguments": {
      "job_id": "418203"
    }
  }
}

Example response

{
  "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
}

MCP tool knowify_list_invoices

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

Parameters: list_invoices
NameTypeDescription
job_id string Only invoices of this job.
unpaid_only boolean Skip invoices that are fully paid.
since date Only invoices dated on or after this date.

tools/call

JSON-RPC

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

Example response

{
  "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
}

MCP tool knowify_list_clients

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

Parameters

Parameters: list_clients
NameTypeDescription
search string Client name.

tools/call

JSON-RPC

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

Example response

{
  "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
}

MCP tool knowify_list_time_entries

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

Parameters: list_time_entries
NameTypeDescription
job_id string Only entries on this job.
from required date First day.
to required date Last day.
approved enum all, approved or unapproved. Default: all.

tools/call

JSON-RPC

{
  "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

{
  "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
}

MCP tool knowify_create_client

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

Parameters: create_client
NameTypeDescription
name required string Client name.
email string Contact email, used for proposals and invoices.
phone string Contact phone.
address string Billing address.

tools/call

JSON-RPC

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

Example response

{
  "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

write

MCP tool knowify_create_job

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

Parameters: create_job
NameTypeDescription
name required string Job name.
client_id required string Client ID from list_clients or create_client.
contract_style required enum fixed_price or cost_plus.
jobsite_address string Jobsite address.
bid_due_date date When the bid is due.

tools/call

JSON-RPC

{
  "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

{
  "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
}

MCP tool knowify_save_proposal

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

Parameters: save_proposal
NameTypeDescription
job_id required string Job ID from list_jobs.
line_items required object List of { description, price } contract lines.

tools/call

JSON-RPC

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

Example response

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

MCP tool knowify_send_proposal_for_signature

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

Parameters: send_proposal_for_signature
NameTypeDescription
job_id required string Job ID from list_jobs.
to_email string Recipient. Default: the client's contact email.

tools/call

JSON-RPC

{
  "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

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

MCP tool knowify_add_change_order

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

Parameters: add_change_order
NameTypeDescription
job_id required string Job ID from list_jobs.
description required string What changed.
price required string Change order price as a decimal, e.g. 2400.00.
make_active boolean Make it active right away. Default: false.

tools/call

JSON-RPC

{
  "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

{
  "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

write Confirm

MCP tool knowify_create_invoice

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

Parameters: create_invoice
NameTypeDescription
job_id required string Job ID from list_jobs.
method required enum percent or amount.
lines required object Map of contract line or change order ID to percent or amount to bill.
finalize boolean Verify and finalize instead of saving a draft. Default: false.

tools/call

JSON-RPC

{
  "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

{
  "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

write Confirm

MCP tool knowify_send_invoice

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

Parameters: send_invoice
NameTypeDescription
invoice_id required string Invoice ID from list_invoices or create_invoice.
to_email string Recipient. Default: the client's contact email.

tools/call

JSON-RPC

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

Example response

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

Record payment

write Confirm

MCP tool knowify_record_payment

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

Parameters: record_payment
NameTypeDescription
invoice_id required string Invoice ID from list_invoices.
amount required string Amount received as a decimal, e.g. 12500.00.
date required date Payment date.
memo string Check number or note.

tools/call

JSON-RPC

{
  "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

{
  "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

write

MCP tool knowify_log_time

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

Parameters: log_time
NameTypeDescription
job_id required string Job ID from list_jobs.
phase_id required string Phase ID from get_job. The phase must have labor enabled.
date required date Day worked.
hours required string Hours worked as a decimal, e.g. 7.5.
description string What was done.

tools/call

JSON-RPC

{
  "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

{
  "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
}