get_donations
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
| Argument | Type | Description | |
|---|---|---|---|
limitquery | integer | Page size. Defaults to 100 when absent, unparseable, or zero. | |
offsetquery | integer | Rows 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.
{
"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.
{
"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
| Field | Type | Description |
|---|---|---|
donations | array of object | |
donations[].amount | integer | CENTS. |
donations[].anonymity | "NAMED" | "ANONYMOUS" | "FULLY_ANONYMOUS" | |
donations[].createdAt | string (date-time) | ISO-8601 — this route converts the epoch, unlike the DAL fragment. |
donations[].currency | string | |
donations[].donor | object | The donor block from metadata for a NAMED gift; { "name": "Anonymous" } otherwise. Fails closed: an unselected anonymity field masks rather than discloses. |
donations[].id | string (uuid) | |
donations[].receiptURI | string | null | |
donations[].source | string | |
donations[].status | string | LOWER-CASED DAL status, e.g. "completed". |
donations[].stripePaymentIntentId | string | null | |
pageInfo | object | |
pageInfo.endCursor | string | null | |
pageInfo.hasNextPage | boolean | |
pageInfo.hasPreviousPage | boolean | |
pageInfo.startCursor | string | null | |
totalCount | integer |
When it fails
A failed call returns isError: true with the API's message as text.
403Authenticated, 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.
{
"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
}
}