The Granola connector lets your AI agent act in each user's Granola account. Each user connects their own Granola access token once, and Scalekit sends it with every call, so your agent never handles credentials. Your agent calls the Granola API as the user through Scalekit's API proxy.
- Tools
- 9
- What they doRead · write · destructive
- 6 · 2 · 16 read2 write1 destructive
- Users sign in with
- Access token
What you can do
- Read meeting notes: list and fetch notes with titles, attendees, calendar details, and AI-generated summaries
- Get transcripts: pull the full transcript of any meeting, paging through long conversations
- Browse folders: list workspace folders and use them to filter notes
- Manage webhooks: create, update, list, and delete endpoints that receive events when notes are generated or edited
- Review audit events: list workspace audit events filtered by action and date range
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Granola connection
In AgentKit > Connections, create a Granola connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'granola'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Granola:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'granola_audit_events_list',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "granola"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Granola:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="granola_audit_events_list",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user opens the link once and enters their Granola credentials there. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolgranola_audit_events_listList paginated audit events for the Granola workspace, optionally filtered by action (exact match or prefix) and a date range.Read-onlyList Audit Events
List paginated audit events for the Granola workspace, optionally filtered by action (exact match or prefix) and a date range.
Inputs
actionstring- Filter by an exact action name or prefix, e.g. 'note.' to match all note-related actions.
cursorstring- Pagination cursor from the previous response to fetch the next page of results.
occurred_afterstring- Only return events that occurred on or after this date. ISO 8601 format (e.g., 2024-01-01 or 2024-01-01T00:00:00Z).
occurred_beforestring- Only return events that occurred before this date. ISO 8601 format (e.g., 2024-12-31 or 2024-12-31T23:59:59Z).
page_sizeinteger- Number of audit events to return per page (1-30). Defaults to 10.
granola_folders_listList all folders accessible in the Granola workspace, with pagination.Read-onlyList Folders
List all folders accessible in the Granola workspace, with pagination. Use folder IDs from this tool to filter notes or scope webhook endpoints.
Inputs
cursorstring- Pagination cursor from the previous response to fetch the next page of results.
page_sizeinteger- Number of folders to return per page (1-30). Defaults to 10.
granola_note_getRetrieve a single Granola meeting note by its ID.Read-onlyGet Note
Retrieve a single Granola meeting note by its ID. Returns the full note including title, owner, calendar event details, attendees, folder memberships, and AI-generated summary. Optionally include the full transcript with speaker labels and timestamps.
Inputs
note_idstringrequired- The unique identifier of the note to retrieve. Format: not_XXXXXXXXXXXXXX.
includestring- Pass 'transcript' to include the full meeting transcript with speaker source and timestamps.one of
transcript
granola_note_transcript_getRetrieve the full meeting transcript for a Granola note, paginated with a cursor.Read-onlyGet Note Transcript
Retrieve the full meeting transcript for a Granola note, paginated with a cursor. Use this instead of granola_note_get's include=transcript option when a transcript is too large to inline, or when you need to page through a long transcript explicitly.
Inputs
note_idstringrequired- The unique identifier of the note whose transcript should be retrieved. Format: not_XXXXXXXXXXXXXX.
cursorstring- Pagination cursor from a previous response to fetch the next page of transcript entries.
page_sizeinteger- Number of transcript entries to return per page (1-100). Defaults to 50.
granola_notes_listList all accessible meeting notes in the Granola workspace with pagination and date filtering.Read-onlyList Notes
List all accessible meeting notes in the Granola workspace with pagination and date filtering. Returns note IDs, titles, owners, calendar event details, attendees, folder memberships, and AI-generated summaries. Only notes shared in workspace-wide folders are accessible.
Inputs
created_afterstring- Filter notes created on or after this date. ISO 8601 format (e.g., 2024-01-01 or 2024-01-01T00:00:00Z).
created_beforestring- Filter notes created before this date. ISO 8601 format (e.g., 2024-12-31 or 2024-12-31T23:59:59Z).
cursorstring- Pagination cursor from the previous response to fetch the next page of results.
page_sizeinteger- Number of notes to return per page (1–30). Defaults to 10.
updated_afterstring- Filter notes updated after this date. ISO 8601 format (e.g., 2024-06-01 or 2024-06-01T00:00:00Z).
granola_webhook_endpoints_listList all webhook endpoints configured for the Granola workspace, including their URL, scopes, subscribed event types, and enabled state.Read-onlyList Webhook Endpoints
List all webhook endpoints configured for the Granola workspace, including their URL, scopes, subscribed event types, and enabled state.
Inputs
This tool takes no inputs.
granola_webhook_endpoint_createRegister a new HTTPS webhook endpoint to receive Granola event deliveries (e.g.WriteCreate Webhook Endpoint
Register a new HTTPS webhook endpoint to receive Granola event deliveries (e.g. note generated or edited). Returns a signing_secret used to verify delivered payloads.
Inputs
scopesarrayrequired- Which note visibility scopes this endpoint should receive events for. At least one of: personal, public, workspace.
urlstringrequired- The publicly reachable HTTPS URL that Granola should deliver events to.
eventsarray- Which event types to subscribe to. If omitted, defaults to all event types. At least one of: note.access_granted, note.edited, note.generated.
folder_idsarray- Restrict delivered events to notes in these folders only (up to 100 folder IDs). If omitted, events are not filtered by folder.
granola_webhook_endpoint_updateUpdate an existing Granola webhook endpoint's URL, scopes, subscribed events, folder filter, or enabled state.WriteUpdate Webhook Endpoint
Update an existing Granola webhook endpoint's URL, scopes, subscribed events, folder filter, or enabled state. Only the fields provided are changed.
- Idempotent
Inputs
webhook_endpoint_idstringrequired- The unique identifier of the webhook endpoint to update. Format: whe_XXXXXXXXXXXXXX.
enabledboolean- Enable or disable this webhook endpoint without deleting it.
eventsarray- New set of event types to subscribe to. At least one of: note.access_granted, note.edited, note.generated.
folder_idsarray- New list of folder IDs to restrict delivered events to (up to 100). Pass an empty array to remove the folder filter entirely.
scopesarray- New set of note visibility scopes this endpoint should receive events for. At least one of: personal, public, workspace.
urlstring- New publicly reachable HTTPS URL for Granola to deliver events to.
granola_webhook_endpoint_deletePermanently remove a Granola webhook endpoint.DestructiveDelete Webhook Endpoint
Permanently remove a Granola webhook endpoint. Event deliveries to it stop immediately.
- Idempotent
Inputs
webhook_endpoint_idstringrequired- The unique identifier of the webhook endpoint to delete. Format: whe_XXXXXXXXXXXXXX.
No tools match.