Connect Jobsite to Claude
Last updated: 2026-10-15
The Jobsite connector lets Claude — or any assistant that speaks the Model Context Protocol (MCP) — work from your company's live Jobsite data as you: what needs you today, a job's status and money, vendor bills and what blocks them, the service dispatch board, workers and their training, and compliance answers Jobsite computes itself (OSHA 1904 recordability with the rule text, who is cleared for a task on a date, your Safety Index). If you allow it, the assistant can also draft things for a person to finish — a vendor bill from an invoice, a service estimate, the day's daily-log narrative — and make everyday changes, each previewable first and undoable after. It always acts as you, behind your own permissions, in one company, with every change logged.
Connecting
You need: a Jobsite manager account with permission to manage jobs, on a plan that includes integrations.
- In Claude, open Settings → Connectors, find Jobsite and choose Connect. (To add it as a custom connector instead, use the server URL
https://jobsitecerts.com/api/mcp.) - Claude sends you to Jobsite. Sign in if you aren't already.
- Review the consent card: it names the assistant, the company it will reach (the one you have open), what it can read, and the site you'll be sent back to — for Claude,
claude.ai. If it names a site you didn't come from, choose Cancel. Tick Draft things for me to finish and Also allow changes only if you want it to write. - Choose Approve. You land back in Claude, connected.
Clients that don't support MCP sign-in can use an API key instead: create one under Integrations ▸ API & agent access and send it as a bearer token.
What it never does
The connector cannot pay, schedule or export a payment, run or release a pay run, or mark anything paid; it cannot send anything to a customer, vendor or general contractor (estimates, visit notices and invoices are sent by a person from Jobsite); and it cannot delete workers, change anyone's role or override a certification. There is no free-form query tool. A vendor-bill approval decides only your own pending step, Claude asks you before every one, and it is final.
Tools
The connector exposes a fixed, reviewed set of tools; this list is generated from the same registry the server uses. Answers see exactly what you see in Jobsite. The list_<collection> reads return the same company-scoped records as the Jobsite REST API; incident tools return register facts only, never narratives, witnesses or OSHA privacy-case details.
Answers (read-only)
| Tool | What it does |
|---|---|
What needs my attentionget_attention_brief | Everything waiting on the user, ranked by urgency then due date, each with a link: approvals, RFIs and submittals in their court, change orders, pay apps, punch, schedule slips, safety observations, inspection corrective actions, cert lapses, overdue training, documents to sign, coverage gaps, insurance renewal, vendor bills awaiting their approval, unread messages, and today's dispatch exceptions. Optionally one job; workforce, insurance, message and dispatch items stay company-wide and are marked so. |
List workerslist_workers | List workers at the user's company. Supports filtering by status, trade, group, or a name search. Returns id, full_name, trade, status, badge_type, email, phone. Use when the user asks about people on the team. |
Compliance statsget_compliance_stats | Get company-wide compliance counts: expired, expiring soon (configurable window), total certifications, active workers. Use for overview questions like 'how are we doing' or 'how many expired certs do I have'. |
List expiring certificationslist_expiring_certs | List worker certifications whose expiration falls within a window (default 30 days). Sorted soonest first. Returns worker_name, trade, topic, track, expires_at, days_remaining. Use when the user asks who's about to expire. |
Worker detailget_worker_detail | Get full detail for one worker by id or exact full name match: personal info, all certifications with status/expires_at, recent training attempts. Use when the user asks about a specific worker by name. |
Recent toolbox talkslist_recent_toolbox_talks | List recent toolbox talk sessions at this company. Returns title, topic, held_at, attendance_count. Use for questions about recent safety meetings. |
List certification trackslist_cert_tracks | List available certification tracks (training programs) and their topics. Use when the user asks what trainings/certs exist or which one someone should take. |
List groupslist_groups | List worker groups at the user's company. Returns id, name, is_system. Use to resolve a group name to its id before calling a write tool. |
Search the Jobsite product guidelookup_jobsite_docs | Look up how Jobsite (this product) works — features, UI navigation, terminology, account / billing, worker-side experience, what counts as a 'group' vs 'crew', etc. Use this for any 'how do I…' / 'where do I find…' / 'what does X mean in Jobsite' question. Returns matching sections from the curated product guide. NOT for OSHA / regulatory questions (use search_training_source) and NOT for tenant data lookups (use list_workers, list_expiring_certs, etc.). If a returned section is flagged todo:true, the topic is in scope but not yet documented — say so rather than inventing an answer. |
Search Jobsite articlessearch_articles | Search Jobsite's published marketing content — blog articles, head-to-head COMPETITOR COMPARISON pages (e.g. 'Jobsite vs Procore', 'Jobsite vs SiteDocs', 'Jobsite vs SafetyCulture'), and pillar guides. Use this whenever the user asks how Jobsite compares to a competitor ('how are you better than Procore', 'Jobsite vs SafetyCulture', 'why pick you over X'), or asks for a published article on a construction-safety topic. Returns matching articles with a relevant excerpt and a link to the full page. This is DISTINCT from lookup_jobsite_docs (product how-to) and search_training_source (OSHA regulatory). If nothing matches, say you don't have an article on it rather than inventing a comparison. |
Search the training source librarysearch_training_source | Search Jobsite's curated OSHA / regulatory training research (the proprietary 'training_source' knowledge base of ~353 module entries — confirmed-fact notes plus slide narration scripts). Use this for safety, regulatory, or training questions: PPE requirements, exposure limits / PELs, fall-protection thresholds, training renewal cadences, inspection frequencies, etc. Returns up to N matching modules with s_num, topic, track, module_title, and a relevant text snippet. Prefer multi-word queries (e.g. 'respirable silica PEL', 'fall protection 6 feet roofing'). Cite the matched module(s) by topic + module_title in your reply so the user can dig deeper. Do NOT use this tool for non-safety questions (HR, scheduling, code, creative writing). |
Search the regulation corpussearch_law_corpus | Search the VERBATIM authority corpus behind Jobsite's training: 29 CFR regulation text (per-section, with citations), the CA/WA/OR state rules for heat illness and wildfire smoke, plus OSHA interpretations and NIOSH/CDC/EPA technical guidance the training cites. Use this when the user asks what an authority ACTUALLY SAYS — exact rule language, a specific citation ('what does 1926.501 require'), trigger heights, employer duties — and quote the returned text with its citation heading and jurisdiction. EVERY match carries an `authority` field: T1 is binding law, T2 is an agency interpretation and T3 is technical guidance. READ IT BEFORE YOU CHARACTERISE THE MATCH — quote a T2/T3 match as what that agency recommends or says, NEVER as what a regulation requires, and never call it a rule. This is DISTINCT from search_training_source (what Jobsite's TRAINING teaches, paraphrased) — prefer search_law_corpus when the user wants the source itself. The corpus spans the topics Jobsite trains on plus the authorities they cite, NOT all of 29 CFR: an empty result means 'not in the corpus', never 'no such rule exists'. |
Search regulatory newssearch_regulatory_news | Search recent regulatory / safety news from the Federal Register (filtered to OSHA) and the OSHA news RSS feed. Use for questions about recent rule changes, enforcement memos, or news that might affect a training course's content (e.g. 'any silica updates this year', 'recent fall protection rulemaking'). Returns titles, agencies, dates, URLs, and short summaries — pure pass-through, nothing is persisted. Prefer specific multi-word queries built around an OSHA topic or standard ('respirable silica §1926.1153', 'lockout tagout enforcement', 'fall protection 1926.501'). NOT for tenant-data questions; NOT for general OSHA reference (use search_training_source for established standards). |
Summarize a threadsummarize_thread | Summarize a conversation thread on an object (feed post, incident, JHA, or approval request). Returns a 1–3 paragraph plain-language summary with people involved, decisions, and open questions. Reads from object_thread_messages and is cached per (thread_id, last_message_id, target_lang) so repeated asks cost zero. Use when the user asks 'what's going on with the incident at Acme Tower?' or 'summarize the thread on the daily check at Job 3' or 'catch me up on RFI-12'. The thread_id is the UUID from object_threads; if you don't know it, look up the source object first (e.g. an incident_id) and tell the user you need the thread reference. Output is read-only; nothing is written to the thread itself. |
List jobslist_jobs | List the company's jobs (projects). Returns id, name, status. Use to answer questions about jobs and — importantly — to resolve a job_id before calling route_to_surface for a job-specific target (draft_document, create_rfi, punch_list, view_job). Defaults to active + on-hold jobs. |
List RFIslist_rfis | List RFIs, optionally for one job (resolve job_id via list_jobs). Defaults to open RFIs (open + pending_gc_review). Returns id, job_id, number, subject, status, due_date. Use for 'how many RFIs are open', 'what RFIs are outstanding on <job>'. |
List punch itemslist_punch | List punch-list items, optionally for one job. Defaults to open items (open + assigned + completion_claimed). Returns id, job_id, number, title, severity, status, due_date. Use for 'how much punch is open', 'what's left on the punch list for <job>'. |
List submittalslist_submittals | List submittals, optionally for one job. Defaults to the open ones (draft, pending architect, pending GC review, revise & resubmit); approved / rejected / closed are not open. Returns id, job_id, number, title, status, due_date. |
Job statusget_job_status | Health snapshot for ONE job: schedule task count, average % complete, overdue task count, longest slip in days, plus open RFI and open punch counts. Resolve job_id via list_jobs first. Use for 'how's North Tower doing', 'is the hospital job on track'. |
Financial summaryget_financial_summary | Financial snapshot: count of change orders pending approval and pay apps awaiting action, plus accounts payable (open vendor bills owed, past due, retainage held). Optionally scope to one job (job_id) to also get its budget rollup (budget vs committed vs actual vs variance). Use for 'any pending change orders', 'what's my budget variance on <job>', 'what pay apps need action'. |
List inspectionslist_inspections | List inspection responses (site inspections, permits, JHAs), optionally by job, status, or outcome. Returns recent responses with template, status, outcome. Use for 'recent inspections', 'any failed inspections', 'inspections on <job>'. |
List safety observationslist_safety_observations | List safety observations / near-misses / hazards reported from the field, optionally by status. Returns kind, category, severity, status. Use for 'recent safety observations', 'open hazards', 'near misses this month'. (For overall BBS rates, note these are leading-indicator observations.) |
Resource statusget_resource_status | Check equipment/resource checkout status from the Equipment register (vehicles, tools, PPE, other). Optionally filter by a name query (also matches identifier/serial and category). Returns each resource's status (available, checked_out, maintenance, lost, retired), who has it checked out and at which worksite when it's out, and its home worksite. Use for 'who has the generator', 'is truck 12 available', 'what equipment is checked out right now'. |
OSHA recordability checkosha_recordability_check | Runs Jobsite's deterministic OSHA 29 CFR 1904 decision tree on the facts of an injury or illness: returns the proposed 300-log classification (or the questions still needed), the rationale with verbatim 1904 quotes, and any report-to-OSHA deadline (8 or 24 hours). Map the story to the answers; leave out anything not known — unknowns come back as questions, never guesses. Reads and writes no records. |
Check who is qualified for a taskcheck_qualification | Can these workers (or a crew) do a task on a date, per Jobsite's training records? The task is a training track, an equipment asset (its required training), or a designation (a topic + role, e.g. forklift operator). Returns qualified yes/no per person, what is missing, expired, revoked or lapsing before the date, and why each requirement applies (the rule, the asset, or a prerequisite). |
Jobsite Safety Indexget_safety_index | The company's Jobsite Safety Index (or one job's / worksite's): the score, whether it is provisional, the operational and outcome sub-scores, the factors that would raise it most (with the rate a factor needs for full credit), and — company-wide — the experience mod (EMR) and days to the policy renewal. |
Accounts payable overviewap_payables_overview | What the company owes vendors: bills waiting on the acting user's approval, approved bills aged by days past due, the cash needed week by week, retainage held, bills blocked from payment by holds (insurance, W-9, lien waivers) and pay runs in progress. Optionally one job. Read-only: payments happen in Jobsite. |
Vendor bill detailsap_get_bill | One vendor bill: vendor, invoice number and dates, totals and retainage, each line's job, cost code and purchase-order match, the approval chain (who has decided, who is next), payment holds, possible duplicates, and the pay run it is in. |
Service dispatch boardservice_dispatch_board | The home-services dispatch board for a day (or up to 7 days): each technician's visits with arrival windows, visits with no lead technician, calls not yet scheduled, and the exceptions flagged — unassigned, late (window passed, nobody on site), held website bookings, no-access visits. Times are ISO instants; `timezone` is the company's. |
Service call detailsservice_get_call | One home-services call: customer, location, status and priority, every visit with its technicians, the call's estimates (each option's total) and invoices (total and balance), with a link to the call in Jobsite. |
Service receivablesservice_receivables_overview | Money and follow-ups owed on home-services work: unpaid customer invoices (most overdue first, with totals), estimates still in draft or waiting on the customer, and maintenance-agreement visits due soon or overdue. |
Search drawingssearch_drawings | Find drawing sheets by topic, sheet number or the words printed on them — "paving plan", "curb", "fire line", "paving details", "CP100", "heavy duty concrete". Searches the current sheets' numbers, titles and scope, their keynotes, legends, general notes, detail titles and labels, and returns each sheet with the sheet's own matching text (quote it as given; never restate a number or material) and a link that opens the sheet zoomed to the match. Optionally one job. For what is between two grid lines use drawing_area_lookup. |
Drawings between grid linesdrawing_area_lookup | What the drawings show between two grid lines (a band: "between G and H") or inside a bay ("between G and H and 3 and 4"), on every current sheet that carries those lines: the keynotes printed there with their full text, the detail and section markers (where the detail is drawn), and labels — grouped by discipline (A, S, C …), each with the legend materials its text names and a zoomed link. Says which sheets lack one of the lines. Read-only. |
Every source at one spotdrawing_location_sources | Everything that speaks to one spot on a job, from every source at once: for a grid bay or band ("between G and H and 3 and 4") or a detail ("detail 5 on S401"), what each current sheet prints there (architectural, structural, civil: keynotes, notes, detail titles, labels), the detail each marker in the bay points at, and every RFI (with its answer — the newest word), submittal (with the latest disposition, and its read shop drawing's own text page by page: "SUB-012's shop drawing (page 3)", the submittal's number as Jobsite prints it) and observation pinned there. Each source's own words are quoted with a link to the spot, and `disagreements` names both sources and both texts where dimensions, thicknesses, member sizes, rebar, strengths or materials differ ("S401 says 8\" CMU; A102 says 12\" CMU"). Never judge which is right. Each disagreement carries an `rfi_draft_link`: offer it in words — the RFI composer pre-filled with both quotes and pinned at the spot, for the person to review and file in Jobsite. Never file that RFI yourself (never create_rfi). Read-only. |
List hazard suggestionslist_hazard_suggestions | Hazards Jobsite read in a job's own documents (drawing sheets, schedule tasks, daily logs, RFIs and their answers, submittals, walkthroughs, emails filed to the job and their attachments, job files — text, PDF, Word, photos — and the job's details) and is waiting for a person to accept or dismiss. Each has the hazard category, the source's own words (quote them as given), a link to the source, how it was found, and the required designations accepting it adds. Only hazards the worksite doesn't carry yet. Optionally one job; with a job it also reports which of the job's files couldn't be fully read for hazards (file_reads), so no suggestions is not the same as all clear. Read-only. |
List changes made through this connectionlist_recent_writes | List the changes this connection has made, newest first: each change's id, what it did, when, and whether it can still be undone with undo_write. |
Read the website draftwebsite_get_site | Read the company's public website DRAFT: its pages, sections and blocks (with ids), staged services and specials, the look, whether it is published, and the exact edit grammar (block kinds + props, op kinds + arguments). Returns base_revision_id and document_sha — pass base_revision_id to website_apply_ops, and document_sha with the revision id to website_publish (website_apply_ops needs the base_revision_id this returns). Acts as the API key's bound user. |
List change orderslist_change_orders | List change orders (id, number, title, status, job_id, contract_id, is_sample, submitted_at, created_at). Read-only — the same company-scoped projection GET /api/v1/change_orders returns. Filters apply server-side, so a filtered page is complete; page with offset. is_sample marks sandbox demo rows. |
List pay appslist_pay_apps | List pay applications (id, number, status, job_id, contract_id, is_sample, submitted_at, created_at). Read-only — the same company-scoped projection GET /api/v1/pay_apps returns. Filters apply server-side, so a filtered page is complete; page with offset. is_sample marks sandbox demo rows. |
List daily logslist_daily_logs | List daily logs (id, job_id, log_date, posted_at, is_sample, created_at). The log's narrative is not returned. Daily logs have no status, so there is no status filter. Read-only — the same company-scoped projection GET /api/v1/daily_logs returns. Filters apply server-side, so a filtered page is complete; page with offset. is_sample marks sandbox demo rows. |
List certificationslist_certifications | List the company's workers' certifications (id, worker_id, track_id, track_name, status, earned_at, expires_at, last_renewed_at, revoked_at, is_sample). status is the EFFECTIVE status: a revoked certification reads "revoked". Use expiring_within_days for upcoming renewals (e.g. 30), soonest first; resolve worker_id with list_workers. Read-only — the same company-scoped projection GET /api/v1/certifications returns. Filters apply server-side, so a filtered page is complete; page with offset. is_sample marks sandbox demo rows. |
List incidentslist_incidents | List incidents — register-level facts only (id, job_id, worksite_id, severity, category, status, occurred_at, reported_at, osha_recordable, osha_classification, closed_at, is_sample, created_at). The narrative, witnesses, photos, location, the injured worker and every OSHA privacy-case detail are deliberately not returned. Read-only — the same company-scoped projection GET /api/v1/incidents returns. Filters apply server-side, so a filtered page is complete; page with offset. is_sample marks sandbox demo rows. |
List billslist_bills | List vendor bills, retainage releases and vendor credit memos (id, invoice_number, kind, status, external_company_id, vendor_name, job_id, invoice_date, due_date, total_usd, retainage_usd, paid_on, is_sample, created_at, approved_at, net_due_usd), newest first. A credit memo appears with kind='credit' and a POSITIVE total_usd (its size); it is never payable, so due_within_days leaves it out and its net_due_usd is 0. total_usd is the invoice as billed; net_due_usd is what is still owed: total less retainage held and less vendor credits applied. Use due_within_days for what is due to be paid soon (overdue included) and vendor_id for one vendor's bills. The scanned document, the AI extraction, notes and the hold note are deliberately not returned. Read-only — the same company-scoped projection GET /api/v1/bills returns. Filters apply server-side, so a filtered page is complete; page with offset. is_sample marks sandbox demo rows. |
Drafts and changes (only with the consent ticks)
| Tool | What it does |
|---|---|
Add workers to a groupadd_workers_to_group | Add one or more workers to an existing group. Safe, reversible. Use for requests like 'add Jane and John to the Electricians group'. Resolve worker names and group name to IDs via list_workers / list_groups first. |
Remove workers from a groupremove_workers_from_group | Remove one or more workers from a group. Safe, reversible. Use for 'take Jane off Electricians' style requests. |
Create a groupcreate_group | Create a worker group at the user's company. Use for 'add a new group called Foremen' or as a follow-up when the user wants to organize workers. Reversible via undo while the group is still empty. |
Create a post categorycreate_post_category | Add a new job-feed post category for the company. The slug is auto-derived from the label. Use for 'add a new category called Equipment Down' or similar. Reversible via undo (archives the row). |
Rename a post categoryrename_post_category | Rename an existing post category by id or by exact current label. The slug is preserved (categories keep their old hashtag even after rename). Optionally update the emoji. Reversible via undo (restores prior label/emoji). |
Archive a post categoryarchive_post_category | Archive (hide) a post category so it stops appearing on the composer. Existing posts that were tagged with it keep the tag. Reversible via undo. |
Create a worksitecreate_worksite | Create a worksite (jobsite location) at the user's company. Every worksite is created together with its primary Job of the same name (the same thing the Worksites page's + New Worksite does), and both ids are returned. Use for 'add a new worksite called Main St Tower'. If the user is describing a JOB/PROJECT to track (RFIs, schedule, punch, financials), prefer create_job — it creates the same worksite + Job pair and also saves a description. Needs the jobs.create permission. Reversible via undo until the worksite or its Job is used (workers assigned, logs, photos, files, …) — undo removes both. |
Create a jobcreate_job | Create a job (construction project) at the user's company. Each job mints its own worksite + the job record in one transactional step (the same thing the Jobs > New form does in new-address mode). Use when the user says 'create a job called North Tower', 'add the hospital project', 'set up 3 new jobs: …', etc. To create several at once, call this tool once per job (the user asking for all of them is explicit consent — no need to confirm each). Optional address + description. Needs the jobs.create permission. Reversible via undo until the job or its worksite is used (workers assigned, logs, photos, files, …) — undo removes both the job and its worksite. After creating, the returned worksite_id can be passed to set_worksite_hazards / set_worksite_jurisdiction to tag the new job. |
Promote a service call to a Jobservice_promote_call_to_job | Turn a service call whose scope became a project (a repair that turned into a remodel) into a Job — the same as Promote to Job on the call's page. Jobsite creates a new Job with its own jobsite at the call's address, links the call's customer to the Job (the customer then sees the Job in their customer portal), and files the call under the Job, so its later visit photos appear in the Job's gallery. Nothing financial is copied: no budget, contract or cost lines; an accepted estimate is noted as text in the Job's scope notes and stays on the call. The Job name defaults to "Customer — call summary". Needs the service.write and jobs.create permissions. Refused for a call already booked against an existing Job, a website booking still on hold, or a canceled call. Promoting a call that is already a Job returns that same Job and changes nothing. Undo removes the new Job, its jobsite and the customer link and puts the call back, only while nothing else has used the Job (photos, other calls, logs, invoices, …) and the call still points at it. |
Create a resourcecreate_resource | Add a resource (vehicle, tool, PPE, or other) to the company inventory. Safe, reversible (undo deletes it). Use when the user says things like 'add a new F-150 to my fleet' or 'create a new drill called Hilti TE-70'. Ask for the type if it's ambiguous. |
Run a compliance auditrun_compliance_audit | Run an end-to-end compliance audit for the user's company and return a summary of findings — counts by severity (critical/high/medium/low) plus total workers affected and the audit_run_id. Engine v1 checks: expired required certs, missing required certs, certs expiring within 14d (HIGH) or 30d (MEDIUM), workers assigned to a worksite who haven't signed its active JHA, and toolbox talks overdue more than 7 days past their scheduled date. The full findings list is persisted at /dashboard/audit?run=<id>. Use for questions like 'how are we doing on compliance?', 'are we ready for an inspection?', 'run an audit', or 'check our posture'. The audit itself is read-only against tenant data (no edits); it logs the run to audit_log + writes one compliance_audit_runs row. |
Send a toolbox talk to workerssend_toolbox_talk | Send a toolbox talk to a target audience. Materializes a talk_assignments row workers see in their phone feed; does NOT mint magic-link emails/SMS (the dashboard /toolbox-talks page is the magic-link surface). Use when the admin says 'send the X talk to the Y crew', 'kick off Tuesday's talk to all clocked-in workers', etc. Target kinds: 'company' (every active worker), 'worksite' (every worker assigned to that worksite/Job), 'worker' (one specific worker). Requires a topic_id — call list_recent_toolbox_talks or ask the admin to pick from the seeded library if you don't have one. Undo: delete the assignment row by id. Permission gate: owner/manager/super_manager. |
Assign a worker to a jobassign_worker_to_worksite | Assign one worker to a worksite/Job. Composes the existing dashboard pattern: resolves the worksite's primary Job, then upserts a job_workers row. Idempotent — re-assigning a currently-active assignment is a no-op. Use when the admin says 'put Maria on the Tempe project', 'assign Carlos to the North Tower site', etc. To assign in bulk, call once per worker (small loops are fine — there's no per-call rate limit). For the procore Phase-1-and-up data model, today's worksite_id transparently resolves to the primary Job; post-Phase-1 the tool will accept job_id directly. Undo: call remove_worker_from_worksite (not exposed in v1 — the click-walk path is the dashboard). Permission gate: workforce.workers.assign. |
Post a notice to workerscreate_notice | Post a notice (announcement) to one of: 'all' (every active worker), 'group' (one training rule's members), 'worksite' (one worksite's assigned workers), 'worker' (one worker). Use when the admin says 'send a notice to the night-shift crew about Friday close-down', 'post a company-wide announcement', etc. Photos are not supported via Ask in v1 — the campaign narrates 'open /dashboard/notices to add evidence photos'. Severity is one of info / warning / urgent. require_ack adds a 'tap to acknowledge' checkbox to the worker-side notice. Permission gate: 'all' target requires notifications.companywide.send; group/worksite/worker target requires notifications.group.send. |
Assign trainingassign_training_track | Assign a training/refresher track to a set of workers. Writes a renewal_assignments row per worker — the cert engine then routes those workers through the track's refresher modules on their phone the next time they log in. Skips workers who already have an open assignment for the same track (idempotent dedupe). Use when the admin says 'assign the OSHA 10 refresher to Carlos and Antonio', 'put the bilingual crew on the Hot Work refresher', etc. The campaign Scene 2 narrates this tool. To get track_id call list_cert_tracks first. Cap is 100 workers per call. Undo: undo_write closes the open assignments this call created (prerequisites included); completed ones are never touched. Permission gate: training.assign (managers, foremen and leads by default; a company can revoke it per role). |
Change an incident's statusupdate_incident_status | Update the status of an incident (open / investigating / closed). 'resolved' is accepted as an alias for 'closed' (the user-visible terminal state). When the new status is 'closed', stamps closed_at + closed_by + optional resolution_notes. Use when the admin says 'flip Carlos's incident to investigating', 'close out the slip-trip from yesterday', etc. The campaign Scene 3 narrates this tool. Permission gate: owner/manager/super_manager. Undo: revert to the previous status via another call. |
Pause a worker's assignmentspause_worker_assignments | Composite write: pauses a worker without losing cert state. Clears the worker's training-rule memberships (training_rule_matches) + stamps unassigned_at on every currently-active job_workers row. **Leaves worker_certifications intact** — cert renewals continue on cadence; this is a temporary archive, not a termination. Use when the admin says 'pause Carlos for two weeks', 'put Maria on leave', etc. The campaign Scene 3 narrates this tool. Permission gate: workforce.workers.assign (managers, foremen and leads by default; a company can revoke it per role). Undo: undo_write puts back exactly the memberships it cleared and reopens exactly the job assignments it paused (campaign Scene 3 narrates 'his certs stay valid; his slot frees up'). |
Set a worksite's hazardsset_worksite_hazards | Replace-not-merge the worksite's hazard register: hazards not in the given set are removed, new ones are added (recorded as set by hand), and the worksite's default required designations follow — seeded for the set's hazards, retired for removed hazards no remaining hazard maps. To add ONE hazard Jobsite suggested from the job's documents, use accept_hazard_suggestion instead. Valid categories: fall, struck_by, caught_in, electrical, slip_trip, chemical, heat, silica, confined_space, excavation, crane_lift, hot_work, noise, respiratory, other. Pass an empty array to clear all hazards. Use when the admin says 'add heat to the Tempe Marketplace hazard register', 'set the high-rise hazards to fall + heat + electrical', etc. The campaign Scene 4 narrates this tool. Permission gate: jobs.create. Undo: re-call with the previous hazard set. |
Set a worksite's jurisdictionset_worksite_jurisdiction | Update a worksite's jurisdiction. Triggers a compliance-cache refresh server-side — jurisdiction-driven required tracks recompute for every worker assigned to the site. Accepts either a `jurisdiction_id` UUID OR a 2-letter `state_code` (e.g. 'CA'). Provide one of them, not both. Use when the admin says 'we're growing into Nevada — change the Phoenix site to NV', 'set the Tempe site's jurisdiction to Arizona', etc. The campaign Scene 4 narrates this tool (optional jurisdiction-expansion CTA). Permission gate: worksites.write. Undo: re-call with the previous jurisdiction. |
Transfer a worker to another jobtransfer_worker | Composite write: moves a worker from one worksite's primary Job to another's. Pauses every active job_workers row for the worker (stamps unassigned_at) + upserts a fresh row on the new worksite's primary Job + optionally updates the worker's crew membership. Worker certifications and group memberships preserved — transfer is a crew/site move, not a re-onboarding. Use when the admin says 'transfer Maria to the Tempe job', 'move Roberto from Phoenix to the new bid', etc. The campaign Scene 6 narrates this tool. Permission gate: workforce.workers.assign (plus workforce.workers.manage when a crew is named). Undo: clears the new assignment and re-clears unassigned_at on the previously-active rows. |
Make a worker the job's foremanpromote_to_foreman | Composite write on the worksite's primary Job: if the Job has NO lead foreman, names the worker lead foreman (`jobs.foreman_worker_id`); if it already has one, the lead is never replaced — the worker is granted Daily Log access alongside them instead (they must already be assigned to the Job, else `not_assigned`). Also adds the worker to the company's foreman role group for their trade (if one exists), which fans out supervisor-track required-courses. If the worker can ALREADY file that Job's Daily Log (an existing grant, or a crew lead) nothing is granted: `access: 'already_can_file'` with `why` ('granted' / 'crew_lead') — tell the admin they already could. Access given (named lead or grant) closes the worker's open crew-lead request as approved. Refuses a closed Job (`job_closed`) and an inactive worker (`worker_inactive`). Audited. Use when the admin says 'promote Maria to foreman on the new job', 'make Roberto the foreman of the Tempe crew', 'let Ana file the daily log on Coyote Wash', etc. — and tell them which happened (named lead vs. access alongside the existing lead vs. already could file). The campaign Scene 6 narrates this tool. Permission gate: worksites.write. Undo (only when `undoable`): ends the grant this call created, or clears the lead stamp this call set, and removes the role-group membership this call added — never access the worker had before. |
Create an audit share linkcreate_audit_share_link | Create a read-only public link to a compliance audit run that the user (or anyone they send the URL to) can open in any browser without logging in. Use when the user asks to 'share an audit with a customer / inspector / prequal portal', 'send the audit to Avetta', 'make a public link for the compliance report', etc. The link is permission-gated server-side (training.view) and the manager can revoke it any time from /dashboard/audit. Default expiry is 30 days; the tool also accepts 7, 90, 365 (one year), or null (no expiry). Returns the share_id + the absolute public_url to copy/send (and a public_url_path fallback). Always confirm the audit_run_id with the user — typically the most recent run from get_compliance_stats or run_compliance_audit. The undo for this tool is revoking the link. |
Save a drafted documentsave_drafted_document | Persist a narrative document you drafted WITH the user in this chat (owner update letter, scope clarification, lessons learned, project closeout report, weekly owner digest). Call this only after the user approves the draft. It creates a real document in the job's Documents (with PDF / share / sign), stamped as AI-drafted. Pass the final approved markdown as content_md. Resolve job_id via list_jobs first. Returns a link to open it. (For non-narrative kinds — OSHA forms, change-order narrative, sub scope of work, safety plan, schedule recovery plan — use route_to_surface(draft_document) instead.) |
Accept a hazard suggestionaccept_hazard_suggestion | Accept one suggested hazard: adds that hazard to its worksite (recorded as coming from the quoted evidence) and the worksite's default required designations for it; every other hazard and requirement is left as it is. Use only when the person says to accept it. Permission gate: jobs.create. Undo: undo_write removes the hazard again (and the requirements only it added) and puts the suggestion back to pending. |
Dismiss a hazard suggestiondismiss_hazard_suggestion | Dismiss one suggested hazard: the same source will not suggest it again (another source still may). Nothing on the worksite changes. Use when the person says the suggestion is wrong or not needed. Permission gate: jobs.create. Undo: undo_write puts the suggestion back to pending. |
Draft a vendor billap_draft_bill | Create a DRAFT vendor bill from an invoice you read: vendor, invoice number, dates, lines and total, optionally the document itself (base64 pages, up to 10). Jobsite matches the vendor, checks for duplicates, suggests cost coding and returns the draft's link with anything that would block it. It never submits, approves or pays — a person finishes it in Jobsite. |
Approve or reject a bill (your step)ap_decide_approval | Record the user's own decision on ONE vendor bill's approval step that is waiting on them — approve, or reject with a reason. The result echoes the vendor, amount and invoice number. A decision is final. It never schedules or makes a payment. |
Create a service callservice_create_call | Create a home-services call for an existing customer and location, or a new customer / address. Internal only — nothing is sent to the customer. Undo cancels it. |
Schedule a service visit (draft)service_schedule_visit | Add a visit to a service call with an arrival window. The visit is a DRAFT: the customer is not notified until a person publishes the day on the dispatch board. Undo cancels the visit. |
Assign technicians to a visitservice_assign_technicians | Set a visit's crew: one lead technician and optional helpers (replaces the current crew). Undo puts the previous crew back unless someone changed the visit since. |
Draft a service estimateservice_draft_estimate | Create a DRAFT estimate on a service call: title, scope, tax rate, optional good/better/best options and priced lines. It is never sent — a person reviews and sends it from Jobsite. |
Draft a daily log narrativedraft_daily_log | Draft a job's daily-log narrative for a day from Jobsite's own records (weather, manpower, deliveries, crew posts, safety activity) plus what you observed in the field. It lands in the UNSIGNED log for the foreman or a manager to review and sign. Undo restores the previous narrative. |
Add workers (proposal or attested add)propose_workers | Add workers to the roster. When the company has recorded its standing roster attestation in Jobsite, they are added now under it; otherwise this returns a proposal link where a person confirms the employer statement and adds them. Never returns sign-in PINs. |
Undo a change made through this connectionundo_write | Reverse one change made through this connection, by the id its tool result returned (or one listed by list_recent_writes). Runs the same reversal as the Undo button in Jobsite, as the connection's team member: it is refused when the record has been used since (for example a worker who has clocked in, or a talk workers have signed). Undoing a change that was already undone does nothing. |
Create a workercreate_worker | Add a worker to the company roster. Runs through the same permission gate (workforce.workers.manage), validation, seat limits, and PIN generation as the web app, acting as the API key's bound user. Custom fields must already be defined for the company. Pass dry_run:true to preview without saving. |
Set a worker's custom field valuesset_worker_custom_values | Set or clear custom-field values on an existing worker. Each value is validated by the same validator the web app uses; unknown or invalid fields are rejected. Acts as the API key's bound user behind workforce.workers.manage. Pass dry_run:true to preview. |
Create an RFIcreate_rfi | File an RFI on a job. Runs through the same gate (worksites.write), tenant checks, validation, and audit as the web app, acting as the API key's bound user and attributing the RFI to them. Pass dry_run:true to preview. |
Edit the website draftwebsite_apply_ops | Edit the company's website DRAFT with typed operations (never HTML), applied atomically as one new draft revision. The operations are the grammar website_get_site returns (page.create, block.add, block.update, site.set_theme, service.upsert, special.upsert, …); localized text is {en, es}. base_revision_id must be the head you read, else the edit is refused as stale. Acts as the API key's bound user behind the website edit permission. Cannot publish: a publish op is refused. Pass dry_run:true to get the diff and the publish check without saving. Never claim a license, insurance or certification in text — unsupported claims block publishing. |
Publish the websitewebsite_publish | Publish a draft revision of the company's website so it goes LIVE on the public internet, replacing the current live version. Needs the separate publish:website scope and a bound user who holds the website publish permission. Runs the same publish check as the web app (blocking problems refuse) and publishes only if the draft still matches expected_document_sha from website_get_site — so you publish exactly what you reviewed. An agent cannot accept the website terms of use: if they are not yet accepted, a person publishes once from the Website page. |
Every change tool accepts dry_run: true to preview without saving, and an idempotency_key so a retried call is never applied twice. Each change's result carries its id: ask the assistant to undo it (undo_write) and Jobsite reverses it as you — refused only when the record has been used since.
Things to ask
- “What needs my attention in Jobsite today?”
- “A laborer got four stitches after cutting his hand on rebar and was back at work the next day. Is it recordable on our OSHA 300 log?”
- “Who on the Main St crew is cleared to run the forklift on Friday, per our training records?”
- “What do we owe vendors in the next two weeks, and which bills are on hold — and why?”
- “Draft a bill from this invoice and tell me what still needs a person before it can be approved.”
- “What's on today's dispatch board? Flag anything unassigned or running late.”
Six ready-made requests also appear in your assistant's prompt menu: Monday safety brief, Pay run prep, Dispatch wrap-up, Incident: the first 24 hours, Job health check, and Onboard a new hire. In Claude, the attention brief and the dispatch board render as read-only cards whose buttons open the record in Jobsite.
Access, safety and your data
- One company per connection. Every request resolves your company from the connection's credential; nothing an assistant sends can reach another company's records.
- Never more than the approving manager. Certification and incident records are only included when the approving manager can see them, and that is re-checked on every request: if the manager leaves the company or loses the permission to manage jobs, the connection is revoked on the spot.
- Changes go through the normal checks. A change runs through exactly the same permission checks and audit trail as the same action in the Jobsite app.
- Short-lived credentials. Connections use OAuth 2.1 with PKCE. Access credentials expire after one hour and refresh credentials rotate on every use; we store only one-way hashes of them.
- Text in your records is data, not instructions. The connector tells the assistant that an email, note or memo asking it to approve, pay or send something is not a request from you; approvals ask you every time, and nothing can be paid or sent from the connector at all.
- Your conversations stay with the assistant. Jobsite receives only the parameters of each request, never your conversation. See our Privacy Policy and Security & Privacy page.
- Rate limited. Each connection can make up to 120 requests a minute.
Disconnecting
Connected assistants are listed under Integrations ▸ API & agent access as “Connected app” — one row for each time someone approved a connection — with when they were last used and, for write-enabled connections, a log of every change they made. Choose Revoke to end a connection immediately. You can also remove the connector in Claude under Settings → Connectors.
Troubleshooting and support
- “Connecting an assistant needs the permission to manage jobs” — ask a company owner to connect it, or to give your role that permission.
- “Your plan doesn't include integrations” — assistant access is part of plans with integrations; an owner can change plans under Plan.
- The connector stopped working — it may have been revoked; reconnect from Claude.
Anything else: support@jobsitecerts.com.