The AssemblyAI MCP connector routes your AI agent's tool calls to AssemblyAI's own MCP server through Scalekit. Each user signs in to AssemblyAI once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 5 tools.
- Tools
- 5
- What they doRead · write · destructive
- 3 · 1 · 13 read1 write1 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 AssemblyAI MCP connection
In AgentKit > Connections, create an AssemblyAI MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for AssemblyAI MCP server, so you don't need to register an OAuth app.
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 = 'assemblyaimcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize AssemblyAI 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: 'assemblyaimcp_get_transcript',toolInput: { transcript_id: 'YOUR_TRANSCRIPT_ID' },})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 = "assemblyaimcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize AssemblyAI MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={"transcript_id":"YOUR_TRANSCRIPT_ID"},tool_name="assemblyaimcp_get_transcript",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_toolassemblyaimcp_get_transcriptFetch the current state of a transcript by id.Read-onlyGet AssemblyAI Transcript
Fetch the current state of a transcript by id. Returns the full transcript when `status` is `completed`, an error message when `status` is `error`, or just the in-progress status (`queued` / `processing`) otherwise. Poll this tool every ~3 seconds after `submit_transcript` until you see `completed` or `error`.
Inputs
transcript_idstringrequired- The transcript id returned by submit_transcript.
assemblyaimcp_summarize_transcriptGenerate a summary of a COMPLETED transcript using AssemblyAI's LLM Gateway.Read-onlySummarize AssemblyAI Transcript
Generate a summary of a COMPLETED transcript using AssemblyAI's LLM Gateway. First submit_transcript, then poll get_transcript until status=completed, then call this with the transcript_id. Choose a `style` or pass a `custom_prompt` for a tailored summary. For a CHAPTERED summary with timestamps/headlines, or decision-aware action items, use the `understand_transcript` tool (summarization / action_items features) instead — this tool is the freeform/custom-prompt option.
Inputs
transcript_idstringrequired- The id of a completed transcript (from submit_transcript / get_transcript).
custom_promptstring- Instruction used when style='custom' (or to override the canned style prompt).
stylestring- Summary style. Use 'custom' together with custom_prompt for a tailored summary.one of
bulletsparagraphheadlineaction_itemscustomdefaultbullets
assemblyaimcp_understand_transcriptRun Speech Understanding features on an ALREADY-COMPLETED transcript without re-submitting the audio: translation, speaker_identification, custom_formatting, summarization (chaptered, with timestamps + headlines), and action_items.Read-onlyRun Speech Understanding on a Transcript
Run Speech Understanding features on an ALREADY-COMPLETED transcript without re-submitting the audio: translation, speaker_identification, custom_formatting, summarization (chaptered, with timestamps + headlines), and action_items. First submit_transcript, then poll get_transcript until status=completed, then call this with the transcript_id. If the need is known before transcription, prefer passing speech_understanding to submit_transcript instead. speaker_identification (and translation's match_original_utterance) only work if the transcript was created with speaker_labels=true.
Inputs
speech_understandingobjectrequired- Feature requests, e.g. { request: { translation: { target_languages: ['es'] } } }. Multiple features may be combined in one call.
transcript_idstringrequired- The id of a completed transcript (from submit_transcript / get_transcript).
assemblyaimcp_submit_transcriptSubmit a public audio or video URL to AssemblyAI for transcription.WriteSubmit AssemblyAI Transcript
Submit a public audio or video URL to AssemblyAI for transcription. Returns immediately with a `transcript_id` and the current status (usually `queued`). The caller MUST then call `get_transcript` with the returned id in a loop (every ~3 seconds) until status becomes `completed` or `error`. Do not expect the transcript text from this tool — only the id. Enable `speaker_labels` whenever the user asks who said what or about speaker changes. Enable `sentiment_analysis` for per-sentence positive/negative/neutral (English only), `entity_detection` to extract named entities, and `redact_pii` to remove PII from the transcript text. These features cannot be retro-fitted to a finished transcript — re-submit with the flag set. For SUMMARIES do not set a flag here: after the transcript completes, call the `summarize_transcript` tool.
Inputs
audio_urlstringrequired- Public http(s) URL to an audio or video file.
audio_end_atinteger- Stop transcribing at this offset, in milliseconds.
audio_start_frominteger- Start transcribing at this offset, in milliseconds.
auto_highlightsboolean- Extract key phrases. Adds a highlights section to get_transcript.
content_safetyboolean- Guardrail: detect sensitive content (hate speech, violence, drugs, …). Adds a content_safety section to the get_transcript response.
content_safety_confidenceinteger- Confidence threshold (25–100, default 50) for content_safety labels.
custom_spellingarray- Spelling corrections applied to the transcript.
disfluenciesboolean- Keep filler words ('um', 'uh') in the transcript.
domainstring- Domain add-on. 'medical-v1' enables Medical Mode (EN/ES/DE/FR only; separately billed; silently skipped with a warning for other languages).
entity_detectionboolean- Enable Entity Detection. Extracts named entities (people, organizations, locations, phone numbers, etc.) into the get_transcript response.default
false filter_profanityboolean- Guardrail: replace profanity in the transcript text with asterisks.
format_textboolean- Default true. Set false for raw, unpunctuated/unformatted verbatim text.
iab_categoriesboolean- Detect IAB topic categories. Adds a topics section to get_transcript.
keyterms_promptarray- Names/brands/domain terms to boost recognition (exact spelling). Up to 1000 terms on universal-3-5-pro, 200 on universal-2. Complementary with prompt.
language_codestring- Language code of the audio (e.g. 'en_us', 'es', 'fr'). Defaults to en_us.
language_codesarray- Languages for code-switching audio (must include 'en'), e.g. ['en','es']. universal-3-5-pro only.
language_confidence_thresholdnumber- Fail transcription if detected-language confidence is below this (0–1).
language_detectionboolean- Auto-detect the spoken language. Needs ≥15s of speech for reliable results.
language_detection_optionsobject- Options refining language_detection.
multichannelboolean- Transcribe each audio channel independently (speakers labeled '1A', '2A', …).
promptstring- Contextual DESCRIPTION of the audio (domain, scenario, or details — e.g. 'Cardiology consultation about chest pain'). Improves accuracy on Universal-3.5 Pro. NOT instructions: formatting/behavioral commands are ignored.
punctuateboolean- Default true. Set false for raw, unpunctuated/unformatted verbatim text.
redact_piiboolean- Enable PII redaction of the transcript text. Sensitive values are replaced before the text is returned. Configure with redact_pii_policies and redact_pii_sub.default
false redact_pii_audioboolean- Guardrail: also produce a redacted AUDIO file (PII beeped out). Retrieve the URL from get_transcript once completed; the link expires after ~24h. Requires redact_pii=true.
redact_pii_audio_optionsobject- Options for the redacted audio file (with redact_pii_audio=true).
redact_pii_audio_qualitystring- Format of the redacted audio file (default mp3).one of
mp3wav redact_pii_policiesarray- Which PII categories to redact when redact_pii is true (e.g. person_name, phone_number, email_address). Defaults to a common set if omitted.
redact_pii_return_unredactedboolean- Also return the ORIGINAL unredacted transcript alongside the redacted one. Opts into receiving sensitive data — only set when the user explicitly needs it.
redact_pii_substring- How redacted PII is substituted: 'entity_name' replaces with [PERSON_NAME] etc. (default), 'hash' replaces with #.one of
entity_namehash redact_static_entitiesobject- Literal find-and-replace redaction on top of PII policies: label → exact terms, e.g. {"INTERNAL_TOOL": ["Bearclaw"]}. Requires redact_pii=true.
remove_audio_tagsstring- Strip inline annotations: 'all' removes audio-event + speaker tags, 'speaker' only speaker cues.one of
allspeaker sentiment_analysisboolean- Enable Sentiment Analysis. English audio only; runs on the universal speech models. Adds a per-sentence sentiment (POSITIVE/NEUTRAL/NEGATIVE) with confidence and timestamps to the get_transcript response.default
false speaker_labelsboolean- Enable speaker diarization. Required if the user wants to know who said what, when speakers change, or per-speaker timestamps. Adds an `utterances` block to the eventual get_transcript response with start/end times per speaker.default
false speaker_optionsobject- Diarization hints; use with speaker_labels=true.
speech_modelsarray- Priority-ordered model list; first supported model runs, falls back to next. Default ['universal-3-5-pro','universal-2'] is right for almost all cases. Must not be empty — omit the field entirely to use the default.
speech_thresholdnumber- Guardrail: reject files whose spoken-audio fraction is below this (0–1); the transcript then completes with an error message. Needs ≥30s of audio.
speech_understandingobject- Run Speech Understanding features (translation, speaker_identification, custom_formatting, summarization, action_items) inline with transcription — results appear in get_transcript. For an ALREADY-COMPLETED transcript use the understand_transcript tool instead of re-submitting.
summarizationboolean- DEPRECATED / no effect. Summaries are now produced by the `summarize_transcript` tool after the transcript completes. Retained for compatibility only.default
false temperaturenumber- Sampling randomness 0–1. universal-3-5-pro only. Leave unset normally.
webhook_auth_header_namestring- Custom auth header name to send on the webhook request.
webhook_auth_header_valuestring- Custom auth header value to send on the webhook request.
webhook_urlstring- URL AssemblyAI POSTs to when the transcript finishes. Most agent flows should poll get_transcript instead — only set when the user runs their own webhook receiver.
assemblyaimcp_delete_transcriptPERMANENTLY delete a transcript and its associated data from AssemblyAI.DestructiveDelete AssemblyAI Transcript
PERMANENTLY delete a transcript and its associated data from AssemblyAI. Irreversible. Only call this when the user explicitly asks for deletion (e.g. compliance cleanup after processing) — never delete proactively.
- Idempotent
Inputs
transcript_idstringrequired- The id of the transcript to permanently delete.
No tools match.