Almanack
REMOTE · ALMANACK.DEV · SCANNED OCT 10
Date math and SVG rendering for fictional and custom calendars. Exact, stateless and deterministic.
Available components
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. How we score → Why this is hard to score →
Endpoint Security71
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- The endpoint enforces authorisation, but returns a challenge with no valid RFC 9728 metadata, so a client cannot discover where to get a token. See how to fix → View diagnostics → Fail
- HTTPS enforcement could not be verified: the plaintext port answered with HTTP 403, which proves neither a plaintext path nor enforcement. View diagnostics → Unverified
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability0
- Transport blocked by authentication: the endpoint requires auth we don't have to verify streamable-http. See how to fix → View diagnostics → Unverified
Schema Quality & AI Usability0
- Schema blocked by authentication: the endpoint requires auth we don't have to read it. See how to fix → Unverified
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage0
- Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Tool Safety0
- Tool safety blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Capabilities0
- Capabilities blocked by authentication: the endpoint requires auth we don't have to read them. See how to fix → Unverified
Unverified: 6 categories
Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm. Claim this server and supply a read-only token to verify it and lift the score.
How do I install the Almanack MCP server?
Almanack is a hosted endpoint at https://almanack.dev/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · almanack.dev
claude mcp add --transport http dev-almanack-almanack 'https://almanack.dev/mcp'
{
"mcpServers": {
"dev-almanack-almanack": {
"url": "https://almanack.dev/mcp"
}
}
} {
"servers": {
"dev-almanack-almanack": {
"type": "http",
"url": "https://almanack.dev/mcp"
}
}
} [mcp_servers.dev-almanack-almanack] url = "https://almanack.dev/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"dev-almanack-almanack": {
"type": "remote",
"url": "https://almanack.dev/mcp",
"enabled": true
}
}
} openclaw mcp add dev-almanack-almanack --url 'https://almanack.dev/mcp' --transport streamable-http
mcp_servers:
dev-almanack-almanack:
url: "https://almanack.dev/mcp" {
"McpServers": {
"dev-almanack-almanack": {
"Transport": "http",
"Url": "https://almanack.dev/mcp"
}
}
} assistant mcp add dev-almanack-almanack -t streamable-http -u 'https://almanack.dev/mcp'
{
"mcpServers": {
"dev-almanack-almanack": {
"type": "http",
"url": "https://almanack.dev/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 28 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 12 Sept 26 −37
- Endpoint reachability: reachable → behind authorisation ▼ security
- Authorization: unverified → fail ▼ security
- Tool safety: pass → unverified ▼ security
- Stability: 0.47 → unverified ▼ security
- HTTPS: pass → unverified ▼ security
- Transport: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- First check of Schema quality: unverified functional
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.
- 8 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.
- 3 Sept 26 0
- Server version: 0.5.0 → 0.7.0 functional
- 2 Sept 26 0
- Tool “validate_calendar_spec” rewrote its description, which is the text the model reads security
- Server version: 0.4.0 → 0.5.0 functional
- 1 Sept 26 0
- Tool “sun_daylight” rewrote its description, which is the text the model reads security
- Tool “add_to_date” rewrote its description, which is the text the model reads security
- Tool “calendar_events” rewrote its description, which is the text the model reads security
- Tool “calendar_weekday” rewrote its description, which is the text the model reads security
- Tool “convert_date” rewrote its description, which is the text the model reads security
- Tool “date_interval” rewrote its description, which is the text the model reads security
- Tool “format_calendar_date” rewrote its description, which is the text the model reads security
- Tool “moon_phases” rewrote its description, which is the text the model reads security
- Tool “parse_calendar_date” rewrote its description, which is the text the model reads security
- Tool “render_calendar_page” rewrote its description, which is the text the model reads security
- Schema quality: 175 → 252 ▼ functional
- Schema quality: 175 → 247 ▼ functional
- Schema quality: excellent → good functional
- Server version: 0.3.1 → 0.4.0 functional
- Server version: 0.1.2 → 0.3.1 functional
- New tool “calendar_periods” functional
- New tool “sun_daylight” functional
- “add_to_date” added an optional parameter “on_error” cosmetic
- “add_to_date” added an optional parameter “steps” cosmetic
- “add_to_date” added an optional parameter “ticks” cosmetic
- “add_to_date” added an optional parameter “time” cosmetic
- “calendar_events” added an optional parameter “events” cosmetic
- “calendar_weekday” added an optional parameter “dates” cosmetic
- “calendar_weekday” added an optional parameter “on_error” cosmetic
- “convert_date” added an optional parameter “dates” cosmetic
- “convert_date” added an optional parameter “day_numbers” cosmetic
- “convert_date” added an optional parameter “gregorians” cosmetic
- “convert_date” added an optional parameter “on_error” cosmetic
- “convert_date” added an optional parameter “time” cosmetic
- “date_interval” added an optional parameter “end_time” cosmetic
- “date_interval” added an optional parameter “start_time” cosmetic
- “format_calendar_date” added an optional parameter “dates” cosmetic
- “format_calendar_date” added an optional parameter “on_error” cosmetic
- “format_calendar_date” added an optional parameter “time” cosmetic
- “format_calendar_date” added an optional parameter “times” cosmetic
- “moon_phases” added an optional parameter “time” cosmetic
- “add_to_date” made “date” optional cosmetic
- “calendar_events” made “event” optional cosmetic
- “calendar_weekday” made “date” optional cosmetic
- “format_calendar_date” made “date” optional cosmetic
- “render_calendar_page” made “month” optional cosmetic
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 10 Oct 2026 · Probed https://almanack.dev/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=almanack.dev | CN=WE1,O=Google Trust Services,C=US | 27 Aug 2026 | 25 Nov 2026 | ECDSA 256 | ECDSA-SHA256 | 158b1ca527d57d1b13afac163eb9b545 |
| SANs: almanack.dev, *.almanack.dev | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of almanack.dev. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| dev. | present | 60074 | 8 | Verified |
| almanack.dev. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Challenged, unverified
The endpoint asked for a token, but we could not retrieve and validate the RFC 9728 metadata that tells a client how to obtain one.
| Result | Challenged, unverified |
|---|---|
| Enforced | On connection |
| HTTP status | 403 |
| Header | Value |
|---|---|
| x-frame-options | SAMEORIGIN |
| referrer-policy | same-origin |
Protected resource metadata
| Retrieved | No |
|---|---|
| Problem | no_resource_metadata |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://almanack.dev/mcp | Auth required | 403 | |
| http (plaintext) | http://almanack.dev/mcp | Inconclusive | 403 |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_to_date ~336
Move a date by years, months, days and ticks. They are applied in that fixed order, which matters: a month then a day is not always the same landing as a day then a month. Adding days is always exact. policy decides what happens when the day does not exist in the target month: 'clamp' (default) moves to that month's last day, 'reject' refuses with an error, 'spill' carries the excess into the following month. Adding months to an intercalary date is refused, because those days sit between months; add days instead. 'ticks' moves within the day for a calendar that divides its day, carrying whole days as they fall. USE 'steps' FOR MORE THAN ONE MOVE: each step gives its own years, months, days and ticks, and its own date or the shared one, so a base date and a list of offsets is a single call rather than one per offset. Only the date is shared: a step states its own move in full, so a step naming no months moves by no months whatever the call around it says. Answers up to 1000 in one call, in the order given, as {count, ok, results}. Prefer this over one call per item: the spec travels once instead of once each.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| date | – | – | – |
| days | integer | – | – |
| months | integer | – | – |
| on_error | string | – | – |
| policy | string | – | – |
| steps | – | – | – |
| ticks | integer | – | – |
| time | – | – | – |
| years | integer | – | – |
No output schema declared.
No examples provided.
calendar_events ~347
When recurring events fall, and whether they land on each other. query 'next' gives the first occurrence after the date in 'after' (or on it when inclusive is true). query 'occurrences' gives every occurrence between start and end inclusive, capped at limit and at most 1000; 'truncated' says whether the list was cut short, so never read a truncated list as complete. query 'collisions' gives the days between start and end where two or more of the given events fall together, each naming what shares it — the question a calendar of festivals is really asking, and one to ask here rather than reason out in prose. An event is either a name the calendar defines or an event given inline: {'name':..,'type':'fixed','month':..,'day':..}, {'name':..,'type':'nth_weekday','month':..,'weekday':..,'n':..} or {'name':..,'type':'interval','anchor':{..},'every':N,'unit':'days'|'years'}. Pass one as 'event', or many as 'events' — which 'collisions' requires and which answers the other two queries for every event in a single call. A year in which an event's date does not exist produces no occurrence: a leap-day feast happens in leap years and not otherwise, and is never moved to a nearby day.
| Name | Type | Req | Description |
|---|---|---|---|
| after | – | – | – |
| calendar | object | yes | – |
| end | – | – | – |
| event | – | – | – |
| events | – | – | – |
| inclusive | boolean | – | – |
| limit | integer | – | – |
| query | string | – | – |
| start | – | – | – |
No output schema declared.
No examples provided.
calendar_periods ~201
Which named periods of the year a date falls in — a season, a tide, a term. Answers with a list, not one: a calendar may declare several cycles of periods and a date sits in one of each, so seasons and festival tides come back together. Each answer says which day of the period it is and how long the period runs, which is how 'early autumn' becomes a comparison rather than a guess. An empty list is a legal answer and means the calendar's periods do not cover that day; validate_calendar_spec reports the gaps and overlaps in a whole cycle. Pass 'dates' for more than one. Answers up to 1000 in one call, in the order given, as {count, ok, results}. Prefer this over one call per item: the spec travels once instead of once each.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| date | – | – | – |
| dates | – | – | – |
| on_error | string | – | – |
No output schema declared.
No examples provided.
calendar_weekday ~169
Which weekday a date falls on, as a 0-based index into the calendar's own week plus its name. Exact; never estimates. Returns weekday null when the date is an intercalary day the week does not count: those days sit outside the cycle and the week resumes after them exactly where it left off. Fails if the calendar defines no week rather than inventing a seven-day one. Pass 'dates' instead of 'date' for more than one. Answers up to 1000 in one call, in the order given, as {count, ok, results}. Prefer this over one call per item: the spec travels once instead of once each.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| date | – | – | – |
| dates | – | – | – |
| on_error | string | – | – |
No output schema declared.
No examples provided.
convert_date ~257
Convert between a calendar date, its day number, and its Gregorian date. Give exactly one of date, day_number, gregorian or one of their plurals dates, day_numbers, gregorians; all three forms come back, with whether the year is a leap year, how long it is, and any named period of the year the date falls in. USE THE PLURALS FOR MORE THAN ONE DATE: the calendar spec travels on every call, so fifteen dates in one call cost the spec once instead of fifteen times, and there is no reason to work an answer out by hand to save a round trip. Answers up to 1000 in one call, in the order given, as {count, ok, results}. Prefer this over one call per item: the spec travels once instead of once each. Exact arithmetic; never estimates. A date that does not exist in this calendar is refused with the real range, never rounded to a nearby day.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| date | – | – | – |
| dates | – | – | – |
| day_number | – | – | – |
| day_numbers | – | – | – |
| gregorian | – | – | – |
| gregorians | – | – | – |
| on_error | string | – | – |
| time | – | – | – |
No output schema declared.
No examples provided.
date_interval ~199
The distance between two dates. 'days' is the exact signed count (negative when end precedes start) and is always reliable. 'calendar' breaks the same distance into whole years, then whole months, then days, using the clamp policy, so adding that breakdown back to the start date with add_to_date returns the end date exactly. Give start_time and end_time and the answer also carries 'ticks', the signed distance in the calendar's finest unit of the day, and 'time', that distance as whole days plus a count per unit. Give both or neither: one alone is refused rather than measured from the start of the other day, which would be a moment you did not give — pass 0 if that is what you mean. Exact integer arithmetic; never estimates.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| end | object | yes | – |
| end_time | – | – | – |
| start | object | yes | – |
| start_time | – | – | – |
No output schema declared.
No examples provided.
format_calendar_date ~254
Write a date out to a pattern. pattern is either a name from the calendar's own 'formats' (names win) or a pattern written out. Tokens: {day} {day-name} {month} {month-name} {year} {era} {era-abbr} {era-year} {intercalary} {period}, plus one named for each unit the spec's 'day' block declares ({bell}), with an optional zero-pad width on the numeric ones as {day:2}. Write a literal brace as {{ or }}. The output is exactly reversible by parse_calendar_date with the same pattern, so use these two as a pair. Pass 'dates' instead of 'date' to write many to the same pattern, with 'times' alongside when each carries its own time. Answers up to 1000 in one call, in the order given, as {count, ok, results}. Prefer this over one call per item: the spec travels once instead of once each.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| date | – | – | – |
| dates | – | – | – |
| on_error | string | – | – |
| pattern | string | yes | – |
| time | – | – | – |
| times | – | – | – |
No output schema declared.
No examples provided.
moon_phases ~185
Every moon's phase on a date. 'fraction' is the exact position in the cycle, 0.0 at new and 0.5 at full, and is the number to compute with. 'phase' is only which named bucket that fraction falls in, and 'illumination' is the lit portion of the disc from 0.0 to 1.0. Computed in closed form from the moon's period and offset, not simulated and not astronomical: it is exactly what the spec describes. Measured at the start of the day; pass day_fraction 0.5 for midday, or 'time' to say where in the day exactly for a calendar whose spec divides its day. Give one or the other.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| date | object | yes | – |
| day_fraction | number | – | – |
| time | – | – | – |
No output schema declared.
No examples provided.
nth_weekday_of_month ~124
The nth given weekday of a month: the 3rd Tuesday, the last Friday. n is 1-based from the start of the month, or negative from the end (-1 is the last). Only days the week counts are considered. If the month has no such day the call fails naming how many there are; it never returns the nearest one instead. Exact; never estimates.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| month | integer | yes | – |
| n | integer | yes | – |
| weekday | integer | yes | – |
| year | integer | yes | – |
No output schema declared.
No examples provided.
parse_calendar_date ~136
Read a written date back into a date. Strict, with no fuzzy matching of any kind: literal characters must match character for character, month, weekday, era and period names must be names this calendar actually defines, and a weekday or period written into the string must be one that date really falls on. A string that does not fit is an error naming what did not fit; it never returns a best guess. Use the same pattern that wrote the string. A pattern that wrote a time of day gives the time back too.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| pattern | string | yes | – |
| text | string | yes | – |
No output schema declared.
No examples provided.
render_calendar_page ~303
Draw one month of a calendar as an SVG grid, or a whole year on one sheet, and return the SVG itself. Columns come from the calendar's own week, so a ten-day week gets ten columns. Intercalary days belong to no month and never take a cell in the grid: the blocks either side of this month are drawn as a strip outside it, dashed when the week does not count them. Moons get a glyph per day, lit to that moon's phase, when the calendar defines any. Events use the same shape as render_timeline and are filtered to the days on this page, with at most 500 given and at most three shown per day before the rest become a count. Colours are assigned per color_key from the whole list before filtering, so a category keeps its colour across months. OMIT 'month' TO DRAW THE WHOLE YEAR on one sheet, every month side by side — for seeing at once whether festivals are evenly spread, which nine separate month pages do not show. A year sheet has no room for labels or moon glyphs, so each day carries its number and a dot per event, every dot holding its label in a <title>. Fully deterministic: the same arguments always produce byte-identical SVG. The output is static SVG and never contains script or style.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| events | – | – | – |
| month | – | – | – |
| theme | – | – | – |
| year | integer | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
render_timeline ~336
Draw a date range as a horizontal SVG timeline and return the SVG itself. Both ends of the range are included. Axis ticks choose their own granularity from the span — days, months or years — and year labels use the calendar's eras where it defines them, so a range crossing a descending era's boundary counts down to it and up again after it, ... 3, 2, 1 | 1, 2, 3 ... Era boundaries inside the range are drawn as labelled vertical rules. Each event is {'label':.., 'date':{..}} for a marker or {'label':.., 'start':{..}, 'end':{..}} for a bar, optionally with 'lane' (a row name) and 'color_key' (a category name picking an accent colour). AT MOST 500 EVENTS: more is refused with render.timeline.too_many_events rather than drawn partially. Labels never overlap; they stagger and then truncate with an ellipsis, and the full label is always in the marker's <title> whatever ends up drawn. theme is 'default', 'dark', or a theme object with all of font_family, background, axis, text and accents; colours must be #RGB or #RRGGBB and anything else is refused. Fully deterministic: the same arguments always produce byte-identical SVG, with no timestamps or generated ids in it. The output is static SVG and never contains script or style.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| end | object | yes | – |
| events | – | – | – |
| start | object | yes | – |
| theme | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
scatter_dates ~120
Scatter a number of dates across a span, for generating events. The seed is required and the draw is fully deterministic: the same calendar, span, count, seed and unique flag always give the same dates, on any machine. unique=true (default) draws without repeats and fails if count exceeds the number of days in the span. Results come back sorted.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| count | integer | yes | – |
| end | object | yes | – |
| seed | – | yes | – |
| start | object | yes | – |
| unique | boolean | – | – |
No output schema declared.
No examples provided.
sun_daylight ~494
How long each sun is up on a date, and between which times of day. THE CURVE IS DECLARED BY THE SPEC, NEVER INFERRED, and that is the point of this tool: a shortest day, a longest day and a solstice do not say what happens between them — a sinusoid and a straight line honour all three and disagree everywhere else, by nearly a whole bell at the quarter points — so the spec names the shape ('sinusoid', 'linear', or 'table' given point by point) and this evaluates it exactly. It is NOT astronomy: no latitude, no axial tilt, no orbit, and no attempt at plausibility. It is exactly what the calendar describes, the same promise moon_phases makes. 'rise' and 'set' sit either side of each sun's own noon, so several suns can be up at different hours; both are null when a sun is up all day or not at all, which 'always_up' and 'never_up' say. 'wraps' means a sun's span runs through the turn of the day. 'lit' is the UNION of every sun's span, not the sum: two suns sharing the sky make one lit stretch, and adding them would claim a day longer than it is. Each lit stretch is half-open, so its 'to' is the tick the light stops at and is never wrapped round: a sun up the whole day closes at one whole day, not at nought. A sun that does not keep to the year declares a 'period' in whole days and a dated 'epoch' instead of a solstice; its noon then drifts through the day once per cycle — on its own 'noon_period' where the spec gives one — and 'cycle' says where in its DAYLIGHT cycle the date falls (null for a sun that keeps to the year). Any number of suns. Fails rather than guessing if the calendar declares no suns, or no 'day' block to measure them in. Pass 'dates' for more than one. Answers up to 1000 in one call, in the order given, as {count, ok, results}. Prefer this over one call per item: the spec travels once instead of once each.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
| date | – | – | – |
| dates | – | – | – |
| on_error | string | – | – |
No output schema declared.
No examples provided.
validate_calendar_spec ~141
Check a calendar spec and list everything wrong with it. Returns structured errors and warnings; it never throws and never partially accepts a spec. Errors mean the spec is unusable; warnings mean it is legal but probably not what was meant (a leap rule that changes no year's length, a moon that cycles every few hours). Use this before any other tool when you have written or edited a spec yourself. It is the only tool that accepts a malformed spec. A key no block defines is one of the errors, and it names the fields that block does have, so this also answers what a block takes when you are unsure.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | object | yes | – |
No output schema declared.
No examples provided.
What is the Almanack MCP server?
Almanack is an MCP server listed in the public MCP registry as dev.almanack/almanack. Date math and SVG rendering for fictional and custom calendars. Exact, stateless and deterministic. This page covers its hosted endpoint (https://almanack.dev/mcp).
Is the Almanack MCP server safe to use?
Almanack scores 28 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Almanack MCP server expose?
Almanack exposes 15 tools: validate_calendar_spec, convert_date, calendar_weekday, nth_weekday_of_month, date_interval, and 10 more. Their descriptions and schemas cost roughly 3,602 tokens of context every time the server is loaded.
Does the Almanack MCP server require authentication?
Yes. Almanack asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the Almanack MCP server still maintained?
Almanack is still listed as active in the MCP registry. We last reached this channel on 10 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.