| name | memory-calendar-ingest |
| description | Pull Google Calendar events via MCP tools and extract attendees into the memory-kb contact registry |
| user_invocable | true |
Calendar Ingest for Memory Knowledge Base
Pull today's calendar events via Google Calendar MCP, extract attendee contacts, append to daily log.
Process
1. Load State
Read state from /Users/jesseanglen/Documents/RandomStuff/memory-kb/state/calendar-state.json (create if missing).
Read contacts from /Users/jesseanglen/Documents/RandomStuff/memory-kb/state/calendar-contacts.json (create if missing).
2. Fetch Today's Calendar Events
Use gcal_list_events with these parameters:
calendarId: "primary"
timeMin: today at 00:00:00 (RFC3339 format, e.g., 2026-04-12T00:00:00)
timeMax: tomorrow at 00:00:00 (RFC3339 format, e.g., 2026-04-13T00:00:00)
timeZone: "America/Los_Angeles"
Also fetch tomorrow's events for lookahead context (shift timeMin/timeMax by one day).
3. Extract Event Data
For each event returned, extract:
- summary — event title
- start/end — dateTime or date fields
- attendees — array of objects with
email, displayName, responseStatus
- description — event notes/agenda
- location — physical or virtual location
- htmlLink — link to the event
If an event has limited details, use gcal_get_event with the eventId to get full attendee list and description.
Skip:
- Cancelled events (
status: "cancelled")
- All-day events with no attendees (reminders, holidays)
4. Update Contact Registry
For each attendee email found, update /Users/jesseanglen/Documents/RandomStuff/memory-kb/state/calendar-contacts.json:
{
"contacts": {
"email@example.com": {
"name": "Person Name",
"last_seen": "YYYY-MM-DD",
"event_count": N
}
},
"last_updated": "ISO timestamp"
}
Rules:
- Existing contact: increment
event_count, update last_seen
- New contact: add with
event_count: 1
- Never remove contacts — registry only grows
- Exclude Jesse's own emails: jesse@ruh.ai, jesse@rapidinnovation.io, jesseanglen@gmail.com
- Exclude resource/room emails (anything ending in @resource.calendar.google.com)
5. Append to Daily Log
For each event with attendees, append to /Users/jesseanglen/Documents/RandomStuff/memory-kb/daily/YYYY-MM-DD.md:
## Calendar: [Event Title] @ HH:MM-HH:MM PT
**source:** calendar
**attendees:** name1 <email1>, name2 <email2>
**location:** [if any]
### Key Details
- [Event description summary]
- [Agenda items or notes from the description]
Create the daily log with # Daily Log: YYYY-MM-DD header if it doesn't exist.
6. Deduplication
Before appending, check if the daily log already has an entry with the same event title and time. Skip duplicates.
7. Update State
Write to /Users/jesseanglen/Documents/RandomStuff/memory-kb/state/calendar-state.json:
{
"last_checked_timestamp": "ISO timestamp",
"total_runs": N,
"last_run": {
"timestamp": "ISO",
"events_found": N,
"events_ingested": N,
"contacts_added": N,
"status": "success"
}
}
8. Report
"Calendar ingest complete. Found X events, ingested Y, added Z new contacts to registry."
MCP Tools Reference
gcal_list_events — list events in a time range (primary tool)
gcal_get_event — get full details for a single event (use for attendee details if list is condensed)
gcal_list_calendars — list available calendars (use if primary doesn't return expected events)
Notes
- Zero Chrome dependency — pure MCP
- Exclude Jesse's own emails and room resources from contacts
- Contact registry gates the email ingest — this skill must run before email ingest
- Solo calendar blocks (focus time, lunch) get logged but don't produce contacts