Use DoneSpan with an AI agent
Preview only. Live cleaning requests are not open yet. Browser and MCP integrations still await independent external-client acceptance.
Start here
In an agent app that supports remote MCP and browser OAuth, add DoneSpan using this server URL. You can select and copy it below.
- Add the server in your agent app. Choose its browser sign-in or authorization option.
- Review permission in DoneSpan — sign in in the browser, check the requested access and booking limit, then allow or decline.
- Return to your agent and ask it to check service coverage. Keep the request link it returns; it needs your separate permission to contact providers or book.
You do not need to copy an access token. If your app cannot complete this connection, use the browser path below. A named third-party app has not yet passed independent acceptance.
Service and availability
- Service
- Residential service coordination: Standard cleaning, Initial cleaning, Lawn mowing, Hand weeding. Cleaning applies to occupied homes; yard services have separate scope and coverage checks.
- Planned service ZIP codes
- 98036, 98037, 98043
- Current availability
- Preview only. Live cleaning requests are not open yet.
- Price and commitment
- Providers quote individually. Saving a draft does not contact providers; requesting quotes does not book a visit. Customer approval creates a pending request; the provider must separately confirm. DoneSpan does not collect payment.
Use a browser without MCP
A browser-capable agent can use the same labeled forms and links as a customer. No MCP connection is required for the website. This path is not yet independently verified with an external agent.
- Check service scope and coverage. If sign-in is unavailable, stop; do not report that a request was created.
- Have the user sign in through the normal website. Open the request form, fill the user's supplied details, and choose Save request draft. Follow links to unanswered fields.
- Obtain the user's authorization before selecting the outreach checkbox and requesting provider quotes.
- Return to the saved request URL to check progress. Compare the provider, total, timing, scope and terms before opening its booking proposal.
- Show the user the exact final quote and address-disclosure consequence. Stop for explicit approval before checking either approval box or submitting Approve — await provider confirmation. A request to find quotes is not approval to book.
- Read the booking status after submission. A pending provider confirmation is not a confirmed visit. If interrupted, reopen the saved request or proposal URL and inspect the recorded result before trying again.
Do not bypass sign-in, consent, eligibility checks or provider confirmation. Demo actions do not arrange a real visit.
Developer setup and connection check
Set up authentication
Use a client that supports remote MCP Streamable HTTP and OAuth authorization code with S256 PKCE. Configure its server URL as https://donespan.com/mcp.
- Discover
https://donespan.com/.well-known/oauth-protected-resourceand its authorization-server metadata. Use the exact discovered resource:https://donespan.com. The transport path is not part of the resource identifier. - Register a public client at
/oauth/registerwith an exact redirect URI. Generate a verifier, S256 challenge and callback state; open the advertised authorization endpoint in the customer's browser. - Request only needed scopes. For
booking:approve, includebooking_max_total_centsin the authorization request (for example,25000means $250.00 per visit). The customer signs in through DoneSpan and reviews its consent screen. Exchange the returned code using the verifier, same redirect URI and resource. Never collect the customer's sign-in credentials in the agent. - Send the access token as a Bearer credential. Access tokens last at most one hour; refresh can narrow scopes. Grants last up to 30 days and may be revoked sooner.
A deployed HTTPS origin, configured customer sign-in and OAuth storage are required. The local test configuration does not establish production readiness.
Supported capabilities
check_serviceability- Coverage only. Public REST equivalent: GET /api/v1/serviceability?postal_code=98036. MCP transport requires authentication.
jobs:create- create_job saves a draft without contacting providers.
jobs:update- update_job replaces saved DRAFT request fields using the current version. It cannot edit after provider outreach begins. Existing create-only grants need new consent for this separate permission.
jobs:read- get_job, get_offers, get_booking_readiness, get_booking and get_execution_report read owned persisted state. Readiness contains no private address data. Reports are read-only; feedback remains a first-party customer action.
quotes:request- request_quotes contacts eligible enrolled providers only with recorded outreach consent.
booking:propose- prepare_booking and request_booking_change prepare customer review.
booking:approve- approve_booking creates a pending booking only after the Agent displays the exact final quote and the user clicks confirm, and only when the quote is within the authorized maximum.
A request-to-approval journey
- Check coverage. Call
create_jobwith{"intake":{"postal_code":"98036"},"idempotency_key":"example-draft-001"}. This incomplete draft returns missing_fields. Withjobs:update, read the saved fields, ask the customer for missing details, then callupdate_jobwith job_id, expected_version, the complete replacement intake and a new idempotency_key. Otherwise follow the customer website. Keep its resource ID. - After the customer consents to outreach, call
request_quoteswith job_id, expected_version, idempotency_key,outreach_consent: trueandconsent_version: "quote_outreach.v1". Persist the returned ID and status URL. Disconnecting does not stop the durable work. - Poll get_job/get_offers at next_poll_after_seconds. After selecting a quote, read
get_booking_readinesswith job_id and offer_id. Give its handoff_url to the customer to enter the private address. Onawait_address_review, wait at the returned interval; the customer can return later. A withdrawn quote may require repricing or be unsupported. Whennext_actionisprepare_booking, prepare with the current version and a new idempotency key. A readiness read never creates a proposal. - If the grant includes
booking:approveand the quote is within its limit, show the exact scope, price, schedule and address-disclosure consequence in the Agent UI, obtain one explicit user confirmation, and callapprove_booking. Otherwise giveapproval_urlto the customer for the first-party confirmation page. - Read get_booking after reconnect. PENDING_PROVIDER is not CONFIRMED. Change requests leave the original booking intact while review, customer approval and any required provider reconfirmation proceed.
Retries and revocation
Use a stable 8–128 character idempotency key for each mutation. Letters, digits, dots, underscores, colons and dashes are accepted. REST uses the Idempotency-Key header; MCP uses idempotency_key. Identical commands share replay protection across transports within the same grant. A changed payload with the same key conflicts.
After reauthorization, read saved IDs before creating anything again: a new grant has a new key namespace. Inspect error.code and error.retryable before retrying. MCP command failures use isError and an error JSON text item; authentication failures return HTTP 401. Resolve relative REST status/approval links against this application origin.
Revoke access in Connected agents. Revocation blocks reads, writes, replay and refresh. It does not cancel previously authorized work. A 401 requires reauthorization; a 403 indicates missing permission or an action unavailable to agents.
Run the developer connection check
From the repository after npm ci, use Node 24.11 or newer and run node --experimental-strip-types scripts/agent-connection-check.ts. Provide DONESPAN_ORIGIN and the already consented DONESPAN_ACCESS_TOKEN through your environment. Keep tokens out of logs and source files.
The official MCP client SDK discovers the server, lists tools, checks coverage, disconnects and reconnects. It performs no mutations and uses normal HTTPS certificate validation. It is a developer diagnostic; customer sign-in and named third-party app acceptance are separate checks.
Verification status
Local synthetic tests cover native browser consent/callback/revocation and persisted MCP/REST commands using protocol 2025-11-25. Implementation versions: Agents 0.23.0, MCP server SDK 2.0.0, Cloudflare OAuth Provider 0.10.3.
AT18 still requires a named and versioned independently operated user-owned client, real identity login, disconnect/reconnect, customer approval handoff and revocation evidence. The OpenAPI document covers public catalog, delegated reads/writes and the customer-owned execution-report read; provider/operator and customer-only write contracts remain outside it.