Clientary works with AI assistants through an MCP server. An assistant is given the server address, sends the person to sign in and approve the connection through OAuth, and then works in the account as that person, with exactly their permissions. Every tool below runs through this API.
https://www.clientary.com/mcp
Setup steps for Claude, ChatGPT, Claude Code, and Gemini CLI are in the help article. The server answers initialize, ping, and tools/list to anyone, so a client can read the catalog before a person signs in. Every other message needs the person's token.
A tool marked read-only changes nothing. A tool marked destructive sends something to a client or deletes something, and an assistant confirms with the person before running one. Creating a document makes a draft. Sending it is its own tool.
list_clients read-onlyFind clients by name or number, or list them. Returns one page at a time; use the page number for more. Archived clients are excluded unless asked for.
query string — Part of a client name or number to search forfilter string: archived — Pass "archived" to list archived clients instead of active onespage integerget_client read-onlyThe full record of one client, including its contacts.
id integer, requiredcreate_clientAdd a new client. Only the name is required.
name string, required — Client name (a company or a person)number string — Client number or code, as the account numbers its clientsaddress stringaddress_2 stringcity stringstate stringzip stringcountry stringtax_id stringwebsite stringdescription string — Notes about the client, visible to staffnote string — A note that prints on the client's invoicesstatus string: active, archived — Archived clients are hidden from listsupdate_clientChange fields on an existing client. Only the fields given are changed.
id integer, requiredname string — Client name (a company or a person)number string — Client number or code, as the account numbers its clientsaddress stringaddress_2 stringcity stringstate stringzip stringcountry stringtax_id stringwebsite stringdescription string — Notes about the client, visible to staffnote string — A note that prints on the client's invoicesstatus string: active, archived — Archived clients are hidden from listsdelete_client destructivePermanently delete a client and everything attached to it. Prefer archiving (update status to "archived") unless the person clearly wants deletion.
id integer, requiredlist_leads read-onlySearch or list leads. Open leads by default; pass a filter for closed (won), lost, or all.
query string — Part of a lead name to search forfilter string: closed, lost, allsort string: name, oldest — Default is newest firstpage integerget_lead read-onlyThe full record of one lead, including its contacts.
id integer, requiredcreate_leadAdd a new lead. Only the name is required.
name string, required — Lead name (a company or a person)number stringaddress stringaddress_2 stringcity stringstate stringzip stringcountry stringwebsite stringdescription string — Notes about the leadlead_value number — Expected value of the deal, in the account currencylead_origin string — Where the lead came from, e.g. "Referral" or "Website"assignee_id integer — Staff user id the lead is assigned tostatus string: lead, won, lost — Marking a lead won converts it to a clientlost_reason_str string — Why the lead was lost, when marking it lostupdate_leadChange fields on a lead, including marking it won or lost. Only the fields given are changed.
id integer, requiredname string — Lead name (a company or a person)number stringaddress stringaddress_2 stringcity stringstate stringzip stringcountry stringwebsite stringdescription string — Notes about the leadlead_value number — Expected value of the deal, in the account currencylead_origin string — Where the lead came from, e.g. "Referral" or "Website"assignee_id integer — Staff user id the lead is assigned tostatus string: lead, won, lost — Marking a lead won converts it to a clientlost_reason_str string — Why the lead was lost, when marking it lostdelete_lead destructivePermanently delete a lead. Prefer marking it lost unless the person clearly wants deletion.
id integer, requiredlist_invoices read-onlySearch or list invoices, optionally for one client or project, or by status. Overdue means open and past due. Returns one page at a time.
query string — Part of an invoice number, title, or client nameclient_id integerproject_id integerstatus string: draft, open, overdue, paid, pending, cancelledfrom_date string — YYYY-MM-DD, by document dateto_date string — YYYY-MM-DD, by document datepage integerget_invoice read-onlyOne invoice with its line items, totals, and payment state.
id integer, requiredcreate_invoiceCreate a draft invoice for a client with line items. Nothing is sent; use send_invoice afterwards, after the person confirms.
items array, required — The line itemsclient_id integer, required — The client being billedtitle string — A title shown on the invoicenumber string — Only when the person gives a specific invoice number ("issue invoice #123456"). Otherwise leave it out: the account assigns its next number, and a made-up one breaks the sequencedate string — Invoice date, YYYY-MM-DD; defaults to todaydue_date string — Due date, YYYY-MM-DDcurrency_code string — ISO currency code, e.g. USD; defaults to the account currencypo string — The client's purchase order numbersummary string — A summary shown above the line itemsnote string — A note shown below the line itemstax number — Tax rate as a percentagetax_label stringstatus string: draft, paid, cancelled — Set directly only to record a state; use send_invoice to actually sendassociated_contract_id integer — The signed proposal or contract this invoice fulfils. Links the two so the proposal shows as invoiced. Only a signed one, and only onceupdate_invoiceChange fields on an invoice. Items given are added to the invoice; existing items are kept.
id integer, requireditems array — Line items to addclient_id integer — The client being billedtitle string — A title shown on the invoicenumber string — Only when the person gives a specific invoice number ("issue invoice #123456"). Otherwise leave it out: the account assigns its next number, and a made-up one breaks the sequencedate string — Invoice date, YYYY-MM-DD; defaults to todaydue_date string — Due date, YYYY-MM-DDcurrency_code string — ISO currency code, e.g. USD; defaults to the account currencypo string — The client's purchase order numbersummary string — A summary shown above the line itemsnote string — A note shown below the line itemstax number — Tax rate as a percentagetax_label stringstatus string: draft, paid, cancelled — Set directly only to record a state; use send_invoice to actually sendassociated_contract_id integer — The signed proposal or contract this invoice fulfils. Links the two so the proposal shows as invoiced. Only a signed one, and only oncedelete_invoice destructivePermanently delete an invoice. Prefer cancelling (update status to "cancelled") for anything a client has seen.
id integer, requiredsend_invoice destructiveEmail an invoice to the client, with the PDF attached. Recipients default to the client's contacts when omitted. Confirm with the person before sending.
id integer, requiredrecipients array — Email addresses; the client's contacts when omittedsubject string — Defaults to the account's standard subjectmessage string — Defaults to the account's standard messagelist_retainers read-onlyList retainer invoices, optionally for one client or by status. Also returns what each client has left on account. Returns one page at a time.
client_id integerstatus string: draft, open, paid, pending, cancelledfrom_date string — YYYY-MM-DD, by document dateto_date string — YYYY-MM-DD, by document datepage integerget_retainer read-onlyOne retainer with its line items, totals, and payments.
id integer, requiredcreate_retainerAsk a client to pay a retainer up front, by creating a retainer invoice. Nothing is sent, and nothing reaches their balance until they pay it. A retainer cannot be attached to an estimate or a project.
items array, required — The line itemsclient_id integer, required — The client being asked for the retainertitle stringnumber string — Only when the person gives a specific number. Otherwise leave it out: the account assigns its next numberdate string — Retainer date, YYYY-MM-DD; defaults to todaydue_date string — Due date, YYYY-MM-DD; defaults to the account settingcurrency_code string — ISO currency code; defaults to the account currencypo stringsummary stringnote stringtax number — Tax rate as a percentagetax_label stringstatus string: draft, paid, cancelled — Set directly only to record a stateupdate_retainerChange a retainer's fields.
id integer, requiredclient_id integer — The client being asked for the retainertitle stringnumber string — Only when the person gives a specific number. Otherwise leave it out: the account assigns its next numberdate string — Retainer date, YYYY-MM-DD; defaults to todaydue_date string — Due date, YYYY-MM-DD; defaults to the account settingcurrency_code string — ISO currency code; defaults to the account currencypo stringsummary stringnote stringtax number — Tax rate as a percentagetax_label stringstatus string: draft, paid, cancelled — Set directly only to record a statedelete_retainer destructiveDelete a retainer.
id integer, requiredsend_retainer destructiveEmail a retainer to the client to pay, with the PDF attached. Recipients default to the client's contacts when omitted. Confirm with the person before sending.
id integer, requiredrecipients array — Email addresses; the client's contacts when omittedsubject stringmessage stringlist_estimates read-onlySearch or list estimates, optionally for one client or project, or by status. Returns one page at a time.
query string — Part of an estimate number, title, or client nameclient_id integerproject_id integerstatus string: draft, open, accepted, declined, expired, archivedfrom_date string — YYYY-MM-DD, by document dateto_date string — YYYY-MM-DD, by document datepage integerget_estimate read-onlyOne estimate with its line items and totals.
id integer, requiredcreate_estimateCreate a draft estimate for a client with line items. Nothing is sent; use send_estimate afterwards, after the person confirms.
items array, required — The line itemsclient_id integer, required — The client the estimate is fortitle stringnumber string — Only when the person gives a specific estimate number. Otherwise leave it out: the account assigns its next number, and a made-up one breaks the sequencedate string — Estimate date, YYYY-MM-DD; defaults to todayexpiration_date string — When the estimate expires, YYYY-MM-DDdelivery_date string — When the work would be delivered, YYYY-MM-DDcurrency_code string — ISO currency code; defaults to the account currencypo stringnote string — A note shown below the line itemstax number — Tax rate as a percentagetax_label stringstatus string: draft, accepted, declined, archived — Set directly only to record a state; use send_estimate to actually sendupdate_estimateChange fields on an estimate. Items given are added; existing items are kept.
id integer, requireditems array — Line items to addclient_id integer — The client the estimate is fortitle stringnumber string — Only when the person gives a specific estimate number. Otherwise leave it out: the account assigns its next number, and a made-up one breaks the sequencedate string — Estimate date, YYYY-MM-DD; defaults to todayexpiration_date string — When the estimate expires, YYYY-MM-DDdelivery_date string — When the work would be delivered, YYYY-MM-DDcurrency_code string — ISO currency code; defaults to the account currencypo stringnote string — A note shown below the line itemstax number — Tax rate as a percentagetax_label stringstatus string: draft, accepted, declined, archived — Set directly only to record a state; use send_estimate to actually senddelete_estimate destructivePermanently delete an estimate. Prefer archiving (update status to "archived") for anything a client has seen.
id integer, requiredsend_estimate destructiveEmail an estimate to the client, with the PDF attached. Recipients default to the client's contacts when omitted. Confirm with the person before sending.
id integer, requiredrecipients arraysubject stringmessage stringlist_projects read-onlySearch or list projects, optionally for one client. Active projects by default; pass a filter for closed, billable, unbilled, over-budget, or all.
query string — Part of a project nameclient_id integerfilter string: all, closed, billable, unbilled, overbudgetpage integerget_project read-onlyOne project.
id integer, requiredcreate_projectCreate a project for a client, optionally from one of the account's project templates, which brings its phases and tasks. Name and client are required.
template_id integer — A project template to start fromclient_id integer, requiredname string, requirednumber stringdescription stringnote stringstatus string: active, completed — Completed projects are closedproject_type string: hourly, flat_rate — How the project is billedrate number — Hourly rate; defaults to the person's own hourly rate, or 0currency_code stringbudget_enabled booleanbudget_type string: hours, cost — Whether the budget is in hours or in money; a flat-rate project budgets in hoursbudget numberend_date string — Target end date, YYYY-MM-DDclient_visible boolean — Whether the client can see the project in their portalupdate_projectChange fields on a project, including closing it. Only the fields given are changed.
id integer, requiredclient_id integername stringnumber stringdescription stringnote stringstatus string: active, completed — Completed projects are closedproject_type string: hourly, flat_rate — How the project is billedrate number — Hourly rate; defaults to the person's own hourly rate, or 0currency_code stringbudget_enabled booleanbudget_type string: hours, cost — Whether the budget is in hours or in money; a flat-rate project budgets in hoursbudget numberend_date string — Target end date, YYYY-MM-DDclient_visible boolean — Whether the client can see the project in their portaldelete_project destructivePermanently delete a project with its tasks and time. Prefer completing it unless the person clearly wants deletion.
id integer, requiredlist_project_templates read-onlyThe account's project templates, each with the phases and tasks a project made from it starts with.
query stringget_project_template read-onlyOne project template with its phases and tasks by name.
id integer, requiredlist_tasks read-onlyList tasks, optionally for one project or client, open or done. Returns one page at a time.
project_id integerclient_id integerstatus string: open, donepage integerget_task read-onlyOne task.
id integer, requiredcreate_taskAdd a task to a project. Title and project are required.
project_id integer, requiredtitle string, requireddescription stringdue_date string — YYYY-MM-DDassignee_id integer — Staff user id the task is assigned tocomplete boolean — Mark done or reopenbudget_type string: hours, cost — Whether the budget is in hours or in moneybudget numberupdate_taskChange a task, including marking it done. Only the fields given are changed.
id integer, requiredproject_id integertitle stringdescription stringdue_date string — YYYY-MM-DDassignee_id integer — Staff user id the task is assigned tocomplete boolean — Mark done or reopenbudget_type string: hours, cost — Whether the budget is in hours or in moneybudget numberdelete_task destructivePermanently delete a task.
id integer, requiredlist_time_entries read-onlyList the time logged on one project, all of it or only billed or unbilled.
project_id integer, requiredfilter string: billed, unbilledget_time_entry read-onlyOne time entry.
id integer, requiredlog_timeLog hours on a project for the person, dated today unless told otherwise.
project_id integer, requiredhours number, required — Hours worked, decimal (1.5 is an hour and a half)completion_date string — The day the work was done, YYYY-MM-DD; defaults to todaytitle string — What the time was fordescription stringbillable boolean — Defaults to the project's settingupdate_time_entryChange a time entry. Only the fields given are changed.
id integer, requiredproject_id integerhours number — Hours worked, decimal (1.5 is an hour and a half)completion_date string — The day the work was done, YYYY-MM-DD; defaults to todaytitle string — What the time was fordescription stringbillable boolean — Defaults to the project's settingdelete_time_entry destructivePermanently delete a time entry.
id integer, requiredlist_contracts read-onlyList the account's contracts (not templates), optionally by status or date. Returns one page at a time.
status string: draft, sent, viewed, signed, voidedfrom_date string — YYYY-MM-DD, by document dateto_date string — YYYY-MM-DD, by document datepage integerget_contract read-onlyOne contract with its sections as readable text.
id integer, requiredcreate_contractCreate a draft contract for a client, from one of the account's templates or from plain-text sections. Nothing is sent to the client. Prefer a template when one fits: it carries the account's own wording. Write sections yourself only when the person has given you the terms; otherwise ask.
template_id integer — A contract template to start from; its sections and title are used unless sections or a subject are givensections array — Required when no template is givenclient_id integer, requiredsubject string — The document titledate string — YYYY-MM-DD; defaults to todayproject_id integerstatus string: draft, declined — Record that the client declined, or return a draft. Sending and signing set the other statessettings_auto_create_invoice_after_sign boolean — When the client signs, an invoice for what they chose is created and sent to them without anyone doing it by handupdate_contractChange a contract's title, date, client, project, or status. Sections given replace all existing sections; omit them to leave the text alone.
id integer, requiredsections arrayclient_id integersubject string — The document titledate string — YYYY-MM-DD; defaults to todayproject_id integerstatus string: draft, declined — Record that the client declined, or return a draft. Sending and signing set the other statessettings_auto_create_invoice_after_sign boolean — When the client signs, an invoice for what they chose is created and sent to them without anyone doing it by handdelete_contract destructivePermanently delete a contract. Prefer declining or leaving it for anything the client has seen.
id integer, requiredsend_contract destructiveEmail a contract to the client, with a link to read and sign it and the PDF attached. Recipients default to the client's contacts when omitted. Confirm with the person before sending.
id integer, requiredrecipients array — Email addresses; the client's contacts when omittedsubject string — Defaults to the account's standard subjectmessage string — Defaults to the account's standard messagelist_contract_templates read-onlyThe account's contract templates, with the built-in ones, by name and description. Make a contract from one with create_contract and its template_id.
get_contract_template read-onlyOne contract template with its sections as readable text.
id integer, required — Negative for a built-in templatelist_proposals read-onlyList the account's proposals (not templates), optionally by status or date. Returns one page at a time.
status string: draft, sent, viewed, signed, voidedfrom_date string — YYYY-MM-DD, by document dateto_date string — YYYY-MM-DD, by document datepage integerget_proposal read-onlyOne proposal with its sections as readable text.
id integer, requiredcreate_proposalCreate a draft proposal for a client, from one of the account's templates or from plain-text sections. Nothing is sent to the client. Prefer a template when one fits: it carries the account's own wording. Write sections yourself only when the person has given you the terms; otherwise ask.
template_id integer — A proposal template to start from; its sections and title are used unless sections or a subject are givensections array — Required when no template is givenclient_id integer, requiredsubject string — The document titledate string — YYYY-MM-DD; defaults to todayproject_id integerstatus string: draft, declined — Record that the client declined, or return a draft. Sending and signing set the other statessettings_auto_create_invoice_after_sign boolean — When the client signs, an invoice for what they chose is created and sent to them without anyone doing it by handupdate_proposalChange a proposal's title, date, client, project, or status. Sections given replace all existing sections; omit them to leave the text alone.
id integer, requiredsections arrayclient_id integersubject string — The document titledate string — YYYY-MM-DD; defaults to todayproject_id integerstatus string: draft, declined — Record that the client declined, or return a draft. Sending and signing set the other statessettings_auto_create_invoice_after_sign boolean — When the client signs, an invoice for what they chose is created and sent to them without anyone doing it by handdelete_proposal destructivePermanently delete a proposal. Prefer declining or leaving it for anything the client has seen.
id integer, requiredsend_proposal destructiveEmail a proposal to the client, with a link to read and sign it and the PDF attached. Recipients default to the client's contacts when omitted. Confirm with the person before sending.
id integer, requiredrecipients array — Email addresses; the client's contacts when omittedsubject string — Defaults to the account's standard subjectmessage string — Defaults to the account's standard messagelist_proposal_templates read-onlyThe account's proposal templates, with the built-in ones, by name and description. Make a proposal from one with create_proposal and its template_id.
get_proposal_template read-onlyOne proposal template with its sections as readable text.
id integer, required — Negative for a built-in templatelist_recurring_schedules read-onlyList recurring invoice schedules, optionally for one client or by status.
client_id integerstatus string: active, paused, finished, archivedquery stringpage integerget_recurring_schedule read-onlyOne recurring schedule with its line items.
id integer, requiredcreate_recurring_schedule destructiveStart a recurring invoice schedule for a client: line items, a cadence, and a first date. Each invoice is drafted for review unless the action says otherwise. When the person asks for a retainer, set retainer. Confirm the cadence and amount with the person first.
items array, requiredclient_id integer, requiredtitle stringtime_interval string, required: weekly, biweekly, semimonthly, monthly, bimonthly, quarterly, semiannually, annually — How often an invoice is issuednext_date string, required — When the next invoice is issued, YYYY-MM-DDaction string: draft, send, autobill — What happens on each date: draft the invoice for review (default), send it to the client, or charge the client's card on fileoccurrences integer — How many invoices remain; omit for an open-ended scheduledue_period integer — Days until each invoice is due; defaults to the account settingcurrency_code stringpo stringsummary stringnote stringtax number — Tax rate as a percentagetax_label stringretainer boolean — Each occurrence issues a retainer invoice asking the client to top up their balance, rather than an ordinary invoice for work doneretainer_threshold number — The retainer balance below which the client is asked to top upuse_retainer_balance boolean — Each occurrence draws against the client's existing retainer balance instead of charging them. Needs the autobill action, and cannot be combined with retainerupdate_recurring_scheduleChange a schedule's cadence, next date, action, remaining occurrences, or fields. Items given are added. Use pause or resume to stop and restart it.
id integer, requireditems arraystatus string: active, paused — Pause or resume the scheduleclient_id integertitle stringtime_interval string: weekly, biweekly, semimonthly, monthly, bimonthly, quarterly, semiannually, annually — How often an invoice is issuednext_date string — When the next invoice is issued, YYYY-MM-DDaction string: draft, send, autobill — What happens on each date: draft the invoice for review (default), send it to the client, or charge the client's card on fileoccurrences integer — How many invoices remain; omit for an open-ended scheduledue_period integer — Days until each invoice is due; defaults to the account settingcurrency_code stringpo stringsummary stringnote stringtax number — Tax rate as a percentagetax_label stringretainer boolean — Each occurrence issues a retainer invoice asking the client to top up their balance, rather than an ordinary invoice for work doneretainer_threshold number — The retainer balance below which the client is asked to top upuse_retainer_balance boolean — Each occurrence draws against the client's existing retainer balance instead of charging them. Needs the autobill action, and cannot be combined with retainerdelete_recurring_schedule destructivePermanently delete a recurring schedule. Prefer pausing it.
id integer, requiredlist_recurring_time read-onlyList recurring time entries, optionally by status.
status string: active, paused, stopped, archivedpage integerget_recurring_time read-onlyOne recurring time entry.
id integer, requiredcreate_recurring_time destructiveLog hours on a project automatically on a cadence, starting on a date. Confirm the cadence and hours with the person first.
project_id integer, required — The project the time is logged ontitle string, required — What the time is fordescription stringhours number, required — Hours logged each timetime_interval string, required: daily, workdays, weekly, biweekly, monthlynext_date string, required — The first date to log, YYYY-MM-DDoccurrences integer — How many times to log; omit for open-endedbillable booleanuser_id integer — Staff user the time is logged for; defaults to the personupdate_recurring_timeChange a recurring time entry. Only the fields given are changed.
id integer, requiredproject_id integer — The project the time is logged ontitle string — What the time is fordescription stringhours number — Hours logged each timetime_interval string: daily, workdays, weekly, biweekly, monthlynext_date string — The first date to log, YYYY-MM-DDoccurrences integer — How many times to log; omit for open-endedbillable booleanuser_id integer — Staff user the time is logged for; defaults to the personpause_recurring_timePause a recurring time entry; nothing is logged until it is resumed.
id integer, requiredresume_recurring_timeResume a paused recurring time entry.
id integer, requiredarchive_recurring_time destructiveStop a recurring time entry for good and hide it from lists. Past entries stay.
id integer, requiredlist_comments read-onlyThe comments on one invoice, estimate, project, task, proposal, or contract, newest first.
on string, required: invoice, estimate, project, task, proposal, contract — What kind of recordid integer, required — That record's idadd_commentPost a comment on a record. Clients with portal access see it unless staff_only is set. The people involved are notified as they would be for a comment made in the app.
on string, required: invoice, estimate, project, task, proposal, contractid integer, requiredbody string, requiredstaff_only boolean — Hide from client contactsupdate_commentEdit a comment the person wrote.
id integer, requiredbody string, requireddelete_comment destructiveDelete a comment the person wrote.
id integer, requiredreport_summary read-onlyTotals for a date range: invoiced (by invoice date, drafts and cancellations excluded), paid (by the day payment arrived), outstanding balances split into current and overdue as of today, estimates issued and accepted, proposals sent and signed with the value of what signed clients chose, retainer money deposited and drawn with what clients have left on account, and hours logged (total and billable). Money figures are keyed by currency code with a total and count each, since amounts in different currencies don't add. Dates are inclusive calendar dates in the account's bookkeeping; work out the range from the person's own calendar and pass it. Defaults to this month. Use this for how much or how many; use the list tools for which ones.
from_date string — YYYY-MM-DDto_date string — YYYY-MM-DDclient_id integer — Narrow to one client