put_groups_by_id

Changes data · you confirm first Idempotent

Calls PUT /api/groups/{id} as the signed-in person · REST reference

Update a group, without moving it between organizations

Requires execute:UpdateGroupCommand; platform staff bypass that gate, everyone else must belong to the group's org (403 GROUP_MODIFY_DENIED). orgId IS BLOCKED TWICE, both at 400 with different bodies: the validator rejects the key's mere presence with "Validation failed" and an array-shaped details, so the in-handler guard that answers with code: ORG_CHANGE_BLOCKED is only reachable if the validator is bypassed. Both preserve the single-organization model. Only name, description and type are copied onto the model. A body naming permissions is a 400: a group grants what its roles grant (PUT /api/org-admin/groups/{groupId}/roles).

Arguments

ArgumentTypeDescription
idpathstring (uuid)required
bodyJSONobjectrequiredThe request body, as a JSON object. Its fields are listed below.

Fields of body

FieldTypeDescription
descriptionstring
namestring
orgIdstringMust be ABSENT. Its presence — even matching the group's current org — is a 400 from the validator.
type"FUNCTIONAL" | "DEPARTMENTAL" | "ROLE_BASED" | "PROJECT"

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": "put_groups_by_id",
    "arguments": {
      "id": "11111111-1111-4111-8111-111111111111",
      "body": {
        "description": "string",
        "name": "string",
        "orgId": "string",
        "type": "FUNCTIONAL"
      }
    }
  }
}
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 updated group, wrapped in the success envelope with a message.

json
{
  "data": {
    "createdAt": "2026-01-15T12:00:00Z",
    "id": "11111111-1111-4111-8111-111111111111",
    "name": "string",
    "status": "ACTIVE",
    "type": "string",
    "description": "string",
    "memberCount": 1,
    "orgId": "11111111-1111-4111-8111-111111111111",
    "updatedAt": "2026-01-15T12:00:00Z"
  },
  "message": "string",
  "success": true
}

Fields

FieldTypeDescription
dataobjectThe mutated Group model, echoed BEFORE the DAL entity is read back — fields the DAL ignored still appear here with the submitted value.
data.createdAtstring (date-time)
data.descriptionstring | null
data.idstring (uuid)
data.memberCountinteger
data.namestring
data.orgIdstring (uuid) | null
data.status"ACTIVE" | "INACTIVE" | "ARCHIVED"
data.typestring
data.updatedAtstring (date-time)
messagestring
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

Validator rejection (bad id, bad field, or any orgId key) with an ARRAY details; or the in-handler org-change guard with code: ORG_CHANGE_BLOCKED.

403

Missing execute:UpdateGroupCommand, or the caller does not belong to the group's org (code: GROUP_MODIFY_DENIED).

404

No such group. Carries code: GROUP_NOT_FOUND.

409

The DAL refused the change as the group stands: another group of the org has that name, or the change would retype an OWNER or MEMBER group. Carries the DAL's sentence.

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": "put_groups_by_id",
  "description": "PUT /api/groups/{id} — Requires `execute:UpdateGroupCommand`; platform staff bypass that gate, everyone else must belong to the group's org (403 `GROUP_MODIFY_DENIED`). `orgId` IS BLOCKED TWICE, both at 400 with different bodies: the validator rejects the key's mere presence with \"Validation failed\" and an array-shaped `details`, so the in-handler guard that answers with `code: ORG_CHANGE_BLOCKED` is only reachable if the validator is bypassed. Both preserve the single-organization model. Only `name`, `description` and `type` are copied onto the model. A body naming `permissions` is a 400: a group grants what its roles grant (`PUT /api/org-admin/groups/{groupId}/roles`).\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"
      },
      "body": {
        "type": "string",
        "description": "The JSON request body: { description: string; name: string; orgId: string (Must be ABSENT.); type: one of \"FUNCTIONAL\" | \"DEPARTMENTAL\" | \"ROLE_BASED\" | \"PROJECT\" }"
      }
    },
    "required": [
      "id",
      "body"
    ]
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": true,
    "idempotentHint": true,
    "openWorldHint": false
  }
}