Grain MCP
Vendor MCP41 toolsOAuth 2.1/DCRTranscriptionCollaborationAIGrain is a meeting recording and intelligence platform. Use this connector to search and retrieve meeting recordings, transcripts, notes, action items...
Grain MCP connector
-
Install the SDK
Section titled “Install the SDK”Terminal window npm install @scalekit-sdk/nodeTerminal window pip install scalekit -
Set your credentials
Section titled “Set 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> -
Set up the connector
Section titled “Set up the connector”Register your Grain MCP credentials with Scalekit so it handles the token lifecycle. You do this once per environment.
Dashboard setup steps
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 and make your first call
Section titled “Authorize and make your first call”quickstart.ts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENV_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)process.stdout.write('Press Enter after authorizing...')await new Promise(r => process.stdin.once('data', r))// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'grainmcp_list_all_deals',toolInput: {},})console.log(result)quickstart.py import osfrom scalekit.client import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENV_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_list_all_deals",connection_name=connection_name,identifier=identifier,)print(result)
What you can do
Section titled “What you can do”Connect this agent connector to let your agent:
- Update my settings, collection share state, project share state — Update your personal settings
- Myself records — Get information about the logged-in Grain user
- Team my — Get the settings of the team you belong to
- Settings my — Get your personal settings
- List smart topics, collections, workspace users — Lists the smart topics configured in your Grain workspace
- Get dossier for company — Fetches the Company Intelligence dossier for a single company by
company_id(the id returned bysearch_companies)
Common workflows
Section titled “Common 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({ connectionName: '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({ connectionName: 'grainmcp', identifier: 'user_123', toolName: 'grainmcp_fetch_meeting_notes', toolInput: { meeting_id: 'meeting_abc123' },});
// Fetch action itemsconst actions_result = await actions.executeTool({ connectionName: '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({ connectionName: '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({ connectionName: '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], },)Tool list
Section titled “Tool list”Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.
grainmcp_add_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.2 params
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.
clip_idsarrayrequiredList of clip IDs to add to the story. Use create_clip or list_clips to get clip IDs.story_idstringrequiredID of the story to add clips to.grainmcp_add_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.2 params
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.
collection_idstringrequiredThe collection ID to add recordings to.recording_idsarrayrequiredRecording IDs to add to the collection.grainmcp_add_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.2 params
Adds one or more recordings to an existing project by recording ID. Use list_meetings or search_in_transcripts first to find recording IDs.
project_idstringrequiredThe project ID to add recordings to.recording_idsarrayrequiredRecording IDs to add to the project.grainmcp_create_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.
4 params
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.
clip_titlestringrequiredTitle for the clip.end_msintegerrequiredTimestamp in milliseconds where the clip should end.meeting_idstringrequiredThe meeting ID to create a clip on.start_msintegerrequiredTimestamp in milliseconds where the clip should start.grainmcp_create_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.
1 param
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.
titlestringrequiredThe title for the new collection.grainmcp_create_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.1 param
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.
titlestringrequiredThe title for the new project.grainmcp_create_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.
5 params
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.
descriptionstringrequiredA short description of what the topic captures.examplesarrayrequiredExample keywords (1-2 words) and phrases that exemplify the topic. 1-50 items, each at least 3 characters.namestringrequiredThe 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_scopestringoptionalWhich meetings to match: all, only external (with guests), or only internal. Defaults to all.speaker_scopestringoptionalWhose speech to match against: all speakers, external speakers, or internal speakers. Defaults to all.grainmcp_create_story#Creates a new story with the given title.3 params
Creates a new story with the given title.
titlestringrequiredThe title for the new story.clip_idsarrayoptionalOptional list of clip IDs to be added to the story.descriptionstringoptionalOptional description for the story.grainmcp_fetch_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.
1 param
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.
collection_idstringrequiredID of a collection.grainmcp_fetch_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.
1 param
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.
deal_idstringrequiredID of a deal.grainmcp_fetch_meeting#Fetches information about a single Grain meeting by ID.
The response format is the same as is returned by list_meetings.
1 param
Fetches information about a single Grain meeting by ID. The response format is the same as is returned by list_meetings.
meeting_idstringrequiredID of a meeting.grainmcp_fetch_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.
1 param
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.
meeting_idstringrequiredID of a meeting.grainmcp_fetch_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.
1 param
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.
meeting_idstringrequiredID of a meeting.grainmcp_fetch_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.
1 param
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.
meeting_idstringrequiredID of a meeting.grainmcp_fetch_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.
1 param
Fetches the full transcript of a single Grain meeting by ID. Returns the entire conversation as markdown, which can be large for long meetings.
meeting_idstringrequiredID of a meeting.grainmcp_fetch_project#Fetches detailed information about a single Grain project by ID,
including the list of recordings it contains with their URLs.
1 param
Fetches detailed information about a single Grain project by ID, including the list of recordings it contains with their URLs.
project_idstringrequiredID of a project.grainmcp_fetch_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.
1 param
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.
story_idstringrequiredID of the story to fetch.grainmcp_fetch_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.1 param
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.
meeting_idstringrequiredID of a meeting.grainmcp_get_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.
1 param
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.
company_idstringrequiredCompany id fetched using `search_companies`.grainmcp_list_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.
3 params
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.
cursorstringoptionalOptional cursor value from a previous request in order to fetch the next page of results.filtersobjectoptionalOptional filters that can be used to reduce the result set of deals that are searched against.limitintegeroptionalNumber of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.grainmcp_list_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.
3 params
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.
cursorstringoptionalOptional cursor value from a previous request in order to fetch the next page of results.filtersobjectoptionalOptional filters that can be used to reduce the result set of meetings that are searched against.limitintegeroptionalNumber of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.grainmcp_list_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.
3 params
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.
cursorstringoptionalOptional cursor value from a previous request in order to fetch the next page of results.filtersobjectoptionalOptional filters to narrow down the list of clips.limitintegeroptionalNumber of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.grainmcp_list_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.
3 params
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.
cursorstringoptionalOptional cursor value from a previous request in order to fetch the next page of results.filtersobjectoptionalOptional filters that can be used to reduce the result set of meetings that are searched against.limitintegeroptionalNumber of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.grainmcp_list_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.
3 params
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.
cursorstringoptionalOptional cursor value from a previous request in order to fetch the next page of results.filtersobjectoptionalOptional filters to narrow down the list of collections.limitintegeroptionalNumber of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.grainmcp_list_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.
3 params
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.
cursorstringoptionalOptional cursor value from a previous request in order to fetch the next page of results.filtersobjectoptionalOptional filters that can be used to reduce the result set of meetings that are searched against.limitintegeroptionalNumber of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.grainmcp_list_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.
3 params
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.
cursorstringoptionalOptional cursor value from a previous request in order to fetch the next page of results.filtersobjectoptionalOptional filters that can be used to reduce the result set of deals that are searched against.limitintegeroptionalNumber of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.grainmcp_list_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.
3 params
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.
cursorstringoptionalOptional cursor value from a previous request in order to fetch the next page of results.filtersobjectoptionalOptional filters to narrow down the list of projects.limitintegeroptionalNumber of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.grainmcp_list_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.
1 param
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.
include_inactivebooleanoptionalInclude deactivated smart topics in the result. Defaults to false.grainmcp_list_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.
3 params
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.
cursorstringoptionalOptional cursor value from a previous request in order to fetch the next page of results.filtersobjectoptionalOptional filters to narrow down the list of stories.limitintegeroptionalNumber of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.grainmcp_list_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.0 params
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.
grainmcp_my_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.
0 params
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.
grainmcp_my_team#Get the settings of the team you belong to.
You can use `my_settings` to see your personal setting overrides.
0 params
Get the settings of the team you belong to. You can use `my_settings` to see your personal setting overrides.
grainmcp_myself#Get information about the logged-in Grain user.0 params
Get information about the logged-in Grain user.
grainmcp_resolve_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.
1 param
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.
itemsarrayrequiredList of entity references to resolve URLs for.grainmcp_search_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.
3 params
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.
search_stringsarrayrequiredCompany names or domains to search for. Pass all requested companies in one call.filtersobjectoptionalOptional filters that can be used to reduce the result set of meetings that are searched against.limitintegeroptionalNumber of results to return per search string. Value should be between 1 and 20. If not specified, the default is 3.grainmcp_search_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.
5 params
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.
search_queriesarrayrequiredArray 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
filtersobjectoptionalOptional filters that can be used to reduce the result set of meetings that are searched against.limitintegeroptionalNumber of results to return per request page. Value should be between 1 and 50. If not specified, the default is 10.meeting_idsarrayoptionalOptional 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.offsetintegeroptionalNumber of results to skip for pagination. Use with `limit` to page through results beyond the first page. Defaults to 0.grainmcp_search_persons#Returns a filtered list of persons that were participants of Grain meetings you have
access to.
3 params
Returns a filtered list of persons that were participants of Grain meetings you have access to.
filtersobjectoptionalOptional filters that can be used to reduce the result set of meetings that are searched against.limitintegeroptionalNumber of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.search_stringstringoptionalOnly search persons whose name or email contains the specified substring.grainmcp_tag_meetings#Add or remove a tag from one or more meetings by recording ID. Creates the tag if it doesn't exist (on add).3 params
Add or remove a tag from one or more meetings by recording ID. Creates the tag if it doesn't exist (on add).
actionstringrequiredWhether to add or remove the tag.recording_idsarrayrequiredRecording IDs to tag or untag.tagstringrequiredThe tag name to add or remove. Must start with a letter or digit, followed by letters, digits, or hyphens.grainmcp_update_my_settings#Update your personal settings.
Set a field to null to unset your override and fall back to your team's setting.
10 params
Update your personal settings. Set a field to null to unset your override and fall back to your team's setting.
auto_record_mode_externalstringoptionalOverrideable
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 setting.
auto_record_mode_internalstringoptionalOverrideable
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 setting.
auto_record_mode_unscheduledstringoptionalOverrideable
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 setting.
auto_share_recordings_externalbooleanoptionalOverrideable
Defines if bot recordings of External Meetings (with external participants) will be automatically shared to the
user's team. Set to null to unset the override, falling back to the team setting.
auto_share_recordings_internalbooleanoptionalOverrideable
Defines if bot recordings of Internal Meetings (w/no external participants) will be automatically shared to the
user's team. Set to null to unset the override, falling back to the team setting.
default_recordings_share_statestringoptionalOverrideable
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 setting.
local_auto_share_recordings_externalbooleanoptionalOverrideable
Defines if local_capture recordings of External Meetings (with external participants) will be automatically
shared to the user's team. Set to null to unset the override, falling back to the team setting.
local_auto_share_recordings_internalbooleanoptionalOverrideable
Defines if local_capture recordings of Internal Meetings (w/no external participants) will be automatically
shared to the user's team. Set to null to unset the override, falling back to the team setting.
local_recap_share_modestringoptionalOverrideable
Defines if and to whom the email recap will be shared with after a local_capture recording.
- all Email Recap will be sent to all participants.
- internal Email Recap will be sent to all internal participants.
- none Email Recap will not be sent.
- null Unsets the override, falling back to the team setting.
recap_share_modestringoptionalOverrideable
Defines if and to whom the email recap will be shared with after a bot recording.
- all Email Recap will be sent to all participants.
- internal Email Recap will be sent to all internal participants.
- none Email Recap will not be sent.
- null Unsets the override, falling back to the team setting.