capture_consent
Notifications · Write · account-scoped
Record a customer's notification consent at the counter — the record every send tool requires.
Usage
The intake step for a pure-MCP relationship: without a consent record, every send tool on this server correctly refuses with no-consent. This tool creates that record — and it writes a legal consent record, so the capture is two steps by construction:
- Call without
attested— nothing is written. The response is the exact disclosure text to read to the customer verbatim (no paraphrase, summary, or translation), plus its version. - After the customer clearly agrees, re-call with
attested: trueand thedisclosureVersionfrom step 1. A version the server doesn't know — or one that's no longer current — refuses, because a consent pointing at text that was never shown is worse than no record at all.
The record stores the normalized destination, the exact disclosure version, and method verbal_attested — the audit trail never dresses an agent-mediated verbal capture up as a signed form. The response includes the customerId the quote and invoice send paths match on (generated when the shop has no reference of its own).
There is no revoke through this surface: customers opt out themselves via the link in any email or STOP by SMS, and a destination on the suppression list stays unreachable even with a fresh consent — the capture succeeds but says so.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
channel | "email" | "sms" | Yes | Which channel the customer is opting into. Example: "email" |
scope | "quote" | "invoice" | "both" | Yes | What the shop may send: quote approvals, invoice pay links, or both. Example: "both" |
destination | string | Yes | The customer's email or phone, exactly as they gave it — it is normalized before storage. Example: "casey@example.com" |
customerId | string | No | The shop's reference for this customer, when one exists (e.g. from the work order). Omit and a stable reference is generated. Example: "cust_casey" |
attested | boolean | No | Pass true ONLY after the disclosure text (from calling this tool without attested) was read to the customer verbatim and they agreed. Example: true |
disclosureVersion | string | No | Required with attested: the version from the disclosure prompt, pinning exactly which text the customer heard. Example: "2026-08-19.v1" |
Description advertised to clients
The exact description a fully entitled MCP client discovers — the workflow contracts travel with the tool, so a client with no system prompt still uses it correctly. An account missing a licence for content this tool reaches sees the same text behind a [Licensed content — not enabled on this account] or [Partially available] notice:
Record a customer's notification consent at the counter — the record every send tool on this server requires before it will message anyone. THIS TOOL WRITES A LEGAL CONSENT RECORD for the authenticated account's shop; it writes NOTHING to MOTOR — DaaS stays read-only. CAPTURE IS TWO STEPS AND THE FIRST WRITES NOTHING: call without
attestedto receive the exact disclosure text — READ IT TO THE CUSTOMER VERBATIM (do not paraphrase, summarize, or translate it) — then, only after they clearly agree, re-call with attested: true and the disclosureVersion from the prompt. Calling attested without the customer having heard the disclosure creates a false legal record — never do it. The record stores the normalized destination, the exact disclosure version, and method "verbal_attested"; the response includes the customerId that quote and invoice sends will match on. There is NO revoke through this surface: the customer opts out themselves via the link in any message (email) or STOP (SMS), and a destination that opted out stays unreachable even with a fresh consent. The shop is NEVER a parameter: it resolves from the authenticated account.
Example — Two-step capture at the counter
Illustrative payload shapes; the disclosure text is the live current version, verbatim.
Request
{
"channel": "email",
"scope": "both",
"destination": "casey@example.com",
"attested": true,
"disclosureVersion": "2026-08-19.v1"
}
Response
{
"captured": true,
"consentId": "cons_…",
"customerId": "cust_mcp_…",
"channel": "email",
"scope": "both",
"destination": "casey@example.com",
"disclosureVersion": "2026-08-19.v1",
"method": "verbal_attested",
"capturedAt": "2026-08-21T15:10:00.000Z"
}
The same call without attested returns {captured: false, disclosureText, disclosureVersion, instruction} and writes nothing — that's the step where the customer actually hears the disclosure.