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.
22 tools: 4 can delete or cancel things and 18 only read.
Scanned Oct 21, 2026
- Deletes or cancels4Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things0Claude Code: ask
- Only reads18Claude Code: allow: see these tools
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/mcpTools
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/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .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.