Tradify MCP server
This server gives an AI assistant or script 22 tools to read and update a Tradify account across jobs, customers, quotes, invoices, payments, scheduling, reports and timesheets.
Browse Tradify data: list/search/paginate jobs, customers, quotes, invoices, appointments and timesheets; fetch full job, customer, quote or invoice details.
Manage jobs and customers: create customers, create jobs, add job notes and change job status, including custom statuses.
Manage quotes: create draft quotes with misc/time line items, tax settings and optional job links; email quotes with online accept/decline links.
Manage invoices and payments: create draft invoices from quotes in whole, selected-line, percentage, fixed-amount or remaining modes; email invoices; record payments against approved invoices.
Schedule work: book staff appointments on the Scheduler, optionally emailing the customer a confirmation.
Track time: log timesheet entries and list timesheets by date, staff member or job.
Run reports: job profitability, job sheet, staff productivity and timesheet reports for a date range.
Work safely: read-only tools are marked, write tools are separate, and customer-reaching actions like sending quotes/invoices or scheduling are flagged as destructive/open-world.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Tradify MCP server Show me all overdue invoices"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Tradify API and MCP server: connect Tradify to ChatGPT and Claude
Yes, ChatGPT, Claude and other AI agents can work in your Tradify account. That includes Cursor, Codex, OpenClaw and any MCP client, plus automations in n8n, Make and Zapier. Ask in plain words, and the AI creates the job, writes the quote, turns it into an invoice, records the payment and books your staff. It shows you the draft first and sends nothing to a customer until you say so.
Tradify has no public API, no API keys and no official MCP server. As of November 2026, this repo is the missing piece: 22 Tradify tools for AI assistants and scripts.
What you can ask
New job for Sam Lee at 12 Oak St: replace the hot water cylinder. Book Mike for Thursday morning and email Sam the confirmation.
Quote the bathroom rewire at 14 Elm Rd from my notes: 6 hours labour, 6 LED downlights at $24, one extractor fan at $85. Show me before you send it.
Turn every quote accepted this week into a 30% deposit invoice.
Which invoices are overdue? Total them per customer, oldest first.
Record the bank transfers I paste below against their invoices.
What is on tomorrow's schedule, per staff member?
Related MCP server: BookingKoala MCP Server
Two ways to get it
Run it yourself, this repo | ||
For | trades business owners, office staff, teams | developers |
Setup | sign in to Tradify once, about 5 minutes, nothing to install | Python, Chrome with remote debugging, a terminal |
Works in | ChatGPT and Claude apps, on your phone too, Cursor, Codex, OpenClaw, any MCP client, n8n, Make, Zapier, REST API | Claude Code, Claude Desktop, Cursor, Codex on your computer |
Runs | 24/7, your computer can be off | while your computer and Chrome are on |
Price | 7 days free, no card | free |
Cotlet is best for trades business owners who want ChatGPT, Claude or another AI agent to work in Tradify for them, with nothing to install.
Run it yourself
A Tradify API and a Tradify MCP server you run on your own computer, in Python, on the session of your own Google Chrome. All 22 Tradify tools we run in production at Cotlet: jobs, job status and notes, customers, quotes with line items, invoices from quotes, quote and invoice email, payments, the Scheduler, reports and timesheets.
Tradify's accounting connectors (Xero, QuickBooks, Sage) sync invoices and bills, not jobs, quotes or the schedule. This repo gives you:
MCP server for Claude Code, Claude Desktop, Cursor, Codex and any MCP client, over stdio or HTTP. Setup
REST API on
http://127.0.0.1:8787/api/v1/tradify, with OpenAPI docs at/docs. SetupPython:
call("list_invoices", {"status": "overdue"}), plus 9 ready scripts inexamples/.
Free for your own use, your own trade business included (license).
Also on Odel: https://odel.app/modules/cotlet/tradify and mcpbeat: https://mcpbeat.com/mcp-servers/cotlet/tradify/
uv tool install tradify-api-mcp # or: pip install tradify-api-mcp
tradify-mcp connect # reads your Tradify session from Chrome
tradify-mcp call list_jobs
claude mcp add tradify -- uvx tradify-api-mcp mcpContents
Questions from Tradify users
Does Tradify have an API? Not a public one. Tradify offers no public API, no self-service API keys and no webhooks, only its built-in integrations (Xero, QuickBooks, MYOB, Sage, Stripe, Google Calendar). This repo and Cotlet give you the missing Tradify API: 22 tools for jobs, customers, quotes, invoices, payments, the Scheduler, reports and timesheets, as a REST API and an MCP server.
Can I get a Tradify API key? Not from Tradify. With Cotlet you get your own API key that works with your Tradify account, for scripts, n8n, Make, Zapier or any HTTP client. This repo needs no key: it runs on your computer, on your own Tradify session.
Is there an official ChatGPT integration for Tradify? No. Tradify has no official ChatGPT or Claude connector. Cotlet is an unofficial one that works today, in the ChatGPT and Claude apps and in any AI agent that takes an MCP server.
How do I connect Tradify to ChatGPT? Sign up at cotlet.dev, sign in to Tradify once in your Cloud Browser there, and add Cotlet to ChatGPT, following the steps in your account. Then ask ChatGPT about your jobs, quotes and invoices like you would ask your office manager. ChatGPT needs a server on the internet, so this repo alone, running on your computer, does not connect to ChatGPT. Why Zapier, n8n and webhooks can't do this for Tradify, and what an AI receptionist can do once it's connected: How to connect Tradify to ChatGPT when there is no API, no Zapier and no webhook.
Can ChatGPT create quotes in Tradify for me? Yes, with Cotlet. Give it your notes, and it writes a draft quote in Tradify with labour and materials lines, shows it to you, and sends it to the customer only after your OK. The same works in Claude, Cursor, Codex and other AI agents.
Can AI do my Tradify invoices? Yes, with Cotlet connected to ChatGPT, Claude or another AI agent. It turns an accepted quote into an invoice, in full or as a deposit, sends it after your OK, records payments you paste from your bank and lists what is overdue. The invoices are real Tradify invoices, so they still sync to Xero or QuickBooks the way you set it up.
Tradify has SmartWrite. What does this add? SmartWrite helps you word a description. With Cotlet, the AI does the work in your account: it creates the job, the quote and the invoice, books staff on the Scheduler and records payments.
Does Tradify work with Zapier or Make? Tradify has no Zapier or Make app. Through Cotlet it does: n8n, Make and Zapier can create jobs, customers and quotes in Tradify, for example from a web form, an email or a WhatsApp enquiry.
Can I use it from my phone, on site? Yes, with Cotlet: once Tradify is connected, the ChatGPT and Claude apps on your phone can use it. Ask for tomorrow's schedule, a new job for a caller or the balance of a customer, without opening Tradify.
Do I need to be technical? For Cotlet, no: you sign in to Tradify and add Cotlet to ChatGPT or Claude, with step-by-step instructions in your account. This repo is for people who are fine with Python and a terminal.
Is my Tradify account safe? Yes. Neither Cotlet nor this repo sees or stores your Tradify password. You sign in yourself, the way you always do, and the AI works on that signed-in session. Anything that reaches a customer, like a sent quote or invoice, asks for your OK first: in Cotlet by default, here through your MCP client.
Is it free? This repo is free, also in your own trade business. Cotlet is free for 7 days with no card, then one-time credit packs from $29, no subscription. Pricing.
I run Tradify for several companies or clients. Does that work? Yes. Each Tradify login gets its own connection. Write to contact@cotlet.dev and tell us how many accounts you manage.
How it works
AI agent (MCP) / script (REST, Python) ──▶ tradify-mcp on your computer ──your cookies──▶ go.tradifyhq.com
▲
tradify-mcp connect ──────┘ reads them once from your Chrome (DevTools Protocol)You sign in to Tradify in your own Chrome at go.tradifyhq.com, the way you always do: username, Continue, password. Tick Keep me logged in.
tradify-mcp connectattaches to that Chrome through the Chrome DevTools Protocol, reads the tradifyhq.com cookies and saves them to~/.config/tradify-api-mcp/session.json, readable by your user only. It never sees or stores your password or a 2-Step code.Every tool call is a request to the
/apithe Tradify web app itself calls, with those cookies, sent with curl_cffi, which copies Chrome's TLS fingerprint. Calls that change something carry the app's antiforgery token, read fresh for each tool run. No headless browser runs.
The session lives in one cookie, SessionId. With Keep me logged in Tradify keeps it for about a month. When Tradify signs you out, the server reads the cookies from Chrome again, if Chrome is open with remote debugging on.
Requirements
Python 3.11 or newer.
Google Chrome 144 or newer, signed in to go.tradifyhq.com. Any Chrome or Chromium works with a debugging port.
macOS, Linux or Windows.
A Tradify account. We build and test with the company owner. An office user sees and does what Tradify lets that user do.
send_quoteandsend_invoiceneed 2-Step Security on the login (Settings > Security), because Tradify blocks quote and invoice email without it.
Install
From PyPI:
uv tool install tradify-api-mcp # or: pipx install tradify-api-mcp, or: pip install tradify-api-mcp
tradify-mcp --versionMCP clients can also run it with no install: uvx tradify-api-mcp mcp.
From source:
git clone https://github.com/cotletdev/tradify-api-mcp-server.git
cd tradify-api-mcp-server
python3 -m venv .venv
. .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
tradify-mcp --versionWith uv: uv venv && uv pip install -e ., then uv run tradify-mcp ....
Setting it up with an AI agent (Claude Code, Codex, Cursor)? Open it in this folder and ask it to set up the repo: AGENTS.md tells it every step, and it asks you only for the steps in Chrome.
To update: uv tool upgrade tradify-api-mcp (or pip install -U tradify-api-mcp), from source git pull && pip install -e .. We copy every change of the hosted Tradify tools into this repo.
Connect your Chrome
Option A: your everyday Chrome (recommended)
Open
chrome://inspect/#remote-debuggingin Chrome and switch remote debugging on. Chrome then accepts DevTools connections from programs on this computer, and asks you before each one.Make sure you are signed in at go.tradifyhq.com.
Run:
tradify-mcp connectChrome asks whether to allow the connection. Click Allow.
Saved 6 Tradify cookies to /Users/you/.config/tradify-api-mcp/session.json
Signed in to Tradify as Dan Novak (Northside Plumbing)You can switch remote debugging off again afterwards. Leave it on if you want the server to pick up a new session by itself after Tradify signs you out.
connect looks for Chrome's DevToolsActivePort file in the default profile folder. For Chrome Beta, Canary or a custom profile folder, pass --profile-dir "<folder>".
Option B: a Chrome with a debugging port
Chrome does not open a debugging port on your default profile, so start a separate one, sign in to Tradify there once, and connect to it:
# macOS
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-tradify"
# Linux
google-chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.chrome-tradify"
# Windows
"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222 --user-data-dir="%USERPROFILE%\.chrome-tradify"
tradify-mcp connect --cdp http://127.0.0.1:9222A fresh profile is a new device to Tradify, so with 2-Step Security on it asks for a code at sign-in. --cdp also takes a ws:// DevTools URL, for example of a Chrome on another machine reached over an SSH tunnel.
Option C: paste the cookie by hand
For a server with no Chrome: in Chrome open DevTools on go.tradifyhq.com, Application > Cookies > https://go.tradifyhq.com, copy the value of SessionId, then:
tradify-mcp connect --token # paste it, input is hidden
# or, without a session file:
export TRADIFY_AUTH_TOKEN=...A pasted cookie is not read again from Chrome. Paste a new one when Tradify signs you out.
Check the session at any time:
tradify-mcp statusMCP server
The MCP server lists every tool with its input schema, a description written for agents, and hints. Read tools are marked read-only, and the tools that reach other people (quote and invoice email, Scheduler bookings) are marked so your client asks before running them.
Claude Code
claude mcp add tradify -- uvx tradify-api-mcp mcp
# read only:
claude mcp add tradify -- uvx tradify-api-mcp mcp --read-onlyClaude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"tradify": {
"command": "uvx",
"args": ["tradify-api-mcp", "mcp"]
}
}
}Cursor
~/.cursor/mcp.json, the same block as Claude Desktop. A ready copy is in mcp.json.
Codex
~/.codex/config.toml:
[mcp_servers.tradify]
command = "uvx"
args = ["tradify-api-mcp", "mcp"]Over HTTP
tradify-mcp serve also serves MCP over streamable HTTP at http://127.0.0.1:8787/mcp, for clients that take a URL:
tradify-mcp serve
claude mcp add --transport http tradify http://127.0.0.1:8787/mcpThen ask your agent things like:
New job for Sam Lee at 12 Oak St: replace the hot water cylinder. Book Mike Ross for Thursday morning, about four hours, and email Sam the confirmation.
Quote the bathroom rewire at 14 Elm Rd from my notes: 6 hours on the Standard billing rate, 6 LED downlights at $24 each, one extractor fan at $85. Show me the draft before you send it.
For every quote accepted this week, create a 30% deposit invoice, skip anything under $500 or already invoiced, and send them after I check the list.
Record the bank transfers I paste below against their invoices, then list every invoice still overdue, totalled per customer, oldest first.
REST API
tradify-mcp serve # http://127.0.0.1:8787, MCP at /mcp, docs at /docsEach tool has its own route under /api/v1/tradify, the same paths as the hosted API at cotlet.dev, so code written against one works with the other. Path parts and the query string are arguments, and a JSON body adds the rest.
curl 'http://127.0.0.1:8787/api/v1/tradify/jobs?status=to_invoice'
curl 'http://127.0.0.1:8787/api/v1/tradify/invoices?status=overdue'
curl 'http://127.0.0.1:8787/api/v1/tradify/appointments?from=2026-10-27&to=2026-10-31'
curl -X POST http://127.0.0.1:8787/api/v1/tradify/invoices/558f2199-6ca6-489e-bfdf-d4d11cd878e3/payments \
-H 'Content-Type: application/json' \
-d '{"amount": 300, "method": "Bank Deposit", "reference": "TRF 20261023"}'Any tool by name, body as its arguments:
curl -X POST http://127.0.0.1:8787/api/v1/tradify/tools/list_customers -d '{"search": "lee"}'GET /api/v1/tradify/tools: every tool with its route, input schema and an example answer.GET /docs: interactive OpenAPI docs,GET /openapi.jsonthe schema, for n8n, Postman or a generated client.Answers are JSON. List tools return
next_cursor; pass it back ascursorfor the next page.
The server listens on 127.0.0.1 only. To reach it from another device of yours, set a token, and every request then needs Authorization: Bearer <token>:
TRADIFY_MCP_TOKEN=$(openssl rand -hex 24) tradify-mcp serve --host 0.0.0.0Python and the example scripts
Straight from Python, no server needed:
from tradify_api_mcp import call
from tradify_api_mcp.scripting import paginate, write_rows
overdue = call("list_invoices", {"status": "overdue"})["invoices"]
week = call("list_appointments", {"from": "2026-10-27", "to": "2026-10-31"})["appointments"]
jobs = list(paginate("list_jobs", {"status": "all"}, "jobs"))
write_rows(jobs, "jobs.csv")
call("update_job_status", job_id="d3bd2e39-af25-4cda-9daf-d9f758f8f0e5", status="complete")Or one tool from the shell: tradify-mcp call list_quotes status=accepted since=2026-10-01, or with a JSON object.
Times are wall clock in your company's time zone (Settings > Company). 2026-10-29T08:00 means 8:00 there. A time with an offset is converted to it, and answers carry the company's offset.
Ready scripts in examples/. Each prints a short list or JSON, takes --out file.csv or --out file.json where it makes sense, and --help. The ones that change Tradify only show their plan until you pass --apply or --send:
Script | What it does |
Every overdue invoice, totalled per customer, oldest first, with the ones past your last reminder marked. A call list. | |
Records the payments of a CSV bank export against invoices by number. Skips an unknown or closed invoice and a payment above the amount due. | |
Records a payment on one invoice and sets its jobs to complete once nothing is due. | |
Finds or adds the caller, creates the job, and with | |
A draft quote from a text file of time and misc lines; | |
A percentage deposit invoice for every quote accepted lately whose job has no invoice yet. | |
Tomorrow's Scheduler grouped by staff member, with job, customer and crew notes. | |
Jobs to CSV or JSON. | |
Every customer to CSV or JSON, with sites. |
python examples/overdue_invoices.py
python examples/deposit_invoices.py --percent 30 --minimum 500
python examples/export_jobs.py --status to_invoice --out to_invoice.csvOn a schedule, cron on your own computer works while it is on: 0 18 * * * cd ~/tradify-api-mcp-server && .venv/bin/python examples/tomorrows_schedule.py.
All 22 tools
IDs come from the list tools: job_id from list_jobs, customer_id from list_customers, quote_id from list_quotes, invoice_id from list_invoices. Staff are named by full name, as on the Scheduler. tradify-mcp tools prints this list, tradify-mcp tools --json adds the input schemas.
Jobs
Tool | Access | REST route | What it does |
| read |
| Jobs with number, customer, site address, status and assigned staff. |
| read |
| Full job: description, site, tasks, notes, appointments, costs, linked quotes and invoices. |
| write |
| New job for a customer. It starts as Unassigned. |
| write |
| Set a status on a job, built-in or one of your custom statuses. |
| write |
| Add a text note to a job's Notes tab. It notifies no one. |
Customers
Tool | Access | REST route | What it does |
| read |
| Customer profiles with contact details and sites. |
| read |
| Customer profile with sites, notes, latest jobs, quotes and invoices, and the balance due. |
| write |
| New customer profile, optionally with contact details and a physical address. |
Quotes
Tool | Access | REST route | What it does |
| read |
| Quotes with customer, total, quote date, expiry date and status. |
| read |
| Full quote: lines with price and cost, tax, totals, gross profit, dates and invoices made from it. |
| write |
| Draft quote with line items. Nothing is sent until you call send_quote. |
| write |
| Approve the quote and email it to the customer with a link to accept or decline online. |
Invoices and payments
Tool | Access | REST route | What it does |
| read |
| Invoices with customer, job, due date, total, amount paid and amount due. |
| read |
| Full invoice: lines, tax, totals, every payment with date and method, amount due, jobs and quote. |
| write |
| Draft invoice from an approved or accepted quote, for all of it or part of it. |
| write |
| Approve the invoice and email it to the customer, with payment reminders if enabled. |
| write |
| Record a payment received against an invoice and reduce the amount due. |
Scheduler
Tool | Access | REST route | What it does |
| read |
| Scheduler appointments in a date range, with staff, job, times and notes. |
| write |
| Book a job appointment on the Scheduler for staff, optionally emailing the customer a confirmation. |
Reports and timesheets
Tool | Access | REST route | What it does |
| read |
| Job profitability, job sheet, staff productivity or timesheet report for a period, as rows. |
| read |
| Timesheet entries in a date range: staff, job, customer, billing rate, hours, notes, invoiced. |
| write |
| Add a timesheet entry for a staff member, optionally on a job, with billing rate and notes. |
send_quote and send_invoice email the customer. schedule_appointment sends each staff member Tradify's "You've been scheduled" notice, and emails the customer only with email_customer. The other write tools stay inside Tradify. Drafts from create_quote and create_invoice_from_quote reach nobody. record_payment refuses more than the amount due and a draft invoice. Part invoices from a quote (percentage, fixed_amount, line_items) need a plan with progress invoicing, which Tradify sells as Pro.
Not in this version: price list items, kits and quote options (quotes take misc and time lines), editing or deleting a quote, invoice or customer, editing or deleting a time entry, moving or cancelling an appointment, report PDFs, job tasks and attachments, bills, purchase orders, enquiries, recurring jobs and forms.
Never built, on purpose: your Tradify sign-in, password and 2-Step Security, and your Tradify plan and billing. Every request passes a guard that refuses any change to the sign-in and account paths of the web app.
Configuration
Variable | Default | What it does |
|
| Folder of |
| The | |
| Proxy for every request to Tradify, e.g. | |
|
| |
| Bearer token required by | |
|
| Address of |
Security and your Tradify account
Your password never reaches this code. Only the cookies Chrome already holds are read, and only those of tradifyhq.com.
The session file is yours.
session.jsonis created with mode 0600. Anyone who has it can act as you in Tradify, so keep it out of git and shared folders.Local by default.
servebinds to127.0.0.1and refuses another address withoutTRADIFY_MCP_TOKEN.tradifyhq.com only. Requests and redirects outside tradifyhq.com are refused.
Read-only mode.
--read-onlyorTRADIFY_MCP_READ_ONLY=1exposes the 6 read tools only.Some actions reach real people. A sent quote or invoice lands in your customer's inbox and cannot be deleted in Tradify afterwards, only cancelled. MCP clients ask before running those tools; a script does not, so try it on a customer with your own email address first.
Errors
The REST API answers {"error": "<code>", "message": "..."}. The MCP server returns the same code and message as a tool error.
Status | Code | What to do |
401 |
| No session, or Tradify signed you out. Sign in at go.tradifyhq.com in Chrome and run |
403 |
| Tradify does not let this login do it. For |
403 |
| The server runs read-only, or the request would change your Tradify sign-in. |
403 |
| Tradify refused the request or showed a bot check. Open the web app in Chrome once, then retry. |
409 |
| Tradify asks for a CAPTCHA. Solve it in Chrome. |
422 |
| An argument is missing or wrong; the message names it. |
429 |
| Tradify is limiting the account. Wait a few minutes. |
502 |
| Tradify answered with an error (its own message is in |
Self-hosted or hosted
This repo | ||
Tools | the same 22 | the same 22 |
Runs | on your computer, while it is on | in the cloud, 24/7 |
Tradify session | your Chrome, saved in a local file | your own Cloud Browser in the EU, profile encrypted with AES-256-GCM |
When Tradify changes its web app |
| fixed for you, every tool tested daily |
Approvals | your MCP client asks per call | quote and invoice email and Scheduler bookings wait for your OK, switchable per tool |
Works with | MCP clients on your machine, local scripts | Claude.ai and ChatGPT connectors, n8n, Make, Zapier, any HTTP client |
Who may use it | you and your own business | you, teams, businesses, agencies |
Price | free | free 7-day trial with 2,000 credits, no card; then one-time packs from $29 for 5,000 credits |
On the hosted version a successful call uses 10 credits, failed calls are free, and the Cloud Browser uses 50 credits a day while it has an app enabled for agents. Full pricing.
FAQ
Is there a Tradify MCP server for Claude, ChatGPT or Cursor?
Yes, this one runs on your machine: tradify-mcp mcp for Claude Code, Claude Desktop, Cursor and Codex. ChatGPT and Claude.ai connectors need a public HTTPS URL, which the hosted Tradify MCP server gives you.
Can it get my Tradify jobs and invoices into another tool?
Yes. python examples/export_jobs.py --status all --out jobs.csv and python examples/overdue_invoices.py --out overdue.csv write CSV, and the REST API serves the same lists as JSON to n8n or any HTTP client.
Why does send_quote stop with app_permission_denied?
Tradify blocks quote and invoice email until the login has 2-Step Security. Set it up in Tradify under Settings > Security with a mobile number, then call again. The tool stops before it approves anything, so the quote or invoice stays a draft.
Which Tradify plan do I need? The tools do what your plan lets you do in Tradify. Part invoices from a quote need progress invoicing, which Tradify sells as Pro. On the free Tradify Connect plan only the Scheduler works.
Does it work outside the US? Yes. Tradify runs one web app for every country, and the tools read your company's time zone and tax rates from it.
Why does it need my Chrome? To read your Tradify session without your password and without a 2-Step code. Chrome is used once per sign-in, not for each call.
What happens when Tradify signs me out?
Calls fail with auth_expired. With Chrome remote debugging on, the server reads the new session on the next call (click Allow when Chrome asks). Otherwise run tradify-mcp connect again.
Can it run on a VPS or in Docker?
Technically yes, with a pasted cookie or a session.json copied from your computer. Tradify then sees your session from a datacenter IP, which looks less like you. For an always-on setup the hosted version keeps your session in your own Cloud Browser on a fixed IP.
Will my Tradify account get banned? Requests carry Chrome's fingerprint and go out one at a time, as you would click. Nobody can promise a platform never acts. Keep to your normal use.
Can I change the code or offer it to my clients? You may change it and use it in your own business. You may not offer it to others as a hosted or managed service. For client work, use Cotlet or write to contact@cotlet.dev.
A tool broke or I need another one. Open an issue with the tool name and the error message.
License
Elastic License 2.0. In short:
Allowed: using it for yourself and in your own business, free. Changing the code and sharing it under the same license.
Not allowed: offering it to others as a hosted or managed service, removing the license notices, getting around its limits.
Maintained by Cotlet (@cotletdev). Tradify is a trademark of its owner. This project is unofficial and not affiliated with, endorsed or sponsored by Tradify.
Available Tools
22 toolsadd_job_noteAdd job noteAInspect
Add a text note to a job's Notes tab.
Adds a plain-text note to the job, signed with the signed-in user's name and today's date, as the Notes tab's New Note does. No staff member is notified and it reaches no one. get_job lists the notes.
Inputs: note (required), job_id (required).
create_customerCreate customerAInspect
New customer profile, optionally with contact details and a physical address.
Creates an active customer with the company's default price group, document theme and tax settings, as the New Customer form does. email may hold several addresses separated by commas; quotes and invoices go there. It reaches no one and stays inside Tradify.
Inputs: name (required), city, email, phone, +5 more.
create_invoice_from_quoteCreate invoice from quoteAInspect
Draft invoice from an approved or accepted quote, for all of it or part of it.
Creates a draft invoice from a quote, as Create Invoice > From Quote does, linked to the quote and its job. mode entire copies every line; line_items copies the lines at the positions in lines; percentage invoices amount percent of the quote total; fixed_amount invoices amount (with tax); remaining invoices what the quote's earlier invoices did not. A part is one line at the quote's tax rate. Due date follows the customer's or your payment terms. The invoice stays a draft until send_invoice. Needs a plan with progress invoicing (Pro) for the part modes.
Inputs: mode (required), quote_id (required), lines, amount.
create_jobCreate jobAInspect
New job for a customer. It starts as Unassigned.
Creates a job for a customer, as New Job does, and Tradify gives it the next job number. It starts Unassigned; schedule_appointment books staff on it. Contact, phone and site address default to the customer's. It reaches no one and stays inside Tradify.
Inputs: customer_id (required), description (required), contact, reference, +2 more.
create_quoteCreate quoteAInspect
Draft quote with line items. Nothing is sent until you call send_quote.
Creates a draft quote for a customer, as New Quote does. Each line is misc (description, quantity, unit_price) or time (hours at a billing rate; the price comes from the customer's price group unless unit_price is given). Tax uses the default rate, or tax_rate by name; amounts, tax and totals are worked out as Tradify does. job_id links it to a job of the same customer. Expiry defaults to your expiry days setting. Price list items and kits are not supported yet. The quote stays a draft until send_quote.
Inputs: line_items (required), customer_id (required), job_id, reference, +3 more.
get_customerGet customerARead-onlyIdempotentInspect
Customer profile with sites, notes, latest jobs, quotes and invoices, and the balance due.
Returns one customer: contact, email, phone, address, sites and notes, plus the latest 25 jobs, quotes and invoices with their totals (job_count, quote_count and invoice_count give the full numbers; list_jobs, list_quotes and list_invoices page through more). balance_due adds up what is due on the approved invoices returned.
Inputs: customer_id (required).
get_invoiceGet invoiceARead-onlyIdempotentInspect
Full invoice: lines, tax, totals, every payment with date and method, amount due, jobs and quote.
Returns one invoice: status (draft, approved, overdue, paid, cancelled), customer, its jobs, the quote it came from and how (entire_quote, quote_line_items, percentage, fixed, remaining), reference, description, invoice and due dates, whether it was sent, its lines, subtotal, tax, total, paid, credited and due, and each payment with date, amount, method and reference.
Inputs: invoice_id (required).
get_jobGet jobARead-onlyIdempotentInspect
Full job: description, site, tasks, notes, appointments, costs, linked quotes and invoices.
Returns one job: customer, contact, site address, status, reference and description, the staff on it, its tasks and notes, the Scheduler appointments (times with the company's UTC offset), the costs logged on it (products and misc costs), the time logged on it (timesheets) and the quotes and invoices linked to it. Read it before changing a job.
Inputs: job_id (required).
get_quoteGet quoteARead-onlyIdempotentInspect
Full quote: lines with price and cost, tax, totals, gross profit, dates and invoices made from it.
Returns one quote: status (draft, awaiting_acceptance, accepted, declined, cancelled, expired), customer, job, reference, description, quote, expiry and acceptance dates, its lines (item, time, misc or kit, with quantity, unit price, unit cost, tax rate and amount), subtotal, tax, total, cost and gross profit, and the invoices made from it so far.
Inputs: quote_id (required).
get_reportGet reportARead-onlyIdempotentInspect
Job profitability, job sheet, staff productivity or timesheet report for a period, as rows.
Runs one report of Tradify's Reports page for the days from to to (both included, at most a year) and returns the rows of its CSV download, amounts as numbers. job_profitability gives three rows per job (Time, Materials, Total) with estimated cost from quotes, actual cost, invoiced, to invoice, gross profit and margin. job_sheet lists the jobs with site, staff, schedule, contacts, entered by and on. staff_productivity gives billable, non-billable and total hours (h:mm) per staff member. timesheets lists each time entry with job, customer, staff member, billing rate, notes, date and hours. date_basis picks jobs by entry or by schedule date. Stops at 1000 rows with truncated true.
Inputs: to (required), from (required), report (required), staff, +3 more.
list_appointmentsList appointmentsARead-onlyIdempotentInspect
Scheduler appointments in a date range, with staff, job, times and notes.
Returns the Scheduler's job appointments that fall between from and to (both days included, at most 31 days), each with its job, customer, staff member, start and end (ISO 8601 with the company's UTC offset), notes and status (accepted, unconfirmed, declined, cancelled). staff keeps only those people, by full name.
Inputs: to (required), from (required), staff.
list_customersList customersARead-onlyIdempotentInspect
Customer profiles with contact details and sites.
Lists customers by name with contact, email (may be a comma list), phone, mobile, physical address and sites. search matches name, contact, email or phone, so use it to find the customer_id before creating a job or quote. archived lists archived customers instead. Pass next_cursor back as cursor.
Inputs: limit, cursor, search, archived.
list_invoicesList invoicesARead-onlyIdempotentInspect
Invoices with customer, job, due date, total, amount paid and amount due.
Lists invoices, newest first, with customer, jobs, invoice and due dates, total, paid and due (total minus payments and credits). status approved (default) is every approved invoice not fully paid; overdue is the ones past their due date; paid, draft, cancelled and all as named. customer_id lists that customer's invoices, and status then filters the page you get. Pass next_cursor back as cursor.
Inputs: limit, cursor, search, status, +1 more.
list_jobsList jobsARead-onlyIdempotentInspect
Jobs with number, customer, site address, status and assigned staff.
Lists jobs, newest number first. By default only active jobs (every status marked active, built-in or custom); status all, a built-in status or the name of a custom status narrows it. customer_id lists that customer's jobs, and status then filters the page you get. Pass next_cursor back as cursor.
Inputs: limit, cursor, search, status, +1 more.
list_quotesList quotesARead-onlyIdempotentInspect
Quotes with customer, total, quote date, expiry date and status.
Lists quotes, newest quote date first, with customer, linked job, total (with tax), quote, expiry and accepted dates and status. By default the quotes awaiting acceptance; expired is the ones awaiting acceptance past their expiry date. since keeps quotes dated on or after that day, so use status accepted with since to find what was won in a period. Pass next_cursor back as cursor.
Inputs: limit, since, cursor, search, +1 more.
list_timesheetsList timesheetsARead-onlyIdempotentInspect
Timesheet entries in a date range: staff, job, customer, billing rate, hours, notes, invoiced.
Returns the time entries between from and to (both days included, at most 62 days), oldest first, each with staff member, job and customer (none for time off a job), billing rate and whether it is billable, start and end (ISO 8601 with the company's UTC offset), hours, notes and whether it is on an invoice. staff and job_id narrow it. total_hours sums the entries returned.
Inputs: to (required), from (required), staff, job_id.
log_timeLog timeAInspect
Add a timesheet entry for a staff member, optionally on a job, with billing rate and notes.
Adds one entry to Timesheets from start to end (same day, at most 24 hours) for a staff member (default the signed-in user), on a job or on none, at a billing rate (default the staff member's own) with the staff member's cost rate, as the New Timesheet Entry dialog does. Time on a job shows in its costs, the job profitability report and can be invoiced. It reaches no one.
Inputs: end (required), start (required), notes, staff, +2 more.
record_paymentRecord paymentAInspect
Record a payment received against an invoice and reduce the amount due.
Adds a payment you already received to an approved invoice, as Add Payment does: amount, date, method (by name, from Settings > Payment Methods) and a reference. It charges nobody and emails nobody. The amount cannot exceed what is due; paying it all marks the invoice paid. If an accounting app is connected, Tradify syncs the payment to it.
Inputs: amount (required), invoice_id (required), date, method, +1 more.
schedule_appointmentSchedule appointmentADestructiveInspect
Book a job appointment on the Scheduler for staff, optionally emailing the customer a confirmation.
Books the job on the Scheduler from start to end for each staff member named (by full name; default the signed-in user), as the Scheduler does. Each staff member gets Tradify's "You've been scheduled" notice, and an Unassigned or Assigned job becomes Scheduled. email_customer also sends the customer the appointment confirmation email, with customer_message in it.
Inputs: end (required), start (required), job_id (required), notes, +3 more.
send_invoiceSend invoiceADestructiveInspect
Approve the invoice and email it to the customer, with payment reminders if enabled.
Approves a draft invoice (Tradify gives it its number) and emails it from Tradify with the link to view and pay it; payment reminders follow if you enabled them. Without to it goes to the customer's email. Subject and text default to your invoice email template. An approved invoice can be sent again. Tradify sends this mail only when the login has 2-Step Security set up; otherwise the call stops before approving.
Inputs: invoice_id (required), to, message, subject, +1 more.
send_quoteSend quoteADestructiveInspect
Approve the quote and email it to the customer with a link to accept or decline online.
Approves a draft quote (it becomes awaiting acceptance) and emails it from Tradify with the link where the customer accepts or declines it online. Without to it goes to the customer's email. Subject and text default to your quote email template. An approved quote can be sent again. Tradify sends this mail only when the login has 2-Step Security set up; otherwise the call stops before approving.
Inputs: quote_id (required), to, message, subject, +1 more.
update_job_statusUpdate job statusAInspect
Set a status on a job, built-in or one of your custom statuses.
Sets a job's status, as Change Status on the Jobs list does: to_invoice, on_hold, complete, cancelled, the others of the built-in list, or the name of a custom status from Settings > Jobs > Job Statuses (spaces as underscores). It reaches no one, and one more call sets it back.
Inputs: job_id (required), status (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 22 tools
Most tools target distinct resources and actions: list/get/create/send for customers, jobs, quotes, invoices, appointments and timesheets are clearly separated. Minor overlap exists between list_timesheets and the timesheets report mode, and between list_appointments and the appointment data embedded in get_job, but the descriptions make the intended use reasonably clear.
All tool names use snake_case with a predictable verb_noun pattern: list_*, get_*, create_*, send_*, log_*, record_*, schedule_* and update_*. The few variants such as add_job_note remain consistent with the same convention.
The server exposes 22 tools, which is slightly heavy but reasonable for a broad field-service platform covering customers, jobs, quotes, invoices, scheduling, timesheets and reports. Each tool appears to correspond to a real workflow rather than being redundant.
Core workflows are covered: create/list/get customers and jobs, quote creation and sending, invoice creation/sending, payment recording, scheduling, time logging and reporting. However, notable gaps remain: no update/delete for customers, quotes or invoices, no staff listing despite scheduling by full name, and limited job editing beyond status and notes.
Maintenance
Related MCP Connectors
Jobber MCP server for ChatGPT, Claude and any AI agent: create quote, convert quote to job, create invoice, send invoice and list unpaid invoices in your own Jobber account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Jobber yourself; Cotlet does not store your password and you need no Jobber API key. About the official Jobber API: Yes, Jobber has a GraphQL API in its Developer Center (checked 14 Oct 2026), but you cannot use it without registering an app. Each Jobber account authorizes your app with OAuth 2.0 and tokens must be refreshed. Setup and FAQ: https://cotlet.dev/integrations/jobber-api-mcp-server
Joist MCP server for ChatGPT, Claude and any AI agent: create estimate, convert estimate to invoice, list invoices, add client and record payment in your own Joist account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to Joist yourself; Cotlet does not store your password and you need no Joist API key. About the official Joist API: Joist has no public API (checked 26 Oct 2026): its help center and pricing page document none, and there are no webhooks. The only built-in link out is QuickBooks Sync, part of Joist Pro, which copies issued estimates and invoices to QuickBooks Online once a night. Setup and FAQ: https://cotlet.dev/integrations/joist-api-mcp-server
Let AI agents use your real, signed-in Chrome: tabs, clicks, forms, screenshots and video.
ServiceTrade MCP server for ChatGPT, Claude and any AI agent: list jobs, create appointment, release appointment to technicians, list deficiencies, create quote, submit quote and add comment to job in your own ServiceTrade account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to ServiceTrade yourself; Cotlet does not store your password and you need no ServiceTrade API key. About the official ServiceTrade API: ServiceTrade has a full REST API with public docs and OAuth2 client-credentials sign-in, but no official MCP server (checked 23 Oct 2026). The API covers jobs, appointments, deficiencies and quotes, so the missing piece is the agent layer: you build and host the wrapper yourself. Setup and FAQ: https://cotlet.dev/integrations/servicetrade-api-mcp-server
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceLets AI coding tools drive the real Chrome browser you already have open, so they can read and act on logged-in pages with real clicks, typing, navigation, screenshots, and network or storage inspection. Everything runs locally over stdio with no remote-debugging port, so nothing leaves your machine.1 npmISC
- AlicenseAqualityBmaintenanceEnables AI agents and scripts to manage bookings, provider assignment, rescheduling, cancellations, customers, quotes, invoices, and dashboard data through a self-hosted API and MCP interface using your own Chrome session.217131 PyPI6Elastic 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents and scripts to access clients, estimates, invoices, payments, and reports from a user's own Joist account through their Chrome session, over MCP or a local REST API.135 PyPI5Elastic 2.0
- AlicenseAqualityCmaintenanceEnables AI agents to create estimates, schedule jobs, send invoices, and query open estimates and unpaid invoices from a user's signed-in contractor account using natural language.7Elastic 2.0