---
title: "When I Work MCP server for AI agents - actionlake"
description: "Give Claude 120 When I Work actions through one MCP server: shifts, users, times. Your agent never holds the credential. 100,000 calls a month free."
canonical: https://actionlake.com/connectors/when-i-work
updated: 2026-10-23
---

Connectors · Accounting & finance

# When I Work MCP server for AI agents.

actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to When I Work and the rest of your systems. It gives your agent 120 When I Work actions (50 reads, 52 writes and 18 that wait for a confirmation) and holds the When I Work credential itself, so the agent never does. It paces When I Work's limits and records every call.

[Connect When I Work free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.

`claude mcp add --transport http actionlake https://connect.actionlake.com/mcp`

the first call

```
do {
  action: "when_i_work.users.list",
  intent: "check which When I Work account is connected"
}
# List Users · read · 1 upstream call
```

- 120 actions in one signed file
- 50 read look, never change
- 52 write create and update
- 18 wait for a yes destructive, confirmed first

Set up

## Connect When I Work in three steps.

1. 01
   ### Add actionlake to Claude.
   Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
   `https://connect.actionlake.com/mcp`
2. 02
   ### Connect When I Work.
   Session login. actionlake opens the session and renews it when it expires. actionlake stores what you paste write-only, sealed under your tenant's key.
   - `developer_key` When I Work developer key (request one from When I Work via the developer/API page; sent as the W-Key header on login)
   - `email` Email address of the When I Work user the connection acts as (an account admin or manager for full access)
   - `password` Password of that When I Work user
   - `user_id` Your When I Work user id
   ```
   account { op: "connections.requirements", service: "when_i_work" }
   # free: exactly what to paste, and what is found for you
   ```
3. 03
   ### Make the first call. Check before a write.
   Ask in plain words; Claude picks the action. Before anything changes, `check` validates the call and prices it, for free.
   ```
   do    { action: "when_i_work.users.list" }
   # list users · read · 1 upstream call
   check { action: "when_i_work.users.create", input: { … } }
   # free: inputs, permissions, cost and confirmations, nothing sent
   ```

When I Work at a glance

**Sign-in**

Session login. actionlake opens the session and renews it when it expires.

**You provide**

`developer_key` `email` `password`

**Setup fields**

`user_id`

**Limits we pace to**

300 calls a minute, per connection

**API covered**

When I Work API v2/v3 (OpenAPI 3.1.0) plus Login Service`api.wheniwork.com`

**Built from**

When I Work's documentation, read 23 October 2026[apidocs.wheniwork.com](https://apidocs.wheniwork.com/external/monolith/docs-master.json) [apidocs.wheniwork.com](https://apidocs.wheniwork.com/external/login/docs-master.json)

**Service file**

Version 1.0.0, signed (Ed25519)

**Cached reads**

49 of 50 reads, for up to 5 minutes; a write clears what it affects

**Shared entities**

3, so ask can line When I Work up with your other systems

**Data**

Processed and stored in Sydney, Australia. No US region yet

Capabilities

## What an AI agent can do in When I Work.

120 actions in 23 areas. Every one carries its effect, so a key can allow the reads and hold the rest.

- **50** read look, never change
- **52** write create and update
- **18** destructive wait for a confirmation

1. ### Shifts
   17
   6 read · 9 write · 2 destructive
   List Shifts · Create Shift · Get Shift · Update Shift
2. ### Users
   11
   3 read · 7 write · 1 destructive
   List Users · Create User · Get User · Update User
3. ### Times
   7
   2 read · 4 write · 1 destructive
   List Times · Create Time · Update Time · Get Time
4. ### Availability events
   6
   2 read · 3 write · 1 destructive
   Create Availability Event · List Availability Events · Get Availability Event · Update Availability Event
5. ### Positions
   6
   2 read · 3 write · 1 destructive
   List Positions · Create Position · Get Position · Update Position
6. ### Account
   5
   2 read · 3 write · 0 destructive
   Create Account · Get Account · Update Account · List Admins
7. ### Annotations
   5
   2 read · 2 write · 1 destructive
   Create Annotation · List Annotations · Get Annotation · Update Annotation
8. ### Locations
   5
   2 read · 2 write · 1 destructive
   List Schedules (Locations) · Create Schedule (Location) · Get Schedule (Location) · Update Schedule (Location)

**15 more areas · 58 actions**

- Openshift approval requests **5**
- Payrolls **5**
- Schedule templates **5**
- Shift breaks **5**
- Shift requests **5**
- Shift templates **5**
- Sites **5**
- Time off requests **5**
- Paid rest records **4**
- Time off request types **4**
- Imports **3**
- People **3**
- Timezones **2**
- Punch **1**
- Scheduled breaks **1**

Top actions

## The When I Work API, shaped for agents.

The ids your agent types, what each does, and the one name it shares with other systems. 43 of When I Work's 50 action names are shared with at least one other connector, so an agent learns them once.

| Action | What it does | Effect | Same name in |
| --- | --- | --- | --- |
| `when_i_work.users.list` List Users | List Users. | read | `hr.employee.list` 61 connectors |
| `when_i_work.locations.list` List Schedules (Locations) | List Schedules (Locations). | read | `hr.location.list` 32 connectors |
| `when_i_work.users.create` Create User | Create User. | write | `hr.employee.create` 51 connectors |
| `when_i_work.locations.create` Create Schedule (Location) | Create Schedule (Location). | write | `hr.location.create` 23 connectors |
| `when_i_work.times.list` List Times | List Times. | read | `hr.time_clock_entry.list` 15 connectors |
| `when_i_work.users.delete` Delete User | Delete User. | destructive | `hr.employee.delete` 34 connectors |
| `when_i_work.time_off_requests.create` Create Time Off Request | Create Time Off Request. | write | `hr.leave_request.create` 32 connectors |
| `when_i_work.time_off_requests.list` List Time Off Requests | List Time Off Requests. | read | `hr.leave_request.list` 29 connectors |
| `when_i_work.time_off_request_types.list` List Of Time Off Request Types | List Of Time Off Request Types. | read | `hr.leave_type.list` 23 connectors |
| `when_i_work.shifts.list` List Shifts | List Shifts. | read | `hr.shift.list` 19 connectors |
| `when_i_work.shifts.create` Create Shift | Create Shift. | write | `hr.shift.create` 18 connectors |
| `when_i_work.times.create` Create Time | Create Time. | write | `hr.time_clock_entry.create` 17 connectors |

Try it

## Prompts to paste into Claude.

Each one names the When I Work actions it will call, so you know what it reads and what it changes before you send it.

1. Read read
   List everyone in When I Work with their department and start date.
   calls `when_i_work.users.list`
2. Write write
   Create User in When I Work. Show me exactly what you will send before you save it.
   calls `when_i_work.users.create`

Governance for When I Work

## Destructive actions wait for a yes.

18 When I Work actions are destructive. These are all of them:

- Delete User `when_i_work.users.delete`
- Delete Schedule (Location) `when_i_work.locations.delete`
- Delete Time Off Request `when_i_work.time_off_requests.delete`
- Delete Shift `when_i_work.shifts.delete`
- Delete Time `when_i_work.times.delete`
- Delete Position `when_i_work.positions.delete`
- Delete Time Off Request Type `when_i_work.time_off_request_types.delete`
- Delete the given shift request. `when_i_work.shift_requests.delete`
- Delete an OpenShift Approval Request. `when_i_work.openshift_approval_requests.delete`
- Delete Site `when_i_work.sites.delete`
- Delete Annotation `when_i_work.annotations.delete`
- Delete Shift Break `when_i_work.shift_breaks.delete`
- Delete Shift Template (Block) `when_i_work.shift_templates.delete`
- Delete Shift Break Paid Rest `when_i_work.paid_rest_records.delete`
- Delete Schedule Template `when_i_work.schedule_templates.delete`
- Delete Availability Event `when_i_work.availability_events.delete`
- Bulk Delete Shifts `when_i_work.shifts.bulk_delete`
- Cancel an individual's request for an OpenShift `when_i_work.openshift_approval_requests.user_request_cancel`

A destructive action runs only with `confirm: true`. Under the `human` policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.

do when_i_work.users.delete confirm_policy: **human**

Delete User?

**intent:** the user asked me to delete User

run suspended · waiting for a named person · key _when-i-work-agent_ cannot confirm itself

In the console, or from an emailed signed link.

a key for this connector

```
account {
  op: "keys.create", name: "when-i-work-agent",
  allowed_actions: ["when_i_work.*"], cap_calls: 2000,
  confirm_policy: "human_for_writes",
  approval_rules: [
    { match: "when_i_work.users.delete", approver: "lead@example.com" },
    { match: "when_i_work.locations.delete", approver: "lead@example.com" },
    { match: "when_i_work.time_off_requests.delete", approver: "lead@example.com" }
  ]
}
```

Illustrative. Scoped to When I Work only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

Cost

## What When I Work costs on actionlake.

Every When I Work action is one upstream call, the only thing actionlake bills. Searching, `check`, `cost`, `account` and any call When I Work refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

- 1 upstream call per action all 120 When I Work actions
- 120 actions page each page of a long list is one call
- 49 reads can be cached a cache hit costs nothing
- 100,000 calls a month, free paid plans from US$49 a month for 250,000

[See pricing](https://actionlake.com/pricing)

Action index

## Every When I Work action.

120 actions by area: the id your agent calls, what it does, and its effect.

**Shifts 17**

- `when_i_work.shifts.assign` Assign multiple users to an OpenShift write
- `when_i_work.shifts.auto_assign_list` List Auto Scheduled shifts read
- `when_i_work.shifts.bulk_delete` Bulk Delete Shifts destructive
- `when_i_work.shifts.bulk_update` Bulk Update Shifts write
- `when_i_work.shifts.create` Create Shift write
- `when_i_work.shifts.delete` Delete Shift destructive
- `when_i_work.shifts.eligible_users_list` List eligible users for OpenShift read
- `when_i_work.shifts.get` Get Shift read
- `when_i_work.shifts.history_get` Fetch shift history read
- `when_i_work.shifts.list` List Shifts read
- `when_i_work.shifts.notify` Notify shifts write
- `when_i_work.shifts.notify_one` Notify single shift write
- `when_i_work.shifts.publish` Publish Shifts write
- `when_i_work.shifts.swap_users_list` List swap users read
- `when_i_work.shifts.unassign` Unassign/Release Shifts write
- `when_i_work.shifts.unpublish` Unpublish Shifts write
- `when_i_work.shifts.update` Update Shift write

**Users 11**

- `when_i_work.users.alerts_update` Update User Alert Settings write
- `when_i_work.users.bulk_create` Create A Batch of Users write
- `when_i_work.users.create` Create User write
- `when_i_work.users.delete` Delete User destructive
- `when_i_work.users.get` Get User read
- `when_i_work.users.invite` Invite users write
- `when_i_work.users.invite_one` Invite single user write
- `when_i_work.users.list` List Users read
- `when_i_work.users.profile_get` Get User Profile read
- `when_i_work.users.profile_update` Update User Profile write
- `when_i_work.users.update` Update User write

**Times 7**

- `when_i_work.times.clock_in` Clock In write
- `when_i_work.times.clock_out` Clock Out write
- `when_i_work.times.create` Create Time write
- `when_i_work.times.delete` Delete Time destructive
- `when_i_work.times.get` Get Time read
- `when_i_work.times.list` List Times read
- `when_i_work.times.update` Update Time write

**Availability events 6**

- `when_i_work.availability_events.create` Create Availability Event write
- `when_i_work.availability_events.delete` Delete Availability Event destructive
- `when_i_work.availability_events.exception_create` Create Availability Event Exception write
- `when_i_work.availability_events.get` Get Availability Event read
- `when_i_work.availability_events.list` List Availability Events read
- `when_i_work.availability_events.update` Update Availability Event write

**Positions 6**

- `when_i_work.positions.bulk_update` Update Multiple Positions write
- `when_i_work.positions.create` Create Position write
- `when_i_work.positions.delete` Delete Position destructive
- `when_i_work.positions.get` Get Position read
- `when_i_work.positions.list` List Positions read
- `when_i_work.positions.update` Update Position write

**Account 5**

- `when_i_work.account.admins_list` List Admins read
- `when_i_work.account.create` Create Account write
- `when_i_work.account.get` Get Account read
- `when_i_work.account.settings_update` Update Account Settings write
- `when_i_work.account.update` Update Account write

**Annotations 5**

- `when_i_work.annotations.create` Create Annotation write
- `when_i_work.annotations.delete` Delete Annotation destructive
- `when_i_work.annotations.get` Get Annotation read
- `when_i_work.annotations.list` List Annotations read
- `when_i_work.annotations.update` Update Annotation write

**Locations 5**

- `when_i_work.locations.create` Create Schedule (Location) write
- `when_i_work.locations.delete` Delete Schedule (Location) destructive
- `when_i_work.locations.get` Get Schedule (Location) read
- `when_i_work.locations.list` List Schedules (Locations) read
- `when_i_work.locations.update` Update Schedule (Location) write

**Openshift approval requests 5**

- `when_i_work.openshift_approval_requests.delete` Delete an OpenShift Approval Request. destructive
- `when_i_work.openshift_approval_requests.get` Get specific OpenShift Approval Request read
- `when_i_work.openshift_approval_requests.list` List OpenShift Approval Requests read
- `when_i_work.openshift_approval_requests.update` Update an OpenShift Approval Request. write
- `when_i_work.openshift_approval_requests.user_request_cancel` Cancel an individual's request for an OpenShift destructive

**Payrolls 5**

- `when_i_work.payrolls.get` Get Payroll read
- `when_i_work.payrolls.list` List Payrolls read
- `when_i_work.payrolls.notices_list` List Notices read
- `when_i_work.payrolls.stats_get` Get Payroll Statistics for current hours read
- `when_i_work.payrolls.update` Update Payroll write

**Schedule templates 5**

- `when_i_work.schedule_templates.create` Create Schedule Template write
- `when_i_work.schedule_templates.delete` Delete Schedule Template destructive
- `when_i_work.schedule_templates.get` Get Schedule Template read
- `when_i_work.schedule_templates.list` List Schedule Templates read
- `when_i_work.schedule_templates.update` Update Schedule Template write

**Shift breaks 5**

- `when_i_work.shift_breaks.create` Create Shift Break write
- `when_i_work.shift_breaks.delete` Delete Shift Break destructive
- `when_i_work.shift_breaks.get` Get Shift Break read
- `when_i_work.shift_breaks.list` List Shift Breaks read
- `when_i_work.shift_breaks.update` Update Shift Break write

**Shift requests 5**

- `when_i_work.shift_requests.create` Create a new shift request. write
- `when_i_work.shift_requests.delete` Delete the given shift request. destructive
- `when_i_work.shift_requests.get` Get the details of a specific shift request. read
- `when_i_work.shift_requests.list` Gets a collection of all shift requests. read
- `when_i_work.shift_requests.update` Update a shift request. write

**Shift templates 5**

- `when_i_work.shift_templates.create` Create Shift Template (Block) write
- `when_i_work.shift_templates.delete` Delete Shift Template (Block) destructive
- `when_i_work.shift_templates.get` Get Shift Template (Block) read
- `when_i_work.shift_templates.list` List Shift Templates (Blocks) read
- `when_i_work.shift_templates.update` Update Shift Template (block) write

**Sites 5**

- `when_i_work.sites.create` Create Site write
- `when_i_work.sites.delete` Delete Site destructive
- `when_i_work.sites.get` Get Site read
- `when_i_work.sites.list` List Sites read
- `when_i_work.sites.update` Update Site write

**Time off requests 5**

- `when_i_work.time_off_requests.create` Create Time Off Request write
- `when_i_work.time_off_requests.delete` Delete Time Off Request destructive
- `when_i_work.time_off_requests.get` Get Time Off Request read
- `when_i_work.time_off_requests.list` List Time Off Requests read
- `when_i_work.time_off_requests.update` Update Time Off Request write

**Paid rest records 4**

- `when_i_work.paid_rest_records.create` Create Shift Break Paid Record Entry write
- `when_i_work.paid_rest_records.delete` Delete Shift Break Paid Rest destructive
- `when_i_work.paid_rest_records.get` Get Shift Break - Paid Rest Record read
- `when_i_work.paid_rest_records.list` List Shift Break - Paid Rest records read

**Time off request types 4**

- `when_i_work.time_off_request_types.delete` Delete Time Off Request Type destructive
- `when_i_work.time_off_request_types.get` Get Time Off Request Type read
- `when_i_work.time_off_request_types.list` List Of Time Off Request Types read
- `when_i_work.time_off_request_types.upsert` Create or update a Collection of request types write

**Imports 3**

- `when_i_work.imports.finalize` Finalize Import write
- `when_i_work.imports.get` Get Import read
- `when_i_work.imports.preview` Preview Import read

**People 3**

- `when_i_work.people.me_get` Get Person read
- `when_i_work.people.password_update` Update Password write
- `when_i_work.people.update` Update Person write

**Timezones 2**

- `when_i_work.timezones.get` Get Timezone read
- `when_i_work.timezones.list` List Timezones read

**Punch 1**

- `when_i_work.punch.state_get` Punch State read

**Scheduled breaks 1**

- `when_i_work.scheduled_breaks.list` List Scheduled Shift Breaks read

Questions

## The When I Work MCP server, answered.

**Is there a When I Work MCP server for Claude?**

Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 120 When I Work actions across shifts, users, times and availability events, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by When I Work.

**What do I need to connect When I Work?**

When I Work developer key (request one from When I Work via the developer/API page; sent as the W-Key header on login), Email address of the When I Work user the connection acts as (an account admin or manager for full access) and Password of that When I Work user. Plus your user id. The free call account { op: "connections.requirements", service: "when_i_work" } lists exactly what to paste.

**Can an AI agent delete or change things in When I Work?**

Only if its key allows it, and only with an explicit confirmation. 18 When I Work actions are destructive, including delete User, delete Schedule (Location) and delete Time Off Request. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.

**Will an AI agent use up my When I Work API limit?**

actionlake paces every call to the limits in the When I Work service file: 300 calls a minute per connection. Repeated reads are answered from cache (49 When I Work actions can be), which never reaches When I Work.

**What does a When I Work action cost?**

One upstream call, the only unit actionlake bills. A list that pages bills one call per page (120 When I Work actions page). Cache hits, searches, dry runs and calls When I Work refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

**Which When I Work API does it cover?**

The When I Work API v2/v3 (OpenAPI 3.1.0) plus Login Service at api.wheniwork.com. It is built from When I Work's documentation as read on 23 October 2026. 120 actions in 23 areas, each one in the signed service file (version 1.0.0).

**Does actionlake keep my When I Work data, and where?**

actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to 5 minutes, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your When I Work credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.

**Which AI clients can use it?**

Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.

## More connectors like When I Work

Shares the most action names with

- [7shifts 27](https://actionlake.com/connectors/7shifts)
- [Tanda (Workforce.com) 27](https://actionlake.com/connectors/tanda-workforce-com)
- [Paycor 26](https://actionlake.com/connectors/paycor)
- [Rippling 23](https://actionlake.com/connectors/rippling)
- [BambooHR 23](https://actionlake.com/connectors/bamboohr)
- [Deputy 19](https://actionlake.com/connectors/deputy)

Joins with, on shared entities

- [Deel 2](https://actionlake.com/connectors/deel)
- [Employment Hero 2](https://actionlake.com/connectors/employment-hero)
- [Humaans 2](https://actionlake.com/connectors/humaans)
- [ConnectWise PSA 1](https://actionlake.com/connectors/connectwise-psa)
- [HaloPSA 1](https://actionlake.com/connectors/halopsa)
- [Adobe Workfront 1](https://actionlake.com/connectors/adobe-workfront)

Browse

- [All Accounting & finance connectors](https://actionlake.com/connectors/category/accounting-and-finance)
- [All connectors](https://actionlake.com/connectors)
- [How actionlake compares](https://actionlake.com/compare)

actionlake is independent. It is not made or endorsed by When I Work; the name is the vendor's own. Counts are from the When I Work service file, version 1.0.0.

## Give your agent When I Work today.

[Connect When I Work free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.

---

Source: https://actionlake.com/connectors/when-i-work
More: https://actionlake.com/llms.txt
