get_groups_by_id_members
Calls GET /api/groups/{id}/members as the signed-in person · REST reference
List a group's memberships
Requires query:ListGroupsQuery — the plain group READ permission, not a membership-specific one — and the group's org in the caller's org tree, admin.groups.view held there or in an org above it (403 GROUP_VIEW_DENIED); platform staff bypass only the permission gate. A caller holding admin.groups.view in no org is refused 403 before the group is looked up. Rows are DAL GroupMembershipDetail records passed through unchanged, so timestamps are epoch MILLISECONDS. The DAL's roster applies: REMOVED and DECLINED memberships are left out, and every other state — INVITED, REQUESTED and REJECTED included — is returned. A caller wanting effective members filters on status itself (ACTIVE and APPROVED confer authority). There is no pagination: the DAL's default page of 50 is taken as-is. Envelope shape { success, data }, not a bare array.
Arguments
| Argument | Type | Description | |
|---|---|---|---|
idpath | string (uuid) | required |
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_by_id_members",
"arguments": {
"id": "11111111-1111-4111-8111-111111111111"
}
}
}Result
On success (HTTP 200) the tool returns one text item holding the API's JSON, pretty-printed.
The group's membership records, in the success envelope.
{
"data": [
{
"createdAt": 1,
"id": "string",
"roles": [],
"status": "ACCEPTED",
"updatedAt": 1,
"acceptedAt": 1,
"activatedAt": 1,
"approvedAt": 1,
"approvedBy": "string",
"invitedAt": 1,
"invitedBy": "string",
"metadata": {},
"rejectedAt": 1,
"rejectedBy": "string"
}
],
"success": true
}Fields
| Field | Type | Description |
|---|---|---|
data | array of object | |
data[].acceptedAt | number | null | |
data[].activatedAt | number | null | |
data[].approvedAt | number | null | |
data[].approvedBy | string | null | |
data[].createdAt | number | |
data[].id | string | |
data[].invitedAt | number | null | |
data[].invitedBy | string | null | |
data[].metadata | object | null | |
data[].rejectedAt | number | null | |
data[].rejectedBy | string | null | |
data[].rejectionReason | string | null | |
data[].removalReason | string | null | |
data[].removedAt | number | null | |
data[].removedBy | string | null | |
data[].roles | array of string | |
data[].status | "ACCEPTED" | "ACTIVE" | "APPROVED" | "DECLINED" | "INVITED" | "REJECTED" | … (8 values) | |
data[].updatedAt | number | |
success | true |
When it fails
A failed call returns isError: true with the API's message as text.
400idis not a UUID.403Missing
query:ListGroupsQuery, noadmin.groups.viewin any org, or none in the group's org (code: GROUP_VIEW_DENIED).404No such group. Carries
code: GROUP_NOT_FOUND.
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_by_id_members",
"description": "GET /api/groups/{id}/members — Requires `query:ListGroupsQuery` — the plain group READ permission, not a membership-specific one — and the group's org in the caller's org tree, `admin.groups.view` held there or in an org above it (403 `GROUP_VIEW_DENIED`); platform staff bypass only the permission gate. A caller holding `admin.groups.view` in no org is refused 403 before the group is looked up. Rows are DAL `GroupMembershipDetail` records passed through unchanged, so timestamps are epoch MILLISECONDS. The DAL's roster applies: REMOVED and DECLINED memberships are left out, and every other state — INVITED, REQUESTED and REJECTED included — is returned. A caller wanting effective members filters on `status` itself (ACTIVE and APPROVED confer authority). There is no pagination: the DAL's default page of 50 is taken as-is. Envelope shape `{ success, data }`, not a bare array.",
"inputSchema": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
]
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false
}
}