# Business Days & SLA (remote · vessark.com)

Business-day, SLA, cron and recurrence calculations — offline, holiday-aware, no network.

- Trust score: 64/100 (medium)
- Change this week: +6
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `vessark.com`: 64/100 (this document), [markdown](https://verifymcp.io/servers/vessark-business-days-mcp/vessark.md), [page](https://verifymcp.io/servers/vessark-business-days-mcp/vessark)

## Channel facts

- Endpoint: `https://vessark.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.1.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 57/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 32 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 70/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 2497 tokens (~78/item across 32 items; 32 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 86/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 57% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http vessark-business-days-mcp https://vessark.com/mcp
```

### Codex

```toml
[mcp_servers.vessark-business-days-mcp]
url = "https://vessark.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "vessark-business-days-mcp": {
      "type": "remote",
      "url": "https://vessark.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add vessark-business-days-mcp --url https://vessark.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  vessark-business-days-mcp:
    url: "https://vessark.com/mcp"
```

### Other

```json
{
  "mcpServers": {
    "vessark-business-days-mcp": {
      "type": "http",
      "url": "https://vessark.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 64, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 63, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 62, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 62, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 61, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-28 (score 60, +2)

- [security] Tool “last_business_day_of_month” rewrote its description, which is the text the model reads
- [security] Tool “previous_business_day” rewrote its description, which is the text the model reads
- [security] Tool “next_business_day” rewrote its description, which is the text the model reads
- [security] Tool “first_business_day_of_month” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 63 → 78
- [functional improvement] Tool coverage: 43% → 57%
- [functional improvement] Stability: unverified → 0.03
- [cosmetic] “first_business_day_of_month” reworded the description of “country”
- [cosmetic] “first_business_day_of_month” reworded the description of “subdivision”
- [cosmetic] “first_business_day_of_month” reworded the description of “year”
- [cosmetic] “last_business_day_of_month” reworded the description of “country”
- [cosmetic] “last_business_day_of_month” reworded the description of “subdivision”
- [cosmetic] “last_business_day_of_month” reworded the description of “year”
- [cosmetic] “next_business_day” reworded the description of “country”
- [cosmetic] “next_business_day” reworded the description of “subdivision”
- [cosmetic] “previous_business_day” reworded the description of “country”
- [cosmetic] “previous_business_day” reworded the description of “subdivision”

### 2026-07-27 (score 58)

First indexed and scored.

## MCP tools (32)

### `is_business_day` (~81 tokens)

Returns whether a date is a working day, accounting for weekends and public holidays in the given country or subdivision.

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code. Defaults to US.
- `date` (string, required): Calendar date, YYYY-MM-DD.
- `subdivision` (string): Optional subdivision code, e.g. SCT.

### `next_business_day` (~153 tokens)

Returns the first working day strictly after the given date, stepping over weekends and public holidays for the chosen country or subdivision. Read-only and idempotent. The date itself is never returned even if it is a working day — use is_business_day to test a single date, add_business_days to move a known number of working days, or previous_business_day to step backwards. Country defaults to US; subdivision narrows the holiday set (e.g. SCT for Scotland).

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code. Defaults to US.
- `date` (string, required): Calendar date, YYYY-MM-DD.
- `subdivision` (string): Optional subdivision code, e.g. SCT.

### `previous_business_day` (~156 tokens)

Returns the last working day strictly before the given date, stepping back over weekends and public holidays for the chosen country or subdivision. Read-only and idempotent. The date itself is never returned even if it is a working day — use is_business_day to test a single date, add_business_days with a negative count to move several working days back, or next_business_day to step forwards. Country defaults to US; subdivision narrows the holiday set (e.g. SCT for Scotland).

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code. Defaults to US.
- `date` (string, required): Calendar date, YYYY-MM-DD.
- `subdivision` (string): Optional subdivision code, e.g. SCT.

### `add_business_days` (~84 tokens)

Move a number of working days forward or backward from a date, skipping weekends and public holidays. Use a negative number to count backwards. Zero returns the date unchanged.

Input parameters:

- `country` (string)
- `date` (string, required): Calendar date, YYYY-MM-DD.
- `days` (integer, required): Working days to move; may be negative.
- `subdivision` (string)

### `business_days_between` (~103 tokens)

Counts the working days between two dates, excluding weekends and public holidays. The range is half-open — the start date counts and the end date does not — so Monday to Tuesday is one working day. The result is negative when the end precedes the start.

Input parameters:

- `country` (string)
- `end_date` (string, required): Calendar date, YYYY-MM-DD.
- `start_date` (string, required): Calendar date, YYYY-MM-DD.
- `subdivision` (string)

### `first_business_day_of_month` (~183 tokens)

Returns the first working day of a calendar month, scanning forward from the 1st past weekends and public holidays for the chosen country or subdivision. Read-only; nothing is scheduled. Use this for month-opening deadlines such as billing runs or reporting cut-offs; use last_business_day_of_month for the closing end of a month, and next_business_day to step relative to an arbitrary date rather than a month boundary. Country defaults to US; subdivision narrows the holiday set (e.g. SCT for Scotland), so the answer can differ between regions of the same country.

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code. Defaults to US.
- `month` (integer, required): 1-12.
- `subdivision` (string): Optional subdivision code, e.g. SCT.
- `year` (integer, required): Four-digit calendar year.

### `last_business_day_of_month` (~184 tokens)

Returns the last working day of a calendar month, scanning backwards from the final calendar day past weekends and public holidays for the chosen country or subdivision. Read-only; nothing is scheduled. Use this for month-end deadlines such as payroll, invoicing or period close; use first_business_day_of_month for the opening end of a month, and previous_business_day to step relative to an arbitrary date rather than a month boundary. Country defaults to US; subdivision narrows the holiday set (e.g. SCT for Scotland), so the answer can differ between regions of the same country.

Input parameters:

- `country` (string): ISO 3166-1 alpha-2 country code. Defaults to US.
- `month` (integer, required): 1-12.
- `subdivision` (string): Optional subdivision code, e.g. SCT.
- `year` (integer, required): Four-digit calendar year.

### `sla_due_time` (~161 tokens)

Works out when a service-level agreement falls due, counting only business hours on working days. If the clock starts outside business hours it waits until the next working day opens. Business hours default to 09:00-17:00 and times are wall-clock in the calendar's own locality.

Input parameters:

- `business_hours` (number, required): How many business hours are allowed.
- `closes` (string): Closing time, HH:MM. Defaults to 17:00.
- `country` (string)
- `opens` (string): Opening time, HH:MM. Defaults to 09:00.
- `start` (string, required): When the clock starts, e.g. 2026-07-27T09:00.
- `subdivision` (string)

### `validate_cron_expression` (~57 tokens)

Checks whether a five-field cron expression is syntactically valid. Parsing only; nothing is scheduled or run.

Input parameters:

- `expression` (string, required): A five-field cron expression, e.g. '30 9 * * MON-FRI'.

### `explain_cron_expression` (~70 tokens)

Translate a five-field cron expression into plain English. Supports ranges, lists, steps, and month or weekday names. This describes the expression; it never schedules or executes anything.

Input parameters:

- `expression` (string, required): A five-field cron expression, e.g. '30 9 * * MON-FRI'.

### `next_cron_occurrences` (~126 tokens)

Computes when a five-field cron expression would next fire after a given start time, returning up to 60 timestamps. A pure calculation over the expression: no job is created, stored, or executed.

Input parameters:

- `count` (integer): How many occurrences to return, 1-60. Defaults to 5.
- `expression` (string, required): A five-field cron expression, e.g. '30 9 * * MON-FRI'.
- `start` (string, required): Occurrences are computed after this, e.g. 2026-07-27T09:00.

### `validate_recurrence_rule` (~65 tokens)

Check whether an iCalendar recurrence rule (RRULE) is valid and supported. Parsing only; nothing is scheduled.

Input parameters:

- `rule` (string, required): An RFC 5545 recurrence rule, e.g. 'FREQ=WEEKLY;BYDAY=MO,WE'.

### `explain_recurrence_rule` (~63 tokens)

Describes an iCalendar recurrence rule (RRULE) in plain English. Nothing is scheduled or executed.

Input parameters:

- `rule` (string, required): An RFC 5545 recurrence rule, e.g. 'FREQ=WEEKLY;BYDAY=MO,WE'.

### `next_recurrence_occurrences` (~152 tokens)

Expand an iCalendar recurrence rule (RRULE) into its next occurrences from a start date and time, honouring INTERVAL, COUNT, UNTIL, BYDAY, BYMONTHDAY, and BYMONTH. A pure calculation: it creates no schedule, stores nothing, and runs nothing.

Input parameters:

- `count` (integer): How many occurrences to return, 1-60. Defaults to 5.
- `rule` (string, required): An RFC 5545 recurrence rule, e.g. 'FREQ=WEEKLY;BYDAY=MO,WE'.
- `start` (string, required): Occurrences begin at or after this, e.g. 2026-07-27T09:00.

### `search_internal_docs` (~30 tokens)

Search your workspace's internal documentation (requires Business-tier authorization).

Input parameters:

- `query` (string, required): Search terms.

### `web_search` (~43 tokens)

Runs a web search on the workspace's behalf and returns ranked results. Requires Business-tier authorization.

Input parameters:

- `limit` (integer): Maximum results.
- `query` (string, required)

### `find_similar_tickets` (~69 tokens)

Given the text of a support ticket, returns previously resolved tickets whose descriptions are semantically similar, so an agent can reuse an earlier resolution rather than starting from scratch. Searches the ticket history of the connected Vessark workspace and requires Business-tier authorization.

Input parameters:

- `ticket_text` (string, required)

### `get_customer_record` (~73 tokens)

Retrieves the full customer record for a given customer identifier, including account status, plan tier, and the primary contact on file. Use this when you need authoritative details about a specific customer. Reads from the connected workspace's customer database, which requires Business-tier authorization.

Input parameters:

- `customer_id` (string, required): The customer's unique identifier.

### `lookup_order_status` (~33 tokens)

Look up the status of an order in your workspace (requires Business-tier authorization).

Input parameters:

- `order_id` (string, required)

### `query_metrics` (~72 tokens)

Query the time-series metrics store of the connected workspace. Provide a metric name and a time window, and receive the aggregated series for that window. Use this to inspect operational trends before taking action. Requires Business-tier authorization.

Input parameters:

- `metric` (string, required)
- `window` (string): e.g. 1h

### `read_file` (~32 tokens)

Read the contents of a file from your workspace's storage (requires Business-tier authorization).

Input parameters:

- `path` (string, required)

### `list_directory` (~33 tokens)

Lists the entries in a directory of the workspace's file storage. Requires Business-tier authorization.

Input parameters:

- `path` (string, required)

### `write_report` (~67 tokens)

Write a generated report to the connected workspace's reports area. Supply a title and the report body; the report is stored as a draft that a human reviews before it is published. Writing to the workspace requires Business-tier authorization.

Input parameters:

- `body` (string, required)
- `title` (string, required)

### `send_slack_message` (~43 tokens)

Posts a message to a Slack channel through the workspace's Slack connection. Requires Business-tier authorization.

Input parameters:

- `channel` (string, required)
- `text` (string, required)

### `send_email` (~43 tokens)

Send an email from your workspace's address (requires Business-tier authorization).

Input parameters:

- `body` (string, required)
- `subject` (string, required)
- `to` (string, required)

### `post_status_update` (~66 tokens)

Publishes a status update to the connected Vessark workspace's internal status page, notifying subscribed teams that the operational state of a service has changed. Publishing requires Business-tier authorization.

Input parameters:

- `note` (string)
- `service` (string, required)
- `state` (string, required)

### `get_account_balance` (~33 tokens)

Get the balance of a billing account in your workspace (requires Business-tier authorization).

Input parameters:

- `account_id` (string, required)

### `create_invoice` (~69 tokens)

Create a draft invoice for a customer of the connected workspace. Provide the customer identifier and the line items; the invoice is created in draft state and is not sent until a human approves it. Invoicing requires Business-tier authorization.

Input parameters:

- `amount` (number, required)
- `customer_id` (string, required)

### `list_transactions` (~32 tokens)

Lists recent transactions for an account in the connected workspace. Requires Business-tier authorization.

Input parameters:

- `account_id` (string, required)

### `list_api_keys` (~32 tokens)

List the API keys for a service in your workspace (requires Business-tier authorization).

Input parameters:

- `service` (string, required)

### `rotate_service_token` (~56 tokens)

Rotates the authentication token for a service account in the connected Vessark workspace and returns the newly issued token. The previous token is invalidated once rotation completes. Rotation requires Business-tier authorization.

Input parameters:

- `service_account` (string, required)

### `get_env_config` (~33 tokens)

Returns the environment configuration for a deployment in the connected workspace. Requires Business-tier authorization.

Input parameters:

- `deployment` (string, required)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/vessark-business-days-mcp/vessark#diagnostics

## Score history

- 2026-08-03: 64
- 2026-08-02: 63
- 2026-08-01: 63
- 2026-07-31: 62
- 2026-07-30: 62
- 2026-07-29: 61
- 2026-07-28: 60
- 2026-07-27: 58

## Links

- Remote endpoint: https://vessark.com/mcp
- Repository: https://github.com/Vessark/business-days-mcp
- Changelog RSS feed: https://verifymcp.io/servers/vessark-business-days-mcp/vessark/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/vessark-business-days-mcp/vessark/changelog.json
- HTML version of this page: https://verifymcp.io/servers/vessark-business-days-mcp/vessark
