Speak AI
@speakai
About Speak AI
Official MCP server for Speak AI, transcribe meetings, analyze media, extract insights, and search across your entire audio/video library. 81 tools, 5 resources, 3 prompts. Upload recordings, get AI-powered transcripts and summaries, ask questions across files, create clips, sche
Config
Add this server to your MCP-compatible client using the configuration below.
{
"mcpServers": {
"speak-ai": {
"command": "npx",
"args": [
"-y",
"@speakai/mcp-server"
],
"env": {
"SPEAK_API_KEY": "your-api-key"
}
}
}
}Tools
113Get a pre-signed S3 URL for direct file upload to Speak AI storage. After getting the URL, PUT your file to it, then call upload_media with the S3 URL. For a simpler workflow, use upload_local_file instead which handles all steps automatically.
Upload media from a URL — a direct/public file URL, a pre-signed S3 URL, or a shareable social/video link (YouTube, Instagram, TikTok, X, Facebook, Reddit, SoundCloud, and similar) which Speak resolves to the underlying media automatically. Processing is asynchronous — after uploading, use get_media_status to poll until state is 'processed' (typically 1-3 minutes for audio under 60 min), then use get_transcript and get_media_insights to retrieve results. For a single call that handles everything, use upload_and_analyze instead. For local files, use upload_local_file. (Vimeo links are not yet supported.)
List and search media files in the workspace with filtering, pagination, and sorting. Use filterName for text search, mediaType to filter by audio/video/text, folderId for folder-specific results, and from/to for date ranges. Use the include param to embed additional data (transcripts, speakers, keywords) inline with each result, avoiding N+1 API calls. Returns mediaIds you can pass to get_transcript, get_media_insights, or ask_ai_chat. For deep full-text search across transcripts, use search_media instead.
Retrieve AI-generated insights for a processed media file — topics, sentiment, keywords, action items, summaries, and more. The media must be in 'processed' state (check with get_media_status first). For asking custom questions about a media file, use ask_ai_chat instead.
Retrieve the full transcript for a media file with speaker labels and timestamps. Works on processed media and also returns the partial, in-progress transcript while a meeting bot is still recording (LIVE_TRANSCRIPT state). To fetch only the new sentences added since your previous call during a live meeting, use get_live_meeting_transcript instead. Use update_transcript_speakers to rename speaker labels after reviewing. For subtitle-formatted output, use get_captions instead.
Update or rename speaker labels in a single media transcript. Call get_transcript first to read the speaker list — a speaker's label is whatever it was last renamed to, not a fixed value, so ids from an earlier turn may be stale. Renaming a speaker to a name another speaker already has is refused as a collision. Re-sending a rename that has already been applied is a safe no-op, so do not retry a call that reported success.
Edit the official transcript text of a single media file by finding and replacing text. Replaces every occurrence of the original text with the replacement (leave replacement empty to delete the text) and reports how many occurrences were replaced. Use update_transcript_speakers to rename speaker labels instead.
Check the processing status of a media file. States: pending → transcribing → analyzing → processed (or failed). Poll this after upload_media until state is 'processed', then use get_transcript and get_media_insights to retrieve results.
Update metadata fields (name, description, tags, status) for an existing media file.
Permanently delete a media file and all associated transcripts and insights.
Get captions for a media file. Captions are separate from full transcripts and are formatted for display/subtitles.
List all languages supported for transcription. Use the language codes when uploading media with a specific sourceLanguage.
Get workspace-level media statistics — total counts, processing status breakdown, storage usage, etc.
Mark or unmark media files as favorites for quick access.
Re-run AI analysis on a media file using the latest models. Choose which parts to re-run via the flags below.
Normalise speaker names that are ALREADY correct across multiple media files — for example changing "Frederik S." to "Frederik" everywhere. Applies the same mapping to every specified media file. NOT a way to identify a speaker across a project: neither the numeric id nor a default label such as "Speaker 1" refers to the same person in different files, because speakers are numbered per file in order of appearance. Renaming "Speaker 1" across many files will label a different person in each one. Identify the speakers in each file first (get_transcript, or an identify-speakers automation), then use this tool only to tidy up naming that is already correct. Match by the speaker's current LABEL, not by numeric id. A file whose speakers do not match the mapping is left unchanged and reported as failed. Re-sending a mapping that has already been applied is a safe no-op, so do not retry a call that reported success.
Move multiple media files to a folder in a single operation. Use this for batch reorganization instead of updating media one by one.
Create a new text note in Speak AI for analysis. The content will be analyzed for insights, topics, and sentiment.
Retrieve AI-generated insights for a text note, including topics, sentiment, summaries, and action items.
Trigger a re-analysis of an existing text note to regenerate insights with the latest AI models.
Update an existing text note's name, content, or metadata. Updating text content will trigger re-analysis.
Export a media file's transcript or insights in various formats (pdf, docx, srt, vtt, txt, csv).
Export multiple media files at once, optionally merged into a single file.
Retrieve all saved views across all folders.
Retrieve all saved views for a specific folder.
Create a new saved view for a folder with a custom set of display columns.
Update an existing saved view. Replaces the whole view, so `name`, `isDefault` and `columns` must all be supplied.
Duplicate an existing folder view into a target folder.
List all folders in the workspace with pagination and sorting.
Get detailed information about a specific folder including its contents.
Create a new folder in the workspace.
Duplicate an existing folder and all of its contents.
Update a folder. `name` must always be supplied (the server replaces the folder config).
Permanently delete a folder. Media within the folder will be moved, not deleted.
Check whether a recorder/survey is active and accepting submissions.
Create a new recorder or survey for collecting audio/video submissions.
List all recorders/surveys in the workspace.
Duplicate an existing recorder including all its settings and questions.
Get detailed information about a specific recorder including its settings and questions.
List all submissions/recordings collected by a specific recorder.
Generate a shareable public URL for a recorder/survey.
Update configuration settings for a recorder (branding, capture options, etc.). `name` must always be supplied.
Update the survey questions and respondent-info settings for a recorder.
Permanently delete a recorder/survey. Existing recordings are preserved.
Create an embeddable player/transcript widget for a media file or a set of folders. Provide `mediaId` for a single-media embed, or `folderIds` for a folder/library embed.
Update an existing embed widget — appearance/feature toggles via `meta`, plus scope and privacy.
Check if an embed exists for a media file and retrieve its configuration.
Get the iframe URL for embedding a media player/transcript on a webpage.
Ask an AI-powered question about your media using Speak AI's AI Chat. Supports querying a single file, multiple files, entire folders, or your whole workspace. Pass mediaIds for specific files, folderIds for entire folders, or omit both to search across all media. Use assistantType to get specialized responses (e.g., 'researcher' for academic analysis, 'sales' for deal insights). To continue a conversation, pass the promptId from a previous response. Returns a promptId — save it to continue the conversation with follow-up questions. Set analysisMediaId + analysisInput to have the model listen to the audio or watch the video instead of reading the transcript alone. That is a premium feature and costs credits per hour of media — call get_analysis_quote first to check eligibility and price.
Check whether a media file can be analysed as audio or video, and what it will cost, before running ask_ai_chat with analysisInput. Returns { eligible, credits, seconds } and, when not eligible, a plain-English reason — an unavailable file is a normal result here, not an error. This is the only check that accounts for both the account's premium opt-in and the server-wide switch, so call it before committing to an expensive run.
Retry a failed or incomplete AI Chat response. Use when a previous ask_ai_chat call returned an error or incomplete answer.
Get a list of recent AI Chat conversations. Returns conversation summaries with promptIds that can be used to continue conversations via ask_ai_chat or retrieve full messages via get_chat_messages.
Get full message history for conversations. Can filter by promptId for a specific conversation, by media/folder, or search across all chat messages. Returns questions, answers, references, and metadata.
Delete a specific chat message from conversation history.
List all available AI Chat templates. Use template IDs with ask_ai_chat's assistantTemplateId parameter when using assistantType 'custom'.
Get all prompts and answers that have been marked as favorites. Useful for finding saved insights and important AI-generated analysis.
Mark or unmark a chat message as a favorite for easy retrieval later.
Update the title of a chat conversation for easier identification in history.
Submit feedback on a chat response (thumbs up/down). Helps improve AI answer quality.
Get usage statistics for AI Chat / chat. Returns metrics on prompt usage, optionally filtered by date range.
Export a specific AI Chat answer. Useful for saving AI-generated summaries, reports, or analysis results.
List scheduled or completed meeting assistant events with filtering and pagination.
Schedule the Speak AI meeting assistant to join and record an upcoming meeting.
Remove the Speak AI assistant from an active or scheduled meeting.
Cancel and delete a scheduled meeting assistant event.
Fetch new sentences from an in-progress or just-ended meeting transcript. Identify the meeting via meetingAssistantEventId (preferred) or mediaId. Pass back the previous response's nextCursor as sinceEndInSec to receive only what's been added since.
List all custom fields defined in the workspace.
Create a new custom field for categorizing and tagging media.
Set custom field values across media in a single batch operation. Scope the update with `folderId` (all media in a folder) and/or `mediaIds`.
Update a specific custom field by ID. `name` must always be supplied (the server replaces the field config).
List automation rules in the workspace, with paging and filters.
List automations as lightweight { name, id } pairs — useful for pickers without fetching full configs.
Get detailed information about a specific automation rule, including its trigger and step graph.
Get the run history (executions) for an automation, with paging and optional status filter.
Create a new automation rule using the V2 graph model (trigger + ordered steps). Fetch valid step/trigger options with list_automation_triggers / list_automation_actions if unsure. For inbound-webhook automations the response includes inboundWebhook.inboundUrl (where to POST payloads) — recommended flow: create, send a test payload to the URL with ?test=1, call get_inbound_webhook to see mappable payload tokens, then update_automation to wire tokens/fieldsMap.
Update an existing automation rule. This replaces the whole automation (name, trigger, and steps), so fetch the current values with get_automation first and pass them all back with your changes.
Toggle an automation rule between active and inactive. This flips the current state — call get_automation first if you need to know which way it will flip.
Activate or deactivate multiple automations at once.
Set the folder scope for multiple automations at once. Pass an empty folderIds array to remove the folder restriction (run on all folders).
Manually run one or more automations against one or more media items now (outside the normal trigger).
Permanently delete an automation rule.
List the apps available in the automation catalog (e.g. Speak native + connected integrations). Use to discover what triggers/actions exist before building an automation.
List the trigger types available in the automation catalog. Optionally filter by app.
List the action/step types available in the automation catalog. Optionally filter by app.
Create a new webhook to receive real-time notifications when events occur in Speak AI.
List all configured webhooks in the workspace.
Update an existing webhook. This replaces the webhook config, so `callbackUrl` must always be supplied.
Provision a standalone inbound webhook and get its public receive URL (inboundUrl) BEFORE creating an automation. Webhook-first flow: provision, send a test payload to the URL (append ?test=1 to only capture a sample without running anything), inspect mappable payload paths with get_inbound_webhook, then pass the webhookId as trigger.webhookId to create_automation.
Get an inbound webhook's public receive URL, captured sample payload, and the ready-to-paste {{trigger.payload.*}} tokens for mapping payload values into automation steps (speak-upload name/sourceUrl, fieldsMap custom-field values, notify/outbound-webhook templates). Pass either the webhookId or the automationId of an inbound-webhook automation. If no sample has been captured yet, send a test payload to the inboundUrl first (append ?test=1 to capture without running the automation).
Get the delivery log for an inbound webhook: each received request with its HTTP acknowledgement status (200 = sample captured, 202 = accepted and run started, 401/403 = rejected) and the automation run it started. Use get_automation_runs for the run outcomes themselves.
Delete a webhook and stop receiving notifications at its endpoint.
Deep search across all media transcripts, insights, and metadata. Returns matching media with sentiment data, tags, and content excerpts. Use this to find specific topics, keywords, or themes across your entire library. For filtering by media type, folder, tags, or speakers, use the filterList parameter. Results are scoped by date range — defaults to current year if not specified.
Create a highlight clip from one or more media files by specifying time ranges. Clips are processed asynchronously (states: queued, processing, completed, failed) — use get_clips to check status. Maximum total clip duration is 30 minutes. Use multiple timeRanges to stitch segments from different media files together.
List clips, optionally filtered by folder or media files. If clipId is provided, returns a single clip with its download URL (when processed).
Update a clip's title, description, or tags.
Permanently delete a clip and its associated media file.
High-level automation builder: create (or update) a Speak automation from a friendly spec without knowing the wire format. Accepts folder/custom-field NAMES (resolved to ids; missing folders are auto-created), payload.<path> shorthand for webhook tokens, and simple step types (filter, branch, upload, ai_chat, translate, notify, call_webhook). For inbound-webhook automations the result includes the receive URL and mappable payload tokens. Prefer this over create_automation unless you need raw control.
Upload and transcribe media from a URL — a direct/public file URL, OR a shareable social/video link (YouTube, Instagram, TikTok, X, Facebook, Reddit, SoundCloud, and similar), which Speak resolves to the underlying media automatically. Returns media_id immediately; after this returns, poll get_media_status until state is 'processed' (typically 1-3 min for under 60min audio), then call get_media_insights for AI summaries. This async pattern is required for remote MCP transports — long blocking calls die at proxy idle timeouts. (Vimeo links are not yet supported.)
Upload a local file to Speak AI for transcription and analysis. Reads the file from disk, gets a pre-signed S3 URL, uploads the file, then creates the media entry. Works with any audio or video file on the local filesystem. After upload, use get_media_status to poll for completion, then get_transcript and get_media_insights.
List the users (members) in the workspace/company, with their ids, names, emails, and permissions. Use the returned _id values when assigning members to user groups.
List all user groups in the company. Each group includes its members (hydrated names/emails) and member ids. Use this to discover group ids and current membership before updating or deleting a group.
Create a new user group and assign members. Member ids come from list_users. Fails with a 409 if a group with the same name already exists in the company.
Update a user group's name and member list. NOTE: the users array is a FULL REPLACEMENT, not a delta — any member id you omit is removed from the group. Fetch the current members with list_user_groups first and send the complete list.
Delete a user group. This removes the group only; it does not delete the users themselves.
List all analytics dashboards the caller can access, including share state and each dashboard's current `revision` (needed for update_dashboard).
Get a single dashboard's full spec: title, description, source, date range, sections, widgets, and the current `revision` (pass that revision back to update_dashboard).
Discovery + how-to helper for building and customizing dashboards. Returns every widget type with what it shows and the exact strict `config` shape it accepts, the shared vocabulary (metric grammar, groupBy, per-widget binding, filters, thresholds, sources, date-range presets, sections), design rules for composing a dashboard that reads well, two complete worked example payloads, and tips for managing dashboards. Call this before create_dashboard / update_dashboard.
Create an analytics dashboard. Only `title` is required — source defaults to the whole workspace and dateRange to last30days. Add widgets by listing their types (the MCP assigns ids and lays them out automatically), scope with source ({type:"folders",folderIds} | {type:"team"} | {type:"workspace"}) and dateRange ({preset}), and optionally group widgets into sections. Design guidance: lead with a narrative widget as the first widget; group sections by the QUESTION they answer, not by widget type; don't pad — every widget earns its place (aim for 4-16 widgets on a full build); if something can't be expressed by the widget catalog, put it in a narrative widget's focus instead of faking it. Call list_dashboard_widgets first for the widget catalog, config vocabulary, design rules, and full examples.
Update a dashboard. Two modes. (1) Metadata-only: pass just icon/assignTo/filters/isDefault — no spec fields, no revision needed. (2) Spec update: pass the FULL spec — title, source, dateRange, sections, widgets — plus `revision`. Widgets and sections are REPLACED, not merged, so call get_dashboard first and resend everything you want to keep. `revision` is the optimistic-concurrency token from get_dashboard/list_dashboards: the server accepts the write only if it still matches, then increments it. A 409 conflict means another writer saved first — re-fetch with get_dashboard, rebuild your changes on the fresh spec, and retry with the new revision.
Soft-delete a dashboard. This also deactivates its public share link.
Clone an existing dashboard. The copy gets fresh widget ids, a "<name> (copy)" title, cleared sharing, and its revision reset to 0. Ideal for cloning a fully-configured dashboard, then tweaking it via update_dashboard.
Enable public sharing for a dashboard and return its share token + embed id. WARNING: by default the public link resolves with no passphrase, so anyone with the token can view the dashboard data until an owner sets one.
Compute a speakers breakdown for a given folder scope, date range, and field filters. Standalone analytics — does not require a dashboard to exist.
Overview
What is Speak AI?
Speak AI is an MCP (Model Context Protocol) server and CLI that connects AI assistants like Claude, Cursor, and Windsurf to a Speak AI workspace. It provides 83 tools, 5 resources, and 3 prompts for transcribing, analyzing, searching, and managing media at scale.
How to use Speak AI?
Install globally via npm install -g @speakai/mcp-server, then run speakai-mcp init for auto-setup that detects and configures supported MCP clients. Alternatively, manually add the server configuration to each client using your Speak AI API key, set via the SPEAK_API_KEY environment variable.
Key features of Speak AI
- 83 MCP tools for media, AI chat, folders, and automations
- 5 resources for direct data access without tool calls
- 3 pre-built workflow prompts for multi-step tasks
- 28 CLI commands for scripting and automation
- Transcribe, analyze, search, and manage media at scale
Use cases of Speak AI
- Automate meeting transcription and AI analysis from uploaded recordings
- Search across transcripts, insights, and metadata for themes or patterns
- Create highlight clips from time ranges across media files
- Schedule an AI assistant to join and transcribe live meetings
- Manage media folders, exports, custom fields, and webhooks programmatically
FAQ from Speak AI
What API key is needed?
You need a Speak AI API key, obtainable from the Speak AI app at https://app.speakai.co/developers/apikeys.
How do I install the Speak AI MCP server?
Install globally with npm install -g @speakai/mcp-server, then run speakai-mcp init for auto-configuration. You can also run it on the fly with npx @speakai/mcp-server.
Which MCP clients are supported?
Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, and any MCP client that supports STDIO transport. Each has specific configuration instructions in the README.
What environment variables are required?
SPEAK_API_KEY is required. Optionally, SPEAK_ACCESS_TOKEN (auto-managed) and SPEAK_BASE_URL (default https://api.speakai.co) can be set.
How many tools, resources, and prompts does it offer?
The server provides 83 MCP tools, 5 MCP resources, 3 MCP prompts, and 28 CLI commands.
Frequently asked questions
What API key is needed?
You need a Speak AI API key, obtainable from the Speak AI app at `https://app.speakai.co/developers/apikeys`.
How do I install the Speak AI MCP server?
Install globally with `npm install -g @speakai/mcp-server`, then run `speakai-mcp init` for auto-configuration. You can also run it on the fly with `npx @speakai/mcp-server`.
Which MCP clients are supported?
Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, and any MCP client that supports STDIO transport. Each has specific configuration instructions in the README.
What environment variables are required?
`SPEAK_API_KEY` is required. Optionally, `SPEAK_ACCESS_TOKEN` (auto-managed) and `SPEAK_BASE_URL` (default `https://api.speakai.co`) can be set.
How many tools, resources, and prompts does it offer?
The server provides 83 MCP tools, 5 MCP resources, 3 MCP prompts, and 28 CLI commands.
Basic information
More Media & Design MCP servers
YouTube Transcript Server
kimtaeyoon83This is an MCP server that allows you to directly download transcripts of YouTube videos.

diggercamp
Tommaso Savorana (ti es)diggercamp finds independent music by how it sounds. Paste any Bandcamp, YouTube or SoundCloud link and get the closest sonic matches from 4M+ independent tracks — matched by rhythm, timbre, key and energy, not genre tag

TravelAnimator
Lascade-CoMCP server and CLI for TravelAnimator — generate animated travel videos, itineraries, and trip media from Claude, Codex, or your terminal

Riddle Quiz Maker
Riddle.comCreates and manages quizzes, polls, surveys, personality tests, forms, predictors, minigames and leaderboards on Riddle.com – with branching logic, custom design, live stats and embed code.

Spotify MCP
varunnealMCP to connect your LLM with Spotify.
Comments