get_groups
Calls GET /api/groups as the signed-in person · REST reference
List groups, scoped to the caller's organizations
Requires query:ListGroupsQuery; platform staff bypass that gate. BOUNDED BY THE CALLER'S ORG TREE — the organizations in which the caller holds admin.groups.view and every organization beneath them — for every caller, platform staff included; a caller holding it in no organization is refused 403. With orgId that org must be in the caller's tree (403 ORG_ACCESS_DENIED otherwise), and the caller gets that org's groups; without orgId, the groups of every org in the tree, fetched one org at a time. Another organization's groups are read by impersonating one of its people. ENVELOPE SHAPE — { success, data, singleOrgModel }, not the bare array that GET /api/users and /api/orgs/tree return. singleOrgModel is a constant true marker, not a computed property of the result. Rows are Group MODEL objects, not DAL entities: createdAt/updatedAt are ISO-8601 strings, type and status are defaulted when the entity omits them, and an organization: { id } stub is synthesised from orgId.
Arguments
| Argument | Type | Description | |
|---|---|---|---|
orgIdquery | string (uuid) | Must be a UUID when present, and an org in the caller's tree: one they hold admin.groups.view in, or an org beneath one. |
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_groups",
"arguments": {}
}
}Result
On success (HTTP 200) the tool returns one text item holding the API's JSON, pretty-printed.
The visible groups, wrapped in the success envelope.
{
"data": [
{
"createdAt": "2026-01-15T12:00:00Z",
"id": "11111111-1111-4111-8111-111111111111",
"memberCount": 1,
"name": "string",
"status": "ACTIVE",
"type": "FUNCTIONAL",
"allowFallthrough": true,
"config": {},
"createdBy": "11111111-1111-4111-8111-111111111111",
"description": "string",
"inviteOnly": true,
"metadata": {},
"orgId": "11111111-1111-4111-8111-111111111111",
"organization": {}
}
],
"singleOrgModel": true,
"success": true
}Fields
| Field | Type | Description |
|---|---|---|
data | array of object | |
data[].allowFallthrough | boolean | Defaults to true when the entity does not say otherwise. |
data[].config | object | |
data[].createdAt | string (date-time) | |
data[].createdBy | string (uuid) | null | |
data[].description | string | null | |
data[].id | string (uuid) | |
data[].inviteOnly | boolean | |
data[].memberCount | integer | Projected by the DAL, not stored on the node. |
data[].metadata | object | |
data[].name | string | |
data[].orgId | string (uuid) | null | |
data[].organization | object | null | Stub built from orgId: { id } and nothing else. |
data[].organization.id | string (uuid) | |
data[].status | "ACTIVE" | "INACTIVE" | "ARCHIVED" | |
data[].type | "FUNCTIONAL" | "DEPARTMENTAL" | "ROLE_BASED" | "PROJECT" | "ADMIN" | "OWNER" | … (7 values) | |
data[].updatedAt | string (date-time) | |
singleOrgModel | true | Constant marker, always true. |
success | true |
When it fails
A failed call returns isError: true with the API's message as text.
400orgIdwas supplied and is not a UUID. Note the array-shapeddetails.403Missing
query:ListGroupsQuery, noadmin.groups.viewin any org, ororgIdnames an org where the caller does not hold it — the last carriescode: ORG_ACCESS_DENIED.
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_groups",
"description": "GET /api/groups — Requires `query:ListGroupsQuery`; platform staff bypass that gate. BOUNDED BY THE CALLER'S ORG TREE — the organizations in which the caller holds `admin.groups.view` and every organization beneath them — for every caller, platform staff included; a caller holding it in no organization is refused 403. With `orgId` that org must be in the caller's tree (403 `ORG_ACCESS_DENIED` otherwise), and the caller gets that org's groups; without `orgId`, the groups of every org in the tree, fetched one org at a time. Another organization's groups are read by impersonating one of its people. ENVELOPE SHAPE — `{ success, data, singleOrgModel }`, not the bare array that `GET /api/users` and `/api/orgs/tree` return. `singleOrgModel` is a constant `true` marker, not a computed property of the result. Rows are `Group` MODEL objects, not DAL entities: `createdAt`/`updatedAt` are ISO-8601 strings, `type` and `status` are defaulted when the entity omits them, and an `organization: { id }` stub is synthesised from `orgId`.",
"inputSchema": {
"type": "object",
"properties": {
"orgId": {
"type": "string",
"description": "Must be a UUID when present, and an org in the caller's tree: one they hold `admin.groups.view` in, or an org beneath one."
}
}
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false
}
}