The Granola MCP connector routes your AI agent's tool calls to Granola's own MCP server through Scalekit. Each user signs in to Granola once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 18 tools.
- Tools
- 18
- What they doRead · write · destructive
- 10 · 7 · 110 read7 write1 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
What you can do
- Ask about meetings: answer plain-language questions on discussions, decisions, and action items, with links to source notes
- List meetings: find meeting notes by time range, folder, or whether the user took part
- Read meeting notes: fetch private notes, AI summaries, attendees, and details for specific meetings
- Get transcripts: retrieve the verbatim transcript of a meeting for exact quotes and wording
- Browse folders: list meeting folders with their descriptions and note counts
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 MCP connection
In AgentKit > Connections, create a Granola MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Granola MCP server, so you don't need to register an OAuth app.
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 = 'granolamcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Granola MCP:', 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: 'granolamcp_get_account_info',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 = "granolamcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Granola MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="granolamcp_get_account_info",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolgranolamcp_get_account_infoGet the email, active workspace, and effective note-access scopes for the Granola account currently connected to this MCP session.Read-onlyGranola: Get Account Info
Get the email, active workspace, and effective note-access scopes for the Granola account currently connected to this MCP session. When to use: - User asks 'who am I signed in as?', 'which Granola account is this?', or 'what's my email?' - User suspects they connected the wrong Granola account - Meeting results may be incomplete or empty because of the user's Granola plan or workspace MCP access controls - Before performing actions, to confirm identity if the user references a specific account When scope-based access controls are active, mcp_note_access.scopes contains the note categories this connection can search: - personal: notes the connected user owns, notes shared directly with them, and notes accessible through private folders - public: notes accessible through workspace-visible Team Space folders - Both scopes means both categories can be searched. These scopes describe access, not who captured or participated in a meeting.
Inputs
This tool takes no inputs.
granolamcp_get_meeting_attachmentGet up to 5 meeting attachments, such as screenshots of shared screens, as images in request order.Read-onlyGet Meeting Attachment
Get up to 5 meeting attachments, such as screenshots of shared screens, as images in request order. Provide attachment_ids for a batch or attachment_id for one image. Each image is followed by its metadata; failed attachments return an error with their ID without discarding successful images. A response holds about 6 MB of images, so a batch of large screenshots may leave some out; each one left out returns an error with its ID, so request it again in a separate call. Attachment IDs come from the <attachments> section of get_meetings results. Use this when the description alone does not answer the user's question, for example to read a slide, chart, or code on screen.
Inputs
attachment_idstring- Single attachment ID. Omit both attachment_id and attachment_ids to browse by meeting ID. If both are provided, they must refer to the same attachment.
attachment_idsarray- Attachment IDs from the <attachment id="..."> tags in get_meetings results, up to 5 per call; request more in further calls. Omit both attachment_id and attachment_ids to browse by meeting ID. If both are provided, they must refer to the same attachment.
limitinteger- Attachments to attempt per page (default/max 5). Only valid when attachment IDs are omitted. Images may be deferred by the response size limit.
meeting_idstring- Meeting UUID or public note ID (not_â¦) that owns the attachments. Required unless note_id is provided, including when attachment_id or attachment_ids is set.
note_idstring- Alias for meeting_id. If both are provided, they must refer to the same note (UUID and public note ID may differ).
offsetinteger- Starting position in the viewable attachment list (default 0). Use pagination.next_offset to continue. Only valid when attachment IDs are omitted.
granolamcp_get_meeting_transcriptGet the full transcript for a specific Granola meeting by ID.Read-onlyGranola: Get Meeting Transcript
Get the full transcript for a specific Granola meeting by ID. Returns only the verbatim transcript content, not summaries or notes. Use this when the user needs exact quotes, specific wording, or wants to review what was literally said in a meeting. For summarized content or action items, use query_granola_meetings or list_meetings/get_meetings instead.
Inputs
meeting_idstringrequired- Meeting UUID or public note ID (not_â¦).
chunk_idsarray- Read up to ten finalized transcript chunks instead of the full transcript. Use chunk IDs from search_transcripts, or [0] to browse from the beginning. IDs past the last chunk are skipped and listed in ignored_chunk_ids; if none of the IDs exist the status is out_of_range. Returns one verbatim passage per speaker turn with its speaker label (absent for preformatted transcripts) and start time (null when unknown), plus total_chunks and previous/next chunk IDs.
include_timestampsboolean- Prefix each reliably timed block with [m:ss], minutes:seconds since the transcript's earliest timed block, not clock time; that block can predate the meeting when recording started early. Applies to every page; chunk_ids reads ignore it. Adds about 7 characters per block, and offset, next_offset and total_chars count the text as rendered with it, so keep the same value when continuing from next_offset. When no block has timing, no prefixes are added and timestamps_unavailable says so.
max_charsinteger- Maximum size of the transcript field as sent (integer, at least 1,000), cut at the last utterance that fits; a page holds fewer transcript characters when the text needs JSON escaping. Defaults to 40000; larger requests are capped at 80000. Use next_offset to continue. Lower it if responses exceed your output limit.
meeting_idsarray- Read up to 10 transcripts in one call instead of meeting_id. offset and max_chars apply to each meeting; use offsets to start meetings at different positions. A meeting that cannot be read gets an error entry and the others are still returned. If meeting_id or note_id is also provided, they must all refer to the same note.
note_idstring- Alias for meeting_id. If both are provided, they must refer to the same note (UUID and public note ID may differ).
offsetinteger- Character offset; pass next_offset to continue, with the same include_timestamps as that page.
offsetsobject- With meeting_ids only: character offset per meeting, keyed by meeting ID, e.g. {"<id>": 8000}. Pass each truncated meeting's next_offset to continue several transcripts in one call. Meetings not listed start at offset. Omit or pass {} when not needed.
transcript_versionstring- With chunk_ids, reuse the version from search or a previous chunk read. A changed status returns no passages: search again or restart browsing without the old version. Omit chunk_ids and transcript_version for the existing full transcript read.
granolamcp_get_meetingsGet detailed meeting information for one or more Granola meetings by ID.Read-onlyGranola: Get Meetings
Get detailed meeting information for one or more Granola meetings by ID. Returns private notes, AI-generated summary, attendees, and metadata. Use this when you already have specific meeting IDs (e.g. from list_meetings results). For open-ended questions about meeting content, use query_granola_meetings instead.
Inputs
meeting_idsarrayrequired- Meeting UUIDs or public note IDs (max 10). Provide at least one ID in meeting_ids or note_ids; empty arrays are ignored.
attachmentsstring- Omit or pass "list" to list each meeting's viewable attachments with their IDs; when several meetings are returned, only the first 20 per meeting are listed and the attachments element says how many were left out. Pass "count" to get only an attachment_count attribute on each meeting that has attachments. Pass "none" to leave attachments out.one of
listcountnone max_participantsinteger- Maximum attendees to list per meeting, besides the note creator. Omit to list everyone. Set a small value (e.g. 10) for broad ranges or large meetings to keep responses small. When attendees are left out, known_participants has total and omitted attributes, e.g. <known_participants total="250" omitted="240">.
note_idsarray- Alias for meeting_ids. Empty arrays are ignored. If both are nonempty, they must refer to the same set of notes; order, duplicates, and UUID/public ID format may differ.
granolamcp_list_meeting_foldersList the user's Granola meeting folders.Read-onlyGranola: List Meeting Folders
List the user's Granola meeting folders. Returns folder ID, title, description, and note count including nested folders. When to use: - User asks about their folders or wants to browse meetings by folder - User wants to narrow down meeting searches to a specific folder Use the returned folder IDs with list_meetings (folder_id parameter) to list meetings within a specific folder.
Inputs
limitinteger- Maximum folders to return. Defaults to 100.
offsetinteger- Number of folders to skip. Use next_offset from a previous truncated response. Defaults to 0.
granolamcp_list_meetingsList the user's Granola meeting notes within a time range.Read-onlyGranola: List Meetings
List the user's Granola meeting notes within a time range. Returns meeting titles and metadata. IMPORTANT: For short-term questions about recent meeting details, prefer using query_granola_meetings instead. When to use: - User asks to list their meetings - User asks about action items, decisions, or summaries from meetings over a longer or specific date range - User asks about content from their meeting transcripts - User references 'Granola notes' or 'meeting notes' or 'transcripts' When NOT to use: - User is asking about upcoming calendar events or scheduling - User wants to create/modify calendar invites Filtering: - Omit workspace_only and involvement to return every meeting the user is allowed to access - For 'my meetings' or meetings the user was involved in, set both involvement conditions to true; true conditions combine using OR - Set captured_by_me to true for meetings whose Granola notes the user captured, or false to exclude them - Set listed_as_participant to true for meetings where the user is a known participant, or false to exclude them - False involvement conditions are exclusions and combine with the positive conditions using AND; omit a condition to ignore it - For Team Space or public workspace meetings, set workspace_only to true - workspace_only and involvement combine using AND Use get_meetings to retrieve detailed meeting content after identifying relevant meetings. Use list_meeting_folders to discover folder IDs, then pass a folder_id to list meetings within a specific folder.
Inputs
cursorstring- Opaque next_cursor from the previous response. Keep the same filters; omit or pass an empty string for the first page.
folder_idstring- Optional folder ID to list meetings from a specific folder. Use list_meeting_folders to discover folder IDs.
from_datestring- ISO date for custom range start (required if time_range is 'custom'). Prefer YYYY-MM-DD for whole-day requests; dates and times without an offset use the user's stored timezone (UTC if unavailable). An explicit Z means UTC; explicit offsets are respected. Do not append Z to a local time. For a day in another timezone, give both bounds as times with that timezone's offset.
involvementobject- Optional involvement filter. Conditions set to true form an OR inclusion group. Conditions set to false are exclusions applied using AND. Omitted conditions are ignored.
limitinteger- Requested meetings per page (positive integer). Defaults to and is capped at 200 on paid plans and 100 on free plans. Larger requests use the plan's cap; use next_cursor to continue.
max_participantsinteger- Maximum attendees to list per meeting, besides the note creator. Omit to list everyone. Set a small value (e.g. 10) for broad ranges or large meetings to keep responses small. When attendees are left out, known_participants has total and omitted attributes, e.g. <known_participants total="250" omitted="240">.
time_rangestring- Time range to query meetings from. Custom bounds imply 'custom' when time_range is omitted; otherwise defaults to the last 7 days, starting at midnight in the user's timezone. Weeks start on Monday at midnight in the user's timezone: this_week runs from this Monday to now, and last_week from the previous Monday up to, but not including, this Monday.one of
last_7_daysthis_weeklast_weeklast_30_dayscustom to_datestring- ISO date for custom range end (required if time_range is 'custom'). Prefer YYYY-MM-DD to include the whole final day in the user's stored timezone (UTC if unavailable). Times without an offset use that timezone; an explicit Z means UTC and explicit offsets are respected. Do not append Z to a local time. For a day in another timezone, give both bounds as times with that timezone's offset.
updated_afterstring- Only notes whose summary or content changed after this ISO date or time; matching rows then show updated_at. Use it to pick up changes since a previous call. Without a time_range or custom bounds it covers all accessible meeting history (the last 30 days on the free plan) instead of the last 7 days; a range narrows it further by meeting date. Offsetless values use the user's timezone (UTC if unavailable).
workspace_onlyboolean- Set to true only when the user explicitly asks for Team Space, public workspace, or workspace-visible meetings. Omit or set to false to search every meeting the user is allowed to access.
granolamcp_list_templatesList the note templates available for generating a meeting summary: Granola's built-in templates, the user's own, and those shared with their company, each with id, title, description, source (granola, yours or shared) and section headings.Read-onlyList Templates
List the note templates available for generating a meeting summary: Granola's built-in templates, the user's own, and those shared with their company, each with id, title, description, source (granola, yours or shared) and section headings. Pass a template's id as template_id to generate_summary; match the user's wording by title and description, and ask if more than one could fit.
Inputs
This tool takes no inputs.
granolamcp_query_granola_meetingsQuery Granola about the user's meetings using natural language.Read-onlyGranola: Query Meetings
Query Granola about the user's meetings using natural language. Returns a tailored response with inline citation links in mark (e.g. [[0]](url)) that reference source meeting notes. IMPORTANT: The response includes numbered citation links to specific Granola meeting notes. These citations MUST be preserved in your response to the user — they provide transparency and allow the user to verify information by clicking through to the original notes. When to use: - User asks about what was discussed, decided, or action-items from meetings - User asks about follow-ups, todos, or commitments from recent meetings - User references 'Granola notes' or 'meeting notes' When NOT to use: - User is asking about calendar scheduling or upcoming events - User explicitly asks for a specific meeting by ID (use get_meetings instead) Prioritize using query_granola_meetings over list_meetings/get_meetings for open-ended or natural language queries about meeting content.
Inputs
querystringrequired- The query to run on Granola meeting notes
document_idsarray- Optional meeting UUIDs or public note IDs to limit context to (max 10).
note_idsarray- Alias for document_ids (max 10). If both are provided, they must refer to the same set of notes; order, duplicates, and UUID/public ID format may differ.
granolamcp_search_meetingsFind the user's meetings by keyword, participant/company, date, or a combination.Read-onlySearch Meetings
Find the user's meetings by keyword, participant/company, date, or a combination. Returns metadata only â title, date, participants and note headings, not what was said: read the relevant meetings with get_meetings before answering about their content. With keywords or participant, results are ordered by relevance, favouring recent meetings; searches cover the history allowed by your plan, narrowed by any supplied dates. With neither keywords nor participant, results are newest first; omitting both dates defaults to the last 7 days in the user's timezone. Results are paginated. Pass next_cursor as cursor to continue using the original filters. Omit filters or repeat the same values; limit and max_participants may change. Pages can be short or empty after access checks and recording deduplication; continue while next_cursor is present. completion_status is exhausted when no further matches remain, or incomplete if continuation is unavailable (including after 10,000 examined recordings); narrow the search in that case. Cursors expire after 15 minutes. Results reflect current access and indexed data, not a frozen snapshot. participant matches names, emails, companies, or domains in participant metadata, not mentions in notes. It is a hard AND filter alongside keywords, dates, and folder. Participant metadata can be incomplete and does not prove attendance. Use participant to find meetings with a person or company, keeping topic words in keywords. For broader questions about their work, account status, decisions, issue resolution, or meeting preparation, also search the person/company and topic in keywords with participant omitted: internal discussions may contain the answer. For example, pair participant='Acme', keywords=['onboarding'] with keywords=['Acme onboarding'] and no participant. Read relevant results from both searches before drawing a conclusion. Results include notes you can access. A note's creator may differ from the connected user. Captures of the same calendar event are grouped across pages, keeping the first-ranked note (the newest when browsing). duplicate_recordings can refer to a note returned on an earlier page. Use the listed note by default; read other_ids only for missing details needed to answer the question or an explicit request to compare attendees' notes. When to use: - User names an exact term, project, product or acronym and wants the meetings that mention it - User wants a list of matching meetings rather than an answer - User wants to browse meetings in a date range without searching for a word - User wants meetings with a named person or company, optionally about a specific topic - You need meeting ids to pass to another tool When NOT to use: - User wants the full notes of a meeting you already identified: use get_meetings Use attended_only=true for 'my meetings' or 'meetings I attended'; excludes upcoming calendar-only meetings. Use list_meeting_folders to discover folder IDs, then pass folder_id to search within a folder and its nested folders. Keyword matching is literal, so pass the words as the user said them plus obvious synonyms. Keywords must appear in the meeting title, summary, or the user's private notes; participant filters match participant metadata instead. Meetings with attachments you can view (shared-screen screenshots or photos the user attached) include an attachment_count attribute; a meeting without it has none you can view. Use get_meetings to see what each attachment is. Rate limits apply per user and per tool. Send at most 2 search_meetings calls at once and wait for them to finish before sending more. On a rate_limit error, wait retry_after_seconds when it is provided, otherwise slow down, then retry only the failed calls one at a time. Do not retry when retryable is false.
Inputs
attended_onlyboolean- Only notes the user captured or where their email is listed as a creator or attendee. Approximates attendance; defaults to false.
cursorstring- Opaque next_cursor from the previous response. Omit filters to reuse them, or repeat the same filters. Omit cursor or pass an empty string for the first page. Cursors expire after 15 minutes.
folder_idstring- Only return meetings in this folder or its nested folders. Use list_meeting_folders to discover folder IDs.
from_datestring- Only meetings on or after this ISO date or time, using calendar start when available, otherwise note creation. Dates and offsetless times use the user's timezone (UTC if unavailable); explicit offsets are respected, so for a day in another timezone give both bounds as times with that timezone's offset.
include_sharedboolean- Also search notes other people shared with the user. Defaults to true when omitted.
keywordsarray- Groups of words to search for in meeting titles, summaries, or your private notes. Transcript text is not searched. All words in one entry must appear within the same field, in any order or position. Entries are alternatives (OR): ["MCP write tools"] requires all three words; ["write tools", "write access"] matches either group. Pass at most 20 entries. Adjacent words in the supplied order get a relevance boost, but exact phrases are not required. A single comma-separated string is also accepted. Omit to browse meetings by date.
limitinteger- Requested meetings per page (positive integer). Defaults to 30 and is capped at 100. Larger requests use the cap; use next_cursor to continue. Duplicates or inaccessible matches can make a page shorter.
max_participantsinteger- Maximum attendees to list per meeting, besides the note creator. Omit to list everyone. Set a small value (e.g. 10) for broad ranges or large meetings to keep responses small. When attendees are left out, known_participants has total and omitted attributes, e.g. <known_participants total="250" omitted="240">.
participantstring- Filter meetings with a participant name, email, company name, or domain in participant metadata. Combines with keywords, dates, and folder using AND. Mentions in notes alone do not match; missing participant metadata can hide relevant meetings. For broader questions about their work, account status, decisions, issue resolution, or preparation, also search the person/company and topic in keywords without this filter to include internal discussions.
to_datestring- Only meetings on or before this ISO date or time. YYYY-MM-DD includes the whole day in the user's timezone (UTC if unavailable); explicit offsets are respected. Uses calendar start when available, otherwise note creation.
updated_afterstring- Only notes whose summary or content changed after this ISO date or time; matching rows then show updated_at. Use it to pick up changes since a previous call. Combines with the other filters using AND; without from_date and to_date it covers all accessible meeting history (the last 30 days on the free plan) instead of the last 7 days. Offsetless values use the user's timezone (UTC if unavailable).
workspace_onlyboolean- Set to true only when the user explicitly asks for Team Space, public workspace, or workspace-visible meetings. Omit or set to false to search every meeting the user is allowed to access. Combines with folder_id and include_shared using AND.
granolamcp_search_transcriptsFind specific words or quotes in accessible meeting transcripts in the active workspace.Read-onlySearch Transcripts
Find specific words or quotes in accessible meeting transcripts in the active workspace. Returns ranked passages with approximate timestamps. This tool is unavailable on this plan; it needs a paid Granola plan. Supply meeting_ids when known, batching meetings that share the same terms and filters. Matching is literal; put alternative words in one keywords array, e.g. ["pricing", "price", "cost"]. For what a person or company said, use participant (names/companies) or attendee_emails/attendee_domains (invite list). participant is an AND filter on metadata that can be incomplete, so for broader questions also search their name and the topic in keywords without it. Known meetings with no indexed match are also searched in their current transcripts. Without meeting_ids, search relies on an asynchronously updated index and groups duplicate recordings; empty results do not prove a topic was never discussed. Follow next_cursor even on empty pages, passing only cursor and optionally limit. If completion_status is incomplete, narrow the search or read known transcripts. Read surrounding dialogue with get_meeting_transcript using meeting_id, the passage's chunk_ids and transcript_version; adjacent chunk IDs continue, and omitting chunk_ids reads the whole conversation. counts is cumulative across pages; total_matching_chunks is a first-page estimate, null for direct search. Neither counts spoken mentions. Use another tool when: - The term is likely in the notes, or the user wants meetings about a topic: use search_meetings - You need the whole conversation: use get_meeting_transcript
Inputs
attendee_domainsarray- Only meetings whose invite list includes anyone at these email domains, including subdomains, e.g. ["acme.com"]
attendee_emailsarray- Only meetings whose invite list includes any of these emails, e.g. ["alice@acme.com"]
cursorstring- Pass next_cursor from a previous result; only limit may accompany it. Omit or pass an empty string for the first page. Cursors expire after 15 minutes.
from_datestring- Only meetings on or after this ISO date or time, using calendar start when available, otherwise note creation. Dates and offsetless times use the user's timezone (UTC if unavailable).
keywordsarray- Required for a new search. Entries are alternatives (OR); all words within an entry must occur in one chunk, in any order. Accepts an array or comma-separated string.
limitinteger- Passages per page with meeting_ids; otherwise meetings per page. Default 10, capped at 20.
meeting_idsarray- Restrict to these meetings (UUIDs or public note IDs, max 100). Batch IDs sharing the same terms and filters. Omit to search all accessible indexed meetings.
participantstring- Filter by participant name, email, company name, or domain in meeting participant metadata. Combines with keywords, dates, meeting_ids, attendee_emails, and attendee_domains using AND. Mentions in the transcript alone do not match. Missing participant metadata can hide relevant meetings; metadata does not prove attendance.
to_datestring- Only meetings on or before this ISO date or time. YYYY-MM-DD includes the whole day in the user's timezone (UTC if unavailable). Uses calendar start when available, otherwise note creation.
granolamcp_add_note_to_folderAdd a Granola note to a folder.WriteAdd Note To Folder
Add a Granola note to a folder. Use list_meeting_folders to find the destination folder ID and list_meetings to find the note ID; list_meetings shows which folders each note is already in. This operation is additive and idempotent. IMPORTANT: Adding a note grants everyone who can access the folder access to the note. A folder with visibility "workspace" shares the note with everyone in the workspace; check the folder's visibility and audience in list_meeting_folders first. Use only when the user has clearly requested that destination. The response confirms the write with an outcome (added or already_in_folder) and the destination folder's visibility and audience.
Inputs
folder_idstringrequired- Destination folder UUID
note_idstringrequired- Meeting UUID, public note ID (not_â¦) or Granola note link
granolamcp_create_folderCreate a top-level Granola folder.WriteCreate Folder
Create a top-level Granola folder. Use only when the user explicitly asks for a new folder; to file notes into an existing folder, find it with list_meeting_folders and use add_note_to_folder. visibility "private" (the default) creates a folder only the user can see. visibility "workspace" creates it in the workspace's Shared space, where everyone in the workspace can see every note added to it: use it only when the user asks for a team or shared folder. Sub-folders can't be created. If a top-level folder with the same title and visibility already exists, it is returned with outcome already_exists instead of creating a duplicate. The response has outcome created or already_exists and the folder with its id, visibility and audience; pass the id to add_note_to_folder.
Inputs
titlestringrequired- Folder name.
descriptionstring- What the folder is for.
visibilitystring- Who can see the folder: "private" (only the user) or "workspace" (everyone in the workspace).one of
privateworkspacedefaultprivate
granolamcp_generate_summaryStart generating a new summary for a Granola meeting the user owns, from its transcript and notes, only when the user explicitly asks.WriteGenerate Summary
Start generating a new summary for a Granola meeting the user owns, from its transcript and notes, only when the user explicitly asks. Existing summaries are kept; the new one is added alongside them. To use a template, find its ID with list_templates and pass it as template_id; otherwise Granola's standard summary is generated. For every meeting in a folder, find the folder with list_meeting_folders, discover its meetings with folder_id, and call this once per meeting. Generation runs in the background for about 30 to 90 seconds; this returns as soon as it has started. Read the meeting with get_meetings afterwards to see the new summary.
Inputs
meeting_idstring- Meeting UUID or public note ID (not_â¦).
note_idstring- Alias for meeting_id. If both are provided, they must refer to the same note (UUID and public note ID may differ).
template_idstring- Template to apply, from list_templates. Omit for Granola's standard summary.
granolamcp_give_feedbackIf give_feedback is available, use it to report unexpected Granola tool behavior, including confusing or incomplete output, ignored arguments, missing capabilities, unclear documentation, and errors.WriteGive Feedback
If give_feedback is available, use it to report unexpected Granola tool behavior, including confusing or incomplete output, ignored arguments, missing capabilities, unclear documentation, and errors. Report these problems even when a retry or workaround lets you finish the task: recovering from a problem still makes it useful feedback. Before your final answer, check whether you had to repeat information, rephrase a valid request, or change your approach because a tool behaved unexpectedly. Submit once per distinct problem: put the affected tool in tool_name, and describe the expected behavior, actual behavior, and any workaround in message. Use generic examples and placeholders; never include the customer's query, meeting content, names, actual IDs, or other private, confidential or personal information. These diagnostic reports are sent to Granola to improve its tools. If feedback is unavailable or fails, continue the user's task without retrying the report. Reports are screened before storage and rejected if they include meeting content, names, identifiers, or what the user asked about. Accepted reports are stored by Granola under a 90-day retention policy. This tool does not provide support replies.
Inputs
messagestringrequired- In at most 2,000 Unicode characters, describe only the tool problem: the expected behavior, actual behavior, and any workaround, using generic examples. Never include customer queries, meeting content, names, or other private, confidential or personal information.
categorystring- No description.one of
tool_errormissing_capabilityconfusing_outputdocumentationotherdefaultother severitystring- high: blocked; medium: needed a workaround; low: minor friction.one of
lowmediumhighdefaultmedium tool_namestring- The Granola tool that behaved unexpectedly.one of
give_feedbackquery_granola_meetingslist_meetingslist_meeting_foldersadd_note_to_folderremove_note_from_foldercreate_folderupdate_foldergenerate_summarylist_templatesupdate_private_notesget_meetingsget_meeting_transcriptget_meeting_attachmentsign_outget_account_infosearch_meetingssearch_transcripts
granolamcp_sign_outRevoke the connected Granola account's consent and refresh tokens for this MCP client.WriteSign Out
Revoke the connected Granola account's consent and refresh tokens for this MCP client. Only use when the user asks to sign out, disconnect, or switch Granola accounts. This affects all connections for this account using the same client authorization. New MCP requests using this authorization will be rejected immediately after sign-out. No browser action is needed to complete MCP sign-out. If the user wants to switch accounts, tell them to reconnect Granola in this client. Only if the browser automatically selects their previous account, open the returned sign_out_url in that browser before reconnecting again.
Inputs
This tool takes no inputs.
granolamcp_update_folderRename a Granola folder or change its description.WriteUpdate Folder
Rename a Granola folder or change its description. Use only when the user asks to rename or describe a folder. Get the folder ID from list_meeting_folders. Pass title, description or both; anything omitted stays the same. An empty description clears it. Requires owner or collaborator access to the folder (its role in list_meeting_folders). The response returns the updated folder, including its stored title and description.
Inputs
folder_idstringrequired- Folder UUID
descriptionstring- New description. An empty string clears it.
titlestring- New folder name.
granolamcp_update_private_notesAdd content to the private notes of a Granola meeting the user owns (the notes they typed, not the AI summary), only when the user asks to add context or information.WriteUpdate Private Notes
Add content to the private notes of a Granola meeting the user owns (the notes they typed, not the AI summary), only when the user asks to add context or information. Existing notes are kept, and additions are stored as written by an agent so they stay distinguishable. Pass 1 to 20 operations, applied in order, each adding Markdown at the end (append) or start (prepend). Supported: paragraphs, # and ## headings, bullet and numbered lists, unchecked checkboxes, bold, italic and links; tables, code, quotes, images and deeper headings are flattened or dropped. Read the notes with get_meetings first to avoid repeating what's there. To refresh the AI summary with the new notes, call generate_summary afterwards if it's available.
Inputs
operationsarrayrequired- Content to add, applied together in order.
meeting_idstring- Meeting UUID or public note ID (not_â¦).
note_idstring- Alias for meeting_id. If both are provided, they must refer to the same note (UUID and public note ID may differ).
granolamcp_remove_note_from_folderRemove a Granola note from a folder.DestructiveRemove Note From Folder
Remove a Granola note from a folder. Use list_meeting_folders to find the folder ID and list_meetings to find the note ID; list_meetings shows which folders each note is in. Removing the note may revoke folder-derived access for other people. The response confirms the write with an outcome (removed or not_in_folder) and the folder's visibility and audience.
Inputs
folder_idstringrequired- Folder UUID
note_idstringrequired- Meeting UUID, public note ID (not_â¦) or Granola note link
No tools match.
Workflows
Tool calling
Use this connector when you want an agent to work with Granola meeting content, including summaries, notes, attendees, and transcripts.
- Use
granolamcp_query_granola_meetingsfor natural-language questions such as decisions, action items, or follow-ups from past meetings. - Use
granolamcp_list_meetingsto find meetings in a time window before drilling into specific meeting IDs. - Use
granolamcp_get_meetingswhen you already know the Granola meeting IDs and need richer metadata or notes. - Use
granolamcp_get_meeting_transcriptwhen exact wording matters and you need the verbatim transcript instead of summarized notes.
tool_response = actions.execute_tool( connection_name='granolamcp', identifier='user_123', tool_name="granolamcp_query_granola_meetings", tool_input={ "query": "What decisions and follow-ups came out of last week's customer calls?" },)print("Granola response:", tool_response)const toolResponse = await actions.executeTool({ connector: 'granolamcp', identifier: 'user_123', toolName: 'granolamcp_query_granola_meetings', toolInput: { query: "What decisions and follow-ups came out of last week's customer calls?", },});console.log('Granola response:', toolResponse.data);