Shares a schedule that your group subscribes to once and that stays up to date.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this when someone wants a shared calendar that a group subscribes to: a team practice schedule, class timetable, club or family events. Publishes a page with the upcoming events and subscribe links (webcal, Google Calendar add-by-URL) to a live iCalendar feed. Takes 1-200 events in one IANA time zone, with optional weekly repeats and skipped dates; events can run up to one year ahead. Returns the public link and a private organizer link. Does not send invitations, reminders or emails, and does not write into anyone's calendar directly.
Calendar name people will see in their calendar app, e.g. U12 soccer practice.
The events, e.g. [{"title":"Practice","date":"2026-11-10","start":"17:30","end":"19:00","repeat_weekly_until":"2027-02-23"}].
IANA time zone of the event times, e.g. Europe/Berlin or America/Chicago.
Short description shown on the page and in calendar apps, e.g. Practice schedule for the U12 team.
Organizer's first name shown on the page, e.g. Coach Sam.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http calendar-feed https://calendar-feed.zovo.one/mcp
Use this when someone wants a shared calendar that a group subscribes to: a team practice schedule, class timetable, club or family events. Publishes a page with the upcoming events and subscribe links (webcal, Google Calendar add-by-URL) to a live iCalendar feed. Takes 1-200 events in one IANA time zone, with optional weekly repeats and skipped dates; events can run up to one year ahead. Returns the public link and a private organizer link. Does not send invitations, reminders or emails, and does not write into anyone's calendar directly.
| Argument | Type | Description |
|---|---|---|
| name* | string | Calendar name people will see in their calendar app, e.g. U12 soccer practice. |
| events* | array | The events, e.g. [{"title":"Practice","date":"2026-11-10","start":"17:30","end":"19:00","repeat_weekly_until":"2027-02-23"}]. |
| time_zone* | string | IANA time zone of the event times, e.g. Europe/Berlin or America/Chicago. |
| description | string | Short description shown on the page and in calendar apps, e.g. Practice schedule for the U12 team. |
| organizer_name | string | Organizer's first name shown on the page, e.g. Coach Sam. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"time_zone",
"events"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"description": "Calendar name people will see in their calendar app, e.g. U12 soccer practice."
},
"events": {
"type": "array",
"items": {
"type": "object",
"required": [
"title",
"date"
],
"properties": {
"end": {
"type": "string",
"maxLength": 20,
"description": "Local end time HH:MM, e.g. 19:00. An end earlier than the start means the next day. Or use duration_minutes."
},
"date": {
"type": "string",
"maxLength": 40,
"description": "First (or only) date, YYYY-MM-DD, e.g. 2026-11-10."
},
"note": {
"type": "string",
"maxLength": 1200,
"description": "Short note, e.g. Bring shin guards."
},
"start": {
"type": "string",
"maxLength": 20,
"description": "Local start time HH:MM in the calendar's time zone, e.g. 17:30. Omit for an all-day event."
},
"title": {
"type": "string",
"maxLength": 400,
"description": "Event title, e.g. Practice."
},
"all_day": {
"type": "boolean",
"description": "true for an all-day event (no times), e.g. true."
},
"end_date": {
"type": "string",
"maxLength": 40,
"description": "For an all-day event over several days, the last day YYYY-MM-DD (inclusive), e.g. 2026-11-22."
},
"location": {
"type": "string",
"maxLength": 400,
"description": "Place in words, e.g. Field 2, Riverside Park. No links."
},
"skip_dates": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 40,
"description": "Dates of a weekly series to leave out, e.g. [\"2026-12-22\"]."
},
"duration_minutes": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Length in minutes instead of an end time, e.g. 90. Default 60."
},
"repeat_weekly_until": {
"type": "string",
"maxLength": 40,
"description": "Repeat every week on the same weekday until this date YYYY-MM-DD (inclusive), e.g. 2027-01-26."
}
}
},
"maxItems": 220,
"description": "The events, e.g. [{\"title\":\"Practice\",\"date\":\"2026-11-10\",\"start\":\"17:30\",\"end\":\"19:00\",\"repeat_weekly_until\":\"2027-02-23\"}]."
},
"time_zone": {
"type": "string",
"maxLength": 64,
"description": "IANA time zone of the event times, e.g. Europe/Berlin or America/Chicago."
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "Short description shown on the page and in calendar apps, e.g. Practice schedule for the U12 team."
},
"organizer_name": {
"type": "string",
"maxLength": 100,
"description": "Organizer's first name shown on the page, e.g. Coach Sam."
}
}
}Use this when the organizer wants to see a group calendar they made: its events with their numbers, the next dates and the subscribe links. Needs the private organizer link (contains /m/). Does not change the calendar.
| Argument | Type | Description |
|---|---|---|
| manage_link* | string | The private organizer link returned when the calendar was made, e.g. https://calendar-feed.zovo.one/m/<id>/<key>. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"manage_link"
],
"properties": {
"manage_link": {
"type": "string",
"maxLength": 400,
"description": "The private organizer link returned when the calendar was made, e.g. https://calendar-feed.zovo.one/m/<id>/<key>."
}
}
}Use this when the organizer wants to add events to a group calendar, change an event (time, date, place, note, repeat, skipped dates), cancel or restore an event, or rename the calendar. Needs the private organizer link and the event numbers from show_group_calendar. Changed events keep their identity and get a higher revision, so calendar apps update them on their next refresh; cancelled events stay marked as cancelled. Does not notify anyone and does not delete events.
| Argument | Type | Description |
|---|---|---|
| name | string | New calendar name, e.g. U12 practice (winter). |
| changes | array | Changes to existing events by number, e.g. [{"event":1,"skip_dates":["2026-12-22"]},{"event":3,"cancel":true}]. |
| add_events | array | New events to add, same shape as when creating, e.g. [{"title":"Tournament","date":"2026-12-12","all_day":true}]. |
| description | string | New description, e.g. Winter indoor schedule. |
| manage_link* | string | The private organizer link returned when the calendar was made, e.g. https://calendar-feed.zovo.one/m/<id>/<key>. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"manage_link"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"description": "New calendar name, e.g. U12 practice (winter)."
},
"changes": {
"type": "array",
"items": {
"type": "object",
"required": [
"event"
],
"properties": {
"end": {
"type": "string",
"maxLength": 20,
"description": "Local end time HH:MM, e.g. 19:00. An end earlier than the start means the next day. Or use duration_minutes."
},
"date": {
"type": "string",
"maxLength": 40,
"description": "First (or only) date, YYYY-MM-DD, e.g. 2026-11-10."
},
"note": {
"type": "string",
"maxLength": 1200,
"description": "Short note, e.g. Bring shin guards."
},
"event": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The event number shown in the calendar results, e.g. 3."
},
"start": {
"type": "string",
"maxLength": 20,
"description": "Local start time HH:MM in the calendar's time zone, e.g. 17:30. Omit for an all-day event."
},
"title": {
"type": "string",
"maxLength": 400,
"description": "Event title, e.g. Practice."
},
"cancel": {
"type": "boolean",
"description": "true to cancel the event; it stays in subscribers' calendars marked cancelled, e.g. true."
},
"all_day": {
"type": "boolean",
"description": "true for an all-day event (no times), e.g. true."
},
"restore": {
"type": "boolean",
"description": "true to undo a cancellation, e.g. false."
},
"end_date": {
"type": "string",
"maxLength": 40,
"description": "For an all-day event over several days, the last day YYYY-MM-DD (inclusive), e.g. 2026-11-22."
},
"location": {
"type": "string",
"maxLength": 400,
"description": "Place in words, e.g. Field 2, Riverside Park. No links."
},
"skip_dates": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 40,
"description": "Dates to ADD to the dates this weekly series already skips (earlier skips stay), e.g. [\"2026-12-22\"]."
},
"unskip_dates": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 40,
"description": "Skipped dates of a weekly series to put back, e.g. [\"2026-12-22\"]."
},
"duration_minutes": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Length in minutes instead of an end time, e.g. 90. Default 60."
},
"repeat_weekly_until": {
"type": "string",
"maxLength": 40,
"description": "Repeat every week on the same weekday until this date YYYY-MM-DD (inclusive), e.g. 2027-01-26."
}
}
},
"maxItems": 50,
"description": "Changes to existing events by number, e.g. [{\"event\":1,\"skip_dates\":[\"2026-12-22\"]},{\"event\":3,\"cancel\":true}]."
},
"add_events": {
"type": "array",
"items": {
"type": "object",
"required": [
"title",
"date"
],
"properties": {
"end": {
"type": "string",
"maxLength": 20,
"description": "Local end time HH:MM, e.g. 19:00. An end earlier than the start means the next day. Or use duration_minutes."
},
"date": {
"type": "string",
"maxLength": 40,
"description": "First (or only) date, YYYY-MM-DD, e.g. 2026-11-10."
},
"note": {
"type": "string",
"maxLength": 1200,
"description": "Short note, e.g. Bring shin guards."
},
"start": {
"type": "string",
"maxLength": 20,
"description": "Local start time HH:MM in the calendar's time zone, e.g. 17:30. Omit for an all-day event."
},
"title": {
"type": "string",
"maxLength": 400,
"description": "Event title, e.g. Practice."
},
"all_day": {
"type": "boolean",
"description": "true for an all-day event (no times), e.g. true."
},
"end_date": {
"type": "string",
"maxLength": 40,
"description": "For an all-day event over several days, the last day YYYY-MM-DD (inclusive), e.g. 2026-11-22."
},
"location": {
"type": "string",
"maxLength": 400,
"description": "Place in words, e.g. Field 2, Riverside Park. No links."
},
"skip_dates": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 40,
"description": "Dates of a weekly series to leave out, e.g. [\"2026-12-22\"]."
},
"duration_minutes": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Length in minutes instead of an end time, e.g. 90. Default 60."
},
"repeat_weekly_until": {
"type": "string",
"maxLength": 40,
"description": "Repeat every week on the same weekday until this date YYYY-MM-DD (inclusive), e.g. 2027-01-26."
}
}
},
"maxItems": 200,
"description": "New events to add, same shape as when creating, e.g. [{\"title\":\"Tournament\",\"date\":\"2026-12-12\",\"all_day\":true}]."
},
"description": {
"type": "string",
"maxLength": 1000,
"description": "New description, e.g. Winter indoor schedule."
},
"manage_link": {
"type": "string",
"maxLength": 400,
"description": "The private organizer link returned when the calendar was made, e.g. https://calendar-feed.zovo.one/m/<id>/<key>."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 8, 2026.