*MCP › Reference › Operations › Staff*

# Update a staff member

> Updates the ORGANIZATIONAL record of a staff member (send only the fields to change): collection, tags, driving license, visibility in the planner and the external reference used to match them with the record in your system.

Identity, contact details and employment terms cannot be written here. Returns the updated member.

TOOL `filmo_staff_update` · `staff:write` · 120/min · Server annotation: Idempotent

## Arguments

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `staffId` | string | Yes | Staff member identifier. |
| `fullName` | string | No | Full name. |
| `staffType` | string | No | Engagement type with the company. `employee`, `freelancer`, `contractor` |
| `collectionId` | string | No | Collection it belongs to; null removes them from any collection. |
| `tags` | string[] | No | Tags by identifier or name. Replaces the whole list. |
| `hasDrivingLicense` | boolean | No | Whether they hold a driving licence. |
| `showInPlanner` | boolean | No | Whether they appear as an assignable resource in the planner. |
| `externalRef` | string | No | Reference in the integrator system. It is the field used to match the two records; null clears it. |
| `idempotencyKey` | string | No | Idempotency key chosen by the client (a UUID is recommended). Repeating the same key with the same arguments within 24 h returns the stored response without executing again; with different arguments it responds 422. It is the safe way to retry after a network failure. |
| `ifMatch` | string | No | Optimistic locking: the meta.etag you got from the detail read of this resource (or "*"). If the resource changed since, the call fails with 412 precondition_failed before writing anything; read it again and retry. Omit it to write unconditionally. |

## Result

On success the result carries `structuredContent` with `data` and `meta`. These are the attributes of `data`.

| Name | Type | Description |
| --- | --- | --- |
| `id` | string | Unique staff member identifier. |
| `fullName` | string | Full name. |
| `staffType` | string | Staff member type. `employee`, `freelancer`, `contractor` |
| `collectionId` | string | Identifier of the collection it belongs to; null if it is in none. |
| `collectionName` | string | Collection path it belongs to; null if not applicable. |
| `hasDrivingLicense` | boolean | true if they hold a driving licence. |
| `showInPlanner` | boolean | true if they appear in the planner of the account. |
| `externalRef` | string | External reference for matching with third-party systems; null if it has none. |
| `createdAt` | string<date-time> | Creation date in ISO 8601 UTC; null if not recorded. |
| `updatedAt` | string<date-time> | Last modification date in ISO 8601 UTC; null if not recorded. |

*Call · filmo_staff_update*

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "filmo_staff_update",
    "arguments": {
      "staffId": "staf_8f2a1c"
    }
  }
}
```

*Result (generated from the schema)*

```json
{
  "structuredContent": {
    "data": {
      "id": "id_8f2a1c",
      "fullName": "Example",
      "staffType": "employee",
      "collectionId": "coll_8f2a1c",
      "collectionName": "Example",
      "hasDrivingLicense": true,
      "showInPlanner": true,
      "externalRef": "<externalRef>",
      "createdAt": "2026-09-01T08:00:00Z",
      "updatedAt": "2026-09-01T08:00:00Z"
    },
    "meta": {
      "idempotencyKey": "<the key you sent, or the one the server generated>",
      "rateLimit": {
        "limit": 120,
        "remaining": 119,
        "reset": 42
      }
    }
  }
}
```

## The same operation by REST

This tool runs [`PATCH /api/v1/staff/{staffId}`](https://docs.filmo.io/rest-api/endpoint-reference/staff/update-a-staff-member).

---

Canonical URL: https://docs.filmo.io/mcp/tools/staff/filmo-staff-update  
Last updated: 2026-10-25