DEV Community

Lay Patel
Lay Patel

Posted on AI-assisted

Who actually joined that meeting? Connecting Google Meet to cognee

Google Meet knows who joined a call, but not what the call was. Google Calendar knows the title, but not who actually showed up. So I tested my connector with a question that needs both:

Who actually joined the Falcon drone sync and when?

And the answer from memory:

The participants who joined that meeting on 2026-10-17 and their times in UTC are: Lay Jokes: 16:36 to 16:39, Lay Patel: 16:36 to 16:37, and 16:37 to 16:39

Both of those accounts are mine, and I cut the line with the meeting link. The two time ranges for Lay Patel are the second account joining from my phone, leaving and coming back.

The Google Meet People panel for Falcon drone sync, showing two contributors

The title in that question exists only in Calendar, and the attendance exists only in Meet. What joins them is one line. This connector writes the Meeting link exactly the way my Google Calendar connector writes it, so when both sync into the same dataset, a conference and its calendar event end up linked in the graph.

cognee is an open source memory layer for AI agents. This is my fourth connector for it during Mergetober.

Status: the PR is open and hasn't had a maintainer review yet.

What I want to use it for

My test call was between two of my own accounts, so it hasn't been through a real meeting yet. I want to use it for hackathon and college project calls I organize, to answer "who actually joined, and when?" after the call is over. I also talk through ideas with a friend late at night, and that's where transcripts would really help, but my accounts are personal Gmail, so for me it's attendance only for now.

What it syncs

  • Every finished conference you organized, with who joined and when. Meet only lists conferences where you were the organizer.
  • The last 30 days at most. Meet only keeps conferences for 30 days, so the first run can't reach further back. Sync regularly if you want to keep more.
  • Transcripts, on Google Workspace editions that can transcribe. On a personal Gmail account you still get attendance, just no transcripts. My live test was on personal accounts, so I've only verified the transcript path against a fake API.

Signed-in participants come with a display name, no email, and all times are in UTC.

Try it

Until the PR merges, install it from my branch:

git clone -b feature/google-meet-connector https://github.com/laypatel13/cognee-community
cd cognee-community/packages/connector/google-meet
uv sync
Enter fullscreen mode Exit fullscreen mode
  1. In the Google Cloud Console, create a free project and enable the Google Meet REST API and the Google Drive API.
  2. Under Google Auth Platform, set up the consent screen as External, keep it in Testing, and add your own account as a test user. Add only two read-only scopes: meetings.space.readonly, and drive.meet.readonly, which can only see Drive files that Meet created.
  3. Under Clients, create an OAuth client of type Desktop app, download its JSON, and sign in once:
export GOOGLE_MEET_CREDENTIALS_PATH=~/client_secret.json
export GOOGLE_MEET_TOKEN_PATH=~/.cognee_google_meet_token.json
uv run python examples/login.py
Enter fullscreen mode Exit fullscreen mode
  1. Set your LLM_API_KEY, then sync and ask:
import asyncio

import cognee
from cognee_community_connector_google_meet import google_meet_source


async def main():
    await cognee.remember(
        google_meet_source(),
        dataset_name="my_meetings",
        primary_key="id",
        write_disposition="merge",  # makes re-runs incremental and lets deletes reach the graph
        max_rows_per_table=0,  # removes the default cap of 50 rows
    )

    answer = await cognee.recall("Who joined yesterday's meetings?", datasets=["my_meetings"])
    print(answer)


asyncio.run(main())
Enter fullscreen mode Exit fullscreen mode

To get the question at the top of this post, sync Calendar into the same dataset too. Set up the GOOGLE_CALENDAR_* variables from the Calendar connector, then:

uv pip install ../google-calendar
uv run python examples/example.py --with-calendar "Who actually joined the Falcon drone sync and when?"
Enter fullscreen mode Exit fullscreen mode

What happened on a real call

I used two personal Gmail accounts and a Calendar event called Falcon drone sync with a Meet link. One account started the call from the event, the other joined from a phone, left and rejoined, and the organizer ended the call. Gemini was the LLM and local fastembed did the embeddings. The PR has a video.

The first sync picked up 6 conferences and 1 calendar event, and the second picked up nothing, as it should. That sounds like a lot for one proper call. Three were short calls from my earlier checks, and two were empty conferences on the Falcon link. Meet records one whenever the link is opened, even if nobody stays.

Details I cared about

Meet has no change feed. So later runs filter on start_time, from one hour before the newest finished conference, and skip what's already done.

Calls that aren't finished wait. A running conference, or one whose transcript is still being written, stays in a pending list and is read again by id on each run. A transcript Google still hasn't written a day after the conference ended is given up on, so it doesn't cost a request forever.

A deleted transcript is forgotten, and Drive is how I know. Meet keeps listing a transcript after its Google Doc is deleted. So the connector asks Drive whether the Doc still exists, and that's the whole reason for the drive.meet.readonly scope. The transcript is forgotten and the attendance record stays.

No surprise browser pop-ups. Only the login script opens a browser. A sync with a missing or under-scoped token raises a clear error instead of waiting for a person who isn't there.

It only reads. Nothing is created or changed in Meet or Drive. Recordings are noted as yes or no and never downloaded, and smart notes and chat are never read. The conference text does go to your LLM provider during processing, like any document you add to cognee, so use a local model if that matters to you.

What I did differently this time

I opened this PR on October 17. Three days later, the Dropbox and Outlook reviews landed, and a lot of what they found applied here too. So I didn't wait for someone to find it again. I went through those review notes and fixed what fit while this PR sat in the queue:

  • Retries moved out of the Google client. Its own retries could sleep about a minute per request while cognee holds a staging lock, without asking if the sync should still be running. Now a 429, a 5xx or a dropped connection is retried after 1, 2 and 4 seconds from one 2 minute budget per run, and a 400 or 404 is never retried.
  • Waits are slept in 1 second steps, with check_active asked in between, so a revoked connection stops a long wait within a second.
  • Rows stream per conference, so a first sync of 30 days keeps one conference in memory at a time.
  • Wrong option types are refused, so include_transcripts="false" no longer reads as True.

The tests went from 68 to 100, and I made sure they can fail: with the Drive check turned off, the forget test goes red.

The earlier connectors taught me to ask the questions a reviewer would ask before anyone else has to. That's a better use of a maintainer's time than making them find the same bug in a fourth connector. I'm sure the real review will still find things I missed, but they should be new ones.

Looking back at the month

This is the last post in my Mergetober series. Four connectors and a lot of review rounds in one month, and I only started coding in May. The hard part for me was sticking with it the whole month. I enjoyed it, but managing my time was rough, and I'm proud that I managed it somehow.

Links

Top comments (0)