AI connectors
Connect Claude, Codex, ChatGPT or any MCP-capable AI assistant to your own SitesAI data — what the connectors do, how to turn one on, and exactly which tools each one exposes.
What a connector is
SitesAI publishes two MCP servers (Model Context Protocol — the open standard AI assistants use to reach external systems). Once you connect one, you can ask your AI assistant questions about your own worksite data in plain language — “which jobs are quoted but not scheduled?”, “what did we cut on the Kilsyth site?” — and it answers from the live records in your account.
- SitesAI App connector — your field-operations data: leads and quotes, tasks, sites, services and items, worktime and rostered shifts, signed dockets, members, site documents and subcontractor compliance, NFC/QR tags, processes and checklists. Endpoint:
https://app.sitesai.net/api/mcp/mcp(add?profile=fullfor every tool — see tool profiles) - SitesAI Estimate connector — your takeoff and estimating projects: plan layers, sheets, take-off groups, earthworks elements and the estimate itself. Endpoint:
https://takeoff.sitesai.net/api/mcp
Both speak MCP streamable HTTP over HTTPS and support OAuth 2.1 (authorisation code + PKCE) as well as personal API keys.
Turning a connector on
Connectors are off by default — nothing is shared with any AI assistant until you deliberately connect one.
- Check your plan. The SitesAI App connector requires the AI add-on on your company; SitesAI Estimate requires the AI plan on your account — or start the free 14-day AI trial in the app (Account menu → Start free AI trial; no card, one per account).
- Add the connector in your AI client using the endpoint above, then complete the sign-in it prompts for. On the SitesAI App the consent screen is restricted to company owners and managers, and it is where you choose what the connection can do — read-only, or read and write. Write access is never automatic: unless an owner or manager picks the read-and-write option on that screen, the connection is read-only and every write tool refuses.
- Or use an API key — create one at app.sitesai.net/ai-keys (SitesAI Estimate: Account menu → AI assistant access (MCP)) and paste it into your AI client. A key can be read-only or read-and-write, and belongs to one company.
SitesAI Estimate, client by client
The connector address is https://takeoff.sitesai.net/api/mcp. Keep a signed-in SitesAI Estimate tab open while the assistant works — changes render in front of you.
- Claude (claude.ai or the desktop app) — Settings → Connectors → Add custom connector → paste the address → sign in with your SitesAI Estimate login. No token.
- Claude Code —
claude mcp add --transport http 3dx https://takeoff.sitesai.net/api/mcp; a browser window opens to sign in. - Codex (desktop) — in the app: Account menu → AI assistant access (MCP) → Create token. In Codex: Connect to a custom MCP → Name
3DX, TypeStreamable HTTP, the address, and one headerAuthorization: Bearer <your token>. - Codex CLI — in
~/.codex/config.toml:[mcp_servers.threedx] url = "https://takeoff.sitesai.net/api/mcp" http_headers = { Authorization = "Bearer <your token>" }. - ChatGPT — Settings → Apps & Connectors → Advanced → turn on Developer mode → Create a connector with the address → sign in. (Menu names checked 3 October 2026; they move between releases — the address and the sign-in do not.)
Want the assistant to price jobs with your rates and factors every time? Read Teach Claude or Codex to price jobs your way and download the starter skill.
Revoking access: every key and every OAuth connection is listed at app.sitesai.net/ai-keys and can be revoked at any time — it stops working immediately.
What a connected assistant can and cannot see
- It sees the data of one company only — the company the key or consent belongs to. Every request is scoped to that company on our servers, so a connector can never reach another company's records.
- Read tools and write tools are separate tools, each labelled with what it does, so your AI client can ask you before anything is changed. A read-only key or OAuth connection cannot call the write tools at all.
- Requests are rate-limited per key and recorded in the company's AI audit log (purged after 90 days).
- Data returned to your AI client is then handled by that provider under their policy — see our Privacy Policy, section 8.
SitesAI App — tools
The App connector exposes 148 tools: 71 read tools and 77 write tools. Every one is listed below.
Tool profiles. Some AI hosts cap how many tools a connector may offer, so the App connector serves a chosen subset — add ?profile= to the endpoint. ops (91 tools) is the default and needs no query string: the everyday operating set. lite (18 tools) is the small inbox / phone-agent set, and full (148 tools) is everything, including the builder and admin tools. Same key, same data — only the tool list differs, and every tool listed on this page is in full.
Read tools (safe, never change anything):
| Tool | What it does |
|---|---|
lookup_by_phone | Who is this phone number? Matches the last 9 digits across CRM contacts, accounts, company members and leads. Call this first on every inbound call/te… |
call_brief | THE ONE CALL TO MAKE WHEN A PHONE RINGS (g240): resolves the number once (last 9 digits, like lookup_by_phone) and returns `brief` — PRE-RENDERED PROS… |
get_job_detail | The NARROW deep read for one job while a caller is on the line (g240 part 2): the lead in full (follow_up_txt = the next follow-up), its contract pict… |
search_records | Global search across ALL company records in one call — leads (job #/name/client), quotes, tasks, comments/diary notes (incl. photo/file attachments —… |
list_activity | Company log book: EVERYTHING that happened in a time window, newest first — tasks created/done/approved, leads created & stage moves, comments (the fi… |
company_overview | One-call company snapshot: dashboard stats, lead pipeline (open/due/won + counts by stage), task buckets, the company timezone (all date/time strings… |
get_phone_agent_config | This company's SitesAI Voice phone-agent config — greeting, behaviour, allowed tools, business profile, timezone and active services: what the voice/S… |
list_leads | List CRM leads (sales pipeline). Filter by search text, exact stage, bucket (live/won/closed), or due=true for follow-ups due now. NOTE: a lead in the… |
get_lead | One lead in full: every field (incl. lead_ref, the user-facing job #) plus its attached contacts (people from any company, one flagged primary), activ… |
list_lead_types | The company's lead types — the definable categories every lead belongs to (their labels switch the generic text/date/number fields on for leads of tha… |
list_quotes | List customer quotes (draft/sent/accepted/rejected/cancelled) with totals. Filter by status, lead, or search text. cancelled = was accepted, then fell… |
get_quote | One quote in full: header, every line (qty/unit/rate/GST, 3DX provenance), totals (ex GST / GST / inc GST), the client share URL once sent, and `sent_… |
list_tasks | List company tasks. Filter by status (open/done/approved), assignee email, search text, or due=true for tasks due now. |
list_sites | List the company's sites/work locations (projects, workshops, storage, offices). The q search matches name, address, project ref and phone (multi-word… |
list_services | List the company's service catalogue + pricing (for customer pricing & support). Each service: name, description, category (parent_name), and rate + r… |
list_items | List the company's items/equipment/stock. The q search matches name, part number, brand and description (multi-word). Use flag="hire" or flag="sale" t… |
get_item | Get one item by item_id — full detail incl. stock_type, for_hire / for_sale, price, unit, category, item_code and account overrides, and for tracked s… |
get_purchase_order | Get one purchase order by po_id — supplier, deliver-to site, status (draft | quote | ordered | received | cancelled) and every line. Each line carries… |
list_accounts | List CRM accounts (client/supplier companies). The q search matches name, type, industry, site, website and phone (multi-word, order-independent). |
get_account | One CRM account in full, with its contacts and its leads. |
list_contacts | List CRM contacts (people). The q search matches name, role/title, email, company and phone (multi-word, order-independent). For a pure phone-number l… |
list_worktime | Crew shifts — who worked / is clocked in where. Rows carry planned_start/finish (the accepted roster offer, for planned-vs-actual) and the signature s… |
worktime_summary | Hour TOTALS for a date range — the answer to "how many hours did Sam work last month" or "how much time went into that site", WITHOUT listing shifts a… |
list_action_entries | Recorded KPI/action entries — the company's operation log (truck loads, pit sets, deliveries…). One row per record: entry time, qty, material, machine… |
list_action_offers | OPERATIONS CONNECTED TO A SUBCONTRACTOR (DDL 136): the host offers one of its KPI action types on one of its sites to one granted company (company_own… |
list_dockets | Signed DOCKETS (DDL 122; ONE PER TRUCK since DDL 143 — machine_key = the unit_id, else the rego the operator typed normalised (XV96OD), else '' when n… |
get_docket | One docket in full: header, signature + confirmation blocks, and its LINES — live entries while open, the FROZEN snapshot once signed (never re-derive… |
list_shifts | PLANNED shifts (the roster/calendar): offers to members with status offered | accepted | rejected (reject_reason says why) | cancelled | expired (offe… |
get_shift | One planned shift in full (status, window, note, reject reason, who responded, planned_actions = the day plan). |
list_no_shows | Day-of check: ACCEPTED shifts on the site-local TODAY whose start passed the 15-minute grace with NO clock-in — 'rostered but not here'. Optionally fi… |
calendar_events | The company calendar in one call: planned shifts, task due dates, lead follow-ups and document expiries for a date window (plus what the /calendar pag… |
list_members | Company members that leads and tasks can be assigned to (email + display name + ui_lang = the language that person sees the app in, null = their phone… |
list_processes | Operations knowledge base: list the company's processes. Flows v2: a process is an ORDERED LIST of SOPs from the company's shared SOP library (list_so… |
get_process | One process with its ordered steps (each = a library SOP at a position: sort_order, step_id, plus used_in = the other processes that share it), each s… |
get_sop | One SOP in full (input/output/role/instruction, media, checklists, executable action_type/action_config, legacy next steps) plus used_in = every proce… |
list_flow_assignments | List guided-flow assignments — which members/roles follow which process wizard. |
list_flow_runs | Guided-flow runs — who walked which flow when, current step, steps done. status: in_progress (the round is open) | completed (walked to the end) | aba… |
get_flow_run | One guided-flow run in full: the run, the current step, every completed step with what it created (shift/task/comment refs). |
list_tags | NFC / QR tags (DDL 131): a physical sticker carrying https://app.sitesai.net/t/<code>. A worker's tap opens the app and ACTS per purpose — site tag: c… |
list_captures | CAPTURES are the field feed: a worker taps one button and drops a photo, a voice note or a line of text with GPS — no record chosen. Each waits as sta… |
get_capture | One capture in full, the way you need it to decide where it belongs: the JSON record (as list_captures, plus hints.nearest — up to 5 of the company's… |
list_doc_types | Document types the company can use — the shared system types (License, Certificate, Insurance, SWMS, White Card, Induction Cert, Other) plus the compa… |
get_site | One site in full. As the OWNER: detail (address, timezone, geofence, hours), the induction, document_requirements, granted_companies (subcontractors),… |
list_site_document_requirements | The documents a site asks for: one row per (document type × scope) — scope company (insurance…), member (each person's licences/cards), unit (each mac… |
site_compliance | WHO IS NON-COMPLIANT ON WHAT, right now: every requirement × subject cell on a site (company / member / machine) with the submitted document, its stat… |
compliance_overview | The company's compliance at a glance: expiring documents (own + shared with it, active holders only), submissions awaiting your review (as a site owne… |
list_documents | The documents the company can see, in one list: its own (relation company), its members' (member — any live connection), its machines' (unit) and docu… |
get_file | Open a file attached to any record — pass a photo_path / file_path / signature_path value exactly as another tool returned it (comments, operation ent… |
list_files | Every file attached to the company's records, newest first — comment photos / files / voice notes, field captures still waiting to be filed (source ca… |
list_maintenance_logs | Maintenance logs per machine unit: kind = prestart (the daily checklist a worker submits before using a machine; defect lines raise a triage task) | s… |
get_maintenance_log | One maintenance / prestart log in full: the header (machine, who, when, meter, fuel, site, notes, the log-level photo_path + signature_path) and its p… |
get_flow_design_guide | READ THIS FIRST before designing or editing processes: how SOPs (shared library), processes (ordered lists of SOPs) and flows (worker wizard runs) fit… |
list_step_types | The catalog of step types a SOP can have (action_type): what each does in the worker wizard, its action_config keys (kind, required, defaults, options… |
list_sops | The company's SOP LIBRARY — every SOP once, with the processes it is a step of (used_in). SOPs are SHARED building blocks: the same "Check in" can be… |
list_flow_offers | Processes that HOST companies offer on sites my company is granted on (the subcontractor view of "Working for <host>"): host, site, whether we already… |
list_jobs | ACTIVE JOBS — the leads that have reached a WON stage, seen as work rather than as sales. Each row carries the operational picture beside the commerci… |
get_job | ONE JOB in operational detail: the site(s) the work happens at (from CoSites.lead_id), and for each one the CREW (CoSiteMember — who is assigned, thei… |
list_contracts | The CONTRACT DOCUMENTS issued on a job (DDL 141). In law the ACCEPTED QUOTE is already the contract — the client typed their name on the quote share p… |
list_stock_moves | The STOCK LEDGER — every movement of material, parts, consumables or fuel, one row each. qty is SIGNED: positive came IN (bought, counted up, transfer… |
list_stock_locations | Where stock physically sits: yards, stores on sites, FUEL TANKS (dedicated to one item, with a capacity), vehicles (a service truck). A location fixed… |
get_stock_levels | Quantity of each item in each location, valued at the item's weighted-average cost (value = qty × avg_cost). Filter by item_id or location_id. A negat… |
get_stock_location | A location with its levels and activity: level vs capacity, last delivery, last count or dip and its variance, what was used in the last 30 days and i… |
get_job_costs | What a job (lead_id) has consumed from stock and been charged as expensed purchases — per item quantity and value, and the total — from the stock ledg… |
get_work_model_guide | READ THIS FIRST for anything about what work a company does, who does it, what a job's scope is, or how much has been done: how SERVICES (what you sel… |
preview_member_view | WHAT THIS MEMBER WILL SEE when they open the app — the planner's eye. Returns: menu = the menu they land on, item by item, with the group each sits un… |
get_worktime | ONE shift in full — THE DAY OBJECT: { shift (the list_worktime row incl. the two signatures, prestart_count, material_count), operations (the entries… |
list_prestart_due | Machines (asset units) that still need TODAY's prestart check: a unit with at least one active prestart definition and no prestart log yet in the comp… |
list_actions | The company's OPERATION TYPES (actions) — the units of recorded work behind list_action_entries, dockets and KPIs (e.g. "Truck loading", "Machine hour… |
list_action_assignments | STANDING ASSIGNMENTS of the company's operation types (DDL 137): each row connects one action to exactly one of a MEMBER (their standing job — "he has… |
list_sow_items | THE SCOPE OF WORK of a contract (the contract IS the lead — see list_leads/get_lead). Each item is either kind="scope" (the agreed works, usually impo… |
list_progress_claims | PROGRESS CLAIM REPORTS for a contract (DDL 140): of the agreed scope + approved variations, how much has been done to date and what it is worth, minus… |
Write tools (only reachable with a read-and-write key or connection; each is a single, narrow action). They come in three kinds, and each tool carries that kind as a machine-readable MCP annotation, so your AI client knows which is which before it runs one:
Add something new — creates a record and overwrites nothing (annotated not destructive): create_lead, create_lead_type, create_quote, add_quote_line, create_account, create_contact, offer_action, add_comment, create_process, create_sop, add_sop_next, create_checklist, assign_flow, register_tag, file_capture, create_doc_type, create_document, submit_document, assign_to_site, grant_site_company, add_process_step, start_flow_offer, create_job_site, create_contract, record_stock_use, create_action, assign_action, plan_shift_actions, create_sow_item, import_quote_sow, issue_progress_claim.
Change or remove something that already exists — annotated destructive, so your AI client can ask before it runs: attach_lead_contact, detach_lead_contact, update_lead_type, update_quote_line, delete_quote_line, update_account, delete_account, update_contact, delete_contact, update_worktime, delete_lead, delete_task, update_comment, delete_comment, update_process, update_sop, remove_sop_next, unassign_flow, revoke_tag, update_capture, update_doc_type, set_site_document_requirements, review_submission, revoke_site_company, remove_process_step, move_process_step, set_process_steps, delete_process, delete_sop, void_contract, update_action, update_sow_item, unassign_action.
Reaches a person outside the app — these email or notify someone as well as changing a record, so they are annotated destructive and open-world (the message cannot be recalled): update_quote, create_task, create_shift, respond_shift, cancel_shift, reoffer_shift, create_shifts_bulk, reassign_shift, update_lead, update_task, add_member, send_contract_for_signature, send_variation_for_approval.
SitesAI Estimate — tools
| Tool | What it does | Type |
|---|---|---|
get_project_summary | Get project summary | Read |
list_layers | List plan layers | Read |
list_sheets | List design sheets | Read |
list_takeoffs | List take-off groups | Read |
list_elements | List earthworks elements | Read |
get_estimate | Get the estimate | Read |
get_page_image | Render the plan as an image | Read |
get_ai_authoring_context | Get AI authoring context | Read |
apply_delta | Draw take-offs / elements (apply delta) | Write |
manage_sheets | Add, rename or activate a sheet | Write |
add_layer_from_url | Add a plan layer from a URL | Write |
calibrate_layer_scale | Calibrate a layer's scale | Write |
align_layer | Align a layer onto the plan | Write |
update_estimate | Edit the estimate | Write — irreversible |
run_auto_takeoff | Run AI vision auto take-off | Write |
run_vector_takeoff | Run deterministic vector take-off | Write |
list_cad_layers | List CAD layers on a page | Read |
delete_takeoff | Delete a take-off group | Write — irreversible |
save_project | Save the project | Write |
new_project | Start a new project (background mode) | Write — irreversible |
open_project | Open a .3dx project (background mode) | Write — irreversible |
add_layer_from_data | Add a plan layer from file bytes | Write |
SitesAI Estimate can run live in your open browser tab (changes appear as the assistant makes them) or in background mode without a tab. Deeper technical notes are in the product's MCP documentation.
Things to ask
- “Which leads came in this month and which of them still have no quote?”
- “Who is rostered on the Ringwood site tomorrow, and did anyone not show up today?”
- “Summarise the worktime logged against job 142 last week.”
- “Which dockets from last week are still unsigned, and who was the operator on each?”
- “Whose licences and insurances expire in the next 30 days, and which sites are they short on?”
- “Open my Kilsyth plan, calibrate the scale from the 10 m bar and give me the cut and fill volumes.”
- “Price the bulk excavation line at $28/m³ and show me the new estimate total.”
Questions, answered
Can I run an earthworks takeoff from ChatGPT or Claude?
Yes. Connect SitesAI Estimate as a connector (the address is https://takeoff.sitesai.net/api/mcp) in Claude, Claude Code, Codex or ChatGPT, keep a signed-in SitesAI Estimate tab open, and ask. The assistant opens the project, calibrates the plan, draws the takeoff and prices the lines through the tools listed above, and every change renders in your tab so you can check it before you quote.
Which AI assistants work with SitesAI?
Claude (claude.ai and the desktop app), Claude Code, Codex (desktop and CLI) and ChatGPT in Developer mode, with the steps above. Any other client that speaks MCP over streamable HTTP can connect the same way.
Which plan includes the connector?
For SitesAI Estimate it is part of the AI plan (US$99 per user a month, with a free 14-day trial and no card). For the SitesAI App it is the AI add-on, US$38 a month for the whole company. Plans are on the pricing page.
Can a connected assistant see another company's data?
No. A key or consent belongs to one company and every request is scoped to it on our servers. Read tools and write tools are separate, requests are logged in the company's AI audit log, and you can revoke any key or connection at app.sitesai.net/ai-keys; it stops working immediately.
Support
Trouble connecting, or a tool doing something you didn't expect? Email admin@sitesai.net — we usually reply within one business day. See also our support page and privacy policy.