post_approvals_signups_by_id_approve

Changes data · you confirm first

Calls POST /api/approvals/signups/{id}/approve as the signed-in person · REST reference

Approve a pending organization signup

Approves the signup in the graph and emails the contact a welcome message. The email is BEST EFFORT — a mail failure is logged and the approval still answers 200, so a 200 does not mean the applicant was told. The path id is the CONTACT USER id, exactly as GET /api/approvals/signups returns it in each row's id, not the org id. Answers the { success, data } envelope, unlike its sibling reject route which answers { success } alone. An id with no pending signup is 404 (the DAL's sentence), an id that is not a UUID 400, an unreachable DAL 503, any other failure 500 — never upstream text.

Arguments

ArgumentTypeDescription
idpathstring (uuid)requiredContact user id of the signup, from the queue row's id.

Example call

A client sends this over the MCP session; Claude and other agents build it for you. The values are placeholders — the shape is real.

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "post_approvals_signups_by_id_approve",
    "arguments": {
      "id": "11111111-1111-4111-8111-111111111111"
    }
  }
}
Confirmation
The client shows the person the exact request and waits. Nothing runs until they tick Make this change. See Reading and changing.

Result

On success (HTTP 200) the tool returns one text item holding the API's JSON, pretty-printed.

The signup was approved. The row is the post-approval state.

json
{
  "data": {
    "address": "string",
    "businessTypes": [
      "string"
    ],
    "contactName": "string",
    "createdAt": 1,
    "email": "name@example.org",
    "id": "11111111-1111-4111-8111-111111111111",
    "orgId": "11111111-1111-4111-8111-111111111111",
    "organizationName": "string",
    "organizationType": "string",
    "phone": "string",
    "status": "string",
    "taxId": "string"
  },
  "success": true
}

Fields

FieldTypeDescription
dataobjectThe same row shape GET /api/approvals/signups returns, with status now reflecting the approval.
data.addressstring | null
data.businessTypesarray of string
data.contactNamestring
data.createdAtintegerEpoch MILLISECONDS.
data.emailstring (email)
data.idstring (uuid)The contact user id.
data.orgIdstring (uuid)
data.organizationNamestring
data.organizationTypestring
data.phonestring | null
data.statusstring
data.taxIdstring | null
successtrue

When it fails

A failed call returns isError: true with the API's message as text. A change the person declines, or lets time out, also comes back this way and nothing changes.

400

The request was malformed or failed a guard.

403

Authenticated, but the caller holds none of the required permissions.

404

No such resource — or none this caller may see.

What the model is shown

This is the tool exactly as the server lists it in tools/list. The description starts with the REST call it makes.

json
{
  "name": "post_approvals_signups_by_id_approve",
  "description": "POST /api/approvals/signups/{id}/approve — Approves the signup in the graph and emails the contact a welcome message. The email is BEST EFFORT — a mail failure is logged and the approval still answers 200, so a 200 does not mean the applicant was told. The path id is the CONTACT USER id, exactly as `GET /api/approvals/signups` returns it in each row's `id`, not the org id. Answers the `{ success, data }` envelope, unlike its sibling reject route which answers `{ success }` alone. An id with no pending signup is 404 (the DAL's sentence), an id that is not a UUID 400, an unreachable DAL 503, any other failure 500 — never upstream text.\n\nThis changes data. The person is asked to confirm it before it runs, and nothing happens if they decline.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Contact user id of the signup, from the queue row's `id`."
      }
    },
    "required": [
      "id"
    ]
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": true,
    "idempotentHint": false,
    "openWorldHint": false
  }
}