{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_ktme9kncpew4","handle":"almanack","url":"https://wellknown.network/agents/almanack","links":{"self":"https://wellknown.network/agents/almanack/record.json","html":"https://wellknown.network/agents/almanack","markdown":"https://wellknown.network/agents/almanack/record.md","api":"https://wellknown.network/api/v1/agents/almanack","status":"https://wellknown.network/api/v1/agents/almanack/status","claim":"https://wellknown.network/agents/almanack/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/almanack/claim.json","badge":"https://wellknown.network/agents/almanack/badge.svg","openapi":"https://wellknown.network/openapi.json"},"ard":{"identifier":"urn:air:almanack.dev:server:almanack","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Almanack","summary":"Date math and SVG rendering for fictional and custom calendars. Exact, stateless and deterministic.","description":"Date math and SVG rendering for fictional and custom calendars. Exact, stateless and deterministic.","publisher":{"name":"dev.almanack","url":null},"homepage":"https://almanack.dev","repository":null,"version":"0.7.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://almanack.dev/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-09-03T13:55:19.029166Z","publishedAt":"2026-09-03T13:55:19.029166Z","registryName":"dev.almanack/almanack"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"productivity.calendar","name":"Calendar & Scheduling","confidence":0.938,"provenance":"derived"},{"slug":"automation.scheduling","name":"Scheduling & Cron","confidence":0.54,"provenance":"derived"},{"slug":"commerce.pricing","name":"Pricing & Quotes","confidence":0.525,"provenance":"derived"},{"slug":"documents.conversion","name":"Document Conversion","confidence":0.51,"provenance":"derived"}],"categories":["automation","commerce","documents","productivity"]},"observed":{"status":"live","statusReason":"Responded 36h ago.","lastOkAt":"2026-09-06T01:23:06.444Z","lastProbedAt":"2026-09-06T01:23:06.444Z","statusComputedAt":"2026-09-06T01:24:36.870Z","reliability30d":{"probes":1,"successRate":1,"p50Ms":54},"latestObservations":[{"at":"2026-09-07T12:24:42.585Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":63,"error":null,"detail":{"tools":[{"name":"validate_calendar_spec","description":"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"},{"name":"convert_date","description":"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_numb"},{"name":"calendar_weekday","description":"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 i"},{"name":"nth_weekday_of_month","description":"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 da"},{"name":"date_interval","description":"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 "},{"name":"add_to_date","description":"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 th"},{"name":"moon_phases","description":"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 whic"},{"name":"format_calendar_date","description":"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}"},{"name":"parse_calendar_date","description":"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"},{"name":"calendar_events","description":"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 t"},{"name":"calendar_periods","description":"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"},{"name":"sun_daylight","description":"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 shor"},{"name":"scatter_dates","description":"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 a"},{"name":"render_timeline","description":"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 "},{"name":"render_calendar_page","description":"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 we"}],"toolCount":15,"serverName":"almanack","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"0.7.0","protocolVersion":"2025-06-18"}},{"at":"2026-09-07T05:22:48.551Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":61,"error":null,"detail":{"tools":[{"name":"validate_calendar_spec","description":"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"},{"name":"convert_date","description":"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_numb"},{"name":"calendar_weekday","description":"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 i"},{"name":"nth_weekday_of_month","description":"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 da"},{"name":"date_interval","description":"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 "},{"name":"add_to_date","description":"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 th"},{"name":"moon_phases","description":"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 whic"},{"name":"format_calendar_date","description":"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}"},{"name":"parse_calendar_date","description":"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"},{"name":"calendar_events","description":"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 t"},{"name":"calendar_periods","description":"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"},{"name":"sun_daylight","description":"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 shor"},{"name":"scatter_dates","description":"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 a"},{"name":"render_timeline","description":"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 "},{"name":"render_calendar_page","description":"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 we"}],"toolCount":15,"serverName":"almanack","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"0.7.0","protocolVersion":"2025-06-18"}},{"at":"2026-09-06T23:22:30.063Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":51,"error":null,"detail":{"tools":[{"name":"validate_calendar_spec","description":"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"},{"name":"convert_date","description":"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_numb"},{"name":"calendar_weekday","description":"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 i"},{"name":"nth_weekday_of_month","description":"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 da"},{"name":"date_interval","description":"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 "},{"name":"add_to_date","description":"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 th"},{"name":"moon_phases","description":"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 whic"},{"name":"format_calendar_date","description":"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}"},{"name":"parse_calendar_date","description":"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"},{"name":"calendar_events","description":"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 t"},{"name":"calendar_periods","description":"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"},{"name":"sun_daylight","description":"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 shor"},{"name":"scatter_dates","description":"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 a"},{"name":"render_timeline","description":"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 "},{"name":"render_calendar_page","description":"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 we"}],"toolCount":15,"serverName":"almanack","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"0.7.0","protocolVersion":"2025-06-18"}},{"at":"2026-09-06T17:28:08.308Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":74,"error":null,"detail":{"tools":[{"name":"validate_calendar_spec","description":"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"},{"name":"convert_date","description":"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_numb"},{"name":"calendar_weekday","description":"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 i"},{"name":"nth_weekday_of_month","description":"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 da"},{"name":"date_interval","description":"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 "},{"name":"add_to_date","description":"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 th"},{"name":"moon_phases","description":"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 whic"},{"name":"format_calendar_date","description":"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}"},{"name":"parse_calendar_date","description":"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"},{"name":"calendar_events","description":"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 t"},{"name":"calendar_periods","description":"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"},{"name":"sun_daylight","description":"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 shor"},{"name":"scatter_dates","description":"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 a"},{"name":"render_timeline","description":"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 "},{"name":"render_calendar_page","description":"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 we"}],"toolCount":15,"serverName":"almanack","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"0.7.0","protocolVersion":"2025-06-18"}},{"at":"2026-09-06T10:25:32.331Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":56,"error":null,"detail":{"tools":[{"name":"validate_calendar_spec","description":"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"},{"name":"convert_date","description":"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_numb"},{"name":"calendar_weekday","description":"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 i"},{"name":"nth_weekday_of_month","description":"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 da"},{"name":"date_interval","description":"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 "},{"name":"add_to_date","description":"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 th"},{"name":"moon_phases","description":"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 whic"},{"name":"format_calendar_date","description":"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}"},{"name":"parse_calendar_date","description":"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"},{"name":"calendar_events","description":"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 t"},{"name":"calendar_periods","description":"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"},{"name":"sun_daylight","description":"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 shor"},{"name":"scatter_dates","description":"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 a"},{"name":"render_timeline","description":"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 "},{"name":"render_calendar_page","description":"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 we"}],"toolCount":15,"serverName":"almanack","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"0.7.0","protocolVersion":"2025-06-18"}},{"at":"2026-09-06T01:23:06.444Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":54,"error":null,"detail":{"tools":[{"name":"validate_calendar_spec","description":"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"},{"name":"convert_date","description":"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_numb"},{"name":"calendar_weekday","description":"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 i"},{"name":"nth_weekday_of_month","description":"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 da"},{"name":"date_interval","description":"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 "},{"name":"add_to_date","description":"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 th"},{"name":"moon_phases","description":"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 whic"},{"name":"format_calendar_date","description":"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}"},{"name":"parse_calendar_date","description":"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"},{"name":"calendar_events","description":"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 t"},{"name":"calendar_periods","description":"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"},{"name":"sun_daylight","description":"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 shor"},{"name":"scatter_dates","description":"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 a"},{"name":"render_timeline","description":"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 "},{"name":"render_calendar_page","description":"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 we"}],"toolCount":15,"serverName":"almanack","capabilities":["experimental","prompts","resources","tools"],"serverVersion":"0.7.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"validate_calendar_spec","description":"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"},{"name":"convert_date","description":"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_numb"},{"name":"calendar_weekday","description":"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 i"},{"name":"nth_weekday_of_month","description":"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 da"},{"name":"date_interval","description":"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 "},{"name":"add_to_date","description":"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 th"},{"name":"moon_phases","description":"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 whic"},{"name":"format_calendar_date","description":"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}"},{"name":"parse_calendar_date","description":"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"},{"name":"calendar_events","description":"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 t"},{"name":"calendar_periods","description":"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"},{"name":"sun_daylight","description":"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 shor"},{"name":"scatter_dates","description":"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 a"},{"name":"render_timeline","description":"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 "},{"name":"render_calendar_page","description":"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 we"}],"package":null},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"dev.almanack/almanack","url":"https://registry.modelcontextprotocol.io/v0/servers/dev.almanack%2Falmanack","firstSeenAt":"2026-09-05T22:18:29.484Z","fetchedAt":"2026-09-05T22:18:29.484Z","normalizedAt":"2026-09-05T22:18:29.484Z"}]},"firstSeenAt":"2026-09-05T22:18:29.484Z","updatedAt":"2026-09-06T01:24:42.889Z"}