# Shiftbase MCP Muse connector

From musedirectory.ai, the independent directory of Meta Muse connectors. Not affiliated with Meta.

## Shiftbase MCP

View and manage employee schedules, timesheets, absences and availability in Shiftbase

- Record: https://musedirectory.ai/connector/shiftbase-mcp
- Category: Productivity
- Developer: usefulapi (https://usefulapi.io/shiftbase/)
- Muse status: Extra setup. Not in Muse's Connectors list yet. Muse can still use it: its page gives you a request to paste into Muse.
- Health: Working, 167ms, checked 2026-10-29T10:31:19Z
- Endpoint: https://shiftbase.usefulapi.io/mcp
- Auth: No account needed; Pricing: unknown
- Screening: Screened, no issues found (2026-10-29T12:41:40Z)
- Source: Found in the official MCP Registry (io.usefulapi/shiftbase) https://registry.modelcontextprotocol.io/v0/servers?search=io.usefulapi%2Fshiftbase

Connects to Shiftbase workforce management. Read rosters, timesheets, absences and employee availability. Schedule shifts, request time off, and review absence requests. Requires Shiftbase account and appropriate permissions.

Example request: "Show me who is scheduled to work next week and let me know if anyone has requested time off."

How to connect: Not in Muse's Connectors list yet, but Muse can still use it. Paste this into Muse: "Use Shiftbase MCP to help me. It is a free service with an MCP server at https://shiftbase.usefulapi.io/mcp. It does not need an API key. Ask me before you share anything with it." Muse asks before it shares anything with the app's site. Meta does not review apps used this way, so only use ones you trust. We tested this in the Muse app on September 24, 2026: Muse used an app's link directly this way and returned a live answer.

Tools:
- shiftbase_get_account: The Shiftbase account this API key belongs to: company, country, time zone, working-day start/end, plan facts. GET /accounts.
- shiftbase_list_users: 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.
- shiftbase_get_user: One employee by user id or email address, with teams and departments. GET /users/{identifier}.
- shiftbase_list_departments: List departments (sites/branches that own teams, shifts and schedules) with address and timesheet/clocking settings. GET /departments.
- shiftbase_list_teams: List teams (the rows of the schedule within a department), optionally for one department. GET /teams.
- shiftbase_list_locations: List active locations (addresses that group departments). GET /locations.
- shiftbase_list_shift_types: 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.
- shiftbase_list_rosters: 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_upd
- shiftbase_get_roster: One scheduled shift by its occurrence_id, with the employee, shift type, team and who created/changed it. GET /rosters/{occurrenceId}.
- shiftbase_list_open_shifts: 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.
- shiftbase_get_availability: 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).
- shiftbase_list_timesheets: 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.
- shiftbase_get_timesheet: One timesheet by id, with its clocked breaks. GET /timesheets/{timesheetId}.
- shiftbase_list_clocked_in: Who is clocked in right now: employee, since when, their scheduled shift, team, department and location. GET /timesheets/clock.
- shiftbase_list_absences: 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.
- shiftbase_get_absence: One absence by id, with the per-day hours and who reviewed it. GET /absentees/{absenteeId}.
- shiftbase_list_absence_types: 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.
- shiftbase_get_expected_absence_hours: 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.
- shiftbase_create_roster: 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.
- shiftbase_update_roster: 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 da
- shiftbase_request_absence: 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 a
- shiftbase_review_absence: 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}.

Screening checks:
- MCP handshake: pass (Answered in 149ms)
- Domain against threat feeds (Cloudflare security DNS): pass (shiftbase.usefulapi.io, usefulapi.io not flagged)
- Published packages against the OSV malicious-package database: n/a (No npm or PyPI package published)
- Hidden instructions or invisible characters in tool text: pass (22 tools read, nothing found)
- Inputs asking for passwords, card numbers or seed phrases: pass (None found)
- Domain and redirects: pass (No redirects off the domain)
- AI review of purpose and tool behavior: pass (No concerns)
