# Memory Calendar Ingest

> Pull Google Calendar events via MCP tools and extract attendees into the memory-kb contact registry

- Skill: `lotfb86/memory-calendar-ingest` (Agent Skill)
- Install (CLI): `npx skillmds@latest add lotfb86/memory-calendar-ingest`
- Raw SKILL.md: https://api.skillmd.com/api/skills/lotfb86/memory-calendar-ingest/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: lotfb86 (https://skillmd.com/u/lotfb86)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/lotfb86/memory-calendar-ingest

---


# 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`:

```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`:

```markdown
## 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`:

```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

