Skip to content

RotaCloud MCP by usefulapi

by usefulapi.io · remote · no sign-in to list tools · v1.7.3 · published by io.usefulapi

Read RotaCloud shifts, attendance, leave, availability and payroll; create shifts and handle leave.

Deletes · 6

26 tools: 6 can delete or cancel things and 20 only read.

Scanned Oct 21, 2026

No check matched anything in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http rotacloud https://rotacloud.usefulapi.io/mcp

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

26 tools

Deletes or cancels 6Claude Code: deny
  • rotacloud_approve_leave_requestWRITE: approve a pending leave request (it becomes booked leave and the employee is notified).No findings

    Why it is in this group

    • The name "rotacloud_approve_leave_request" says "approve": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: approve a pending leave request (it becomes booked leave and the employee is notified). POST /leave_requests/{id}/approve.

    Annotations the server declares

    • title: Approve leave request
    • destructiveHint: true
    • idempotentHint: true
  • rotacloud_create_leave_requestWRITE: submit a leave request on behalf of an employee (sent as that user, for a manager to approve).No findings

    Why it is in this group

    • The name "rotacloud_create_leave_request" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: submit a leave request on behalf of an employee (sent as that user, for a manager to approve). POST /leave_requests with the User header.

    Annotations the server declares

    • title: Request leave
    • destructiveHint: true
  • rotacloud_create_shiftWRITE: create a shift on the rota.No findings

    Why it is in this group

    • The name "rotacloud_create_shift" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: create a shift on the rota. Leave user_id out for an open shift. Unpublished by default (employees see it once published). POST /shifts.

    Annotations the server declares

    • title: Create shift
    • destructiveHint: true
  • rotacloud_deny_leave_requestWRITE: deny a pending leave request (the employee is notified).No findings

    Why it is in this group

    • The name "rotacloud_deny_leave_request" says "request": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: deny a pending leave request (the employee is notified). POST /leave_requests/{id}/deny.

    Annotations the server declares

    • title: Deny leave request
    • destructiveHint: true
    • idempotentHint: true
  • rotacloud_publish_shiftsWRITE: publish shifts so the assigned employees see them (and get notified).No findings

    Why it is in this group

    • The name "rotacloud_publish_shifts" says "publish": a word for a change that another call does not undo.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: publish shifts so the assigned employees see them (and get notified). POST /shifts_published.

    Annotations the server declares

    • title: Publish shifts
    • destructiveHint: true
    • idempotentHint: true
  • rotacloud_update_shiftWRITE: change a shift's times, assignee, location, role, break, notes or published state.No findings

    Why it is in this group

    • The name "rotacloud_update_shift" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: change a shift's times, assignee, location, role, break, notes or published state. Only the fields you pass change. POST /shifts/{id}.

    Annotations the server declares

    • title: Update shift
    • destructiveHint: true
    • idempotentHint: true
Only reads 20Claude Code: allow
  • rotacloud_get_availabilityEmployees' availability per date in a range (available / unavailable times).No findings

    Why it is in this group

    • The name "rotacloud_get_availability" says "get": a word for reading.
    Description, as the server wrote it
    Employees' availability per date in a range (available / unavailable times). GET /availability.

    Annotations the server declares

    • title: Get availability
    • readOnlyHint: true
  • rotacloud_get_leave_requestOne leave request by id, with the per-day breakdown.No findings

    Why it is in this group

    • The name "rotacloud_get_leave_request" says "get": a word for reading.
    Description, as the server wrote it
    One leave request by id, with the per-day breakdown. GET /leave_requests/{id}.

    Annotations the server declares

    • title: Get leave request
    • readOnlyHint: true
  • rotacloud_get_payrollPayroll for one pay period, per employee: pay settings, attendance worked, paid/unpaid leave, overtime and pay totals.No findings

    Why it is in this group

    • The name "rotacloud_get_payroll" says "get": a word for reading.
    Description, as the server wrote it
    Payroll for one pay period, per employee: pay settings, attendance worked, paid/unpaid leave, overtime and pay totals. Contains pay data. GET /pay_periods/{id}/payroll.

    Annotations the server declares

    • title: Get payroll for a pay period
    • readOnlyHint: true
  • rotacloud_get_shiftOne shift by id.No findings

    Why it is in this group

    • The name "rotacloud_get_shift" says "get": a word for reading.
    Description, as the server wrote it
    One shift by id. GET /shifts/{id}.

    Annotations the server declares

    • title: Get shift
    • readOnlyHint: true
  • rotacloud_get_userOne employee by id.No findings

    Why it is in this group

    • The name "rotacloud_get_user" says "get": a word for reading.
    Description, as the server wrote it
    One employee by id. GET /users/{id}.

    Annotations the server declares

    • title: Get user
    • readOnlyHint: true
  • rotacloud_list_accountsThe RotaCloud account(s) this API key belongs to: name, plan, time zone, employee count.No findings

    Why it is in this group

    • The name "rotacloud_list_accounts" says "list": a word for reading.
    Description, as the server wrote it
    The RotaCloud account(s) this API key belongs to: name, plan, time zone, employee count. GET /accounts.

    Annotations the server declares

    • title: List accounts
    • readOnlyHint: true
  • rotacloud_list_attendanceList time & attendance records (clock-in/out times, breaks, minutes late, hours, approval state) in a time range.No findings

    Why it is in this group

    • The name "rotacloud_list_attendance" says "list": a word for reading.
    Description, as the server wrote it
    List time & attendance records (clock-in/out times, breaks, minutes late, hours, approval state) in a time range. GET /attendance.

    Annotations the server declares

    • title: List attendance records
    • readOnlyHint: true
  • rotacloud_list_clocked_inWho is clocked in right now: user, location, role, clock-in time, minutes late and break state.No findings

    Why it is in this group

    • The name "rotacloud_list_clocked_in" says "list": a word for reading.
    Description, as the server wrote it
    Who is clocked in right now: user, location, role, clock-in time, minutes late and break state. GET /users_clocked_in.

    Annotations the server declares

    • title: List clocked-in users
    • readOnlyHint: true
  • rotacloud_list_day_notesList day notes (notices pinned to rota dates, e.g.No findings

    Why it is in this group

    • The name "rotacloud_list_day_notes" says "list": a word for reading.
    Description, as the server wrote it
    List day notes (notices pinned to rota dates, e.g. events or deliveries), optionally for one location. GET /day_notes.

    Annotations the server declares

    • title: List day notes
    • readOnlyHint: true
  • rotacloud_list_days_offEmployees' scheduled days off per date in a range.No findings

    Why it is in this group

    • The name "rotacloud_list_days_off" says "list": a word for reading.
    Description, as the server wrote it
    Employees' scheduled days off per date in a range. GET /days_off.

    Annotations the server declares

    • title: List days off
    • readOnlyHint: true
  • rotacloud_list_holiday_allowancesEvery employee's holiday allowance for a leave year (default and custom allowance, unit, carried over).No findings

    Why it is in this group

    • The name "rotacloud_list_holiday_allowances" says "list": a word for reading.
    Description, as the server wrote it
    Every employee's holiday allowance for a leave year (default and custom allowance, unit, carried over). GET /holiday_allowances/{year}.

    Annotations the server declares

    • title: List holiday allowances
    • readOnlyHint: true
  • rotacloud_list_leaveList booked leave (holiday, sickness, etc.) with type, user, dates, hours and status.No findings

    Why it is in this group

    • The name "rotacloud_list_leave" says "list": a word for reading.
    Description, as the server wrote it
    List booked leave (holiday, sickness, etc.) with type, user, dates, hours and status. Filter by date range or leave year, users and leave types; pending/denied/expired requests are excluded unless asked for. GET /leave.

    Annotations the server declares

    • title: List leave
    • readOnlyHint: true
  • rotacloud_list_leave_requestsList leave requests awaiting a decision (and past ones): user, leave type, dates, half days, the employee's message.No findings

    Why it is in this group

    • The name "rotacloud_list_leave_requests" says "list": a word for reading.
    Description, as the server wrote it
    List leave requests awaiting a decision (and past ones): user, leave type, dates, half days, the employee's message. GET /leave_requests.

    Annotations the server declares

    • title: List leave requests
    • readOnlyHint: true
  • rotacloud_list_leave_typesList leave types (Holiday, Sickness, Unpaid, ...) with id, short name and whether employees can request them.No findings

    Why it is in this group

    • The name "rotacloud_list_leave_types" says "list": a word for reading.
    Description, as the server wrote it
    List leave types (Holiday, Sickness, Unpaid, ...) with id, short name and whether employees can request them. GET /leave_types.

    Annotations the server declares

    • title: List leave types
    • readOnlyHint: true
  • rotacloud_list_locationsList locations (sites/branches) with address, time zone and managers.No findings

    Why it is in this group

    • The name "rotacloud_list_locations" says "list": a word for reading.
    Description, as the server wrote it
    List locations (sites/branches) with address, time zone and managers. GET /locations.

    Annotations the server declares

    • title: List locations
    • readOnlyHint: true
  • rotacloud_list_pay_periodsList pay periods overlapping a date range (id, name, start/end date, locked).No findings

    Why it is in this group

    • The name "rotacloud_list_pay_periods" says "list": a word for reading.
    Description, as the server wrote it
    List pay periods overlapping a date range (id, name, start/end date, locked). GET /pay_periods.

    Annotations the server declares

    • title: List pay periods
    • readOnlyHint: true
  • rotacloud_list_rolesList job roles (positions) with colour, default break and pay rate.No findings

    Why it is in this group

    • The name "rotacloud_list_roles" says "list": a word for reading.
    Description, as the server wrote it
    List job roles (positions) with colour, default break and pay rate. GET /roles.

    Annotations the server declares

    • title: List roles
    • readOnlyHint: true
  • rotacloud_list_shiftsList rota shifts in a time range: start/end times (Unix seconds), break, assigned user (null = open shift), location, role, notes, published and acknowledged state.No findings

    Why it is in this group

    • The name "rotacloud_list_shifts" says "list": a word for reading.
    Description, as the server wrote it
    List rota shifts in a time range: start/end times (Unix seconds), break, assigned user (null = open shift), location, role, notes, published and acknowledged state. Filter by users, locations, roles, open or published. GET /shifts.

    Annotations the server declares

    • title: List shifts
    • readOnlyHint: true
  • rotacloud_list_swap_requestsList shift swap requests with their status, the shifts and the users involved.No findings

    Why it is in this group

    • The name "rotacloud_list_swap_requests" says "list": a word for reading.
    Description, as the server wrote it
    List shift swap requests with their status, the shifts and the users involved. GET /swap_requests.

    Annotations the server declares

    • title: List shift swap requests
    • readOnlyHint: true
  • rotacloud_list_usersList employees (users) with their level, roles, locations, contact details and pay settings.No findings

    Why it is in this group

    • The name "rotacloud_list_users" says "list": a word for reading.
    Description, as the server wrote it
    List employees (users) with their level, roles, locations, contact details and pay settings. Use it to map user ids in shifts, leave and attendance to names. GET /users.

    Annotations the server declares

    • title: List users
    • readOnlyHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.7.3. Values in angle brackets are yours to fill in.

claude mcp add --transport http rotacloud https://rotacloud.usefulapi.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__rotacloud__rotacloud_list_accounts",
      "mcp__rotacloud__rotacloud_list_users",
      "mcp__rotacloud__rotacloud_get_user",
      "mcp__rotacloud__rotacloud_list_locations",
      "mcp__rotacloud__rotacloud_list_roles",
      "mcp__rotacloud__rotacloud_list_shifts",
      "mcp__rotacloud__rotacloud_get_shift",
      "mcp__rotacloud__rotacloud_list_swap_requests",
      "mcp__rotacloud__rotacloud_list_day_notes",
      "mcp__rotacloud__rotacloud_list_attendance",
      "mcp__rotacloud__rotacloud_list_clocked_in",
      "mcp__rotacloud__rotacloud_list_leave",
      "mcp__rotacloud__rotacloud_list_leave_requests",
      "mcp__rotacloud__rotacloud_get_leave_request",
      "mcp__rotacloud__rotacloud_list_leave_types",
      "mcp__rotacloud__rotacloud_list_holiday_allowances",
      "mcp__rotacloud__rotacloud_get_availability",
      "mcp__rotacloud__rotacloud_list_days_off",
      "mcp__rotacloud__rotacloud_list_pay_periods",
      "mcp__rotacloud__rotacloud_get_payroll"
    ],
    "ask": [],
    "deny": [
      "mcp__rotacloud__rotacloud_create_shift",
      "mcp__rotacloud__rotacloud_update_shift",
      "mcp__rotacloud__rotacloud_publish_shifts",
      "mcp__rotacloud__rotacloud_create_leave_request",
      "mcp__rotacloud__rotacloud_approve_leave_request",
      "mcp__rotacloud__rotacloud_deny_leave_request"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as rotacloud. Review it before you use it.