{"name":"Doing Work","description":"Run a trade shop: customers, jobs, quotes, invoices, payments, visits, photos and requests. Every op is the same action the REST API and MCP server have, with the same permissions and owner approvals. Structured requests only: send one op and its input as a data part.","supportedInterfaces":[{"url":"https://doingwork.work/a2a","protocolBinding":"JSONRPC","protocolVersion":"1.0"}],"provider":{"organization":"Doing Work","url":"https://doingwork.work"},"version":"2026-11-01","documentationUrl":"https://doingwork.work/auth.md","capabilities":{"streaming":false,"pushNotifications":false,"extendedAgentCard":false},"securitySchemes":{"agentKey":{"httpAuthSecurityScheme":{"scheme":"Bearer","bearerFormat":"dwk_ named agent key","description":"A named agent key (dwk_...) for one shop, made by the shop owner or handed over after a claim. See https://doingwork.work/auth.md. OAuth tokens bound to https://doingwork.work/mcp work only there."}}},"securityRequirements":[{"schemes":{"agentKey":{"list":[]}}}],"defaultInputModes":["application/json","text/plain"],"defaultOutputModes":["application/json"],"skills":[{"id":"customers","name":"Customers and requests","description":"Customers, their properties and equipment, custom fields, incoming work requests, imports, tags and search. Send a data part {\"op\": \"<op id>\", \"input\": {...}}. Ops: customers.create, customers.get, customers.list, customers.search, customers.update, customers.archive, customers.duplicates, customers.merge, customers.contactAdd, customers.contactUpdate, properties.add, properties.list, properties.update, equipment.add, equipment.list, equipment.update, customers.timeline, customers.statement, customers.privacyExport, fields.define, fields.list, fields.set, fields.get, requests.create, requests.list, requests.pipeline, requests.get, requests.update, requests.convert, requests.formCreate, customers.setAutopay, tags.list, search.global, imports.fields, imports.preview, imports.run, customers.audience.","tags":["customers"],"examples":["{\"op\":\"customers.create\",\"input\":{}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"jobs","name":"Jobs","description":"Jobs, daily logs, documents, expenses and subcontractors. Send a data part {\"op\": \"<op id>\", \"input\": {...}}. Ops: jobs.create, jobs.list, jobs.get, jobs.requestConfirmation, subcontractors.get, subcontractors.prepare, jobs.record, jobs.setTags, jobs.findByTag, logs.add, logs.list, logs.remove, documents.photoReport, documents.dailyLog, documents.list, documents.get, expenses.add, expenses.update, expenses.remove, expenses.list, jobs.complete.","tags":["jobs"],"examples":["{\"op\":\"jobs.create\",\"input\":{}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"scheduling","name":"Scheduling","description":"Shop hours, finding open times, booking and running visits, and customer notices. Send a data part {\"op\": \"<op id>\", \"input\": {...}}. Ops: visits.createRecurring, visits.cancelSeries, visits.start, visits.done, visits.create, visits.update, visits.assign, visits.cancel, visits.get, schedule.list, availability.setHours, availability.addTimeOff, availability.removeTimeOff, availability.get, schedule.settings, schedule.setShopHours, schedule.setRules, schedule.findTime, visits.onTheWay, visits.arrived, visits.notices, visits.changeRequests, visits.answerChange.","tags":["scheduling"],"examples":["{\"op\":\"visits.createRecurring\",\"input\":{}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"quotes","name":"Quotes","description":"Quotes, the price book, quote templates and tax rates. Send a data part {\"op\": \"<op id>\", \"input\": {...}}. Ops: quotes.create, quotes.send, quotes.revise, quotes.withdraw, pricebook.saveItem, pricebook.list, pricebook.archiveItem, templates.save, templates.list, templates.archive, quotes.activity, taxes.saveRate, taxes.listRates, taxes.archiveRate, taxes.salesReport, quotes.addAttachment, quotes.removeAttachment, quotes.listAttachments.","tags":["quotes"],"examples":["{\"op\":\"quotes.create\",\"input\":{}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"invoicing","name":"Invoicing and payments","description":"Invoices, saved cards, tips, maintenance plans, fees and the shop's plan. Send a data part {\"op\": \"<op id>\", \"input\": {...}}. Ops: invoices.createFromQuote, invoices.send, fees.preview, fees.statement, invoices.setReminder, invoices.create, invoices.createBatch, invoices.get, invoices.pdf, invoices.aging, tips.report, cards.setupLink, cards.get, cards.remove, maintenance.createPlan, maintenance.getPlan, maintenance.listPlans, maintenance.setPrice, maintenance.cancelPlan, invoices.void.","tags":["invoicing"],"examples":["{\"op\":\"invoices.createFromQuote\",\"input\":{}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"photos","name":"Photos and shares","description":"Job photos and files, and share links for them. Send a data part {\"op\": \"<op id>\", \"input\": {...}}. Ops: media.requestUpload, media.list, media.get, media.tag, media.search, media.saveMarkup, media.getMarkup, shares.create, shares.list, shares.revoke.","tags":["photos"],"examples":["{\"op\":\"media.requestUpload\",\"input\":{}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"reports","name":"Reports","description":"Revenue, money owed, quote win rate, the audit log and the event catalog. Send a data part {\"op\": \"<op id>\", \"input\": {...}}. Ops: audit.list, events.catalog, reports.revenue, reports.owed, reports.quoteWinRate, reports.today, reports.week, reports.save, reports.listSaved, reports.removeSaved, reports.run.","tags":["reports"],"examples":["{\"op\":\"audit.list\",\"input\":{}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"homeowner_quotes","name":"Homeowner quote requests","description":"Homeowners send one request with photos to shops that serve the address and trade; shops reply with their own prices; the homeowner books one. Free, no lead fees. Send a data part {\"op\": \"<op id>\", \"input\": {...}}. Ops: network.listingGet, network.inbox, network.photo, network.reply, network.decline, network.markArrived, network.cancelBooking, homeowner.createRequest, homeowner.addPhoto, homeowner.sendRequest, homeowner.getRequest, homeowner.listRequests, homeowner.withdrawRequest, homeowner.pickReply, homeowner.reportNoShow.","tags":["homeowner_quotes"],"examples":["{\"op\":\"network.listingGet\",\"input\":{}}"],"inputModes":["application/json"],"outputModes":["application/json"]},{"id":"shop","name":"Shop and team","description":"The shop, members and their permissions, agent keys, approvals, webhooks, platforms and bulk changes. Send a data part {\"op\": \"<op id>\", \"input\": {...}}. Ops: auth.oauthAuthorize, me.get, shops.create, members.invite, members.accept, members.list, members.end, members.changeRole, webhooks.list, webhooks.delete, platforms.create, platforms.list, platforms.revokeManage, shops.setInvoiceReminders, shops.setContact, shops.setFieldCosts, shops.setHubLinkInEmails, shops.setQuoteFollowup, shops.setTips, shops.setReviewRequest, shops.setTaxReportBasis, webhooks.deliveries, webhooks.retry, shops.export, keys.list, keys.revoke, keys.connections, keys.revokeConnection, members.permissions, legal.status, legal.shopTerms, signatures.request, signatures.newLink, signatures.cancel, signatures.get, signatures.list, checklists.saveTemplate, checklists.listTemplates, checklists.archiveTemplate, checklists.create, checklists.list, checklists.get, checklists.checkItem, checklists.addItems, checklists.removeItem, checklists.requestSignOff, forms.saveTemplate, forms.listTemplates, forms.archiveTemplate, forms.start, forms.fill, forms.submit, forms.cancel, forms.get, forms.list, forms.requestSignOff, notes.add, notes.addVoiceMemo, notes.update, notes.remove, notes.get, notes.list, costs.job, costs.jobs, messages.templates, messages.saveTemplate, messages.resetTemplate, messages.previewTemplate, changes.create, changes.list, changes.get, changes.send, changes.cancel, changes.invoice, timesheets.clockIn, timesheets.clockOut, timesheets.current, timesheets.add, timesheets.update, timesheets.void, timesheets.decide, timesheets.reopen, timesheets.list, timesheets.setRate, timesheets.listRates, materials.add, materials.update, materials.remove, materials.list, shops.transferCancel, shops.transfers, shops.closeCheck, subs.add, subs.list, subs.update, subs.remove, subs.notes, phone.consents, phone.stop, phone.connectTwilio, phone.twilioNumbers, phone.useNumber, phone.setRoute, phone.status, phone.disconnect, phone.calls, phone.threads, phone.thread, phone.sendText, phone.registrationStatus, phone.portStatus, phone.setVoiceAi, phone.voiceAi, phone.setOutboundAi, phone.callCustomer, phone.outboundCalls, bulk.run, hub.createLink, hub.links, hub.revokeLink, approvals.listRules, approvals.list, approvals.get.","tags":["shop"],"examples":["{\"op\":\"auth.oauthAuthorize\",\"input\":{}}"],"inputModes":["application/json"],"outputModes":["application/json"]}]}