Skip to content

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/mcp
the first call
do {  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.

  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 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 app
    • refresh_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
  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: "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
  1. Employees

    12

    5 read · 6 write · 1 destructive

    List employees · Create an employee · Get an employee · Update an employee

  2. Shifts

    11

    4 read · 6 write · 1 destructive

    List shifts · Create a shift · Get a shift · Update a shift

  3. Pay rates

    7

    5 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

  4. Absence requests

    6

    2 read · 3 write · 1 destructive

    Submit an absence request · List absence requests · Approve an absence request · Deny an absence request

  5. Departments

    6

    3 read · 2 write · 1 destructive

    List departments · Create a department · Get a department · Update a department

  6. Employee groups

    6

    3 read · 2 write · 1 destructive

    List employee groups · Create an employee group · List employees in an employee group · Get an employee group

  7. Punch clock shifts

    6

    2 read · 4 write · 0 destructive

    Create a punch-in entry · List punch clock records · Set the punch-out time · Punch in an employee

  8. Salary allocations

    6

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

ActionWhat it doesEffectSame name in
planday.employees.listList employeesList of employees.readhr.employee.list61 connectors
planday.departments.listList departmentsList of departments.readhr.department.list40 connectors
planday.employees.createCreate an employeeCreate employee.writehr.employee.create51 connectors
planday.departments.createCreate a departmentCreate department.writehr.department.create32 connectors
planday.departments.deleteDelete a departmentDepartment.destructivehr.department.delete23 connectors
planday.absence_requests.createSubmit an absence requestSubmit the absence request.writehr.leave_request.create32 connectors
planday.absence_requests.listList absence requestsAbsence requests.readhr.leave_request.list29 connectors
planday.absence_types.listList absence typesAbsence types.readhr.leave_type.list23 connectors
planday.shifts.listList shiftsAvailable shifts.readhr.shift.list19 connectors
planday.shifts.createCreate a shiftCreate Shift.writehr.shift.create18 connectors
planday.punch_clock_shifts.createCreate a punch-in entryCreate a Punch-In entry.writehr.time_clock_entry.create17 connectors
planday.punch_clock_shifts.listList punch clock recordsList of all Punch Clock records.readhr.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.

  1. Readread

    List everyone in Planday with their department and start date.

    callsplanday.employees.list

  2. Writewrite

    Create an employee in Planday. Show me exactly what you will send before you save it.

    callsplanday.employees.create

Governance for Planday

Destructive actions wait for a yes.

12 Planday actions are destructive. These are all of them:

  • Delete a departmentplanday.departments.delete
  • Delete a shiftplanday.shifts.delete
  • Delete a skillplanday.skills.delete
  • Cancel an absence request (deprecated)planday.absence_requests.cancel
  • Delete revenueplanday.revenue.delete
  • Delete a sectionplanday.sections.delete
  • Delete a positionplanday.positions.delete
  • Delete an employee groupplanday.employee_groups.delete
  • Reset an employee's passwordplanday.employees.reset_password
  • Delete an account typeplanday.absence_account_types.delete
  • Remove an employee from security groupsplanday.security_group_memberships.delete
  • Delete a custom field attachment valueplanday.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.

doplanday.departments.deleteconfirm_policy: human

Delete a department?

intent: the user asked me to delete a department

run suspended · waiting for a named person · key planday-agent cannot confirm itself
In the console, or from an emailed signed link.
a key for this connector
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]" }  ]}
Illustrative. Scoped to Planday only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

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

See pricing

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 usernamewrite
  • planday.employees.createCreate an employeewrite
  • planday.employees.deactivateDeactivate an employeewrite
  • planday.employees.field_definitionsGet employee field definitionsread
  • planday.employees.getGet an employeeread
  • planday.employees.historyGet an employee's change historyread
  • planday.employees.inviteInvite an employeewrite
  • planday.employees.listList employeesread
  • planday.employees.list_deactivatedList deactivated employeesread
  • planday.employees.reactivateReactivate an employeewrite
  • planday.employees.reset_passwordReset an employee's passworddestructive
  • planday.employees.updateUpdate an employeewrite
Shifts11
  • planday.shifts.approveApprove a shiftwrite
  • planday.shifts.assignAssign a shift to an employeewrite
  • planday.shifts.bulk_createBulk create shiftswrite
  • planday.shifts.createCreate a shiftwrite
  • planday.shifts.deleteDelete a shiftdestructive
  • planday.shifts.getGet a shiftread
  • planday.shifts.historyGet a shift's historyread
  • planday.shifts.listList shiftsread
  • planday.shifts.list_deletedList deleted shiftsread
  • planday.shifts.publish_draftsPublish draft shiftswrite
  • planday.shifts.updateUpdate a shiftwrite
Pay rates7
  • planday.pay_rates.employee_historyGet an employee's wage history in a groupread
  • planday.pay_rates.get_employeeGet an employee's pay rate in a groupread
  • planday.pay_rates.get_group_defaultGet an employee group's default pay rateread
  • planday.pay_rates.list_for_employeeList an employee's pay ratesread
  • planday.pay_rates.list_group_defaultsList default pay rates of employee groupsread
  • planday.pay_rates.update_employeesUpdate employee pay rates in a groupwrite
  • planday.pay_rates.update_group_defaultUpdate an employee group's default pay ratewrite
Absence requests6
  • planday.absence_requests.approveApprove an absence requestwrite
  • planday.absence_requests.cancelCancel an absence request (deprecated)destructive
  • planday.absence_requests.createSubmit an absence requestwrite
  • planday.absence_requests.denyDeny an absence requestwrite
  • planday.absence_requests.draftGet an absence request draftread
  • planday.absence_requests.listList absence requestsread
Departments6
  • planday.departments.createCreate a departmentwrite
  • planday.departments.deleteDelete a departmentdestructive
  • planday.departments.getGet a departmentread
  • planday.departments.listList departmentsread
  • planday.departments.list_employeesList employees in a departmentread
  • planday.departments.updateUpdate a departmentwrite
Employee groups6
  • planday.employee_groups.createCreate an employee groupwrite
  • planday.employee_groups.deleteDelete an employee groupdestructive
  • planday.employee_groups.getGet an employee groupread
  • planday.employee_groups.listList employee groupsread
  • planday.employee_groups.list_employeesList employees in an employee groupread
  • planday.employee_groups.updateUpdate an employee groupwrite
Punch clock shifts6
  • planday.punch_clock_shifts.createCreate a punch-in entrywrite
  • planday.punch_clock_shifts.get_by_shiftGet the punch clock record of a shiftread
  • planday.punch_clock_shifts.listList punch clock recordsread
  • planday.punch_clock_shifts.punch_in_employeePunch in an employeewrite
  • planday.punch_clock_shifts.punch_outSet the punch-out timewrite
  • planday.punch_clock_shifts.punch_out_employeePunch out an employeewrite
Salary allocations6
  • planday.salary_allocations.getGet an employee's salary allocationread
  • planday.salary_allocations.historyGet an employee's salary allocation historyread
  • planday.salary_allocations.set_business_daysAllocate salary by business dayswrite
  • planday.salary_allocations.set_monthlyAllocate salary monthlywrite
  • planday.salary_allocations.set_noneDisable salary allocationwrite
  • planday.salary_allocations.set_scheduled_hoursAllocate salary by scheduled hourswrite
Absence account types5
  • planday.absence_account_types.create_accruedCreate an accrued account typewrite
  • planday.absence_account_types.deleteDelete an account typedestructive
  • planday.absence_account_types.get_accruedGet an accrued account typeread
  • planday.absence_account_types.listList absence account typesread
  • planday.absence_account_types.update_accruedUpdate an accrued account typewrite
Positions5
  • planday.positions.createCreate a positionwrite
  • planday.positions.deleteDelete a positiondestructive
  • planday.positions.getGet a positionread
  • planday.positions.listList positionsread
  • planday.positions.updateUpdate a positionwrite
Salary identifiers5
  • planday.salary_identifiers.getGet an employee's salary identifiersread
  • planday.salary_identifiers.get_departmentGet an employee's department salary identifierread
  • planday.salary_identifiers.listList salary identifiers of all employeesread
  • planday.salary_identifiers.setSet an employee's salary identifierswrite
  • planday.salary_identifiers.set_departmentSet an employee's department salary identifierwrite
Absence accounts4
  • planday.absence_accounts.balanceGet an absence account balanceread
  • planday.absence_accounts.employee_balancesGet absence account balances for employeesread
  • planday.absence_accounts.listList absence accountsread
  • planday.absence_accounts.primaryGet an employee's primary absence accountread
Contract rules4
  • planday.contract_rules.assign_to_employeeAssign a contract rule to an employeewrite
  • planday.contract_rules.getGet a contract ruleread
  • planday.contract_rules.get_for_employeeGet an employee's contract ruleread
  • planday.contract_rules.listList contract rulesread
Employee custom attachments4
  • planday.employee_custom_attachments.createCreate a custom field attachment valuewrite
  • planday.employee_custom_attachments.deleteDelete a custom field attachment valuedestructive
  • planday.employee_custom_attachments.getGet a custom field attachment valueread
  • planday.employee_custom_attachments.updateUpdate a custom field attachment valuewrite
Punch clock breaks4
  • planday.punch_clock_breaks.accessGet break access for a punch clock shiftread
  • planday.punch_clock_breaks.endEnd the ongoing breakwrite
  • planday.punch_clock_breaks.listList breaks on a punch clock recordread
  • planday.punch_clock_breaks.startStart a breakwrite
Revenue units4
  • planday.revenue_units.createCreate a revenue unitwrite
  • planday.revenue_units.listList revenue unitsread
  • planday.revenue_units.list_for_departmentList a department's revenue unitsread
  • planday.revenue_units.updateUpdate a revenue unitwrite
Sections4
  • planday.sections.createCreate a sectionwrite
  • planday.sections.deleteDelete a sectiondestructive
  • planday.sections.listList sectionsread
  • planday.sections.updateUpdate a sectionwrite
Skills4
  • planday.skills.createCreate a skillwrite
  • planday.skills.deleteDelete a skilldestructive
  • planday.skills.listList skillsread
  • planday.skills.updateUpdate a skillwrite
Dataset values3
  • planday.dataset_values.get_periodGet data set values for a periodread
  • planday.dataset_values.replace_periodReplace data set values for a periodwrite
  • planday.dataset_values.updateUpdate data set valueswrite
Revenue3
  • planday.revenue.createRegister revenuewrite
  • planday.revenue.deleteDelete revenuedestructive
  • planday.revenue.listList revenueread
Salaries3
  • planday.salaries.getGet an employee's period salaryread
  • planday.salaries.historyGet an employee's salary historyread
  • planday.salaries.setCreate or update an employee's period salarywrite
Security group memberships3
  • planday.security_group_memberships.deleteRemove an employee from security groupsdestructive
  • planday.security_group_memberships.list_for_employeeList an employee's security groupsread
  • planday.security_group_memberships.upsertAdd or update a security group membershipwrite
Shift types3
  • planday.shift_types.createCreate a shift typewrite
  • planday.shift_types.listList shift typesread
  • planday.shift_types.updateUpdate a shift typewrite
Absence account adjustments2
  • planday.absence_account_adjustments.createAdjust an accrued account balancewrite
  • planday.absence_account_adjustments.listList adjustments of an accrued accountread
Absence account transactions2
  • planday.absence_account_transactions.createCreate an account transactionwrite
  • planday.absence_account_transactions.listList account transactionsread
Absence records2
  • planday.absence_records.declineDecline an absence recordwrite
  • planday.absence_records.listList absence recordsread
Budgets2
  • planday.budgets.listList daily budgetsread
  • planday.budgets.upsertCreate or update daily budgetswrite
Formulas2
  • planday.formulas.evaluateEvaluate a metricread
  • planday.formulas.listList data center metricsread
Schedule days2
  • planday.schedule_days.listList schedule daysread
  • planday.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.