granola-enhanced
CleanQuery and retrieve Granola meeting notes, transcripts, summaries, and action items. Two-phase non-interactive OAuth setup with auto-install of mcporter.
SKILL.md
---
name: granola-enhanced
description: >
Query and retrieve Granola meeting notes, transcripts, summaries, and action items.
Use when the user asks about what was discussed in meetings, follow-ups, decisions,
action items, or wants to search across their meeting notes.
Keywords: granola, meeting, notes, transcript, summary, action items, follow-up.
metadata:
openclaw:
requires:
files:
- ~/.mcporter/mcporter.json
- ~/.credentials/*--granola_auth.json
---
# Granola (via Granola MCP Server)
Access your Granola meeting notes, transcripts, and AI summaries through the
[Granola MCP Server](https://mcp.granola.ai/mcp) using `mcporter`.
---
## Prerequisites
### 1. Ensure mcporter is available
Always run this before invoking any Granola tools:
```bash
export PATH="$HOME/lib/node/bin:$PATH"
if ! command -v mcporter &>/dev/null; then
npm install -g mcporter --prefix ~/lib/node
fi
```
### 2. First-Time OAuth Setup (two-phase, non-interactive)
**Phase 1** — generate the auth URL and save PKCE state to disk:
```bash
python3 /home/polly/skills/user/granola/scripts/oauth_setup.py
```
This prints a URL. Give it to the user to open in their browser.
After approving, they'll get a browser error ("localhost refused to connect") — that's expected.
Ask them to copy the full URL from the address bar (`http://localhost:8080/callback?code=...`).
**Phase 2** — complete the exchange (paste the redirect URL as an argument):
```bash
python3 /home/polly/skills/user/granola/scripts/oauth_setup.py '<redirect URL>'
```
The two phases can run in separate script executions — PKCE state is persisted to disk between them.
---
## Invocation Pattern
```bash
export PATH="$HOME/lib/node/bin:$PATH"
mcporter --config ~/.mcporter/mcporter.json call granola.<tool_name> [key=value ...]
```
---
## Available Tools
### List recent meetings
```bash
mcporter --config ~/.mcporter/mcporter.json call granola.list_meetings time_range=this_week
# time_range options: this_week | last_week | last_30_days
```
### Query meetings with natural language
```bash
mcporter --config ~/.mcporter/mcporter.json call granola.query_granola_meetings query="what were the action items from this week?"
```
> Always preserve citation links `[[0]](url)` in your response — they link back to source notes.
### List meeting folders
```bash
mcporter --config ~/.mcporter/mcporter.json call granola.list_meeting_folders
```
### Get full meeting details (summary, notes, attendees)
```bash
mcporter --config ~/.mcporter/mcporter.json call granola.get_meetings meeting_ids='["<uuid>","<uuid>"]'
```
### Get verbatim transcript
```bash
mcporter --config ~/.mcporter/mcporter.json call granola.get_meeting_transcript meeting_id=<uuid>
```
---
## Token Refresh
Access token expires in ~6 hours. Refresh it with:
```bash
python3 /home/polly/skills/user/granola/scripts/refresh_token.py
```
---
## File Locations
| File | Purpose |
|------|---------|
| `~/.credentials/<id>--granola_auth.json` | OAuth tokens |
| `~/.credentials/.granola_pending_oauth.json` | Temporary PKCE state (deleted after phase 2) |
| `~/.mcporter/mcporter.json` | mcporter config with bearer token |
| `scripts/oauth_setup.py` | Two-phase OAuth PKCE setup |
| `scripts/refresh_token.py` | Token refresh |
Version History
v1.1.0latest
Two-phase non-interactive OAuth setup (PKCE state persisted to disk); auto-install mcporter if missing
Mar 27, 2026
Clean.zip
SHA-256 (latest)
5ce9aa1531c826475e2d14732b5e36469ee4a310e5da5d02bbb655d4461f72f2