
Google Meet Assistant
FreeJoin, transcribe, and interact in Google Meet calls.
Free · Opens the source repo
What Google Meet Assistant does
The Google Meet Assistant skill allows users to automate participation in Google Meet calls by joining meetings, transcribing live captions, and optionally speaking in real-time. This skill is particularly useful for professionals who need to take notes, summarize discussions, or respond during meetings without actively participating themselves. By leveraging the capabilities of the Hermes agent, users can focus on their tasks while the assistant handles the minutiae of meeting participation.
The skill operates in two modes: the default transcribe mode, which joins the meeting and scrapes the transcript from live captions, and the realtime mode, which additionally allows the assistant to speak in the meeting using OpenAI's Realtime technology. This flexibility makes it suitable for various use cases, from simply taking notes to actively contributing to discussions. Users can also run the assistant locally or on a remote node, which is beneficial for setups where the main machine is headless or lacks a signed-in Google account.
To get started, users must complete a series of installation steps, including setting up dependencies and configuring audio devices for realtime mode. The skill requires some initial setup, but once configured, it can significantly enhance productivity during meetings by automating note-taking and follow-up tasks. The assistant can also provide real-time status updates on its participation and transcript progress, ensuring users stay informed throughout the meeting.
This skill is ideal for developers, project managers, and team leaders who frequently engage in remote meetings and need assistance managing the flow of information without being overwhelmed by the details. By integrating this skill into their workflow, users can improve their meeting efficiency and ensure that important points are captured and acted upon without distraction.
When to use it
Use this skill when you need an assistant to join a Google Meet call, take notes, or summarize discussions without your active involvement.
When not to use it
This skill is not suitable for Windows users, as it does not support that operating system. Additionally, it may not be ideal for meetings where real-time interaction is not required.
What you can build with it
Join a Meeting
Use the skill to automatically join a Google Meet call by providing the meeting URL.
Take Notes During Standups
Utilize the transcribe mode to capture important points during daily standup meetings.
Summarize Meeting Discussions
After a meeting, read the transcript and summarize key action items and decisions.
How to install Google Meet Assistant
View source1. Install with the skills CLI
npx skills add nousresearch/hermes-agent/google_meet --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by nousresearchgoogle_meet
When to use
The user says any of:
- "join my Meet at <url>"
- "take notes on this meeting"
- "summarize the meeting and send followups"
- "sit in on my standup"
- "be a bot in this call and speak up when X"
Two modes
| Mode | What the bot does |
|---|---|
transcribe (default) | Joins, enables captions, scrapes a transcript. Listen-only. |
realtime | Same as transcribe PLUS speaks into the meeting via OpenAI Realtime. The agent calls meet_say(text) and the bot's voice comes out of the call. |
Pick realtime only when the user actually wants the agent to speak. It costs real money (OpenAI Realtime is pay-per-audio-minute) and requires a virtual audio device set up on the machine running the bot.
Two locations
| Location | When |
|---|---|
| Local (default) | Gateway machine runs the Playwright bot directly. |
Remote node (node="<name>") | Bot runs on a different machine that has a signed-in Chrome and (for realtime) a configured audio bridge. Useful when the gateway runs on a headless Linux box but the user's real signed-in Chrome lives on their Mac. |
Prerequisites the user must handle once
Easiest path — run the built-in installer:
hermes plugins enable google_meet
hermes meet install # pip deps + Chromium (transcribe only)
hermes meet install --realtime # + pulseaudio-utils / brew blackhole+ffmpeg
hermes meet auth # optional; skips guest-lobby wait
hermes meet setup # preflight checks
hermes meet install --realtime prompts before running sudo apt-get (Linux)
or brew install (macOS). Pass --yes to skip the prompt. It will NOT touch
your macOS default-input setting — you have to select BlackHole 2ch in
System Settings yourself before starting a realtime meeting.
Or do it manually:
pip install playwright websockets && python -m playwright install chromium
# For realtime mode, additionally:
# Linux: sudo apt install pulseaudio-utils
# macOS: brew install blackhole-2ch ffmpeg
# → System Settings → Sound → Input → BlackHole 2ch
# Then set OPENAI_API_KEY or HERMES_MEET_REALTIME_KEY in ~/.hermes/.env
For a remote node:
# on the user's Mac (where Chrome is signed in):
pip install playwright websockets && python -m playwright install chromium
hermes plugins enable google_meet
hermes meet node run --display-name my-mac # persistent server
# copy the printed token
# on the gateway:
hermes meet node approve my-mac ws://<mac-ip>:18789 <token>
hermes meet node ping my-mac # confirm reachable
Run hermes meet setup to preflight local prereqs.
Flow
- Join — call
meet_join(url=..., mode=..., node=...). Returns immediately. - Announce yourself — no auto-consent. Say (in whatever channel the user is watching): "A Hermes agent bot is in this call taking notes."
- Poll —
meet_status()for liveness,meet_transcript(last=20)for recent captions. Don't re-read the whole transcript every turn. - Speak (realtime only) —
meet_say(text="...")queues text for TTS. The speech lags by ~2s. Don't spam it. - Leave —
meet_leave()when done, or setduration="30m"onmeet_joinfor auto-leave. - Follow up — read
meet_transcript()in full, summarize, and use regular tools to send the recap, file issues, schedule followups.
Tool reference
| Tool | Parameters | Use |
|---|---|---|
meet_join | url, mode?, guest_name?, duration?, headed?, node? | Start bot |
meet_status | node? | Liveness + progress |
meet_transcript | last?, node? | Read captions |
meet_leave | node? | Close bot |
meet_say | text, node? | Speak in realtime meeting |
node? on all tools: pass a registered node name (or "auto" for the sole node) to operate a remote bot instead of a local one. Omit for local.
Important limits
- Captions are only as good as Google Meet's live captions. English-biased, lossy on overlapping speakers.
- Guest mode sits in the lobby until a host admits. Warn the user;
hermes meet authavoids this. - Lobby timeout: if the host doesn't admit the bot within 5 minutes (configurable via
HERMES_MEET_LOBBY_TIMEOUTenv), the bot leaves andmeet_statusreportsleaveReason: "lobby_timeout". - One active meeting per install per location. A second
meet_joinleaves the first. - Windows not supported.
- Realtime mode needs a virtual audio device. If the audio bridge setup fails, the bot falls back to transcribe mode and flags it in
meet_status().error. meet_sayrequiresmode='realtime'on the originatingmeet_join. Calling it against a transcribe-mode meeting returns a clear error.- Barge-in is best-effort. When a caption arrives attributed to a real participant while the bot is generating audio, the bot sends
response.cancelto OpenAI Realtime. Captions take ~500ms to show up, so the bot will talk over the first second or so of a human interruption.
Status dict reference
meet_status() returns (subset shown, there are more):
| Key | Meaning |
|---|---|
inCall | Past the lobby. False while waiting for admission. |
lobbyWaiting | Clicked "Ask to join", waiting on host. |
joinAttemptedAt / joinedAt | Timestamps for lobby-click and actual admission. |
captioning | Caption observer is installed. |
transcriptLines / lastCaptionAt | Transcript progress. |
realtime / realtimeReady | Realtime mode provisioned / WS connected. |
realtimeDevice | Audio device name the bot is feeding (e.g. hermes_meet_src). |
audioBytesOut / lastAudioOutAt | How much PCM the OpenAI session has produced. |
lastBargeInAt | Timestamp of the most recent response.cancel sent. |
leaveReason | duration_expired, lobby_timeout, denied, page_closed, or null. |
error | Last error (soft — bot may still be running). |
Transcript location
Local:
$HERMES_HOME/workspace/meetings/<meeting-id>/transcript.txt
Remote node: transcript lives on the node host's disk. Use meet_transcript(node=...) to read it over RPC.
Safety
- URL regex: only
https://meet.google.com/...URLs pass. - No calendar scanning. No auto-dial.
- Remote nodes use bearer-token auth; tokens are generated on the node (32 hex chars, persisted in
$HERMES_HOME/workspace/meetings/node_token.json) and must be copied to the gateway viahermes meet node approve. meet_saytext is rate-limited by the OpenAI Realtime session; spam-protection is the bot's problem, not yours, but still — don't queue hundreds of lines.
Frequently asked questions about Google Meet Assistant
Similar skills
Napkin
Collaborate visually with Copilot using an interactive whiteboard.
Mode Creator
Custom note-taking modes for claude-mem.
Memory Keeper
Organize lessons learned into reusable knowledge.
Meeting Minutes
Generate concise, actionable meeting minutes effortlessly.
Brag Sheet
Transform your work into impactful statements for reviews.
Call Summary
Streamline your call notes into actionable insights.
