Connect Claude, Cursor, Windsurf, and other AI assistants to your Speak AI workspace.
83 tools, 5 resources, 3 prompts, 28 CLI commands — transcribe, analyze, search, and manage media at scale.
- Go to Speak AI API Keys
- Copy your API Key
| Method | Best for |
|---|---|
| CLI | Scripts, pipelines, quick one-off tasks |
| MCP Server | AI assistants (Claude, Cursor, Windsurf, VS Code) |
| Both | Full power — agents orchestrate, CLI automates |
Detects installed MCP clients and configures them automatically:
npm install -g @speakai/mcp-server
speakai-mcp initClaude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"speak-ai": {
"command": "npx",
"args": ["-y", "@speakai/mcp-server"],
"env": {
"SPEAK_API_KEY": "your-api-key"
}
}
}
}Claude Code
export SPEAK_API_KEY="your-api-key"
claude mcp add speak-ai -- npx -y @speakai/mcp-serverCursor
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"speak-ai": {
"command": "npx",
"args": ["-y", "@speakai/mcp-server"],
"env": {
"SPEAK_API_KEY": "your-api-key"
}
}
}
}Windsurf
Add to ~/.windsurf/mcp.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:
{
"mcpServers": {
"speak-ai": {
"command": "npx",
"args": ["-y", "@speakai/mcp-server"],
"env": {
"SPEAK_API_KEY": "your-api-key"
}
}
}
}Any MCP Client (STDIO)
SPEAK_API_KEY=your-key npx @speakai/mcp-server| Variable | Required | Default | Description |
|---|---|---|---|
SPEAK_API_KEY |
Yes | -- | Your Speak AI API key |
SPEAK_ACCESS_TOKEN |
No | Auto-managed | JWT access token (auto-fetched and refreshed) |
SPEAK_BASE_URL |
No | https://api.speakai.co |
API base URL |
Media (16 tools)
| Tool | Description |
|---|---|
get_signed_upload_url |
Get a pre-signed S3 URL for direct file upload |
upload_media |
Upload media from a public URL for transcription |
upload_local_file |
Upload a local file directly from disk |
upload_and_analyze |
Upload, wait for processing, return transcript + insights in one call |
list_media |
List and search media files with filters, pagination, and optional inline data (transcripts, speakers, keywords) via include param |
get_media_insights |
Get AI insights — topics, sentiment, summaries, action items |
get_transcript |
Get full transcript with speaker labels and timestamps |
get_captions |
Get subtitle-formatted captions for a media file |
update_transcript_speakers |
Rename speaker labels in a transcript |
bulk_update_transcript_speakers |
Rename speaker labels across multiple media files in one call (max 500) |
get_media_status |
Check processing status (pending -> processed) |
update_media_metadata |
Update name, description, tags, or folder |
delete_media |
Permanently delete a media file |
toggle_media_favorite |
Mark or unmark media as a favorite |
reanalyze_media |
Re-run AI analysis with latest models |
bulk_move_media |
Move multiple media files to a folder in one call |
Magic Prompt / AI Chat (12 tools)
| Tool | Description |
|---|---|
ask_magic_prompt |
Ask AI questions about media, folders, or your whole workspace |
retry_magic_prompt |
Retry a failed or incomplete AI response |
get_chat_history |
List recent Magic Prompt conversations |
get_chat_messages |
Get full message history for conversations |
delete_chat_message |
Delete a specific chat message |
list_prompts |
List available AI prompt templates |
get_favorite_prompts |
Get all favorited prompts and answers |
toggle_prompt_favorite |
Mark or unmark a chat message as favorite |
update_chat_title |
Rename a chat conversation |
submit_chat_feedback |
Rate a chat response (thumbs up/down) |
get_chat_statistics |
Get Magic Prompt usage statistics |
export_chat_answer |
Export a conversation or answer |
Folders & Views (11 tools)
| Tool | Description |
|---|---|
list_folders |
List all folders with pagination and sorting |
get_folder_info |
Get folder details and contents |
create_folder |
Create a new folder |
clone_folder |
Duplicate a folder and its contents |
update_folder |
Rename or update a folder |
delete_folder |
Delete a folder (media is preserved) |
get_all_folder_views |
List all saved views across folders |
get_folder_views |
List views for a specific folder |
create_folder_view |
Create a saved view with custom filters |
update_folder_view |
Update a saved view |
clone_folder_view |
Duplicate a view |
Recorder / Survey (10 tools)
| Tool | Description |
|---|---|
create_recorder |
Create a new recorder or survey |
list_recorders |
List all recorders |
get_recorder_info |
Get recorder details and questions |
clone_recorder |
Duplicate a recorder |
get_recorder_recordings |
List all submissions |
generate_recorder_url |
Get a shareable public URL |
update_recorder_settings |
Update branding and permissions |
update_recorder_questions |
Update survey questions |
check_recorder_status |
Check if recorder is active |
delete_recorder |
Delete a recorder |
Automations (5 tools)
| Tool | Description |
|---|---|
list_automations |
List automation rules |
get_automation |
Get automation details |
create_automation |
Create an automation rule |
update_automation |
Update an automation |
toggle_automation_status |
Enable or disable an automation |
Clips (4 tools)
| Tool | Description |
|---|---|
create_clip |
Create a highlight clip from time ranges across media files |
get_clips |
List clips or get a specific clip with download URL |
update_clip |
Update clip title, description, or tags |
delete_clip |
Permanently delete a clip |
Custom Fields (4 tools)
| Tool | Description |
|---|---|
list_fields |
List all custom fields |
create_field |
Create a custom field |
update_field |
Update a custom field |
update_multiple_fields |
Batch update multiple fields |
Webhooks (4 tools)
| Tool | Description |
|---|---|
create_webhook |
Create a webhook for event notifications |
list_webhooks |
List all webhooks |
update_webhook |
Update a webhook |
delete_webhook |
Delete a webhook |
Meeting Assistant (4 tools)
| Tool | Description |
|---|---|
list_meeting_events |
List scheduled and completed events |
schedule_meeting_event |
Schedule AI assistant to join a meeting |
remove_assistant_from_meeting |
Remove assistant from active meeting |
delete_scheduled_assistant |
Cancel a scheduled meeting assistant |
Media Embed (4 tools)
| Tool | Description |
|---|---|
create_embed |
Create an embeddable player widget |
update_embed |
Update embed settings |
check_embed |
Check if embed exists for media |
get_embed_iframe_url |
Get iframe URL for your website |
Text Notes (4 tools)
| Tool | Description |
|---|---|
create_text_note |
Create a text note for AI analysis |
get_text_insight |
Get AI insights for a text note |
reanalyze_text |
Re-run AI analysis on a text note |
update_text_note |
Update note content (triggers re-analysis) |
Exports (2 tools)
| Tool | Description |
|---|---|
export_media |
Export as PDF, DOCX, SRT, VTT, TXT, or CSV |
export_multiple_media |
Batch export with optional merge into one file |
Media Statistics & Languages (2 tools)
| Tool | Description |
|---|---|
get_media_statistics |
Get workspace-level stats — counts, storage, processing breakdown |
list_supported_languages |
List all supported transcription languages |
Search / Analytics (1 tool)
| Tool | Description |
|---|---|
search_media |
Deep search across transcripts, insights, and metadata with filters |
Resources provide direct data access without tool calls. Clients can read these URIs directly.
| Resource | URI | Description |
|---|---|---|
| Media Library | speakai://media |
List of all media files in your workspace |
| Folders | speakai://folders |
List of all folders |
| Supported Languages | speakai://languages |
Transcription language list |
| Transcript | speakai://media/{mediaId}/transcript |
Full transcript for a specific media file |
| Insights | speakai://media/{mediaId}/insights |
AI-generated insights for a specific media file |
Pre-built workflow prompts that agents can invoke to run multi-step tasks.
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"
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'"
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"
Install globally and configure once:
npm install -g @speakai/mcp-server
speakai-mcp config set-keyOr run without installing:
npx @speakai/mcp-server config set-key| Command | Description |
|---|---|
config set-key [key] |
Set your API key (interactive if no key given) |
config show |
Show current configuration |
config test |
Validate API key and test connectivity |
config set-url <url> |
Set custom API base URL |
init |
Interactive setup — configure key and auto-detect MCP clients |
| Command | Description |
|---|---|
list-media / ls |
List 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 |
| Command | Description |
|---|---|
ask <prompt> |
Ask AI about media, folders, or your whole workspace |
chat-history |
List past Magic Prompt conversations |
search <query> |
Full-text search across transcripts and insights |
| Command | Description |
|---|---|
list-folders / folders |
List all folders |
move <folderId> <mediaIds...> |
Move media files to a folder |
create-folder <name> |
Create a new folder |
clips |
List clips (filter by media or folder) |
clip <mediaId> |
Create a clip (--start and --end in seconds) |
| Command | Description |
|---|---|
stats |
Show workspace media statistics |
languages |
List supported transcription languages |
schedule-meeting <url> |
Schedule AI assistant to join a meeting |
create-text <name> |
Create a text note (--text or pipe via stdin) |
Every command supports:
--json— output raw JSON (for scripting and piping)--help— show command-specific help
# Upload and wait for processing
speakai-mcp upload https://example.com/interview.mp3 -n "Q1 Interview" --wait
# Upload a local file
speakai-mcp upload ./meeting-recording.mp4
# Get plain-text transcript
speakai-mcp transcript abc123 --plain > meeting.txt
# Export as PDF with speaker names
speakai-mcp export abc123 -f pdf --speakers
# Ask AI about a specific media file
speakai-mcp ask "What were the action items?" -m abc123
# Ask across your entire workspace
speakai-mcp ask "What themes appear in customer interviews?"
# Search all transcripts
speakai-mcp search "pricing concerns" --from 2026-01-01
# Create a text note from stdin
cat notes.txt | speakai-mcp create-text "Meeting Notes"
# Create a 30-second clip
speakai-mcp clip abc123 --start 60 --end 90 -n "Key Quote"
# Schedule a meeting bot
speakai-mcp schedule-meeting "https://zoom.us/j/123456" -t "Weekly Standup"
# List videos as JSON for scripting
speakai-mcp ls --type video --json | jq '.mediaList[].name'
# List media from the last week
speakai-mcp ls --from 2026-03-19 --to 2026-03-26
# Move 3 files to a folder
speakai-mcp move folder123 media1 media2 media3You: "Upload and transcribe this recording: https://example.com/meeting.mp3"
AI: I'll upload and analyze that for you.
-> upload_and_analyze(url, name)
[waits for processing... returns transcript + insights]
Here's your transcript with 3 speakers identified.
Key insights: 5 action items, positive sentiment overall.
Top topics: Q2 roadmap, hiring plan, budget review.
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-03-01")
-> ask_magic_prompt(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)
You: "Join my 2pm Zoom call, then send me a summary with action items"
AI: -> schedule_meeting_event(meetingUrl, scheduledAt: "2026-03-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_magic_prompt(mediaIds: [...], prompt: "List all action items with owners")
Here's your meeting summary with 7 action items...
You: "Prepare a brief from all meetings in the last week"
AI: -> list_media(from: "2026-03-18", mediaType: "audio")
-> get_media_insights(mediaId) [for each of 5 meetings]
Weekly Meeting Brief (Mar 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]
The MCP server and CLI handle token management automatically. If you're calling the REST API directly, here's the full auth flow:
Step 1 — Get an access token:
curl -X POST https://api.speakai.co/v1/auth/accessToken \
-H "Content-Type: application/json" \
-H "x-speakai-key: YOUR_API_KEY"Response:
{
"data": {
"email": "you@example.com",
"accessToken": "eyJhbG...",
"refreshToken": "eyJhbG..."
}
}Step 2 — Use the token on all subsequent requests:
curl https://api.speakai.co/v1/media \
-H "x-speakai-key: YOUR_API_KEY" \
-H "x-access-token: ACCESS_TOKEN_FROM_STEP_1"Step 3 — Refresh before expiry:
curl -X POST https://api.speakai.co/v1/auth/refreshToken \
-H "Content-Type: application/json" \
-H "x-speakai-key: YOUR_API_KEY" \
-H "x-access-token: CURRENT_ACCESS_TOKEN" \
-d '{"refreshToken": "REFRESH_TOKEN_FROM_STEP_1"}'Token Lifetimes:
| Token | Expiry | How to Renew |
|---|---|---|
| Access token | 80 minutes | Refresh endpoint or re-authenticate |
| Refresh token | 24 hours | Re-authenticate with API key |
Auth Rate Limits: 5 requests per 60 seconds on both /v1/auth/accessToken and /v1/auth/refreshToken.
- Folder IDs: Folders have both
_id(MongoDB ObjectId) andfolderId(string). All API operations usefolderId— this is the ID you should pass tolist_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).
- The MCP client automatically retries on
429with exponential backoff - For direct API usage, implement exponential backoff and respect
Retry-Afterheaders - Cache stable data (folder lists, field definitions, supported languages)
- Use
export_multiple_mediaover individual exports for batch operations - Use
upload_and_analyzeinstead of manual upload + poll + fetch loops - Use
bulk_move_mediato move multiple items at once instead of updating one by one - Use
bulk_update_transcript_speakersto rename speakers across many files instead of callingupdate_transcript_speakersper file - Use
list_mediawithinclude: ["transcription"]to fetch media with transcripts inline, avoiding N+1 calls toget_transcript
All tool errors follow this structure:
{
"content": [{ "type": "text", "text": "Error: HTTP 401: {\"message\": \"Invalid API key\"}" }],
"isError": true
}| Code | Meaning |
|---|---|
401 |
Invalid or missing API key / access token |
403 |
Insufficient permissions |
404 |
Resource not found |
429 |
Rate limit exceeded |
git clone https://github.com/speakai/speakai-mcp.git
cd speakai-mcp
npm install
npm run dev # Run with hot reload
npm run build # Production build- Speak AI — Platform
- API Documentation — Full API reference
- MCP Protocol — Model Context Protocol spec
- npm Package — npm registry
- Support — Email us
MIT
