Skip to content

Shiftbase MCP by usefulapi

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

Read Shiftbase rosters, timesheets, absences and availability; schedule shifts and review absences.

Deletes · 4

22 tools: 4 can delete or cancel things and 18 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 shiftbase https://shiftbase.usefulapi.io/mcp

Tools

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

22 tools

Deletes or cancels 4Claude Code: deny
  • shiftbase_create_rosterWRITE: put one employee on the schedule for one date (a single, non-recurring shift) in a team, with a shift type, start/end time and break.No findings

    Why it is in this group

    • The name "shiftbase_create_roster" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: put one employee on the schedule for one date (a single, non-recurring shift) in a team, with a shift type, start/end time and break. The employee is notified only when notify is true. POST /rosters.

    Annotations the server declares

    • title: Schedule a shift
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • shiftbase_request_absenceWRITE: add an absence (leave/time-off request) for an employee.No findings

    Why it is in this group

    • The name "shiftbase_request_absence" says "request": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: add an absence (leave/time-off request) for an employee. By default it is a Pending request for a manager to review; status Approved books it directly (needs the approve-absence permission). The hours per day come from Shiftbase's own expected-hours calculation (the same as shiftbase_get_expected_absence_hours). Needs the Basic plan. POST /absentees.

    Annotations the server declares

    • title: Request an absence
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • shiftbase_review_absenceWRITE: approve or decline an absence request.No findings

    Why it is in this group

    • The description's first verb is "write": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: approve or decline an absence request. Reads the absence first and sends it back unchanged except for the status (needs the approve-absence permission). PUT /absentees/{absenteeId}.

    Annotations the server declares

    • title: Approve or decline an absence
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • shiftbase_update_rosterWRITE: change a scheduled shift: move it to another date, time, employee, team or shift type, or change its break or note.No findings

    Why it is in this group

    • The name "shiftbase_update_roster" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    WRITE: change a scheduled shift: move it to another date, time, employee, team or shift type, or change its break or note. Reads the shift first and sends it back with your changes. For a recurring shift, scope says what changes: "occurrence" (this date only), "sequence" (this date and all later ones) or "original" (the whole series; also the right scope for a non-recurring shift). PUT /rosters/{occurrenceId}/{scope}.

    Annotations the server declares

    • title: Change a scheduled shift
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
Only reads 18Claude Code: allow
  • shiftbase_get_absenceOne absence by id, with the per-day hours and who reviewed it.No findings

    Why it is in this group

    • The name "shiftbase_get_absence" says "get": a word for reading.
    Description, as the server wrote it
    One absence by id, with the per-day hours and who reviewed it. GET /absentees/{absenteeId}.

    Annotations the server declares

    • title: Get absence
    • readOnlyHint: true
  • shiftbase_get_accountThe Shiftbase account this API key belongs to: company, country, time zone, working-day start/end, plan facts.No findings

    Why it is in this group

    • The name "shiftbase_get_account" says "get": a word for reading.
    Description, as the server wrote it
    The Shiftbase account this API key belongs to: company, country, time zone, working-day start/end, plan facts. GET /accounts.

    Annotations the server declares

    • title: Get account
    • readOnlyHint: true
  • shiftbase_get_availabilityEmployee availability (available / unavailable, all day or from a time) for a date range of at most 62 days, from Shiftbase's availability report.No findings

    Why it is in this group

    • The name "shiftbase_get_availability" says "get": a word for reading.
    Description, as the server wrote it
    Employee availability (available / unavailable, all day or from a time) for a date range of at most 62 days, from Shiftbase's availability report. Needs the Basic plan and the "View reports" permission. POST /reports/availability (export json; reads only).

    Annotations the server declares

    • title: Get employee availability
    • readOnlyHint: true
  • shiftbase_get_expected_absence_hoursHow many hours an absence would cost for an employee, per day and in total (from the schedule or the contract, per the absence policy), for a period of at most 366 days.No findings

    Why it is in this group

    • The name "shiftbase_get_expected_absence_hours" says "get": a word for reading.
    Description, as the server wrote it
    How many hours an absence would cost for an employee, per day and in total (from the schedule or the contract, per the absence policy), for a period of at most 366 days. Changes nothing. POST /absentees/expected.

    Annotations the server declares

    • title: Get expected absence hours
    • readOnlyHint: true
  • shiftbase_get_rosterOne scheduled shift by its occurrence_id, with the employee, shift type, team and who created/changed it.No findings

    Why it is in this group

    • The name "shiftbase_get_roster" says "get": a word for reading.
    Description, as the server wrote it
    One scheduled shift by its occurrence_id, with the employee, shift type, team and who created/changed it. GET /rosters/{occurrenceId}.

    Annotations the server declares

    • title: Get scheduled shift
    • readOnlyHint: true
  • shiftbase_get_timesheetOne timesheet by id, with its clocked breaks.No findings

    Why it is in this group

    • The name "shiftbase_get_timesheet" says "get": a word for reading.
    Description, as the server wrote it
    One timesheet by id, with its clocked breaks. GET /timesheets/{timesheetId}.

    Annotations the server declares

    • title: Get timesheet
    • readOnlyHint: true
  • shiftbase_get_userOne employee by user id or email address, with teams and departments.No findings

    Why it is in this group

    • The name "shiftbase_get_user" says "get": a word for reading.
    Description, as the server wrote it
    One employee by user id or email address, with teams and departments. GET /users/{identifier}.

    Annotations the server declares

    • title: Get employee
    • readOnlyHint: true
  • shiftbase_list_absence_typesList absence types (e.g.No findings

    Why it is in this group

    • The name "shiftbase_list_absence_types" says "list": a word for reading.
    Description, as the server wrote it
    List absence types (e.g. Holiday, Sick, Unpaid leave): name, unit (hours or days), whether it costs leave hours, colour. Their ids are the absence_type_id for absences. GET /absentee_options.

    Annotations the server declares

    • title: List absence types
    • readOnlyHint: true
  • shiftbase_list_absencesList absences (leave, sick leave, other time off) overlapping a date range of at most 366 days: employee, absence type, start/end date, hours or days, status Approved/Declined/Pend…No findings

    Why it is in this group

    • The name "shiftbase_list_absences" says "list": a word for reading.
    Description, as the server wrote it
    List absences (leave, sick leave, other time off) overlapping a date range of at most 366 days: employee, absence type, start/end date, hours or days, status Approved/Declined/Pending and who reviewed it. Needs the Basic plan. GET /absentees.

    Annotations the server declares

    • title: List absences
    • readOnlyHint: true
  • shiftbase_list_clocked_inWho is clocked in right now: employee, since when, their scheduled shift, team, department and location.No findings

    Why it is in this group

    • The name "shiftbase_list_clocked_in" says "list": a word for reading.
    Description, as the server wrote it
    Who is clocked in right now: employee, since when, their scheduled shift, team, department and location. GET /timesheets/clock.

    Annotations the server declares

    • title: List clocked-in employees
    • readOnlyHint: true
  • shiftbase_list_departmentsList departments (sites/branches that own teams, shifts and schedules) with address and timesheet/clocking settings.No findings

    Why it is in this group

    • The name "shiftbase_list_departments" says "list": a word for reading.
    Description, as the server wrote it
    List departments (sites/branches that own teams, shifts and schedules) with address and timesheet/clocking settings. GET /departments.

    Annotations the server declares

    • title: List departments
    • readOnlyHint: true
  • shiftbase_list_locationsList active locations (addresses that group departments).No findings

    Why it is in this group

    • The name "shiftbase_list_locations" says "list": a word for reading.
    Description, as the server wrote it
    List active locations (addresses that group departments). GET /locations.

    Annotations the server declares

    • title: List locations
    • readOnlyHint: true
  • shiftbase_list_open_shiftsList open (unassigned) shifts that employees can pick up, for a date range of at most 62 days (default: today).No findings

    Why it is in this group

    • The name "shiftbase_list_open_shifts" says "list": a word for reading.
    Description, as the server wrote it
    List open (unassigned) shifts that employees can pick up, for a date range of at most 62 days (default: today). Needs the Basic plan or higher. GET /open_shifts.

    Annotations the server declares

    • title: List open shifts
    • readOnlyHint: true
  • shiftbase_list_rostersList the schedule (rosters = shifts assigned to employees) for a date range of at most 62 days: date, start/end time, break, employee, team, shift type, department, published state…No findings

    Why it is in this group

    • The name "shiftbase_list_rosters" says "list": a word for reading.
    Description, as the server wrote it
    List the schedule (rosters = shifts assigned to employees) for a date range of at most 62 days: date, start/end time, break, employee, team, shift type, department, published state, hours and cost. Each item's occurrence_id identifies it for shiftbase_get_roster and shiftbase_update_roster. GET /rosters.

    Annotations the server declares

    • title: List scheduled shifts
    • readOnlyHint: true
  • shiftbase_list_shift_typesList shift types (the templates a scheduled shift uses: name, short name, default start/end time and break), optionally for one department.No findings

    Why it is in this group

    • The name "shiftbase_list_shift_types" says "list": a word for reading.
    Description, as the server wrote it
    List shift types (the templates a scheduled shift uses: name, short name, default start/end time and break), optionally for one department. Their ids are the shift_id for shiftbase_create_roster. GET /shifts.

    Annotations the server declares

    • title: List shift types
    • readOnlyHint: true
  • shiftbase_list_teamsList teams (the rows of the schedule within a department), optionally for one department.No findings

    Why it is in this group

    • The name "shiftbase_list_teams" says "list": a word for reading.
    Description, as the server wrote it
    List teams (the rows of the schedule within a department), optionally for one department. GET /teams.

    Annotations the server declares

    • title: List teams
    • readOnlyHint: true
  • shiftbase_list_timesheetsList timesheets (worked hours: clock in/out, breaks, total, status Approved/Declined/Pending, wage and surcharges) for a date range of at most 62 days.No findings

    Why it is in this group

    • The name "shiftbase_list_timesheets" says "list": a word for reading.
    Description, as the server wrote it
    List timesheets (worked hours: clock in/out, breaks, total, status Approved/Declined/Pending, wage and surcharges) for a date range of at most 62 days. GET /timesheets.

    Annotations the server declares

    • title: List timesheets
    • readOnlyHint: true
  • shiftbase_list_usersList employees (users) with their teams and departments, contact details, employee number, start/end dates and plus-min hours balance.No findings

    Why it is in this group

    • The name "shiftbase_list_users" says "list": a word for reading.
    Description, as the server wrote it
    List employees (users) with their teams and departments, contact details, employee number, start/end dates and plus-min hours balance. Use it to map user ids in schedules, timesheets and absences to names. Identity, bank and birth data are never returned. GET /users.

    Annotations the server declares

    • title: List employees
    • 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 shiftbase https://shiftbase.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__shiftbase__shiftbase_get_account",
      "mcp__shiftbase__shiftbase_list_users",
      "mcp__shiftbase__shiftbase_get_user",
      "mcp__shiftbase__shiftbase_list_departments",
      "mcp__shiftbase__shiftbase_list_teams",
      "mcp__shiftbase__shiftbase_list_locations",
      "mcp__shiftbase__shiftbase_list_shift_types",
      "mcp__shiftbase__shiftbase_list_rosters",
      "mcp__shiftbase__shiftbase_get_roster",
      "mcp__shiftbase__shiftbase_list_open_shifts",
      "mcp__shiftbase__shiftbase_get_availability",
      "mcp__shiftbase__shiftbase_list_timesheets",
      "mcp__shiftbase__shiftbase_get_timesheet",
      "mcp__shiftbase__shiftbase_list_clocked_in",
      "mcp__shiftbase__shiftbase_list_absences",
      "mcp__shiftbase__shiftbase_get_absence",
      "mcp__shiftbase__shiftbase_list_absence_types",
      "mcp__shiftbase__shiftbase_get_expected_absence_hours"
    ],
    "ask": [],
    "deny": [
      "mcp__shiftbase__shiftbase_create_roster",
      "mcp__shiftbase__shiftbase_update_roster",
      "mcp__shiftbase__shiftbase_request_absence",
      "mcp__shiftbase__shiftbase_review_absence"
    ]
  }
}

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 shiftbase. Review it before you use it.