Follow-up to #245, which shipped the Gmail connector. This tracks the Granola (meeting-notes) connector.
Why split
Unlike Gmail (a stable, well-documented API), Granola's HTTP API shape isn't confirmed here, so a blind implementation would be guesswork. The connector pattern is identical to the other blind connectors (internal/plugins/gmail, linear, github) — token + REST list/get → RawDoc, httptest-covered — only the endpoints/fields differ.
What's needed
- Confirm the API: the meetings-list endpoint, the per-meeting fetch, and where the transcript/notes text lives (fields), plus auth (token header). The claude.ai Granola MCP integration hints at the model (meetings, transcripts, folders) but the REST shape must be pinned down.
- Implement
internal/plugins/granola mirroring gmail: GRANOLA_TOKEN auto-source, Fetch yields one RawDoc per meeting (title + transcript/notes), source_uri = granola://<meetingId>, ModifiedAt from the meeting time; httptest against a fake endpoint.
- Wire the
import --source granola dispatch (mcp + cli) and .env.example.
Invariant
Opt-in; off until GRANOLA_TOKEN is set. Content untrusted by default like other remote connectors.
@CheeryProgrammer — since you use Granola, the fastest unblock is dropping the meetings-list + meeting-fetch request/response shape (or a link to their API docs) on this issue.
P2, area:ingestion.
🤖 Generated with Claude Code
Follow-up to #245, which shipped the Gmail connector. This tracks the Granola (meeting-notes) connector.
Why split
Unlike Gmail (a stable, well-documented API), Granola's HTTP API shape isn't confirmed here, so a blind implementation would be guesswork. The connector pattern is identical to the other blind connectors (
internal/plugins/gmail,linear,github) — token + REST list/get →RawDoc, httptest-covered — only the endpoints/fields differ.What's needed
internal/plugins/granolamirroringgmail:GRANOLA_TOKENauto-source,Fetchyields oneRawDocper meeting (title + transcript/notes),source_uri = granola://<meetingId>,ModifiedAtfrom the meeting time; httptest against a fake endpoint.import --source granoladispatch (mcp + cli) and.env.example.Invariant
Opt-in; off until
GRANOLA_TOKENis set. Content untrusted by default like other remote connectors.@CheeryProgrammer — since you use Granola, the fastest unblock is dropping the meetings-list + meeting-fetch request/response shape (or a link to their API docs) on this issue.
P2, area:ingestion.
🤖 Generated with Claude Code