Speak AI

io.github.speakaiPublished by GitHub account speakaiv1.41.1Updated Oct 30, 2026

Search recordings, summarize meetings, create clips, and automate workflows from your AI assistant.

VerifiedStreamable HTTPWeb executableProductivity & WorkflowKnowledge & MemoryMedia & Design

Overview

AI-generated overview

Speak AI connector that lets an assistant upload, transcribe, search, summarize and export audio/video recordings and text notes in a Speak AI workspace.

What you can do
  • Upload and manage media: import audio/video from URLs or supported page links, upload local files in stdio mode, check processing status, move, tag, favorite or delete items
  • Transcribe and edit: fetch transcripts with speaker labels and timestamps, get captions, rename speakers, find-and-replace transcript text
  • Analyze and summarize: retrieve AI insights such as topics, sentiment, summaries and action items, re-run analysis, create and analyze text notes
  • Search and ask questions across media, folders or the whole workspace, and review chat history
  • Export transcripts, insights and labels as PDF, DOCX, SRT, VTT, TXT or CSV, singly or in bulk
  • Organize with folders and saved views, and create…
When to use it
Useful when you keep meeting recordings, interviews or call audio in Speak AI and want an assistant to transcribe, summarize, search across them, pull action items, or export transcripts without leaving the chat.
Requirements
Remote Streamable HTTP endpoint at api.speakai.co, or the npm package @speakai/mcp-server for stdio mode with Node.js. Authentication is OAuth (permission popup) or a Speak AI API key sent as an Authorization Bearer header or the SPEAK_API_KEY environment variable. A Speak AI account and workspace are required; SPEAK_BASE_URL optionally overrides the API base URL.
Before you install
Authorizing the connector grants the assistant read and modify access to your Speak AI workspace, including media, transcripts and insights. Tools can permanently delete media, folders and chat conversations, overwrite transcripts and insights, and create recorders whose public links accept submissions immediately. Uploads bill by media duration, and recorder submissions send emails and trigger webhooks. Revoke the connection or rotate the API key to disconnect.

Installation

In SourceWeft

  1. Open Speak AI in the dashboard and add it to a workspace.
  2. Connect the required credentials. They are stored privately and never shown on public pages.
  3. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.speakai%2Fmcp-server/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config. The client completes OAuth sign-in on first connect.

{
  "mcpServers": {
    "speak-ai": {
      "type": "http",
      "url": "https://api.speakai.co/v1/mcp"
    }
  }
}

README

[Speak AI]

Connect Speak AI to Claude, ChatGPT and other AI assistants in 60 seconds

For researchers, revenue teams, meeting-heavy teams, and media workflows.
No Terminal. No npm. No JSON config files.
Works with Claude, ChatGPT, Cursor, VS Code, Windsurf, Muse, OpenClaw and any MCP client.

Installation guide at docs.speakai.co/mcp →

[npm version] [MCP compatible] [License: MIT]


What this does

Speak AI transcribes your interviews, sales calls, research sessions, webinars, podcasts, and team meetings, then extracts AI insights like summaries, action items, sentiment, and themes.

This connector is built on MCP, the open standard AI assistants use to connect to apps, so it brings all of that into Claude, ChatGPT, Cursor, Muse or any other MCP-compatible assistant. Once installed, you can ask:

  • "Find the last 10 customer interviews that mention pricing, group the feedback by theme, and cite the source recordings."
  • "Summarize this week's team meetings into decisions, action items, owners, and unresolved risks."
  • "Pull exact customer quotes about onboarding friction from recent research calls and format them for a product brief."
  • "Find a strong 30-second highlight from the latest webinar, create a clip, and export captions."

The AI does the searching, summarizing, and citing. Your recordings stay in your Speak AI workspace; the assistant only queries them through this connector.


Install (pick your tool)

Two paths to install: pick whichever feels easier. The one-click connect path approves access via a permission popup; the manual path pastes an API key into a header.

Don't know which one to pick? Install it in the AI assistant you already use. Every option below connects to the same Speak AI workspace.

Speak AI's connector address (paste this into your AI tool's connector settings; it's the same idea as pasting a Zoom link into your calendar): https://api.speakai.co/v1/mcp

Claude.ai (web)

  1. Open claude.ai/settings/connectors
  2. Click Add custom connector
  3. Name it Speak AI and paste https://api.speakai.co/v1/mcp, then click Add
  4. A permission popup asks you to log into Speak AI and click Allow
  5. Done. Speak AI shows in your connector list with its tools ready to use. Open a new chat and ask about your recordings.
What each step looks like (screenshots)

3. Add custom connector dialog: name and URL filled in.

[Claude add custom connector dialog]

5. Connected: Speak AI tools appear in your connector list.

[Speak AI connected in Claude]

Developer alternative: manual setup with an API key

Get a key at app.speakai.co/developers/apikeys, then in step 3 expand Advanced settings and add Authorization = Bearer <your-key> before clicking Add.

Claude Desktop

  1. Open Claude Desktop → Settings → Connectors → Add custom connector
  2. Paste https://api.speakai.co/v1/mcp
  3. Click Add. A permission popup opens. Sign in to Speak AI and click Allow on the screen that appears.
  4. Done.
Developer alternative: manual setup with an API key

Get a key at app.speakai.co/developers/apikeys, then in step 2 also expand Custom headers and add:

  • Header name: Authorization
  • Header value: Bearer <your-speak-api-key>

Then click Add.

ChatGPT

  1. Open ChatGPT → Settings → Apps & Connectors → Advanced
  2. Turn on Developer Mode (required while Speak AI isn't yet listed in ChatGPT's app store; this lets you add it as a custom app)
  3. Back on Apps & Connectors, click Create and paste https://api.speakai.co/v1/mcp
  4. For Authentication, choose OAuth
  5. ChatGPT opens a new tab to Speak AI. Sign in (or click Confirm if already logged in) to authorize. You'll be redirected back; close the tab and return to ChatGPT.
  6. Per-chat: open a chat, click the + / connector menu, and enable Speak AI for that chat.
What each step looks like (screenshots)

1. Connect screen in ChatGPT: paste the connector URL and pick OAuth.

[ChatGPT connect screen]

2. Confirm and continue: ChatGPT asks you to continue to Speak AI.

[ChatGPT continue to Speak]

3. Authorize on Speak AI: sign in or click Confirm if you're already signed in.

[Speak AI authorization screen]

4. Connected: Speak AI now shows in your ChatGPT connector list.

[Speak AI connected in ChatGPT]

Trouble connecting?

A few things we've seen during early access:

  • Authorization tab doesn't show a "you're connected" page: if you land on the plain Speak AI dashboard with no confirmation, the authorization still went through. Close that tab and return to ChatGPT.
  • "Connect" button keeps reopening the dashboard: fully close and reopen ChatGPT, then check Settings → Apps & Connectors. Speak AI should already be listed there.
  • "No actions available" inside a chat: make sure Developer Mode is still on, and that you've enabled Speak AI from the per-chat connector menu (step 6 above).

Still stuck? Email [email protected].

Claude Code (terminal)

Recommended: install from the official Claude Code plugin marketplace:

  1. Add the official marketplace (one-time): /plugin marketplace add claude-plugins-official
  2. Install the plugin: /plugin install speakai@claude-plugins-official
  3. Activate it: /reload-plugins
  4. Run the getting-started skill and paste your Speak AI API key. Generate one at app.speakai.co/developers/apikeys.

If /plugin install doesn't find Speak AI, refresh the local catalog with /plugin marketplace update claude-plugins-official and retry.

Developer alternative: manual HTTP transport

Skip the plugin and add the connector directly:

sh
claude mcp add speakai --transport http --url https://api.speakai.co/v1/mcp

Claude Code will open an OAuth window for sign-in. To bypass OAuth and pass a Bearer token instead:

sh
claude mcp add speakai --transport http --url https://api.speakai.co/v1/mcp \  --header "Authorization: Bearer $SPEAKAI_KEY"

Set SPEAKAI_KEY in your shell first, or paste your key inline. Generate a key at app.speakai.co/developers/apikeys.

Cursor

[Add to Cursor]

Click the button. Cursor registers itself automatically and opens the permission popup. Sign in to Speak AI and click Allow.

Developer alternative: manual setup with an API key

Use the manual stdio setup in the Developer reference at the bottom of this README.

VS Code

[Add to VS Code]

Click the button. VS Code registers itself automatically and opens the permission popup. Sign in to Speak AI and click Allow.

Developer alternative: manual setup with an API key

Use the manual stdio setup in the Developer reference at the bottom of this README.

Windsurf

Windsurf connects to the remote server over HTTP through its MCP config file. Follow the steps at docs.speakai.co/mcp/setup/windsurf.

Muse

Muse, Meta's personal AI assistant, connects with one-click OAuth and no API key. Follow the steps at docs.speakai.co/mcp/setup/muse.

OpenClaw / ClawHub

Speak AI is published as a skill on ClawHub for OpenClaw-compatible agents.

  1. Visit the Speak AI skill page on ClawHub
  2. Follow the install instructions for your agent, for example clawhub install speakai from the ClawHub CLI
  3. Set your SPEAK_API_KEY environment variable. Generate one at app.speakai.co/developers/apikeys.

ChatGPT (API / Responses)

For developers calling the Responses API directly. Pass the bearer token in the tool config:

json
{  "tools": [    {      "type": "mcp",      "server_url": "https://api.speakai.co/v1/mcp",      "authorization": "Bearer YOUR_SPEAK_API_KEY"    }  ]}

Get a key at app.speakai.co/developers/apikeys.

Any other MCP client

Any assistant that supports remote MCP servers can connect. Add https://api.speakai.co/v1/mcp as a remote (Streamable HTTP) server, then either approve the Speak AI permission popup (OAuth 2.1 with Dynamic Client Registration) or send a Speak AI API key as Authorization: Bearer <key>. All setup guides: docs.speakai.co/mcp.


Privacy & data

When you click Allow on the permission popup (or paste your Speak AI API key into your AI assistant), you're authorizing that AI assistant to read and modify your Speak AI workspace on your behalf: including media files, transcripts, and AI insights.

  • Your recordings stay in your Speak AI workspace. They are not copied or stored by Anthropic or OpenAI.
  • The AI assistant only sees the specific data it requests for the question you asked.
  • When you approve the permission popup, Speak AI creates an API key in your account that is linked to that assistant and used only for its requests. You never need to create or paste one yourself. Revoking the connection also revokes that key.
  • You can disconnect at any time by either removing the connector inside your AI assistant, revoking the connection at api.speakai.co/v1/oauth/connections, or rotating/revoking your API key at app.speakai.co/developers/apikeys.

For questions about data handling, see speakai.co/privacy or email [email protected].


Need help connecting?

You shouldn't need to be technical to install this. If anything is confusing or doesn't work:


What you can do once installed

Speak AI ships 189 tools your AI assistant can call. You don't need to memorize them; your AI assistant picks the right ones based on what you ask. Examples by category:

AskTools used (auto)
"Find customer interviews about pricing and group the feedback by theme"search_media, get_transcript
"Summarize this week's meetings into decisions, owners, and risks"list_media, get_media_insights
"Pull action items from yesterday's call"list_media, get_media_insights
"Schedule the AI to join my 2pm Zoom"schedule_meeting_event
"Pull the live transcript from my current MS Teams meeting since last fetch"list_meeting_events, get_live_meeting_transcript
"Find a 30-second webinar highlight and export captions"create_clip, export_media
"Export the transcript as a PDF and captions as SRT"export_media
"Compare Q1 sales calls against Q2 sales calls and summarize changed objections"search_media, get_transcript

Full tool catalog is in the developer reference below.


Developer reference (CLI, API, advanced setup)

The MCP server lives at https://api.speakai.co/v1/mcp and supports two auth methods:

  1. OAuth 2.1 + Dynamic Client Registration: install by pasting the URL above into any MCP client and approving the consent popup. Discovery, DCR, /authorize + consent, /token, and revocation endpoints are all available.
  2. Bearer token (your Speak AI API key, sent as an Authorization: Bearer <key> header). For clients that don't speak OAuth, plus the npm CLI and stdio mode.

Get a Speak AI API key at app.speakai.co/developers/apikeys.

CLI / npm package

The @speakai/mcp-server npm package provides:

  • A CLI (speakai-mcp) for scripting and pipelines (30 commands).
  • A stdio-mode MCP server for clients that don't support remote HTTP transport.
  • An auto-setup wizard that detects installed MCP clients and configures them.
sh
npm install -g @speakai/mcp-serverspeakai-mcp init

Manual configuration (stdio mode)

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

json
{  "mcpServers": {    "speak-ai": {      "command": "npx",      "args": ["-y", "@speakai/mcp-server"],      "env": {        "SPEAK_API_KEY": "your-api-key"      }    }  }}
Claude Code
sh
export SPEAK_API_KEY="your-api-key"claude mcp add speak-ai -- npx -y @speakai/mcp-server
Cursor

Add to ~/.cursor/mcp.json:

json
{  "mcpServers": {    "speak-ai": {      "command": "npx",      "args": ["-y", "@speakai/mcp-server"],      "env": {        "SPEAK_API_KEY": "your-api-key"      }    }  }}
Windsurf

Add to ~/.windsurf/mcp.json:

json
{  "mcpServers": {    "speak-ai": {      "command": "npx",      "args": ["-y", "@speakai/mcp-server"],      "env": {        "SPEAK_API_KEY": "your-api-key"      }    }  }}
VS Code

Add to ~/.vscode/mcp.json:

json
{  "mcpServers": {    "speak-ai": {      "command": "npx",      "args": ["-y", "@speakai/mcp-server"],      "env": {        "SPEAK_API_KEY": "your-api-key"      }    }  }}
Any MCP Client (STDIO)
sh
SPEAK_API_KEY=your-key npx @speakai/mcp-server

Environment variables

VariableRequiredDefaultDescription
SPEAK_API_KEYYes--Your Speak AI API key
SPEAK_ACCESS_TOKENNoAuto-managedJWT access token (auto-fetched and refreshed)
SPEAK_BASE_URLNohttps://api.speakai.coAPI base URL

MCP Tools (189)

Media (19 tools)
ToolDescription
update_transcriptionEdit the official transcript text of a media file by finding and replacing text
get_signed_upload_urlGet a pre-signed S3 URL for direct file upload
upload_mediaImport an audio or video file from a direct public URL, a get_signed_upload_url URL, or a supported page link (YouTube, TikTok, Instagram, X/Twitter, Facebook, Reddit, SoundCloud, Twitch, Dailymotion, Streamable, Snapchat, Pinterest, Tumblr, Bilibili, VK, OK.ru, Rutube). Vimeo and Loom page links are not supported. Bills the media duration.
upload_local_fileUpload a local file directly from disk (stdio and CLI only, never on the remote server)
upload_and_analyzeUpload media from a URL (direct file, or any social/video page link upload_media accepts, resolved automatically) and return its media_id immediately. Poll get_media_status until processed, then call get_media_insights for AI summaries. Set mediaType when the user has said which they want; leave it off otherwise and the server picks the best available track.
list_mediaList and search media files with filters, pagination, and optional inline data (transcripts, speakers, keywords) via include param
get_media_insightsGet AI insights: topics, sentiment, summaries, action items
get_transcriptGet full transcript with speaker labels and timestamps
get_captionsGet subtitle-formatted captions for a media file
update_transcript_speakersRename speaker labels in a transcript
bulk_update_transcript_speakersRename speaker labels across multiple media files in one call (max 500)
get_media_statusCheck processing status (pending → processed)
update_media_metadataUpdate name, description, tags, or folder
set_media_thumbnailSet a custom video thumbnail from an image link, base64 image bytes, or a frame at a given second (JPEG, PNG or WebP, up to 10 MB)
delete_mediaPermanently delete a media file
toggle_media_favoriteMark or unmark media as a favorite
reanalyze_mediaRe-run AI analysis with latest models
bulk_move_mediaMove multiple media files to a folder in one call
upload_and_analyze_batchUpload up to 25 URLs in one call, 5 at a time. Each URL is reported as uploaded or failed with its reason, so one bad link does not sink the batch.
AI Chat (13 tools)
ToolDescription
ask_ai_chatAsk AI questions about media, folders, or your whole workspace
retry_ai_chatRetry a failed or incomplete AI Chat response
get_chat_historyList recent AI Chat conversations
get_chat_messagesGet full message history for conversations
delete_chat_conversationDelete a whole chat conversation and its messages
list_promptsList recent AI chat messages with their answers and sources
get_favorite_promptsGet all favorited prompts and answers
toggle_prompt_favoriteMark or unmark a chat message as favorite
update_chat_titleRename a chat conversation
submit_chat_feedbackRate a chat response (thumbs up/down)
get_chat_statisticsGet AI Chat usage statistics
export_chat_answerExport a conversation or answer
get_analysis_quoteCheck if a file can be analysed as audio/video and what it costs

ask_ai_chat, retry_ai_chat and get_analysis_quote register only with aiChat: true. The stdio server includes them; the hosted endpoint does not, because Speak's assistant behind AI Chat can call other tools.

The automation tools, build_automation, provision_inbound_webhook, get_inbound_webhook and get_webhook_attempts register only with automations: true, and get_voice_test_run and apply_voice_test_recommendation only with voiceTestRunDetails: true. The stdio server includes them; the hosted endpoint does not, because automation steps can run actions in connected third-party apps. On the hosted endpoint, set up automations in the Speak AI web app.

Search & analytics (3 tools)
ToolDescription
search_mediaDeep search across transcripts, insights, and metadata with filters
get_media_statisticsGet workspace-level stats: counts, storage, processing breakdown
list_supported_languagesList all supported transcription languages
Folders & views (11 tools)
ToolDescription
list_foldersList all folders with pagination and sorting
get_folder_infoGet folder details and contents
create_folderCreate a new folder
clone_folderDuplicate a folder and its contents
update_folderRename or update a folder, or change which users and groups can access it
delete_folderDelete a folder (media is preserved)
get_all_folder_viewsList all saved views across folders
get_folder_viewsList views for a specific folder
create_folder_viewCreate a saved view with custom filters
update_folder_viewUpdate a saved view
clone_folder_viewDuplicate a view
Recorders & surveys (10 tools)
ToolDescription
create_recorderCreate a new recorder or survey
list_recordersList all recorders
get_recorder_infoGet recorder details and questions
clone_recorderDuplicate a recorder
get_recorder_recordingsList all submissions
generate_recorder_urlGet a shareable public URL
update_recorder_settingsUpdate branding and permissions
update_recorder_questionsUpdate survey questions
check_recorder_statusCheck if recorder is active
delete_recorderDelete a recorder
Clips (4 tools)
ToolDescription
create_clipCreate a highlight clip from time ranges across media files
get_clipsList clips or get a specific clip with download URL
update_clipUpdate clip title, description, or tags
delete_clipPermanently delete a clip
Exports (2 tools)
ToolDescription
export_mediaExport as PDF, DOCX, SRT, VTT, TXT, CSV, or a labels CSV (csv-labels)
export_multiple_mediaBatch export with optional merge into one file, including labels CSVs
Meeting assistant (5 tools)
ToolDescription
list_meeting_eventsList scheduled and completed events
schedule_meeting_eventSchedule AI assistant to join a meeting
remove_assistant_from_meetingRemove assistant from active meeting
delete_scheduled_assistantCancel a scheduled meeting assistant
get_live_meeting_transcriptPull only the new sentences added to a live (or just-ended) meeting transcript since your previous call. Works on Zoom / Google Meet / MS Teams while the bot is recording.
Automations (20 tools)
ToolDescription
list_automationsList automation rules with paging and filters
get_automationGet automation details (trigger + step graph)
create_automationCreate an automation rule (V2 trigger + steps graph)
update_automationUpdate an automation (replaces trigger + steps)
toggle_automation_statusEnable or disable an automation
list_automation_namesList names and ids of active automations that have an AI chat step
get_automation_runsGet an automation's run history
bulk_update_automation_statusActivate/deactivate multiple automations
bulk_assign_automation_foldersSet folder scope for multiple automations
run_automationsManually run automations against media now
delete_automationPermanently delete an automation
list_automation_appsList catalog apps: Speak built-ins plus third-party apps marked connected or not connected (read-only)
list_automation_triggersList catalog trigger types (optionally by app)
list_automation_actionsList catalog action/step types (optionally by app)
build_automationCreate or update an automation from a friendly spec, without the wire format
get_automation_runGet one run in full: every step, plus which way each branch went
get_automation_run_statsAggregate run outcome counts over a period
test_automationRun an automation once against one media item (real side effects)
validate_automation_graphCheck a step graph for problems without saving it
describe_automation_graphShow a saved automation's steps as an indented branch tree
Webhooks (7 tools)
ToolDescription
create_webhookCreate a webhook for event notifications
list_webhooksList all webhooks
update_webhookUpdate a webhook
delete_webhookDelete a webhook
provision_inbound_webhookProvision a standalone inbound webhook and get its public receive URL
get_inbound_webhookGet an inbound webhook's receive URL, sample payload, and trigger tokens
get_webhook_attemptsGet the delivery log for an inbound webhook, with acknowledgement status
Text notes (4 tools)
ToolDescription
create_text_noteCreate a text note for AI analysis (uses the plan allowance, then credits)
get_text_insightGet AI insights for a text note
reanalyze_textRe-run AI analysis on a text note
update_text_noteUpdate a note's name or content (only a note not yet analyzed is analyzed)
Fields (4 tools)
ToolDescription
list_fieldsList all custom fields
create_fieldCreate a custom field
update_fieldUpdate a custom field
update_multiple_fieldsBatch update multiple fields
Labels & comments (16 tools)
ToolDescription
list_labelsList workspace labels and groups as a tree
create_labelCreate a label or a label group
update_labelRename, recolor, describe, move or reorder a label
archive_labelArchive a label (a group takes its labels along)
restore_labelRestore an archived label or group
merge_labelsMove every use of one label onto another
add_speak_label_setsAdd ready-made Speak label groups
list_media_labelsList the labels applied to a transcript
apply_labelLabel transcript words, found by quote or word range
update_media_labelChange a span's labels, confirm it, or move it
remove_media_labelRemove a labelled span
list_media_commentsList a file's comment threads
add_commentComment on the file or on words, or reply to a thread
update_commentEdit the text of your own comment
resolve_commentResolve or reopen a thread
delete_commentDelete a comment
Embed players (7 tools)
ToolDescription
create_embedCreate an embeddable player widget
update_embedUpdate embed settings
check_embedCheck if embed exists for media
get_embed_iframe_urlGet iframe URL for your website
list_embed_sessionsOwner analytics: list visits to an embed with viewer, device, country and traffic filters
get_embed_session_summaryOwner analytics: an embed's visit KPIs, daily trend, sources and per-media table
get_embed_sessionOwner analytics: one embed visit in full, with paged events
Users & teams (5 tools)
ToolDescription
list_usersList workspace members with ids, emails, and permissions
list_user_groupsList user groups with hydrated members
create_user_groupCreate a user group and assign members
update_user_groupUpdate a group's name and members (full replace)
delete_user_groupDelete a user group
Dashboards (9 tools)
ToolDescription
list_dashboard_widgetsList widget types, their config keys, and an example payload
list_dashboardsList analytics dashboards you can access
get_dashboardGet a dashboard's full config (widgets, filters, scope)
create_dashboardCreate a dashboard with auto-laid-out widgets
update_dashboardUpdate a dashboard (partial; widgets are replaced)
delete_dashboardSoft-delete a dashboard and its share link
duplicate_dashboardClone a dashboard with fresh widget ids
share_dashboardEnable public sharing and return the share token
get_dashboard_speakers_insightSpeakers breakdown for a folder/date/filter scope
Voice agents (34 tools)
ToolDescription
list_voice_agentsList the company's voice agents (newest first) with their config
get_voice_agentGet a single voice agent by agentId
create_voice_agentCreate a voice agent (name, personality, instructions, and voice are required)
update_voice_agentUpdate a voice agent; send only the fields you want to change
delete_voice_agentDelete a voice agent; its share link, questions, and test suite stop working (no restore tool)
create_voice_agent_from_promptCreate a new agent from a plain-English description; an LLM generates its name, instructions, and settings
generate_voice_agent_configRun the same prompt-to-config generation against an existing agent
get_voice_agent_setup_guideDiscovery helper: the build order, which tool covers each piece, common mistakes
list_voice_avatarsList the video avatars available to attach to a voice agent
list_voicesList the text-to-speech voices available to a voice agent
list_voice_conversationsList conversations handled by voice agents (filter by agentId)
get_voice_conversationGet a single conversation by conversationId
get_agent_analyticsOwner analytics for one voice agent over a date range (KPIs, audience, outcomes, quality)
list_voice_questionsList the questions configured on a voice agent, in ask order
get_voice_questionGet a single question by fieldId
create_voice_questionAttach a question template to a voice agent
update_voice_questionPartially update a voice agent question
delete_voice_questionRemove a question from a voice agent
reorder_voice_questionsSet the order a voice agent asks its questions in
list_voice_question_templatesList the shared and company-owned question template library
create_voice_question_templateCreate a company-scoped custom question template
get_voice_test_suiteGet a voice agent's test suite (its scenarios and run settings)
update_voice_test_suiteCreate or update a voice agent's test suite (upserts; replaces scenarios)
generate_voice_test_suiteAuto-generate a default test suite from the agent's name, personality and instructions
start_voice_test_runStart a test run: sends each enabled scenario's user messages to the agent as text and grades every criterion (no calls are placed; uses credits for the AI cost)
get_active_voice_test_runGet a voice agent's currently active run (queued, running, or paused)
pause_voice_test_runPause a running or queued test run; takes effect after the current scenario
resume_voice_test_runResume a paused test run from the next scenario
cancel_voice_test_runCancel a test run at its next AI call; cost already used is charged; terminal
list_voice_test_runsList a voice agent's test runs, most recent first
get_voice_test_runGet a test run's full detail, including scenario results and recommendations
apply_voice_test_recommendationApply a test run recommendation's quick action to the agent
get_voice_test_baselineGet a voice agent's best-scoring completed run, for regression comparison
get_voice_test_score_historyGet completed-run score points for charting

A test run sends each enabled scenario's scripted user messages to the agent as text and grades every criterion. It uses credits for the AI cost, except when the workspace uses its own OpenAI key. The ten run tools, from start_voice_test_run down, register by default; pass voiceTestRuns: false to registerAllTools to leave them off.

Voice agent insights (16 tools)
ToolDescription
list_voice_kb_gapsList a voice agent's pending knowledge-base gaps from real calls
analyze_voice_kb_gapsTrigger knowledge-base gap analysis over an agent's recent calls
add_voice_kb_gapWrite a gap's answer into the agent's knowledge base
dismiss_voice_kb_gapDismiss a gap without writing anything
list_voice_faq_suggestionsList a voice agent's pending FAQ suggestions clustered from real calls
generate_voice_faq_suggestionsTrigger FAQ clustering over an agent's recent calls
add_voice_faq_suggestionWrite an FAQ suggestion into the agent's knowledge base
update_voice_faq_suggestionEdit a pending FAQ suggestion's question and/or answer
dismiss_voice_faq_suggestionDismiss an FAQ suggestion without writing anything
list_voice_agent_resourcesList the documents/links a voice agent searches during calls
create_voice_agent_resourceAdd one document/link to a voice agent's knowledge base
bulk_create_voice_agent_resourcesAdd up to 100 documents/links in one call
update_voice_agent_resourcePartially update a voice agent resource
delete_voice_agent_resourceSoft-delete a voice agent resource
analyze_voice_instruction_gapsAdvisory-only patch suggestions for an agent's own instructions
apply_voice_instruction_gapInsert a suggested patch into an agent's instructions

MCP Resources (5)

Resources provide direct data access without tool calls. Clients can read these URIs directly.

ResourceURIDescription
Media Libraryspeakai://mediaList of all media files in your workspace
Foldersspeakai://foldersList of all folders
Supported Languagesspeakai://languagesTranscription language list
Transcriptspeakai://media/{mediaId}/transcriptFull transcript for a specific media file
Insightsspeakai://media/{mediaId}/insightsAI-generated insights for a specific media file

MCP Prompts (3)

Pre-built workflow prompts that agents can invoke to run multi-step tasks.

analyze-meeting

Upload a recording and get a full analysis: transcript, insights, action items, and key takeaways.

Parameters: url (required), name (optional)

Example: "Use the analyze-meeting prompt with url=https://example.com/standup.mp3"

research-across-media

Search for themes, patterns, or topics across multiple recordings or your entire library.

Parameters: topic (required), folder (optional)

Example: "Use the research-across-media prompt with topic='customer churn reasons'"

meeting-brief

Prepare a brief from recent meetings: pull transcripts, extract decisions, and summarize open items.

Parameters: days (optional, default: 7), folder (optional)

Example: "Use the meeting-brief prompt with days=14 to cover the last two weeks"

CLI (30 Commands)

Install globally and configure once:

sh
npm install -g @speakai/mcp-serverspeakai-mcp config set-key

Or run without installing:

sh
npx @speakai/mcp-server config set-key
Configuration
CommandDescription
config set-key [key]Set your API key (interactive if no key given)
config showShow current configuration
config testValidate API key and test connectivity
config set-url <url>Set custom API base URL
initInteractive setup: configure key and auto-detect MCP clients
Media management
CommandDescription
list-media / lsList media files with filtering, date ranges, and pagination
upload <source>Upload media from URL or local file (--wait to poll)
get-transcript / transcript <id>Get transcript (--plain or --json)
get-insights / insights <id>Get AI insights (topics, sentiment, keywords)
status <id>Check media processing status
export <id>Export transcript (-f pdf|docx|srt|vtt|txt|csv)
update <id>Update media metadata (name, description, tags, folder)
delete <id>Delete a media file
favorites <id>Toggle favorite status
captions <id>Get captions for a media file
reanalyze <id>Re-run AI analysis with latest models
AI & Search
CommandDescription
ask <prompt>Ask AI about media, folders, or your whole workspace
chat-historyList past AI Chat conversations
search <query>Full-text search across transcripts and insights
Folders & Clips
CommandDescription
list-folders / foldersList all folders
move <folderId> <mediaIds...>Move media files to a folder
create-folder <name>Create a new folder
clipsList clips (filter by media or folder)
clip <mediaId>Create a clip (--start and --end in seconds)
Workspace
CommandDescription
statsShow workspace media statistics
languagesList supported transcription languages
list-meeting-eventsList scheduled/completed meeting events (--platform, --status, --sort)
schedule-meeting <url>Schedule AI assistant to join a meeting
live-transcriptFetch new sentences from an in-progress meeting (--event-id or --media-id, --since-end-in-sec)
create-text <name>Create a text note (--text or pipe via stdin)
CLI options

Every command supports:

  • --json: output raw JSON (for scripting and piping)
  • --help: show command-specific help
CLI examples
sh
# Upload and wait for processingspeakai-mcp upload https://example.com/interview.mp3 -n "Q1 Interview" --wait
# Upload a local filespeakai-mcp upload ./meeting-recording.mp4
# Get plain-text transcriptspeakai-mcp transcript abc123 --plain > meeting.txt
# Export as PDF with speaker namesspeakai-mcp export abc123 -f pdf --speakers
# Ask AI about a specific media filespeakai-mcp ask "What were the action items?" -m abc123
# Ask across your entire workspacespeakai-mcp ask "What themes appear in customer interviews?"
# Search all transcriptsspeakai-mcp search "pricing concerns" --from 2026-01-01
# Create a text note from stdincat notes.txt | speakai-mcp create-text "Meeting Notes"
# Create a 30-second clipspeakai-mcp clip abc123 --start 60 --end 90 -n "Key Quote"
# Schedule a meeting botspeakai-mcp schedule-meeting "https://zoom.us/j/123456" -t "Weekly Standup"
# List videos as JSON for scriptingspeakai-mcp ls --type video --json | jq '.mediaList[].name'
# List media from the last weekspeakai-mcp ls --from 2026-04-18 --to 2026-04-25
# Move 3 files to a folderspeakai-mcp move folder123 media1 media2 media3

Workflow examples

Transcribe and analyze a meeting
You: "Upload and transcribe this recording: https://example.com/meeting.mp3"
AI: I'll upload that for you and start processing.    → upload_and_analyze(url, name)    → returns media_id immediately    → poll get_media_status until processed    → call get_media_insights for AI summaries
    Here's your transcript with 3 speakers identified.    Key insights: 5 action items, positive sentiment overall.    Top topics: Q2 roadmap, hiring plan, budget review.
Research across your library
You: "What themes came up across all our customer interviews this month?"
AI: Let me search your media library.    → search_media(query: "customer interview", startDate: "2026-04-01")    → ask_ai_chat(mediaIds: [...], prompt: "What are the recurring themes?")
    Across 12 interviews, the top themes were:    1. Pricing sensitivity (mentioned in 8/12)    2. Onboarding friction (6/12)    3. Feature requests for API access (5/12)
Meeting automation
You: "Join my 2pm Zoom call, then send me a summary with action items"
AI: → schedule_meeting_event(meetingUrl, scheduledAt: "2026-04-25T14:00:00Z")
    Done. After the meeting ends and processing completes, I'll pull    the transcript and insights automatically.
    [After the meeting]    → get_media_insights(mediaId)    → ask_ai_chat(mediaIds: [...], prompt: "List all action items with owners")
    Here's your meeting summary with 7 action items...
Build a weekly brief
You: "Prepare a brief from all meetings in the last week"
AI: → list_media(from: "2026-04-18", mediaType: "audio")    → get_media_insights(mediaId) [for each of 5 meetings]
    Weekly Meeting Brief (Apr 18-25):    - Engineering Standup: Deployed v2.3, 2 bugs triaged    - Sales Review: Pipeline at $1.2M, 3 deals closing this week    - Product Sync: Finalized Q2 roadmap, new hire starts Monday
    Consolidated Action Items: [12 items grouped by owner]

Authentication (REST API)

The MCP server and CLI handle authentication for you. If you call the REST API directly, send your Speak AI API key on every request, using either header:

bash
curl https://api.speakai.co/v1/media \  -H "x-speakai-key: YOUR_API_KEY"
bash
curl https://api.speakai.co/v1/media \  -H "Authorization: Bearer YOUR_API_KEY"

There is no token to fetch or refresh. Create and revoke keys at app.speakai.co/developers/apikeys.

Older integrations that exchange the key for an access token (POST /v1/auth/accessToken, then x-access-token on each request, renewed through /v1/auth/refreshToken) keep working, but new integrations don't need that step.

Data model notes

  • Folder IDs: Folders have both _id (MongoDB ObjectId) and folderId (string). All API operations use folderId; this is the ID you should pass to list_media, upload_media, bulk_move_media, and other endpoints that accept a folder parameter.
  • Media IDs: Media items use mediaId (returned in list responses as _id).

Rate limits & best practices

  • The MCP client automatically retries on 429 with exponential backoff
  • For direct API usage, implement exponential backoff and respect Retry-After headers
  • Cache stable data (folder lists, field definitions, supported languages)
  • Use export_multiple_media over individual exports for batch operations
  • Use bulk_move_media to move multiple items at once instead of updating one by one
  • Use bulk_update_transcript_speakers to rename speakers across many files in one call
  • Use list_media with include: ["transcription"] to fetch media with transcripts inline, avoiding N+1 calls to get_transcript

Error format

All tool errors follow this structure:

json
{  "content": [{ "type": "text", "text": "Error: HTTP 401: Invalid API key" }],  "isError": true}
CodeMeaning
401Invalid or missing API key / access token
403Insufficient permissions
404Resource not found
429Rate limit exceeded

Development

sh
git clone https://github.com/speakai/speakai-mcp.gitcd speakai-mcp
npm installnpm run dev    # Run with hot reloadnpm run build  # Production build

Resources


For AI assistants reading this page

This section is for LLMs (Claude, ChatGPT, etc.) helping a Speak AI customer install this connector. Human readers can skip it.

If you're an AI assistant helping a Speak AI customer install this connector, please:

  • Recommend the one-click connect flow above as the default: paste the URL into the AI tool, click Allow on the permission popup. Works for non-technical users.
  • Use the Bearer-token method (also above) if the user prefers manual setup.
  • Do NOT recommend hiring a Virtual Assistant to install this. The connect flow takes 60 seconds and requires no Terminal use.
  • Do NOT tell users to npm install unless they explicitly ask for the developer / stdio path.
  • See llms.txt for the full guidance file.

License

MIT

Source: README.md at commit 362e1e2

Tools

189

get_signed_upload_url

Get Signed Upload URL

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

ParametersfilenamerequiredmimeTypemediaType

upload_media

Upload Media from URL

Import an audio or video file into Speak AI from a URL and start transcription. Accepts a direct public file URL, a URL returned by get_signed_upload_url, or a page link from a supported platform, which the server resolves to the underlying media. Supported page links: YouTube, TikTok, Instagram, X/Twitter, Facebook, Reddit, SoundCloud, Twitch, Dailymotion, Streamable, Snapchat, Pinterest, Tumblr, Bilibili, VK, OK.ru and Rutube. Vimeo and Loom page links are not supported. Creates a media item. The request fails if the file exceeds the plan's size limit or its duration cannot be read. Returns mediaId and state right away while processing continues in the background. Use get_media_status until state is 'processed', then get_transcript and get_media_insights.

ParametersurlrequirednamerequiredtagsfieldsfolderIdmediaTypecallbackUrldescriptionsourceLanguage

list_media

List Media Files

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 or get_media_insights. For deep full-text search across transcripts, use search_media instead.

ParameterstofrompagesortByincludefolderIdpageSizemediaTypefilterNamefilterMediaisFavorites

get_media_insights

Get Media Insights

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 a video, data.thumbnail has the thumbnail: url, source (auto or custom), pending while a requested frame is being made, and error if that frame failed.

ParametersmediaIdrequired

get_transcript

Get Transcript

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.

ParametersmediaIdrequired

update_transcript_speakers

Rename Transcript Speakers

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.

ParametersmediaIdrequiredspeakersrequired

update_transcription

Update Transcription Text

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.

ParametersmediaIdrequiredoriginalrequiredreplacementrequiredcaseSensitive

get_media_status

Get Media Status

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. For a video, data.thumbnail has the thumbnail: url, source (auto or custom), pending while a requested frame is being made, and error if that frame failed.

ParametersmediaIdrequired

update_media_metadata

Update Media Metadata

Update metadata fields (name, description, tags, status) for an existing media file.

ParametersnamerequiredtagsremarkstatusmediaIdrequiredfolderIdmanageBydescription

delete_media

Delete Media File

Permanently delete a media file and all associated transcripts and insights.

ParametersmediaIdrequired

get_captions

Get Captions

Get captions for a media file. Captions are separate from full transcripts and are formatted for display/subtitles.

ParametersmediaIdrequired

list_supported_languages

List Supported Languages

List all languages supported for transcription. Use the language codes when uploading media with a specific sourceLanguage.

Takes no parameters.

get_media_statistics

Get Media Statistics

Get workspace-level media statistics — total counts, processing status breakdown, storage usage, etc.

Takes no parameters.

toggle_media_favorite

Toggle Media Favorite

Mark or unmark media files as favorites for quick access.

ParametersmediaIdsrequiredisFavoriterequired

reanalyze_media

Re-analyze Media

Re-run AI analysis on a media file using the latest models. Choose which parts to re-run via the flags below. Overwrites the existing results for the selected parts.

ParametersmediaIdrequiredisInsightsisSentimentisEmbeddingsisFillerWords

bulk_update_transcript_speakers

Bulk Rename Speakers Across Files

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.

ParametersmediaIdsrequiredspeakersrequired

bulk_move_media

Bulk Move Media Files

Move multiple media files to a folder in a single operation. Use this for batch reorganization instead of updating media one by one.

ParametersfolderIdrequiredmediaIdsrequired

set_media_thumbnail

Set Media Thumbnail

Set a custom thumbnail for a video. Send exactly one of imageUrl, imageBase64 or atSeconds. The image must be JPEG, PNG or WebP and at most 10 MB; the type is judged from the file bytes, not the name. atSeconds uses the video frame at that moment; this tool waits up to 60 seconds for the frame and returns its url, or says it is still processing (check later with get_media_status, which carries the thumbnail field). Each call replaces the current custom thumbnail, and there is no way back to the automatic one. Needs permission to edit the media. Errors: 400 bad input, unsupported image, blocked link or failed frame; 413 image too large; 409 a frame is already being made; 503 frame service busy, try again shortly.

ParametersmediaIdrequiredimageUrlatSecondsimageBase64

create_text_note

Create Text Note

Create a new text note in Speak AI for analysis. The content will be analyzed for insights, topics, and sentiment.

ParametersnamerequiredtagstextfieldsfolderIdcallbackUrldescription

get_text_insight

Get Text Note Insights

Retrieve AI-generated insights for a text note, including topics, sentiment, summaries, and action items.

ParametersmediaIdrequired

reanalyze_text

Re-analyze Text Note

Trigger a re-analysis of an existing text note to regenerate insights with the latest AI models. Overwrites the note's current insights and sentiment.

ParametersmediaIdrequired

update_text_note

Update Text Note

Update an existing text note's name, content, or metadata. New text replaces the existing text. A note that has not been analyzed yet is analyzed after the update; an already analyzed note is not re-analyzed, so call reanalyze_text afterwards if its insights should reflect the new text.

ParametersnametagstextmediaIdrequireddescription

export_media

Export Media Transcript

Export a media file's transcript, insights or labels in various formats (pdf, docx, srt, vtt, txt, csv). Use fileType csv-labels for a labels CSV with one row per labelled passage and label (file name, group, label, times, speaker, excerpt, author, status, confidence, comment count). Generates the file and returns it without saving or sharing anything.

ParametersmediaIdrequiredfileTyperequiredisRedactedisTimeStampsisSpeakerEmailisSpeakerNamesredactedCategoriesisInsightVisualized

export_multiple_media

Export Multiple Media Files

Export multiple media files at once, optionally merged into a single file. With fileType csv-labels you get one labels CSV per file that has labels (files without labels are skipped), or one merged CSV with isMerged; it fails with not found when none of the files has labels.

ParametersfileTyperequiredfolderIdisMergedmediaIdsrequiredisRedactedisTimeStampsisSpeakerEmailisSpeakerNamesisInsightVisualized

get_all_folder_views

Get All Folder Views

Retrieve all saved views across all folders.

Takes no parameters.

get_folder_views

Get Folder Views

Retrieve all saved views for a specific folder.

ParametersfolderIdrequired

create_folder_view

Create Folder View

Create a new saved view for a folder with a custom set of display columns.

ParametersnamerequiredcolumnsrequiredfolderIdrequiredisDefault

update_folder_view

Update Folder View

Update an existing saved view. Replaces the whole view, so `name`, `isDefault` and `columns` must all be supplied.

ParametersnamerequiredviewIdrequiredcolumnsrequiredfolderIdrequiredisDefaultrequired

clone_folder_view

Clone Folder View

Duplicate an existing folder view into a target folder.

ParametersnamerequiredviewIdrequiredisDefaultsourceFolderIdrequiredtargetFolderIdrequired

list_folders

List Folders

List all folders in the workspace with pagination and sorting.

ParameterspagesortBypageSize

get_folder_info

Get Folder Info

Get detailed information about a specific folder including its contents.

ParametersfolderIdrequired

create_folder

Create Folder

Create a new folder in the workspace, optionally assigned to users or user groups.

ParametersnamerequiredassignTodescription

clone_folder

Clone Folder

Create a new folder copied from an existing folder's name and description. Media in the source folder is not copied. Set isSaveDefaultView to also copy the source folder's default view.

ParametersnameassignTofolderIdrequireddescriptionisSaveDefaultView

update_folder

Update Folder

Update a folder. `name` must always be supplied (the server replaces the folder config). Pass `assignTo` to replace who can access it; omit it to keep the current assignment.

ParametersnamerequiredassignTofolderIdrequireddescription

delete_folder

Delete Folder

Permanently delete a folder. The folder must be empty: the request is refused if it still holds any media or if it is the workspace's last folder, so move or delete its media first.

ParametersfolderIdrequired

check_recorder_status

Check Recorder Status

Check whether a recorder/survey is active and accepting submissions.

Parameterstokenrequired

create_recorder

Create Recorder

Create a new recorder or survey for collecting audio/video submissions. The recorder is live as soon as it is created: anyone with its public link can submit. By default each submission emails the recorder owner (if they opted in) and any users in notifyUsers, and emails a confirmation to the respondent when they give an email (see `notification`), and it fires the workspace's embed_recorder.recording_received webhook and recording_received automations. Creating the recorder fires the workspace's embed_recorder.created webhook if one is registered.

ParametersmetanamerequiredoptionsdurationfolderIddescriptionnotifyUsersnotificationisAutoAnalyzesourceLanguageclientInformation

list_recorders

List Recorders

List all recorders/surveys in the workspace.

ParameterspagesortBypageSize

clone_recorder

Clone Recorder

Duplicate an existing recorder including all its settings and questions. The copy gets its own public link, accepts submissions right away and sends the same submission emails, webhooks and automations as any recorder. Fires the workspace's embed_recorder.created webhook if one is registered.

ParametersnamefolderIdrecorderIdrequireddescription

get_recorder_info

Get Recorder Info

Get detailed information about a specific recorder including its settings and questions.

ParametersrecorderIdrequired

get_recorder_recordings

Get Recorder Submissions

List all submissions/recordings collected by a specific recorder.

ParametersrecorderIdrequired

generate_recorder_url

Get Recorder Share URL

Retrieve the existing shareable URL and embed iframe code for a recorder/survey. Read-only lookup: returns the recorder's pre-existing share link; it does not create, modify, or publish anything.

ParametersrecorderIdrequired

update_recorder_settings

Update Recorder Settings

Update configuration settings for a recorder (branding, capture options, etc.). Only the supplied settings change, and they apply to the recorder's live public page right away. `name` must always be supplied.

ParametersmetanamerequiredoptionsdurationfolderIdrecorderIdrequireddescriptionnotifyUsersnotificationisAutoAnalyzesourceLanguage

update_recorder_questions

Update Recorder Questions

Update the survey questions and respondent-info settings for a recorder. The `questions` array replaces the recorder's existing questions, and changes apply to the recorder's live public page right away.

ParametersnameemailconsentquestionsrequiredrecorderIdrequired

delete_recorder

Delete Recorder

Permanently delete a recorder/survey. Its public link stops accepting submissions. Existing recordings are preserved. Fires the workspace's embed_recorder.deleted webhook if one is registered.

ParametersrecorderIdrequired

create_embed

Create Embed Widget

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. If an embed already exists for that media or folder set, it is returned instead. A single-media embed is viewable by anyone with the link while the media's privacy mode is public (the default); a folder embed is created with an auto-generated password. Use update_embed to change privacy or the password, or to show labels and comments (meta isLabels, isComments; off by default), or to brand a shared dashboard (meta logo, logoDark, theme, backgroundColor, primaryColor, titleColor, fontFamily).

ParametersmediaIdfolderIds

update_embed

Update Embed Widget

Update an existing embed widget: appearance/feature toggles via `meta`, and privacy. Passing `mediaId` with `privacyMode` sets that privacy mode on the media file itself; a public mode makes the media viewable by anyone with the embed link. Setting `privacyMode` clears any existing password unless a new one is supplied in the same call.

ParametersmetaembedIdrequiredmediaIdpasswordprivacyMode

check_embed

Check Embed Exists

Check if an embed exists for a media file and retrieve its configuration.

ParametersmediaIdrequired

get_embed_iframe_url

Get Embed Iframe URL

Get the iframe URL for embedding a media player/transcript on a webpage.

ParametersmediaIdrequired

list_embed_sessions

List Embed Sessions

Viewing analytics for an embed the user owns: list the visits (sessions) to one embed, newest first by default. Each visit shows when it started and was last active, whether it is still live, total and active time, media opened, time watched, questions asked, traffic source and campaign tags, whether it was a bot, and the viewer's identity if they chose to share it. Returns sessions with totalCount, page and pageSize. Use get_embed_session with a session's _id for its full timeline.

ParameterstofrompagesortdevicesearchviewercountryembedIdrequiredmediaIdtrafficpageSize+4 more

get_embed_session_summary

Get Embed Session Summary

Owner analytics for an embed: totals across its visits for a date range. Returns KPIs (sessions, unique and returning visitors, identified viewers, average active time, media opens, time watched, questions and sessions with questions), sessions and visitors per day, top traffic sources, and a paged table of media with opens, unique viewers, plays, time watched, completion rate, questions and downloads.

ParameterstotzfromembedIdrequiredtrafficmediaPageincludeOwnermediaPageSize

get_embed_session

Get Embed Session

Viewing analytics for an embed the user owns: one visit in full. Returns the visit with the media it opened (time watched, plays, seeks, furthest position, completed), the questions asked in chat, and a paged list of its events in time order, plus how many earlier visits the same viewer has made to this embed. Use eventsPage and eventsPageSize to read long timelines.

ParametersidrequiredembedIdrequiredeventsPageeventsPageSize

ask_ai_chat

Ask AI Chat

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. Each question is charged to the account's chat usage. The assistant can also call other Speak AI tools and actions in the user's connected third-party apps (for example, sending a message), so a prompt can change data or send content outside this chat.

ParameterstagspromptrequiredendDatefieldIdfiltersfieldIdsfolderIdmediaIdspromptIdspeakersfolderIdsstartDate+5 more

get_analysis_quote

Get Analysis Quote

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.

ParametersmediaIdrequiredmodelIdanalysisInputrequired

retry_ai_chat

Retry AI Chat

Retry a failed or incomplete AI Chat response. Use when a previous ask_ai_chat call returned an error or incomplete answer. The turn runs again with its original settings, replaces the earlier answer for that message, and is charged to the account's chat usage again. Like ask_ai_chat, the assistant can call other Speak AI tools and actions in connected third-party apps.

ParameterspromptIdrequiredmessageIdrequired

get_chat_history

Get Chat History

Get a list of recent AI Chat conversations. Returns conversation summaries with promptIds that can be used to retrieve full messages via get_chat_messages.

Parameterslimit

get_chat_messages

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.

ParameterspagequeryfolderIdmediaIdspageSizepromptId

delete_chat_conversation

Delete Chat Conversation

Delete an entire chat conversation from conversation history, so it and its messages no longer appear. No tool can restore it.

ParameterspromptIdrequired

list_prompts

List Recent Chat Messages

List recent AI Chat messages across the workspace, newest first, with each prompt, answer, references, and the media or folder it ran on. Returns messages from the 25 most recently updated conversations in the workspace, filtered to those the caller can access, so a member may see fewer.

Takes no parameters.

get_favorite_prompts

Get Favorite Prompts

Get all prompts and answers that have been marked as favorites. Useful for finding saved insights and important AI-generated analysis.

Takes no parameters.

toggle_prompt_favorite

Toggle Prompt Favorite

Mark or unmark a chat message as a favorite for easy retrieval later.

ParameterspromptIdrequiredmessageIdrequiredisFavoriterequired

update_chat_title

Rename Chat

Update the title of a chat conversation for easier identification in history.

ParameterstitlerequiredpromptIdrequired

submit_chat_feedback

Submit Chat Feedback

Submit feedback on a chat response (thumbs up/down). Replaces any earlier feedback on that message, and the score and reason are shared with the Speak AI team for review.

ParametersscorerequiredreasonpromptIdrequiredmessageIdrequired

get_chat_statistics

Get Chat Statistics

Get usage statistics for AI Chat / chat. Returns metrics on prompt usage, optionally filtered by date range.

ParametersendDatestartDate

export_chat_answer

Export Chat Answer

Export a specific AI Chat answer. Useful for saving AI-generated summaries, reports, or analysis results.

ParametersfileTyperequiredpromptIdrequiredmessageIdrequired

list_meeting_events

List Meeting Events

List scheduled or completed meeting assistant events with filtering and pagination.

ParameterspagepageSizeplatformTypemeetingStatus

schedule_meeting_event

Schedule AI Meeting Assistant

Schedule the Speak AI meeting assistant to join and record an online meeting (Zoom, Google Meet, Microsoft Teams, or Webex). The assistant joins as a participant other attendees can see, at meetingDate or right away when meetingDate is omitted.

ParameterstitlerequiredfolderIdmeetingURLrequiredmeetingDatemeetingLanguage

remove_assistant_from_meeting

Remove Assistant from Meeting

Remove the Speak AI assistant from an active or scheduled meeting.

ParametersmeetingAssistantEventIdrequired

delete_scheduled_assistant

Cancel Scheduled Meeting Assistant

Cancel and delete a scheduled meeting assistant event.

ParametersmeetingAssistantEventIdrequired

get_live_meeting_transcript

Get Live Meeting Transcript

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.

ParametersmediaIdsinceEndInSecmeetingAssistantEventId

list_fields

List Custom Fields

List all custom fields defined in the workspace. Each field returns a `slug` (for example `regulator_comment`) alongside its `id`, `name`, and `type`. Put `{{field.<slug>}}` in the prompt text you send and Speak substitutes that field's value for the media before the model sees it. A slug is unique per company and never changes when the field is renamed, so prefer it over the field name. A field with no slug yet resolves by `id` in the same token. Every other tool that takes a field id wants this `id` (12 characters), never the database `_id`.

Takes no parameters.

create_field

Create Custom Field

Create a new custom field for categorizing and tagging media. The response starts with the new field's `id`; use that `id` (not `_id`) wherever a field id is needed.

ParametersnamerequiredtyperequiredpromptdescriptionotherValuesprivacyModeallowedValuesallowedValuesModenotApplicableValues

update_multiple_fields

Bulk Update Custom Field Values

Set custom field values across media in a single batch operation, overwriting existing values. Scope the update with `mediaIds`, or with `folderId` to update every media in that folder; when both are given only `mediaIds` is used. Empty values are skipped, so this cannot clear a field. Shared dashboard links cache widget data, so field and media edits can take up to about 5 minutes to show for date ranges that include today (15 at most) and up to about 17 minutes for past ranges (60 at most); any dashboard update refreshes it at once.

ParametersfieldsrequiredfolderIdmediaIds

update_field

Update Custom Field

Update a specific custom field by ID. `name` must always be supplied (the server replaces the field config).

ParametersidrequirednamerequiredtypepromptdescriptionotherValuesprivacyModeallowedValuesallowedValuesModenotApplicableValues

list_labels

List Labels

List the workspace's labels as a tree: groups (isGroup true) carry their labels in `labels`, and ungrouped labels sit at the top level. Each item has labelId, name, description, color, parentId, source (`speak` for Speak label sets), usageCount and isActive. Use the labelIds of non-group labels with apply_label. Anyone in the workspace can read labels.

Parameterssearchstatus

create_label

Create Label

Create a label, or a label group with isGroup true. Labels are shared by the whole workspace and are applied to transcript words with apply_label. A label can sit in one group (parentId); groups cannot be nested, and a group has no color. Names are unique among active labels under the same parent, ignoring case and extra spaces: 409 means the name is taken. Requires the labels create permission (every member by default). The change is recorded in your Speak Notifications under Label (type label).

ParametersnamerequiredcolorisGroupparentIdsortOrderdescription

update_label

Update Label

Rename, recolor, describe, move or reorder a label or group. Send only the fields to change. parentId null moves a label to the top level. An archived label cannot be edited (restore_label first), and a group cannot take a color or a parent. 409 means another active label under the same parent already has the name. Requires the labels update permission (every member by default). The change is recorded in your Speak Notifications under Label (type label).

ParametersnamecolorlabelIdrequiredparentIdsortOrderdescription

archive_label

Archive Label

Archive a label so it can no longer be applied; archiving a group archives its labels too. Labels already applied to transcripts stay where they are, and restore_label undoes this. Safe to repeat. Returns archivedCount. Requires the labels delete permission (owners and admins by default). The change is recorded in your Speak Notifications under Label (type label).

ParameterslabelIdrequired

restore_label

Restore Label

Restore an archived label; restoring a group also restores its archived labels. A label whose name is now used by an active label stays archived and is counted in skippedCount. 409 means the label's own name is taken (rename the active one first); a merged label cannot be restored, and a label cannot be restored while its group is archived. Requires the labels delete permission (owners and admins by default). The change is recorded in your Speak Notifications under Label (type label).

ParameterslabelIdrequired

merge_labels

Merge Labels

Merge one label into another: every place the source label is applied moves onto the target (a span that had both keeps one), then the source is archived with mergedInto set. This cannot be undone by restore_label. Both must be active, non-group labels and different. Returns movedCount. Requires both the labels update and labels delete permissions; only owners and admins have labels delete by default. The change is recorded in your Speak Notifications under Label (type label).

ParameterslabelIdrequiredtargetLabelIdrequired

add_speak_label_sets

Add Speak Label Sets

Add ready-made label groups from Speak: sales_qa (Unprofessional, Slang, Objection, Great moment, Compliance risk), research (Pain point, Motivation, Quote for report, Surprise, Follow-up), meetings (Decision, Action item, Risk, Open question) and transcript_feedback (Wrong split, Misheard word, Wrong speaker, Bad translation). Safe to repeat: a group or label that already exists with the same name is reused, and a set whose group name is taken by a plain label is skipped (listed in skippedSets). Requires the labels create permission (every member by default). The change is recorded in your Speak Notifications under Label (type label).

Parameterssetsrequired

list_media_labels

List Media Labels

List the labels applied to a media file's transcript, in transcript order, with the file's current transcriptRevision. Each item has mediaLabelId, labelIds and an anchor: startWord and endWord (inclusive word indices), exact (the labelled words), startInSec, endInSec, speakerIds and status. Status active means the same words; shifted means the transcript was edited and most of the words survived; needs_review means the words changed too much, so anchor holds a suggested range and lastResolved the last confirmed one (confirm or move it with update_media_label). Anyone who can open the file can read its labels.

ParametersstatusmediaIdrequired

apply_label

Apply Label

Apply one or more labels to a span of words in a media file's transcript. Give the span as quote (words copied from get_transcript; this tool finds their position and the current transcriptRevision for you) or as range plus expectedTranscriptRevision. If the same span already has labels, the new ones are added to it. Check the returned anchor.exact to confirm the right words were labelled. A 409 that says the transcript changed means someone edited it after your revision was read: read the transcript again (get_transcript) and retry with the new range or quote. Nothing was saved. A 400 means the range is outside the transcript or a label is archived, a group, or not in this workspace. Requires the labels assign permission (every member by default). The change is recorded in your Speak Notifications under Label (type label).

ParametersquoterangemediaIdrequiredlabelIdsrequiredoccurrenceexpectedTranscriptRevision

update_media_label

Update Media Label

Change a labelled span on a transcript. Do exactly one of: labelIds to replace its labels; action keep to confirm its current anchor (after the transcript was edited and its status is shifted or needs_review); or action replace with a new quote or range to move it. A 409 that says the transcript changed means someone edited it after your revision was read: read the transcript again (get_transcript) and retry with the new range or quote. Nothing was saved. Keep also answers 409 when the anchor was built on an older revision: list_media_labels again first. Requires the labels assign permission (every member by default). The change is recorded in your Speak Notifications under Label (type label).

ParametersquoterangeactionmediaIdrequiredlabelIdsoccurrencemediaLabelIdrequiredexpectedTranscriptRevision

remove_media_label

Remove Media Label

Remove a labelled span from a transcript. The label itself stays in the workspace, and comments linked to the span stay without the link. Requires the labels assign permission (every member by default). The change is recorded in your Speak Notifications under Label (type label).

ParametersmediaIdrequiredmediaLabelIdrequired

list_media_comments

List Media Comments

List the comment threads on a media file, with the file's current transcriptRevision. Each thread is its first comment with `replies` (oldest first). A comment on words carries an anchor (startWord, endWord, exact, times, status as in list_media_labels); a whole-file comment has none. A deleted first comment that has replies stays with an empty body and isDeleted true. Anyone who can open the file can read its comments.

ParametersfiltermediaIdrequired

add_comment

Add Comment

Add a comment to a media file. Three kinds: on the whole file (no quote or range), on words in the transcript (quote, or range plus expectedTranscriptRevision, exactly as in apply_label), or a reply to a thread (parentId, with no span of its own). Replies go one level deep, so parentId must be a thread's first comment. A reply notifies the thread's starter in Speak, unless the starter wrote the reply. mediaLabelId links the comment to a labelled span on this file. A 409 that says the transcript changed means someone edited it after your revision was read: read the transcript again (get_transcript) and retry with the new range or quote. Nothing was saved. Requires the comments create permission (every member by default). The change is recorded in your Speak Notifications under Comment (type comment).

ParametersbodyrequiredquoterangemediaIdrequiredparentIdoccurrencemediaLabelIdexpectedTranscriptRevision

update_comment

Update Comment

Edit the text of a comment. Only the comment's author can edit its text (403 otherwise). To resolve or reopen a thread, use resolve_comment. The change is recorded in your Speak Notifications under Comment (type comment).

ParametersbodyrequiredmediaIdrequiredcommentIdrequired

resolve_comment

Resolve Comment

Resolve a comment thread, or reopen it with resolved false. Only a thread's first comment can be resolved (400 on a reply). Resolving or reopening someone else's thread notifies its starter in Speak. Requires the comments update permission (every member by default). The change is recorded in your Speak Notifications under Comment (type comment).

ParametersmediaIdrequiredresolvedcommentIdrequired

delete_comment

Delete Comment

Delete a comment. Deleting a thread's first comment keeps its replies visible under an empty placeholder. You can always delete your own comments; deleting someone else's needs the comments delete permission (owners and admins by default), otherwise 403. The change is recorded in your Speak Notifications under Comment (type comment).

ParametersmediaIdrequiredcommentIdrequired

list_automations

List Automations

List automation rules in the workspace, with paging and filters.

ParameterspagequerysortByrunTypeisActivepageSizefolderIds

list_automation_names

List Automation Names

List the names and ids of active automations that contain an AI chat (magic prompt) step. Inactive automations and automations without an AI chat step are not included; use list_automations for the full list.

Takes no parameters.

get_automation

Get Automation Details

Get detailed information about a specific automation rule, including its trigger and step graph.

ParametersautomationIdrequired

get_automation_runs

Get Automation Runs

Get the run history (executions) for an automation, with paging and optional status filter.

ParameterspagestatuspageSizeautomationIdrequired

create_automation

Create Automation

Create an automation: a trigger plus ordered steps (V2 graph model). The automation is active by default and then runs on its own every time its trigger fires. Depending on its steps, each run can send email to any address, post to the workspace's Slack, send HTTP requests to any webhook URL, fetch a file from a URL into Speak, run actions in connected third-party apps through Composio. An inbound-webhook trigger creates a public URL that accepts payloads (returned as inboundWebhook.inboundUrl). A Composio app-event trigger subscribes to events on the connected third-party account. Valid trigger and step types come from list_automation_triggers and list_automation_actions. To map inbound-webhook payload fields, send a test payload to the URL with ?test=1, read the tokens with get_inbound_webhook, then call update_automation.

ParametersnamerequiredstepsrequiredrunTypetriggerrequiredisActivescheduletriggersdescription

update_automation

Update Automation

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. The saved steps run automatically on later triggers and can send email, post to Slack, call webhook URLs, and run actions in connected third-party apps. Changing a Composio app-event trigger updates the subscription on that third-party account.

ParametersnamerequiredstepsrequiredrunTypetriggerrequiredisActivescheduletriggersdescriptionautomationIdrequired

toggle_automation_status

Toggle Automation Status

Toggle an automation rule between active and inactive. This flips the current state, so call get_automation first if you need to know which way it will flip. An active automation runs on its own every time its trigger fires, and its steps can send email, post to Slack, call webhook URLs, and run actions in connected third-party apps. For a Composio app-event trigger, this also creates or removes the event subscription on the connected third-party account.

ParametersautomationIdrequired

bulk_update_automation_status

Bulk Update Automation Status

Activate or deactivate multiple automations at once. An active automation runs on its own every time its trigger fires, and its steps can send email, post to Slack, call webhook URLs, and run actions in connected third-party apps. For Composio app-event triggers, this also creates or removes the event subscription on the connected third-party account.

ParametersisActiverequiredautomationIdsrequired

bulk_assign_automation_folders

Bulk Assign Automation Folders

Set the folder scope for multiple automations at once. Pass an empty folderIds array to remove the folder restriction (run on all folders).

ParametersfolderIdsrequiredautomationIdsrequired

run_automations

Run Automations

Manually run one or more automations against one or more media items now (outside the normal trigger). Only active automations run; inactive or unknown automation ids and unknown media ids are skipped without an error. The runs happen in the background and this returns only an acknowledgement, so check results with get_automation_runs. Every step executes for real: it can send email, post to Slack, call webhook URLs, and run actions in connected third-party apps.

ParametersmediaIdsrequiredautomationIdsrequired

delete_automation

Delete Automation

Permanently delete an automation rule. If it has an inbound webhook URL, that URL stops accepting payloads, and any event subscription it holds on a connected third-party account through Composio is removed.

ParametersautomationIdrequired

get_automation_run

Get Automation Run

Get one automation run in full: every step, in dependency order, with what it produced and why it stopped. Use this after test_automation or to explain a run that went the wrong way. On a branched automation the run's overall status is not the whole story — a filter that stops one leg marks the entire run "killed" even when the other leg finished its work — so read the per-step summary this returns, not just the status.

ParametersrunIdrequiredautomationIdrequired

get_automation_run_stats

Get Automation Run Stats

Aggregate run counts for an automation over a period — how many completed, failed, or were stopped.

ParametersdaysautomationIdrequired

test_automation

Test Automation

Run one automation once against one media item to see which way it branches. This is a real run, not a dry run, and it works on inactive automations too. Only the run's own status notifications are suppressed and translation steps are skipped. Notify steps still send their email or Slack message, outbound webhooks still fire, and Composio actions still run against the connected third-party account. Confirm with the user before testing an automation that sends anything outside Speak. It needs a mediaId and sends no webhook payload, so on an inbound-webhook automation the payload tokens resolve to empty. Returns a runId; read the result with get_automation_run.

ParametersmediaIdrequiredautomationIdrequired

validate_automation_graph

Validate Automation Graph

Check a step graph without saving anything. Reports the same problems create_automation and update_automation would refuse — branch wiring, rules a condition cannot actually read, shapes the Speak web editor could not reopen — plus non-blocking warnings. Use it to iterate on a branched automation instead of discovering the problems one failed save at a time.

ParametersstepsrequiredrunTypetrigger

describe_automation_graph

Describe Automation Graph

Show a saved automation's steps as an indented branch tree instead of a flat list. Worth calling before update_automation, which replaces the whole automation: editing one leg means re-sending every step with its dependsOn intact, and this shows what the shape currently is.

ParametersautomationIdrequired

list_automation_apps

List Automation Apps

List the apps in Speak's automation catalog: Speak's built-in apps plus, when enabled, third-party apps available through Composio, each marked connected or not_connected for this user. Read-only: the list comes from Speak's own catalog and the user's saved connections, and no third-party service is called. Use the app slugs with list_automation_triggers and list_automation_actions.

Takes no parameters.

list_automation_triggers

List Automation Triggers

List the trigger types available in the automation catalog. Optionally filter by app.

Parametersapp

list_automation_actions

List Automation Actions

List the step types (actions) available in Speak's automation catalog, optionally for one app slug, plus the fields each filter or condition step can test. Read-only: served from Speak's own catalog and the user's saved connections, with no third-party calls. Listing an action does not run it.

Parametersapp

create_webhook

Create Webhook

Create an outbound webhook. From then on, Speak automatically POSTs a JSON payload to callbackUrl, an external endpoint, for each subscribed event (event type, ids such as mediaId or folderId, state, and for chat events the prompt and answer text).

ParameterseventscallbackUrlrequireddescription

list_webhooks

List Webhooks

List all configured webhooks in the workspace.

Takes no parameters.

update_webhook

Update Webhook

Update an existing webhook. This is a partial update — only the fields you supply are changed; `callbackUrl` is always required, the rest are left untouched if omitted.

ParameterseventswebhookIdrequiredcallbackUrlrequireddescription

provision_inbound_webhook

Provision Inbound Webhook

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.

Takes no parameters.

get_inbound_webhook

Get Inbound Webhook

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

ParameterschildKeywebhookIdautomationId

get_webhook_attempts

Get Webhook Attempts

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.

ParameterspagepageSizewebhookIdrequired

delete_webhook

Delete Webhook

Permanently delete an outbound webhook and its delivery attempt history; its endpoint stops receiving notifications. Cannot be undone.

ParameterswebhookIdrequired

search_media

Search Media Library

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.

ParametersqueryrequiredendDatestartDatefilterList

create_clip

Create Highlight Clip

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.

ParameterstagstitlerequiredmediaTyperequiredtimeRangesrequireddescriptionmergeStrategy

get_clips

List Clips

List clips, optionally filtered by folder or media files. If clipId is provided, returns a single clip with its download URL (when processed).

ParametersclipIdfolderIdmediaIds

update_clip

Update Clip

Update a clip's title, description, or tags.

ParameterstagstitleclipIdrequireddescription

delete_clip

Delete Clip

Permanently delete a clip and its associated media file.

ParametersclipIdrequired

build_automation

Build Automation

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. create_automation takes the raw wire format instead. Passing automationId replaces that whole automation. The automation is active by default and then runs on its own every time its trigger fires: upload steps fetch a file from any URL, slack notify steps post to the workspace's Slack, and call_webhook steps send HTTP requests to any URL. An inbound_webhook trigger creates a public URL that accepts payloads.

ParametersnamerequiredstepsrequiredtriggerrequiredisActiveorTriggersdescriptionautomationId

upload_and_analyze

Upload and Analyze Media

Upload and transcribe media from a URL — a direct/public file URL, OR a shareable social/video page link, which Speak resolves to the underlying media automatically. Supported page links: YouTube, TikTok, Instagram, X/Twitter, Facebook, Reddit, SoundCloud, Twitch, Dailymotion, Streamable, Snapchat, Pinterest, Tumblr, Bilibili, VK, OK.ru and Rutube. Vimeo and Loom page links are not supported. Each accepted upload creates a media item. 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.

ParametersurlrequirednametagsfolderIdmediaTypesourceLanguage

upload_and_analyze_batch

Upload and Analyze Several URLs

Import up to 25 audio or video URLs in one call. Each URL is imported the same way as upload_and_analyze, and transcription starts for each one. At most 5 uploads run at once. Each URL may be a direct public file URL or a page link from a supported platform, which the server resolves to the underlying media. Supported page links: YouTube, TikTok, Instagram, X/Twitter, Facebook, Reddit, SoundCloud, Twitch, Dailymotion, Streamable, Snapchat, Pinterest, Tumblr, Bilibili, VK, OK.ru and Rutube. Vimeo and Loom page links are not supported. Each accepted upload creates a media item. A failed URL does not stop the others, and the result lists every URL as uploaded (with its mediaId) or failed (with the reason). Returns once the uploads are accepted. Use get_media_status per mediaId, or list_media on the folder, to follow processing.

ParameterstagsurlsrequiredfolderIdmediaTypeconcurrencysourceLanguage

upload_local_file

Upload Local File

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. Each upload creates a media item. After upload, use get_media_status to poll for completion, then get_transcript and get_media_insights.

ParametersnametagsfilePathrequiredfolderIdmediaTypesourceLanguage

list_users

List Users

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.

ParameterspagesortBypageSizefilterName

list_user_groups

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

Takes no parameters.

create_user_group

Create User 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.

Parametersusersdescriptionrequired

update_user_group

Update User Group

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.

Parameters_idrequiredusersrequireddescriptionrequired

delete_user_group

Delete User Group

Permanently delete a user group. The users themselves are not deleted, but members lose any access that was shared with the group (for example dashboards assigned to it).

Parametersidrequired

list_dashboards

List Dashboards

List all analytics dashboards the caller can access, including share state and each dashboard's current `revision` (needed for update_dashboard).

Takes no parameters.

get_dashboard

Get 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). Saved viewer settings, including settings.profiles groups (fieldId, label, imageShape, and entries with id, name, description, link, imageKey, and a signed imageUrl preview that is ignored if sent back), are included when the server returns them.

ParametersdashboardIdrequired

list_dashboard_widgets

List Dashboard Widgets

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.

Takes no parameters.

create_dashboard

Create 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. Creating a dashboard does not share it publicly; only share_dashboard creates a public link. If settings.feedback.sheetWebhookUrl is set, each Feedback submission made on the shared dashboard is posted to that external Google Apps Script URL. Shared dashboard links cache widget data, so field and media edits can take up to about 5 minutes to show for date ranges that include today (15 at most) and up to about 17 minutes for past ranges (60 at most); any dashboard update refreshes it at once. Viewer settings (the settings input): Do not pass settings unless the user explicitly asks to change this dashboard's viewer settings. Saving fields, feedback or fieldEdits moves that dashboard onto the settings flow immediately: its media pages use these groups and this Feedback setup from then on. Each section (fields, feedback, fieldEdits, labels, comments, profiles) replaces that whole section when sent; a section left out keeps its saved value. Call get_dashboard first and resend every key of the section you change; a key left out resets to its default. Get field ids from list_fields. Ids that are not the company's fields are dropped when saving and returned in droppedFieldIds. When

ParametersicontitlerequiredsourcefilterswidgetsassignTosectionssettingsdateRangeisDefaultdescription

update_dashboard

Update Dashboard

Update a dashboard. Two modes. (1) Metadata-only: pass just icon/assignTo/filters/isDefault/settings, with no spec fields and no revision, except that saving settings.profiles also needs the `revision` from get_dashboard (a stale one returns a 409). (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. If settings.feedback.sheetWebhookUrl is set, each Feedback submission made on the shared dashboard is posted to that external Google Apps Script URL. Shared dashboard links cache widget data, so field and media edits can take up to about 5 minutes to show for date ranges that include today (15 at most) and up to about 17 minutes for past ranges (60 at most); any dashboard update refreshes it at once. Viewer settings (the settings input): Do not pass settings unless the user explicitly asks to change this dashboard's viewer settings. Saving fields, feedback or fieldEdits moves that dashboard onto the settings flow immediately: its media pages use these groups and this Feedback setup from then on. Each section (fields, feedback, fieldEdits, labels, comments, profiles) replaces that whole section when sent; a section left out keeps its saved value. Call get_dashboard first and resend every key of the section you change; a key left out resets to its default. Get field ids from list_fields. Ids that are not the company's fields are dropped when saving and returned in droppedFieldIds. When feedback.isEnabled is true, pass a non-empty feedback.fieldIds (score fields) rather than leaving it empty. Only set feedba

ParametersicontitlesourcefilterswidgetsassignTorevisionsectionssettingsdateRangeisDefaultdashboardIdrequired+1 more

delete_dashboard

Delete Dashboard

Soft-delete a dashboard. This also deactivates its public share link.

ParametersdashboardIdrequired

duplicate_dashboard

Duplicate Dashboard

Clone an existing dashboard into a new dashboard owned by the caller. The copy keeps the source's widgets (same widget ids), sections, filters, and viewer settings, gets a "<name> (copy)" title, has no shared users and no public link, and starts at revision 0. Edit it afterwards with update_dashboard.

ParametersdashboardIdrequired

share_dashboard

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

ParametersdashboardIdrequired

get_dashboard_speakers_insight

Get Dashboard Speakers Insight

Compute a speakers breakdown for a given folder scope, date range, and field filters. Standalone analytics — does not require a dashboard to exist.

ParametersendDatestartDatefilterListfolderScope

list_voice_agents

List Voice Agents

List the voice agents in the company (newest first). Each agent includes its agentId, name, personality/instructions, and voice/stt/llm/avatar configuration. Use the returned agentId with get_voice_agent or to filter list_voice_conversations.

Takes no parameters.

get_voice_agent

Get Voice Agent

Fetch a single voice agent by its agentId. Returns the full agent configuration. A cross-company agentId returns 404.

ParametersagentIdrequired

list_voice_conversations

List Voice Conversations

List the company's voice conversations (newest first). Optionally filter to a single agent. Each conversation includes its conversationId, agentId, status, duration, transcript summary, and usage/costs. Use conversationId with get_voice_conversation for the full record.

ParameterspagelimitagentId

get_voice_conversation

Get Voice Conversation

Fetch a single voice conversation by its conversationId, including transcript, usage, costs, and analysis. A cross-company conversationId returns 404.

ParametersconversationIdrequired

get_agent_analytics

Get Voice Agent Analytics

Owner analytics for one voice agent over a date range. Returns the range used; conversation totals with completion rate, average duration and returning callers; conversations per day split into web and phone; where callers are, their devices, browsers and traffic sources; web callers who left without saying anything and the number of open knowledge gaps (questions the agent could not answer); leads captured, handoffs and action items; engagement, sentiment, top topics, end reasons and satisfaction; busiest hours, weekdays and languages; and web versus phone counts. Test calls are left out unless includeTests is true, and the count of test calls is always returned. Leave start empty for all time; a start more than 5 years before end is moved up to 5 years. A cross-company agentId returns 404.

ParameterstzendstartagentIdrequiredcompareincludeTests

create_voice_agent

Create Voice Agent

Create a voice agent. Requires the OWNER or ADMIN role. name, personality, instructions, and voice (provider + voiceId) are required; everything else can be set now or later with update_voice_agent. Call list_voice_avatars or list_voices first to get valid ids.

ParametersllmnamerequiredvoicerequiredavatarfolderIdpersonalityrequiredchatSettingsinstructionsrequiredenableWebSearchconversationMode

update_voice_agent

Update Voice Agent

Update a voice agent. Requires the OWNER or ADMIN role. Send only the top-level fields you want to change; agentId, companyId, and userId are immutable and silently dropped if sent. Object fields (voice, llm, avatar, chatSettings) each replace the stored object whole, not merge -- fetch get_voice_agent first and resend every key of an object field you're not fully replacing.

ParametersllmnamevoiceavataragentIdrequiredfolderIdpersonalitychatSettingsinstructionsenableWebSearchconversationMode

list_voice_avatars

List Voice Avatars

List the video avatars available to attach to a voice agent (your company's own uploads plus the shared system catalog). Use the returned avatarId with create_voice_agent or update_voice_agent.

Takes no parameters.

list_voices

List Voices

List the text-to-speech voices available to a voice agent. Use the returned provider/voiceId with create_voice_agent or update_voice_agent's voice field. When an agent's llm.model is a Live (speech-to-speech) model, its usable voices are a fixed, smaller set scoped to that model instead of this full catalog.

Takes no parameters.

delete_voice_agent

Delete Voice Agent

Delete a voice agent. Requires the OWNER or ADMIN role. The agent is marked deleted and no tool can restore it: it stops appearing in list_voice_agents, and its share link, embedded widget, questions, and test suite stop working. Its stored data is not erased, past conversations stay in list_voice_conversations, and phone numbers assigned to it are not released.

ParametersagentIdrequired

create_voice_agent_from_prompt

Create Voice Agent From Prompt

Create a new voice agent from a plain-English description, via an LLM call. Requires the OWNER or ADMIN role. Saves a draft agent, then generates and saves its name, personality, instructions, chat settings, and default voice, speech-to-text, and LLM settings. Does not assign a phone number. The response includes the new agentId plus either the generated agent, or needsFollowUp: true with a followUpQuestion when the prompt is too vague. In that case the draft agent still exists with placeholder settings; call generate_voice_agent_config on that agentId with more detail.

ParametersnamepromptrequiredmanualInstructions

generate_voice_agent_config

Generate Voice Agent Config

Run the same prompt-to-config generation as create_voice_agent_from_prompt, but against an existing agent instead of creating a new one. Requires the OWNER or ADMIN role. On success the generated config is saved onto the agent immediately, overwriting its current name, personality, instructions, chat settings, and voice, speech-to-text, and LLM settings. If the prompt is too thin and manualInstructions was not sent, the response has needsFollowUp: true with a follow-up question instead — call this again with more detail.

ParameterspromptrequiredagentIdrequiredmanualInstructions

get_voice_agent_setup_guide

Get Voice Agent Setup Guide

Discovery + how-to helper for building and operating a Speak AI voice agent end to end. Returns the four configuration pieces every agent is built from, which tool covers each one, the recommended build order, and how testing/questions/knowledge-base/intelligence tools chain together after the agent exists. Call this before create_voice_agent or create_voice_agent_from_prompt if you are not already familiar with this tool surface.

Takes no parameters.

get_voice_test_suite

Get Voice Test Suite

Get a voice agent's test suite (its scenarios and run settings). Returns null in data.suite if none has been created yet — not a 404.

ParametersagentIdrequired

update_voice_test_suite

Update Voice Test Suite

Create or update a voice agent's test suite. Requires the OWNER or ADMIN role. Upserts. Send the full scenarios array you want to keep — it replaces the stored one, it is not merged.

ParametersagentIdrequiredscenariosmaxCostPerRunscheduledCronautoRunOnKbUpdateautoRunOnInstructionSave

generate_voice_test_suite

Generate Voice Test Suite

Auto-generate a default test suite for a voice agent from its configuration (name, personality, instructions, welcome message, topics to avoid), via an LLM call. Requires the OWNER or ADMIN role. Overwrites the suite's existing scenarios.

ParametersagentIdrequired

start_voice_test_run

Start Voice Agent Test Run

Start a test run of a voice agent's scripted test suite. The run sends each enabled scenario's user messages to the agent as text, in order, and grades every criterion; it does not place phone calls. Requires the OWNER or ADMIN role. Returns the run in queued status; poll get_active_voice_test_run for progress and results. Returns 404 if the agent or its test suite does not exist, and 409 if the suite has no enabled scenarios or the agent already has a queued, running, or paused run.

ParametersagentIdrequired

get_active_voice_test_run

Get Active Voice Test Run

Get a voice agent's currently active test run (queued, running, or paused). Returns null in data.run if none is active — not a 404.

ParametersagentIdrequired

pause_voice_test_run

Pause Voice Test Run

Pause a voice agent's test run. Requires the OWNER or ADMIN role. Valid only from queued or running. Takes effect after the current scenario finishes.

ParametersrunIdrequiredagentIdrequired

resume_voice_test_run

Resume Voice Test Run

Resume a paused voice agent test run, transitioning it back to running. Requires the OWNER or ADMIN role. Valid only from paused. The run continues from the next scenario.

ParametersrunIdrequiredagentIdrequired

cancel_voice_test_run

Cancel Voice Test Run

Cancel a voice agent test run. Requires the OWNER or ADMIN role. Valid from queued, running, or paused. The run stops at its next AI call. Terminal — a cancelled run can never be resumed.

ParametersrunIdrequiredagentIdrequired

list_voice_test_runs

List Voice Test Runs

List a voice agent's test runs, most recent first. Capped at 100 regardless of limit.

ParameterslimitagentIdrequired

get_voice_test_run

Get Voice Test Run

Get a test run's full detail, including scenarioResults and recommendations. Scoped to your company; agentId is not used to filter this lookup, only runId.

ParametersrunIdrequiredagentIdrequired

apply_voice_test_recommendation

Apply Voice Test Recommendation

Apply a test run recommendation's quick action to the agent (e.g. patch_instructions appends the suggested fix to the agent's instructions). Requires the OWNER or ADMIN role.

ParametersrecIdrequiredrunIdrequiredagentIdrequired

get_voice_test_baseline

Get Voice Test Baseline

Get a voice agent's best-scoring completed test run, used to detect regressions on later runs. Returns null in data.baseline if no run has completed yet.

ParametersagentIdrequired

get_voice_test_score_history

Get Voice Test Score History

Get completed-run score points for a voice agent, most recent first, for charting. Capped at 100 regardless of limit. Only status=completed runs are included.

ParameterslimitagentIdrequired

list_voice_questions

List Voice Questions

List the questions configured on a voice agent, in the order it asks them. Each is an agent-level instance of a question template with its own required/attempts/no-response settings and optional field mapping.

ParametersagentIdrequiredenabledOnly

get_voice_question

Get Voice Question

Fetch a single voice agent question by its fieldId, scoped to your company.

ParametersfieldIdrequired

create_voice_question

Create Voice Question

Attach a question template to a voice agent. Requires the OWNER or ADMIN role. agentId and templateId are both required and must belong to your company (or, for templateId, be a public system template) — 404 if either isn't found. Returns 409 if the agent already has an enabled question whose template has the same name, ignoring case and spacing (they save to the same answer key); disable or delete that question first, or create this one with enabled: false.

ParametersorderagentIdrequiredenabledrequiredtemplateIdrequiredcustomConfigmappedFieldIdtriggerConditionmaxPromptAttemptsnoResponseBehavior

update_voice_question

Update Voice Question

Partially update a voice agent question — only the fields you send are changed. Requires the OWNER or ADMIN role. agentId and templateId are fixed after create; sending them is silently dropped. Returns 409 when setting enabled: true on a disabled question while another enabled question on the same agent has a template with the same name, ignoring case and spacing (they save to the same answer key); other edits to an existing duplicate still succeed.

ParametersorderenabledfieldIdrequiredrequiredcustomConfigmappedFieldIdtriggerConditionmaxPromptAttemptsnoResponseBehavior

delete_voice_question

Delete Voice Question

Permanently remove a question from a voice agent and decrement the underlying template's usageCount. Requires the OWNER or ADMIN role. The template itself is not deleted and can be attached to another agent later.

ParametersfieldIdrequired

reorder_voice_questions

Reorder Voice Questions

Set the order a voice agent asks its questions in. Requires the OWNER or ADMIN role. Bulk-writes the order value on each listed question (written directly, not resequenced), then returns the agent's full question list in its new order. Entries whose fieldId doesn't belong to agentId are silently skipped.

ParametersagentIdrequiredfieldOrdersrequired

list_voice_question_templates

List Voice Question Templates

List the question templates visible to your company: Speak's shared system templates, plus your own company's templates. Use the returned templateId with create_voice_question.

Parameterscategory

create_voice_question_template

Create Voice Question Template

Create a company-scoped question template — the "custom question" a user names themselves rather than picking from Speak's shared library. Requires the OWNER or ADMIN role. The server stamps companyId and forces isSystemTemplate to false, so this template is only ever visible to your company.

ParametersnamerequiredtagscategoryrequiredisPublicfieldTyperequireddescriptionrequireddefaultConfigrequired

list_voice_kb_gaps

List Voice KB Gaps

List a voice agent's pending knowledge-base gaps — questions callers asked that the agent answered with low confidence or an explicit "I don't know," surfaced automatically after calls. Up to the 50 most recent pending gaps, newest first.

ParametersagentIdrequired

analyze_voice_kb_gaps

Analyze Voice KB Gaps

Trigger knowledge-base gap analysis over a voice agent's recent calls. Requires the OWNER or ADMIN role. Runs in the background and returns immediately — new gaps appear in list_voice_kb_gaps once analysis finishes, not synchronously with this response.

ParametersagentIdrequired

add_voice_kb_gap

Add Voice KB Gap

Write a knowledge-base gap's answer into the voice agent's attached knowledge base as a new document, and mark the gap added. Requires the OWNER or ADMIN role. Fails with 409 if the gap was already added or dismissed, or if the agent has no knowledge base collection to write into.

ParametersgapIdrequiredtitleansweragentIdrequired

dismiss_voice_kb_gap

Dismiss Voice KB Gap

Mark a voice agent's knowledge-base gap dismissed without writing anything to the knowledge base. Requires the OWNER or ADMIN role.

ParametersgapIdrequiredagentIdrequired

list_voice_faq_suggestions

List Voice FAQ Suggestions

List a voice agent's pending FAQ suggestions — questions multiple callers asked in similar form, clustered and drafted into a reusable question/answer pair. Up to the 20 largest clusters, largest first.

ParametersagentIdrequired

generate_voice_faq_suggestions

Generate Voice FAQ Suggestions

Trigger FAQ clustering over a voice agent's recent calls. Requires the OWNER or ADMIN role. Runs in the background and returns immediately — new suggestions appear in list_voice_faq_suggestions once generation finishes, not synchronously with this response.

ParametersagentIdrequired

add_voice_faq_suggestion

Add Voice FAQ Suggestion

Write an FAQ suggestion's question/answer into the voice agent's attached knowledge base as a new document, and mark the suggestion added. Requires the OWNER or ADMIN role. Fails with 409 if the suggestion was already added or dismissed, or if the agent has no knowledge base collection to write into.

ParametersansweragentIdrequiredquestionsuggestionIdrequired

update_voice_faq_suggestion

Update Voice FAQ Suggestion

Edit a still-pending FAQ suggestion's question and/or answer before adding it. Requires the OWNER or ADMIN role. Fails with 400 if the suggestion was already added or dismissed.

ParametersansweragentIdrequiredquestionsuggestionIdrequired

dismiss_voice_faq_suggestion

Dismiss Voice FAQ Suggestion

Mark a voice agent's FAQ suggestion dismissed without writing anything to the knowledge base. Requires the OWNER or ADMIN role.

ParametersagentIdrequiredsuggestionIdrequired

list_voice_agent_resources

List Voice Agent Resources

List the knowledge documents/links a voice agent searches during calls — separate from KB gaps and FAQ suggestions, which are the self-improvement layer that surfaces what an agent is missing, not the content itself.

ParameterspagelimitsearchagentId

create_voice_agent_resource

Create Voice Agent Resource

Add one document/link to a voice agent's knowledge base. Requires the OWNER or ADMIN role. The server does not fetch the URL; it embeds the title, description, and URL slug so the agent can retrieve the link during live calls.

ParametersurlrequiredtitlerequiredactionrequiredagentIdrequiredcontentTypedescriptionrequired

bulk_create_voice_agent_resources

Bulk Create Voice Agent Resources

Add up to 100 documents/links to a voice agent's knowledge base in one call. Requires the OWNER or ADMIN role. The URLs are not fetched; each entry's title, description, and URL slug is embedded independently. Use this instead of calling create_voice_agent_resource in a loop.

ParametersagentIdrequiredresourcesrequired

update_voice_agent_resource

Update Voice Agent Resource

Partially update a voice agent resource — send at least one field. Requires the OWNER or ADMIN role. agentId cannot be changed. Changing url, title, or description re-triggers embedding.

ParametersurltitleactionresourceIdrequiredcontentTypedescription

delete_voice_agent_resource

Delete Voice Agent Resource

Soft-delete a voice agent resource — it stops appearing in lists and the agent stops searching it, but the document is not physically removed. Requires the OWNER or ADMIN role.

ParametersresourceIdrequired

analyze_voice_instruction_gaps

Analyze Voice Instruction Gaps

Advisory only — compares a voice agent's current instructions against anchors/original intent/recent call summaries you supply and suggests up to 3 patches. Requires the OWNER or ADMIN role. Nothing is written; pass a suggestion's suggestedPatch to apply_voice_instruction_gap to actually apply it.

ParametersagentIdrequiredanchorsoriginalPromptconversationSummaries

apply_voice_instruction_gap

Apply Voice Instruction Gap

Insert a suggested instruction patch into a voice agent's instructions and persist the result. Requires the OWNER or ADMIN role. suggestedPatch is typically taken directly from analyze_voice_instruction_gaps.

ParametersagentIdrequiredsuggestedPatchrequiredinsertAfterSection

Version history

17
  1. v1.41.1LatestOct 30, 2026
  2. v1.40.1Oct 29, 2026
  3. v1.39.0Oct 19, 2026
  4. v1.38.2Oct 16, 2026
  5. v1.38.1Oct 16, 2026
  6. v1.37.0Oct 15, 2026
  7. v1.35.0Oct 15, 2026
  8. v1.34.1Oct 14, 2026
  9. v1.33.2Oct 13, 2026
  10. v1.33.1Oct 9, 2026
  11. v1.30.0Oct 7, 2026
  12. v1.29.0Oct 5, 2026
  13. v1.28.6Oct 5, 2026
  14. v1.28.5Oct 4, 2026
  15. v1.28.2Oct 3, 2026
  16. v1.28.1Oct 2, 2026
  17. v1.23.1Sep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listed15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.