{"serverId":"mcp-registry/dev.almanack/almanack","tools":[{"name":"add_to_date","fixed":{"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 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;","inputSchema":{"type":"object","title":"add_to_dateArguments","required":["calendar"],"properties":{"date":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Date","default":null},"days":{"type":"integer","title":"Days","default":0},"time":{"anyOf":[{"type":"object","additionalProperties":{"type":"integer"}},{"type":"integer"},{"type":"null"}],"title":"Time","default":null},"steps":{"anyOf":[{"type":"array","items":{"type":"object","additionalProperties":true}},{"type":"null"}],"title":"Steps","default":null},"ticks":{"type":"integer","title":"Ticks","default":0},"years":{"type":"integer","title":"Years","default":0},"months":{"type":"integer","title":"Months","default":0},"policy":{"type":"string","title":"Policy","default":"clamp"},"calendar":{"type":"object","title":"Calendar","additionalProperties":true},"on_error":{"type":"string","title":"On Error","default":"fail"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":405,"tokensAfter":405},{"name":"convert_date","fixed":{"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_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 a","inputSchema":{"type":"object","title":"convert_dateArguments","required":["calendar"],"properties":{"date":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Date","default":null},"time":{"anyOf":[{"type":"object","additionalProperties":{"type":"integer"}},{"type":"integer"},{"type":"null"}],"title":"Time","default":null},"dates":{"anyOf":[{"type":"array","items":{"type":"object","additionalProperties":true}},{"type":"null"}],"title":"Dates","default":null},"calendar":{"type":"object","title":"Calendar","additionalProperties":true},"on_error":{"type":"string","title":"On Error","default":"fail"},"gregorian":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gregorian","default":null},"day_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Day Number","default":null},"gregorians":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Gregorians","default":null},"day_numbers":{"anyOf":[{"type":"array","items":{"type":"integer"}},{"type":"null"}],"title":"Day Numbers","default":null}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":447,"tokensAfter":447},{"name":"validate_calendar_spec","fixed":{"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 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, an","inputSchema":{"type":"object","title":"validate_calendar_specArguments","required":["calendar"],"properties":{"calendar":{"type":"object","title":"Calendar","additionalProperties":true}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":206,"tokensAfter":206}],"toolsChanged":3,"tokensSaved":0,"todo":[{"tool":"add_to_date","params":["date","days","time","steps","ticks","years","months","policy","calendar","on_error"]},{"tool":"calendar_events","params":["end","after","event","limit","query","start","events","calendar","inclusive"]},{"tool":"calendar_periods","params":["date","dates","calendar","on_error"]},{"tool":"calendar_weekday","params":["date","dates","calendar","on_error"]},{"tool":"convert_date","params":["date","time","dates","calendar","on_error","gregorian","day_number","gregorians","day_numbers"]},{"tool":"date_interval","params":["end","start","calendar","end_time","start_time"]},{"tool":"format_calendar_date","params":["date","time","dates","times","pattern","calendar","on_error"]},{"tool":"moon_phases","params":["date","time","calendar","day_fraction"]},{"tool":"nth_weekday_of_month","params":["n","year","month","weekday","calendar"]},{"tool":"parse_calendar_date","params":["text","pattern","calendar"]},{"tool":"render_calendar_page","params":["year","month","theme","events","calendar"]},{"tool":"render_timeline","params":["end","start","theme","events","calendar"]},{"tool":"scatter_dates","params":["end","seed","count","start","unique","calendar"]},{"tool":"sun_daylight","params":["date","dates","calendar","on_error"]},{"tool":"validate_calendar_spec","params":["calendar"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}