> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to the AssemblyAI MCP server

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.

**Authentication:** OAuth 2.1/DCR
**Categories:** AI, Transcription
**Tools:** 5: 3 read, 1 write, 1 destructive
**Users sign in with:** OAuth
**OAuth app:** Scalekit's or your own
**Built by:** Vendor MCP
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=ASSEMBLYAIMCP)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the AssemblyAI MCP connection

   In **AgentKit > Connections**, create an AssemblyAI MCP connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

   Scalekit credentials are available for AssemblyAI MCP server, so you don't need to register an OAuth app.

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   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.actions

   const connector = 'assemblyaimcp'
   const identifier = 'user_123'

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

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_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.actions

   connection_name = "assemblyaimcp"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_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 call
   result = actions.execute_tool(
       tool_input={"transcript_id":"YOUR_TRANSCRIPT_ID"},
       tool_name="assemblyaimcp_get_transcript",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'assemblyaimcp_get_transcript',
  toolInput: {
    transcript_id: '<transcript_id>',
  },
  connector: 'assemblyaimcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="assemblyaimcp_get_transcript",
    tool_input={
        "transcript_id": "<transcript_id>",
    },
    connection_name="assemblyaimcp",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `assemblyaimcp_get_transcript`

Get AssemblyAI Transcript · Read-only

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`.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `transcript_id` (`string`, required): The transcript id returned by submit_transcript.

Example input: `{"transcript_id":"<transcript_id>"}`

### `assemblyaimcp_summarize_transcript`

Summarize AssemblyAI Transcript · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `transcript_id` (`string`, required): The id of a completed transcript (from submit_transcript / get_transcript).
- `custom_prompt` (`string`, optional): Instruction used when style='custom' (or to override the canned style prompt).
- `style` (`string`, optional): Summary style. Use 'custom' together with custom_prompt for a tailored summary. One of: `bullets`, `paragraph`, `headline`, `action_items`, `custom`. Default: `bullets`.

Example input: `{"transcript_id":"<transcript_id>"}`

### `assemblyaimcp_understand_transcript`

Run Speech Understanding on a Transcript · Read-only

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.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `speech_understanding` (`object`, required): Feature requests, e.g. { request: { translation: { target_languages: ['es'] } } }. Multiple features may be combined in one call.
- `transcript_id` (`string`, required): The id of a completed transcript (from submit_transcript / get_transcript).

Example input: `{"speech_understanding":{},"transcript_id":"<transcript_id>"}`

### `assemblyaimcp_submit_transcript`

Submit AssemblyAI Transcript · Write

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.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `audio_url` (`string`, required): Public http(s) URL to an audio or video file.
- `audio_end_at` (`integer`, optional): Stop transcribing at this offset, in milliseconds.
- `audio_start_from` (`integer`, optional): Start transcribing at this offset, in milliseconds.
- `auto_highlights` (`boolean`, optional): Extract key phrases. Adds a highlights section to get_transcript.
- `content_safety` (`boolean`, optional): Guardrail: detect sensitive content (hate speech, violence, drugs, …). Adds a content_safety section to the get_transcript response.
- `content_safety_confidence` (`integer`, optional): Confidence threshold (25–100, default 50) for content_safety labels.
- `custom_spelling` (`array`, optional): Spelling corrections applied to the transcript.
- `disfluencies` (`boolean`, optional): Keep filler words ('um', 'uh') in the transcript.
- `domain` (`string`, optional): Domain add-on. 'medical-v1' enables Medical Mode (EN/ES/DE/FR only; separately billed; silently skipped with a warning for other languages).
- `entity_detection` (`boolean`, optional): Enable Entity Detection. Extracts named entities (people, organizations, locations, phone numbers, etc.) into the get_transcript response. Default: `false`.
- `filter_profanity` (`boolean`, optional): Guardrail: replace profanity in the transcript text with asterisks.
- `format_text` (`boolean`, optional): Default true. Set false for raw, unpunctuated/unformatted verbatim text.
- `iab_categories` (`boolean`, optional): Detect IAB topic categories. Adds a topics section to get_transcript.
- `keyterms_prompt` (`array`, optional): 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_code` (`string`, optional): Language code of the audio (e.g. 'en_us', 'es', 'fr'). Defaults to en_us.
- `language_codes` (`array`, optional): Languages for code-switching audio (must include 'en'), e.g. ['en','es']. universal-3-5-pro only.
- `language_confidence_threshold` (`number`, optional): Fail transcription if detected-language confidence is below this (0–1).
- `language_detection` (`boolean`, optional): Auto-detect the spoken language. Needs ≥15s of speech for reliable results.
- `language_detection_options` (`object`, optional): Options refining language_detection.
- `multichannel` (`boolean`, optional): Transcribe each audio channel independently (speakers labeled '1A', '2A', …).
- `prompt` (`string`, optional): 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.
- `punctuate` (`boolean`, optional): Default true. Set false for raw, unpunctuated/unformatted verbatim text.
- `redact_pii` (`boolean`, optional): 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_audio` (`boolean`, optional): 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_options` (`object`, optional): Options for the redacted audio file (with redact_pii_audio=true).
- `redact_pii_audio_quality` (`string`, optional): Format of the redacted audio file (default mp3). One of: `mp3`, `wav`.
- `redact_pii_policies` (`array`, optional): 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_unredacted` (`boolean`, optional): 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_sub` (`string`, optional): How redacted PII is substituted: 'entity_name' replaces with [PERSON_NAME] etc. (default), 'hash' replaces with #. One of: `entity_name`, `hash`.
- `redact_static_entities` (`object`, optional): Literal find-and-replace redaction on top of PII policies: label → exact terms, e.g. {"INTERNAL_TOOL": ["Bearclaw"]}. Requires redact_pii=true.
- `remove_audio_tags` (`string`, optional): Strip inline annotations: 'all' removes audio-event + speaker tags, 'speaker' only speaker cues. One of: `all`, `speaker`.
- `sentiment_analysis` (`boolean`, optional): 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_labels` (`boolean`, optional): 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_options` (`object`, optional): Diarization hints; use with speaker_labels=true.
- `speech_models` (`array`, optional): 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_threshold` (`number`, optional): 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_understanding` (`object`, optional): 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.
- `summarization` (`boolean`, optional): DEPRECATED / no effect. Summaries are now produced by the `summarize_transcript` tool after the transcript completes. Retained for compatibility only. Default: `false`.
- `temperature` (`number`, optional): Sampling randomness 0–1. universal-3-5-pro only. Leave unset normally.
- `webhook_auth_header_name` (`string`, optional): Custom auth header name to send on the webhook request.
- `webhook_auth_header_value` (`string`, optional): Custom auth header value to send on the webhook request.
- `webhook_url` (`string`, optional): 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.

Example input: `{"audio_url":"<audio_url>"}`

### `assemblyaimcp_delete_transcript`

Delete AssemblyAI Transcript · Destructive

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.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `transcript_id` (`string`, required): The id of the transcript to permanently delete.

Example input: `{"transcript_id":"<transcript_id>"}`

## Related

Other AI connectors ([all 154](/agentkit/connectors/?category=ai)):

- [Chorus](/agentkit/connectors/chorus/): Scalekit connector, Username and password, 9 tools
- [Gong](/agentkit/connectors/gong/): Scalekit connector, OAuth, 69 tools
- [Jiminny](/agentkit/connectors/jiminny/): Scalekit connector, Access token, 27 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
