# Daily > A personal schedule and life planner built to be run by AI agents: routines and events with places and travel, workouts, meals and nutrition targets, to-dos, reading/podcast/movie lists, people and shared calendars, groceries and a budget. ## Docs - Full guide and tool reference (Markdown): https://carpeday.app/about.md (also https://carpeday.app/llms-full.txt; for people: https://carpeday.app/about) ## Connect - MCP (Streamable HTTP): https://carpeday.app/api/mcp. OAuth 2.1 with discovery (https://carpeday.app/.well-known/oauth-protected-resource) and dynamic client registration; the person signs in with a passkey and approves. - Or an API key (Settings → Access) as `Authorization: Bearer dly_…`, for MCP or the HTTP API: POST https://carpeday.app/api/v1/ with a JSON body (read-only tools also take GET). OpenAPI: https://carpeday.app/api/v1/openapi.json ## How to work with it 1. Call get_started first: it says what's set up and what's missing. 2. Read with get_agenda (a week at a time) and list_tasks. 3. Build or reorganize with apply_plan: many operations, all or nothing; use dryRun: true first and fix what check_schedule reports. 4. Times are local 'YYYY-MM-DDTHH:mm' in the schedule's timezone. Repeating events use recurrence {freq, byDay, interval, until}; one day of a series is 'eventId::YYYY-MM-DD'. 5. Explain changes in plain words; ask before deleting things the person made. ## Tools - get_started (schedule:read): START HERE. Who this schedule belongs to, what's already set up (calendars, places, people, routines, lists, to-dos, goals) and what's missing, plus how to build a schedule with these tools. Call it first in a new conversation. - apply_plan (schedule:write): Make many changes in one go, all or nothing: operations [{op: create_event, event} | {op: update_event, id, patch, scope?, date?} | {op: move_event, key, start, end?} | {op: delete_event, key, scope?} | {op: upsert_item, collection, item} | {op: remove_item, collection, id} | {op: add_task, title, due?, list?} | {op: complete_task, id} | {op: update_profile, patch} | {op: update_settings, patch}]. dryRun: true tries it without saving. Either way it returns what each operation made and check_schedule's findings for checkFrom..checkTo (default: the next two weeks). - check_schedule (schedule:read): Find problems between two dates (default: the next two weeks): overlapping events, not enough time to travel between places, events pointing at people/places/lists that don't exist, and days whose meals are far from the calorie target. - find_free_time (schedule:read): Open slots between two dates: gaps of at least minMinutes (default 30) between dayStart and dayEnd (default 08:00–21:00), optionally only on some weekdays (days: [MO, TU…]). Travel time to events counts as busy. - update_settings (schedule:write): Change settings: timezone (IANA, e.g. America/New_York), homeLocationId (a location id; travel is estimated from it), weekStartsOn (0 Sun – 6 Sat), dayStartHour / dayEndHour (the calendar's visible hours), defaultTravelMode (drive, transit, walk, bike, rideshare). - get_agenda (schedule:read): Concrete schedule between two dates (inclusive), with recurring events expanded, travel/leave-by times, who to call on commutes, workouts, meals and media. Each line has a `key` (eventId::date) used by move_event/log_occurrence/share. format=text (default, for reading) or json. - get_schedule (schedule:read): Raw schedule JSON (the source of truth). Optionally only some top-level sections, e.g. ['events','people']. - create_event (schedule:write): Create an event. Times are local 'YYYY-MM-DDTHH:mm'. Give `end` or `durationMin`. Optional: category (work|meeting|commute|workout|meal|date|movie|personal|errand|sleep|other), calendar (personal|work|relationship|…), locationId, travel {minutes, mode}, recurrence {freq: daily|weekly|monthly, interval, byDay:[MO..SU], until, count}, callListId, workout {kind, exercises:[{name, equipment, sets, reps, weight, unit}]}, meals [{slot, items:[{name, calories, protein, buy:[{grocery, qty}]}], source: home|out, servings, cost, for: personId when it's someone else's portion (shopping only, not your totals)}], media [{mediaId, note}], costs [{label, amount, kind: food|drinks|gas|rideshare|activity|gear|other, miles (gas only: priced with profile.car)}], notes. - update_event (schedule:write): Patch an event's fields. For a recurring event, scope='occurrence' + date changes just that day (stored as an override); default scope is the whole series. - move_event (schedule:write): Reschedule (like drag-and-drop) by occurrence key from get_agenda. scope 'occurrence' (default) moves one day; 'series' shifts every occurrence. - delete_event (schedule:write): Delete an event (scope 'series', default) or cancel one occurrence of a recurring event (scope 'occurrence' with a key). - log_occurrence (schedule:write): Log what actually happened for an occurrence: status (done|skipped), notes, people actually called, actual workout sets/weights, meals eaten, media consumed. Marking a queue-driven event (e.g. movie night) done ticks off its up-next item so the next occurrence moves on. - upsert_item (schedule:write): Create or update a library item. collection: locations {id,name,address,lat,lng} | people {id,name,phone,email} | callLists {id,name,people:[personId],perSession} | media {id,kind: audiobook|podcast|youtube|playlist|music|movie|series,title,creator,url,progress,done} | queues {id,name,mode: each (one item per session, e.g. movies) | untilDone (stay on the current item until marked done, e.g. books) | rotate (cycle, e.g. podcasts),items:[mediaId]} (set an event's queueId to play from it) | workoutTemplates {id,name,kind,exercises} | calendars {key,name,color} | subscriptions {id,name,url (secret ICS URL),calendar} | groceries {id,name,section,unit,pack:{size,label,price},pricePerUnit,staple} | seasons {id,name,ranges:[{from,to}]} (recurring events can set recurrence.onlyIn / notIn to season ids) | bills {id,name,amount,every: month|year,day,kind: rent|insurance|utilities|subscription|other,notes} (counted in weekly_budget). - remove_item (schedule:write): Remove a library item by id (calendars by key). - update_profile (schedule:write): Patch the profile: ageYears, heightIn, weightLb, goals [string], nutrition {calories, proteinG, carbsG, fatG, notes}, car {name, mpg, gasPrice (USD/gal), owned}. Daily meal totals in get_agenda are compared against nutrition targets; gas costs given in miles are priced with the car. - shopping_list (schedule:read): Groceries for the home meals in a week, grouped by store section with quantities, whole packs and an estimated cost; pantry staples listed separately. Default: 7 days from the next grocery run. format=text (default) or json. - weekly_budget (schedule:read): Planned spending for a week: groceries (from the shopping list), eating out (meals with source 'out': office café, restaurants, bars, with what to order and cost), gas (event.costs kind gas, in dollars or miles priced with profile.car), rideshares, other event costs (tickets, gear…) and each bill's share of the week (rent, insurance), plus the same plan per month. Default: 7 days from the next grocery run. - share (share): Create a public link someone can open and RSVP to. scope: 'event' (whole series), 'occurrence' (eventId + date), or 'day' (date). - list_tasks (schedule:read): To-dos: open ones (overdue and undated first, with due dates and lists) and ones checked off in the last week. Use add_task / complete_task to change them. - add_task (schedule:write): Add a one-off to-do. Optional: due (YYYY-MM-DD), list (e.g. Home, Paigy, Errands), notes. - complete_task (schedule:write): Check a to-do off by id (done: false puts it back). - list_shares (schedule:read): All share links with their RSVPs. - calendar_feed_urls (schedule:read): Subscription URLs for Google Calendar / Apple Calendar (all events, or one calendar such as 'work'). - recent_changes (schedule:read): Most recent writes, newest first: when, which actor (ui, mcp:, api:, guest, import:), and which item changed. - import_activities (import): Import completed activities (e.g. from Strava or Apple Health) as done workout events; dedupes by externalId per source. - replace_schedule (admin): Replace the ENTIRE schedule JSON (validated). Prefer the targeted methods; use this for bulk restructuring. Read with get_schedule first. - list_api_keys (admin): API keys for agents and integrations: name, scopes, when created and last used, and whether revoked. Secrets are never shown again. - create_api_key (admin): Create a key for one agent or integration. scopes: schedule:read, schedule:write, share, import, feed, admin. Returns the token once (dly_…); the agent sends it as `Authorization: Bearer ` and its writes are logged as agent:. - revoke_api_key (admin): Revoke an API key by id; it stops working at once.