The Grain MCP connector routes your AI agent's tool calls to Grain's own MCP server through Scalekit. Each user signs in to Grain once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 58 tools.
- Tools
- 58
- What they doRead · write · destructive
- 33 · 20 · 533 read20 write5 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
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 Grain MCP connection
In AgentKit > Connections, create a Grain MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Grain, so you don't need to register an OAuth app. To show your own app on the consent screen, use your own credentials instead.
Use your own OAuth app
Grain MCP uses Dynamic Client Registration (DCR) — no client ID or secret is required. The only step is creating a connection in Scalekit and authorizing your Grain account.
-
Create a connection in Scalekit
- In the Scalekit dashboard, go to AgentKit → Connections → Create Connection.
- Search for Grain MCP and click Create.
- Note the Connection name — use this as
connection_namein your code (e.g.,grainmcp).
-
Authorize your Grain account
Generate an authorization link and open it in a browser to complete the Grain OAuth flow.
The user is redirected to Grain to sign in and grant access. Scalekit stores the token and injects it automatically into every tool call — no further configuration is needed.
-
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 = 'grainmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Grain 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: 'grainmcp_myself',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 = "grainmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Grain MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="grainmcp_myself",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_toolgrainmcp_fetch_collectionFetches detailed information about a single Grain collection (also known as a playlist) by ID, including the list of recordings it contains with their URLs.Read-onlyFetch Collection
Fetches detailed information about a single Grain collection (also known as a playlist) by ID, including the list of recordings it contains with their URLs.
Inputs
collection_idstringrequired- ID of a collection.
grainmcp_fetch_dealFetches information about a single HubSpot deal by ID.Read-onlyFetch Deal
Fetches information about a single HubSpot deal by ID. In addition to returning the same data as returned by list_all_deals, this returns data about all the activity that has occurred on the deal.
Inputs
deal_idstringrequired- ID of a deal.
grainmcp_fetch_meetingFetches information about a single Grain meeting by ID.Read-onlyFetch Meeting
Fetches information about a single Grain meeting by ID. The response format is the same as is returned by list_meetings.
Inputs
meeting_idstringrequired- ID of a meeting.
grainmcp_fetch_meeting_action_itemsFetches the action items extracted from a single Grain meeting by ID.Read-onlyFetch Meeting Action Items
Fetches the action items extracted from a single Grain meeting by ID. Each action item includes the task description, timestamp, status (pending or completed), the assignee (person_id and name, or null when unassigned), and the due date (or null when not set). `end_timestamp_ms` is null when the action item has no end time. In some cases, older meetings may not have had action items generated for them.
Inputs
meeting_idstringrequired- ID of a meeting.
grainmcp_fetch_meeting_coaching_feedbackFetches AI-generated sales coaching feedback and scorecard for a single Grain meeting by ID.Read-onlyFetch Meeting Coaching Feedback
Fetches AI-generated sales coaching feedback and scorecard for a single Grain meeting by ID. The response format is the same as is returned by list_coaching_feedback.
Inputs
meeting_idstringrequired- ID of a meeting.
grainmcp_fetch_meeting_notesFetches the AI notes payload from a single Grain meeting by ID.Read-onlyFetch Meeting Notes
Fetches the AI notes payload from a single Grain meeting by ID. In some cases, older meetings may not have had notes generated for them. In these cases you can use `fetch_meeting_transcript` instead to determine the content of the meeting.
Inputs
meeting_idstringrequired- ID of a meeting.
grainmcp_fetch_meeting_transcriptFetches the full transcript of a single Grain meeting by ID.Read-onlyFetch Meeting Transcript
Fetches the full transcript of a single Grain meeting by ID. Returns the entire conversation as markdown, which can be large for long meetings.
Inputs
meeting_idstringrequired- ID of a meeting.
grainmcp_fetch_projectFetches detailed information about a single Grain project by ID, including the list of recordings it contains with their URLs.Read-onlyFetch Project
Fetches detailed information about a single Grain project by ID, including the list of recordings it contains with their URLs.
Inputs
project_idstringrequired- ID of a project.
grainmcp_fetch_storyFetches detailed information about a single Grain story by ID, including its items (clips and text sections).Read-onlyFetch Story
Fetches detailed information about a single Grain story by ID, including its items (clips and text sections). Use list_stories first to find story IDs.
Inputs
story_idstringrequired- ID of the story to fetch.
grainmcp_fetch_user_recording_notesFetches the current user's private notes for a single Grain meeting by ID.Read-onlyFetch User Recording Notes
Fetches the current user's private notes for a single Grain meeting by ID. Returns the notes as markdown text, or a message if no notes exist.
Inputs
meeting_idstringrequired- ID of a meeting.
grainmcp_get_dossier_for_companyFetches the Company Intelligence dossier for a single company by `company_id` (the id returned by `search_companies`).Read-onlyGet Dossier for Company
Fetches the Company Intelligence dossier for a single company by `company_id` (the id returned by `search_companies`). The dossier is returned as markdown plus metadata. If the company exists but has no dossier generated yet, `markdown` and the metadata fields are null. Read-only: this never triggers dossier generation.
Inputs
company_idstringrequired- Company id fetched using `search_companies`.
grainmcp_list_all_dealsList status of hubspot-linked deals that are synced in Grain.Read-onlyList All Deals
List status of hubspot-linked deals that are synced in Grain. If the list contains more than `limit` deals, the response will also contain a non-null `cursor` value that can be used to fetch the next page of deals in the list by calling the tool again and passing the `cursor` along with the same `filters`. The list will be empty if there are no deals matching the supplied filters.
Inputs
cursorstring- Optional cursor value from a previous request in order to fetch the next page of results.
filtersobject- Optional filters that can be used to reduce the result set of deals that are searched against.
limitinteger- Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
grainmcp_list_attended_meetingsReturns a filtered list of Grain meetings you have attended, ordered by most recent.Read-onlyList Attended Meetings
Returns a filtered list of Grain meetings you have attended, ordered by most recent. If the list contains more than `limit` meetings, the response will also contain a non-null `cursor` value that can be used to fetch the next page of meetings in the list by calling the tool again and passing the `cursor` along with the same `filters`. The list will be empty if there are no meetings matching the supplied filters. If also looking to include meetings the user didn't attend, use `list_meetings` instead.
Inputs
cursorstring- Optional cursor value from a previous request in order to fetch the next page of results.
filtersobject- Optional filters that can be used to reduce the result set of meetings that are searched against.
limitinteger- Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
grainmcp_list_clipsReturns a paginated list of Grain clips you have access to, ordered by most recent.Read-onlyList Clips
Returns a paginated list of Grain clips you have access to, ordered by most recent. Clips are short segments from meeting recordings. If the list contains more than `limit` clips, the response will also contain a non-null `cursor` value that can be used to fetch the next page by calling the tool again. Only returns clips whose media has finished processing, so newly-created clips may take a few minutes to appear.
Inputs
cursorstring- Optional cursor value from a previous request in order to fetch the next page of results.
filtersobject- Optional filters to narrow down the list of clips.
limitinteger- Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
grainmcp_list_coaching_feedbackList AI-generated sales-coaching feedback and scorecards for a filtered set of meetings.Read-onlyList Coaching Feedback
List AI-generated sales-coaching feedback and scorecards for a filtered set of meetings. If the list contains more than `limit` meetings, the response will also contain a non-null `cursor` value that can be used to fetch the next page of meetings in the list by calling the tool again and passing the `cursor` along with the same `filters`. The list will be empty if there are no meetings matching the supplied filters.
Inputs
cursorstring- Optional cursor value from a previous request in order to fetch the next page of results.
filtersobject- Optional filters that can be used to reduce the result set of meetings that are searched against.
limitinteger- Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
grainmcp_list_collectionsReturns a paginated list of Grain collections (also known as playlists) you have access to, ordered by most recent.Read-onlyList Collections
Returns a paginated list of Grain collections (also known as playlists) you have access to, ordered by most recent. A collection is a curated group of meetings (recordings) that belong together. If the list contains more than `limit` collections, the response will also contain a non-null `cursor` value that can be used to fetch the next page of collections in the list by calling the tool again and passing the `cursor` along with the same `filters`. The list will be empty if there are no collections matching the supplied filters.
Inputs
cursorstring- Optional cursor value from a previous request in order to fetch the next page of results.
filtersobject- Optional filters to narrow down the list of collections.
limitinteger- Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
grainmcp_list_meetingsReturns a filtered list of Grain meetings you have access to, ordered by most recent.Read-onlyList Meetings
Returns a filtered list of Grain meetings you have access to, ordered by most recent. If the list contains more than `limit` meetings, the response will also contain a non-null `cursor` value that can be used to fetch the next page of meetings in the list by calling the tool again and passing the `cursor` along with the same `filters`. The list will be empty if there are no meetings matching the supplied filters. If only looking for meetings the user attended, use `list_attended_meetings` instead.
Inputs
cursorstring- Optional cursor value from a previous request in order to fetch the next page of results.
filtersobject- Optional filters that can be used to reduce the result set of meetings that are searched against.
limitinteger- Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
grainmcp_list_open_dealsList status of open hubspot-linked deals that are synced in Grain.Read-onlyList Open Deals
List status of open hubspot-linked deals that are synced in Grain. If the list contains more than `limit` deals, the response will also contain a non-null `cursor` value that can be used to fetch the next page of deals in the list by calling the tool again and passing the `cursor` along with the same `filters`. The list will be empty if there are no open deals matching the supplied filters. If also looking to include closed deals, use `list_all_deals` instead.
Inputs
cursorstring- Optional cursor value from a previous request in order to fetch the next page of results.
filtersobject- Optional filters that can be used to reduce the result set of deals that are searched against.
limitinteger- Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
grainmcp_list_projectsReturns a paginated list of Grain projects you have access to, ordered by most recent.Read-onlyList Projects
Returns a paginated list of Grain projects you have access to, ordered by most recent. A project is a curated group of meetings (recordings) that belong together. If the list contains more than `limit` projects, the response will also contain a non-null `cursor` value that can be used to fetch the next page of projects in the list by calling the tool again and passing the `cursor` along with the same `filters`. The list will be empty if there are no projects matching the supplied filters.
Inputs
cursorstring- Optional cursor value from a previous request in order to fetch the next page of results.
filtersobject- Optional filters to narrow down the list of projects.
limitinteger- Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
grainmcp_list_smart_topicsLists the smart topics configured in your Grain workspace.Read-onlyList Smart Topics
Lists the smart topics configured in your Grain workspace. Smart topics are saved classifiers that mark where meetings discuss a given subject. Use the returned `id` values with the `smart_topics` filter on the meeting-listing tools (e.g. list_meetings) to find meetings matching a topic. Deactivated topics are hidden unless `include_inactive` is true.
Inputs
include_inactiveboolean- Include deactivated smart topics in the result. Defaults to false.
grainmcp_list_storiesReturns a paginated list of Grain stories you have access to, ordered by most recent.Read-onlyList Stories
Returns a paginated list of Grain stories you have access to, ordered by most recent. Stories are curated collections of clips and text sections created from meetings. If the list contains more than `limit` stories, the response will also contain a non-null `cursor` value that can be used to fetch the next page by calling the tool again.
Inputs
cursorstring- Optional cursor value from a previous request in order to fetch the next page of results.
filtersobject- Optional filters to narrow down the list of stories.
limitinteger- Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
grainmcp_list_team_settingsLists teams and a number of their settings.Read-onlyList Team Settings
Lists teams and a number of their settings. You can use `update_team_settings` to update these settings.
Inputs
This tool takes no inputs.
grainmcp_list_teamsLists team IDs and names in your workspace.Read-onlyList Teams
Lists team IDs and names in your workspace. Use these IDs in the teams meeting filter.
Inputs
This tool takes no inputs.
grainmcp_list_user_settingsLists a few basic information about users and a number of settings.Read-onlyList User Settings
Lists a few basic information about users and a number of settings. Basic information may not be updated. Settings may be updated using `update_user_settings` For members of teams that disallow overrides (`team_settings_overridable` is false), team settings are always used and user settings are returned as null. For users without a team, a non-null value indicates their effective user setting. To achieve parity among overrideable user settings, prefer setting their team's `team_settings_overridable` to false instead of updating multiple users.
Inputs
This tool takes no inputs.
grainmcp_list_workspace_usersGet information about all the users in the logged-in Grain user's workspace.Read-onlyList Workspace Users
Get information about all the users in the logged-in Grain user's workspace. Each user's person ID is also returned and can be used to list recordings attended by that person.
Inputs
This tool takes no inputs.
grainmcp_my_settingsGet your personal settings.Read-onlyMy Settings
Get your personal settings. For overrideable settings, a null value means the team setting is being applied. You can use `update_my_settings` to change these settings.
Inputs
This tool takes no inputs.
grainmcp_my_teamGet the settings of the team you belong to.Read-onlyMy Team
Get the settings of the team you belong to. You can use `my_settings` to see your personal setting overrides.
Inputs
This tool takes no inputs.
grainmcp_myselfGet information about the logged-in Grain user.Read-onlyMyself
Get information about the logged-in Grain user.
Inputs
This tool takes no inputs.
grainmcp_resolve_urlsResolves canonical shareable URLs for Grain entities (meetings, clips, collections, stories) by ID.Read-onlyResolve URLs
Resolves canonical shareable URLs for Grain entities (meetings, clips, collections, stories) by ID. Always prefer this tool over constructing URLs yourself; hand-built URLs are frequently wrong. Supported `media_type` values: `recording`, `clip`, `collection`, `story`. Each returned item contains either a `url` on success or an `error` string if the entity is not accessible to the current user.
Inputs
itemsarrayrequired- List of entity references to resolve URLs for.
grainmcp_search_companiesReturns filtered lists of companies that were participants of Grain meetings you have access to.Read-onlySearch Companies
Returns filtered lists of companies that were participants of Grain meetings you have access to. Use one call with all requested company names when the user asks about multiple companies. Set `limit` low, usually 1-3, when company names are specific.
Inputs
search_stringsarrayrequired- Company names or domains to search for. Pass all requested companies in one call.
filtersobject- Optional filters that can be used to reduce the result set of meetings that are searched against.
limitinteger- Number of results to return per search string. Value should be between 1 and 20. If not specified, the default is 3.
grainmcp_search_contactsReturns contacts in your workspace.Read-onlySearch Contacts
Returns contacts in your workspace. Without a search string, returns contacts from your most recent meetings.
Inputs
limitinteger- Number of results to return. Value should be between 1 and 20. If not specified, the default is 10.
search_stringstring- Only search contacts whose name or email contains the specified substring.
grainmcp_search_in_transcriptsSearches transcripts of Grain meetings and returns the matching segments rather than the full transcript.Read-onlySearch In Transcripts
Searches transcripts of Grain meetings and returns the matching segments rather than the full transcript. Useful for locating specific content, topics, quotes, decisions, action items, or moments across one or many meetings without loading entire transcripts. Uses hybrid semantic + keyword search over transcript segments — coherent conversation chunks annotated with summaries, topics, entities, and speaker info. Results are grouped by meeting and ordered by relevance.
Inputs
search_queriesarrayrequired- Array of 1-3 search queries optimized for hybrid BM25 + vector search over meeting transcript segments. Segments group related discussion into chunks with descriptive summaries. BM25 keyword matching against summaries is the strongest signal. Generate exactly 3 queries: 1. Extract key nouns, names, and actions into a dense keyword query (e.g. "Lisa user data export Auth0 Clerk") 2. Include the keywords PLUS plausible co-occurring topics from the same discussion segment (e.g. "Lisa data export migration Auth0 Clerk switching authentication") 3. A synonym/rephrasing variation (e.g. "Lisa handle account data transfer auth provider migration") Rules: - ALWAYS preserve person names, product names, dates, and specific terms - Keep queries keyword-dense, no filler words - Do NOT write conversational/spoken-style queries
filtersobject- Optional filters that can be used to reduce the result set of meetings that are searched against.
limitinteger- Number of results to return per request page. Value should be between 1 and 50. If not specified, the default is 10.
meeting_idsarray- Optional list of meeting IDs to restrict the search to. When provided, only these meetings will be searched. Can be combined with filters for further narrowing.
offsetinteger- Number of results to skip for pagination. Use with `limit` to page through results beyond the first page. Defaults to 0.
grainmcp_search_personsReturns a filtered list of persons that were participants of Grain meetings you have access to.Read-onlySearch Persons
Returns a filtered list of persons that were participants of Grain meetings you have access to.
Inputs
filtersobject- Optional filters that can be used to reduce the result set of meetings that are searched against.
limitinteger- Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
search_stringstring- Only search persons whose name or email contains the specified substring.
grainmcp_add_clips_to_storyAdds one or more clips to an existing story.WriteAdd Clips to Story
Adds one or more clips to an existing story. Use list_stories or fetch_story to find the story ID, and create_clip or list_clips to get clip IDs.
Inputs
clip_idsarrayrequired- List of clip IDs to add to the story. Use create_clip or list_clips to get clip IDs.
story_idstringrequired- ID of the story to add clips to.
grainmcp_add_recordings_to_collectionAdds one or more recordings to an existing collection (also known as a playlist) by recording ID.WriteAdd Recordings to Collection
Adds one or more recordings to an existing collection (also known as a playlist) by recording ID. Use list_meetings or search_in_transcripts first to find recording IDs.
Inputs
collection_idstringrequired- The collection ID to add recordings to.
recording_idsarrayrequired- Recording IDs to add to the collection.
grainmcp_add_recordings_to_projectAdds one or more recordings to an existing project by recording ID.WriteAdd Recordings to Project
Adds one or more recordings to an existing project by recording ID. Use list_meetings or search_in_transcripts first to find recording IDs.
Inputs
project_idstringrequired- The project ID to add recordings to.
recording_idsarrayrequired- Recording IDs to add to the project.
grainmcp_add_tag_to_meetingsAdd a tag to up to 50 Grain meetings you can access, using their meeting IDs.WriteAdd Tag To Meetings
Add a tag to up to 50 Grain meetings you can access, using their meeting IDs. Creates the tag if it doesn't exist.
Inputs
meeting_idsarrayrequired- Meeting IDs to tag or untag.
tagstringrequired- The tag name to add or remove. Must start with a letter or digit, followed by letters, digits, or hyphens.
grainmcp_assign_paid_seat_to_usersAssigns an unassigned paid seat to one or more workspace users.WriteAssign Paid Seat To Users
Assigns an unassigned paid seat to one or more workspace users. Use workspace_seat_info to check how many unassigned seats are available before calling this.
Inputs
user_idsarrayrequired- IDs of the users to assign a paid seat to.
grainmcp_create_clipCreates a clip on a recording between the given timestamps.WriteCreate Clip
Creates a clip on a recording between the given timestamps. Use search_in_transcripts first to find the recording and relevant transcript timestamps, then call this tool with the meeting ID and start/end timestamps. Choose start_ms and end_ms to capture a complete thought or topic — avoid cutting off mid-sentence. Invalid ranges (start_ms >= end_ms, or end_ms past the recording's duration) returns an error.
Inputs
clip_titlestringrequired- Title for the clip.
end_msintegerrequired- Timestamp in milliseconds where the clip should end.
meeting_idstringrequired- The meeting ID to create a clip on.
start_msintegerrequired- Timestamp in milliseconds where the clip should start.
grainmcp_create_collectionCreates a new empty collection (also known as a playlist) with the given title.WriteCreate Collection
Creates a new empty collection (also known as a playlist) with the given title. The collection is created with restricted visibility (only you can see it). Use add_recordings_to_collection to add meetings, and update_collection_share_state to change visibility.
Inputs
titlestringrequired- The title for the new collection.
grainmcp_create_projectCreates a new empty project with the given title.WriteCreate Project
Creates a new empty project with the given title. The project is created with restricted visibility (only you can see it). Use add_recordings_to_project to add meetings, and update_project_share_state to change visibility.
Inputs
titlestringrequired- The title for the new project.
grainmcp_create_smart_topicCreates a new smart topic in your Grain workspace.WriteCreate Smart Topic
Creates a new smart topic in your Grain workspace. A smart topic is a saved classifier that marks where meetings discuss a given subject, based on example keywords and phrases. Provide 1-50 examples: short examples (1-2 words) are treated as keywords, longer ones as semantic phrases. Only workspace admins can create smart topics, and the topic is associated with your team. Matching runs asynchronously: existing meetings are scored over the following minutes, so the new topic may return no meetings immediately when used with the `smart_topics` filter. To reconfigure an existing topic, use the Grain app — this tool only creates new topics.
Inputs
descriptionstringrequired- A short description of what the topic captures.
examplesarrayrequired- Example keywords (1-2 words) and phrases that exemplify the topic. 1-50 items, each at least 3 characters.
namestringrequired- The smart topic name (also created as a tag). Must start with a letter or digit, followed by letters, digits, or hyphens — no spaces or other symbols.
match_scopestring- Which meetings to match: all, only external (with guests), or only internal. Defaults to all.one of
allexternalinternal speaker_scopestring- Whose speech to match against: all speakers, external speakers, or internal speakers. Defaults to all.one of
allexternalinternal team_idstring- Optional team to scope the topic to. When omitted the topic is workspace-scoped.
grainmcp_create_storyCreates a new story with the given title.WriteCreate Story
Creates a new story with the given title.
Inputs
titlestringrequired- The title for the new story.
clip_idsarray- Optional list of clip IDs to be added to the story.
descriptionstring- Optional description for the story.
grainmcp_create_teamCreates a new team in the workspace.WriteCreate Team
Creates a new team in the workspace. Optionally seeds the team with initial members.
Inputs
namestringrequired- Name of the team.
grainmcp_invite_to_workspaceSends email invitations to the specified email addresses to join your Grain workspace.WriteInvite To Workspace
Sends email invitations to the specified email addresses to join your Grain workspace. Requires a workspace admin and supports up to 50 email addresses per call. If an address has a pending workspace access request, approves that request instead. Invitations use free seats by default; selecting paid seats can incur charges when invitees join. An optional team assignment applies to a Grain team within the same workspace.
Inputs
emailsarrayrequired- List of emails to invite to the workspace
notestring- Optional note to add to the invite email.
seatstring- Defaults to `free`
When `paid`, automatically gives the invited users a paid seat upon registration.
Charges may apply.
one of
paidfree team_idstring- If present, upon registration automatically adds the invited users to the selected team.
grainmcp_move_users_to_teamMoves one or more users into a team.WriteMove Users To Team
Moves one or more users into a team. Users already on a different team will have their team changed to the new one.
Inputs
team_idstringrequired- ID of the destination team.
user_idsarrayrequired- IDs of the users to move.
shared_media_strategystring- Controls what happens to shared media for users who are being moved from another team.
Not relevant for users in no team.
- retain Shared media remains on the user's previous team. (default)
- transfer Shared media moves to the new team.
- remove Sharing is removed from the user's media.
one of
retaintransferremove
grainmcp_unassign_paid_seat_from_usersRemoves the paid seat from one or more workspace users.WriteUnassign Paid Seat From Users
Removes the paid seat from one or more workspace users. The unassigned seats remain available and can be reassigned at any time until the end of the current billing cycle.
Inputs
user_idsarrayrequired- IDs of the users to remove from the plan.
grainmcp_update_my_settingsUpdate your personal settings.WriteUpdate My Settings
Update your personal settings. Set a field to null to unset your override and fall back to your team's setting.
Inputs
auto_record_mode_externalstring- Overrideable
Defines if and how External Meetings (with external participants) for this user should be automatically recorded.
- bot Eligible meetings will be autorecorded using Grain's bot recorders.
- local_capture Eligible meetings will be autorecorded using the user's Grain desktop capture.
- none Eligible meetings won't be recorded
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
botlocal_capturenone auto_record_mode_internalstring- Overrideable
Defines if and how Internal Meetings (w/no external participants) for this user should be automatically recorded.
- bot Eligible meetings will be autorecorded using Grain's bot recorders.
- local_capture Eligible meetings will be autorecorded using the user's Grain desktop capture.
- none Eligible meetings won't be recorded
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
botlocal_capturenone auto_record_mode_unscheduledstring- Overrideable
Defines if and how Unscheduled Meetings (can't determine beforehand if Internal or External) for this user should
be automatically recorded.
- bot Eligible meetings will be autorecorded using Grain's bot recorders.
- local_capture Eligible meetings will be autorecorded using the user's Grain desktop capture.
- none Eligible meetings won't be recorded
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
botlocal_capturenone auto_share_recordings_target_externalstring- Overrideable
Defines who bot recordings of External Meetings (with external participants) will be automatically shared with.
- workspace The whole workspace.
- team The user's own team (team members only).
- none Nobody.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
workspaceteamnone auto_share_recordings_target_internalstring- Overrideable
Defines who bot recordings of Internal Meetings (w/no external participants) will be automatically shared with.
- workspace The whole workspace.
- team The user's own team (team members only).
- none Nobody.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
workspaceteamnone auto_share_recordings_target_local_externalstring- Overrideable
Defines who local_capture recordings of External Meetings (with external participants) will be automatically
shared with.
- workspace The whole workspace.
- team The user's own team (team members only).
- none Nobody.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
workspaceteamnone auto_share_recordings_target_local_internalstring- Overrideable
Defines who local_capture recordings of Internal Meetings (w/no external participants) will be automatically
shared with.
- workspace The whole workspace.
- team The user's own team (team members only).
- none Nobody.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
workspaceteamnone default_recordings_share_statestring- Overrideable
Defines authorization for a recording with said recording's link.
- public Anyone with the recording link will be able to see it.
- workspace Anyone in your workspace with the recording link will be able to see it.
- restricted Only people with explicit access will be able to see the recording.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
publicworkspacerestricted recap_share_modestring- Overrideable
Auto-share with participants: defines which meeting participants get access to a bot recording.
Shared participants outside the workspace receive an email; workspace members see it in Grain.
- all Everyone: all participants, including external guests.
- internal Internal only: participants from your internal email domains.
- workspace Workspace only: participants in your Grain workspace.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
allinternalworkspace recap_share_mode_localstring- Overrideable
Auto-share with participants: defines which meeting participants get access to a local_capture recording.
Shared participants outside the workspace receive an email; workspace members see it in Grain.
- all Everyone: all participants, including external guests.
- internal Internal only: participants from your internal email domains.
- workspace Workspace only: participants in your Grain workspace.
- none No one: not shared with participants.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
allinternalworkspacenone
grainmcp_update_team_settingsUpdate team settingsWriteUpdate Team Settings
Update team settings
Inputs
idstringrequired- No description.
auto_record_mode_externalstring- Defines if and how External Meetings (with external participants) for this team should be automatically recorded.
- bot Eligible meetings will be autorecorded using Grain's bot recorders.
- local_capture Eligible meetings will be autorecorded using the user's Grain desktop capture.
- none Eligible meetings won't be recorded
one of
botlocal_capturenone auto_record_mode_internalstring- Defines if and how Internal Meetings (w/no external participants) for this team should be automatically recorded.
- bot Eligible meetings will be autorecorded using Grain's bot recorders.
- local_capture Eligible meetings will be autorecorded using the user's Grain desktop capture.
- none Eligible meetings won't be recorded
one of
botlocal_capturenone auto_record_mode_unscheduledstring- Defines if and how Unscheduled Meetings (can't determine beforehand if Internal or External) for this team should
be automatically recorded.
- bot Eligible meetings will be autorecorded using Grain's bot recorders.
- local_capture Eligible meetings will be autorecorded using the user's Grain desktop capture.
- none Eligible meetings won't be recorded
one of
botlocal_capturenone auto_share_recordings_target_externalstring- Defines who bot recordings of External Meetings (with external participants) will be automatically shared with.
- workspace The whole workspace.
- team The whole team.
- none Nobody.
one of
workspaceteamnone auto_share_recordings_target_internalstring- Defines who bot recordings of Internal Meetings (w/no external participants) will be automatically shared with.
- workspace The whole workspace.
- team The whole team.
- none Nobody.
one of
workspaceteamnone auto_share_recordings_target_local_externalstring- Defines who local_capture recordings of External Meetings (with external participants) will be automatically
shared with.
- workspace The whole workspace.
- team The whole team.
- none Nobody.
one of
workspaceteamnone auto_share_recordings_target_local_internalstring- Defines who local_capture recordings of Internal Meetings (w/no external participants) will be automatically
shared with.
- workspace The whole workspace.
- team The whole team.
- none Nobody.
one of
workspaceteamnone default_recordings_share_statestring- Defines authorization for a recording with said recording's link.
- public Anyone with the recording link will be able to see it.
- workspace Anyone in your workspace with the recording link will be able to see it.
- restricted Only people with explicit access will be able to see the recording.
one of
publicworkspacerestricted namestring- No description.
recap_share_modestring- Auto-share with participants: defines which meeting participants get access to a bot recording.
Shared participants outside the workspace receive an email; workspace members see it in Grain.
- all Everyone: all participants, including external guests.
- internal Internal only: participants from your internal email domains.
- workspace Workspace only: participants in your Grain workspace.
one of
allinternalworkspace recap_share_mode_localstring- Auto-share with participants: defines which meeting participants get access to a local_capture recording.
Shared participants outside the workspace receive an email; workspace members see it in Grain.
- all Everyone: all participants, including external guests.
- internal Internal only: participants from your internal email domains.
- workspace Workspace only: participants in your Grain workspace.
- none No one: not shared with participants.
one of
allinternalworkspacenone team_settings_overridableboolean- Use this setting if you want to have uniform settings across all your users. - true Team settings are used as default, and users are allowed to override them (user_settings). - false Team settings will always be used.
grainmcp_update_user_settingsUpdates settings for a user.WriteUpdate User Settings
Updates settings for a user. Team settings take precedence for members of teams that disallow overrides (`team_settings_overridable` is false). To achieve parity among overrideable user settings, prefer setting their team's `team_settings_overridable` to false instead of updating multiple users.
Inputs
idstringrequired- No description.
auto_record_mode_externalstring- Overrideable
Defines if and how External Meetings (with external participants) for this user should be automatically recorded.
- bot Eligible meetings will be autorecorded using Grain's bot recorders.
- local_capture Eligible meetings will be autorecorded using the user's Grain desktop capture.
- none Eligible meetings won't be recorded
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
botlocal_capturenone auto_record_mode_internalstring- Overrideable
Defines if and how Internal Meetings (w/no external participants) for this user should be automatically recorded.
- bot Eligible meetings will be autorecorded using Grain's bot recorders.
- local_capture Eligible meetings will be autorecorded using the user's Grain desktop capture.
- none Eligible meetings won't be recorded
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
botlocal_capturenone auto_record_mode_unscheduledstring- Overrideable
Defines if and how Unscheduled Meetings (can't determine beforehand if Internal or External) for this user should
be automatically recorded.
- bot Eligible meetings will be autorecorded using Grain's bot recorders.
- local_capture Eligible meetings will be autorecorded using the user's Grain desktop capture.
- none Eligible meetings won't be recorded
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
botlocal_capturenone auto_share_recordings_target_externalstring- Overrideable
Defines who bot recordings of External Meetings (with external participants) will be automatically shared with.
- workspace The whole workspace.
- team The user's own team (team members only).
- none Nobody.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
workspaceteamnone auto_share_recordings_target_internalstring- Overrideable
Defines who bot recordings of Internal Meetings (w/no external participants) will be automatically shared with.
- workspace The whole workspace.
- team The user's own team (team members only).
- none Nobody.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
workspaceteamnone auto_share_recordings_target_local_externalstring- Overrideable
Defines who local_capture recordings of External Meetings (with external participants) will be automatically
shared with.
- workspace The whole workspace.
- team The user's own team (team members only).
- none Nobody.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
workspaceteamnone auto_share_recordings_target_local_internalstring- Overrideable
Defines who local_capture recordings of Internal Meetings (w/no external participants) will be automatically
shared with.
- workspace The whole workspace.
- team The user's own team (team members only).
- none Nobody.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
workspaceteamnone default_recordings_share_statestring- Overrideable
Defines authorization for a recording with said recording's link.
- public Anyone with the recording link will be able to see it.
- workspace Anyone in your workspace with the recording link will be able to see it.
- restricted Only people with explicit access will be able to see the recording.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
publicworkspacerestricted recap_share_modestring- Overrideable
Auto-share with participants: defines which meeting participants get access to a bot recording.
Shared participants outside the workspace receive an email; workspace members see it in Grain.
- all Everyone: all participants, including external guests.
- internal Internal only: participants from your internal email domains.
- workspace Workspace only: participants in your Grain workspace.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
allinternalworkspace recap_share_mode_localstring- Overrideable
Auto-share with participants: defines which meeting participants get access to a local_capture recording.
Shared participants outside the workspace receive an email; workspace members see it in Grain.
- all Everyone: all participants, including external guests.
- internal Internal only: participants from your internal email domains.
- workspace Workspace only: participants in your Grain workspace.
- none No one: not shared with participants.
- null Unsets the override, falling back to the team (for team members) or workspace setting.
one of
allinternalworkspacenone
grainmcp_update_workspace_settingsUpdate workspace settingsWriteUpdate Workspace Settings
Update workspace settings
Inputs
auto_detection_languagesarray- List of language codes that Grain will use to try to automatically detect the spoken language of your recordings. For best results have the smallest list of all the possible languages your team may speak during your meetings.
auto_record_mode_externalstring- Defines if and how External Meetings (with external participants) for this workspace should be automatically
recorded.
- bot Eligible meetings will be autorecorded using Grain's bot recorders.
- local_capture Eligible meetings will be autorecorded using the user's Grain desktop capture.
- none Eligible meetings won't be recorded
one of
botlocal_capturenone auto_record_mode_internalstring- Defines if and how Internal Meetings (w/no external participants) for this workspace should be automatically
recorded.
- bot Eligible meetings will be autorecorded using Grain's bot recorders.
- local_capture Eligible meetings will be autorecorded using the user's Grain desktop capture.
- none Eligible meetings won't be recorded
one of
botlocal_capturenone auto_record_mode_unscheduledstring- Defines if and how Unscheduled Meetings (can't determine beforehand if Internal or External) for this workspace
should be automatically recorded.
- bot Eligible meetings will be autorecorded using Grain's bot recorders.
- local_capture Eligible meetings will be autorecorded using the user's Grain desktop capture.
- none Eligible meetings won't be recorded
one of
botlocal_capturenone auto_record_organiser_onlyboolean- Defines whether meetings are only automatically recorded when the user is the calendar event organizer. - true Eligible meetings will only be autorecorded when the user organized the event. - false Eligible meetings will be autorecorded regardless of who organized the event.
auto_settings_overridableboolean- Use this setting if you want to have uniform settings across all your users. For members of a team, the team's `team_settings_overridable` applies instead. - true Workspace settings are used as default, and users are allowed to override them (user_settings). - false Workspace settings will always be used.
auto_share_recordings_target_externalstring- Defines who bot recordings of External Meetings (with external participants) will be automatically shared with.
- workspace The whole workspace.
- none Nobody.
one of
workspacenone auto_share_recordings_target_internalstring- Defines who bot recordings of Internal Meetings (w/no external participants) will be automatically shared with.
- workspace The whole workspace.
- none Nobody.
one of
workspacenone auto_share_recordings_target_local_externalstring- Defines who local_capture recordings of External Meetings (with external participants) will be automatically
shared with.
- workspace The whole workspace.
- none Nobody.
one of
workspacenone auto_share_recordings_target_local_internalstring- Defines who local_capture recordings of Internal Meetings (w/no external participants) will be automatically
shared with.
- workspace The whole workspace.
- none Nobody.
one of
workspacenone default_recordings_share_statestring- Defines authorization for a recording with said recording's link.
- public Anyone with the recording link will be able to see it.
- workspace Anyone in your workspace with the recording link will be able to see it.
- restricted Only people with explicit access will be able to see the recording.
one of
publicworkspacerestricted recap_share_modestring- Auto-share with participants: defines which meeting participants get access to a bot recording.
Shared participants outside the workspace receive an email; workspace members see it in Grain.
- all Everyone: all participants, including external guests.
- internal Internal only: participants from your internal email domains.
- workspace Workspace only: participants in your Grain workspace.
one of
allinternalworkspace recap_share_mode_localstring- Auto-share with participants: defines which meeting participants get access to a local_capture recording.
Shared participants outside the workspace receive an email; workspace members see it in Grain.
- all Everyone: all participants, including external guests.
- internal Internal only: participants from your internal email domains.
- workspace Workspace only: participants in your Grain workspace.
- none No one: not shared with participants.
one of
allinternalworkspacenone
grainmcp_workspace_seat_infoReturns the number of total, assigned, and unassigned paid seats in the workspace.WriteWorkspace Seat Info
Returns the number of total, assigned, and unassigned paid seats in the workspace.
Inputs
This tool takes no inputs.
grainmcp_workspace_settingsLists a number of settings that affect your entire workspace.WriteWorkspace Settings
Lists a number of settings that affect your entire workspace. Meeting capture and sharing settings are workspace-wide defaults; team settings (`list_team_settings`) and personal overrides (`list_user_settings`) take precedence where set. You can use `update_workspace_settings` to update these settings.
Inputs
This tool takes no inputs.
grainmcp_remove_tag_from_meetingsRemove a tag from up to 50 Grain meetings you can access, using their meeting IDs.DestructiveRemove Tag From Meetings
Remove a tag from up to 50 Grain meetings you can access, using their meeting IDs. Detaches the tag from the selected meetings.
Inputs
meeting_idsarrayrequired- Meeting IDs to tag or untag.
tagstringrequired- The tag name to add or remove. Must start with a letter or digit, followed by letters, digits, or hyphens.
grainmcp_remove_user_from_teamRemoves a user from a team.DestructiveRemove User From Team
Removes a user from a team.
Inputs
team_idstringrequired- ID of the team.
user_idstringrequired- ID of the user to remove.
shared_media_strategystring- Controls what happens to media shared to the team by this user.
- retain Media remains shared to the team. (default)
- remove Media is unshared from the team.
one of
retainremove
grainmcp_tag_meetingsAdd or remove a tag from one or more meetings by recording ID.DestructiveTag Meetings
Add or remove a tag from one or more meetings by recording ID. Creates the tag if it doesn't exist (on add).
Inputs
actionstringrequired- Whether to add or remove the tag.one of
addremove recording_idsarrayrequired- Recording IDs to tag or untag.
tagstringrequired- The tag name to add or remove. Must start with a letter or digit, followed by letters, digits, or hyphens.
No tools match.
Workflows
Search meeting transcripts
Use grainmcp_search_in_transcripts to find relevant segments across all meeting recordings using hybrid semantic and keyword search.
const segments = await actions.executeTool({ connector: 'grainmcp', identifier: 'user_123', toolName: 'grainmcp_search_in_transcripts', toolInput: { search_queries: ['pricing objection', 'competitor mention'], limit: 10, },});console.log(segments);segments = actions.execute_tool( connection_name="grainmcp", identifier="user_123", tool_name="grainmcp_search_in_transcripts", tool_input={ "search_queries": ["pricing objection", "competitor mention"], "limit": 10, },)print(segments)Fetch meeting notes and action items
Use grainmcp_fetch_meeting_notes and grainmcp_fetch_meeting_action_items to retrieve AI-generated notes and extracted action items for a specific meeting.
// Fetch AI notesconst notes = await actions.executeTool({ connector: 'grainmcp', identifier: 'user_123', toolName: 'grainmcp_fetch_meeting_notes', toolInput: { meeting_id: 'meeting_abc123' },});
// Fetch action itemsconst actions_result = await actions.executeTool({ connector: 'grainmcp', identifier: 'user_123', toolName: 'grainmcp_fetch_meeting_action_items', toolInput: { meeting_id: 'meeting_abc123' },});console.log(notes, actions_result);# Fetch AI notesnotes = actions.execute_tool( connection_name="grainmcp", identifier="user_123", tool_name="grainmcp_fetch_meeting_notes", tool_input={"meeting_id": "meeting_abc123"},)
# Fetch action itemsaction_items = actions.execute_tool( connection_name="grainmcp", identifier="user_123", tool_name="grainmcp_fetch_meeting_action_items", tool_input={"meeting_id": "meeting_abc123"},)print(notes, action_items)Create a clip and add it to a story
Use grainmcp_create_clip to extract a video segment from a recording, then grainmcp_add_clips_to_story to curate it into a shareable story.
// Step 1 — create a clipconst clip = await actions.executeTool({ connector: 'grainmcp', identifier: 'user_123', toolName: 'grainmcp_create_clip', toolInput: { meeting_id: 'meeting_abc123', clip_title: 'Customer feedback on pricing', start_ms: 300000, end_ms: 360000, },});const clipId = clip.data?.id;
// Step 2 — add to an existing storyawait actions.executeTool({ connector: 'grainmcp', identifier: 'user_123', toolName: 'grainmcp_add_clips_to_story', toolInput: { story_id: 'story_xyz789', clip_ids: [clipId], },});# Step 1 — create a clipclip = actions.execute_tool( connection_name="grainmcp", identifier="user_123", tool_name="grainmcp_create_clip", tool_input={ "meeting_id": "meeting_abc123", "clip_title": "Customer feedback on pricing", "start_ms": 300000, "end_ms": 360000, },)clip_id = clip.data.get("id")
# Step 2 — add to an existing storyactions.execute_tool( connection_name="grainmcp", identifier="user_123", tool_name="grainmcp_add_clips_to_story", tool_input={ "story_id": "story_xyz789", "clip_ids": [clip_id], },)