AssemblyAI MCP server for AI agents

Live

API KEY

TRANSCRIPTION

Transcription

AssemblyAI gives your agent transcription for audio and video files: submit recordings, read transcripts by sentence or paragraph, export subtitles, run summaries and action items, and prompt LLMs over transcripts.

  • Per-user credentials: each call uses the actual user's API key, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
AssemblyAI
agent · Acme Q3
Run
Transcribe this webinar recording with speaker labels.
S
assemblyai_create_transcript
152ms
Transcription agent
I submitted the recording with speaker labels on. The transcript is queued, and I will read it once processing completes.
Sources: AssemblyAI, 1 transcript
assemblyai
1 transcript
18:29
Message Claude...

Tools your transcription agent reaches for on AssemblyAI, scoped per user.

CALL ANY TOOL
12 tools for transcription in AssemblyAI: create and list transcripts, split them into sentences and paragraphs, search words, export subtitles, get redacted audio, run speech understanding tasks, and prompt LLMs over transcripts.
assemblyai_create_chat_completion
Create chat completion
Send a prompt or chat messages to an LLM through AssemblyAI's LLM Gateway, optionally with a transcript's text inserted, to summarize, answer questions about or extract data from audio. Returns choices with the model's message (content and any tool_calls), finish_reason, usage token counts and request_id. Use this for free-form prompts over transcripts (the replacement for LeMUR). Use assemblyai_run_speech_understanding for built-in translation, speaker identification, custom formatting, summaries or action items. Get a valid model ID from assemblyai_list_llm_models. To use a transcript, it must be completed; reference it with transcript_id and the {{ transcript }} tag.
Parameters
Name
Type
Required
Description
model
string
Required
ID of the LLM to use, from assemblyai_list_llm_models, for example claude-sonnet-4-5-20250929, gpt-4.1 or gemini-2.5-flash-lite. Never guess it; check the model list. Example: gemini-2.5-flash-lite
fallback_config
object
Optional
Fallback behaviour: retry (default true) retries once after 500 ms, and depth (1 or 2, default 1) caps how many fallbacks are tried. Example: {"retry": true, "depth": 2}
fallbacks
array
Optional
Fallback models to try in order when the primary model fails. Each item needs a model and can override other request fields. Example: [{"model": "claude-sonnet-4-6"}]
max_tokens
integer
Optional
Maximum number of tokens to generate. Defaults to 1000. Example: 1500
messages
array
Optional
Conversation so far, as objects with role (system, user, assistant or tool) and content. Provide messages or prompt. To use a transcript, put the tag {{ transcript }} in a message and set transcript_id. Example: [{"role": "system", "content": "You summarize calls."}, {"role": "user", "content": "Summarize this call: {{ transcript }}"}]
model_region
string
Optional
Set to global to route to the provider's global (non-regional) endpoints for lower cost. Currently live for Anthropic Claude models. Leave empty for in-region processing. One of: `global`.
post_processing_steps
array
Optional
Steps applied to the model's answer. The only step today is json-repair, which fixes malformed JSON. Example: [{"type": "json-repair"}]
prompt
string
Optional
A single prompt, sent as one user message. Use instead of messages for one-shot requests. Can contain the {{ transcript }} tag. Example: List the action items in this meeting: {{ transcript }}
response_format
object
Optional
Constrain the answer to JSON that matches a schema: {"type": "json_schema", "json_schema": {"name": ..., "schema": {...}, "strict": true}}. Not supported by gpt-oss models. Example: {"type": "json_schema", "json_schema": {"name": "summary", "schema": {"type": "object", "properties": {"summary": {"type": "string"}}, "required": ["summary"]}, "strict": true}}
temperature
number
Optional
Randomness from 0 to 2; lower is more deterministic. Leave empty for the model's default. Example: 0.2
tool_choice
string
Optional
Which tool the model may call: none, auto, or {"type": "function", "function": {"name": "get_weather"}} to force one. Example: auto
tools
array
Optional
Functions the model may call, each {"type": "function", "function": {"name": ..., "description": ..., "parameters": <JSON Schema>}}. Tool calls come back in choices[].message.tool_calls; send results back as role tool messages. Example: [{"type": "function", "function": {"name": "get_weather", "parameters": {"type": "object", "properties": {"city": {"type": "string"}}}}}]
transcript_id
string
Optional
ID of a completed AssemblyAI transcript whose text replaces the first {{ transcript }} tag in the messages or prompt. Example: 0072a82b-aa22-4962-add2-6121c36c17c6
assemblyai_create_transcript
Create transcript
assemblyai_delete_transcript
Delete transcript
assemblyai_get_redacted_audio
Get redacted audio
assemblyai_get_subtitles
Get subtitles
assemblyai_get_transcript
Get transcript
assemblyai_get_transcript_paragraphs
Get transcript paragraphs
assemblyai_get_transcript_sentences
Get transcript sentences
assemblyai_list_llm_models
List llm models
assemblyai_list_transcripts
List transcripts
assemblyai_run_speech_understanding
Run speech understanding
assemblyai_search_transcript_words
Search transcript words
Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// AssemblyAI tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["assemblyai"], toolNames: [
    "assemblyai_create_transcript",
    "assemblyai_get_transcript",
    "assemblyai_run_speech_understanding"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Transcribe this webinar recording and list the action items" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["assemblyai"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Transcribe this webinar recording and list the action items" }],
  tools,
});

// Execute the tool call with the user's vaulted AssemblyAI API key
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["assemblyai"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Transcribe this webinar recording and list the action items" }],
  tools,
});

// Tool call runs with the user's vaulted AssemblyAI API key
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["assemblyai"] }, pageSize: 100,
});

const agent = new Agent({
  name: "transcription_agent",
  model: "gemini-2.5-pro",
  instruction: "AssemblyAI tools scoped to this user",
  tools,
});

await agent.run("Transcribe this webinar recording and list the action items");
Try these prompts
Copy any prompt into your agent. Each maps directly to a AssemblyAI tool. Click to copy, paste into your agent, done.
Transcribe
Copy the prompt
Copied
Transcribe this recording URL with speaker labels and PII redaction.
Copy the prompt
Copied
List the transcripts created in the last 7 days.
Copy the prompt
Copied
Check whether yesterday's transcript has finished processing.
Read and export
Copy the prompt
Copied
Split this transcript into paragraphs with timestamps.
Copy the prompt
Copied
Export this transcript as SRT subtitles.
Copy the prompt
Copied
Find every mention of pricing in this transcript.
Understand
Copy the prompt
Copied
Summarize this transcript and list the action items.
Copy the prompt
Copied
Translate this transcript into Spanish.
Copy the prompt
Copied
Ask an LLM which objections the customer raised in this call.
SEE HOW AUTH WORKS
Each user connects their own AssemblyAI API key once, and Scalekit sends it with every call. Keys stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
AssemblyAI
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
AssemblyAI
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
AssemblyAI
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
AssemblyAI
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other transcription and AI connectors.
Support and Ops Teams
Meeting prep
Pulls agenda, participant context, and open action items before every meeting.
GTM and RevOps Teams
Sales call prep agent
Reads tomorrow's calls from Google Calendar, mines past Granola notes and Attio history for context, and delivers each rep a prep brief in Slack, scoped to the calls that rep actually owns.
Test other agents
See the same per-user auth pattern across other transcription and AI connectors.
OPS
Meeting prep agent
Assemble the agenda, HubSpot attendee history, and open action items from Gmail before every meeting on the calendar.
SALES
Sales call prep agent
Read tomorrow's calls from Google Calendar, mine Granola notes and Attio history, and deliver each rep a prep brief in Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared AssemblyAI API key looks fine in a demo. In production every transcript looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared key
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
AssemblyAI today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access AssemblyAI as the user or through a shared key?
As the user. Each user connects their own AssemblyAI API key once, and Scalekit sends it with every call. Audit logs attribute every transcript the agent creates or deletes to that user, not a shared service account.
Where is the AssemblyAI API key stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new API key. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in AssemblyAI?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the transcript and export tools without assemblyai_delete_transcript, which permanently deletes a transcript's data and any file uploaded for it. Scalekit also enforces scope checks before every API call.
What happens when a user revokes AssemblyAI access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Which transcripts can the agent see?
Transcripts created with the project behind the user's AssemblyAI API key. assemblyai_list_transcripts returns the ones from the last 30 days, newest first, and assemblyai_get_transcript fetches any one of them by ID.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""assemblyai"": {
""url"": ""https://mcp.scalekit.com/assemblyai"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.assemblyai]
url = ""https://mcp.scalekit.com/assemblyai""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""assemblyai"": {
""url"": ""https://mcp.scalekit.com/assemblyai"",
""type"": ""http""
}
}
}