get_donations

Read-only

Calls GET /api/donations as the signed-in person · REST reference

List donations across every organization

Platform staff only, and the gate is load-bearing - this route is NOT org-scoped, so it returns every organization's gifts, and a NAMED gift carries the donor block. Donor identity is masked by the record's own anonymity flag alone (fromDALDonation fails CLOSED, treating an unselected anonymity as ANONYMOUS), which is the only thing protecting donor PII here. Pagination is limit/offset and both are parsed with parseInt: a non-numeric or zero limit silently becomes 100 and a bad offset becomes 0 rather than being rejected. createdAt on each row is an ISO-8601 string, because this route converts the DAL's epoch-milliseconds DateTime.

Arguments

ArgumentTypeDescription
limitqueryintegerPage size. Defaults to 100 when absent, unparseable, or zero.
offsetqueryintegerRows to skip. Defaults to 0 when absent or unparseable.

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": "get_donations",
    "arguments": {}
  }
}

Result

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

A page of donations, plus the DAL's own paging cursor and true total.

json
{
  "donations": [
    {
      "amount": 1,
      "anonymity": "NAMED",
      "currency": "string",
      "id": "11111111-1111-4111-8111-111111111111",
      "status": "string",
      "createdAt": "2026-01-15T12:00:00Z",
      "donor": {},
      "receiptURI": "string",
      "source": "string",
      "stripePaymentIntentId": "string"
    }
  ],
  "pageInfo": {
    "hasNextPage": true,
    "hasPreviousPage": true,
    "endCursor": "string",
    "startCursor": "string"
  },
  "totalCount": 1
}

Fields

FieldTypeDescription
donationsarray of object
donations[].amountintegerCENTS.
donations[].anonymity"NAMED" | "ANONYMOUS" | "FULLY_ANONYMOUS"
donations[].createdAtstring (date-time)ISO-8601 — this route converts the epoch, unlike the DAL fragment.
donations[].currencystring
donations[].donorobjectThe donor block from metadata for a NAMED gift; { "name": "Anonymous" } otherwise. Fails closed: an unselected anonymity field masks rather than discloses.
donations[].idstring (uuid)
donations[].receiptURIstring | null
donations[].sourcestring
donations[].statusstringLOWER-CASED DAL status, e.g. "completed".
donations[].stripePaymentIntentIdstring | null
pageInfoobject
pageInfo.endCursorstring | null
pageInfo.hasNextPageboolean
pageInfo.hasPreviousPageboolean
pageInfo.startCursorstring | null
totalCountinteger

When it fails

A failed call returns isError: true with the API's message as text.

403

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

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": "get_donations",
  "description": "GET /api/donations — Platform staff only, and the gate is load-bearing - this route is NOT org-scoped, so it returns every organization's gifts, and a NAMED gift carries the donor block. Donor identity is masked by the record's own anonymity flag alone (`fromDALDonation` fails CLOSED, treating an unselected anonymity as ANONYMOUS), which is the only thing protecting donor PII here. Pagination is limit/offset and both are parsed with parseInt: a non-numeric or zero `limit` silently becomes 100 and a bad `offset` becomes 0 rather than being rejected. `createdAt` on each row is an ISO-8601 string, because this route converts the DAL's epoch-milliseconds DateTime.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "limit": {
        "type": "string",
        "description": "Page size. Defaults to 100 when absent, unparseable, or zero."
      },
      "offset": {
        "type": "string",
        "description": "Rows to skip. Defaults to 0 when absent or unparseable."
      }
    }
  },
  "annotations": {
    "readOnlyHint": true,
    "openWorldHint": false
  }
}