When I Work MCP by usefulapi
by usefulapi.io · remote · no sign-in to list tools · v1.16.3 · published by io.usefulapi
Check shifts, time clock entries, time-off requests, swaps and availability, and manage shifts.
21 tools: 6 can delete or cancel things and 15 only read.
Scanned Oct 21, 2026
- Deletes or cancels6Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things0Claude Code: ask
- Only reads15Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http when-i-work https://when-i-work.usefulapi.io/mcpFindings
Matches of fixed checks, with the text they matched.
The description mentions "credentials".
What this check looks forMatched text
description: "...ld accounts. A cheap way to confirm the credentials work. When I Work: GET /2/account."
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
21 tools
Deletes or cancels 6Claude Code: deny
wheniwork_create_shiftCreate one shift on a schedule — assigned to a user, or open (user_id 0).No findings
Why it is in this group
- The name "wheniwork_create_shift" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Create one shift on a schedule — assigned to a user, or open (user_id 0). Created as a draft unless published is true. Undo by editing it or unpublishing. When I Work: POST /2/shifts.
Annotations the server declares
- title: Create a shift
- destructiveHint: true
wheniwork_create_time_off_requestCreate a time-off request for a user (default the calling user).No findings
Why it is in this group
- The name "wheniwork_create_time_off_request" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Create a time-off request for a user (default the calling user). It starts pending; cancel it with wheniwork_update_time_off_request (status 1). Get type ids from wheniwork_list_time_off_types. When I Work: POST /2/requests.
Annotations the server declares
- title: Create a time-off request
- destructiveHint: true
wheniwork_publish_shiftsPublish draft shifts so employees can see them.No findings
Why it is in this group
- The name "wheniwork_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 Publish draft shifts so employees can see them. Publishing does not itself send notifications. Undo with wheniwork_unpublish_shifts. When I Work: POST /2/shifts/publish.
Annotations the server declares
- title: Publish shifts
- destructiveHint: true
wheniwork_unpublish_shiftsReturn published shifts to draft, hiding them from employees.No findings
Why it is in this group
- The description's first verb is "return": a word for reading.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Return published shifts to draft, hiding them from employees. Undo with wheniwork_publish_shifts. When I Work: POST /2/shifts/unpublish.
Annotations the server declares
- title: Unpublish shifts
- destructiveHint: true
wheniwork_update_shiftChange a shift — reassign it, move it, change position or notes.No findings
Why it is in this group
- The name "wheniwork_update_shift" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Change a shift — reassign it, move it, change position or notes. When I Work requires start_time, end_time and location_id on every update, so fetch the shift first and pass them back. This tool never sends a breaks array; When I Work documents that breaks omitted from an update's breaks list are removed, so re-check the shift's breaks afterwards. When I Work: PUT /2/shifts/{id}.
Annotations the server declares
- title: Update a shift
- destructiveHint: true
wheniwork_update_time_off_requestChange a time-off request: set its status (0 pending, 1 canceled, 2 accepted/approved, 3 expired, 4 denied) and/or its dates or hours.No findings
Why it is in this group
- The name "wheniwork_update_time_off_request" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Change a time-off request: set its status (0 pending, 1 canceled, 2 accepted/approved, 3 expired, 4 denied) and/or its dates or hours. Reversible — set the status back. start_time and end_time must be given together. When I Work: PUT /2/requests/{request_id}.
Annotations the server declares
- title: Approve, deny or change a time-off request
- destructiveHint: true
Only reads 15Claude Code: allow
wheniwork_get_accountFetch the When I Work account (workplace) the token acts on — company name, plan and settings; for a parent account also its child accounts.1 finding
Why it is in this group
- The name "wheniwork_get_account" says "get": a word for reading.
Findings
- Info
The description mentions "credentials".
What this check looks forMatched text
description: "...ld accounts. A cheap way to confirm the credentials work. When I Work: GET /2/account."
Description, as the server wrote it Fetch the When I Work account (workplace) the token acts on — company name, plan and settings; for a parent account also its child accounts. A cheap way to confirm the credentials work. When I Work: GET /2/account.
Annotations the server declares
- title: Get the account
- readOnlyHint: true
wheniwork_get_shiftFetch one shift by id, including its breaks and publish state.No findings
Why it is in this group
- The name "wheniwork_get_shift" says "get": a word for reading.
Description, as the server wrote it Fetch one shift by id, including its breaks and publish state. When I Work: GET /2/shifts/{id}.
Annotations the server declares
- title: Get one shift
- readOnlyHint: true
wheniwork_get_time_off_requestFetch one time-off request by id, with its message thread and users.No findings
Why it is in this group
- The name "wheniwork_get_time_off_request" says "get": a word for reading.
Description, as the server wrote it Fetch one time-off request by id, with its message thread and users. When I Work: GET /2/requests/{request_id}.
Annotations the server declares
- title: Get one time-off request
- readOnlyHint: true
wheniwork_get_userFetch one user by id — name, email, role, positions, schedules, wage.No findings
Why it is in this group
- The name "wheniwork_get_user" says "get": a word for reading.
Description, as the server wrote it Fetch one user by id — name, email, role, positions, schedules, wage. When I Work: GET /2/users/{id}.
Annotations the server declares
- title: Get one user
- readOnlyHint: true
wheniwork_list_annotationsList schedule annotations — announcements, business-closed days and blackout dates when time off is not allowed.No findings
Why it is in this group
- The name "wheniwork_list_annotations" says "list": a word for reading.
Description, as the server wrote it List schedule annotations — announcements, business-closed days and blackout dates when time off is not allowed. Defaults to today through one year out. When I Work: GET /2/annotations.
Annotations the server declares
- title: List schedule annotations
- readOnlyHint: true
wheniwork_list_availabilityList availability events — when people said they can or cannot work, including recurring patterns that fall in the window.No findings
Why it is in this group
- The name "wheniwork_list_availability" says "list": a word for reading.
Description, as the server wrote it List availability events — when people said they can or cannot work, including recurring patterns that fall in the window. Defaults to the caller, from now to two weeks out. When I Work: GET /2/availabilityevents.
Annotations the server declares
- title: List availability
- readOnlyHint: true
wheniwork_list_eligible_users_for_shiftFind who could take an open shift — either an existing shift (shift_id) or a hypothetical one (start, end, position_id and location_id all required).No findings
Why it is in this group
- The name "wheniwork_list_eligible_users_for_shift" says "list": a word for reading.
Description, as the server wrote it Find who could take an open shift — either an existing shift (shift_id) or a hypothetical one (start, end, position_id and location_id all required). When I Work: GET /2/shifts/eligible.
Annotations the server declares
- title: List users eligible for an open shift
- readOnlyHint: true
wheniwork_list_locationsList the schedules in the account.No findings
Why it is in this group
- The name "wheniwork_list_locations" says "list": a word for reading.
Description, as the server wrote it List the schedules in the account. The API calls a schedule a "location"; its id is the location_id every shift belongs to. When I Work: GET /2/locations.
Annotations the server declares
- title: List schedules (locations)
- readOnlyHint: true
wheniwork_list_positionsList the positions (job roles such as Cashier or Dishwasher) in the account.No findings
Why it is in this group
- The name "wheniwork_list_positions" says "list": a word for reading.
Description, as the server wrote it List the positions (job roles such as Cashier or Dishwasher) in the account. When I Work: GET /2/positions.
Annotations the server declares
- title: List positions
- readOnlyHint: true
wheniwork_list_shift_swapsList shift requests: swaps, drops and alerts, with the shifts and users involved.No findings
Why it is in this group
- The name "wheniwork_list_shift_swaps" says "list": a word for reading.
Description, as the server wrote it List shift requests: swaps, drops and alerts, with the shifts and users involved. Status: 0 pending, 1 approved, 2 declined, 3 completed, 4 canceled, 5 expired. Type: 1 swap, 2 drop, 3 alert. start and end must be given together. When I Work: GET /2/swaps.
Annotations the server declares
- title: List shift swaps and drops
- readOnlyHint: true
wheniwork_list_shiftsList scheduled shifts in a time window — who works when, where and in which position — optionally including open shifts and unpublished drafts.No findings
Why it is in this group
- The name "wheniwork_list_shifts" says "list": a word for reading.
Description, as the server wrote it List scheduled shifts in a time window — who works when, where and in which position — optionally including open shifts and unpublished drafts. Answers "who is on on Friday?" and "what open shifts are left?". When I Work: GET /2/shifts.
Annotations the server declares
- title: List shifts
- readOnlyHint: true
wheniwork_list_time_off_requestsList time-off requests in a date range, with the requesting users.No findings
Why it is in this group
- The name "wheniwork_list_time_off_requests" says "list": a word for reading.
Description, as the server wrote it List time-off requests in a date range, with the requesting users. Status: 0 pending, 1 canceled, 2 accepted, 3 expired, 4 denied. When I Work: GET /2/requests.
Annotations the server declares
- title: List time-off requests
- readOnlyHint: true
wheniwork_list_time_off_typesList the time-off types (e.g.No findings
Why it is in this group
- The name "wheniwork_list_time_off_types" says "list": a word for reading.
Description, as the server wrote it List the time-off types (e.g. Personal, Sick, Holiday) and whether each allows paid time. Their ids are the type_id for a new request. When I Work: GET /2/requesttypes.
Annotations the server declares
- title: List time-off types
- readOnlyHint: true
wheniwork_list_timesList clocked time entries — actual hours worked, clock-in/out times, length and approval state.No findings
Why it is in this group
- The name "wheniwork_list_times" says "list": a word for reading.
Description, as the server wrote it List clocked time entries — actual hours worked, clock-in/out times, length and approval state. Use only_open to see who is clocked in right now. When I Work: GET /2/times.
Annotations the server declares
- title: List clocked times (timesheets)
- readOnlyHint: true
wheniwork_list_usersList the employees, supervisors, managers and admins in the account, optionally limited to some schedules or searched by name/email.No findings
Why it is in this group
- The name "wheniwork_list_users" says "list": a word for reading.
Description, as the server wrote it List the employees, supervisors, managers and admins in the account, optionally limited to some schedules or searched by name/email. Role codes: 1 admin, 2 manager, 3 employee, 5 supervisor. When I Work: GET /2/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.16.3. Values in angle brackets are yours to fill in.
claude mcp add --transport http when-i-work https://when-i-work.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__when-i-work__wheniwork_get_account",
"mcp__when-i-work__wheniwork_list_users",
"mcp__when-i-work__wheniwork_get_user",
"mcp__when-i-work__wheniwork_list_locations",
"mcp__when-i-work__wheniwork_list_positions",
"mcp__when-i-work__wheniwork_list_shifts",
"mcp__when-i-work__wheniwork_get_shift",
"mcp__when-i-work__wheniwork_list_eligible_users_for_shift",
"mcp__when-i-work__wheniwork_list_times",
"mcp__when-i-work__wheniwork_list_time_off_requests",
"mcp__when-i-work__wheniwork_get_time_off_request",
"mcp__when-i-work__wheniwork_list_time_off_types",
"mcp__when-i-work__wheniwork_list_shift_swaps",
"mcp__when-i-work__wheniwork_list_availability",
"mcp__when-i-work__wheniwork_list_annotations"
],
"ask": [],
"deny": [
"mcp__when-i-work__wheniwork_create_shift",
"mcp__when-i-work__wheniwork_update_shift",
"mcp__when-i-work__wheniwork_publish_shifts",
"mcp__when-i-work__wheniwork_unpublish_shifts",
"mcp__when-i-work__wheniwork_create_time_off_request",
"mcp__when-i-work__wheniwork_update_time_off_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 when-i-work. Review it before you use it.