Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Grain MCP connector

OAuth 2.1/DCR TranscriptionCollaborationAI

Grain is a meeting recording and intelligence platform. Use this connector to search and retrieve meeting recordings, transcripts, notes, action items...

Grain MCP connector

  1. Terminal window
    npm install @scalekit-sdk/node

    Full SDK reference: Node.js | Python

  2. Add your Scalekit credentials to your .env file. 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>
  3. 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.

    1. Create a connection in Scalekit

      • In the Scalekit dashboard, go to AgentKitConnectionsCreate Connection.
      • Search for Grain MCP and click Create.
      • Note the Connection name — use this as connection_name in your code (e.g., grainmcp).
    2. 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.

  4. 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.actions
    const connector = 'grainmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { 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 call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'grainmcp_list_all_deals',
    toolInput: {},
    })
    console.log(result)

Connect this agent connector to let your agent:

  • Update project share state — Changes the visibility of a project
  • Meetings tag — Add or remove a tag from one or more meetings by recording ID
  • Search persons, in transcripts, companies — Returns a filtered list of persons that were participants of Grain meetings you have access to
  • Urls resolve — Resolves canonical shareable URLs for Grain entities (meetings, clips, projects, stories) by ID
  • List workspace users, stories, projects — Get information about all the users in the logged-in Grain user’s workspace
  • Fetch user recording notes, story, project — Fetches the current user’s private notes for a single Grain meeting by ID

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);

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 notes
const notes = await actions.executeTool({
connectionName: 'grainmcp',
identifier: 'user_123',
toolName: 'grainmcp_fetch_meeting_notes',
toolInput: { meeting_id: 'meeting_abc123' },
});
// Fetch action items
const 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);

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 clip
const 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 story
await actions.executeTool({
connectionName: 'grainmcp',
identifier: 'user_123',
toolName: 'grainmcp_add_clips_to_story',
toolInput: {
story_id: 'story_xyz789',
clip_ids: [clipId],
},
});

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.

Name Type Required Description
clip_ids array required List of clip IDs to add to the story. Use create_clip or list_clips to get clip IDs.
story_id string required ID of the story to add clips to.
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.

Name Type Required Description
project_id string required The project ID to add recordings to.
recording_ids array required Recording 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.

Name Type Required Description
clip_title string required Title for the clip.
end_ms integer required Timestamp in milliseconds where the clip should end.
meeting_id string required The meeting ID to create a clip on.
start_ms integer required Timestamp in milliseconds where the clip should start.
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.

Name Type Required Description
title string required The title for the new project.
grainmcp_create_story # Creates a new story with the given title. 3 params

Creates a new story with the given title.

Name Type Required Description
title string required The title for the new story.
clip_ids array optional Optional list of clip IDs to be added to the story.
description string optional Optional description for the story.
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.

Name Type Required Description
deal_id string required ID 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.

Name Type Required Description
meeting_id string required ID 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.

Name Type Required Description
meeting_id string required ID 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.

Name Type Required Description
meeting_id string required ID 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.

Name Type Required Description
meeting_id string required ID 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.

Name Type Required Description
meeting_id string required ID 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.

Name Type Required Description
project_id string required ID 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.

Name Type Required Description
story_id string required ID 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.

Name Type Required Description
meeting_id string required ID of a meeting.
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.

Name Type Required Description
cursor string optional Optional cursor value from a previous request in order to fetch the next page of results.
filters object optional Optional filters that can be used to reduce the result set of deals that are searched against.
limit integer optional 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_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.

Name Type Required Description
cursor string optional Optional cursor value from a previous request in order to fetch the next page of results.
filters object optional Optional filters that can be used to reduce the result set of meetings that are searched against.
limit integer optional Number 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.

Name Type Required Description
cursor string optional Optional cursor value from a previous request in order to fetch the next page of results.
filters object optional Optional filters to narrow down the list of clips.
limit integer optional 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_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.

Name Type Required Description
cursor string optional Optional cursor value from a previous request in order to fetch the next page of results.
filters object optional Optional filters that can be used to reduce the result set of meetings that are searched against.
limit integer optional Number 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.

Name Type Required Description
cursor string optional Optional cursor value from a previous request in order to fetch the next page of results.
filters object optional Optional filters that can be used to reduce the result set of meetings that are searched against.
limit integer optional 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_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.

Name Type Required Description
cursor string optional Optional cursor value from a previous request in order to fetch the next page of results.
filters object optional Optional filters that can be used to reduce the result set of deals that are searched against.
limit integer optional Number 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.

Name Type Required Description
cursor string optional Optional cursor value from a previous request in order to fetch the next page of results.
filters object optional Optional filters to narrow down the list of projects.
limit integer optional Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
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.

Name Type Required Description
cursor string optional Optional cursor value from a previous request in order to fetch the next page of results.
filters object optional Optional filters to narrow down the list of stories.
limit integer optional Number 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_resolve_urls # Resolves canonical shareable URLs for Grain entities (meetings, clips, projects, stories) by ID. Always prefer this tool over constructing URLs yourself; hand-built URLs are frequently wrong. Supported `media_type` values: `recording`, `clip`, `project`, `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, projects, stories) by ID. Always prefer this tool over constructing URLs yourself; hand-built URLs are frequently wrong. Supported `media_type` values: `recording`, `clip`, `project`, `story`. Each returned item contains either a `url` on success or an `error` string if the entity is not accessible to the current user.

Name Type Required Description
items array required List of entity references to resolve URLs for.
grainmcp_search_companies # Returns a filtered list of companies that were participants of Grain meetings you have access to. 3 params

Returns a filtered list of companies that were participants of Grain meetings you have access to.

Name Type Required Description
filters object optional Optional filters that can be used to reduce the result set of meetings that are searched against.
limit integer optional Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
search_string string optional Only search companies whose name or domain contains the specified substring.
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.

Name Type Required Description
search_queries array required 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
filters object optional Optional filters that can be used to reduce the result set of meetings that are searched against.
limit integer optional Number of results to return per request page. Value should be between 1 and 50. If not specified, the default is 10.
meeting_ids array optional 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.
offset integer optional Number 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.

Name Type Required Description
filters object optional Optional filters that can be used to reduce the result set of meetings that are searched against.
limit integer optional Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.
search_string string optional Only 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).

Name Type Required Description
action string required Whether to add or remove the tag.
recording_ids array required Recording IDs to tag or untag.
tag string required The tag name to add or remove. Must start with a letter or digit, followed by letters, digits, or hyphens.
grainmcp_update_project_share_state # Changes the visibility of a project. Options: 'restricted' (only shared users), 'workspace' (all workspace members), 'public' (anyone with the link). 2 params

Changes the visibility of a project. Options: 'restricted' (only shared users), 'workspace' (all workspace members), 'public' (anyone with the link).

Name Type Required Description
project_id string required The project ID to update.
share_state string required The new visibility level for the project.