MCP HeartbeatTHE MCP OBSERVATORY
Public workspace

Explore

Evidence for your next connection.

Independent measurements of remote MCP servers. Every observation has a timestamp.

Read-only probes

MCP server · Payments & trading

Field Service Business Platform by Doing Work

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

Checks passed
11 / 22

3 failed · 8 not measured

Median response
1450 ms

Median of successful probes over 7 days

30-day uptime
Not measured

Share of countable probes over 30 days, including daily rollups. Auth challenges are excluded.

Discovered tools
429

Tool definitions returned by this server

Independent monitoring

Health & checks

Status history

Responded

The server completed its last measured handshake. This is an observation, not a guarantee.

Last checked
Check summary by test group
Test areaPassedFailedUnmeasured
ConnectionCan a client connect and discover tools?
500
Reliability & speedDoes it respond consistently and quickly?
004
Access & authenticationWhat is required to use this server?
102
Tool qualityAre the tool definitions usable by an agent?
220
Publisher identityCan the publisher be traced to its source?
312

Unmeasured means there is not enough evidence to decide. How these checks work

Inspect individual checks 22 recorded

Core

  • Pass
    Reachable

    Latest probe returned HTTP 200 in 1450 ms.

  • Pass
    Valid handshake

    protocolVersion 2025-06-18, serverInfo.name doing-work.

  • Pass
    Lists tools

    tools/list returned 429 tools.

  • Pass
    Current protocol

    Negotiated 2025-06-18. The bar is 2025-06-18 or newer.

  • Pass
    HTTPS

    The endpoint URL is https.

Performance

  • Not measured
    Fast (p50)

    Median latency 1450 ms over 1 samples in 7 days. The bar is 1000 ms. Need at least 5 samples.

  • Not measured
    Consistent (p95)

    95th percentile 1450 ms over 1 samples in 7 days. The bar is 3000 ms. Need at least 20 samples.

  • Not measured
    Reliable (uptime)

    1 of 1 attempts returned a tool list in 30 days (100%). The bar is 99%. Need at least 30 samples.

  • Not measured
    Stable tool list

    Fewer than two successful probes in 30 days, so tool-list stability is not measured.

Access

  • Pass
    Open access

    tools/list succeeded with no credential, and the record declares none.

  • Not measured
    Standard auth

    Auth is not required, so the OAuth metadata check does not apply.

  • Not measured
    Free tier cited

    No publisher quote has been checked.

Tools

  • Pass
    Tools described

    Every tool description is at least 20 characters.

  • Pass
    Valid input schemas

    Every inputSchema is a JSON Schema object.

  • Fail
    Parameters documented

    314 of 1555 parameters have a description (20%). The bar is 80%.

  • Fail
    Safety hints

    429 tools set neither readOnlyHint nor destructiveHint.

Publisher

  • Pass
    Verified namespace

    Listed in the Official MCP Registry.

  • Pass
    Website matches publisher

    The website host matches the reverse-domain namespace.

  • Fail
    Source repo linked

    No repository URL is on file.

  • Not measured
    Repo owner matches

    This namespace is not an io.github login, so the owner comparison does not apply.

  • Pass
    Recently updated

    Updated 2026-11-01T21:30:45.131796Z, within 180 days.

  • Not measured
    Open-source licence

    No GitHub repository to ask about a licence.

Start using Field Service Business Platform by Doing Work

Connect to this server

Choose your client, copy the configuration, then enable the server in your client’s MCP settings.

Run this command in your terminal, then restart Claude Code.

Claude Code

claude mcp add --transport http field-service-business-platform-by-doing-work https://doingwork.work/mcp

Capabilities

Tools 429

Showing 100 of 429 tools.

agent_checkup

A read-only look across the shop: stale quotes, overdue or failed invoices, tomorrow's visits that are not ready, recap drafts, unanswered customer requests, the one setup step still missing, jobs under the margin floor, double-booked workers, and maintenance that is due. Ranked, best first. Snoozed items are left out. Each item has next_actions. Nothing is sent.

Discovered
agent_due

Follow-ups the agent scheduled for itself that are due now (tasks.create with for_agent). Each row has the words and the op to call. Read only. A field worker sees the ones they made; the owner and office see the shop's.

Discovered
agent_snooze

Hide one checkup suggestion so it is not repeated. Pass the item key from agent.checkup. days snoozes for that many days (default 7). dismiss true hides it until you snooze again with a new time. Owner, office, or the worker who writes it.

Discovered
agents_claim

auth.md claim. Pass your claim_token and the email of the shop owner who should claim you. You get a 6 digit user_code and a verification_uri: tell the person to open the link, sign in with that email and type the code. Then poll the token endpoint with grant_type urn:workos:agent-auth:grant-type:claim. Calling again with the same claim_token starts a fresh code and cancels the old one.

Discovered
agents_register

Preferred when you know the owner's email: type service_auth and login_hint. The reply's short fields come first: claim_attempt_token, user_code, claim_token, claim_page, then verification_uri. Use verification_uri only when its length matches verification_uri_length. If it was cut, build the link from claim_page and claim_attempt_token. Do not invent the host. Do not open claim_url alone. Do not register again when complete is missing and claim_token is present; call the claim endpoint once only if claim_attempt_token is missing. Omitted scope means full `agent`. On an OAuth person grant (no shop_id) that can create a shop. A key from agents.register is bound to the shop the owner picks and cannot create another shop. read_only cannot. type anonymous only when you do not yet have the email. identity_assertion is not accepted.

Discovered
approvals_get

One approval request with its status and, once approved and run, the action's result. Owner and office see any; a field worker sees only their own.

Discovered
approvals_list

Approval requests for a shop, newest first, optionally by status (pending, approved, denied, failed, expired). Requests past their expiry read as expired. Owner and office see every request; a field worker sees only the ones they or their agents asked for.

Discovered
approvals_listRules

The shop's approval rules: which agent actions wait for the owner.

Discovered
audit_list

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

Discovered
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.

Discovered
auth_oauthRegister

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

Discovered
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 every interval only while the error is authorization_pending. slow_down means wait longer and poll again. access_denied, expired_token, and invalid_grant end this claim. Also stop when expires_in has passed. shown_once is only on success. Success hands over a named agent key once (no refresh token, it does not expire until revoked).

Discovered
auth_requestLink

Email a one-time sign-in link. Always answers ok, so it never reveals whether an email has an account.

Discovered
auth_sendLink

Email a person a one-time sign-in link that opens a named Doing Work screen after they sign in, so an agent can hand its person straight to the page that needs a human (brand, terms, job photos and so on). The screen comes from a fixed list: today, prices, brand, payments, resume, terms, transfer, close, work, capture, subcontractors, claim, card, hub, board, override, start. Shop screens take shop_id; capture and subcontractors take job_id; claim is refused here, because the agent connect flow sends its own link; board takes shop_id and an optional date; override takes kind (job or visit) and id; card and hub take the key from their link. To send a page to a named member of your shop with role and assignment checks, use members.sendPage. The link works once, in any browser, and expires in 15 minutes. Always answers ok, so it never reveals whether an email has an account. The page still checks that the person may see it.

Discovered
availability_addTimeOff

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

Discovered
availability_get

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

Discovered
availability_removeTimeOff

Remove a time-off entry.

Discovered
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).

Discovered
books_export

Owner or office: one month (or from and to) of the shop's money as a ZIP for a bookkeeper or for QuickBooks Online by hand: a ledger CSV of every invoice, void, payment, refund, fee and payout, QuickBooks Online invoice import files, and QuickBooks Online bank upload files for a clearing account. Use this only when the shop has no agent QuickBooks sync; the sync (sync.changes) is the main way. The same period gives the same file and sha256 every time. You get download_url (60 minutes, 5 downloads; anyone with the link can download, so do not share it) or, with delivery inline, zip_base64 up to 5 MB.

Discovered
books_exports

Owner or office: the shop's past books exports, newest first: period, row counts and sha256 (to check a file you were sent). Run books.export again to get a new download link.

Discovered
bulk_run

Run one safe action on up to 200 records: customers.addTags, customers.removeTags, customers.archive, customers.unarchive, jobs.addTags, jobs.removeTags, visits.assign. Each item goes through the shop's approval rules like a single call and is reported as done, approval_required or failed.

Discovered
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.

Discovered
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.

Discovered
calendar_revokeFeed

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

Discovered
cards_get

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

Discovered
cards_remove

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

Discovered
cards_setupLink

Get a secure page where the customer saves a card with the shop's payment processor (owner or office). Send the link to the customer; Doing Work never sees the card number. Saving a new card replaces the old one.

Discovered
changes_cancel

Cancel a draft or sent change order (its open signature request is cancelled too, so the link stops working). An approved change order cannot be cancelled; write a new change order that takes the work back out.

Discovered
changes_create

Write a change order on a job: a priced change to its scope (AI can draft lines; the owner approves them before the change order is sent). Discount lines take work out; a change order may total less than 0 (a credit). Tax: the shop default rate unless tax_rate_id is given (null for no tax). It starts as a draft; send it to the customer with changes.send.

Discovered
changes_get

One change order with its lines, totals, status, signature and invoice.

Discovered
changes_invoice

Bill approved change orders on a normal invoice (draft; send it with invoices.send). Each change order's lines are copied, labelled with its number. Leave out change_order_ids to bill every approved change order on the job not yet invoiced. They must share one tax rate. Credits (change orders under 0) come off as discounts and need priced work on the same invoice.

Discovered
changes_list

A job's change orders and its money picture: signed quotes (contract_minor) + approved change orders = revised_total_minor; pending (sent, not yet signed); invoiced on live invoices; unbilled; and approved change orders not on an invoice yet.

Discovered
changes_send

Owner or office: ask the customer to approve a change order. Doing Work writes the document (the lines, totals and the job's total before and after) and returns a single-use sign_url for the agent to deliver; the customer signs it on a hosted page and the change order becomes approved. To send again after the request was cancelled, call this again; for a fresh link on an open request use signatures.newLink.

Discovered
checklists_addItems

Add items to the end of a checklist (owner or office). Same locks as ticking.

Discovered
checklists_archiveTemplate

Archive a checklist template so it is no longer offered. Checklists made from it are unchanged.

Discovered
checklists_checkItem

Tick (done true) or untick an item, with an optional note. The worker on the visit (for a job checklist, on any visit of the job) or the office can do this. Locked once the visit or job is done, while a sign-off is waiting, and after sign-off.

Discovered
checklists_create

Put a checklist on a job, or on one visit of the job (visit_id). Copy a template (checklist_template_id) or give items. A visit checklist gates that visit's done; a job checklist gates the job's done (jobs.complete), and the job also waits on checklists of visits not yet done.

Discovered
checklists_get

One checklist with every item (removed items included and marked), who ticked what and when, and its sign-off.

Discovered
checklists_list

Checklists on a job (all of them, job-level and per visit) or on one visit, with counts of open required items and sign-off state. Workers see the checklists of the jobs they can see.

Discovered
checklists_listTemplates

The shop's checklist templates with their items. Archived ones only with include_archived.

Discovered
checklists_removeItem

Remove an item from a checklist (it stays in the history, marked removed). Owner or office; a required item only by the owner. Audited.

Discovered
checklists_requestSignOff

Ask for a sign-off on a finished checklist and get the signing link. Every required item must be ticked. The signer (the customer by default, or a shop member) signs the checklist exactly as it stands; items lock while the sign-off waits (signatures.cancel unlocks).

Discovered
checklists_saveTemplate

Create a checklist template, or replace one (give checklist_template_id). Items are in order; required items (the default) must be ticked before the visit or job can be marked done. Checklists already made from it keep their own copy.

Discovered
corrections_recent

The shop's recent corrections to drafts you made, newest first: what was changed or rejected and why. Read these before you draft a quote, a recap or a reply for this shop, and follow them. A field worker sees the full rows of their own; recap and quote drafts already carry the whole shop's lessons, with no names.

Discovered
corrections_record

Save a correction when the worker edits, rejects, or says you got something wrong in a draft you made (a quote line, a recap, a task, a reply). Keep the before, the after and the worker's reason in their words. You read these before your next draft for the shop.

Discovered
costs_job

Job costing for one job: contract, invoiced, collected and revenue against labor (approved and pending time at each entry's cost rate), materials at cost, expenses and Doing Work fees, with profit and margin. Owner or office; needs seeing costs and prices.

Discovered
costs_jobs

Job costing across jobs dated between two days (inclusive, in the shop's time zone), with totals. Sort by profit (lowest first, to find the losers), margin, or date. Up to 500 jobs; truncated says when more matched.

Discovered
costs_marginAlert

The shop's profit alert: the margin floor in percent, or null when off. Owner or office.

Discovered
costs_setMarginAlert

Set a profit alert (owner only): when an invoiced job's margin drops under below_percent, the job.margin_low event fires once for it (subscribe with a webhook). It fires again only after the margin climbs back and drops again. The check reads job costing as you see it. null turns it off.

Discovered
crews_archive

Archive a crew (owner or office). Visits already booked keep their workers.

Discovered
crews_list

The shop's crews and their current workers. Any worker in the shop can read it. Archived crews only with include_archived.

Discovered
crews_save

Save a named crew of workers to book together (owner or office). Give crew_id to rename it or replace its workers. lead_person_id marks the crew lead (a current member; they do not have to be in person_ids). Use the crew_id on visits.create, visits.assign or schedule.findTime. Shop roles are owner, office, lead and field.

Discovered
customers_archive

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

Discovered
customers_audience

Pick a customer audience by filters (tags, last job dates, kind of work, open quotes, money owed, maintenance plans, city or postal code, has email or phone) and get the counts and a page of matching customers. Read only: it sends nothing and changes nothing. Owner or office only; money filters need see_prices.

Discovered
customers_contactAdd

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

Discovered
customers_contactUpdate

Change or remove one contact of a customer.

Discovered
customers_create

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

Discovered
customers_duplicates

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

Discovered
customers_get

One customer with contacts, properties, custom fields and open balance. A field worker gets not found unless the customer has a job they are assigned to. open_balance_minor is null when see_prices is off.

Discovered
customers_list

Customers of a shop, newest first, filtered by tag, lead source or archived. A field worker sees only customers on a job they are assigned to.

Discovered
customers_merge

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

Discovered
customers_privacyExport

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

Discovered
customers_search

Find customers by name, company, email, phone or property address.

Discovered
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.

Discovered
customers_statement

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

Discovered
customers_timeline

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

Discovered
customers_update

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

Discovered
customers_winBack

Win-back list: customers with no visit in `months` (default 18; imported visits count), leaving out anyone with an open job or a visit coming up. Filter by job type words, a tag, or whether they have a maintenance plan. Each row has the last visit day, the last job, lifetime paid and whether they can be emailed or texted. Also counts who can't be contacted and shows the email they would get. Owner or office. Read only; customers.winBackQueue sends.

Discovered
customers_winBackQueue

Send the win-back note to customers from customers.winBack: adds one service due date each (title, due in the shop's lead days), so the service_due_reminders job emails them once by the usual rules. Customers who can't be emailed, or who are no longer on the win-back list, are skipped and counted. Owner only. Needs service due emails on and the shop's mailing address. No texts.

Discovered
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.

Discovered
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).

Discovered
documents_get

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

Discovered
documents_list

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

Discovered
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).

Discovered
equipment_add

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

Discovered
equipment_list

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

Discovered
equipment_update

Change or archive an equipment record.

Discovered
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.

Discovered
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.

Discovered
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.

Discovered
expenses_remove

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

Discovered
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.

Discovered
fees_preview

What Doing Work would keep on a payment of this size right now, the effective rate on it, and the owner's payment total so far this month (owner or office). Leave out amount_minor for just the month picture. The checkout may ask Stripe to hold more, then return the difference when the payment succeeds.

Discovered
fees_schedule

Doing Work's fee: the first $1,000 of payments each calendar month is free, then 0.5%, never more than $149 per owner per month. No subscription. The fee comes out of the payment.

Discovered
fees_statement

A month's Doing Work fees for a shop: payments, fees by kind, the effective rate, and each line (owner or office). volume_minor is the owner's month total the fee was based on, the same number fees.preview returns as month_volume_minor for this month. Refunds do not lower that total.

Discovered
fields_define

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

Discovered
fields_get

Custom field values on one record, with any required fields still empty. Money-type values and currency are null unless you may see prices (see_prices); key and type stay visible.

Discovered
fields_list

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

Discovered
fields_set

Set one custom field value on a customer, property, job, quote or invoice. Writing a money value does not need see_prices (read masking only; D-20261106-CF-4).

Discovered
financing_archive

Archive a financing link so it no longer shows on quotes (owner or office). Doing Work does not process financing or charge any fee for it. The link goes to the shop's own financing company.

Discovered
financing_list

The shop's financing links. Any worker in the shop can read them. Archived links only with include_archived. Doing Work does not process financing or charge any fee for it. Each link goes to the shop's own financing company.

Discovered
financing_save

Save a financing link the shop works with, shown on quotes at or above its minimum (owner or office). Up to 3 live links. Doing Work does not process financing or charge any fee for it. The link goes to the shop's own financing company.

Discovered
forms_archiveTemplate

Archive a form template so it is no longer offered. Forms made from it are unchanged.

Discovered
forms_cancel

Cancel a draft form (kept in history). A submitted form cannot be cancelled; start a corrected copy with forms.start copy_from_form_id.

Discovered
forms_fill

Save answers on a draft form. answers is an object by field key; only the keys given change, and null clears one. Values: text for text/long_text, a number, true/false for yes_no, one option for choice, a list of options for multi_choice, YYYY-MM-DD for date, photo ids already on the job for photos.

Discovered
forms_get

One form with its fields, answers, the required fields still missing, its stored PDF id and hash once submitted, and its sign-off.

Discovered
forms_list

Forms on a job (job-level and per visit), or on one visit, newest first, without fields and answers. Filter by status.

Discovered
forms_listTemplates

The shop's form templates with their fields. Archived ones only with include_archived.

Discovered
forms_requestSignOff

Ask for a signature on a submitted form and get the signing link (owner or office). The signer (the customer by default, or a shop member) signs the stored PDF exactly as submitted.

Discovered
forms_saveTemplate

Create a form template (an inspection, a safety sheet, a start-up report), or replace one (give form_template_id). Fields are in order; types: heading, text, long_text, number, yes_no, choice, multi_choice, date, photos. Forms already started keep their own copy. Owner or office.

Discovered

Recent measurements

Probe history

View status
Latest stored probes. Raw probe rows are kept for 14 days.
CheckedResultResponseTools
Connected1450 ms429