Field Service Business Platform by Doing Work

work.doingworkPublished by doingwork.workOfficial publisherv1.0.1Updated Nov 3, 2026

Headless field service software. Your AI agent runs jobs, schedules, quotes, invoices and payments.

The publisher's own server: Home Service Quotes by Doing Work

VerifiedStreamable HTTPWeb executableBusiness & Commerce

Overview

Field Service Business Platform by Doing Work's hosted MCP server (doingwork.work), published by doingwork.work; no sign-in required; Streamable HTTP; 200 tools.

No AI overview yet: these facts come from the registry entry and the server itself.

Publisher
doingwork.work
Endpoint
doingwork.work
Last checked

Installation

In SourceWeft

  1. Open Field Service Business Platform by Doing Work in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/work.doingwork%2Fshop/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "field-service-business-platform-by-doing": {
      "type": "http",
      "url": "https://doingwork.work/mcp"
    }
  }
}

Tools

200

auth_oauthRegister

Register an OAuth client (RFC 7591 dynamic registration). Public clients only: PKCE, no secret. Redirects must be https, or http on loopback.

Parametersscopetos_uricontactslogo_uriclient_uripolicy_uriclient_namegrant_typessoftware_idredirect_urisrequiredresponse_typessoftware_version+1 more

auth_oauthAuthorize

A signed-in person approves an agent client. Returns the redirect with a one-time code (PKCE S256). Needs a browser session, not an agent token. `resource` (RFC 8707) binds the token to this server's MCP endpoint.

Parametersscopestateshop_idresourceclient_idrequiredredirect_urirequiredresponse_typecode_challengerequiredcode_challenge_methodrequired

auth_oauthToken

Exchange an authorization code and PKCE verifier, or a refresh token, for a short-lived agent access token and a new refresh token. Refresh tokens rotate: each works once, and reusing one revokes the whole chain. With grant_type urn:workos:agent-auth:grant-type:claim and your claim_token (auth.md), poll until the owner approves: errors are authorization_pending, slow_down, expired_token and access_denied; success hands over a named agent key once (no refresh token, it does not expire until revoked).

Parameterscodescoperesourceclient_idgrant_typerequiredclaim_tokenredirect_uricode_verifierrefresh_token

me_get

The signed-in person.

Takes no parameters.

shops_create

Create a shop. The caller becomes its one owner. On the sign-up page the person also agrees to the Terms of Service (accept_terms_version), recorded with the version, time, IP address and browser; an agent cannot agree for them.

Parametersnamerequiredjurisdictionrequiredaccept_terms_version

members_invite

Invite a person by email as office or field. Owners and office can invite. The invite link works once.

Parametersrolerequiredemailrequiredshop_idrequired

members_resendInvite

Email an open invite again with a new link, for a worker or office member who lost it or let it expire. The old invite is revoked and a new one is made with the same email and role: use the invite_id this returns from now on. The new link works once for 14 days. Owners and office only. Accepted or revoked invites are refused.

Parametersinvite_idrequired

members_sendPage

Email a current member of your shop a one-time sign-in link that opens one page: board (the day board, for owner or office), override (mark a job or visit done anyway, owner only), or capture (job photos, for anyone on the job; a field worker must be assigned to a visit on it). Owners and office only. The member is named by membership_id, so the link only goes to someone in the shop. The link works once and expires in 15 minutes. The page still checks access when it opens.

Parametersparamsscreenrequiredshop_idrequiredmembership_idrequired

members_accept

Accept an invite as the signed-in person. The invite email must match yours.

Parameterstokenrequired

members_list

Current members of a shop with role and start date.

Parametersshop_idrequiredinclude_ended

members_end

End a membership: the owner removes a worker, or a worker leaves. Shop tokens end with it. The owner cannot leave; ownership moves only by transfer.

Parametersmembership_idrequired

members_changeRole

Owner changes a worker between office and field. The old membership ends and a new one starts, so history keeps both.

Parametersrolerequiredmembership_idrequired

jobs_create

Start a job at a home (the home is found or created from the address).

Parametersaddressrequiredshop_idrequiredsummarycustomer_id

jobs_list

Jobs of a shop, newest first. Optional status filter.

Parameterslimitstatusshop_idrequired

jobs_get

One job with its home address.

Parametersjob_idrequired

media_requestUpload

Get a signed upload URL for a job photo or video. Before you call this, look at the file and say what it shows in summary: plain words, findings, any text you can read (model and serial plates), measurements, and for video a transcript, key moments and the length. If you cannot look at it, send summary.unable_to_analyze with a reason and the media is listed by media.needsSummary. Summaries stay inside the shop and are searchable with media.list q and search.global. Photos: JPEG, PNG, WebP, HEIC or TIFF (HEIC and TIFF are kept as sent, with a JPEG copy for viewing). Video: MP4, MOV or WebM, kept as sent, at most 100 MB and 10 minutes, never shared outside the shop. Declare the sha256 of the bytes you will send; the upload is rejected if they differ. Taken time, GPS location, heading and camera details are read from photos and kept for your shop. Copies shared outside the shop (share links, quote pages, PDFs) have that metadata removed.

Parameterskindstagerequiredjob_idrequiredsha256requiredsummaryrequiredshows_interior

media_list

List the photos and videos you are allowed to see, with what the agent said each shows (summary), taken time, GPS location, heading and camera details. Filter by job, kind, words in the summary or transcript (q), summary status, distance from a point, taken time, or whether it has a location.

Parametersqkindsortlimitjob_idshop_idnear_latnear_lngradius_mtaken_afterhas_locationtaken_before+1 more

media_map

Photos with a GPS location as a GeoJSON FeatureCollection (points in longitude, latitude order), ready for a map. Takes the same filters as media.list.

Parametersqkindsortlimitjob_idshop_idnear_latnear_lngradius_mtaken_afterhas_locationtaken_before+1 more

media_get

One photo or video's details, including its full summary (findings, readable text, measurements, transcript and key moments), taken time, location, camera fields and the full metadata read from the file. Set include_content to get the stored bytes as base64 (metadata included), or include_original to get the original HEIC or TIFF when the photo was converted.

Parametersmedia_idrequiredinclude_contentinclude_original

jobs_requestConfirmation

Get a single-use link the customer opens to confirm the work was done (or flag a problem).

Parametersjob_idrequired

media_setSummary

Write or correct what a photo or video shows. Use it to fix a summary, to fill in one marked needs_summary (older photos and browser captures have none), or after a person edits the words. Each change keeps the earlier wording. Workers on the shop can edit; the summary is never shown to customers.

Parameterssummaryrequiredmedia_idrequirededited_by_person

media_needsSummary

Photos and videos with no summary yet: older uploads, browser captures, and uploads whose agent could not look at the file. Open each with media.get include_content, look at it, then send media.setSummary.

Parameterskindlimitjob_idshop_idrequired

quotes_create

Create a quote from lines the worker wrote. Lines are never filled in by AI. Optional: good, better, best options and optional lines the customer picks when signing.

Parameterslinesrequiredjob_idrequiredoptionstax_rate_id

quotes_send

Lock the quote and get a single-use signing link for the customer.

Parametersquote_idrequiredemail_customer

quotes_revise

Replace an unsigned quote with a new version. Earlier signing links stop working; send it again for a new link.

Parameterslinesrequiredoptionsquote_idrequiredtax_rate_id

quotes_withdraw

Withdraw a draft or sent quote the customer has not signed, with an optional reason. Signing links stop working and follow-ups stop. A withdrawn quote cannot be reopened; create a new quote if needed.

Parametersreasonquote_idrequired

subcontractors_get

The Idaho 45-525(3) subcontractor and supplier statement for a job: the latest signed one, any prepared draft, and whether final payment needs one.

Parametersjob_idrequired

subcontractors_prepare

Prepare the Idaho 45-525(3) statement for the shop to sign: a list of subcontractors, materialmen and rental equipment providers over $500, or none_attestation "yes" for "No subcontractors or suppliers over $500 on this job". Does not sign.

Parametersjob_idrequiredentriesnone_attestation

invoices_createFromQuote

Create an invoice for a signed quote, for the total of the option and optional lines the customer picked.

Parametersquote_idrequireddeposit_minor

invoices_send

Send an invoice (or the next part of it) and get a single-use pay link. Earlier pay links stop working. Refused with conflict on a Doing Work deposit invoice whose booking ended (shop cancel or no-show). payments_ready false means the shop has no active payments account yet (after a hand-off, connect one with payments.connectStart); the link shows payment isn't available until it does.

Parameterspercentinvoice_idrequiredamount_minoremail_customer

invoices_markPaidOutside

Record that the customer paid an invoice outside Doing Work (check, cash, financing, insurance or other). Owner or office, or their agent. Closes the invoice, and the job too unless its checklists still block done (job_status says which; finish them and call jobs.complete). The job record says "Paid outside Doing Work", is never marked paid or verified, and no Doing Work receipt goes to the customer. There is no limit on jobs paid outside Doing Work and no fee on them. Agents can record these too unless the owner turned that off with shops.setAgentMoney.

Parametersnotemethodrequiredpaid_onrequiredinvoice_idrequired

invoices_refund

Refund part or all of a payment (owner or office, or their agent). The refund shows up once the processor confirms it. An agent refund above the shop's agent refund cap (shops.setAgentMoney, $250 unless the owner changed it) does not run: it waits for the owner's OK and the reply says approval_required.

Parameterscharge_idrequiredamount_minorrequired

fees_schedule

Doing Work's fee schedule: one stepped rate on each shop's calendar month of card and bank payments, taken out of the payments. No plans, no monthly fee, no card on file. Every shop gets every feature and unlimited workers.

Takes no parameters.

fees_preview

What Doing Work would take on a payment of this size right now, the effective rate on it, the month's volume so far (all locations under the same owner), and how far the shop is from the next, cheaper band (owner or office). Leave out amount_minor for just the month picture and the next band line.

Parametersshop_idrequiredamount_minor

fees_statement

A month's Doing Work fees for a shop: card and bank volume, fees by kind, the effective rate, each line, and how far the shop is from the next band this month (owner or office).

Parametersmonthrequiredshop_idrequired

records_keys

Public keys that verify signed job records.

Takes no parameters.

jobs_record

The latest signed record for a job and its level (logged, paid, verified).

Parametersjob_idrequired

webhooks_create

Add a webhook endpoint for a shop (owner or office, or their agent). The url must be https on a public internet address. Returns the signing secret once; it is never shown again.

Parametersurlrequiredeventsshop_idrequired

webhooks_list

List a shop's webhook endpoints and their recent delivery counts. Secrets are not returned.

Parametersshop_idrequired

webhooks_delete

Remove a webhook endpoint. Pending deliveries to it stop.

Parametersendpoint_idrequired

audit_list

Read a shop's audit log, newest first (owner only).

Parameterslimitshop_idrequiredbefore_id

platforms_create

Create a developer platform account (private beta). The caller owns it.

Parametersnamerequiredterms_versionrequired

platforms_list

List the platform accounts you own and the shops each one manages.

Takes no parameters.

platforms_revokeManage

Stop a platform from managing this shop. Shop owner only.

Parametersgrant_idrequired

customers_create

Add a customer to a shop, with kind, company, email, phone, billing address, lead source, tags and notes in one call.

Parameterskindnamerequiredtagsemailnotesphoneshop_idrequiredlead_sourcecompany_namebilling_address

customers_get

One customer with contacts, properties, custom fields and open balance.

Parameterscustomer_idrequired

customers_list

Customers of a shop, newest first, filtered by tag, lead source or archived.

Parameterstaglimitcursorshop_idrequiredarchivedlead_source

customers_update

Change a customer's name, kind, company, email, phone, billing address, lead source, tags or notes.

Parameterskindnametagsemailnotesphonecustomer_idrequiredlead_sourcecompany_namebilling_address

customers_archive

Archive a customer (hidden from lists, history kept) or bring one back.

Parametersarchivedcustomer_idrequired

customers_duplicates

Likely duplicate customers in a shop: same email, same phone digits, or same name.

Parametersshop_idrequiredcustomer_id

customers_merge

Merge a duplicate customer into another: jobs, requests, contacts, properties and fields move over.

Parametersfrom_customer_idrequiredinto_customer_idrequired

customers_contactAdd

Add a contact person to a customer (tenant, manager, billing, spouse).

Parametersnamerequiredroleemailphoneis_primarycustomer_idrequired

customers_contactUpdate

Change or remove one contact of a customer.

Parametersnameroleemailphoneremovedcontact_idrequiredis_primary

properties_add

Add a service address to a customer, with optional label and access notes.

Parameterslabeladdressrequiredcustomer_idrequiredaccess_notes

properties_list

Service addresses of a customer, or every property of a shop.

Parameterslimitcursorshop_idcustomer_idinclude_archived

properties_update

Change a property's label or access notes, or archive it.

Parameterslabelarchivedproperty_idrequiredaccess_notes

equipment_add

Record equipment at a property: kind, make, model, serial, install date and warranty.

Parameterskindrequiredmakemodelnotesserialproperty_idrequiredinstall_datewarranty_until

equipment_list

Equipment at a property, or warranties ending soon across a shop.

Parametersshop_idproperty_idinclude_archivedwarranty_ends_within_days

equipment_update

Change or archive an equipment record.

Parameterskindmakemodelnotesserialarchivedequipment_idrequiredinstall_datewarranty_until

jobs_setTags

Set the tags and lead source on a job.

Parameterstagsjob_idrequiredlead_source

customers_timeline

Everything that happened with a customer, newest first: requests, jobs, quotes, signatures, invoices and payments.

Parameterslimitcursorcustomer_idrequired

customers_statement

A customer's account statement: every invoice with total, paid and balance, and the total owed.

Parameterscustomer_idrequired

customers_privacyExport

Everything the shop holds about one customer, as one JSON document, for a privacy request.

Parameterscustomer_idrequired

fields_define

Add a custom field to customers, properties, jobs, quotes or invoices for a shop.

Parameterskeyrequiredpiityperequiredlabeltargetrequiredoptionsshop_idrequiredrequiredshared_with_homeowner

fields_list

Custom fields a shop has defined, optionally for one kind of record.

Parameterstargetshop_idrequired

fields_set

Set one custom field value on a customer, property, job, quote or invoice.

Parameterskeyrequiredvaluerequiredtargetrequiredshop_idrequiredcurrencyobject_idrequired

fields_get

Custom field values on one record, with any required fields still empty.

Parameterstargetrequiredshop_idrequiredobject_idrequired

requests_create

Log a request for work from a customer or a new lead.

Parameterstagstitlerequiredsourceaddressdetailsshop_idrequiredcustomer_idlead_sourceproperty_idcontact_namecontact_emailcontact_phone+1 more

requests_list

Requests of a shop, newest first, filtered by stage, customer or tag.

Parameterstaglimitstagecursorshop_idrequiredcustomer_idinclude_archived

requests_pipeline

How many open requests a shop has in each stage, and how many were won or lost in the last 30 days.

Parametersshop_idrequired

requests_get

One request with its customer and the job it became.

Parametersrequest_idrequired

requests_update

Move a request to another stage or change its details, customer or property.

Parameterstagsstagetitledetailsarchivedrequest_idrequiredcustomer_idlead_sourcelost_reasonproperty_idpreferred_times

requests_convert

Turn a request into a job at its property or address; the worker then writes the quote or books a visit.

Parametersaddresssummaryrequest_idrequiredcustomer_id

requests_formCreate

Turn on the shop's public request form and get its key. Making a new one turns off the old key.

Parametersshop_idrequired

requests_submitForm

Send a shop a request through its public form. No sign-in; needs the form key.

Parametersnamerequiredemailphonetitlerequiredaddressdetailsform_keyrequiredpreferred_times

visits_createRecurring

Book a repeating visit (daily, weekly or monthly, every n) for a job. All visits are booked now, up to 104. Times repeat in the shop's local time zone. Overlaps and unavailable workers come back as warnings, never blocks.

Parametersfreqrequiredeverynotestitleuntiljob_idrequiredends_atrequiredstarts_atrequiredoccurrencesassignee_idsarrival_window_minutes

visits_cancelSeries

Cancel the visits of a repeating series that have not started yet, from a time onward (default now). Past, started and done visits stay.

Parametersfromreasonseries_idrequired

visits_start

Mark a visit started (from scheduled, on the way, or arrived). The worker on the visit (or the office) can do this.

Parametersvisit_idrequired

visits_done

Mark a visit done, with an optional note. The worker on the visit (or the office) can do this. A visit not yet started is started too. Refused with checklist_open while a checklist on the visit has required items open or a sign-off missing; the owner, signed in on the hosted override page (/p/checklist/override), may pass override_reason to mark it done anyway (recorded and audited). Agents, keys and office staff cannot override.

Parametersnotevisit_idrequiredoverride_reason

visits_create

Book a visit to a job at a time, optionally with the workers going (assignee_ids, a saved crew_id, or both). Overlaps for those workers come back in conflicts.

Parametersnotestitlejob_idrequiredcrew_idends_atrequiredprioritystarts_atrequiredassignee_idsarrival_window_minutes

visits_update

Move a visit or change its title, notes or arrival window. Overlaps for its workers come back in conflicts. Moving it re-plans the appointment reminder.

Parametersnotestitleends_atvisit_idrequiredstarts_atarrival_window_minutes

visits_assign

Set who is going on a visit: person_ids, a saved crew_id, or both. The list replaces the current one; an empty person_ids with no crew leaves it unassigned.

Parameterscrew_idvisit_idrequiredperson_ids

visits_cancel

Cancel a visit that is scheduled, on the way, or arrived. It stays on record with the reason, and customer notices not yet sent for it are dropped.

Parametersreasonvisit_idrequired

visits_setPriority

Set a visit's priority: normal, urgent or emergency. Sends visit.priority_set. For urgent or emergency, call dispatch.suggest for who could go.

Parametersreasonpriorityrequiredvisit_idrequired

dispatch_suggest

Read only: for an urgent or emergency visit, the shop's field workers and owners ranked by who is free (no overlapping visit, not on time off, inside their hours) and then by the fewest visits that day. Suggestions only; assign with visits.assign.

Parameterslimitvisit_idrequired

visits_get

One visit with its job and workers.

Parametersvisit_idrequired

schedule_list

A shop's visits that overlap a time window, earliest first. Filter by worker, job, or only mine. Field workers only ever see their own.

Parameterstorequiredfromrequiredminejob_idshop_idrequiredperson_idunassignedinclude_cancelled

routes_setLocation

Save the map point for a job's address, so routes.day can give it to you with each stop (owner or office). Look the address up with your own maps tools, or have a person type it in. Doing Work does not look addresses up. The point is kept for this shop's jobs at the same address.

Parameterslatrequiredlngrequiredjob_idsourcevisit_id

routes_setStart

Save where a worker starts the day (their home or a yard), or with no person_id the shop's yard, used when a worker has none. Owner or office for anyone; a worker for themselves. A worker's own start is seen only by them and the owner or office.

Parameterslatrequiredlngrequiredlabelrequiredsourceshop_idrequiredperson_id

routes_day

One day's stops for planning a route, per worker in visit time order: each worker's start point (their own, else the shop yard), and for each stop the address, map point (null until you save one with routes.setLocation; source says where it came from), time, length, arrival window, priority, and locked when the worker is already on the way, there, or done. Visits with no worker come back in unassigned. Owner and office see everyone; a field worker sees only their own day. Plan the order with your own tools, then write it back with routes.apply.

Parametersdaterequiredshop_idrequiredperson_ids

routes_apply

Write a planned route back: new times, and optionally new workers, for up to 100 visits at once (owner or office). All or nothing: if any visit is not scheduled (already on the way, there, started, done or cancelled), not this shop's, or the plan leaves a worker with overlapping visits, nothing changes and the problems come back in conflicts. Pass allow_overlaps true to save overlaps anyway, or dry_run true to check without saving. Each moved visit gets its appointment reminder planned again once.

Parameterschangesrequireddry_runshop_idrequiredallow_overlaps

vendors_create

Add a supplier the shop buys parts from. Owner or office.

Parametersnamerequirednoteemailphoneshop_idrequiredaccount_number

vendors_update

Change a supplier's name, contact details or note, or archive it (archived: true). Owner or office.

Parametersnamenoteemailphonearchivedvendor_idrequiredaccount_number

vendors_list

List the shop's suppliers (archived ones only with include_archived). Owner or office.

Parametersshop_idrequiredinclude_archived

po_create

Start a purchase order (draft) for parts for a job from a supplier. Nothing counts as job cost until po.receive. Owner or office.

Parametersnotelinesrequiredjob_idrequiredvendor_idrequired

po_update

Change a draft purchase order's supplier, note or lines (lines replace all lines). Owner or office.

Parametersnotelinespo_idrequiredvendor_id

po_get

A purchase order with its lines, what was received (in job cost) and the supplier's bill. Owner or office.

Parameterspo_idrequired

po_list

List purchase orders for the shop, or for one job or supplier, newest first. Owner or office.

Parameterslimitjob_idshop_idrequiredvendor_id

po_markOrdered

Mark a draft purchase order as sent to the supplier (the agent or a person sends it). Owner or office.

Parameterspo_idrequired

po_receive

Record parts that arrived. Each received line becomes a material on the job at the line's cost (this is the only way a purchase order reaches job cost; do not also add an expense for it). Leave lines out to receive everything left. Owner or office.

Parameterslinespo_idrequiredvisit_id

po_undoReceipt

Take back a received material from a purchase order (wrong part, returned). It leaves job cost and the line can be received again. Owner or office.

Parametersreasonmaterial_idrequired

po_cancel

Cancel a purchase order that has nothing received (undo receipts first). Owner or office.

Parameterspo_idrequired

po_recordBill

Record the supplier's bill for a purchase order, for paying the supplier. It is never added to job cost or expenses (the received materials already are); the difference from what was received is shown. Owner or office.

Parameterspo_idrequiredbill_refbill_minorrequired

calendar_createFeed

Make a calendar feed link (.ics) of one worker's visits that a calendar app subscribes to (read only). Leave person_id out for your own; owner or office can make one for any current member. A new feed turns that person's old one off. The link is shown once.

Parametersshop_idrequiredperson_id

calendar_listFeeds

Calendar feeds in a shop, newest first, with whether each is active and how often it was fetched. Field workers see only their own. The link is not shown again.

Parametersshop_idrequiredperson_id

calendar_revokeFeed

Turn a calendar feed off now. Calendar apps that fetch it after this get 410 and stop showing new visits.

Parametersfeed_idrequired

availability_setHours

Set a worker's weekly hours, replacing what was there. Days are 0 (Sunday) to 6, times are shop local HH:MM. An empty list means no set hours (always available).

Parametershoursrequiredshop_idrequiredperson_id

availability_addTimeOff

Add time off for a worker (vacation, sick, appointment).

Parametersreasonends_atrequiredshop_idrequiredperson_idstarts_atrequired

availability_removeTimeOff

Remove a time-off entry.

Parameterstime_off_idrequired

availability_get

A worker's weekly hours, time off, and booked visits in a window (at most 62 days). Defaults to me.

Parameterstorequiredfromrequiredshop_idrequiredperson_id

schedule_settings

The shop's scheduling setup: time zone, booking hours (or the default when none are set), arrival window, travel buffer, reminder lead time, whether on the way notices go out, and whether arrival times are shown. on_my_way_notices covers both the on the way and the arrived notice. arrival_notices is off unless the shop turns it on. When on, an on the way message includes an arrival time when one is known (a stored route estimate, or the time the worker entered; no drive time is looked up). On the way and arrived each go by text and by email. Any worker in the shop can read it.

Parametersshop_idrequired

schedule_setShopHours

Set the shop's booking hours, replacing what was there (owner or office). Days are 0 (Sunday) to 6, times are shop local HH:MM, several blocks a day are fine. An empty list clears them, and find-a-time falls back to Monday to Friday 08:00 to 17:00. Visits outside these hours are still allowed and come back with outside_shop_hours.

Parametershoursrequiredshop_idrequired

schedule_setRules

Change the shop's scheduling rules (owner or office; the time zone is owner only). arrival_window_minutes is the default window customers are told for new visits (0 means an exact time). buffer_minutes is travel and setup time find-a-time keeps clear around booked visits. reminder_hours is how long before a visit the customer gets an appointment reminder (0 turns reminders off). on_my_way_notices tells the customer by text and by email when a worker says they are on the way. Text is the main one. The email goes whenever the customer has an email address, even if the text does not. arrival_notices (off by default) adds an arrival time to that message when one is known (a stored route estimate, or the time the worker entered; route data has no drive time, so with no worker time there is no arrival line). The arrived text and email follow on_my_way_notices, the same setting as the on the way message. A do-not-email address is not emailed. Only the fields you send change. Visits already booked keep their window and reminder.

Parametersshop_idrequiredtime_zonebuffer_minutesreminder_hoursarrival_noticeson_my_way_noticesarrival_window_minutes

schedule_findTime

Find open times for a visit of a given length. Looks inside shop hours (or Monday to Friday 08:00 to 17:00 when none are set), skips worker time off and times outside a worker's own hours, and keeps the shop's travel buffer clear around booked visits. Give person_ids or a saved crew_id (or both) to check those workers (together: all of them free at once, the default; or any one of them). Leave it out to check every worker in the shop and get back who is free. Field workers can only check themselves. Nothing is booked; call visits.create with a slot.

Parameterstofromlimitcrew_idshop_idrequiredtogetherperson_idsstep_minutesduration_minutesrequired

visits_onTheWay

Mark that the worker is on the way to a visit, with an optional ETA (eta_at, or eta_minutes from now). The worker on the visit (or the office) can do this. When the shop has on the way notices on, the customer gets a text and an email. Text is the main one. The email goes whenever the customer has an email address, even if the text is blocked, refused, or does not go through. When arrival notices are also on, the message includes an arrival time: a route estimate when the visit already has one, otherwise the time the worker entered, otherwise no arrival line. Route data stores the booked start and the arrival window, not a drive time. Doing Work does not look up a drive time.

Parameterseta_atvisit_idrequiredeta_minutes

visits_arrived

Mark that the worker arrived at a visit. The worker on the visit (or the office) can do this. Any on the way message not yet sent is dropped. When on the way notices are on, the customer gets one arrived text and one arrived email. Text is the main one. The email goes whenever the customer has an email address, even if the text does not. A do-not-email address is not emailed. Once only.

Parametersvisit_idrequired

visit_on_my_way

Mark that the worker is on the way to a visit when they tell their agent, for example on my way, there by 2. eta is that time in their words and can be left out. A worker may call this only for a visit they are assigned to. The owner or office may call it for any visit in the shop. When on the way notices are on, the customer gets a text and an email. Text is the main one. The email goes whenever the customer has an email address, even if the text is blocked, refused, or does not go through. When arrival notices are also on, the message includes the time the worker gave. A repeat call does not send again.

Parametersetavisit_idrequired

visit_arrived

Mark that the worker has arrived at a visit when they tell their agent, for example I am here. A worker may call this only for a visit they are assigned to. The owner or office may call it for any visit in the shop. When on the way notices are on, the customer gets one arrived text and one arrived email. Text is the main one. The email goes whenever the customer has an email address, even if the text does not. A do-not-email address is not emailed. When on the way notices are off, this sends nothing. A repeat call does not send again.

Parametersvisit_idrequired

visits_notices

Customer notices planned or handled for a visit (appointment reminder, on the way, arrived), with status pending, queued (handed to text, email, or both), cancelled or skipped and why. Owner or office.

Parametersvisit_idrequired

schedule_openSlots

Times the shop marked open for its voice agent to book (upcoming only), and which are booked. Any worker in the shop can read it.

Parametersshop_idrequired

schedule_addOpenSlots

Mark times open for the shop's voice agent to book callers into (owner or office). The agent books them only when phone.setVoiceAi has book_open_slots true, which is off by default. Each slot is at most 12 hours and in the future. A booked slot becomes a request with that time for the office.

Parametersslotsrequiredshop_idrequired

schedule_removeOpenSlot

Take back an open time that is not booked yet (owner or office).

Parametersshop_idrequiredslot_idrequired

shops_setInvoiceReminders

Turn the automatic unpaid-invoice reminder on or off for the whole shop (owner only). When on, a customer gets one friendly email reminder a set number of days (default 1) after an invoice or deposit request is sent if it is still unpaid. Mail comes from a doingwork.work address on the shop's behalf, with replies going to the owner.

Parametersenabledrequiredshop_idrequireddelay_days

shops_setContact

Set the phone and email customers see when they open a canceled invoice or quote link (owner only). Leave a field out or send null to fall back to the owner's own email and phone.

Parametersemailphoneshop_idrequired

shops_setFieldCosts

Let field workers in the shop see job costs (labor cost, material cost, expenses others entered, price book cost), or hide them again (owner only). Off by default. A worker whose own see_costs is off still does not see costs.

Parametersenabledrequiredshop_idrequired

shops_setHubLinkInEmails

Turn the customer hub link in quote and invoice emails on or off for the whole shop (owner only). On by default: each quote or invoice email the customer gets from Doing Work ends with a link to their hub, where they see their quotes, invoices and visits with you.

Parametersenabledrequiredshop_idrequired

invoices_setReminder

Turn the automatic unpaid reminder on or off for one invoice (owner or office).

Parametersenabledrequiredinvoice_idrequired

pricebook_saveItem

Add a price book item, or change one when item_id is given (owner or office). Items are a pick list for quote lines that workers write; they are never filled into a quote automatically.

Parameterskindnameunitpartsitem_idshop_idrequiredtaxablecategorytask_codecost_minordescriptionest_minutes+4 more

pricebook_list

List the shop's price book items, by name. Filter by category or text; archived items are left out unless asked for. cost_minor is null for a worker the owner has not let see costs.

Parametersqshop_idrequiredcategoryinclude_archived

pricebook_archiveItem

Archive a price book item, or bring it back with archived false (owner or office). Quotes that used it keep their lines.

Parametersitem_idrequiredarchived

templates_save

Save a quote template: worker-written lines (and good, better, best options) to start quotes from. Give template_id to replace one (owner or office).

Parametersnamerequiredlinesrequiredoptionsshop_idrequiredtemplate_id

templates_list

List the shop's saved quote templates with their lines. To use one, pass its lines and options to quotes.create, changed as the worker says.

Parametersshop_idrequiredinclude_archived

templates_archive

Archive a quote template, or bring it back with archived false (owner or office).

Parametersarchivedtemplate_idrequired

quotes_activity

What the customer has done with a quote: when each version was first opened and how often, and any decline or change request with its note.

Parametersquote_idrequired

shops_setQuoteFollowup

Set how many days after a quote is sent the customer gets one friendly follow-up email if they have not answered (owner only). 0 turns it off. Default 3.

Parametersdaysrequiredshop_idrequired

invoices_create

Create an invoice without a quote, from lines the worker wrote (never filled in by AI). Optional due date, memo and deposit. Send it with invoices.send.

Parametersmemolinesrequireddue_onjob_idrequiredtax_rate_iddeposit_minor

invoices_createBatch

Create many invoices at once (up to 100), each from a job and the lines the worker wrote. All or nothing. With send=true each is sent and its pay link returned.

Parameterssenditemsrequiredshop_idrequired

invoices_get

One invoice with its lines, what has been paid, the balance, the due date, and whether a bank payment is still clearing. display_status is payment_pending while a bank payment clears (3 to 5 business days), otherwise the invoice status. last_bank_payment_failed_at is set when the latest bank payment failed and the customer can pay again.

Parametersinvoice_idrequired

invoices_pdf

The invoice as a PDF (base64), with shop, customer, lines, paid so far and balance. Attach it to email or save it.

Parametersinvoice_idrequired

invoices_aging

Accounts receivable aging: every open invoice's balance by how late it is (current, 1-30, 31-60, 61-90, over 90 days past due), with totals per customer (owner or office). An invoice with no due date is due when sent.

Parametersas_ofshop_idrequired

shops_setTips

Turn tips on or off on this shop's invoice pay page (owner only). Off by default. A tip is paid with the invoice, never counts toward the invoice total, and shows in tips.report.

Parametersenabledrequiredshop_idrequired

shops_setReviewRequest

Set the review link (for example your Google review page, https only) and how many days after an invoice is paid the customer gets one email asking for a review (owner only). No link means no email. Default 1 day; 0 turns it off. Review emails show the shop name and mailing_address in the footer, so a link can only be set once the shop has a mailing address (send it here).

Parametersdaysshop_idrequiredreview_urlmailing_address

tips_report

Tips customers paid, by invoice and in total, between two dates (owner or office). Tips are kept apart from invoice totals. Refunds of a payment are not split out from its tip.

Parameterstorequiredfromrequiredshop_idrequired

shops_getBrand

How this shop's quotes and invoices look: accent color, license number, footer text, logo size, and whether "Sent with Doing Work" shows.

Parametersshop_idrequired

shops_setBrand

Set how this shop's quotes, invoices and emails to customers look, on the customer's page, in the PDF and in every email (owner only). The owner can also change it on the brand page at /p/shop/brand. Send only what changes; null clears a field. accent_color is "#rrggbb" and must reach 4.5 to 1 contrast on white (the default is #1f4fd1). logo_base64 is a PNG or JPEG of up to 5 MB, stored as a JPEG of at most 600 pixels on its long side. sent_with_doing_work (on by default) prints "Sent with Doing Work" in the PDF footer, on the page and at the bottom of emails.

Parametersfootershop_idrequiredlogo_base64accent_colorlicense_numbersent_with_doing_work

quotes_pdf

A quote as a PDF (base64) in the shop's brand: logo, accent color, license number, lines, options and total. Financing links use the signed total once the customer has signed, and the lowest option until then. The latest version unless version is given. Attach it to email or save it.

Parametersversionquote_idrequired

cards_get

The card a customer has on file (brand, last 4, expiry) and whether auto-pay is on (owner or office).

Parameterscustomer_idrequired

cards_remove

Remove a customer's saved card (owner or office). Auto-pay turns off with it.

Parameterscustomer_idrequired

customers_setAutopay

Turn auto-pay on or off for a customer (owner or office). On needs a saved card. With auto-pay on, each invoice sent to them is charged to the card on its due date (or the day it is sent if it has none). A failed charge is not retried; you get an email and the pay link still works.

Parametersenabledrequiredcustomer_idrequired

maintenance_createPlan

Start a maintenance plan for a job's customer (owner or office). You write the priced lines for one term (never filled in by AI). The first term's invoice is created now (and sent if send_first is true). When a term ends, the next term's invoice is created automatically and sent if auto_send is on. With visits_per_term, each term also gets that many service due dates (see services.listDue), so the shop knows when each covered visit is due; schedule the actual visit with visits.create as usual.

Parametersnamerequiredlinesrequiredjob_idrequiredauto_sendstarts_onsend_firsttax_rate_idterm_monthsrequiredvisit_titlevisits_per_term

maintenance_getPlan

One maintenance plan: price per term, current term, renewal date, each term's invoice, and this term's covered visits with the next one due.

Parametersplan_idrequired

maintenance_listPlans

A shop's maintenance plans, optionally for one customer or by status, soonest renewal first.

Parametersstatusshop_idrequiredcustomer_id

maintenance_setPrice

Replace a plan's priced lines (owner or office; you write them, never AI), and optionally its tax rate. Applies from the next term's invoice; invoices already made keep their price.

Parameterslinesrequiredplan_idrequiredtax_rate_id

maintenance_setVisits

Change how many visits a plan covers each term, and what they are called (owner or office). Applies from the next term. Pass this_term true to also add them now to the current term when it has none yet.

Parametersplan_idrequiredthis_termvisit_titlevisits_per_termrequired

maintenance_cancelPlan

Cancel a maintenance plan (owner or office). No more renewal invoices. Invoices already sent stay as they are. The plan's open visit due dates are cancelled.

Parametersplan_idrequired

taxes_saveRate

Add or change a sales tax rate the shop charges in one jurisdiction (owner or office). You enter the rate; Doing Work never looks it up. rate_bps is hundredths of a percent (600 = 6%). Changing a rate applies to new quotes and invoices only. is_default makes it the rate used when a quote or invoice does not name one.

Parametersnamerequiredshop_idrequiredrate_bpsrequiredis_defaulttax_rate_idjurisdictionrequired

taxes_listRates

The shop's tax rates. Archived (replaced or removed) rates are left out unless include_archived is true.

Parametersshop_idrequiredinclude_archived

taxes_archiveRate

Stop using a tax rate (owner or office). Quotes and invoices that already used it keep it.

Parameterstax_rate_idrequired

shops_setTaxReportBasis

Choose how the sales tax report counts a period (owner only). accrual (default): invoices sent in the period. cash: money collected in the period, after refunds. Pick the one your state files on.

Parametersbasisrequiredshop_idrequired

taxes_salesReport

Sales tax report for a period (owner or office), shop local dates, from and to inclusive. Uses the shop's basis (shops.setTaxReportBasis) unless basis is given. accrual: invoices sent in the period, with sales, taxable sales, tax billed, and tax collected so far. cash: money collected in the period through Doing Work (payments minus refunds, tips left out), with the tax share of it. Grouped by the tax name, jurisdiction and rate on each invoice. Untaxed sales are one row with no rate. Void invoices are left out. For filing, check the numbers against your own records.

Parameterstorequiredfromrequiredbasisshop_idrequired

quotes_addAttachment

Show an uploaded photo or file of the same job with a quote, with an optional caption. Upload it first with the media ops. The customer sees it on the quote page.

Parameterscaptionmedia_idrequiredquote_idrequired

quotes_removeAttachment

Take a photo or file off a quote. The media item itself stays on the job.

Parametersattachment_idrequired

quotes_listAttachments

Photos and files shown with a quote, in order.

Parametersquote_idrequired

media_tag

Add or remove tags on a photo (for example: leak, panel, permit). Tags are lower case; returns the photo's tags.

Parametersaddremovemedia_idrequired

tags_list

Every tag used in the shop, with how many photos and jobs carry it.

Parametersshop_idrequired

jobs_findByTag

Jobs in the shop that carry all the given tags (set with jobs.setTags), newest first, up to 200.

Parameterstagsrequiredshop_idrequired

media_saveMarkup

Save markup over a photo as a new layer version: arrows, lines, boxes, circles, text and freehand strokes in 0..1 photo coordinates (0,0 is top left). The photo is never changed; earlier versions are kept. An empty list clears the markup.

Parametersshapesrequiredmedia_idrequired

media_getMarkup

A photo's markup: the latest version unless one is named, with an SVG overlay to lay over the original photo. Also lists all versions.

Parametersversionmedia_idrequired

shares_create

Make a link to a gallery of a job's photos that anyone with the link can open without signing in. Name the photos, or leave media_ids out to share every photo on the job (including ones added later). Expires after days (1 to 90, default 14); revoke it any time. Markup shows over the photos unless include_markup is false. Set include_daily_log to also show the job's daily log entries (off by default; names of who wrote them are not shown). The url is shown once.

Parametersdaystitlejob_idrequiredmedia_idsinclude_markupinclude_daily_log

shares_list

Photo share links on a job, newest first, with whether each is still active and how often it was opened. The link itself is not shown again.

Parametersjob_idrequired

shares_revoke

Turn a photo share link off now. Anyone opening it after this sees that it is no longer available.

Parametersshare_idrequired

logs_add

Write a daily log entry on a job: what happened on site that day, in the worker's own words. Any shop member can add one. log_date defaults to today in the shop's time zone. Attach photos already on the job with media_ids.

Parametersbodyrequiredjob_idrequiredlog_datemedia_ids

logs_list

Daily log entries on a job, oldest first, optionally between two dates (inclusive). Removed entries are left out.

Parameterstofromjob_idrequired

logs_remove

Take a daily log entry out of the log. Only the worker who wrote it or the owner can. It stays in history and in any PDF already made.

Parametersentry_idrequired

documents_photoReport

Render a photo report PDF for a job: a title and the worker's own notes, then the job's photos in time order with stage and tags. Name photos with media_ids or leave it out for every photo on the job. Core stores the PDF with its sha256 and returns it (base64).

Parametersnotestitlejob_idrequiredmedia_ids

documents_dailyLog

Render the daily log for a job as a PDF: each day's entries in the workers' own words with who wrote them, and the photos they attached. Optional from and to dates (inclusive). Core stores the PDF with its sha256 and returns it (base64).

Parameterstofromjob_idrequiredinclude_photos

documents_list

PDF documents core made for a job (photo reports, daily logs and submitted forms), newest first, with each file's sha256.

Parametersjob_idrequired

documents_get

One stored job PDF (base64) with its sha256, byte for byte as it was made.

Parametersdocument_idrequired

expenses_add

Record money a worker spent on a job, with the receipt photo. Parts received on a purchase order are already job cost; when the vendor matches a received purchase order on the job, possible_po_duplicates lists it so you can ask before keeping both. The worker types the amount and tax from the receipt; core never reads or fills in amounts. spent_on defaults to today in the shop's time zone.

Parametersnotejob_idrequiredvendorcategoryspent_ontax_minoramount_minorrequiredreceipt_media_id

expenses_update

Change an expense: date, vendor, category, amount, tax, receipt photo or note. Amounts are still typed by a worker. The worker who entered it, the owner or office can change it.

Parametersnotevendorcategoryspent_ontax_minorexpense_idrequiredamount_minorreceipt_media_id

expenses_remove

Take an expense off the books (kept in history). The worker who entered it, the owner or office can.

Parametersexpense_idrequired

expenses_list

Expenses on a job, or across the shop between dates, with totals by category. Owner and office see every expense; a field worker sees the ones they entered.

Parameterstofromjob_idshop_idcategory

search_global

Search one shop for customers (name, email, phone), properties (address), jobs (summary), requests (title), notes (words, on any record) and photos and videos (what the agent said they show, readable text such as serial numbers, video transcripts). Case-insensitive; you see only what your role can read.

Parametersqrequiredlimitshop_idrequired

events_catalog

Every event a webhook can receive, with its payload keys and types. Approved agent actions add requested_by_token_id to any event.

Takes no parameters.

webhooks_deliveries

List deliveries to one webhook endpoint, newest first, with event, status, attempts and last HTTP status.

Parameterslimitstatusbefore_idendpoint_idrequired

webhooks_retry

Send a failed or dead delivery again from attempt 0 (owner or office).

Parametersdelivery_idrequired

imports_fields

The customer import fields and the built-in presets (jobber, housecall_pro, companycam) with the export column each reads.

Takes no parameters.

imports_preview

Dry run of a customer CSV import. Writes nothing. Returns the headers, a suggested mapping (from a preset or the header names), and for every row the customer it would create or the problems found. Show the mapping to the owner before imports.run.

Parameterscsvrequiredpresetsourcemappingshop_idrequiredon_match

imports_run

Owner only: import customers (and one service address each) from a CSV with the mapping the owner confirmed. mode all_or_nothing (default) writes nothing if any row fails; per_row writes the good rows and reports the rest. dry_run true checks without writing.

Parameterscsvrequiredmodesourcedry_runmappingrequiredshop_idrequiredon_matchpreview_hash

imports_historyFields

Fields for importing history from another system (jobs with visit history, open quotes, unpaid invoices, price book, equipment, maintenance plans as service-due reminders, payment history as read-only records) and the jobber and housecall_pro presets per kind.

Takes no parameters.

imports_historyPreview

Dry run of a history import (kind jobs, quotes, invoices, pricebook, equipment, maintenance_plans, payments or flat_rate). Writes nothing. Returns a suggested mapping, what each record would do (create, update, skip, skip_blank, skip_closed or error) with how its customer matched, and a preview_hash. Show it to the owner; imports.historyRun needs the same hash.

Parameterscsvrequiredkindrequiredpresetsourcemappingshop_idrequiredon_matchplans_asequipment_kind

imports_historyRun

Owner only: write a history import the owner confirmed in imports.historyPreview (send its preview_hash, plus the same csv, kind, source, on_match and mapping). Records already imported are matched by old id and skipped or updated, never duplicated. Imported quotes and invoices are drafts and are not sent. Maintenance plans become service-due reminders (no invoice, no charge), or with plans_as billed, maintenance plans at the confirmed price with auto_send off and no invoice until the next due date; payments become read-only history records (no charge, no fee, no invoice change). flat_rate rows become price book tasks, matched by old id, then task code, then name. mode all_or_nothing (default) or per_row.

Parameterscsvrequiredkindrequiredmodesourcemappingrequiredshop_idrequiredon_matchplans_aspreview_hashrequiredequipment_kind

imports_paymentHistory

Owner or office: payments imported from another system (read-only history; never charged, never counted toward Doing Work fees). Filter by customer_id.

Parameterslimitshop_idrequiredcustomer_id

shops_export

Owner only: everything the shop holds as one ZIP: data/<table>.csv and data/<table>.json for every shop table, files/ with job photos (and the original HEIC or TIFF file next to its JPEG copy) and PDFs, and manifest.json. Signing secrets and token hashes are left out. By default you get download_url, a link that works for 60 minutes and up to 5 downloads; anyone with the link can download, so do not share it. delivery "inline" returns zip_base64 instead, only for exports up to 10 MB. Large shops: pass include_files false for data only.

Parametersshop_idrequireddeliverylink_minutesinclude_files

Version history

2
  1. v1.0.1LatestNov 3, 2026
  2. v1.0.0Oct 18, 2026

Score

83% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts

    Declare a GitHub repository with a README, or serve resource_documentation in the OAuth protected-resource metadata.

  • LicenseNot applicable

    A hosted service is used under its provider's terms, so no license is expected here. This check is left out of the percentage.

Other Doingwork integrations