{"description":"MCP-compatible surface for Mavo's shared household plan.","name":"mavo-mcp","title":"Mavo","version":"0.4.0","auth":{"authorizationServerMetadataUrl":"https://mavolife.com/.well-known/oauth-authorization-server","protectedResourceMetadataUrl":"https://mavolife.com/.well-known/oauth-protected-resource","resource":"https://mavolife.com/mcp","scopes":["openid","profile","email","offline_access","household:read","household:write"]},"contact":{"email":"hello@mavolife.com","supportUrl":"mailto:hello@mavolife.com"},"links":{"connectGuide":"https://mavolife.com/docs/guide/connect-your-assistant","connectorReviewKit":"https://mavolife.com/docs/guide/connector-review-kit","icon":"https://mavolife.com/brand/mavo-connector-icon-256.png","privacy":"https://mavolife.com/privacy","terms":"https://mavolife.com/terms"},"instructions":"Mavo is a shared household plan, not merely a calendar or list database. Calendar events, tasks, meals, groceries, and list entries are plan items. When capturing or changing a plan item, consider both what is happening and whether its logistics are covered.\n\nAttendance and responsibility are separate. Attendance records who is going, maybe going, or not going; it never assigns responsibility. A plan item that requires responsibility but has no owner Needs Attention. An item with an owner is Covered. Owning means being on point for the logistics, usually a parent: an owner is not necessarily attending, and marking someone as going never makes them the owner. In results, ownerName and responsibleNames say who is handling an item, never who is going. responsibilityRequired: false means the family explicitly decided that no one needs to handle it, so it is settled rather than unassigned.\n\nUse showFamilyWeek when the family asks to see, scan, or review its week; keep ordinary calendar lookups and background reasoning on queryCalendarEvents so a visual is chosen only when it improves the answer.\n\nPreserve write safety: query before updating or deleting existing items, use batch tools for multi-item requests, and choose occurrence versus series scope for recurring-event edits. Read mavo://guide/index when deeper product context would help; especially use mavo://guide/whos-handling-it before reasoning about attendance, ownership, Covered, Needs Attention, or No one needed. If the client cannot read MCP resources directly, call readMavoGuide with the exact mavo://guide URI instead.","resources":[{"description":"Index of Mavo's semantic product guides, with guidance on which resource to read for each kind of household work.","mimeType":"text/markdown","name":"mavo-guide-index","uri":"mavo://guide/index"},{"description":"Start here for Mavo's shared-plan mental model, product vocabulary, and the questions every household plan should answer.","mimeType":"text/markdown","name":"mavo-guide-overview","uri":"mavo://guide/overview"},{"description":"How the family calendar, lists, groceries, meals, outside calendars, and calendar shares form one household plan.","mimeType":"text/markdown","name":"mavo-guide-shared-plan","uri":"mavo://guide/shared-plan"},{"description":"The authoritative guide to attendance versus responsibility, owners, Covered, Needs Attention, and No one needed.","mimeType":"text/markdown","name":"mavo-guide-whos-handling-it","uri":"mavo://guide/whos-handling-it"},{"description":"How email, text, links, photos, files, and chat become reviewed plan items without retyping.","mimeType":"text/markdown","name":"mavo-guide-add-from-anywhere","uri":"mavo://guide/add-from-anywhere"},{"description":"How reminders, assignments, coverage nudges, Family Game Plan, delivery channels, and notification preferences behave.","mimeType":"text/markdown","name":"mavo-guide-notifications","uri":"mavo://guide/notifications"},{"description":"How connected assistants authenticate, select a family, use household actions, and differ from Mavo's own chat.","mimeType":"text/markdown","name":"mavo-guide-connect-your-assistant","uri":"mavo://guide/connect-your-assistant"},{"_meta":{"ui":{"csp":{"baseUriDomains":[],"connectDomains":[],"frameDomains":[],"resourceDomains":[]},"prefersBorder":false}},"description":"Read-only Mavo family week view for calendar schedule and responsibility coverage.","mimeType":"text/html;profile=mcp-app","name":"mavo-family-week","title":"Mavo Family Week","uri":"ui://mavo/family-week-v2.html"}],"tools":[{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Read Mavo Guide"},"description":"Read one canonical Mavo product guide as Markdown. Use this fallback when the client shows a mavo://guide reference but does not expose MCP resources/read.","inputSchema":{"additionalProperties":false,"properties":{"uri":{"description":"Exact mavo://guide URI shown in Mavo instructions or another tool description.","enum":["mavo://guide/index","mavo://guide/overview","mavo://guide/shared-plan","mavo://guide/whos-handling-it","mavo://guide/add-from-anywhere","mavo://guide/notifications","mavo://guide/connect-your-assistant"],"type":"string"}},"required":["uri"],"type":"object"},"name":"readMavoGuide","outputSchema":{"additionalProperties":{},"description":"Structured JSON object returned by the tool.","type":"object"}},{"_meta":{"ui":{"resourceUri":"ui://mavo/family-week-v2.html","visibility":["model"]},"ui/resourceUri":"ui://mavo/family-week-v2.html"},"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Show Family Week"},"description":"Show the family calendar as a compact week view with schedule, responsibility, and coverage status. Use this when seeing the week is more useful than reading a list of events. The same call always returns useful text and view-ready JSON when the client cannot render MCP Apps.","inputSchema":{"additionalProperties":false,"properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"from":{"description":"Optional first ISO date (YYYY-MM-DD). With no dates, Mavo uses the current Sunday-through-Saturday week in the household time zone. With only from, Mavo shows seven days starting there.","format":"date","type":"string"},"to":{"description":"Optional final ISO date (YYYY-MM-DD). With only to, Mavo shows the seven days ending there. A custom range can span at most 14 days.","format":"date","type":"string"}},"type":"object"},"name":"showFamilyWeek","outputSchema":{"additionalProperties":false,"properties":{"events":{"items":{"additionalProperties":false,"properties":{"allDay":{"type":"boolean"},"awaitingNames":{"description":"People asked to take this event on who have not answered yet. They are deciding whether to handle it; this is not an RSVP list.","items":{"type":"string"},"type":"array"},"calendarName":{"type":["string","null"]},"continuesAfterRange":{"description":"True when the event keeps going past the final day of the requested range.","type":"boolean"},"continuesFromBefore":{"description":"True when the event started before the first day of the requested range.","type":"boolean"},"coverageStatus":{"description":"covered means a named person is handling the event, needs_attention means nobody is handling it yet, and no_one_needed means the family decided nobody has to.","enum":["covered","needs_attention","no_one_needed"],"type":"string"},"date":{"description":"The day this event appears within the requested range, clamped to it. Use startDate and endDate for the event's real span.","format":"date","type":"string"},"endDate":{"description":"The event's real final day, which can fall after the requested range.","format":"date","type":"string"},"hasEnded":{"description":"True when the event already finished in the household's time zone; treat it as history, not something to act on.","type":"boolean"},"ownerName":{"description":"The adult on point for this event, usually a parent. Owning it does not mean attending it; null means nobody has taken it on.","type":["string","null"]},"responsibleNames":{"description":"Everyone currently handling this event's logistics. They are not necessarily going; attendance is separate.","items":{"type":"string"},"type":"array"},"startDate":{"description":"The event's real first day, which can fall before the requested range.","format":"date","type":"string"},"time":{"description":"Start time on the event's first day; null for all-day events and for events already in progress when the range begins.","type":["string","null"]},"title":{"type":"string"},"where":{"type":["string","null"]}},"required":["allDay","awaitingNames","calendarName","continuesAfterRange","continuesFromBefore","coverageStatus","date","endDate","hasEnded","ownerName","responsibleNames","startDate","time","title","where"],"type":"object"},"type":"array"},"from":{"description":"First day shown, in the household time zone.","format":"date","type":"string"},"matchingCount":{"description":"How many calendar events fall in the range, counting any left out of the events list.","type":"number"},"ok":{"type":"boolean"},"to":{"description":"Final day shown, in the household time zone.","format":"date","type":"string"},"truncated":{"description":"True when the range holds more events than the events list carries; matchingCount has the full number.","type":"boolean"}},"required":["events","from","matchingCount","ok","to","truncated"],"type":"object"}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Query Calendar Events"},"description":"Read events from every family calendar, including custom calendars and linked feeds. Use this before updating, deleting, reasoning about, or linking to an existing calendar event. The optional query is one punctuation-tolerant phrase, not a tokenized or fuzzy search: query one event title at a time, or omit query and use a narrow date window when several events are involved. If matchingCount is 0 while total is greater than 0, retry with the exact title or date window. Each result includes a ready-to-use href and an explicit coverageStatus: covered means a named person is handling the event, needs_attention means nobody is handling it yet, and no_one_needed means the family decided nobody has to. Result ownerName and ownerPersonId say who is on point for the event, usually a parent, and responsibleNames lists everyone handling it; none of those people are necessarily going. attendanceResponses records who is going, maybe going, or out, and never assigns responsibility. When both from and to are provided, repeating series are expanded into concrete dated occurrences inside that window; those results include the base event id, original occurrence date, and recommended edit scope needed for a safe one-occurrence update. Calendar events are plan items. Attendance is separate from responsibility: going, maybe, or out never assigns an owner. Required without an owner is Needs Attention; an owner means Covered; responsibilityRequired false means intentionally No one needed. See mavo://guide/whos-handling-it.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"excludeEnded":{"description":"Set true to leave out events that already finished in the household's time zone (their end time, or start plus duration, has passed). With a from/to window, this is evaluated per expanded occurrence. Useful for reading what is still ahead today.","type":"boolean"},"from":{"description":"Only include events on or after this ISO date (YYYY-MM-DD). When to is also provided, repeating series expand into dated occurrences inside the window.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"limit":{"default":20,"description":"Maximum matching events to return, from 1 to 50.","type":"integer","minimum":1,"maximum":50},"query":{"description":"One case-insensitive phrase matched separately against each event title, saved data, or status. Punctuation and possessive apostrophes are ignored, but this is not a tokenized web search. Do not combine different event titles in one query. To find several known events, call once per title or omit query and use a narrow from/to window.","type":"string"},"status":{"description":"Only return events with this saved status. Omit to include every status.","type":"string","enum":["active","done","archived"]},"to":{"description":"Only include events on or before this ISO date (YYYY-MM-DD).","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}}},"name":"queryCalendarEvents","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Add Calendar Event"},"description":"Add a genuinely new dated event to the family calendar when the user has asked to capture or plan it. Check queryCalendarEvents first. If a same-title event already exists on that date, update it only when it is clearly the same real-world event; otherwise resolve the ambiguity before adding. Use allowPotentialDuplicate only after the calendar check proves two similar entries are intentionally distinct. Do not use this as a fallback after a lookup returns no matches; retry queryCalendarEvents instead. A date is required. Ask the user for the date before calling this tool when it is missing or ambiguous. Calendar events are plan items. Attendance is separate from responsibility: going, maybe, or out never assigns an owner. Required without an owner is Needs Attention; an owner means Covered; responsibilityRequired false means intentionally No one needed. See mavo://guide/whos-handling-it.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"allowPotentialDuplicate":{"description":"Set true only after queryCalendarEvents confirms that a same-title event on this date is a different real-world event. Omit for normal creates.","type":"boolean"},"allDay":{"description":"Set true when the event has no start time and lasts the whole day.","type":"boolean"},"assignee":{"description":"Legacy single responsible-person id. It must come from the eligible event responsibility assignees in household context. Prefer ownerPersonId for one owner or responsiblePersonIds for shared responsibility. It assigns responsibility; it does not record attendance.","type":"string"},"calendarKey":{"description":"Which calendar to add the event to, when the family keeps more than one. Defaults to the main family calendar.","type":"string"},"attendance":{"description":"Initial attendance map keyed by exact household person id, with going, maybe, or out values. Prefer everyoneAttendance when the family says everyone. Attendance records who is going; it does not assign responsibility for the event.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","enum":["going","maybe","out"]}},"data":{"description":"Custom calendar metadata only. Schedule, recurrence, attendance, responsibility, reminders, travel, and other named fields must use their dedicated inputs and are rejected here.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Required event date in YYYY-MM-DD format. For a birthday with no stated year, use its next occurrence relative to the current household date, not one blanket year for every birthday in a batch."},"durationMinutes":{"description":"Event length in minutes when an end time is not supplied.","type":"integer","minimum":15,"maximum":1440},"endDate":{"type":"string","description":"Inclusive ISO end date for events that span multiple days, like a camp or trip."},"endTime":{"type":"string","description":"Local event end time when known, in 12-hour format with AM or PM, for example \"4:30 PM\"."},"everyoneAttendance":{"description":"Set every active household person to this attendance status. Mavo resolves current person ids server-side. Do not send attendance too. Attendance does not assign responsibility, even when everyone is going.","type":"string","enum":["going","maybe","out"]},"note":{"description":"Useful event details, instructions, or source context that belong with the saved event.","type":"string"},"ownerPersonId":{"description":"Adult person id on point for this event, usually a parent: the one making sure it happens, whether or not they have joined Mavo. Owning an event never means attending it; going is recorded separately in attendance. An owner makes the event Covered. Use only an id from the eligible event responsibility assignees in household context.","type":"string"},"responsibilityRequired":{"description":"Set false only when the family explicitly says this event needs no responsible person. False means the family intentionally chose No one needed, so the event is settled without an owner; false also clears any assignment. True with nobody assigned means Needs Attention. Omit it when responsibility is merely undecided; assigning anyone makes it true.","type":"boolean"},"responsiblePersonIds":{"description":"Adult person ids currently responsible for this event: the people handling it, not an attendee list. Any adult in the household qualifies, including one who has not joined Mavo yet: who really does the thing is worth recording either way. Anyone responsible makes the event Covered; none while responsibility is required means Needs Attention. Send [] to leave it unassigned.","type":"array","items":{"type":"string","minLength":1}},"reminders":{"description":"Event reminders. Send [] to clear.","type":"array","items":{"type":"object","properties":{"audience":{"default":"household","description":"Who should receive the reminder: the whole household, responsible people, people marked going, or the explicit people list.","type":"string","enum":["household","responsible","going","people"]},"channels":{"default":["in_app"],"description":"Delivery channels for this reminder.","type":"array","items":{"type":"string","enum":["in_app","email","push","sms"]}},"mode":{"default":"plain","description":"plain sends the saved reminder; mavo allows a contextual reminder generated at send time.","type":"string","enum":["plain","mavo"]},"offsetMinutes":{"type":"integer","minimum":0,"maximum":20160,"description":"How many minutes before the event start to send the reminder; 0 means at the start."},"recipientPersonIds":{"default":[],"description":"Household person ids to notify when audience is people; otherwise leave empty.","type":"array","items":{"type":"string","minLength":1}}},"required":["offsetMinutes"]}},"repeatDays":{"description":"Weekdays for custom repeats, 0=Sunday through 6=Saturday.","type":"array","items":{"type":"integer","minimum":0,"maximum":6}},"repeatFrequency":{"description":"How the event repeats. Use none to clear the repeat.","type":"string","enum":["none","daily","weekdays","weekends","weekly","monthly","yearly","custom"]},"repeatInterval":{"description":"Repeat interval in weeks for weekly/custom repeats, months for monthly repeats, or years for yearly repeats.","type":"integer","minimum":1,"maximum":52},"time":{"description":"Local event start time when known, in 12-hour format with AM or PM, for example \"3:30 PM\".","type":"string"},"title":{"type":"string","minLength":1,"description":"Name the specific event, e.g. \"Soccer practice\" — never a generic label like \"Family event\"."},"travelPlan":{"description":"Optional event-specific leave-by plan. Set origin and fixed base travel minutes; use null to remove it.","anyOf":[{"type":"object","properties":{"arriveEarlyMinutes":{"default":0,"description":"Extra minutes to arrive before the event starts.","type":"integer","minimum":0,"maximum":720},"baseTravelMinutes":{"type":"integer","minimum":1,"maximum":1440,"description":"Expected travel time in minutes before any live traffic adjustment."},"origin":{"type":"string","minLength":1,"maxLength":240,"description":"Specific starting place for the trip, such as Home or a street address."}},"required":["baseTravelMinutes","origin"]},{"type":"null"}]},"where":{"description":"Event place or address when known.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180}},"required":["date","title"]},"name":"addCalendarEvent","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Add Calendar Events"},"description":"Add two or more calendar events in one approved write. Use this whenever one family request contains several new events, so the complete set is validated and saved together instead of relying on a sequence of single-event calls. Every event still needs its own date and full details. Existing exact duplicates are returned as already present; a possible duplicate blocks the batch before any new event is written. Calendar events are plan items. Attendance is separate from responsibility: going, maybe, or out never assigns an owner. Required without an owner is Needs Attention; an owner means Covered; responsibilityRequired false means intentionally No one needed. See mavo://guide/whos-handling-it.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"events":{"minItems":2,"maxItems":50,"type":"array","items":{"type":"object","properties":{"allowPotentialDuplicate":{"description":"Set true only after queryCalendarEvents confirms that a same-title event on this date is a different real-world event. Omit for normal creates.","type":"boolean"},"allDay":{"description":"Set true when the event has no start time and lasts the whole day.","type":"boolean"},"assignee":{"description":"Legacy single responsible-person id. It must come from the eligible event responsibility assignees in household context. Prefer ownerPersonId for one owner or responsiblePersonIds for shared responsibility. It assigns responsibility; it does not record attendance.","type":"string"},"calendarKey":{"description":"Which calendar to add the event to, when the family keeps more than one. Defaults to the main family calendar.","type":"string"},"attendance":{"description":"Initial attendance map keyed by exact household person id, with going, maybe, or out values. Prefer everyoneAttendance when the family says everyone. Attendance records who is going; it does not assign responsibility for the event.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","enum":["going","maybe","out"]}},"data":{"description":"Custom calendar metadata only. Schedule, recurrence, attendance, responsibility, reminders, travel, and other named fields must use their dedicated inputs and are rejected here.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Required event date in YYYY-MM-DD format. For a birthday with no stated year, use its next occurrence relative to the current household date, not one blanket year for every birthday in a batch."},"durationMinutes":{"description":"Event length in minutes when an end time is not supplied.","type":"integer","minimum":15,"maximum":1440},"endDate":{"type":"string","description":"Inclusive ISO end date for events that span multiple days, like a camp or trip."},"endTime":{"type":"string","description":"Local event end time when known, in 12-hour format with AM or PM, for example \"4:30 PM\"."},"everyoneAttendance":{"description":"Set every active household person to this attendance status. Mavo resolves current person ids server-side. Do not send attendance too. Attendance does not assign responsibility, even when everyone is going.","type":"string","enum":["going","maybe","out"]},"note":{"description":"Useful event details, instructions, or source context that belong with the saved event.","type":"string"},"ownerPersonId":{"description":"Adult person id on point for this event, usually a parent: the one making sure it happens, whether or not they have joined Mavo. Owning an event never means attending it; going is recorded separately in attendance. An owner makes the event Covered. Use only an id from the eligible event responsibility assignees in household context.","type":"string"},"responsibilityRequired":{"description":"Set false only when the family explicitly says this event needs no responsible person. False means the family intentionally chose No one needed, so the event is settled without an owner; false also clears any assignment. True with nobody assigned means Needs Attention. Omit it when responsibility is merely undecided; assigning anyone makes it true.","type":"boolean"},"responsiblePersonIds":{"description":"Adult person ids currently responsible for this event: the people handling it, not an attendee list. Any adult in the household qualifies, including one who has not joined Mavo yet: who really does the thing is worth recording either way. Anyone responsible makes the event Covered; none while responsibility is required means Needs Attention. Send [] to leave it unassigned.","type":"array","items":{"type":"string","minLength":1}},"reminders":{"description":"Event reminders. Send [] to clear.","type":"array","items":{"type":"object","properties":{"audience":{"default":"household","description":"Who should receive the reminder: the whole household, responsible people, people marked going, or the explicit people list.","type":"string","enum":["household","responsible","going","people"]},"channels":{"default":["in_app"],"description":"Delivery channels for this reminder.","type":"array","items":{"type":"string","enum":["in_app","email","push","sms"]}},"mode":{"default":"plain","description":"plain sends the saved reminder; mavo allows a contextual reminder generated at send time.","type":"string","enum":["plain","mavo"]},"offsetMinutes":{"type":"integer","minimum":0,"maximum":20160,"description":"How many minutes before the event start to send the reminder; 0 means at the start."},"recipientPersonIds":{"default":[],"description":"Household person ids to notify when audience is people; otherwise leave empty.","type":"array","items":{"type":"string","minLength":1}}},"required":["offsetMinutes"]}},"repeatDays":{"description":"Weekdays for custom repeats, 0=Sunday through 6=Saturday.","type":"array","items":{"type":"integer","minimum":0,"maximum":6}},"repeatFrequency":{"description":"How the event repeats. Use none to clear the repeat.","type":"string","enum":["none","daily","weekdays","weekends","weekly","monthly","yearly","custom"]},"repeatInterval":{"description":"Repeat interval in weeks for weekly/custom repeats, months for monthly repeats, or years for yearly repeats.","type":"integer","minimum":1,"maximum":52},"time":{"description":"Local event start time when known, in 12-hour format with AM or PM, for example \"3:30 PM\".","type":"string"},"title":{"type":"string","minLength":1,"description":"Name the specific event, e.g. \"Soccer practice\" — never a generic label like \"Family event\"."},"travelPlan":{"description":"Optional event-specific leave-by plan. Set origin and fixed base travel minutes; use null to remove it.","anyOf":[{"type":"object","properties":{"arriveEarlyMinutes":{"default":0,"description":"Extra minutes to arrive before the event starts.","type":"integer","minimum":0,"maximum":720},"baseTravelMinutes":{"type":"integer","minimum":1,"maximum":1440,"description":"Expected travel time in minutes before any live traffic adjustment."},"origin":{"type":"string","minLength":1,"maxLength":240,"description":"Specific starting place for the trip, such as Home or a street address."}},"required":["baseTravelMinutes","origin"]},{"type":"null"}]},"where":{"description":"Event place or address when known.","type":"string"}},"required":["date","title"]},"description":"Two to fifty genuinely distinct events to create together. Every item must include its own complete date, title, schedule, recurrence, attendance, and responsibility details."}},"required":["events"]},"name":"addCalendarEvents","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Update Calendar Event"},"description":"Update any part of an existing family calendar event by event id, including its title, schedule, place, notes, attendance, whether responsibility is needed, responsible people, reminders, travel plan, or status. Use queryCalendarEvents first. Attendance and responsibility stay separate: changing who is going never changes who is handling the event, and the other way round. For a repeating event, use editScope occurrence plus occurrenceDate to change just that date; editScope series changes every date. Events from a linked calendar feed keep their feed schedule. Calendar events are plan items. Attendance is separate from responsibility: going, maybe, or out never assigns an owner. Required without an owner is Needs Attention; an owner means Covered; responsibilityRequired false means intentionally No one needed. See mavo://guide/whos-handling-it.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"allDay":{"description":"Set true when the event has no start time and lasts the whole day.","type":"boolean"},"assignee":{"description":"Legacy single responsible-person id. It must come from the eligible event responsibility assignees in household context. Prefer ownerPersonId for one owner or responsiblePersonIds for shared responsibility. It assigns responsibility; it does not record attendance.","type":"string"},"calendarKey":{"description":"Which calendar to add the event to, when the family keeps more than one. Defaults to the main family calendar.","type":"string"},"attendance":{"description":"Attendance responses to merge into the saved map, keyed by exact household person id. Unspecified people keep their current response. Use clearAttendance to clear every response, or everyoneAttendance when the family says everyone. Changing who is going never changes who is responsible.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","enum":["going","maybe","out"]}},"data":{"description":"Custom calendar metadata to merge. Schedule, recurrence, attendance, responsibility, reminders, travel, and other named fields must use their dedicated inputs and are rejected here.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Required event date in YYYY-MM-DD format. For a birthday with no stated year, use its next occurrence relative to the current household date, not one blanket year for every birthday in a batch."},"durationMinutes":{"description":"Event length in minutes when an end time is not supplied.","type":"integer","minimum":15,"maximum":1440},"endDate":{"type":"string","description":"Inclusive ISO end date for events that span multiple days, like a camp or trip."},"endTime":{"type":"string","description":"Local event end time when known, in 12-hour format with AM or PM, for example \"4:30 PM\"."},"everyoneAttendance":{"description":"Set every active household person to this attendance status. Mavo resolves current person ids server-side. Do not send attendance too. Attendance does not assign responsibility, even when everyone is going.","type":"string","enum":["going","maybe","out"]},"note":{"description":"Useful event details, instructions, or source context that belong with the saved event.","type":"string"},"ownerPersonId":{"description":"Adult person id on point for this event, usually a parent: the one making sure it happens, whether or not they have joined Mavo. Owning an event never means attending it; going is recorded separately in attendance. An owner makes the event Covered. Use only an id from the eligible event responsibility assignees in household context.","type":"string"},"responsibilityRequired":{"description":"Set false only when the family explicitly says this event needs no responsible person. False means the family intentionally chose No one needed, so the event is settled without an owner; false also clears any assignment. True with nobody assigned means Needs Attention. Omit it when responsibility is merely undecided; assigning anyone makes it true.","type":"boolean"},"responsiblePersonIds":{"description":"Adult person ids currently responsible for this event: the people handling it, not an attendee list. Any adult in the household qualifies, including one who has not joined Mavo yet: who really does the thing is worth recording either way. Anyone responsible makes the event Covered; none while responsibility is required means Needs Attention. Send [] to leave it unassigned.","type":"array","items":{"type":"string","minLength":1}},"reminders":{"description":"Event reminders. Send [] to clear.","type":"array","items":{"type":"object","properties":{"audience":{"default":"household","description":"Who should receive the reminder: the whole household, responsible people, people marked going, or the explicit people list.","type":"string","enum":["household","responsible","going","people"]},"channels":{"default":["in_app"],"description":"Delivery channels for this reminder.","type":"array","items":{"type":"string","enum":["in_app","email","push","sms"]}},"mode":{"default":"plain","description":"plain sends the saved reminder; mavo allows a contextual reminder generated at send time.","type":"string","enum":["plain","mavo"]},"offsetMinutes":{"type":"integer","minimum":0,"maximum":20160,"description":"How many minutes before the event start to send the reminder; 0 means at the start."},"recipientPersonIds":{"default":[],"description":"Household person ids to notify when audience is people; otherwise leave empty.","type":"array","items":{"type":"string","minLength":1}}},"required":["offsetMinutes"]}},"repeatDays":{"description":"Weekdays for custom repeats, 0=Sunday through 6=Saturday.","type":"array","items":{"type":"integer","minimum":0,"maximum":6}},"repeatFrequency":{"description":"How the event repeats. Use none to clear the repeat.","type":"string","enum":["none","daily","weekdays","weekends","weekly","monthly","yearly","custom"]},"repeatInterval":{"description":"Repeat interval in weeks for weekly/custom repeats, months for monthly repeats, or years for yearly repeats.","type":"integer","minimum":1,"maximum":52},"time":{"description":"Local event start time when known, in 12-hour format with AM or PM, for example \"3:30 PM\".","type":"string"},"title":{"type":"string","minLength":1,"description":"Name the specific event, e.g. \"Soccer practice\" — never a generic label like \"Family event\"."},"travelPlan":{"description":"Optional event-specific leave-by plan. Set origin and fixed base travel minutes; use null to remove it.","anyOf":[{"type":"object","properties":{"arriveEarlyMinutes":{"default":0,"description":"Extra minutes to arrive before the event starts.","type":"integer","minimum":0,"maximum":720},"baseTravelMinutes":{"type":"integer","minimum":1,"maximum":1440,"description":"Expected travel time in minutes before any live traffic adjustment."},"origin":{"type":"string","minLength":1,"maxLength":240,"description":"Specific starting place for the trip, such as Home or a street address."}},"required":["baseTravelMinutes","origin"]},{"type":"null"}]},"where":{"description":"Event place or address when known.","type":"string"},"clearAttendance":{"description":"Set true only when the family explicitly asks to clear every saved attendance response. Do not send attendance or everyoneAttendance too. Clearing attendance leaves responsibility and coverage untouched.","type":"boolean"},"clearTravelPlan":{"description":"Set true to remove the event's Getting there plan.","type":"boolean"},"editScope":{"description":"Required for a repeating event: occurrence changes one original date and requires occurrenceDate; series changes every occurrence. Omit only for a non-repeating event.","type":"string","enum":["occurrence","series"]},"eventId":{"type":"string","minLength":1,"description":"The exact event id from queryCalendarEvents or addCalendarEvent."},"occurrenceDate":{"description":"The original YYYY-MM-DD date in the repeat pattern. Required when editScope is occurrence.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"status":{"description":"New saved status for the existing event.","type":"string","enum":["active","done","archived"]},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180}},"required":["eventId"]},"name":"updateCalendarEvent","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Update Calendar Events"},"description":"Update two or more existing calendar events in one approved write. Use this whenever one request changes a set such as “those events” or “both Sunday events,” so every id and scope is validated before the first write. For repeating events, each item must explicitly choose occurrence or series. Returned events are the canonical saved records. Calendar events are plan items. Attendance is separate from responsibility: going, maybe, or out never assigns an owner. Required without an owner is Needs Attention; an owner means Covered; responsibilityRequired false means intentionally No one needed. See mavo://guide/whos-handling-it.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"events":{"minItems":2,"maxItems":50,"type":"array","items":{"type":"object","properties":{"allDay":{"description":"Set true when the event has no start time and lasts the whole day.","type":"boolean"},"assignee":{"description":"Legacy single responsible-person id. It must come from the eligible event responsibility assignees in household context. Prefer ownerPersonId for one owner or responsiblePersonIds for shared responsibility. It assigns responsibility; it does not record attendance.","type":"string"},"calendarKey":{"description":"Which calendar to add the event to, when the family keeps more than one. Defaults to the main family calendar.","type":"string"},"attendance":{"description":"Attendance responses to merge into the saved map, keyed by exact household person id. Unspecified people keep their current response. Use clearAttendance to clear every response, or everyoneAttendance when the family says everyone. Changing who is going never changes who is responsible.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","enum":["going","maybe","out"]}},"data":{"description":"Custom calendar metadata to merge. Schedule, recurrence, attendance, responsibility, reminders, travel, and other named fields must use their dedicated inputs and are rejected here.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","description":"Required event date in YYYY-MM-DD format. For a birthday with no stated year, use its next occurrence relative to the current household date, not one blanket year for every birthday in a batch."},"durationMinutes":{"description":"Event length in minutes when an end time is not supplied.","type":"integer","minimum":15,"maximum":1440},"endDate":{"type":"string","description":"Inclusive ISO end date for events that span multiple days, like a camp or trip."},"endTime":{"type":"string","description":"Local event end time when known, in 12-hour format with AM or PM, for example \"4:30 PM\"."},"everyoneAttendance":{"description":"Set every active household person to this attendance status. Mavo resolves current person ids server-side. Do not send attendance too. Attendance does not assign responsibility, even when everyone is going.","type":"string","enum":["going","maybe","out"]},"note":{"description":"Useful event details, instructions, or source context that belong with the saved event.","type":"string"},"ownerPersonId":{"description":"Adult person id on point for this event, usually a parent: the one making sure it happens, whether or not they have joined Mavo. Owning an event never means attending it; going is recorded separately in attendance. An owner makes the event Covered. Use only an id from the eligible event responsibility assignees in household context.","type":"string"},"responsibilityRequired":{"description":"Set false only when the family explicitly says this event needs no responsible person. False means the family intentionally chose No one needed, so the event is settled without an owner; false also clears any assignment. True with nobody assigned means Needs Attention. Omit it when responsibility is merely undecided; assigning anyone makes it true.","type":"boolean"},"responsiblePersonIds":{"description":"Adult person ids currently responsible for this event: the people handling it, not an attendee list. Any adult in the household qualifies, including one who has not joined Mavo yet: who really does the thing is worth recording either way. Anyone responsible makes the event Covered; none while responsibility is required means Needs Attention. Send [] to leave it unassigned.","type":"array","items":{"type":"string","minLength":1}},"reminders":{"description":"Event reminders. Send [] to clear.","type":"array","items":{"type":"object","properties":{"audience":{"default":"household","description":"Who should receive the reminder: the whole household, responsible people, people marked going, or the explicit people list.","type":"string","enum":["household","responsible","going","people"]},"channels":{"default":["in_app"],"description":"Delivery channels for this reminder.","type":"array","items":{"type":"string","enum":["in_app","email","push","sms"]}},"mode":{"default":"plain","description":"plain sends the saved reminder; mavo allows a contextual reminder generated at send time.","type":"string","enum":["plain","mavo"]},"offsetMinutes":{"type":"integer","minimum":0,"maximum":20160,"description":"How many minutes before the event start to send the reminder; 0 means at the start."},"recipientPersonIds":{"default":[],"description":"Household person ids to notify when audience is people; otherwise leave empty.","type":"array","items":{"type":"string","minLength":1}}},"required":["offsetMinutes"]}},"repeatDays":{"description":"Weekdays for custom repeats, 0=Sunday through 6=Saturday.","type":"array","items":{"type":"integer","minimum":0,"maximum":6}},"repeatFrequency":{"description":"How the event repeats. Use none to clear the repeat.","type":"string","enum":["none","daily","weekdays","weekends","weekly","monthly","yearly","custom"]},"repeatInterval":{"description":"Repeat interval in weeks for weekly/custom repeats, months for monthly repeats, or years for yearly repeats.","type":"integer","minimum":1,"maximum":52},"time":{"description":"Local event start time when known, in 12-hour format with AM or PM, for example \"3:30 PM\".","type":"string"},"title":{"type":"string","minLength":1,"description":"Name the specific event, e.g. \"Soccer practice\" — never a generic label like \"Family event\"."},"travelPlan":{"description":"Optional event-specific leave-by plan. Set origin and fixed base travel minutes; use null to remove it.","anyOf":[{"type":"object","properties":{"arriveEarlyMinutes":{"default":0,"description":"Extra minutes to arrive before the event starts.","type":"integer","minimum":0,"maximum":720},"baseTravelMinutes":{"type":"integer","minimum":1,"maximum":1440,"description":"Expected travel time in minutes before any live traffic adjustment."},"origin":{"type":"string","minLength":1,"maxLength":240,"description":"Specific starting place for the trip, such as Home or a street address."}},"required":["baseTravelMinutes","origin"]},{"type":"null"}]},"where":{"description":"Event place or address when known.","type":"string"},"clearAttendance":{"description":"Set true only when the family explicitly asks to clear every saved attendance response. Do not send attendance or everyoneAttendance too. Clearing attendance leaves responsibility and coverage untouched.","type":"boolean"},"clearTravelPlan":{"description":"Set true to remove the event's Getting there plan.","type":"boolean"},"editScope":{"description":"Required for a repeating event: occurrence changes one original date and requires occurrenceDate; series changes every occurrence. Omit only for a non-repeating event.","type":"string","enum":["occurrence","series"]},"eventId":{"type":"string","minLength":1,"description":"The exact event id from queryCalendarEvents or addCalendarEvent."},"occurrenceDate":{"description":"The original YYYY-MM-DD date in the repeat pattern. Required when editScope is occurrence.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"status":{"description":"New saved status for the existing event.","type":"string","enum":["active","done","archived"]}},"required":["eventId"]},"description":"Two to fifty distinct existing events to update together. Include each exact event id and every requested change for that event."}},"required":["events"]},"name":"updateCalendarEvents","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delete Calendar Event"},"description":"Remove an existing family calendar event. For a repeating event, use editScope occurrence plus occurrenceDate to remove just that date; editScope series removes every date.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"editScope":{"description":"Use occurrence for one date in a repeating series, or series for every event.","type":"string","enum":["occurrence","series"]},"eventId":{"type":"string","minLength":1,"description":"The exact event id from queryCalendarEvents."},"occurrenceDate":{"description":"Original YYYY-MM-DD occurrence date. Required with editScope occurrence.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["eventId"]},"name":"deleteCalendarEvent","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Query Collection Items"},"description":"Read items from one configured household collection by collection key, such as groceries, movies, books, recipes, meals, routines, or a custom collection. Use this instead of broad family search when the user names a collection. The optional query is one punctuation-tolerant phrase, not a tokenized or fuzzy search; use one item title at a time. Each result includes a ready-to-use href for the saved item. Collections are parts of the shared household plan, not generic database tables. See mavo://guide/shared-plan.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"limit":{"default":20,"description":"Maximum matching collection items to return, from 1 to 50.","type":"integer","minimum":1,"maximum":50},"query":{"description":"One case-insensitive phrase matched against each item title, saved data, or status. Punctuation and possessive apostrophes are ignored. Omit it to read the collection broadly.","type":"string"},"status":{"description":"Only return collection items with this saved status. Omit to include every status.","type":"string","enum":["active","done","archived"]},"trackerKey":{"type":"string","minLength":1,"description":"The collection key from the configured household collections list, for example \"movies\" or \"groceries\"."}},"required":["trackerKey"]},"name":"queryCollectionItems","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Search Family Context"},"description":"Search broad household context, members, and upcoming calendar items. The householdPlan section groups upcoming loose ends, events covered by each person, and assignments awaiting acceptance: people asked to take an event on who have not answered yet, which is about handling it, not an RSVP. In event results, responsibilityResponses (pending, accepted, or passed) tracks who agreed to handle the event, while attendanceResponses (going, maybe, or out) records who is going; being responsible does not mean attending. Prefer queryCollectionItems when the user names a specific collection.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"query":{"description":"Optional household topic or phrase to focus the broad context search. Omit for a general context read.","type":"string"}}},"name":"searchFamilyContext","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Create Collection Items"},"description":"Add one or more items to a configured non-calendar household collection by collection key. Use this for ordinary collection rows such as movies, groceries, books, recipes, meals, or routines. Calendar events must use addCalendarEvent. Batch related items in one call so related additions save together. Collections are parts of the shared household plan, not generic database tables. See mavo://guide/shared-plan.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"items":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"data":{"default":{},"description":"Field values for this row, keyed by the configured collection field keys.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"title":{"type":"string","minLength":1,"description":"Specific display title for this collection row."}},"required":["title"]},"description":"One to fifty related rows to create together."},"trackerKey":{"type":"string","minLength":1,"description":"The target collection key, for example \"movies\" or \"groceries\"."}},"required":["items","trackerKey"]},"name":"createCollectionItems","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Update Collection Items"},"description":"Update one or more existing items in a configured non-calendar household collection. Use this to clean up titles, data, or statuses. Do not use createCollectionItems to deduplicate existing items. Collections are parts of the shared household plan, not generic database tables. See mavo://guide/shared-plan.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"items":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"data":{"description":"Replacement field values for this row. Omit to leave its data unchanged.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"entryId":{"type":"string","minLength":1,"description":"Exact row id returned by queryCollectionItems."},"status":{"description":"New saved status for this row.","type":"string","enum":["active","done","archived"]},"title":{"description":"New display title for this row.","type":"string","minLength":1}},"required":["entryId"]},"description":"One to fifty existing rows to update together."},"trackerKey":{"type":"string","minLength":1,"description":"Collection key that owns every row being updated."}},"required":["items","trackerKey"]},"name":"updateCollectionItems","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delete Collection Items"},"description":"Delete one or more existing items from a configured non-calendar household collection. Use this for deduplication after queryCollectionItems returns the duplicate entry ids to remove.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"items":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"entryId":{"type":"string","minLength":1,"description":"Exact row id returned by queryCollectionItems."},"title":{"description":"Optional title copied from the query result for a clearer approval preview.","type":"string","minLength":1}},"required":["entryId"]},"description":"Rows to delete, with optional titles copied from queryCollectionItems for family-visible approval copy."},"trackerKey":{"type":"string","minLength":1,"description":"Collection key that owns every row being deleted."}},"required":["items","trackerKey"]},"name":"deleteCollectionItems","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Create Collection Item"},"description":"Legacy single-row collection create tool. Prefer createCollectionItems, even for one item, so related additions stay grouped together. Collections are parts of the shared household plan, not generic database tables. See mavo://guide/shared-plan.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"data":{"default":{},"description":"Field values for the row, keyed by configured collection field keys.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"title":{"type":"string","minLength":1,"description":"Specific display title for the collection row."},"trackerKey":{"type":"string","minLength":1,"description":"Target collection key. Prefer createCollectionItems for current agent writes."}},"required":["title","trackerKey"]},"name":"createCollectionItem","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Get Recent Notifications"},"description":"List notifications recently sent to this household so you do not repeat or over-notify. Call this BEFORE deciding whether to send a notification.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"sinceMinutes":{"description":"Only include notifications newer than this many minutes.","type":"integer","minimum":1,"maximum":43200}}},"name":"getRecentNotifications","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Send Notification"},"description":"Send a notification to the household. Who receives it and how it is presented come from what set this run in motion, not from this call: a person-scoped reminder reaches that member only, while anything else reaches the whole family. Keep the title and body short and specific. Notifications support the shared plan and its coverage decisions. See mavo://guide/notifications.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"body":{"default":"","description":"Short notification message with the useful detail or action.","type":"string"},"channels":{"description":"Defaults to in-app only. sms sends a text, but only to household members who turned texting on.","type":"array","items":{"type":"string","enum":["in_app","email","push","sms"]}},"title":{"type":"string","minLength":1,"description":"Short notification title."}},"required":["title"]},"name":"sendNotification","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Ask Household"},"description":"Ask the household a short question and offer the answers as one-tap choices. Use this when something you are about to rely on might have changed, or when a small decision is theirs to make. Only ask what the household's own records cannot answer. Read the calendar, people, and lists first: when an upcoming birthday, an assigned owner, or an existing plan already pins the answer down, use it instead of asking. A birthday errand, for example, almost always belongs to the next family birthday on the calendar. It does not wait: finish what you were doing as if the question is going out alongside it, never \"let me know\" or \"reply to confirm\". The question renders as its own card wherever the family looks. Never write the question, its choices, or the fact that you asked into your own message: that shows up as a duplicate right next to the card. If asking is the only thing left to do, write no message text at all. When the question is about a dated moment, set relevantUntil to the last date an answer would still matter, so it retires itself instead of outliving the moment. If someone answers a standing question in words instead of tapping, act on their answer and call withdrawQuestions for it. Ask only when the answer changes something. One question per run at most.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"options":{"minItems":2,"maxItems":4,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":60,"description":"What the button says. Short and concrete: \"Still indoors\", \"Moved outdoors\"."},"reply":{"description":"The message sent to you when this is tapped. Defaults to the label. Write it as the family would say it.","type":"string","maxLength":280}},"required":["label"]},"description":"Two to four answers. Cover the likely cases, including the one where nothing changed."},"question":{"type":"string","minLength":1,"maxLength":200,"description":"One short question in plain language, with enough context to answer it without opening anything."},"relevantUntil":{"description":"Last local date (YYYY-MM-DD) an answer would still change anything, e.g. the event date. After this the question quietly retires. Set it whenever the question is about a dated moment.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},"required":["options","question"]},"name":"askHousehold","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Withdraw Questions"},"description":"Take back standing questions that no longer need an answer: the moment they were about has passed, the plan changed, or someone already answered in their own words. A withdrawn question quietly disappears everywhere it was showing. Never withdraw a question that is still worth answering just because it has been waiting a while.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"questionIds":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exact standing question ids to withdraw, from this run's context or an earlier askHousehold result."},"reason":{"type":"string","minLength":1,"maxLength":200,"description":"Why these no longer need an answer, e.g. \"answered in chat\" or \"the event has passed\". For the record, not shown to the family."}},"required":["questionIds","reason"]},"name":"withdrawQuestions","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Update Working Memory"},"description":"Replace the durable household working memory with a concise, current summary of stable household context, preferences, responsibilities, open loops, and standing reminders. Use this only when the current run reveals durable context that future Mavo runs should remember.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"memory":{"type":"string","minLength":1,"maxLength":12000,"description":"The complete updated working memory. Include only durable household context, not a transcript."},"reason":{"description":"Optional short explanation of what durable context changed and why it should be remembered.","type":"string","minLength":1,"maxLength":240}},"required":["memory"]},"name":"updateWorkingMemory","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Create Household Collection"},"description":"Create a new custom household collection with a name, optional description, and custom fields. Use this when the user explicitly asks to make, create, or design a collection or tracker, not for ordinary record entry. Include initialEntry only when the user asks for a demo/example item or clearly wants the first row created too. The family is asked to approve before it is saved. Collections are parts of the shared household plan, not generic database tables. See mavo://guide/shared-plan.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"category":{"description":"Set to calendar only when creating another household calendar; omit for ordinary collections.","type":"string","const":"calendar"},"color":{"description":"Optional display color for a calendar collection.","type":"string","enum":["sage","blue","clay","plum","gold"]},"description":{"description":"Optional short explanation of what the collection tracks.","type":"string"},"fields":{"default":[],"description":"Structured fields shared by items in this collection.","type":"array","items":{"type":"object","properties":{"key":{"type":"string","minLength":1,"description":"Stable camelCase or snake_case field key used in collection item data."},"label":{"type":"string","minLength":1,"description":"Short family-facing label shown for this field."},"options":{"description":"Allowed values when type is select; omit for other field types.","type":"array","items":{"type":"string"}},"type":{"default":"text","description":"How values in this field should be entered and displayed.","type":"string","enum":["date","number","person","select","text","textarea"]}},"required":["key","label"]}},"name":{"type":"string","minLength":1,"description":"Family-facing collection or calendar name."},"initialEntry":{"description":"Optional first item to create with the collection.","type":"object","properties":{"data":{"default":{},"description":"Values for the initial item, keyed by the collection field keys.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"title":{"type":"string","minLength":1,"description":"Title for the initial item."}},"required":["title"]}},"required":["name"]},"name":"createHouseholdCollection","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Update Household Collection"},"description":"Modify an existing household collection name, description, or fields. The main calendar cannot be modified. Use only when the user explicitly asks to change collection structure.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"New collection description. Use null to remove the current description."},"fields":{"description":"Complete replacement field definition for the custom collection.","default":[],"type":"array","items":{"type":"object","properties":{"key":{"type":"string","minLength":1,"description":"Stable camelCase or snake_case field key used in collection item data."},"label":{"type":"string","minLength":1,"description":"Short family-facing label shown for this field."},"options":{"description":"Allowed values when type is select; omit for other field types.","type":"array","items":{"type":"string"}},"type":{"default":"text","description":"How values in this field should be entered and displayed.","type":"string","enum":["date","number","person","select","text","textarea"]}},"required":["key","label"]}},"name":{"description":"New family-visible collection name.","type":"string","minLength":1},"trackerKey":{"type":"string","minLength":1,"description":"Exact custom collection key returned by the collection registry."}},"required":["trackerKey"]},"name":"updateHouseholdCollection","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delete Household Collection"},"description":"Delete an existing custom household collection and its entries. The main calendar and default collections cannot be deleted. Use only when the user explicitly asks to delete a collection.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"trackerKey":{"type":"string","minLength":1,"description":"Exact custom collection key to delete. Default/system collections cannot be deleted."}},"required":["trackerKey"]},"name":"deleteHouseholdCollection","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true,"title":"Check Weather"},"description":"Look up the weather forecast for a place and date. Use this to verify conditions for outdoor or weather-sensitive plans before they happen.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"date":{"description":"ISO date (YYYY-MM-DD) to focus on. Defaults to the soonest day available.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"location":{"type":"string","minLength":1,"description":"Place to look up, for example \"Zilker Park, Austin TX\" or a city name."},"time":{"description":"Local time of interest (HH:mm), to also report the closest hourly forecast.","type":"string"}},"required":["location"]},"name":"checkWeather","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true,"title":"Check Route Traffic"},"description":"Check current driving time and distance between two places using traffic-aware routing. Use this for leave-time decisions before events when both origin and destination are known.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"destination":{"type":"string","minLength":1,"description":"Where the family is going, such as a field, school, venue, or full address."},"origin":{"type":"string","minLength":1,"description":"Where the trip starts, such as home, school, work, or a full address."}},"required":["destination","origin"]},"name":"checkRouteTraffic","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true,"title":"Search Web"},"description":"Discover relevant pages on the web. Returns titles, URLs, and indexed snippets that may be cached. Do not use a search snippet as proof of a page's current contents: when the user supplies a URL or timely information depends on a specific page, call readWebPage on that URL before answering.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"numResults":{"default":5,"description":"How many results to return.","type":"integer","minimum":1,"maximum":10},"query":{"type":"string","minLength":1,"description":"What to search the web for."}},"required":["query"]},"name":"searchWeb","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true,"title":"Read Web Page"},"description":"Fetch and read the current main text of a specific web page. Call this directly when the user supplies a URL, or after searchWeb when timely information such as cancellations, closures, schedules, or conditions depends on a specific page. Only claim you read or checked a page after this tool succeeds.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"url":{"type":"string","format":"uri","description":"The page URL to read."}},"required":["url"]},"name":"readWebPage","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Schedule Check"},"description":"Schedule a background check ahead of a calendar event. Before the event, Mavo wakes up, runs the task (for example, verify the weather with checkWeather or discover a cancellation page with searchWeb and verify it with readWebPage), and notifies the family only if there is something to act on. Use this for weather-sensitive or cancellable plans after adding the event.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"channels":{"description":"How to notify the family if the check finds something. Defaults to in-app.","type":"array","items":{"type":"string","enum":["in_app","email","push","sms"]}},"eventId":{"type":"string","minLength":1,"description":"The calendar event id returned by addCalendarEvent."},"leadHours":{"type":"number","minimum":0.5,"maximum":336,"description":"Hours before the event start to run the check (e.g. 14 to look the evening before a morning event)."},"task":{"type":"string","minLength":1,"description":"What to verify when this runs, e.g. \"Check the forecast and whether the game is cancelled; alert us if rain or a cancellation looks likely.\""}},"required":["eventId","leadHours","task"]},"name":"scheduleCheck","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"List Plans"},"description":"List the household's plans: the named things the family is planning (a trip, a birthday, a season), each pointing at calendar events. Returns each plan's id, derived date range, phase (shaping, upcoming, happening, past), event count, and whether its public share link is on. Use getPlan for one plan's full contents.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"}}},"name":"listPlans","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Get Plan"},"description":"Read one plan in full: its description, the calendar events it points at, notes, and polls with current vote counts. Use the returned event, poll, and option ids with the other plan tools.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"planId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact plan id from listPlans."}},"required":["planId"]},"name":"getPlan","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Create Plan"},"description":"Start a new plan for something the family is working toward: a trip, a party, a tournament weekend. A plan gathers calendar events, notes, and date polls in one place. Create it, then link events with linkPlanEvent or open a date poll with createPlanPoll.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"prose":{"description":"A few plain sentences about what the plan covers. Optional; skip filler.","type":"string","maxLength":20000},"title":{"type":"string","minLength":1,"maxLength":200,"description":"Name the specific thing being planned, e.g. \"Spring break in Tahoe\", never a generic label like \"Family plan\"."}},"required":["title"]},"name":"createPlan","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Update Plan"},"description":"Rename a plan, rewrite its description, or archive it once it has run its course. Events, notes, and polls are managed with their own tools.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"archived":{"description":"True moves the plan out of the active list once it has run its course; false brings it back. Calendar events stay either way.","type":"boolean"},"planId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact plan id from listPlans."},"prose":{"description":"Replacement description. Null clears it. Omit to leave unchanged.","anyOf":[{"type":"string","maxLength":20000},{"type":"null"}]},"title":{"description":"Replacement name. Omit to leave unchanged.","type":"string","minLength":1,"maxLength":200}},"required":["planId"]},"name":"updatePlan","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Link Plan Event"},"description":"Point a plan at an existing calendar event. The event stays exactly where it is on the calendar; the plan derives its dates from the events it points at. To put something new on the calendar first, use addCalendarEvent, then link it.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"eventId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact calendar event id from queryCalendarEvents or addCalendarEvent. Linking points the plan at the event; nothing is copied."},"planId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact plan id from listPlans."}},"required":["eventId","planId"]},"name":"linkPlanEvent","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Add Plan Note"},"description":"Add a note to a plan: context that is not an event, like a gate code, a pack list, or who is bringing what. Notes stay family-only unless the family explicitly wants one on the plan's public share page.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"body":{"type":"string","minLength":1,"maxLength":4000,"description":"The note itself: context that is not an event, like a gate code or pack list."},"planId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact plan id from listPlans."},"showOnSharedPage":{"description":"Set true only when the family explicitly wants this note visible to people opening the plan's share link. Notes stay family-only by default.","type":"boolean"}},"required":["body","planId"]},"name":"addPlanNote","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Update Plan Note"},"description":"Rewrite a note on a plan, or change whether it shows on the plan's share link. The note keeps its author and its place in the plan. Use this rather than deleting and re-adding, which loses both.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"body":{"description":"Replacement text for the note. Omit to leave the wording alone.","type":"string","minLength":1,"maxLength":4000},"noteId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact note id from getPlan."},"showOnSharedPage":{"description":"True puts this note on the plan's share link, false keeps it family-only. Omit to leave it as it is.","type":"boolean"}},"required":["noteId"]},"name":"updatePlanNote","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Create Plan Poll"},"description":"Open a poll on a plan so the family (and anyone with the plan's share link) can vote, usually to pick dates before anything is booked. Options with dates matter: when the family settles on a dated option with settlePlanPoll, it becomes a real calendar event.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"options":{"minItems":2,"maxItems":12,"type":"array","items":{"type":"object","properties":{"date":{"description":"Proposed date in YYYY-MM-DD when this option is a date choice. The winning dated option can land on the calendar at settle time.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"endDate":{"description":"Inclusive proposed end date for multi-day options.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"endTime":{"description":"Proposed local end time in 12-hour format, like \"4:30 PM\".","type":"string","maxLength":20},"label":{"description":"What the option says. Optional when a date is given; a readable date label is generated.","type":"string","minLength":1,"maxLength":120},"time":{"description":"Proposed local start time in 12-hour format, like \"3:30 PM\".","type":"string","maxLength":20}}},"description":"Two to twelve genuinely distinct choices."},"planId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact plan id from listPlans."},"question":{"type":"string","minLength":1,"maxLength":300,"description":"The question being decided, e.g. \"Which weekend works for the trip?\"."}},"required":["options","planId","question"]},"name":"createPlanPoll","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Update Plan Poll"},"description":"Reword the question a plan poll is asking. The options and every vote already cast stay exactly as they are. Only works while the poll is open.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"pollId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact poll id from getPlan."},"question":{"type":"string","minLength":1,"maxLength":300,"description":"Replacement wording for the question."}},"required":["pollId","question"]},"name":"updatePlanPoll","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Add Plan Poll Option"},"description":"Add one more choice to an open plan poll, for when a possibility turns up after the question went out. Votes already cast are untouched. Twelve options is the ceiling.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"pollId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact poll id from getPlan."},"date":{"description":"Proposed date in YYYY-MM-DD when this option is a date choice. The winning dated option can land on the calendar at settle time.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"endDate":{"description":"Inclusive proposed end date for multi-day options.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"endTime":{"description":"Proposed local end time in 12-hour format, like \"4:30 PM\".","type":"string","maxLength":20},"label":{"description":"What the option says. Optional when a date is given; a readable date label is generated.","type":"string","minLength":1,"maxLength":120},"time":{"description":"Proposed local start time in 12-hour format, like \"3:30 PM\".","type":"string","maxLength":20}},"required":["pollId"]},"name":"addPlanPollOption","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Update Plan Poll Option"},"description":"Rewrite an option on an open plan poll: fix its wording, move its day, set or change its time. The option keeps its identity, so every vote cast for it stays attached. Prefer this over removing and re-adding, which throws those votes away. Fields not sent are cleared, so send the option as it should end up.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"optionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact option id from getPlan."},"date":{"description":"Proposed date in YYYY-MM-DD when this option is a date choice. The winning dated option can land on the calendar at settle time.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"endDate":{"description":"Inclusive proposed end date for multi-day options.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"endTime":{"description":"Proposed local end time in 12-hour format, like \"4:30 PM\".","type":"string","maxLength":20},"label":{"description":"What the option says. Optional when a date is given; a readable date label is generated.","type":"string","minLength":1,"maxLength":120},"time":{"description":"Proposed local start time in 12-hour format, like \"3:30 PM\".","type":"string","maxLength":20}},"required":["optionId"]},"name":"updatePlanPollOption","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delete Plan Poll Option"},"description":"Remove one choice from an open plan poll. Any votes cast for that option go with it, so reword it with updatePlanPollOption instead when the choice is still on the table in some form.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"optionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact option id from getPlan. Its votes go with it."}},"required":["optionId"]},"name":"deletePlanPollOption","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Vote Plan Poll"},"description":"Cast the calling person's vote on an open plan poll. One vote per person: voting again moves it to the new option. Only ever vote when the person has actually said which they want; a poll is for collecting answers, not guessing them.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"optionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact option id from getPlan to vote for."},"pollId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact poll id from getPlan."}},"required":["optionId","pollId"]},"name":"votePlanPoll","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Clear Plan Poll Vote"},"description":"Take the calling person's own vote back off an open plan poll, leaving them with no answer. Other people's votes are untouched.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"pollId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact poll id from getPlan."}},"required":["pollId"]},"name":"clearPlanPollVote","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Settle Plan Poll"},"description":"Close a plan poll on the option the family is going with. A dated option is written to the family calendar as a real event and linked onto the plan; a label-only option just closes the question. Confirm the family actually decided before settling; votes alone are input, not the decision.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"optionId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact option id from getPlan for the choice the family is going with."},"pollId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact poll id from getPlan."}},"required":["optionId","pollId"]},"name":"settlePlanPoll","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Reopen Plan Poll"},"description":"Put a settled plan poll back to open when the decision comes undone. Anything settling created goes with it: a winning dated option that became a calendar event has that event removed and unlinked from the plan. Votes already cast stay. Use this rather than deleting and rebuilding a poll the family has already voted on.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"pollId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact poll id from getPlan."}},"required":["pollId"]},"name":"reopenPlanPoll","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Set Plan Sharing"},"description":"Turn a plan's public share link on or off. The link shows the live plan (its events, link-visible notes, and polls anyone can vote on) to whoever has it, no account needed. Free families can have one plan shared at a time.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"enabled":{"type":"boolean","description":"True turns the public share link on; false turns it off. The same address comes back when re-enabled."},"planId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact plan id from listPlans."}},"required":["enabled","planId"]},"name":"setPlanSharing","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Unlink Plan Event"},"description":"Remove a calendar event from a plan. Only the pointer goes away; the event stays exactly where it is on the calendar. To cancel the event itself, use deleteCalendarEvent.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"eventId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact calendar event id from getPlan. Unlinking removes the pointer; the event stays on the calendar."},"planId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact plan id from listPlans."}},"required":["eventId","planId"]},"name":"unlinkPlanEvent","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delete Plan Note"},"description":"Delete a note from a plan.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"noteId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact note id from getPlan."}},"required":["noteId"]},"name":"deletePlanNote","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delete Plan Poll"},"description":"Delete a plan poll and its votes when the question no longer matters. To pick a winner and close the question instead, use settlePlanPoll.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"pollId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact poll id from getPlan."}},"required":["pollId"]},"name":"deletePlanPoll","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delete Plan"},"description":"Delete a plan entirely: the plan, its notes, polls, and share link go away, while the calendar events it pointed at stay on the calendar. For a finished plan worth keeping, archive it with updatePlan instead.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"approvalReason":{"description":"Short plain-language sentence shown before asking the family to approve this tool. Say exactly what will change, without ids. Example: \"Assign Dentist appointment today at 8:00 PM to Josh.\"","type":"string","minLength":1,"maxLength":180},"planId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Exact plan id from listPlans."}},"required":["planId"]},"name":"deletePlan","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Get Household Settings"},"description":"Read household-level settings, including home location and the household time zone used for relative dates, calendar defaults, weather, and Mavo's local sense of now.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"}}},"name":"getHouseholdSettings","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Update Household Settings"},"description":"Patch household-level settings. Send only the fields that should change. Use homeLocation to set the family home and derive its time zone, timeZone to override the household time zone, clearHomeLocation to remove the saved home, or askFirstForAiWrites to change whether Mavo asks before larger changes.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"askFirstForAiWrites":{"description":"Whether Mavo should ask before larger household-plan changes.","type":"boolean"},"clearHomeLocation":{"description":"Set true to remove the saved household home location.","type":"boolean"},"homeLocation":{"description":"Town, city, ZIP, or place to use as the household home.","type":"string","minLength":1,"maxLength":200},"timeZone":{"description":"IANA time zone such as America/Chicago.","type":"string","minLength":1}}},"name":"updateHouseholdSettings","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"List Household People"},"description":"List people in the household, including adults, children, helpers, caregivers, and invited/unlinked people.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"}}},"name":"listHouseholdPeople","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Create Household Person"},"description":"Add a person profile to the household with a display name and broad kind. This creates only a household profile, not an account or invitation, and it never accepts or changes an email address. If a person with this name already exists, the existing profile is returned instead of a duplicate; use a distinct name for a genuinely different person.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"familiarName":{"description":"What the family calls them out loud, like Dad or Mimi, when that differs from the name. Spoken and narrated surfaces prefer it.","type":"string"},"kind":{"default":"adult","description":"The person's household role. Defaults to adult only when the family does not say.","type":"string","enum":["adult","child","helper","caregiver","other"]},"name":{"type":"string","minLength":1,"description":"The person's display name. Name is the only required field."}},"required":["name"]},"name":"createHouseholdPerson","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Update Household Person"},"description":"Patch a household person display name, broad kind (adult, child, helper, caregiver, or other), or familiar name (the word the family says out loud, like Dad or Mimi; spoken surfaces prefer it over the display name). Relationship facts and birth years still belong in household memory, not the profile kind. Send only fields the family explicitly asked to change and omit current values. Changing a role means sending only personId and kind. This tool never changes any email.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"familiarName":{"description":"What the family calls them out loud, like Dad or Mimi. Empty or null clears it so the display name is spoken again.","anyOf":[{"type":"string"},{"type":"null"}]},"kind":{"description":"New household role for this existing person.","type":"string","enum":["adult","child","helper","caregiver","other"]},"name":{"description":"New display name for this existing person.","type":"string","minLength":1},"personId":{"type":"string","minLength":1,"description":"Exact person id returned by listHouseholdPeople or household context."}},"required":["personId"]},"name":"updateHouseholdPerson","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delete Household Person"},"description":"Remove a household person profile from active household views.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"personId":{"type":"string","minLength":1,"description":"Exact person id returned by listHouseholdPeople or household context."}},"required":["personId"]},"name":"deleteHouseholdPerson","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"List Webhook Destinations"},"description":"List outbound webhook destinations, available event types, recent delivery usage, and recent delivery attempts.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"}}},"name":"listWebhookDestinations","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Create Webhook Destination"},"description":"Create an outbound webhook destination for real-time household updates. The signing secret is returned once.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"enabled":{"description":"Whether deliveries to this destination are active. Defaults to enabled when created.","type":"boolean"},"eventTypes":{"minItems":1,"type":"array","items":{"type":"string","enum":["collection.created","collection.updated","collection.deleted","tracker.entry.created","tracker.entry.updated","tracker.entry.deleted","calendar.event.created","calendar.event.updated","calendar.event.deleted","calendar.check.created","external_calendar.created","external_calendar.updated","external_calendar.refresh_requested","external_calendar.deleted","calendar_share.created","calendar_share.deleted","plan.created","plan.updated","plan.deleted","plan.event.linked","plan.event.unlinked","plan.note.created","plan.note.updated","plan.note.deleted","plan.poll.created","plan.poll.deleted","plan.poll.settled","plan.poll.reopened","plan.poll.vote.cast","plan.share.enabled","plan.share.disabled","person.created","person.updated","person.deleted","notification.sent","notification_preference.updated","notification_routine.created","notification_routine.updated","notification_routine.deleted","webhook_destination.created","webhook_destination.updated","webhook_destination.deleted"]},"description":"Household event types to send to this destination."},"name":{"type":"string","minLength":1,"maxLength":80,"description":"Family-visible label for the destination."},"url":{"type":"string","format":"uri","description":"HTTPS endpoint that will receive signed webhook deliveries."}},"required":["eventTypes","name","url"]},"name":"createWebhookDestination","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Update Webhook Destination"},"description":"Update an outbound webhook destination or rotate its signing secret.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"enabled":{"description":"Whether deliveries to this destination are active. Defaults to enabled when created.","type":"boolean"},"eventTypes":{"minItems":1,"type":"array","items":{"type":"string","enum":["collection.created","collection.updated","collection.deleted","tracker.entry.created","tracker.entry.updated","tracker.entry.deleted","calendar.event.created","calendar.event.updated","calendar.event.deleted","calendar.check.created","external_calendar.created","external_calendar.updated","external_calendar.refresh_requested","external_calendar.deleted","calendar_share.created","calendar_share.deleted","plan.created","plan.updated","plan.deleted","plan.event.linked","plan.event.unlinked","plan.note.created","plan.note.updated","plan.note.deleted","plan.poll.created","plan.poll.deleted","plan.poll.settled","plan.poll.reopened","plan.poll.vote.cast","plan.share.enabled","plan.share.disabled","person.created","person.updated","person.deleted","notification.sent","notification_preference.updated","notification_routine.created","notification_routine.updated","notification_routine.deleted","webhook_destination.created","webhook_destination.updated","webhook_destination.deleted"]},"description":"Household event types to send to this destination."},"name":{"type":"string","minLength":1,"maxLength":80,"description":"Family-visible label for the destination."},"url":{"type":"string","format":"uri","description":"HTTPS endpoint that will receive signed webhook deliveries."},"destinationId":{"type":"string","minLength":1,"description":"Exact destination id returned by listWebhookDestinations."},"rotateSecret":{"description":"Set true to replace the signing secret. The new secret is returned once.","type":"boolean"}},"required":["destinationId"]},"name":"updateWebhookDestination","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delete Webhook Destination"},"description":"Delete an outbound webhook destination.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"destinationId":{"type":"string","minLength":1,"description":"Exact destination id returned by listWebhookDestinations."}},"required":["destinationId"]},"name":"deleteWebhookDestination","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Test Webhook Destination"},"description":"Send a test delivery to an outbound webhook destination.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"destinationId":{"type":"string","minLength":1,"description":"Exact destination id returned by listWebhookDestinations."}},"required":["destinationId"]},"name":"testWebhookDestination","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Get Notification Preferences"},"description":"Read the current member's notification preferences for this household.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"}}},"name":"getNotificationPreferences","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Set Notification Preference"},"description":"Enable or disable one notification channel for the current member.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"channel":{"type":"string","enum":["email","push"],"description":"Personal delivery channel to enable or disable."},"eventKind":{"type":"string","enum":["reminder","coverage_alert","follow_up_nudge","digest","intake_update"],"description":"Notification category whose delivery preference is changing."},"isEnabled":{"type":"boolean","description":"True to enable this channel for the current member, false to disable it."}},"required":["channel","eventKind","isEnabled"]},"name":"setNotificationPreference","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"List Notification Routines"},"description":"List your own notification routines, such as your Family Game Plan.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"}}},"name":"listNotificationRoutines","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Upsert Notification Routine"},"description":"Create or update one of your own notification routines. Notifications support the shared plan and its coverage decisions. See mavo://guide/notifications.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"channels":{"description":"Delivery channels for the routine. Use sms only when texting is already available.","type":"array","items":{"type":"string","enum":["in_app","email","push","sms"]}},"cron":{"description":"Cron schedule for when the routine runs.","type":"string","minLength":1},"intent":{"description":"Kind of recurring notification this routine produces.","type":"string","enum":["briefing","reminder","digest"]},"isEnabled":{"description":"Whether the routine should continue running.","type":"boolean"},"mode":{"description":"plain sends fixed copy; mavo wakes the agent to prepare the content.","type":"string","enum":["plain","mavo"]},"timezone":{"description":"IANA time zone used to interpret the cron schedule.","type":"string"},"triggerId":{"description":"Exact routine id to update. Omit when creating a new routine.","type":"string"}}},"name":"upsertNotificationRoutine","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delete Notification Routine"},"description":"Delete one of your own notification routines.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"triggerId":{"type":"string","minLength":1,"description":"Exact routine id returned by listNotificationRoutines."}},"required":["triggerId"]},"name":"deleteNotificationRoutine","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"List External Calendars"},"description":"List external calendar feeds linked to the household.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"}}},"name":"listExternalCalendars","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true,"title":"Probe External Calendar"},"description":"Check whether an external calendar URL can be read before linking it.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"url":{"type":"string","minLength":1,"maxLength":2048,"description":"ICS or webcal subscription URL to inspect before connecting."}},"required":["url"]},"name":"probeExternalCalendar","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Create External Calendar"},"description":"Link an external ICS calendar feed to the household and sync its events. This operates on Mavo's shared household plan. See mavo://guide/shared-plan.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"color":{"description":"Optional display color for the connected calendar.","type":"string"},"hint":{"description":"Optional short note about how the family uses this calendar.","type":"string","maxLength":280},"name":{"type":"string","minLength":1,"maxLength":120,"description":"Family-visible name for the connected calendar."},"url":{"type":"string","minLength":1,"maxLength":2048,"description":"ICS or webcal subscription URL."}},"required":["name","url"]},"name":"createExternalCalendar","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Refresh External Calendar"},"description":"Request a refresh for a linked external calendar feed.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"sourceId":{"type":"string","minLength":1,"description":"Exact connected-calendar source id returned by listExternalCalendars."}},"required":["sourceId"]},"name":"refreshExternalCalendar","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Update External Calendar"},"description":"Update notes about a linked external calendar feed.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"hint":{"description":"New short note about how the family uses this connected calendar.","type":"string","maxLength":280},"sourceId":{"type":"string","minLength":1,"description":"Exact connected-calendar source id returned by listExternalCalendars."}},"required":["sourceId"]},"name":"updateExternalCalendar","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Delete External Calendar"},"description":"Remove a linked external calendar feed and its synced calendar.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"sourceId":{"type":"string","minLength":1,"description":"Exact connected-calendar source id returned by listExternalCalendars."}},"required":["sourceId"]},"name":"deleteExternalCalendar","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"List Calendar Shares"},"description":"List household calendar share links.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"}}},"name":"listCalendarShares","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Create Calendar Share"},"description":"Create a read-only calendar subscription/share link for another person or calendar app. Use only when the user explicitly asks to share, subscribe, export, or create a calendar link. Do not use for uploaded/shared screenshots, photos, files, or event flyers; use addCalendarEvent for those. This operates on Mavo's shared household plan. See mavo://guide/shared-plan.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"categories":{"default":[],"description":"Optional calendar categories to include in the read-only share.","type":"array","items":{"type":"string"}},"eventIds":{"default":[],"description":"Calendar event ids for sharing specific events, like one birthday party, instead of a whole calendar.","type":"array","items":{"type":"string"}},"name":{"type":"string","minLength":1,"maxLength":120,"description":"Family-visible name for the read-only calendar share."},"personIds":{"default":[],"description":"Household person ids whose events should be included: events they own, are responsible for, or are listed on. Being marked going alone does not pull an event into the share.","type":"array","items":{"type":"string"}},"sourceIds":{"default":[],"description":"Calendar source ids whose events should be included.","type":"array","items":{"type":"string"}}},"required":["name"]},"name":"createCalendarShare","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}},{"annotations":{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Revoke Calendar Share"},"description":"Revoke a household calendar share link.","inputSchema":{"type":"object","properties":{"familySlug":{"description":"Family slug to use for this tool call. Optional when the signed-in Mavo member belongs to one family; required to choose between multiple families.","type":"string"},"shareId":{"type":"string","minLength":1,"description":"Exact share id returned by listCalendarShares."}},"required":["shareId"]},"name":"revokeCalendarShare","outputSchema":{"type":"object","properties":{},"additionalProperties":{},"description":"Structured JSON object returned by the tool."}}]}