Edays MCP server
Summary: The Edays MCP server lets MCP clients read (and, with writes enabled, manage) Edays absence data.
List employees (
list_users): all users with partner IDs, names, job titles, leaver flags, start dates, FTE and hours; filter by name/partner ID and optionally include leavers.Get a user (
get_user): one employee by partner ID with their groups and authorisation hierarchy (who approves their leave).List absences (
list_absences): system-wide or per-user absence records with status, start/end, duration and type; filter by dates, record type, absence type, user, group, created/modified since.Get an absence (
get_absence): one absence record by GUID.List absence types (
list_absence_types): configured holiday, sickness and other types, including custom day and public holiday groups, with booking and calendar flags.Get entitlements (
get_user_entitlements): a user's deducting balances (annual entitlement, booked, taken, remaining), summing balances (sickness etc.) and entitlement pots.Get a user's rota (
get_user_rota): rota assignments plus public holiday and custom day patterns.List public holiday patterns (
list_public_holidays): public holiday and custom day patterns (id and name).List groups (
list_groups): group types (Country, Location, Team) and the groups within them.Book/update/cancel absences (only with
EDAYS_ALLOW_WRITES=true): create a booking, update an absence (including approving/rejecting/cancelling via status), or delete an absence.Safety/redaction: read-only by default; contact and HR details are withheld and emails, phones and postcodes redacted from free text unless
include_contact_details=true.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Edays MCP server Who is off next week, and is anything still waiting for approval?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Edays MCP server
An MCP server that lets Claude, ChatGPT and other MCP clients work with an Edays absence management system: employees, absences, absence types, entitlement balances, rotas, public holiday and custom day patterns and groups, and (when enabled) booking, updating and deleting absences. It is built from the public API V2 documentation at developer.e-days.co.uk. Edays publishes no OpenAPI document for API V2, only JSON examples, so the tests validate against schemas written from those examples and check the schemas against the examples themselves.
Once it's connected, an HR or line manager on the system can ask things like:
"Who is off next week, and is anything still waiting for approval?"
"How much holiday does Dana Barrett have left this year, and how many sick days has she had in the last three months?"
"Which team is Willie in, and who approves his leave?"
"What rota is Priya on, and which public holiday pattern applies to her?"
With writes enabled: "Book Dana two days' holiday on 13 and 14 October." / "Approve Willie's pending holiday request."
Tools
Tool | What it does | API calls |
| Every user on the system, filtered locally by part of the name or partner ID; leavers skipped unless asked. The endpoint is not marked as paged in the documentation; the paging headers are read anyway and further pages fetched if the system does page it, with a |
|
| One user by partner ID with their groups and their authorisation hierarchy (step one and two authorisers and alternates). |
|
| Absence records system-wide or for one user, with status, start and end, duration and absence type ID, in whole API pages up to |
|
| One absence record by GUID. |
|
| Absence types with record type (planned, unplanned) and booking and calendar flags; the API returns Custom Day Groups (5) and Public Holiday Groups (6) from the same endpoint. |
|
| A user's deducting balances (annual entitlement, transfers, pending, booked, taken, untaken, remaining, per booking period and element), summing balances (year to date, last 6 and 3 months, last 30 days) and entitlement pots. |
|
| A user's rota assignments with start dates, and their public holiday and custom day patterns, named from the system's lists. |
|
| The public holiday patterns and custom day patterns held in the system (id and name; API V2 does not expose the dates inside a pattern). |
|
| Group types (Country, Location, Team...) and the groups in each, or one type. |
|
| Creates an absence for a user GUID with the documented body ( |
|
| Fetches an absence and PUTs the documented body with your changes merged in: type, status (the only documented way to approve, reject or cancel through API V2), start, end, open flag, details. Writes only, marked destructive. |
|
| Deletes an absence record with the documented DELETE. Writes only, marked destructive. |
|
There are no approve_absence or reject_absence tools because API V2 documents no such endpoints; the "Managing Absences" section says the status of an existing record is changed with PUT /api/v2/absences/{id}, which is what update_absence does with status: "Approved" or "Rejected".
Not covered on purpose: creating, editing, patching and deleting users, marking leavers and reinstating, user settings and email notifications, roles and bulk roles, rota, public holiday and custom day assignment, entitlement adjustments, authorisation hierarchies (writes), user templates, group and group type writes, bulk user-group membership, global entitlement configuration and user balances, SSO certificates and IdP configuration, and the remaining lookup lists.
Related MCP server: mcp-server-personio
Setup
Requires Node 18 or later.
npm install
npm run buildYou need API client credentials for your Edays system. As the Authentication section documents: create a dedicated user in Edays, on its Roles tab select the account type Api Client, and generate a Client ID and Client Secret there (the secret is shown once; regenerating it replaces the old one). The server exchanges them for a Bearer access token at https://YOUR-SYSTEM.e-days.co.uk/token (OAuth 2.0 client credentials, form-encoded), which the documentation says is valid for one hour.
YOUR-SYSTEM is the subdomain of the address you sign in at.
Claude Desktop: add this to claude_desktop_config.json:
{
"mcpServers": {
"edays": {
"command": "node",
"args": ["/absolute/path/to/edays-mcp/dist/index.js"],
"env": { "EDAYS_SYSTEM": "your-system", "EDAYS_CLIENT_ID": "your-client-id", "EDAYS_CLIENT_SECRET": "your-client-secret" }
}
}
}Claude Code:
claude mcp add edays -e EDAYS_SYSTEM=your-system -e EDAYS_CLIENT_ID=your-client-id -e EDAYS_CLIENT_SECRET=your-client-secret -- node /absolute/path/to/edays-mcp/dist/index.jsVariable | Required | Meaning |
| yes, unless | The subdomain of your Edays system: |
| yes | The Api Client user's Client ID, sent in the token request body. |
| yes | The Api Client user's Client Secret, sent in the token request body. Never logged or included in an error message. |
| no |
|
| no | Overrides the system URL, e.g. |
Safety defaults
Read-only unless
EDAYS_ALLOW_WRITES=true. Read tools carry the MCPreadOnlyHintannotation;update_absenceandcancel_absenceare marked destructive (a PUT replaces the whole record, and DELETE removes it);book_absenceis not.Employee records are third-party personal and HR data. By default a user's
Email,Login,HomeEmail,HomePhone,WorkPhone,WorkPhoneExt,HomeAddress,NextOfKin,NextOfKinContactDetails,Dob,PayrollNumber,EmployeeNumber,SsoUserId,ClientProvidedIdandAnnualPayare not returned, an absence'sPayrollNumberandEmployeeNumberare not returned, and an entitlement'sLoginis not returned. In every other free-text field (names, job titles, absence type, entitlement, rota, pattern, group and group type names, and Edays' own error messages, including the excerpt of a non-JSON body) email addresses are replaced with[email redacted], phone-number-like sequences with[phone redacted]and UK postcodes with[postcode redacted]. Dates inside free text are not redacted (a date in a rota or group name is far more likely to be a schedule than a date of birth; theDobfield itself is withheld).include_contact_details=truereturns all of it as stored. Names and partner IDs are always returned as stored, including the authoriser partner IDs onget_user: the partner ID is the key every user endpoint is addressed by, so on a system whose partner IDs are login email addresses those addresses appear by default. The phone match is a heuristic: it covers international numbers written with+or00(including the+44 (0)7700 …form), UK numbers with a bracketed area code such as(020) 7946 0958, and UK-style0…numbers of 9 to 11 digits with spaces, dots or hyphens between groups; other digit strings that happen to start with0are redacted too, while GUIDs, numeric IDs and timestamps are left alone. The postcode match is upper case only (CF64 3DH,SW1A 1AA,EC1A1BB), so another code written in that shape would be redacted too. Bank and payment details do not exist in API V2.The access token is held in memory only, refreshed a minute before its documented one-hour expiry, and fetched afresh once when a call answers 401; it never appears in logs or error messages, and neither does the client secret. Only a JSON message from the token endpoint is ever passed on, never its raw body: a 200 without an
access_tokenwhere the server looks is reported with the body's top-level key names (a bare value could be the token under another key), and a 5xx fromPOST /tokenis retried like a GET (fetching a token is idempotent) and reported without the gateway's HTML.list_absencesreturns whole API pages, never part of one. The page size sent ismin(100, max_results), and a call stops before a page that could take it pastmax_results(allowing for a shorter last page when the total says fewer remain), socountcan be belowmax_results. The result carriespage_size,next_pageand anotesaying to call again with that page and the samemax_results, because page numbers only line up for one page size. The end of the list is judged from the records actually received against the documentededays-pagination-totalheader, not from theedays-pagination-page-sizeheader alone: no maximum page size is documented, and a cap that still echoed the requested size would otherwise end a list after one page. A continuation call that starts on a short page therefore confirms the end with one extra request, which returns an empty page.IDs are checked before any call is made: partner IDs may be any single path segment (spaces included, as in the documented
"Phil Jones"; no slashes, control characters or leading or trailing spaces; at most 200 characters) and are URL-encoded; absence and user GUIDs must look like GUIDs; absence type IDs must be positive integers. The four names documented directly under/api/v2/users/(autosetupauthorisers,recalculateauthorisationhierarchy,authorisation,applyRotaToUsers) are refused as user IDs in any letter case: the first two change data when fetched with GET (they add users to the authoriser role and reassign pending requests), so a read-only tool must never reach them.date_from/date_totakeYYYY-MM-DD(or the documentedYYYYMMDD) and real calendar dates only. Absence times takeYYYY-MM-DD HH:MMor ISO 8601 with aTand are sent in the documentedYYYY-MM-DD HH:MMform; no time zone is accepted because none is documented.12/08/2026, a bare year,25:00and a trailingZare refused locally.book_absenceandupdate_absencerefuse an end before the start,update_absencerefuses a call with no change, andlist_absencesrefuses the system-wide filters together withpartner_user_id, because the per-user endpoint documents onlyrecordtype,absencetype,datestartanddateend.Edays does not document a rate limit anywhere on the API V2 page. Requests are spaced 250 ms apart (about four per second). A 429 is retried at most twice for any method, including
POST /api/v2/absences, on the assumption that a rate-limited request was not processed. The retry waits forRetry-After(whole or fractional seconds, or an HTTP-date; 2 s then 4 s when the header is absent or unreadable). Each wait is capped at 10 seconds, so one request waits at most 20 seconds in all; a tool call that makes several requests (pages, lookups) can still run past the MCP client's default 60-second request timeout. Past the cap: if Edays asks for a longer wait the call gives up at once and the message says how long to wait. The cap is per request, not per tool call:list_absencescan make up to 20 requests in one call andget_user_rotaup to six, so a long run of 429s across those could still exceed the client's timeout.502, 503 and 504 are retried the same way for
GETand forPOST /tokenonly; when all three attempts fail the error says the service may be unavailable and to try again in a few minutes, without the gateway's HTML. APOST,PUTorDELETEon an absence is never retried after a gateway error, because the request may already have been processed and a retry could book the same absence twice; the error says to check withlist_absencesorget_absencebefore repeating it.A 200 whose body is not JSON (a proxy or a login page in the way) is reported as an error naming
EDAYS_SYSTEM/EDAYS_BASE_URL, never as an empty list or an empty record; the 60-character excerpt of the body in that message goes through the same contact redaction as everything else.Rejected client credentials produce a message that says which variables to fix and where the credentials come from; a 401 that survives a token refresh says to check the Api Client user; a 403 says the user's roles do not allow the operation; a 400 passes on Edays' message and, if present, its
ModelStatevalidation errors field by field.
Tests
npm testThe test suite:
Extracts the documentation into
spec.jsonon the first run:test/extract-examples.mjsfetcheshttps://developer.e-days.co.uk/, drops the parts of the page that sit in HTML comments (they are not published), and records every "Resource URL" with its "Supported HTTP Methods" line and every "Example ... Request/Response" JSON block (119 examples on 90 resources; 6 examples are not valid JSON on the page and are recorded as such; a repeated Resource URL continues the same resource, and the one resource with no methods line, the bulk authorisation PATCH, takes its method from its example and is marked as inferred). The JSON schemas intest/schemas.mjswere written by hand from those examples (every documented key required, no other keys, types as shown); the first check validates each schema against the documented example it came from (26 examples), confirms every endpoint this server calls is documented with that method, that the two data-changing GET endpoints under/api/v2/users/are indeed documented as such, and that the mock's client ID and secret are obviously fake values that do not appear on the documentation page. The second check validates every fixture record against the schemas.Starts a local mock of the system:
POST /tokenwith the documented form-encoded client-credentials grant (answering the documented one-element array, or a plain object when told to), a 400invalid_clientfor wrong credentials, a 401 for any API call without a token the mock issued, the endpoints used here with the documentedpage/pagesizepaging and the fouredays-pagination-*headers (absences capped at 4 per page so lists span several pages; on request the page-size header echoes the requested size instead, andGET /api/v2/userspages too), 404s for unknown IDs,POST /api/v2/absencesanswering 201 (with the record, or with no body when told to), 204 on PUT and DELETE, injected failures on any endpoint including/token, and a one-off 429 on the firstGET /api/v2/absencetypes. The third check validates the mock's token and list, detail and write responses against the schemas.Starts the built server and drives it over stdio with the official MCP client: 29 checks (32 in the whole suite) covering every tool, tool annotations, the token fetched with the documented body before the first API call and reused on every call as a Bearer header, a revoked token refreshed once with the call retried, a token near expiry refreshed before it expires, the object-shaped token response, page-based pagination stopping at
edays-pagination-totaland returning whole pages only (following the tool's own continuation notes from a first page and from a later one yields every record exactly once;max_resultsequal to the total fetches the short last page; a page-size header that echoes the requested size while serving fewer does not end the walk early),list_usersfollowing the paging headers whenGET /api/v2/userspages and saying so, every documentedlist_absencesfilter passed through exactly (datestart/dateendfromYYYY-MM-DDandYYYYMMDD,recordtype,absencetype,userId,groupId,dateCreated,dateModified) with bad dates (including a mix of the two date forms) and IDs refused before any call, the four reserved endpoint names under/api/v2/users/(read from the documentation, in any letter case) refused by every user tool with no request made, a partner ID with a space sent as one encoded segment and the single-user URL sent with its documented trailing slash, the per-user endpoint with its three filters and the refusal of the others, redaction of contact and HR details and of emails, phone numbers and postcodes typed into names, job titles, rota and group names by default and their return on request, authoriser partner IDs returned as stored, absence types named for record types 1, 2, 5 and 6, entitlement balances with booking period and time unit names, rotas and patterns named from the lists with the lists cached, thePOSTandPUTbodies validated against the schemas from the documented POST and PUT examples (times normalised,Detailssent empty on a booking when omitted and left out of a PUT when not given), the DELETE, the 429 retry waiting forRetry-Afterin the seconds, fractional-seconds and HTTP-date forms, giving up after three attempts on a persistent 429 and at once on aRetry-Afterabove the cap, a 429 onPOSTretried once, a 502 retried forGETand never forPOST,PUTorDELETE, a 401 that survives a token refresh reported with the Api Client advice, aGETfailing three times with 503 reported with advice and without the gateway HTML, a 503 onPOST /tokenretried and reported the same way, a 429 onPOST /tokenwithoutRetry-Afterretried after the 2 s fallback, a 200 fromPOST /tokenwithout a token reported with key names only (never a value), Edays' own error text passed on with contact details redacted andModelStateerrors listed, the 403 message, a 200 with a non-JSON body reported as an error with the excerpt redacted, the write gate with the variable unset and set tofalse, the 400 for wrong client credentials naming the variables without echoing the secret, a badEDAYS_SYSTEMor a missing secret stopping the server at start-up,EDAYS_SYSTEMalone producinghttps://<system>.e-days.co.uk(read from the start-up line; no request is made to that host), and that every request either carried the documented form body to/tokenwith noAuthorizationheader or carried a Bearer token the mock issued to a documented method and path, none of them a reserved endpoint name in place of a user.
Status
This is a working prototype. It has not yet been run against the live API, because it was built without an Edays system or Api Client credentials. Everything below is taken from the documentation page and should be confirmed on a real system:
The token endpoint: whether the response is the one-element array shown in the documented example or a plain object (both are accepted), what a wrong Client ID or Secret answers (the mock uses the OAuth 2.0
400 invalid_client; the page documents nothing), and whether the API answers 401 for an expired token (the server refreshes once on a 401 and a minute before the documented hour either way).Whether
GET /api/v2/users/{partnerUserId}returnsEdaysId. The documented example omits it while the list example has it, soget_userreports noedays_idandlist_usersdoes; the mock follows the examples. The server sends the documented URL with its trailing slash (the mock accepts both forms).Whether
GET /api/v2/userspages. The page marks only the two absence lists as paged, but that marker is not exhaustive (the/usergroupsendpoint says in prose that it pages at 500), solist_usersreads the paging headers and fetches further pages if the first answer is short ofedays-pagination-total; untested against a real system, as is how long the call takes on a large one. Whether it includes leavers (IsLeaveris filtered locally), and whether a real record ever carriesnullwhere the examples show empty strings (the formatter copes; the schemas allownullonly forEmploymentStartDateandContinuousStartDate, where the examples show it).Whether a partner ID with a space (
"Phil Jones"in the documented authorisation example) really is addressable as/api/v2/users/Phil%20Jones/; the server accepts and encodes it.Paging: the query parameter is written
pageSizein the Paging text andpagesizein every example; the server sendspagesize. No maximum page size is documented (the default is 50, the paging example shows 500); the server asks for at most 100 and ends the list when the records received reachedays-pagination-total, taking a page shorter than requested as the end only when that header is missing. What a page past the end returns is not documented (the mock answers 200 with an empty list).The
datestart/dateendfilters: whether a record must start inside the range or merely overlap it, and whether the bounds are inclusive (the mock uses inclusive overlap). The formats ofdateCreatedanddateModifiedand whethergroupIdtakes the group's GUID or its partner ID are not documented; those three values are sent exactly as given.userIdis assumed to be the GUID shown asUserIdon absence records andEdaysIdon users (the examples show the same value for both).POST /api/v2/absences: whether it answers 200 or 201, what the body is (the page documents neither; the tool formats a body that looks like an absence record and passes anything else through), and whether aLocationheader is sent. WhichStatusvalues it accepts on creation (the example usesPending; the tool offers the seven texts from/api/v2/lists/recordstatus) and whether the caller's roles allow booking for others.PUT /api/v2/absences/{id}: whether it answers 200, 201 or 204 (all documented; the tool re-reads the record when no body comes back), and what happens toDetailswhen the key is omitted, sinceGETdoes not return it. Whether settingStatustoApproved,RejectedorCancelledthrough PUT really approves, rejects or cancels the request as the UI would, including notifications.DELETE /api/v2/absences/{id}: whether the record is removed or kept as Cancelled, and what the response is beyond the documented 204.The time zone of
StartTime/EndTime(none is documented; the server sends the values as given) and the "midnight to midnight" rule for day-based absences quoted from the Managing Absences section.The record type discriminator names 5 (Custom Day Group) and 6 (Public Holiday Group) come from the Absence Types section; 1 and 2 from the lists section. Booking period and time unit names come from the documented
/api/v2/lists/bookingperiodsand/api/v2/lists/timeunitsexamples and are mapped locally rather than fetched.The documented example for
GET /api/v2/users/{partnerUserId}/customdaysis not valid JSON ({ [ "Pattern": 3 ] }); the server reads that endpoint likepublicholidays([{"Pattern": n}]).Error bodies: none are documented. The server reads
Message,message,error,error_description,ExceptionMessageandModelStateand redacts contact details from them regardless.Rate limits: nothing is documented anywhere on the page (the word does not appear), so the 250 ms spacing here is a guess on the polite side, and a 429 on
POSTis retried on the assumption that a rate-limited request was not processed.Which roles the Api Client user needs for each endpoint; a 403 is reported with that explanation but the page does not describe the role model.
Going to production
This version runs locally over stdio, with the customer's own Api Client credentials. For customers to connect from claude.ai or ChatGPT without handling credentials, the next step is a remote server (Streamable HTTP) behind OAuth, hosted by Edays, and then a listing in the Claude and ChatGPT connector directories.
Licence
MIT. Built by Alexandru Dragoș (alexandru.dragos96@gmail.com) with an AI agent (Claude) working under his direction.
Available Tools
9 toolsget_absenceGet an absenceARead-only
One absence record by its GUID: user, absence type, status, start and end, duration, time unit, created and modified dates. Payroll and employee numbers only with include_contact_details.
Inputs: absence_id (required), include_contact_details.
get_userGet a userARead-only
One employee by partner ID, with the groups they belong to (team, location and so on) and their authorisation hierarchy (who approves their requests: step one and step two authorisers and alternates, as partner IDs). Contact and HR details only with include_contact_details.
Inputs: partner_user_id (required), include_groups, include_authorisers, include_contact_details.
get_user_entitlementsGet a user's entitlement balancesBRead-only
Entitlement balances for one user. Deducting entitlements (holiday and the like, which count down: annual entitlement, transfers, pending, booked, taken, untaken, remaining, per booking period and element) and summing entitlements (sickness and the like, which count up: year to date, last 6 and 3 months, last 30 days), plus the entitlement pots they belong to. Booking period and time unit numbers are named from the documented lists (Current, MinusOne, PlusOne; Days, Minutes, Hours).
Inputs: partner_user_id (required), include_pots, include_contact_details.
get_user_rotaGet a user's rota, public holidays and custom daysBRead-only
The rota (working pattern) assignments of one user with their start dates, named from the system's rota list, and with include_patterns the public holiday and custom day patterns applied to the user, named from those lists. Up to six API calls.
Inputs: partner_user_id (required), include_patterns, include_contact_details.
list_absencesList absencesARead-only
Absence records (holiday, sickness and other absence types) across the system or for one user, with status, start and end, duration and the absence_type_id (name it with list_absence_types). Filters are sent to the API as documented: date_from/date_to (datestart/dateend), record_type (1 planned, 2 unplanned), absence_type_id, and on the system-wide endpoint also user_id (Edays GUID), group_id, created_since and modified_since. With partner_user_id the per-user endpoint GET /api/v2/users/{id}/absences is used instead, which documents only the first three filters. Whole API pages of min(100, max_results) records are returned; the note says how to continue. Payroll and employee numbers only with include_contact_details.
Inputs: page, date_to, user_id, group_id, +8 more.
list_absence_typesList absence typesARead-only
The absence types configured on the system (Holiday, Sickness and so on) with their record type (1 planned, 2 unplanned) and booking and calendar-visibility flags. The API also returns Custom Day Groups (record type discriminator 5) and Public Holiday Groups (6) from the same endpoint; they are kept unless record_type filters them out.
Inputs: record_type, include_contact_details.
list_groupsList group types and groupsARead-only
The group types on the system (Country, Location, Team and so on) and the groups within each (England, Nottingham, Programming), with partner IDs. One call for the types plus one per type for its groups; give group_type_partner_id to fetch a single type.
Inputs: group_type_partner_id, include_contact_details.
list_public_holidaysList public holiday and custom day patternsARead-only
The public holiday patterns held in the system (for example 'UK Public Holidays') and, with include_custom_days, the custom day patterns (for example 'Christmas Shutdown'), as id and name. The API lists the patterns only; the dates inside a pattern are not exposed by API V2.
Inputs: include_custom_days, include_contact_details.
list_usersList usersARead-only
Employees on this Edays system with partner_id (the key other tools take), name, job title, leaver flag, settings template, start dates, FTE and hours per day. GET /api/v2/users is not marked as paged in the documentation; the whole list is fetched (following the edays-pagination-* headers page by page if the system does page it) and filtered locally: query matches part of the name or partner ID, and leavers are skipped unless asked for. Contact and HR details (email, login, phones, address, next of kin, date of birth, payroll and employee numbers, pay) only with include_contact_details.
Inputs: query, max_results, include_leavers, include_contact_details.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 9 tools
Most tools target clearly distinct resources and verbs (list_users vs get_user, list_absences vs get_absence, entitlements vs rota). The main overlap is conceptual: list_absence_types also returns custom day and public holiday groups, blurring its boundary with list_public_holidays, but the descriptions call this out and help steer selection.
Every tool follows a predictable get_/list_ + resource pattern in snake_case (list_users, get_user, get_user_rota), including consistent handling of nested resources like user entitlements and rota.
9 tools is well-scoped for an HR/absence domain, each covering a distinct facet (holidays, groups, absence types, users, absences, entitlements, rota) without redundant entries.
The surface is entirely read-only: there is no way to book, update, delete, or approve an absence, yet the domain is fundamentally about managing absences, leaving an obvious lifecycle gap. Read coverage of users, absences, entitlements and rota is solid, so an agent can inspect but not act.
Maintenance
Related MCP Connectors
Read Breathe HR employees, absences, sickness and leave; create and review leave requests.
Read Papershift absences, vacation, time tracking and shifts; request and review absences.
Read Jet HR employees, absences, clockings, payroll; create, approve, delete leave; create expenses.
Read employees, leave, recruiting and reports; book or decide leave and add applicant notes.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceEnables interaction with employee management systems through a standardized MCP interface. Supports comprehensive employee operations including CRUD operations, search, filtering by level/status, and data synchronization.-
- AlicenseAqualityCmaintenanceMCP server for the Personio HR API with employee and HR profiles, enabling self-service and HR operations like managing absences, attendances, documents, and organizational data.10Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables managing Personio HR and recruiting data through MCP tools, including employees, absences, time tracking, documents, custom reports, and recruiting workflows such as jobs, candidates, and applications.14 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables Claude and other MCP clients to query and register HR data from TramitApp, including employees, clockings, absences, shifts, and vacation balances, with multi-company support.MIT