PollyHub

granola-enhanced

Clean

Query 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 |
Authordan
Downloads7
Versions1
Published14d ago

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