MCP App Store
by KeenEthics

Overview

With early access, you can connect directly to your Planday account to manage scheduling, shifts, and team absences entirely through natural conversation. Save time and streamline your daily operations by bringing instant workforce insights directly into your workflow. Instead of switching tabs, you can simply ask for what you need: check who is on shift next Saturday, see Anna’s remaining annual leave balance, or instantly verify James’s working-time compliance before booking his next shift. You can draft, assign, and publish shifts individually, or ask Claude to factor in upcoming events to help you quickly coordinate next week's schedule. Core Capabilities: Scheduling: View, create, assign, and publish shifts by department, employee, or date. Employees: Look up staff groups, roles, and department structures. Absence: Check live leave balances and review policies Compliance: Check working-time rules on a schedule Enterprise-Grade Security & Permissions: Every action respects your existing Planday user permissions. Managers only access manager-level data, while employees only see their own information. No data is surfaced that would not normally be available to you inside the Planday app. Securely connect via your standard Planday login with zero configuration required.

Tools

approve_shift_swap

ChatGPT
Approves or rejects a swap (or handover) between two existing shifts. Set accept=true to approve the swap, or accept=false to reject it. Identify the shifts by ID only — the department is resolved automatically. A swap that would double-book an employee or breach a labour rule is refused with the reason.

assign_shift

ChatGPT
Assigns (or reassigns) an existing shift to an employee. Approved absence is not checked: a shift can be assigned to an employee who is on leave that day and it will succeed.

create_draft_shift

ChatGPT
Creates an unpublished draft shift in a department. Returns the new shift ID plus the employee, department, position and employee-group names it was created with, and a ready-made description of the shift — report the created shift to the user with those names, not with ids. A name comes back null when the shift has no such entity (an open shift has no employee, and a shift need not have a position) or when it could not be looked up; say so rather than showing the id instead. employeeGroupId is required — it is the employee group the shift belongs to and determines who is eligible for it. Assigning an employee and a position is optional; a position must be one of that employee group's positions, which list_positions returns. Omit employeeId to create an OPEN (unassigned) shift that anyone in the employee group is eligible to take — that is how open shifts are created; assign one later with assign_shift. shiftTypeId books the shift as a specific type (Overtime 1.5, Training, Annual leave); omit it to leave the shift on the portal's default type, which Planday calls Normal. The shift is a draft until published with publish_draft_shifts. Overlapping shifts and working-time rule breaches are refused, but approved absence is not checked: a shift can be created on a day the employee is on leave and it will succeed.

create_position

ChatGPT
Creates a position (a role a shift can be staffed as, e.g. Head Chef, Bartender) in a department and returns it as created, with its department, employee group and category names — report it to the user by those names, not by id. A position belongs to one employee group, and only shifts of that group can use it. It can be filed under a category, which the schedule shows as a section; create one with create_position_category if none fits. Check list_positions for the department first: a position with the same purpose usually already exists, and a near-duplicate is worse than reusing one.

create_position_category

ChatGPT
Creates a position category in a department — the schedule shows it as a section that groups positions, e.g. Kitchen or Bar. Returns the new category's id, which create_position takes as categoryId, and its name and department name — report it to the user by name. Check the categoryName values list_positions returns for the department first: a section with the same purpose usually already exists.

get_working_time_rule

ChatGPT
Returns the full detail of a single working time rule identified by ruleId (obtained from list_working_time_rules): the threshold it enforces, the period it is measured over, the days it covers, and the employee groups, types and shift types it applies to.

list_absence_accounts

ChatGPT
Reads absence accounts. The arguments select one of four scopes: with neither accountId nor employeeId, returns a paged list of active accounts in 'accounts'; with accountId, returns that one account's full definition in 'details' (accrued accounts only, as only accrued accounts have a definition to read); with accountId and includeBalances, returns that account's balances in 'balances' instead of its definition, which works for an account of any absence type; with employeeId and includeBalances, returns every account balance for that employee. includeBalances requires accountId or employeeId — balances cannot be read portal-wide.

list_absence_policies

ChatGPT
Reads absence policies (also called account types). The arguments select the scope: with no policyId, returns a paged list of policies of every absence type (Vacation, Absence, Flextime, Accrued, ExtraLeave) in 'policies'; with policyId, returns that one policy's full definition in 'details'. Set includeSuggestions to also return the published policy templates for the portal's country, each with a suggestionId that policy creation can be seeded from. Detail, create and update cover accrued policies only.

list_departments

ChatGPT
Returns a list of active departments for a portal. Departments are referenced by ID in other entities such as absence policies.

list_employees

ChatGPT
Returns active employees for a portal, up to the first 200 (larger portals are truncated). Each employee includes the ids of the departments and employee groups they belong to. Pass departmentIds to return only the employees in those departments (the roster for a department, resolved before the 200 cap). Employees are referenced by ID in other entities such as absence accounts.

list_positions

ChatGPT
Returns the positions (roles a shift can be staffed as, e.g. Head Chef, Bartender) set up in the given departments. Each position belongs to one department and one employee group, and may be filed under a category, which the schedule shows as a section. Use it to find the positionId for create_draft_shift: a shift's position must be one of the positions of the shift's employee group, so filter by employeeGroupIds once the group is known. It also supplies employeeGroupId values for create_draft_shift. Omit departmentIds to list every department you have schedule access to. Each position carries its department, employee group and category names alongside the ids; describe positions to the user by name, never by id. A null categoryName means the position has no category. A null department or employee group name means the name could not be looked up. validFrom/validTo, when set, bound the dates the position can be used on. Deleted positions are not returned. A name too long to return in full is shortened and ends with '…'.

list_shifts

ChatGPT
Returns the shifts scheduled in a date range for the given departments and/or employees, up to the first 150 (narrow the date range or filters if results may be truncated). You must supply at least one departmentId or employeeId. Unpublished draft shifts are included by default and identified by the isDraft flag. Open (unassigned) shifts have a null employeeId; to see them query by departmentIds only — supplying employeeIds restricts results to those employees' assigned shifts and excludes open shifts, which belong to no employee. For a portal-wide query with no department named, call list_departments first and pass every department id; never guess ids. Each shift carries the employee, department, position, employee-group and shift-type names alongside their ids — describe shifts to the user by those names, not by id. Not every shift has all of them: a shift often has no position, and an open shift has no employee. A null name there means the shift has no such entity, or that its name could not be looked up — in either case say so ("no position set", "unassigned") rather than showing the id in its place. shiftTypeName is different: every shift has a shift type, and a null shiftTypeId is the portal's default one, which Planday calls Normal. Describe those shifts as Normal, never as having no shift type. A name or comment too long to return in full is shortened and ends with '…', so treat a value ending that way as partial.

list_working_time_rules

ChatGPT
Returns the portal's working time rules — the labour rules (e.g. max timesheet length, minimum rest between shifts) that govern scheduling. Each entry gives the rule's type and the employee groups and types it applies to. Use get_working_time_rule for a rule's full thresholds.

profile

ChatGPT
Returns the authenticated caller's own profile: their employee ID, full name, nick name, job title, the portal (organisation) they belong to, and the departments and employee groups they are in. Use this to find out who the current user is and which departments/groups they belong to, without asking for an ID. It returns no contact or sensitive personal data (no email, phone, address, SSN or bank details) and never returns another user's details. If the caller lacks permission to read departments or groups, those lists are returned empty while the identity is still provided.

publish_draft_shifts

ChatGPT
Publishes draft shifts in a department so employees can see them. Provide the IDs of the draft shifts to publish. Every ID must be a shift in that department, otherwise the call fails and nothing is published. IDs that are already published are reported back, not republished.

approve_shift_swap

Claude

assign_shift

Claude

create_draft_shift

Claude

get_working_time_rule

Claude

list_absence_accounts

Claude

list_absence_policies

Claude

list_departments

Claude

list_employees

Claude

list_shifts

Claude

list_working_time_rules

Claude

profile

Claude

publish_draft_shifts

Claude

Capabilities

Writes

Similar Apps