pl-holidays-mcp
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., "@pl-holidays-mcpAdd 14 business days to 2026-07-22"
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.
honest-pl-holidays-mcp
Local MCP server for Polish public holidays and business-day arithmetic. Wraps the open Nager.Date holiday database and adds bookkeeping-friendly business-day math on top.
Part of the honest-mcp family of small, auditable, local-first MCP servers.
Why
Every Polish accountant, JDG owner, or HR person has this problem:
"Payment term is 14 dni roboczych from invoice date — what's the actual due date?"
"Is the client's 'termin płatności 2026-05-01' even a business day? (No — that's Święto Pracy.)"
"Deadline for JPK_V7 is the 25th — but 2026-04-25 is a Saturday, does it slip to Monday?"
This server hands both raw holiday data and business-day arithmetic to your AI. No more spreadsheet calendars.
Supports any country Nager.Date covers (200+), but the API defaults to Poland and the bookkeeping angle is Poland-centric.
Weekend caveat: the weekend is always Saturday + Sunday, whatever country you pass — only the holiday list changes per country. Business-day results for countries with a different weekend (e.g. Friday–Saturday in Egypt) will be wrong.
Related MCP server: Nager MCP v102 MCP Server
Features
Six tools:
list_holidays— all public holidays in a given yearis_holiday— is this specific date a public holiday?is_business_day— is this date Mon–Fri and not a holiday? Includes reason (weekend / holiday / business_day)count_business_days— inclusive business-day count between two datesadd_business_days— start_date + N business days = ? (N can be negative)next_holidays— upcoming N holidays from a given date
Data source
Endpoint: date.nager.at/api/v3
No API key
MIT-licensed holiday data
In-memory cache per year and country — normally one round trip per year and country per session
Requirements
Python 3.10+
Setup
git clone https://github.com/bartosz-kuc/honest-pl-holidays-mcp.git
cd honest-pl-holidays-mcp
python3 -m venv venv
./venv/bin/pip install -r requirements.txtOn Windows, use venv\Scripts\pip and venv\Scripts\python instead of venv/bin/pip and venv/bin/python (here and in the configs below).
Register with Claude Code:
claude mcp add pl-holidays /absolute/path/to/venv/bin/python /absolute/path/to/server.pyClaude Desktop claude_desktop_config.json:
{
"mcpServers": {
"pl-holidays": {
"command": "/absolute/path/to/venv/bin/python",
"args": ["/absolute/path/to/server.py"]
}
}
}Example usage
"Invoice issued today with 14 working-day payment term — when is it due?"
add_business_days(start_date="2026-07-22", days=14) → the due date, skipping weekends and Polish public holidays.
"How many working days between 2026-04-01 and 2026-04-30?"
count_business_days(from_date="2026-04-01", to_date="2026-04-30")
"Is May 1st 2026 a business day in Poland?"
is_business_day(date="2026-05-01") → false, reason: holiday (Święto Pracy).
Data flow
Your AI client
↕ MCP stdio
This server (Python, on your machine)
↕ HTTPS
date.nager.at (Nager.Date open holiday DB)No cloud middle for anything but the initial holiday-date fetch. No telemetry.
Author
Bartosz Kuć — Warsaw-based developer, JDG owner running skanfirmy.pl.
GitHub: https://github.com/bartosz-kuc
Email: firma@bartosza.pl
Consulting
Available for consulting on Polish tax and business integrations (KSeF, GUS/NFZ/GIOŚ APIs, mBank data), MCP server design, and AI-assisted tooling for JDGs and small teams. See skanfirmy.pl/uslugi for productized packages (audit 3k PLN, setup 8-15k PLN, retainer 2-4k PLN/mo), or reach out via email.
License
MIT — see LICENSE.
Related
Part of the honest-mcp family — see the family index.
Available Tools
6 toolsadd_business_daysA
Add N business days to a start date and return the resulting date. N can be negative to subtract. Skips weekends and Polish public holidays. If start_date is itself a non-business day, counting starts from the next business day (the previous one when N is negative). The weekend is always Saturday + Sunday, whatever country is passed; only the holiday list changes per country.
| Name | Required | Description | Default |
|---|---|---|---|
| days | Yes | Number of business days to add (negative to subtract) | |
| country | No | ISO 3166-1 alpha-2 country code for the holiday list (default PL); does not change the Sat/Sun weekend | PL |
| start_date | Yes | YYYY-MM-DD |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and meets it well. It discloses weekend/holiday skipping, the non-business-day start rule for both positive and negative N, and the fact that only the holiday list varies by country while the weekend definition is fixed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the core operation in the first sentence and necessary edge cases following. Every sentence adds relevant information about the calculation, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple date-addition utility, the description covers the calculation logic fully and states that it returns the resulting date. The only minor gap is that it does not explicitly say the output is a YYYY-MM-DD string, which is otherwise implied by the input schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, giving a baseline of 3, but the description adds real parameter meaning beyond the schema: the subtle rule for start_date when it is not a business day and the clarification that country affects only the holiday list, not the weekend. This goes beyond the generic schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Add N business days to a start date and return the resulting date,' with negative N explicitly allowed. This clearly distinguishes the tool from siblings like is_business_day or count_business_days, which perform different date operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The usage is implied by the verb 'Add N business days' and the description of edge-case behavior, but it never explicitly names sibling tools or states when to use this tool instead of count_business_days or is_business_day. It provides clear context about how the tool behaves, but no explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
count_business_daysA
Count business days between two dates (inclusive), skipping weekends and Polish public holidays. Useful for enforcing '14-dni-roboczych' style payment terms. The weekend is always Saturday + Sunday, whatever country is passed; only the holiday list changes per country.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | ISO 3166-1 alpha-2 country code for the holiday list (default PL); does not change the Sat/Sun weekend | PL |
| to_date | Yes | YYYY-MM-DD (inclusive) | |
| from_date | Yes | YYYY-MM-DD (inclusive) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It does well by disclosing that both dates are inclusive, that the weekend is always Saturday+Sunday regardless of country, and that country only changes the holiday list. It could add edge-case behavior such as reversed date order, but the core semantics are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: core behavior first, then a practical use case, then a clarification of the most likely misinterpretation. Every sentence carries meaning and no information is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a small deterministic counting tool, the definition is complete. The input schema covers formats and required fields, while the description explains the two potentially surprising aspects: inclusive bounds and weekend handling independent of country. The return value is implied by the verb 'count', and no output schema exists to reconcile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by reinforcing that both dates are inclusive and by clarifying that the country parameter affects only holidays, not the weekend definition. This supplements the schema and reduces the chance of misusing the country parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb-resource pair: count business days between two inclusive dates, skipping weekends and Polish public holidays. It clearly differentiates from siblings like list_holidays, is_business_day, and add_business_days because it is the only counting tool in the group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a concrete application context (enforcing '14-dni-roboczych' payment terms) that signals when counting business days is the right operation. However, it does not explicitly name sibling alternatives or state when not to use it, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
is_business_dayA
Check whether a date is a Polish business day — Monday–Friday and not a public holiday. Returns the answer plus the reason (weekend / holiday / business_day). The weekend is always Saturday + Sunday, whatever country is passed; only the holiday list changes per country, so results are wrong for countries with a different weekend.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD | |
| country | No | ISO 3166-1 alpha-2 country code for the holiday list (default PL); does not change the Sat/Sun weekend | PL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the key behavioral trait that the weekend is fixed to Sat/Sun irrespective of the country parameter, and it warns about incorrect results for non-standard weekend countries. It also states the return structure (answer plus reason). This is transparent for a read-only check, though it does not mention any potential side effects or limitations beyond the weekend caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero fluff. The first sentence states the purpose and return value, and the second delivers the critical caveat. It is front-loaded and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, no output schema), the description covers the essential context: it explains the return includes an answer and a reason (weekend/holiday/business_day), and it highlights the country-related pitfall. It could specify the exact format of the 'answer' (e.g., boolean) but that is minor. Overall, it is complete enough for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both parameters with 100% coverage, including the date format and the country's effect on holidays but not the weekend. The description repeats the weekend caveat that is already in the schema's country description, adding no new semantic meaning beyond what the schema provides. Thus the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Check whether a date is a Polish business day — Monday–Friday and not a public holiday.' It specifies the verb (check), resource (date), and scope (Polish business day). It also differentiates from siblings like is_holiday by focusing on business-day status and mentions the return value (answer plus reason).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides important usage context by warning that the weekend is always Saturday/Sunday regardless of country and that results are wrong for countries with different weekends. However, it does not explicitly state when to use this tool versus siblings like is_holiday or count_business_days, nor does it mention any exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
is_holidayA
Check whether a specific date is a public holiday in Poland. Returns holiday details if yes, null if no.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD | |
| country | No | ISO 3166-1 alpha-2 country code (default PL) | PL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior. It states the return value (holiday details or null) and implies read-only operation. However, it does not clarify scope (e.g., only national holidays, or does the country parameter override the 'Poland' mention), nor does it mention potential edge cases like timezone or date format handling. Adequate for a simple check but with gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the core purpose, zero waste. Efficient and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple boolean-like check with two parameters, the description provides the essential return behavior. However, it lacks detail on the exact structure of 'holiday details' and does not clarify that the country parameter can be used to check other countries, which is important given the default. The absence of an output schema increases the need for this information, so it is not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with descriptions (date format and country code default). The tool description adds no additional meaning beyond the schema, so it meets the baseline of 3 without enhancement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific action: checking whether a date is a public holiday in Poland, and specifies the return behavior (holiday details or null). Clearly distinguishes from siblings like list_holidays (which lists) and is_business_day (which checks business days) by naming the resource and condition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this tool versus alternatives. Does not mention that is_business_day is for a different check, nor any exclusions. The only context is the tool name and the sibling list, but the description itself is silent on selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_holidaysA
List all Polish public holidays in a given year. Each holiday has date, localName (Polish name), name (English name), and type. Defaults to Poland but supports any ISO 3166-1 alpha-2 country code.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | 4-digit year | |
| country | No | ISO 3166-1 alpha-2 country code (default PL) | PL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the disclosure burden. It usefully reveals the returned item fields and the country default/ISO support, but it does not disclose edge cases such as invalid country handling, sorting, or possible variation in holiday types by country.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with the core action front-loaded, followed by useful output-shape and country-scope details. There is minor redundancy with the schema default, but no wasted words of consequence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter list tool with no output schema, the description conveys enough to make a correct call: year is required, country is optional with a default, and returned items contain date and name fields. It could add return-format details like date type or sorting, but those are not essential for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds output-context but does not add new parameter semantics beyond what the schema already states; year is only documented as '4-digit year' in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a clear resource ('public holidays'), and a scope ('in a given year'), and it previews the output fields. It does not explicitly contrast with siblings, but 'all ... in a given year' distinguishes it from single-date or next-holiday tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this tool is for full-year enumeration rather than single-date checks like is_holiday or next_holidays, but it never says when to prefer it or when to use an alternative. The guidance is inferred rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
next_holidaysB
Get the upcoming public holidays (default: next 5) from a given date. Handy for planning around long weekends.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | How many upcoming holidays to return | |
| country | No | ISO 3166-1 alpha-2 country code (default PL) | PL |
| from_date | No | YYYY-MM-DD, defaults to today |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does not state whether the operation is read-only, what the output format looks like, how edge cases (e.g., no more holidays in the year) are handled, or whether the start date is inclusive. The description is minimal and lacks the behavioral detail needed for an agent to predict the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. The core function is front-loaded in the first sentence, and the use-case note in the second is optional but relevant. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with 3 fully documented parameters and no output schema, the description covers the main intent but leaves important gaps: no mention of the returned structure, the inclusivity of from_date, or how count interacts with holidays remaining. It is adequate for a basic understanding but not fully complete for calling without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the parameters and their formats. The description echoes the count default ('default: next 5') and the source date ('from a given date'), adding no significant meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get'), the resource ('upcoming public holidays'), and the default count, which is specific. It does not explicitly distinguish itself from siblings like list_holidays, but the 'upcoming' qualifier and 'from a given date' imply its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Handy for planning around long weekends' gives a use case but does not explicitly address when to use this tool versus alternatives like list_holidays or is_holiday. The intended usage is implied from 'upcoming' and 'from a given date', but no exclusions or sibling comparisons are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
add_business_days - First observed
count_business_days - First observed
is_business_day - First observed
is_holiday - First observed
list_holidays - First observed
next_holidays
TDQS
Scored across 6 tools
Each tool has a clear, distinct purpose: listing holidays, checking a single date, checking business-day status, counting business days, adding business days, and fetching upcoming holidays. Even list_holidays and next_holidays are clearly separated by temporal scope.
Most tools follow a clear verb_noun snake_case pattern: list_holidays, is_holiday, is_business_day, count_business_days, add_business_days. next_holidays is a minor deviation from the verb-first pattern, but it remains predictable and readable.
Six tools is a well-scoped size for a Polish holidays and business-day server. Each tool covers a meaningful operation without redundancy or unnecessary bloat.
The tool set covers the full domain: holiday enumeration, date checking, business-day determination, business-day counting, and business-day arithmetic. No significant gaps exist for the stated Polish holiday/business-day purpose.
Maintenance
Related MCP Connectors
Holidays MCP — wraps Nager.Date API (free, no auth)
Count working days between two dates, add business days to a date, or list public holidays.
Public holiday data for 30+ countries. Check holidays, working days and calendars via AI assistants.
Nager.Date Public Holidays MCP.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides access to the Nager.Date Public Holiday API for querying global holiday information through the Model Context Protocol. It enables AI agents to interact with standardized tools for holiday-related date calculations and country-specific lookups.-
- FlicenseNot gradedqualityDmaintenanceProvides access to the Nager.Date API through the Model Context Protocol, allowing AI agents to query worldwide public holiday information. It enables seamless integration of holiday data into LLM workflows using standardized tools.-
- AlicenseAqualityCmaintenanceProvides deterministic business-day calculations for AI agents, correctly handling country-specific weekends and public holidays.648 npm1Apache 2.0
- AlicenseNot gradedqualityBmaintenanceProvides public holidays, long weekends, and country data for 202 countries via the Nager.Date API, with client-side filtering and timezone-aware checks.BSD Zero Clause