MULTI-APP TOOLKIT
Build with Grain + Rev.ai
- Multi-app
- One MCP session
- 11 actions
- 9 triggers
- Managed auth
MCP
One MCP session, both toolsets
One session gives your product or agent every Grain and Rev.ai tool at once — connect once, list tools, and call them like any single-app session.
// accessToken: mint a short-lived token with the Connect SDK — see the MCP guide
const transport = new StreamableHTTPClientTransport(
new URL("https://remote.mcp.pipedream.net/v3"),
{
requestInit: {
headers: {
Authorization: `Bearer ${accessToken}`,
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
"x-pd-app-slug": "grain,rev_ai",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// One list, both toolsets: Grain and Rev.ai tools arrive
// together, each keyed by its own app's slug.
// e.g. run Download Recording:
const result = await mcp.callTool({
name: "grain-download-recording",
arguments: {
recordingId: "Recording ID",
syncDir: "SyncDir",
},
})import { PipedreamClient } from "@pipedream/sdk"
const pd = new PipedreamClient({
projectId: process.env.PIPEDREAM_PROJECT_ID!,
clientId: process.env.PIPEDREAM_CLIENT_ID!,
clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
projectEnvironment: "production",
})
const externalUserId = "{external_user_id}" // any stable ID for this user in your system
const [grainTools, revAiTools] =
await Promise.all([
pd.components.list({ app: "grain" }),
pd.components.list({ app: "rev_ai" }),
])
// One external user owns both connected accounts, so either app's tools
// run on their behalf with the same externalUserId.curl "https://api.pipedream.com/v1/connect/{project_id}/components?app=grain" \
-H "X-PD-Environment: production" \
-H "Authorization: Bearer {access_token}"
curl "https://api.pipedream.com/v1/connect/{project_id}/components?app=rev_ai" \
-H "X-PD-Environment: production" \
-H "Authorization: Bearer {access_token}"
# Connect both accounts to the same external_user_id, then
# configure and invoke either app's tools on that user's behalf.ARCHITECTURE
One user, two connected accounts
Your user connects each account once, under whatever ID they already have in your product. The two stay independent — either can be revoked on its own — and your code reaches both through that one user.
Your product
external_user_id
{external_user_id}Pipedream Connect
Managed identity
Auth · tools · routing
Grain
Connected account
Rev.ai
Connected account
TOOLS
Grain tools
The Grain tools this pairing puts in reach, each one running on your user's own connected account.
Actions top 8 of 9
-
Download Recording
actionDownloads a Grain recording's media file (video or audio) and writes it to File Stash, returningfilePath,filename, andcontentType. Only recordings with processed media have a downloadable file — checkmedia_type(videooraudio, nottranscript) from List Recordings or Get Recording first. Use Get Transcript instead if you only need the spoken content, not the media file itself. Example:recordingId: "8a089fcb-0961-4393-8da2-f0db5f8cfd79"downloads the file and returns{"filePath": "/tmp/grain-recording-8a089fcb-....mp4", "filename": "grain-recording-8a089fcb-....mp4", "contentType": "video/mp4"}. See the documentationRead-onlyv0.0.1 -
Get Recording
actionFetches a specific recording by its ID from Grain, returning its metadata (title, times, URL, tags, teams, meeting type). Enable the optional include props to add highlights, participants, AI action items, AI summary, calendar event, HubSpot data, or screenshares to the response. Use List Recordings to find recording IDs, and Get Transcript to fetch the full transcript. Example:recordingId: "pppp6666-qq77-rr88-ss99-tttt00000000"withaiSummary: truereturns the recording's metadata plus{"ai_summary": {"text": "..."}}. See the documentationRead-onlyv1.0.2 -
Get Transcript
actionFetches the full transcript of a Grain recording. Thejsonformat returns structured segments with speaker, participant ID, start/end times in milliseconds, and text;txt,vtt, andsrtreturn plain text or subtitle formats. Use List Recordings to find recording IDs; use Get Recording for the recording's metadata instead of its transcript. Example:recordingId: "pppp6666-qq77-rr88-ss99-tttt00000000"withformat: "txt"returns plain text like"Speaker 1: Thanks for joining today...". See the documentationRead-onlyv0.0.3 -
List Meeting Types
actionLists the meeting types configured in your Grain workspace (id, name, scope), where scope isinternalorexternal. Use this to understand how recordings are categorized, or to resolve a meeting type's ID for filtering. Example: returns[{"id": "e8b894a9-7ecf-4330-a282-527c085618fd", "name": "Sales", "scope": "external"}, {"id": "815747d1-9e25-40f6-a3b8-e1908e25151e", "name": "1:1s", "scope": "internal"}]. See the documentationRead-onlyv0.0.1 -
List Recordings
actionLists Grain recordings, optionally filtered by start datetime range (ISO8601), title search, participant scope, team, or meeting type. Automatically paginates and returns up to Max Results recordings. Use this to find recording IDs for Get Recording and Get Transcript. Example:titleSearch: "Acme"returns recordings like[{"id": "pppp6666-qq77-rr88-ss99-tttt00000000", "title": "Acme Renewal Call", "start_datetime": "2026-01-05T15:00:00Z", "media_type": "video", ...}]. Passfieldsto return only the fields you need instead of the full object. See the documentationRead-onlyv0.1.0 -
List Teams
actionLists the teams in your Grain workspace (id, name). Use this to resolve a team's ID before sharing a recording with it via Manage Recording Sharing. Example: returns[{"id": "a414c333-c9fe-4fdc-9131-fb31796699b2", "name": "Pipedream"}]. See the documentationRead-onlyv0.0.1 -
List Users
actionLists the users in your Grain workspace (id, name, email). Use this to resolve a user's ID before sharing a recording with them via Manage Recording Sharing, or to identify who's who when reviewing recording participants. Example: returns[{"id": "d91b7ed0-a149-425c-9623-0664148e4fc1", "name": "Danny Archer", "email": "darcher@pipedream.com"}]. See the documentationRead-onlyv0.0.1 -
Manage Recording Sharing
actionShares or unshares a recording with a specific user or team. Use List Recordings to find the recording's ID, and List Users or List Teams to resolve the target's ID. Setoperationtoshareto grant access orunshareto revoke it, andtargetTypetouserorteam. Example:recordingId: "pppp6666-qq77-rr88-ss99-tttt00000000", operation: "share", targetType: "user", targetId: "d91b7ed0-a149-425c-9623-0664148e4fc1"shares the recording with that user and returns{"success": true}. See the documentationWritev0.0.1
Triggers top 4 of 9
-
New Highlight (Instant)
triggerEmit new event when a highlight is added. See the documentationInstantv1.0.1 -
New Highlight Removed (Instant)
triggerEmit new event when a highlight is removed. See the documentationInstantv1.0.1 -
New Highlight Updated (Instant)
triggerEmit new event when a highlight is updated. Deduplicates retried webhook deliveries of the same update; each distinct update still emits. See the documentationInstantv1.1.0 -
New Recording (Instant)
triggerEmit new event when a recording is added. See the documentationInstantv1.0.1
TOOLS
Rev.ai tools
The Rev.ai tools this pairing puts in reach, each one running on your user's own connected account.
Actions
-
Get Transcript By Id
actionReturns the transcript for a completed transcription job. Transcript can be returned as either JSON or plaintext format.Read-onlyv0.1.2 -
Submit Transcription Job
actionStarts an asynchronous job to transcribe speech-to-text for a media file. Add an optional callback URL to invoke when processing is complete.Writev0.1.3
Triggers
No Rev.ai triggers are available yet.
MULTI-APP
Works with more apps
The combinations customers connect alongside these two — nothing here is limited to a pair.
REFERENCE
Toolkit details
- x-pd-app-slug
- grain,rev_ai
- Primary app
- Grain (grain)
- Second app
- Rev.ai (rev_ai)
- Authentication
- OAuth + API key
- Available actions
- 11
- Available triggers
- 9