Assistants
Bill by asking. Approve before anything goes out.
Connect an AI assistant to your workspace and it can read your books, draft the invoice and ask to send it. What it cannot do is send it, or move money. Those wait for a signed-in person in the console.
63 read tools
What it can read
Each line is an operation in the product’s own API registry, under the name the assistant sees. This list is generated from that registry, so it cannot name a tool that does not exist.
your business profile
get_business_contextThe tenant and its businesses: terminology, presets, fee types, invoice fields, currencies, plan and cap status.
clients
list_clientsList clients, newest first (contact details masked unless contacts:read).find_clientFind clients by name prefix.get_clientOne client.
invoices
list_invoicesList invoices, newest first. A discarded draft is left out unless discarded=true.get_invoiceOne invoice with lines and totals.preview_invoice_pdfRender (or reuse) the invoice PDF and return a short-lived signed URL. Needs contacts:read as well: the PDF prints the client’s address and email.list_invoice_ledgerThe ledger entries behind one invoice: payments, credits, write-offs, refunds and returns, oldest first.get_pay_link_statusThe state of an invoice’s public pay link: whether one exists, its expiry, whether it was revoked, when it was first viewed and how often. Never the link itself.
reminder text
draft_reminder_textDraft the subject and body of a payment reminder for an open invoice. Text only — nothing is sent; a person sends it or proposes it.
estimates
list_estimatesList estimates, newest first. A discarded draft is left out unless discarded=true.get_estimateOne estimate.
plan usage
usage_statusThis month’s sends against the plan cap, and this month’s executed assistant actions against the plan’s allowance.
plan
get_upgrade_optionsThe plans this workspace may upgrade to, with their prices, and the link the workspace owner opens to accept one.
what this connection may do
get_connection_statusThis connection: its mode (plan, ask or auto), its effective scopes, per action kind the remaining auto-approve allowance for today, and the workspace’s executed assistant actions this month against the plan’s allowance.
requests waiting for approval
list_pending_actionsPrepared actions proposed for this tenant and what happened to them.get_actionOne prepared action.wait_for_actionWait, up to 25 seconds, for a person to decide an action this connection proposed. Answers as soon as the status leaves pending; otherwise answers the pending action with retryAfterSeconds. Served by its own function so a parked wait never starves the API.
payments
list_paymentsList payments, newest first.get_paymentOne payment.get_receipt_pdfRender (or reuse) the receipt PDF for a succeeded payment and return a short-lived signed URL.
reports and statements
ar_ageing_reportReceivables by age bucket, per currency, as at a date.ap_ageing_reportPayables by age bucket, per currency, as at a date.income_reportIncome and expenditure over a period, per currency.tax_summary_reportTax charged and reclaimable over a period, per currency.statement_reportThe tenant statement: opening, movements and closing per currency.client_statementOne client’s statement over a period.get_statement_pdfRender the tenant statement for a year or a month, in one currency, and return a short-lived signed URL.get_client_statement_pdfRender one client’s statement for a period, in one currency, and return a short-lived signed URL.settlement_reportWhat settled and when, grouped by the gateway’s own settlement date, with unsettled payments named.reconciliation_reportDo the books agree: the ledger against every invoice’s settled side, and the cash movements. The same computation the console runs.
collections and cash forecasts
collections_insightsPredicted pay date and late-risk band per client and invoice, as at a date.cash_forecastA 30/60/90-day cash forecast per currency, with a low and a high around each figure.
accounting exports
accounting_exportDated records for a window (at most 366 days, 5 000 rows): invoice lines, the receivable ledger (the statement, signed by effect on what is owed) or expenditure (bills and expenses). Amounts are exact decimal strings with the currency on every row.
recurring schedules
list_recurringList recurring schedules.get_recurringOne recurring schedule.
time entries
list_time_entriesList time entries, newest first.
expenses
list_expensesList expenses, newest first.
mileage
list_mileageList mileage entries, newest first.
bills you owe
list_billsList bills, newest first. A discarded draft is left out unless discarded=true.get_billOne bill with its lines and what is still due.list_bill_paymentsThe payments recorded against one bill, as ledger entries (entryId is what void_bill_payment takes), oldest first.
jobs
list_jobsJobs billed in this business, folded from the invoices that carry a jobRef: total, deposit, progress, retainage withheld and released.
unbilled
preview_unbilledThe lines and totals a rebill would produce right now for a client: unbilled time, expenses and mileage in the business currency. Nothing is written.
vendors
list_vendorsList vendors, newest first (contact details masked unless contacts:read).get_vendorOne vendor.
paymentMethods
list_payment_methodsA client’s saved payment methods as HANDLES: id, card or bank, last four, card type, expiry, label, whether it is usable. Never a vault id.
messages
list_messagesThe outbound delivery log, newest first: what went, what was blocked or failed, and why. Contact keys and last-four digits only; a stored body has any link token redacted before it leaves.
activity
list_activityThe audit log, newest first: who did what, when. Owner/admin connections only (ROLE_SCOPE_CEILING), mirroring the admin-only Firestore rule.
automation
automation_upcomingWhat each scheduled job will do next for this workspace, computed from the SAME selection functions the schedulers run (never a second copy): the next tick in UTC and in the workspace’s own time, the records it would act on, and why.
schedulerRuns
list_scheduler_runsWhat the scheduled jobs actually did, newest first. A row exists only for a tick that acted on or failed for this workspace.
dunning
get_dunning_cadenceEach business’s reminder cadence — the day offsets relative to the due date and when chasing stops — and whether it is the business’s own or the platform default.
templates
list_templatesInvoice templates, drafts and published, newest first.get_templateOne invoice template with its blocks.
payThemes
list_pay_themesPay-page themes, drafts and published, newest first.get_pay_themeOne pay-page theme.
members
list_membersList the people in this workspace: role, business confinement, active state.
invitations
list_invitationsList invitations. The token hash is never returned and the address is masked.
apiKeys
list_api_keysList API keys: name, display prefix, scopes, environment, state. Never the hash.
connections
list_connected_appsList connected apps (OAuth grants): client, scopes, mode, person, revocation.
oauthClients
list_oauth_clientsList registered OAuth clients. The client secret hash is never returned.
webhookEndpoints
list_webhook_endpointsList webhook endpoints for an admin reader. The signing secret is never returned.
webhookDeliveries
list_webhook_deliveriesList recent webhook deliveries and their outcomes.
92 write tools
What it can draft and record
Every one of these makes a draft or a record inside your workspace. None of them delivers anything to a customer.
clients
create_clientCreate a client (contacts unverified until the customer verifies them).update_clientUpdate a client’s editable fields.archive_clientArchive or unarchive a client. An archived client cannot be invoiced; nothing is deleted, and a merged client stays archived.add_client_contactAdd an UNVERIFIED email or phone to a client. Needs contacts:read as well, because the value is a contact detail this connection then holds. The customer verifies it; nothing is sent here.
invoices
create_draft_invoiceCreate a DRAFT invoice. Never a send.update_draft_invoiceUpdate a DRAFT invoice’s lines, fields and notes.add_line_itemAppend one line to a draft.remove_line_itemRemove one line from a draft.create_deposit_invoiceDraft a deposit invoice for a job: depositBasisPoints of jobRef.total (default from the business’s terms). One per job.create_progress_invoiceDraft a progress invoice for a job: earned-to-date (percentCompleteBasisPoints, cumulative) minus what the job already billed, or explicit lines; retainage withheld per retainageBasisPoints.create_retainage_releaseDraft the retainage release for a job: exactly what its progress invoices withheld. Once per job.discard_draft_invoiceDiscard a never-numbered DRAFT invoice: it leaves every default list and cannot be sent. Refused once numbered, or while an action on it is pending. The record stays (soft, function-written).set_invoice_dunning_pausedPause or resume automated reminders for ONE invoice. Reversible both ways; resuming may let a missed step catch up with one reminder at the next daily run.
estimates
create_estimateCreate a draft estimate.update_estimateUpdate a draft estimate.convert_estimate_to_invoiceConvert an ACCEPTED estimate into a draft invoice (its lines re-derived). Nothing is sent. Refused unless the estimate is accepted; nothing in this API marks one accepted yet.discard_draft_estimateDiscard a never-numbered DRAFT estimate. Refused once numbered, or while an action on it is pending.
requests waiting for approval
send_invoiceRequest sendInvoice: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.send_estimateRequest sendEstimate: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.send_reminderRequest sendReminder: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.record_paymentRequest recordPayment: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.charge_saved_methodRequest chargeSavedMethod: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.refund_paymentRequest issueRefund: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.publish_templateRequest publishTemplate: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.resend_receiptRequest resendReceipt: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.resend_invoice_emailRequest resendInvoiceEmail: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.attach_bill_documentRequest attachBillDocument: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.issue_credit_noteRequest issueCreditNote: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.write_off_invoiceRequest writeOff: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.void_invoiceRequest voidInvoice: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.reopen_void_invoiceRequest reopenVoidInvoice: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.void_paymentRequest voidPayment: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.settle_paymentRequest settlePayment: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.record_bill_paymentRequest recordBillPayment: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.void_billRequest voidBill: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.void_bill_paymentRequest voidBillPayment: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.open_billRequest openBill: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.create_recurringRequest createRecurring: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.update_recurring_scheduleRequest updateRecurring: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.resume_recurringRequest resumeRecurring: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.set_autopayRequest setAutopay: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.renew_pay_linkRequest renewPayLink: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.revoke_pay_linkRequest revokePayLink: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.merge_clientsRequest mergeClients: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.rebill_unbilledRequest rebillUnbilled: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.delete_time_entryRequest deleteTimeEntry: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.delete_expenseRequest deleteExpense: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.delete_mileageRequest deleteMileage: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.start_card_paymentRequest startCardPayment: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.start_ach_paymentRequest startAchPayment: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.send_custom_emailRequest sendCustomEmail: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.send_smsRequest sendSms: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.send_client_statementRequest sendClientStatement: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.send_verification_inviteRequest sendVerificationInvite: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.publish_pay_themeRequest publishPayTheme: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.update_dunning_cadenceRequest updateDunningCadence: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.delete_template_draftRequest deleteTemplateDraft: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.delete_pay_theme_draftRequest deletePayThemeDraft: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.setup_gatewayRequest setupGateway: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.activate_live_gatewayRequest activateLiveGateway: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.run_gateway_self_testRequest gatewaySelfTest: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.create_api_keyRequest createApiKey: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.revoke_api_keyRequest revokeApiKey: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.register_webhook_endpointRequest registerWebhook: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.rotate_webhook_secretRequest rotateWebhookSecret: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.invite_memberRequest inviteMember: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.revoke_invitationRequest revokeInvitation: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.set_member_roleRequest setMemberRole: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.remove_memberRequest removeMember: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.delete_workspaceRequest deleteWorkspace: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.cancel_workspace_deletionRequest cancelWorkspaceDeletion: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.update_brandingRequest updateBranding: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.update_workspace_settingsRequest updateWorkspaceSettings: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.update_security_settingsRequest updateSecuritySettings: runs at once only under a matching owner rule (auto), else waits for a person (ask); a dry run in plan mode.withdraw_actionWithdraw a pending action this connection proposed. Nothing runs; a person can no longer approve it.
recurring schedules
update_recurringUpdate a recurring schedule’s lines, title, terms or end, or pause it. Autopay is NOT settable here — it needs recorded consent.
time entries
record_timeRecord time. Minutes are integers — never a decimal of hours.update_time_entryCorrect an UNBILLED time entry. A billed one is refused; billed and billedInvoiceId are never accepted.
expenses
record_expenseRecord an expense.update_expenseCorrect an UNBILLED expense. A billed one is refused; billed and billedInvoiceId are never accepted.
mileage
record_mileageRecord a journey. Distance is in thousandths of the unit, as an integer.update_mileageCorrect an UNBILLED mileage entry. A billed one is refused; billed and billedInvoiceId are never accepted.
bills you owe
create_billCreate a bill as a DRAFT. Totals are derived server-side from the lines, never taken from input.update_billUpdate a bill. A DRAFT takes vendor, dates, reference, category, notes and lines (totals re-derived); an opened bill takes notes and category only; a void bill nothing.discard_draft_billDiscard a DRAFT bill. Refused once opened, or while an action on it is pending.
vendors
create_vendorCreate a vendor. Contact details are stored as given; nothing is verified or contacted.update_vendorUpdate a vendor’s editable fields.archive_vendorArchive or restore a vendor. Never deleted: bills point at it.
templates
create_template_draftCreate a DRAFT invoice template. Server-side the same block validation the console runs; `state` is forced to draft and publication fields are refused.update_template_draftEdit a DRAFT invoice template. A published template is immutable and is refused.
payThemes
create_pay_theme_draftCreate a DRAFT pay-page theme. The three seam tokens must be present and pass the contrast check in both themes; `logoUrl` must be inside this tenant’s own Storage prefix.update_pay_theme_draftEdit a DRAFT pay-page theme. A published theme is immutable and is refused.
What it can ask for
For anything that reaches a customer or touches money, the assistant files a request. The request shows a summary written by the server, not by the assistant, and it expires if nobody approves it.
Sending an invoice
It can ask to send a draft invoice. The invoice goes out when a signed-in person approves it in the console.
Sending an estimate
It can ask to send a draft estimate. A signed-in person approves it first.
Sending a payment reminder
It can draft a reminder for an open invoice and ask to send it. The reminder goes when a person approves it.
Recording a cash, check or transfer payment
It can ask to record a payment you took by cash, check or transfer. An owner or admin approves it before the invoice changes.
Refunding a payment
It can ask to refund part or all of a payment. An owner or admin approves it, and the amount is checked again against what is left of the payment.
What it can never do
These are not settings. The permissions below cannot be granted to an assistant, so there is nothing to misconfigure.
Nothing reaches a customer without a person
The permission that sends an invoice or an estimate cannot be granted to an assistant at all. It can ask; a signed-in person approves in the console.
No money moves without a person
Recording a payment and refunding one are permissions an assistant cannot hold. Both exist only as a request that waits for an owner or admin.
It may pause a recurring schedule, and nothing else about it
A schedule sends by itself and can charge a saved card by itself, so its lines, its terms, its end date and resuming it stay a person’s to change.
Card numbers never pass through an assistant
A call that carries anything shaped like a card number is refused before it reaches your data, and payment outcomes come back as the last four digits only.
Permissions an assistant cannot hold: invoices:send, estimates:send, payments:record, payments:refund, webhooks:manage.
You decide what it sees
The connection is OAuth against https://api.billingmart.com/mcp. Nobody pastes a key into a chat.
You tick the permissions
Connecting opens a BillingMart sign-in and a list of permissions, each with a checkbox. The assistant gets what you leave ticked and nothing more.
Customer contact details are off unless you tick them
Email addresses, phone numbers and postal addresses are a separate permission, and it is the one box that starts unticked.
You can end it at any time
A connection is revoked in the console under Settings, Connected apps. The next call the assistant makes is refused.
Hosted MCP server is included on the Starter, Professional and Business plans.
Start with a draft
Connect an assistant, ask it for an invoice, and read the draft before anything is sent.