Skip to content

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.

Deletes · 6

21 tools: 6 can delete or cancel things and 15 only read.

Scanned Oct 21, 2026

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/mcp

Findings

Matches of fixed checks, with the text they matched.

1 info

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".

      Matched text

      description: "...ld accounts. A cheap way to confirm the credentials work. When I Work: GET /2/account."

      What this check looks for
    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/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__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.