Access Granola AI meeting notes via MCP (mcporter). Query meetings, list by date range, get full details, and pull verbatim transcripts. Use when the user asks about meeting notes, what was discussed, action items, decisions, or anything from their meetings. Also handles OAuth token refresh when calls fail with auth errors.
Meeting notes AI connected via mcporter call granola.<tool>.
granola.query_granola_meetings query=<string> [document_ids=<uuid[]>]
granola.list_meetings [time_range=this_week|last_week|last_30_days|custom] [custom_start=<ISO>] [custom_end=<ISO>]
granola.get_meetings meeting_ids=<uuid[]> (max 10)
granola.get_meeting_transcript meeting_id=<uuid>
query_granola_meetingslist_meetingsget_meetings with IDs from list resultsget_meeting_transcriptPrefer query_granola_meetings over list+get for natural language questions. Responses include citation links (e.g. ). Preserve these in replies so the user can click through to original notes.
[[0]](url)https://mcp-auth.granola.ai/oauth2/authorizeconfig/granola_oauth.json with keys: client_id, refresh_token, access_token, token_endpointconfig/mcporter.json with the Granola MCP server entry and Authorization: Bearer <token> headerscripts/refresh_token.sh periodically, since OAuth tokens expire every ~6 hoursIf a call fails with 401/auth error:
bash {baseDir}/scripts/refresh_token.sh
The script reads config/granola_oauth.json, posts to the token endpoint (https://mcp-auth.granola.ai/oauth2/token), and updates both config/granola_oauth.json and config/mcporter.json with the new access token.
Then retry the call. If refresh also fails, the user needs to re-authenticate manually via the OAuth flow above.
config/granola_oauth.json — OAuth credentials (client_id, refresh_token, access_token, token_endpoint). Contains secrets; do not commit.config/mcporter.json — MCP server config with bearer token header. Contains secrets; do not commit.