business-day-mcp
Click on "Install 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., "@business-day-mcpIs July 4, 2025 a business day in the US?"
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.
business-day-mcp
MCP server for business-day arithmetic with country-aware holiday calendars (fastmcp + holidays).
What is this?
business-day-mcp exposes business-day math — "is today a business day?", "next business day after X", "how many business days between A and B?" — as tools an MCP client can call. Holiday calendars are provided by the holidays library and cover 60+ countries, with optional regional subdivisions. It is intended for use with MCP clients such as Claude Desktop, Kiro, and any other tool that speaks the Model Context Protocol. Requires Python >= 3.10.
Example questions it can answer:
Is today a business day in Germany?
When is the last business day of April 2026?
How many business days between Apr 21 and May 5 in the US?
Related MCP server: mcp-nager-holidays
Features / Tools
get_current_date— current date in a given IANA timezone.is_business_day— check whether a date is a business day for a country (+ optional subdivision).next_business_day/previous_business_day— step forward/backward by N business days.last_business_day_of_month— last business day of a given month.business_days_between— count business days between two dates.list_holidays— holidays for a country/year (+ optional subdivision).get_supported_countries— supported ISO 3166-1 alpha-2 codes and their subdivisions.get_supported_subdivisions— subdivisions and aliases for a single country.
All tools are read-only and safe to auto-approve.
Install
From the package
uvx business-day-mcpOr persistent install:
pip install business-day-mcpRun the server:
business-day-mcp
# or
python -m business_day_mcpFrom source
git clone https://github.com/fbdo/business-day-mcp.git
cd business-day-mcp
uv sync --all-extras
uv run business-day-mcpRun the test suite (coverage must stay ≥ 90%):
uv run pytestConfigure
Add to your mcp.json:
{
"mcpServers": {
"business-day-mcp": {
"command": "uvx",
"args": ["business-day-mcp"],
"autoApprove": [
"get_current_date",
"is_business_day",
"next_business_day",
"previous_business_day",
"last_business_day_of_month",
"business_days_between",
"list_holidays",
"get_supported_countries",
"get_supported_subdivisions"
]
}
}
}From a local clone
Run uv sync --all-extras in the cloned repo first, then replace /absolute/path/to/business-day-mcp below with the clone's absolute path (you can copy the same autoApprove array from the package example above if desired):
{
"mcpServers": {
"business-day": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/business-day-mcp",
"run",
"business-day-mcp"
]
}
}
}Usage Examples
The examples below show typical agent questions and the actual JSON returned by the server. Dates reflect the real 2025/2026 calendars from the holidays library.
Is this a business day?
"Is July 4, 2025 a business day in the US?"
Tool call: is_business_day(date="2025-07-04", country="US")
{
"date": "2025-07-04",
"country": "US",
"is_business_day": false,
"is_weekend": false,
"is_holiday": true,
"holiday_name": "Independence Day"
}Today's date in a specific timezone
"What's today's date in New York?"
Tool call: get_current_date(timezone="America/New_York")
{
"date": "2026-04-23",
"timezone": "America/New_York",
"day_of_week": "Thursday",
"iso_week": 17
}Next business day
"I'm scheduling a task for July 3, 2025 in the US. What's the next business day after that?"
Tool call: next_business_day(date="2025-07-03", country="US")
{
"input_date": "2025-07-03",
"next_business_day": "2025-07-07",
"country": "US",
"skipped_days": 4
}Previous business day
"What was the last business day before July 4, 2025 in the US?"
Tool call: previous_business_day(date="2025-07-04", country="US")
{
"input_date": "2025-07-04",
"previous_business_day": "2025-07-03",
"country": "US",
"skipped_days": 1
}Last business day of the month
"When is the last business day of May 2026 in the US?"
Tool call: last_business_day_of_month(year=2026, month=5, country="US")
{
"year": 2026,
"month": 5,
"country": "US",
"last_business_day": "2026-05-29",
"last_calendar_day": "2026-05-31"
}Business days between two dates
"How many business days are between December 20, 2025 and January 5, 2026 in the US?"
Tool call: business_days_between(start_date="2025-12-20", end_date="2026-01-05", country="US")
{
"start_date": "2025-12-20",
"end_date": "2026-01-05",
"country": "US",
"inclusive": false,
"business_days": 8,
"calendar_days": 16,
"holidays_in_range": [
{ "date": "2025-12-25", "name": "Christmas Day" },
{ "date": "2026-01-01", "name": "New Year's Day" }
]
}List holidays for a year (regional subdivision)
"List the 2026 public holidays in Bavaria, Germany."
Tool call: list_holidays(year=2026, country="DE", subdiv="BY")
{
"year": 2026,
"country": "DE",
"holidays": [
{ "date": "2026-01-01", "name": "New Year's Day" },
{ "date": "2026-01-06", "name": "Epiphany" },
{ "date": "2026-04-03", "name": "Good Friday" },
{ "date": "2026-04-06", "name": "Easter Monday" },
{ "date": "2026-05-01", "name": "Labor Day" },
{ "date": "2026-05-14", "name": "Ascension Day" },
{ "date": "2026-05-25", "name": "Whit Monday" },
{ "date": "2026-06-04", "name": "Corpus Christi" },
{ "date": "2026-10-03", "name": "German Unity Day" },
{ "date": "2026-11-01", "name": "All Saints' Day" },
{ "date": "2026-12-25", "name": "Christmas Day" },
{ "date": "2026-12-26", "name": "Second Day of Christmas" }
],
"subdiv": "BY"
}Discover supported subdivisions
"Which German states (subdivisions) can I use for holiday lookups?"
Tool call: get_supported_subdivisions(country="DE")
{
"country": "DE",
"subdivisions": ["BB","BE","BW","BY","HB","HE","HH","MV","NI","NW","RP","SH","SL","SN","ST","TH","Augsburg"],
"aliases": {
"Brandenburg": "BB",
"Berlin": "BE",
"Baden-Württemberg": "BW",
"Bayern": "BY",
"Bremen": "HB",
"Hessen": "HE",
"Hamburg": "HH",
"Mecklenburg-Vorpommern": "MV",
"Niedersachsen": "NI",
"Nordrhein-Westfalen": "NW",
"Rheinland-Pfalz": "RP",
"Schleswig-Holstein": "SH",
"Saarland": "SL",
"Sachsen": "SN",
"Sachsen-Anhalt": "ST",
"Thüringen": "TH"
}
}See
get_supported_countries()for the full list of 250+ supported countries and their subdivision codes.
Conventions
Dates: ISO 8601 strings (
YYYY-MM-DD).Countries: ISO 3166-1 alpha-2 codes (
DE,US,GB, ...) — case-insensitive.Timezones: IANA names (
Europe/Berlin,America/New_York, ...).Subdivisions (optional): country-specific region codes (
BYfor Bavaria,CAfor California, ...). Case-sensitive — pass exactly as returned byget_supported_countries. Omit to get nation-wide holidays only.
Regional subdivisions: all country-aware tools (is_business_day, next_business_day, previous_business_day, last_business_day_of_month, business_days_between, list_holidays) accept an optional subdiv parameter. Example: country="DE", subdiv="BY" treats Epiphany (Jan 6) as a holiday in Bavaria. Discover valid codes via get_supported_countries (returns a subdivisions: list[str] per country; [] for countries without regional variants, e.g. JP). For a single-country lookup that also includes alias names (e.g. "Bavaria" → "BY"), use get_supported_subdivisions(country="DE") — returns {subdivisions: ["BY", ...], aliases: {"Bavaria": "BY", ...}}.
Contributing
Contributions are welcome. See CONTRIBUTING.md for build, test, issue, and pull request guidelines. The project repo is at https://github.com/fbdo/business-day-mcp.
License
This project is licensed under the MIT License. See LICENSE.
Available Tools
9 toolsbusiness_days_betweenA
Count business days and list weekday holidays between two dates.
Use this to measure working-day spans for SLAs, delivery windows, or payroll
periods. Weekend holidays are NOT listed in holidays_in_range (they do not
reduce the business-day count); weekday holidays are.
Args: start_date: ISO 8601 date string (YYYY-MM-DD). Must be <= end_date. end_date: ISO 8601 date string (YYYY-MM-DD). country: ISO 3166-1 alpha-2 code (case-insensitive, normalized to upper). inclusive: When True, both endpoints count toward the range. When False (default), end_date is excluded (half-open interval). subdiv: Optional country-specific subdivision code (case-sensitive; see get_supported_countries). When omitted, only nation-wide holidays are considered.
Returns: dict with keys: start_date, end_date, country, subdiv (only if provided), inclusive, business_days (int), calendar_days (int), holidays_in_range (list of {date, name} for weekday holidays only).
Raises:
ValueError: if start_date > end_date, the span exceeds 100 years,
dates are malformed, or country/subdiv is unknown.
| Name | Required | Description | Default |
|---|---|---|---|
| start_date | Yes | ||
| end_date | Yes | ||
| country | Yes | ||
| inclusive | No | ||
| subdiv | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It details behavior: only weekday holidays listed, inclusive/exclusive effect, 100-year span limit, and error conditions (ValueError for invalid input). This is comprehensive.
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?
Well-structured with paragraphs and bullet points (Args, Returns, Raises). Every sentence adds value, though slightly verbose. Could be tightened but overall effective.
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 5 parameters, output schema existence, and sibling tools, the description is complete. Explains return dict structure, error types, and distinguishes from siblings like get_supported_countries.
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 0%, but the description fully compensates. It explains each parameter: date format, country case-insensitivity, inclusive default, subdiv case-sensitivity and relation to get_supported_countries. No ambiguity remains.
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 purpose: 'Count business days and list weekday holidays between two dates.' It distinguishes itself from sibling tools like is_business_day and list_holidays by combining counting and listing.
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 explicit use cases: 'measure working-day spans for SLAs, delivery windows, or payroll periods.' It explains what holidays are included/excluded but does not mention when to avoid this tool or suggest alternatives like is_business_day for single date checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_current_dateA
Return the current date in the given IANA timezone.
Use this when an agent needs a stable, server-computed "today" — for example before calling other tools that require a concrete date. Does NOT consult any holiday calendar.
Args: timezone: IANA timezone name (e.g. "UTC", "Europe/Berlin", "America/New_York", "Asia/Tokyo"). Defaults to "UTC".
Returns: dict with keys: date (YYYY-MM-DD), timezone, day_of_week (full weekday name), iso_week (1-53).
Raises:
ValueError: if timezone is not a recognized IANA zone.
| Name | Required | Description | Default |
|---|---|---|---|
| timezone | No | UTC |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and discloses that it does not consult holiday calendars, the output format (date, timezone, day_of_week, iso_week), and that it raises a ValueError for invalid timezones.
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 well-structured with 'Args', 'Returns', 'Raises' sections and is concise, providing all necessary information without unnecessary words.
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 simplicity of the tool and the presence of an output schema, the description is complete, explaining return values and error conditions. Context signals show 1 parameter and no complexity, so the description fully addresses them.
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 0%, but the description compensates by explaining the timezone parameter with examples, default value, and valid format (IANA timezone name). It adds meaning beyond 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 exactly what the tool does: return the current date in a given IANA timezone. It is distinct from sibling tools like business days or holiday calculators.
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 explicitly suggests using this tool when a stable, server-computed 'today' is needed before calling other tools. It does not explicitly state when not to use it or list alternatives, but sibling names provide context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_supported_countriesA
List all countries supported by the holidays library, with subdivisions.
Use this as the discovery tool before calling any country-aware tool. It tells
the agent which ISO country codes are valid AND which subdivision codes may be
passed as the optional subdiv argument on other tools.
IMPORTANT: Subdivision codes are case-sensitive — use them verbatim as returned here. Country codes are case-insensitive.
Returns:
dict with keys:
- countries: list of {code: 2-letter ISO code, name: str,
subdivisions: list[str]}, sorted by code. subdivisions is [] for
countries without regional variants (e.g. JP), and may also be []
if the library raised an error while introspecting that country.
- total: number of countries returned.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It discloses critical behaviors: subdivision codes are case-sensitive and must be used verbatim, country codes are case-insensitive, and subdivisions may be empty for some countries or due to library errors—all beyond basic functionality.
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?
Description is well-structured: first sentence for purpose, then usage guidance, then important behavioral notes, then return format. Every sentence adds value without redundancy.
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?
Despite no parameters and no annotations, the description is thorough. It explains the return structure (countries list with code, name, subdivisions, total) and addresses edge cases (empty subdivisions, library errors), making it complete for agent interaction.
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?
Tool has zero parameters, so baseline is 4. Description does not need to add parameter info, but it does mention how subdivision codes (from other tools) are used, which is helpful context.
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?
Description clearly states 'List all countries supported by the holidays library, with subdivisions' with a specific verb and resource. It differentiates from sibling tools (which focus on business days, dates, holidays) by positioning itself as a discovery tool.
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?
Explicitly advises using this tool 'before calling any country-aware tool', and explains that it provides valid ISO codes and subdivision codes for other tools, effectively guiding when and why to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_supported_subdivisionsA
List subdivision codes and aliases for a country's holiday calendar.
Use this to discover valid subdiv values before calling any country-aware
holiday tool (e.g. is_business_day, list_holidays, next_business_day).
IMPORTANT: Subdivision codes are case-sensitive and must be passed through
subdiv exactly as returned here — either a canonical code from
subdivisions or an alias key from aliases. Do NOT upper-case or otherwise
normalize them.
Example: country="DE" returns "BY" among its subdivisions. Passing
subdiv="BY" to list_holidays(year=2026, country="DE", subdiv="BY") then
reveals Bavarian regional holidays such as Epiphany (Jan 6).
Args: country: ISO 3166-1 alpha-2 code (case-insensitive, normalized to upper).
Returns: dict with keys: - country: normalized uppercase code. - subdivisions: list of canonical subdivision codes (empty if the country has no regional variants, e.g. JP). - aliases: dict mapping alias (mixed-case, verbatim) → canonical code (empty dict if the country exposes no aliases).
Raises:
ValueError: if country is unknown/unsupported.
| Name | Required | Description | Default |
|---|---|---|---|
| country | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral disclosure. It notes case-sensitivity, return value structure, and raises ValueError for unknown countries. It does not mention performance or rate limits, but for a simple lookup tool, this is largely sufficient.
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 well-structured with sections: main purpose, usage guidance, important note, example, formal Args/Returns/Raises. It is concise yet comprehensive, with no redundant sentences.
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 (single parameter, straightforward lookup), the description fully covers purpose, usage, parameter semantics, return format, and error handling. The inline output schema compensates for the missing structured output 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 0%, so description must add meaning. It specifies that `country` is an ISO 3166-1 alpha-2 code, case-insensitive, and normalized to uppercase. This is valuable context beyond the bare schema type.
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 lists subdivision codes and aliases for a country's holiday calendar. It specifies the action (list), resource (subdivision codes/aliases), and scope (per country). It distinguishes from siblings by mentioning its role in discovering valid `subdiv` values for other country-aware 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 explicitly advises using this tool before calling other country-aware tools like `is_business_day`, `list_holidays`, and `next_business_day`. It provides guidance on case sensitivity and normalization of subdivision codes, and includes an example for clarity.
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 business day for a given country (optionally a subdivision).
Use this when an agent needs to know if a specific calendar date is a working day — i.e. NOT a weekend and NOT a public holiday — under a country's official calendar.
Args: date: ISO 8601 date string (YYYY-MM-DD), e.g. "2026-04-21". country: ISO 3166-1 alpha-2 country code. Case-insensitive (normalized to upper). subdiv: Optional country-specific subdivision code (state/province/region). Case-sensitive — pass it exactly as returned by get_supported_countries (e.g. "BY" for Bavaria, "CA" for California). When omitted, only nation-wide holidays are considered. Example: country="DE", subdiv="BY" treats Epiphany (Jan 6) as a holiday because it is observed only in Bavaria. Category filtering (e.g. catholic vs evangelical) is not currently supported.
Returns: dict with keys: date, country, subdiv (only if provided), is_business_day, is_weekend, is_holiday, holiday_name (str or None).
Raises:
ValueError: if date is not valid ISO 8601, or country/subdiv is unknown.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ||
| country | Yes | ||
| subdiv | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully handles behavioral disclosure. It explains what constitutes a business day (not weekend, not holiday), notes case-sensitivity of subdiv, states that omitting subdiv only considers nation-wide holidays, and mentions that category filtering is not supported. It also lists raised ValueError conditions.
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 front-loaded with the main purpose and structured with Args/Returns/Raises sections. It is reasonably concise, though the subdiv description includes an example that could be slightly shortened. Overall, every sentence 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?
Given the tool's moderate complexity and missing annotations, the description is complete. It explains all parameters, the return value (dict with specific keys), and error conditions. The output schema exists (implied by the description's Returns section), so no further detail is needed on return values.
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?
With 0% schema description coverage, the description compensates fully. It explains the ISO 8601 date format, case-insensitivity of country code, case-sensitivity of subdiv with an example, and the effect of omitting subdiv. This adds meaning far beyond the bare schema types.
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 'Check whether a date is a business day for a given country (optionally a subdivision)' with a specific verb and resource. It distinguishes from sibling tools like 'business_days_between' and 'list_holidays' by focusing on a single date check.
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 explicitly says 'Use this when an agent needs to know if a specific calendar date is a working day'. While it doesn't explicitly list alternatives, the context from sibling tool names implies when not to use it (e.g., for date ranges use 'business_days_between').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
last_business_day_of_monthA
Return the last business day of a given month for a country.
Use this for end-of-month billing, reporting, or settlement dates that must land on a working day. Walks backward from the last calendar day, skipping weekends and holidays.
Args: year: Four-digit year (e.g. 2026). month: Month 1-12. country: ISO 3166-1 alpha-2 code (case-insensitive, normalized to upper). subdiv: Optional country-specific subdivision code (case-sensitive; see get_supported_countries). When omitted, only nation-wide holidays are considered.
Returns: dict with keys: year, month, country, subdiv (only if provided), last_business_day (YYYY-MM-DD), last_calendar_day (YYYY-MM-DD).
Raises: ValueError: on invalid month, unknown country/subdiv.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | ||
| month | Yes | ||
| country | Yes | ||
| subdiv | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully explains behavior: walking backward, skipping weekends and holidays, handling errors, and subdiv case-sensitivity. This leaves minimal ambiguity for the agent.
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 well-structured with paragraphs for overview, then standard Args/Returns/Raises sections. Every sentence adds value without redundancy.
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 complexity (4 parameters, output schema, error handling), the description covers all necessary aspects: use case, algorithm, parameter details, return format, and error conditions. It is 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 coverage is 0%, so the description compensates by detailing each parameter: year (4-digit), month (1-12), country (ISO code, case-insensitive), subdiv (optional, case-sensitive, reference to get_supported_countries). This adds value beyond 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 clearly states the tool returns the last business day of a given month, with specific use cases. However, it does not explicitly differentiate from sibling tools like previous_business_day or next_business_day, which could cause confusion.
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 explicit use cases (end-of-month billing, reporting, settlement) and mentions the algorithm (walks backward). It lacks when-not-to-use or alternative tools, but the guidance is clear enough.
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 holidays for a given year and country, sorted by date.
Use this to enumerate the full holiday calendar — for display, planning, or cross-referencing. Includes holidays that fall on weekends.
Args: year: Four-digit year (e.g. 2026). country: ISO 3166-1 alpha-2 code (case-insensitive, normalized to upper). subdiv: Optional country-specific subdivision code (case-sensitive; see get_supported_countries). When omitted, only nation-wide holidays are returned. Example: country="DE", subdiv="BY" adds Bavarian regional holidays such as Epiphany (Jan 6) and All Saints' Day (Nov 1). Category filtering (e.g. catholic vs evangelical) is not currently supported; the union of applicable categories is returned.
Returns: dict with keys: year, country, subdiv (only if provided), holidays (list of {date: YYYY-MM-DD, name: str}, sorted ascending by date).
Raises: ValueError: on unknown country/subdiv.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | ||
| country | Yes | ||
| subdiv | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully covers behavioral aspects: sorted output, inclusion of weekend holidays, case-insensitive country normalization, case-sensitive subdiv, unsupported category filtering, and error conditions (ValueError). This exceeds minimal disclosure.
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 well-structured with clear sections for arguments, return value, and errors. Every sentence adds meaningful information without redundancy. It is appropriately sized for the tool's complexity.
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?
The description covers all aspects: input constraints, output structure, error handling, and behavioral notes. Given the output schema exists, the description still explains the return format, ensuring completeness. No gaps remain for this 3-parameter tool.
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 0%, so the description must compensate. It explains each parameter in detail: year format, country code case-insensitivity and normalization, subdiv optionality with examples and limitations, and provides concrete example ('country=DE, subdiv=BY'). This adds significant value beyond the raw 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 clearly states the tool's purpose: listing all holidays for a given year and country, sorted by date. It uses a specific verb ('list') and resource ('holidays'), and distinguishes from sibling tools like 'business_days_between' and 'is_business_day' by focusing on full holiday enumeration.
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 explicit usage scenarios ('for display, planning, or cross-referencing') and mentions that holidays on weekends are included. It does not explicitly state when not to use or name alternatives, but the context is clear enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
next_business_dayA
Return the next business day on/after (inclusive) or strictly after date.
Use this to move forward to the soonest working day — skipping weekends and public holidays.
Args:
date: ISO 8601 date string (YYYY-MM-DD) to start from.
country: ISO 3166-1 alpha-2 code (case-insensitive, normalized to upper).
inclusive: When True, date itself qualifies if it is a business day.
When False (default), the search starts the day after date.
subdiv: Optional country-specific subdivision code (case-sensitive; see
get_supported_countries). When omitted, only nation-wide holidays are
considered. Example: country="DE", subdiv="BY" will skip Epiphany
(Jan 6) in Bavaria.
Returns: dict with keys: input_date, next_business_day, country, subdiv (only if provided), skipped_days (number of non-business days traversed).
Raises: ValueError: on invalid date, unknown country/subdiv, or if no business day is found within ~10 years.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ||
| country | Yes | ||
| inclusive | No | ||
| subdiv | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description fully carries the burden. It discloses that weekends and public holidays are skipped, that inclusive flag affects whether the start date qualifies, that subdiv filters by region, that ValueError is raised on invalid inputs, and that there's a ~10-year search limit. This is thorough behavioral disclosure.
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 well-organized with a clear first sentence, bullet-pointed args, and sections for returns and raises. It is concise without being terse—every sentence adds value. No redundant or extraneous text.
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?
Despite having 4 parameters, 0% schema coverage, and no annotations, the description is complete. It covers input details, behavior, output keys, and error conditions. The output schema exists (not shown but referenced in description), so description doesn't need to detail return values further. It references get_supported_countries for subdiv values, showing awareness of related tools.
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 0%, so the description must compensate. It does so by specifying format for 'date' (ISO 8601), case-insensitive normalization for 'country', behavior of 'inclusive' (True/False default), and 'subdiv' with an example (case-sensitive, optional, region-specific). This adds significant meaning beyond the raw 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 clearly states 'Return the next business day on/after (inclusive) or strictly after date' and explains it skips weekends and public holidays. It is specific about the resource (business day) and action (return next), and implicitly distinguishes from siblings like is_business_day or previous_business_day.
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 says 'Use this to move forward to the soonest working day', which is a clear usage context. However, it does not explicitly mention when not to use or point to alternatives like is_business_day for checking a specific date. The context signals list sibling tools, but the description itself lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
previous_business_dayA
Return the previous business day on/before (inclusive) or strictly before date.
Use this to move backward to the most recent working day — skipping weekends and public holidays.
Args:
date: ISO 8601 date string (YYYY-MM-DD) to start from.
country: ISO 3166-1 alpha-2 code (case-insensitive, normalized to upper).
inclusive: When True, date itself qualifies if it is a business day.
When False (default), the search starts the day before date.
subdiv: Optional country-specific subdivision code (case-sensitive; see
get_supported_countries). When omitted, only nation-wide holidays are
considered.
Returns: dict with keys: input_date, previous_business_day, country, subdiv (only if provided), skipped_days.
Raises: ValueError: on invalid date, unknown country/subdiv, or if no business day is found within ~10 years.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | ||
| country | Yes | ||
| inclusive | No | ||
| subdiv | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but the description fully discloses behavior: it skips weekends and public holidays, has an inclusive option, raises ValueError for invalid inputs, and limits search to ~10 years. It does not mention idempotency, but that is implied for a read-only tool.
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 well-structured with Args, Returns, Raises sections. It is front-loaded with the main purpose. Though lengthy, each sentence adds value and no redundancy.
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 complexity (4 params, no annotations, but output schema exists), the description is very complete. It covers input, output, errors, and edge cases (inclusive, subdiv optional, 10-year limit).
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 0%, but the description provides detailed semantics for all 4 parameters: date format, country code, inclusive boolean, subdiv with reference to get_supported_countries. This adds significant value beyond 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 it returns the previous business day on/before or strictly before a given date. It specifies skipping weekends and public holidays, distinguishing it from siblings like next_business_day and business_days_between.
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 explicitly says 'Use this to move backward to the most recent working day' and contrasts with other tools implicitly. It does not explicitly state when not to use it, but the context is clear.
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. Dates show when Glama detected each change.
9 tool updates
v0.1.0- First observed
business_days_between - First observed
get_current_date - First observed
get_supported_countries - First observed
get_supported_subdivisions - First observed
is_business_day - First observed
last_business_day_of_month - First observed
list_holidays - First observed
next_business_day - First observed
previous_business_day
TDQS
Scored across 9 tools
Each tool has a clearly distinct purpose: checking a date, moving forward/backward, counting between, listing holidays, etc. There is no functional overlap, so an agent can easily select the correct tool.
All tool names use snake_case and follow a consistent verb_noun or noun_phrase pattern (e.g., get_current_date, is_business_day, list_holidays). The naming is predictable and intuitive.
With 9 tools, the set is well-scoped for a business day calculator. It covers essential operations without being excessive, and includes discovery tools for supported countries/subdivisions.
The tool set covers core business day calculations well, including counting, moving, and listing holidays. A notable gap is the lack of an 'add business days' function, but most workflows are supported.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for public_holidays_mcp
Public holiday data for 30+ countries. Check holidays, working days and calendars via AI assistants.
Holidays MCP — wraps Nager.Date API (free, no auth)
Real public holiday lookup for 206 countries via a rule-based calendar engine. Paid via x402.
Related MCP Servers
- AlicenseAqualityDmaintenanceA lightweight MCP server providing comprehensive date, time, and day-of-week information. It supports relative time calculations, timezone conversions, and detailed calendar metadata like week numbers and quarters.51MIT
- AlicenseNot gradedqualityFmaintenanceMCP server for accessing Nager.Date public holidays data. It provides tools to query and retrieve holiday information for various countries through natural language or direct tool calls.13MIT
- AlicenseAqualityBmaintenanceA server for business day arithmetic and SLA calculations, supporting holidays for ~150 countries, plus cron and recurrence-rule parsing.14MIT
- FlicenseAqualityCmaintenanceMCP server for Japanese business days, public holidays, wareki dates, and tax arithmetic, helping AI agents avoid common Japanese date and tax errors.7-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/fbdo/business-day-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server