Endpoint
https://app.biloh.com.au/api/mcp
MCP Integration
Biloh exposes a Model Context Protocol server. Connect Claude, GPT, Grok, or any MCP client and run your business through chat.
Endpoint
https://app.biloh.com.au/api/mcp
Transport
Streamable HTTP / SSE
Tools
70 operator tools
Paste the configuration below into your MCP client. ReplaceYOUR_PAT_HEREwith a Biloh Personal Access Token issued by your tenant administrator.
Claude Desktop / Claude Code / any JSON-config MCP client
{
"mcpServers": {
"biloh": {
"url": "https://app.biloh.com.au/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_PAT_HERE"
}
}
}
}ChatGPT, Perplexity, Grok (MCP-compatible builds)
Add a custom MCP server in your client's settings with the endpoint URL above and the Bearer token in theAuthorizationheader. The shape matches Claude Desktop's JSON config.
Test from your terminal
curl -X POST https://app.biloh.com.au/api/mcp \
-H "Authorization: Bearer YOUR_PAT_HERE" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Auto-generated from the live MCP registry. Operator-persona tools shown; architect and platform-internal tools are not listed. 70 tools across 11 categories.
list_clients
Returns clients for the authenticated user's tenant. Supports filtering by status, free-text search via `query` (case-insensitive substring match across legal_name, trading_name, and billing_email), and pagination via limit/offset.
get_client
Returns a single client by ID for the authenticated user's tenant.
list_sites
Returns all sites for the authenticated user's tenant. Optionally filtered by client_id.
get_site
Returns a single site by ID for the authenticated user's tenant.
list_site_contacts
Returns contacts for a site. The execution prompt says 'list_client_contacts' but biloh's canonical table is site_contacts.
create_client
Creates a new client record for the tenant. A client is a business entity that contracts the tenant for services. After creating a client, use create_site to add their service locations and create_site_contact to add contacts at each site.
update_client
Updates an existing client's business details, billing info, payment terms, or status. Only provided fields are changed.
create_site
Creates a new site (service location) linked to a client. Sites represent physical locations where services are delivered. Use access_notes for contractor access instructions and legal_notes for compliance/legal conditions specific to this site.
create_site_contact
Creates a contact person at a site. Contacts receive notifications based on their contact_role (owner, primary, billing, backup, emergency, technical). Role defaults auto-set notification flags; explicit flag values override defaults.
update_site_contact
Updates a site contact's details or notification preferences. Only provided fields are changed.
onboard_client_for_service
One-step tool to set up a client's service at a site with correct pricing. Creates a contract_service_line and optionally appends special conditions to site.legal_notes. ENFORCES correct data placement: pricing flows to contract_service_line, site conditions flow to site.legal_notes, the service catalog is never touched.
list_contractors
Returns all contractors for the authenticated user's tenant.
get_contractor
Returns a single contractor by ID for the authenticated user's tenant.
list_contractor_agreements
Returns signed agreements (SMAs etc.) for a contractor.
list_contractor_quotes
Returns quotes submitted by a contractor.
list_contractor_compliance_documents
Returns compliance documents (insurance certs, ABNs, etc.) for a contractor.
create_contractor
Creates a new contractor (sub-contractor) for the tenant. Contractors are businesses that perform services on behalf of the tenant. Include business_name, ABN, contact details.
update_contractor
Updates a contractor's business details, insurance, banking, availability, or capabilities. Most fields are operator-accessible; banking fields (bank_bsb, bank_account_number, bank_account_name) require architect persona.
create_contractor_agreement
Creates a contractor agreement (SMA — Service Master Agreement) record. Agreements track the legal relationship between tenant and contractor.
create_contractor_quote
Creates a contractor quote — a price a contractor has offered for a specific site/service combination. Quotes are reference data used when negotiating contract_service_line rates.
create_contractor_compliance_document
Creates a compliance document record (insurance certificate, ABN verification, workers comp, etc.) for a contractor. Documents track the contractor's regulatory compliance status.
list_services
Returns the service catalog for the authenticated user's tenant.
list_contract_service_lines
Returns the rate schedule lines (per site/service/contractor) for the tenant. Optionally filtered by site_id, service_id, or contractor_id.
create_service
Creates a generic, reusable service in the tenant's catalog. Services are CLIENT-AGNOSTIC and CONTRACTOR-AGNOSTIC — they describe what work is offered, not who it's for or who delivers it.
update_service
Updates fields on a generic catalog service. Only provided fields are changed. The same content rules as create_service apply: services are CLIENT-AGNOSTIC and CONTRACTOR-AGNOSTIC.
archive_service
Soft-deletes a service from the catalog. The service remains in the database for audit history and existing contract/job references, but is excluded from active listings.
create_frequency
Creates a new frequency in the tenant's catalog. Frequencies define scheduling patterns (e.g., weekly, fortnightly, 4-weekly) used by contract_service_lines to determine job recurrence.
update_frequency
Updates an existing frequency's fields. Only provided fields are changed.
archive_frequency
Soft-deletes a frequency from the catalog. The frequency remains in the database for audit history but is excluded from active queries.
create_contract_service_line
Creates a contract service line — THE place for client-specific pricing. Links a site to a service with a frequency, client rate, and optional contractor rate. This is where per-client, per-site pricing lives.
update_contract_service_line
Updates a contract service line's rates, active status, contractor assignment, or active months. This is where rate changes and seasonal adjustments are made.
list_jobs
Returns jobs (work orders, scheduled visits) for the tenant. Optionally filtered by status, site_id, contractor_id, or date range.
get_job
Returns a single job by ID with full details including notes and completion data.
create_job
Creates a new job (work order) for a site/service on a scheduled date. Jobs represent individual instances of work to be performed. Should reference a contract_service_line where one exists.
update_job
Updates a job's status, schedule, contractor assignment, or notes. Valid statuses: scheduled, dispatched, completed, approved, invoiced, paid, on_hold, cancelled, missed, partial.
list_work_orders
Returns work orders for the tenant. Optionally filtered by status, job_id, or contractor_id. Status values: sent, accepted, declined, rejected_after_acceptance, expired, cancelled.
get_work_order
Returns a single work order by ID with full details including signing token, acceptance, and signed PDF URL.
propose_send_work_order
Stages a work-order send. Validates the job has an assigned contractor with a signed Subcontractor Master Agreement. Creates an mcp_pending_operations row that must be confirmed via approve_send_work_order before the work order is dispatched. The sent email includes a portal-link CTA (Review Work Order button) — the contractor accepts via the portal.
approve_send_work_order
Approves a staged work-order send and immediately dispatches the email to the contractor with a portal-link CTA. The contractor clicks the link, reviews the work order, and digitally accepts via the portal.
record_work_order_acceptance
Records an out-of-band work-order acceptance (e.g. contractor accepted verbally or via email, and the operator is back-filling the system). Creates an immutable work_order_acceptances row and flips work_orders.status to 'accepted'. Transitions the underlying job to 'dispatched'.
list_proposals
Lists proposals for the tenant, with optional filters. Returns proposal header info including status, client, site, and dates.
get_proposal
Gets a single proposal with full detail: header, all lines (with service/frequency names), and acceptance records.
list_proposal_acceptances
Lists proposal acceptance records for audit/history. Returns core fields by default; set include_snapshot=true to include the full proposal_snapshot JSONB (large). Audit fields include ip_address, user_agent, content_hash, pdf_url, pdf_generated_at, confirmation_email_sent_at, and retention_class.
create_proposal
Creates a new proposal in draft status for a client at a specific site. After creation, add lines with add_proposal_line. Auto-assigns the next proposal_number for the tenant.
update_proposal
Updates the header fields (intro message / notes, valid_until date) on a draft proposal. Only allowed when proposal status is 'draft' — same constraint as update_proposal_line. For line item changes use update_proposal_line. For status changes use propose_send_proposal or cancel_pending_operation.
add_proposal_line
Adds a line item to a draft proposal. Each line links a service (and optionally a frequency) with pricing. Only allowed when proposal status is 'draft'.
update_proposal_line
Updates a proposal line's price, description, quantity, or display order. Only allowed when the parent proposal is in 'draft' status.
remove_proposal_line
Soft-deletes a line from a draft proposal. Only allowed when proposal status is 'draft'.
record_proposal_acceptance
Records that a proposal has been accepted. Creates a proposal_acceptances record and updates the proposal status to 'accepted'. For email-reply acceptance, captures the literal acceptance text as legal evidence.
bulk_archive_proposals
Soft-deletes multiple proposals in a single call. Accepted proposals are IMMUTABLE and are skipped (not archived). Cascade-cancels any associated pending/staged operations for archived proposals.
propose_send_proposal
Stages a proposal for sending. Validates proposal is in draft status and has at least one line. Renders the proposal PDF and returns a preview URL. Creates an mcp_pending_operations row that must be confirmed via confirm_pending_operation before the proposal is marked as sent. This is a HIGH-STAKES operation. The sent email includes a portal-link CTA (Review Proposal button) for click-to-accept signing — do not instruct the recipient to reply with acceptance text, the signing flow is handled by the portal.
list_invoices
Returns invoices issued by the tenant. Optionally filtered by client_id or status.
get_invoice
Returns a single invoice by ID with line items.
create_payment
Records a payment received against an invoice. Amount is in integer cents. Payment does not auto-update invoice status — that must be done separately if the invoice is fully paid.
propose_send_invoice
Proposes sending an invoice to the client. Creates a pending operation that MUST be confirmed (via confirm_pending_operation) before the invoice is actually sent. This two-step pattern prevents accidental sends.
confirm_pending_operation
Confirms a previously proposed operation, minting the signing_token and transitioning to staged_for_send status. Does NOT send the email — call approve_send_operation with operator approval to fire the send. Validates ownership, expiry, and status before transitioning. Only the original proposer can confirm.
cancel_pending_operation
Cancels a pending operation in `pending` or `staged` status. After approve_send_operation has fired, the operation is `approved_and_sent` and cannot be cancelled — that's a separate withdrawal/voiding flow.
approve_send_operation
Approves a staged operation and immediately sends the email to the recipient with a portal-link CTA. The recipient will be able to click the link, land in the portal, review the agreement, and digitally sign.
get_pending_operation
Read-only inspection of a staged operation. Returns the operation's current state, the email subject/body that will be sent, the attachment path, the signing_token, and the related entity details. Use this to show the operator what is queued before they confirm the send via approve_send_operation.
list_pending_operations
List staged or in-flight operations for the current tenant. Use to find operations that need approval, or to review recent send activity. Default returns the most recent 20 staged operations.
get_audit_log
Returns recent audit log entries for the tenant. Supports filtering by actor, entity, action, and date range (time-window via from_date/to_date ISO params). Use for browsing general history or narrowing to a specific time window. For investigating a single entity's full timeline, prefer get_audit_log_for_entity.
get_audit_log_for_entity
Returns all audit log entries for a specific entity in chronological order. Use this for self-diagnosis: when investigating what happened to a proposal, operation, client, or other entity, this tool provides the complete timeline of actions.
report_bug_to_biloh
Report a bug to the Biloh platform. Use this when you encounter unexpected behaviour while operating in a tenant — a tool returning the wrong shape, a UI route 404'ing, a stale schema, an unexpected validation error, an inconsistency between MCP output and database state, or any platform-level defect. Bugs are stored at the Biloh platform level (cross-tenant, visible to platform admins). Downstream automation may pick up the bug and ship a fix; you will not be notified of resolution from within this tool. INCLUDE A `suggested_fix` ONLY IF YOU'RE CONFIDENT — it's a hypothesis for the receiving agent, not a directive. Don't use this for tenant-specific data issues (bad client name, missing site) — those are not bugs.
request_tool_to_biloh
Request a new tool from the Biloh platform. Use this when you wished you had a tool that didn't exist — a composite that would have replaced six granular calls, or a granular tool that's genuinely missing. Tool requests are stored at the Biloh platform level (cross-tenant). Downstream automation may design and ship the new tool; you will not be notified of completion from within this tool. BE PRECISE about `proposed_name`, `tool_class`, and `workflow_context` — the receiving agent uses these to decide whether to build. Don't request a tool that already exists under a different name — use `mcp_session_diagnostic` first to see the full server tool list.
render_artifact_pdf
Renders a tenant artefact (proposal, invoice, quote, statement, receipt, signed agreement) as a PDF, stores it in Supabase storage scoped to the tenant, and returns a 1-hour signed download URL. Idempotent — re-call to refresh after data changes. Updates the entity row's pdf_url field if applicable.
mcp_health
Health check tool — returns auth context, MCP status, server version, tool count, and tool_names. Compare tool_names to your reachable tools — any name in the server list that you cannot call is a session-staleness or Cowork-side discoverability gap. Restart the Cowork session to refresh.
mcp_session_diagnostic
Read-only session diagnostic — returns server version, auth context, full tool list with categories and personas, and upstream constraint documentation. Use this to diagnose tool-list staleness, persona mismatches, or upstream approval-gate issues without needing repo access.
lookup_abn
Looks up an Australian business via the Australian Business Register (ABR). Supports two modes: (1) ABN lookup — provide `abn` to get verified details for a known ABN; (2) Name search — provide `name` (and optionally `state`) to find businesses by name, returns up to 5 matches. USE WHEN: About to create a client — verify their ABN and pre-populate legal name, trading name, entity type, and GST status from the authoritative register. Works for businesses, body corporates, sole traders, trusts, and partnerships.
list_frequencies
Returns the frequency catalog for the authenticated user's tenant.
record_completion
Records contractor completion of a job: sets status='completed', completion_submitted_at, completion_photos[], completion_notes. Validates min photos + notes per tenant tunables.
Biloh MCP uses Bearer-token authentication. Tokens are tenant-scoped Personal Access Tokens issued by your administrator. Tokens carry an operator persona and respect the same RLS rules as the in-app user interface — a token cannot see or write data outside its tenant.
Self-service PAT issuance is under active development. Until that lands, request a token through your tenant's administrator surface or contact hello@biloh.com.au.
Start a free trial — your MCP server endpoint is ready on day one.