Connectors · Accounting & finance
Planday MCP server for AI agents.
actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Planday and the rest of your systems. It gives your agent 145 Planday actions (75 reads, 58 writes and 12 that wait for a confirmation) and holds the Planday credential itself, so the agent never does. It paces Planday's limits and records every call. Connecting Planday needs your own Planday OAuth app and one admin sign-in.
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/mcpdo { action: "planday.employees.list", intent: "check which Planday account is connected"}# List employees · read · 1 upstream call- 145actionsin one signed file
- 75readlook, never change
- 58writecreate and update
- 12wait for a yesdestructive, confirmed first
Set up
Connect Planday in three steps.
- 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 - 02
Connect Planday.
OAuth 2.0, authorization code. You register your own OAuth app with Planday, an admin signs in once, and you paste the app's client id and secret and the tokens from that sign-in; actionlake renews the access token from then on. actionlake stores what you paste write-only, sealed under your tenant's key.
Before the first sign-in, Planday needs an OAuth app of your own, registered in its developer portal. actionlake has no Planday app to lend you.
access_tokenAccess token from one sign-in with your own OAuth apprefresh_tokenPlanday refresh token: on the same API Access page select Authorize next to the app, approve the consent screen,…client_idPlanday App ID (client ID): in Planday go to Settings > Integrations > API Access, create an app with the scopes you…client_secretYour OAuth app's client secret
account { op: "connections.requirements", service: "planday" } # free: exactly what to paste, and what is found for you - 03
Make the first call. Check before a write.
Ask in plain words; Claude picks the action. Before anything changes,
checkvalidates the call and prices it, for free.do { action: "planday.employees.list" }# list employees · read · 1 upstream callcheck { action: "planday.employees.create", input: { … } }# free: inputs, permissions, cost and confirmations, nothing sent
Planday at a glance
- Sign-in
- OAuth 2.0, authorization code. You register your own OAuth app with Planday, an admin signs in once, and you paste the app's client id and secret and the tokens from that sign-in; actionlake renews the access token from then on.
- You provide
access_tokenrefresh_tokenclient_idclient_secret- Limits we pace to
- 20 calls a second and 750 a minute, per connection
- API covered
- Planday Open API v1.0 (twelve OpenAPI 3.0.4 documents)
openapi.planday.com - Built from
- Planday's documentation, read 23 October 2026openapi.planday.comopenapi.planday.comopenapi.planday.com
- Service file
- Version 1.0.0, signed (Ed25519)
- Cached reads
- 74 of 75 reads, for up to an hour; a write clears what it affects
- Shared entities
- 3, so ask can line Planday up with your other systems
- Data
- Processed and stored in Sydney, Australia. No US region yet
Capabilities
What an AI agent can do in Planday.
145 actions in 44 areas. Every one carries its effect, so a key can allow the reads and hold the rest.
- 75readlook, never change
- 58writecreate and update
- 12destructivewait for a confirmation
Employees
125 read · 6 write · 1 destructive
List employees · Create an employee · Get an employee · Update an employee
Shifts
114 read · 6 write · 1 destructive
List shifts · Create a shift · Get a shift · Update a shift
Pay rates
75 read · 2 write · 0 destructive
Get an employee's wage history in a group · List an employee's pay rates · List default pay rates of employee groups · Get an employee's pay rate in a group
Absence requests
62 read · 3 write · 1 destructive
Submit an absence request · List absence requests · Approve an absence request · Deny an absence request
Departments
63 read · 2 write · 1 destructive
List departments · Create a department · Get a department · Update a department
Employee groups
63 read · 2 write · 1 destructive
List employee groups · Create an employee group · List employees in an employee group · Get an employee group
Punch clock shifts
62 read · 4 write · 0 destructive
Create a punch-in entry · List punch clock records · Set the punch-out time · Punch in an employee
Salary allocations
62 read · 4 write · 0 destructive
Get an employee's salary allocation history · Get an employee's salary allocation · Allocate salary by business days · Allocate salary monthly
36 more areas · 85 actions
- Absence account types 5
- Positions 5
- Salary identifiers 5
- Absence accounts 4
- Contract rules 4
- Employee custom attachments 4
- Punch clock breaks 4
- Revenue units 4
- Sections 4
- Skills 4
- Dataset values 3
- Revenue 3
- Salaries 3
- Security group memberships 3
- Shift types 3
- Absence account adjustments 2
- Absence account transactions 2
- Absence records 2
- Budgets 2
- Formulas 2
- Schedule days 2
- Absence types 1
- Countries 1
- Datasets 1
- Employee types 1
- Payroll 1
- Portal 1
- Punch clock 1
- Salary types 1
- Scheduling history 1
- Scheduling skills 1
- Security groups 1
- Shift statuses 1
- Supervisors 1
- Termination types 1
- Time and cost 1
Top actions
The Planday API, shaped for agents.
The ids your agent types, what each does, and the one name it shares with other systems. 30 of Planday's 33 action names are shared with at least one other connector, so an agent learns them once.
| Action | What it does | Effect | Same name in |
|---|---|---|---|
planday.employees.listList employees | List of employees. | read | hr.employee.list61 connectors |
planday.departments.listList departments | List of departments. | read | hr.department.list40 connectors |
planday.employees.createCreate an employee | Create employee. | write | hr.employee.create51 connectors |
planday.departments.createCreate a department | Create department. | write | hr.department.create32 connectors |
planday.departments.deleteDelete a department | Department. | destructive | hr.department.delete23 connectors |
planday.absence_requests.createSubmit an absence request | Submit the absence request. | write | hr.leave_request.create32 connectors |
planday.absence_requests.listList absence requests | Absence requests. | read | hr.leave_request.list29 connectors |
planday.absence_types.listList absence types | Absence types. | read | hr.leave_type.list23 connectors |
planday.shifts.listList shifts | Available shifts. | read | hr.shift.list19 connectors |
planday.shifts.createCreate a shift | Create Shift. | write | hr.shift.create18 connectors |
planday.punch_clock_shifts.createCreate a punch-in entry | Create a Punch-In entry. | write | hr.time_clock_entry.create17 connectors |
planday.punch_clock_shifts.listList punch clock records | List of all Punch Clock records. | read | hr.time_clock_entry.list15 connectors |
Try it
Prompts to paste into Claude.
Each one names the Planday actions it will call, so you know what it reads and what it changes before you send it.
- Readread
List everyone in Planday with their department and start date.
calls
planday.employees.list - Writewrite
Create an employee in Planday. Show me exactly what you will send before you save it.
calls
planday.employees.create
Governance for Planday
Destructive actions wait for a yes.
12 Planday actions are destructive. These are all of them:
- Delete a department
planday.departments.delete - Delete a shift
planday.shifts.delete - Delete a skill
planday.skills.delete - Cancel an absence request (deprecated)
planday.absence_requests.cancel - Delete revenue
planday.revenue.delete - Delete a section
planday.sections.delete - Delete a position
planday.positions.delete - Delete an employee group
planday.employee_groups.delete - Reset an employee's password
planday.employees.reset_password - Delete an account type
planday.absence_account_types.delete - Remove an employee from security groups
planday.security_group_memberships.delete - Delete a custom field attachment value
planday.employee_custom_attachments.delete
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.
Delete a department?
intent: the user asked me to delete a department
account { op: "keys.create", name: "planday-agent", allowed_actions: ["planday.*"], cap_calls: 2000, confirm_policy: "human_for_writes", approval_rules: [ { match: "planday.departments.delete", approver: "[email protected]" }, { match: "planday.shifts.delete", approver: "[email protected]" }, { match: "planday.skills.delete", approver: "[email protected]" } ]}Cost
What Planday costs on actionlake.
Every Planday action is one upstream call, the only thing actionlake bills. Searching, check, cost, account and any call Planday 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.
- 1upstream call per actionall 145 Planday actions
- 145actions pageeach page of a long list is one call
- 74reads can be cacheda cache hit costs nothing
- 100,000calls a month, freepaid plans from US$49 a month for 250,000
Action index
Every Planday action.
145 actions by area: the id your agent calls, what it does, and its effect.
Employees12
planday.employees.change_usernameChange an employee's usernamewriteplanday.employees.createCreate an employeewriteplanday.employees.deactivateDeactivate an employeewriteplanday.employees.field_definitionsGet employee field definitionsreadplanday.employees.getGet an employeereadplanday.employees.historyGet an employee's change historyreadplanday.employees.inviteInvite an employeewriteplanday.employees.listList employeesreadplanday.employees.list_deactivatedList deactivated employeesreadplanday.employees.reactivateReactivate an employeewriteplanday.employees.reset_passwordReset an employee's passworddestructiveplanday.employees.updateUpdate an employeewrite
Shifts11
planday.shifts.approveApprove a shiftwriteplanday.shifts.assignAssign a shift to an employeewriteplanday.shifts.bulk_createBulk create shiftswriteplanday.shifts.createCreate a shiftwriteplanday.shifts.deleteDelete a shiftdestructiveplanday.shifts.getGet a shiftreadplanday.shifts.historyGet a shift's historyreadplanday.shifts.listList shiftsreadplanday.shifts.list_deletedList deleted shiftsreadplanday.shifts.publish_draftsPublish draft shiftswriteplanday.shifts.updateUpdate a shiftwrite
Pay rates7
planday.pay_rates.employee_historyGet an employee's wage history in a groupreadplanday.pay_rates.get_employeeGet an employee's pay rate in a groupreadplanday.pay_rates.get_group_defaultGet an employee group's default pay ratereadplanday.pay_rates.list_for_employeeList an employee's pay ratesreadplanday.pay_rates.list_group_defaultsList default pay rates of employee groupsreadplanday.pay_rates.update_employeesUpdate employee pay rates in a groupwriteplanday.pay_rates.update_group_defaultUpdate an employee group's default pay ratewrite
Absence requests6
planday.absence_requests.approveApprove an absence requestwriteplanday.absence_requests.cancelCancel an absence request (deprecated)destructiveplanday.absence_requests.createSubmit an absence requestwriteplanday.absence_requests.denyDeny an absence requestwriteplanday.absence_requests.draftGet an absence request draftreadplanday.absence_requests.listList absence requestsread
Departments6
planday.departments.createCreate a departmentwriteplanday.departments.deleteDelete a departmentdestructiveplanday.departments.getGet a departmentreadplanday.departments.listList departmentsreadplanday.departments.list_employeesList employees in a departmentreadplanday.departments.updateUpdate a departmentwrite
Employee groups6
planday.employee_groups.createCreate an employee groupwriteplanday.employee_groups.deleteDelete an employee groupdestructiveplanday.employee_groups.getGet an employee groupreadplanday.employee_groups.listList employee groupsreadplanday.employee_groups.list_employeesList employees in an employee groupreadplanday.employee_groups.updateUpdate an employee groupwrite
Punch clock shifts6
planday.punch_clock_shifts.createCreate a punch-in entrywriteplanday.punch_clock_shifts.get_by_shiftGet the punch clock record of a shiftreadplanday.punch_clock_shifts.listList punch clock recordsreadplanday.punch_clock_shifts.punch_in_employeePunch in an employeewriteplanday.punch_clock_shifts.punch_outSet the punch-out timewriteplanday.punch_clock_shifts.punch_out_employeePunch out an employeewrite
Salary allocations6
planday.salary_allocations.getGet an employee's salary allocationreadplanday.salary_allocations.historyGet an employee's salary allocation historyreadplanday.salary_allocations.set_business_daysAllocate salary by business dayswriteplanday.salary_allocations.set_monthlyAllocate salary monthlywriteplanday.salary_allocations.set_noneDisable salary allocationwriteplanday.salary_allocations.set_scheduled_hoursAllocate salary by scheduled hourswrite
Absence account types5
planday.absence_account_types.create_accruedCreate an accrued account typewriteplanday.absence_account_types.deleteDelete an account typedestructiveplanday.absence_account_types.get_accruedGet an accrued account typereadplanday.absence_account_types.listList absence account typesreadplanday.absence_account_types.update_accruedUpdate an accrued account typewrite
Positions5
planday.positions.createCreate a positionwriteplanday.positions.deleteDelete a positiondestructiveplanday.positions.getGet a positionreadplanday.positions.listList positionsreadplanday.positions.updateUpdate a positionwrite
Salary identifiers5
planday.salary_identifiers.getGet an employee's salary identifiersreadplanday.salary_identifiers.get_departmentGet an employee's department salary identifierreadplanday.salary_identifiers.listList salary identifiers of all employeesreadplanday.salary_identifiers.setSet an employee's salary identifierswriteplanday.salary_identifiers.set_departmentSet an employee's department salary identifierwrite
Absence accounts4
planday.absence_accounts.balanceGet an absence account balancereadplanday.absence_accounts.employee_balancesGet absence account balances for employeesreadplanday.absence_accounts.listList absence accountsreadplanday.absence_accounts.primaryGet an employee's primary absence accountread
Contract rules4
planday.contract_rules.assign_to_employeeAssign a contract rule to an employeewriteplanday.contract_rules.getGet a contract rulereadplanday.contract_rules.get_for_employeeGet an employee's contract rulereadplanday.contract_rules.listList contract rulesread
Employee custom attachments4
planday.employee_custom_attachments.createCreate a custom field attachment valuewriteplanday.employee_custom_attachments.deleteDelete a custom field attachment valuedestructiveplanday.employee_custom_attachments.getGet a custom field attachment valuereadplanday.employee_custom_attachments.updateUpdate a custom field attachment valuewrite
Punch clock breaks4
planday.punch_clock_breaks.accessGet break access for a punch clock shiftreadplanday.punch_clock_breaks.endEnd the ongoing breakwriteplanday.punch_clock_breaks.listList breaks on a punch clock recordreadplanday.punch_clock_breaks.startStart a breakwrite
Revenue units4
planday.revenue_units.createCreate a revenue unitwriteplanday.revenue_units.listList revenue unitsreadplanday.revenue_units.list_for_departmentList a department's revenue unitsreadplanday.revenue_units.updateUpdate a revenue unitwrite
Sections4
planday.sections.createCreate a sectionwriteplanday.sections.deleteDelete a sectiondestructiveplanday.sections.listList sectionsreadplanday.sections.updateUpdate a sectionwrite
Skills4
planday.skills.createCreate a skillwriteplanday.skills.deleteDelete a skilldestructiveplanday.skills.listList skillsreadplanday.skills.updateUpdate a skillwrite
Dataset values3
planday.dataset_values.get_periodGet data set values for a periodreadplanday.dataset_values.replace_periodReplace data set values for a periodwriteplanday.dataset_values.updateUpdate data set valueswrite
Revenue3
planday.revenue.createRegister revenuewriteplanday.revenue.deleteDelete revenuedestructiveplanday.revenue.listList revenueread
Salaries3
planday.salaries.getGet an employee's period salaryreadplanday.salaries.historyGet an employee's salary historyreadplanday.salaries.setCreate or update an employee's period salarywrite
Security group memberships3
planday.security_group_memberships.deleteRemove an employee from security groupsdestructiveplanday.security_group_memberships.list_for_employeeList an employee's security groupsreadplanday.security_group_memberships.upsertAdd or update a security group membershipwrite
Shift types3
planday.shift_types.createCreate a shift typewriteplanday.shift_types.listList shift typesreadplanday.shift_types.updateUpdate a shift typewrite
Absence account adjustments2
planday.absence_account_adjustments.createAdjust an accrued account balancewriteplanday.absence_account_adjustments.listList adjustments of an accrued accountread
Absence account transactions2
planday.absence_account_transactions.createCreate an account transactionwriteplanday.absence_account_transactions.listList account transactionsread
Absence records2
planday.absence_records.declineDecline an absence recordwriteplanday.absence_records.listList absence recordsread
Budgets2
planday.budgets.listList daily budgetsreadplanday.budgets.upsertCreate or update daily budgetswrite
Formulas2
planday.formulas.evaluateEvaluate a metricreadplanday.formulas.listList data center metricsread
Schedule days2
planday.schedule_days.listList schedule daysreadplanday.schedule_days.updateUpdate a schedule daywrite
Absence types1
planday.absence_types.listList absence typesread
Countries1
planday.countries.listList countriesread
Datasets1
planday.datasets.listList data setsread
Employee types1
planday.employee_types.listList employee typesread
Payroll1
planday.payroll.getGet payroll dataread
Portal1
planday.portal.infoGet portal informationread
Punch clock1
planday.punch_clock.todays_shiftsList today's shiftsread
Salary types1
planday.salary_types.listList salary typesread
Scheduling history1
planday.scheduling_history.queryGet scheduling historyread
Scheduling skills1
planday.scheduling_skills.listList skills for schedulingread
Security groups1
planday.security_groups.listList security groupsread
Shift statuses1
planday.shift_statuses.listList shift statusesread
Supervisors1
planday.supervisors.listList supervisorsread
Termination types1
planday.termination_types.listList termination typesread
Time and cost1
planday.time_and_cost.getGet time and cost of shiftsread
Questions
The Planday MCP server, answered.
Is there a Planday MCP server for Claude?
Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 145 Planday actions across employees, shifts, pay rates and absence requests, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Planday.
What do I need to connect Planday?
Your own Planday OAuth app, registered with Planday (its client id and client secret), and the access and refresh tokens from one admin sign-in. actionlake has no Planday app of its own, so this is not a one-step consent. actionlake renews the access token as it expires. The free call account { op: "connections.requirements", service: "planday" } lists exactly what to paste.
Can an AI agent delete or change things in Planday?
Only if its key allows it, and only with an explicit confirmation. 12 Planday actions are destructive, including delete a department, delete a shift and delete a skill. 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 Planday API limit?
actionlake paces every call to the limits in the Planday service file: 20 calls a second and 750 a minute per connection. Repeated reads are answered from cache (74 Planday actions can be), which never reaches Planday.
What does a Planday action cost?
One upstream call, the only unit actionlake bills. A list that pages bills one call per page (145 Planday actions page). Cache hits, searches, dry runs and calls Planday 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 Planday API does it cover?
The Planday Open API v1.0 (twelve OpenAPI 3.0.4 documents) at openapi.planday.com. It is built from Planday's documentation as read on 23 October 2026. 145 actions in 44 areas, each one in the signed service file (version 1.0.0).
Does actionlake keep my Planday data, and where?
actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to an hour, 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 Planday 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.
Give your agent Planday today.
Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.