saidwire-mcp
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@saidwire-mcptranscribe ~/Downloads/meeting.mp3 and save it as meeting.srt"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Saidwire MCP server
Speech-to-text for Claude Desktop, Claude Code, Cursor, Windsurf, VS Code and any other Model Context Protocol client. Ask your assistant to transcribe a recording on your computer or at a public URL, and get plain text, subtitles (SRT/VTT) or word-level timestamps back.
"Transcribe ~/Downloads/standup.m4a and list the action items." "Make subtitles for https://example.com/talk.mp3 and save them to ~/talk.srt."
English speech-to-text, punctuated and capitalised.
WAV, MP3, FLAC, Ogg/Opus, WebM, M4A/MP4 and AAC, up to 100 MB / 60 minutes per file.
$0.30 per audio hour. New keys include 120 free hours, no card needed.
Built and maintained by Saidwire, the company that runs the service.
1. Get a free API key
Sign up at saidwire.com/dev and copy your key
(it starts with sk_live_).
Related MCP server: faster-whisper-mcp
2. Add the server to your client
You need uv (it provides uvx;
no Node or npm needed):
curl -LsSf https://astral.sh/uv/install.sh | sh # macOS / Linux
# Windows: powershell -c "irm https://astral.sh/uv/install.ps1 | iex"Claude Desktop
Settings → Developer → Edit Config (claude_desktop_config.json), then restart Claude:
{
"mcpServers": {
"saidwire": {
"command": "uvx",
"args": ["saidwire-mcp"],
"env": { "SAIDWIRE_API_KEY": "sk_live_your_key_here" }
}
}
}If Claude says it cannot find uvx, replace "uvx" with the full path from which uvx
(it usually ends in /.local/bin/uvx). Desktop apps do not always see your shell's PATH.
Or double-click saidwire-mcp.mcpb (from the GitHub release) to install it as a Claude
Desktop extension; Claude asks for the key.
Claude Code
claude mcp add saidwire --scope user -e SAIDWIRE_API_KEY=sk_live_your_key_here -- uvx saidwire-mcpCursor
~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project):
{
"mcpServers": {
"saidwire": {
"command": "uvx",
"args": ["saidwire-mcp"],
"env": { "SAIDWIRE_API_KEY": "sk_live_your_key_here" }
}
}
}Windsurf
~/.codeium/windsurf/mcp_config.json: the same mcpServers block as Cursor.
VS Code (Copilot agent mode)
.vscode/mcp.json:
{
"inputs": [
{ "type": "promptString", "id": "saidwire-key", "description": "Saidwire API key", "password": true }
],
"servers": {
"saidwire": {
"command": "uvx",
"args": ["saidwire-mcp"],
"env": { "SAIDWIRE_API_KEY": "${input:saidwire-key}" }
}
}
}Any other client
Command uvx saidwire-mcp (stdio transport), with SAIDWIRE_API_KEY in its environment.
pip install saidwire-mcp also works and installs a saidwire-mcp command.
Tools
tool | what it does |
| Transcribes an audio file on this computer. Use an absolute path. |
| Downloads a public audio file (direct http/https link) and transcribes it. |
format:text(plain transcript),json(transcript, utterances and per-word timestamps),srtorvtt(subtitles).include_words: add per-word start and end times totextorjsonoutput.output_path: also save the result to this absolute path (for example~/talk.srt).
Settings
environment variable | default | |
| (required) | Your key from saidwire.com/dev. |
|
| Size limit for |
| off | Set to |
|
| API base URL. |
Privacy
The server runs on your computer. It reads only the files you ask it to transcribe, sends the audio to the Saidwire API over HTTPS, and returns the text to your client. Your key stays in your local client config. See "Data handling" in the API docs for how the service treats audio.
Troubleshooting
"SAIDWIRE_API_KEY is not set": add the
envblock shown above and restart the client."API key was not accepted" (401): copy the whole key, including the part after the dot.
"included hours are used up" (402): add hours at saidwire.com/dev.
"web page, not an audio file":
transcribe_urlneeds a direct link to the audio file, not a page that plays it.Anything else: support@saidwire.com (include the
request_idfrom the error).
The API
This server uses the pre-recorded endpoint POST https://api.saidwire.com/v1/listen.
Saidwire also offers real-time streaming over WebSocket (final transcripts about 35 ms after
end of speech) and an OpenAI-compatible POST /v1/audio/transcriptions.
Docs: saidwire.com/docs/api.
Development
uv venv && uv pip install -e ".[test]"
.venv/bin/pytest # offline unit tests + MCP stdio no-key test
SAIDWIRE_API_KEY=sk_live_... SAIDWIRE_TEST_AUDIO=/abs/path/clip.wav .venv/bin/pytest -m live -vLicense
MIT
Available Tools
2 toolstranscribe_fileA
Transcribe a local audio file (WAV, MP3, FLAC, Ogg/Opus, WebM, M4A/MP4, AAC) to text.
Args: path: Absolute path to the audio file on this computer (up to 100 MB / 60 minutes). format: "text" (plain transcript), "json" (transcript, utterances and word timestamps), "srt" or "vtt" (subtitles with timestamps). include_words: Add per-word start/end times (for "text" and "json"). output_path: Optional absolute path to also save the result to, e.g. /path/talk.srt.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| format | No | text | |
| output_path | No | ||
| include_words | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does add real constraints: a 100 MB / 60 minute ceiling and the fact that output_path writes a file to disk as a side effect. It omits failure behavior, runtime/latency for long files, and whether processing happens locally or remotely.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and scope are front-loaded in one sentence, followed by a compact args block where every line adds information. No filler or repetition of schema types.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and all four parameters are substantively covered. Gaps are behavioral rather than structural: no indication of expected latency, error handling, or whether the transcript is also returned when output_path is set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: path is described as an absolute path on this computer with size/duration limits, format explains what each enum value returns (utterances and word timestamps in json, subtitle timing in srt/vtt), include_words notes its restriction to text/json, and output_path gives a concrete example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Transcribe a local audio file ... to text') with supported formats enumerated. The word 'local' implicitly distinguishes it from the sibling transcribe_url, so an agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use/when-not statement and no prerequisites (auth, model, language handling) are given. The 'local file' framing vs. the transcribe_url sibling only implies the selection rule rather than stating it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcribe_urlA
Download a public audio file from an http(s) URL and transcribe it to text.
The file is downloaded by this server (default limit 100 MB, set SAIDWIRE_MAX_DOWNLOAD_MB to change it) and sent to Saidwire. Use a direct link to the audio, not a web page.
Args: url: Direct http(s) link to an audio file. format: "text", "json" (with word timestamps), "srt" or "vtt". include_words: Add per-word start/end times (for "text" and "json"). output_path: Optional absolute path to also save the result to.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| format | No | text | |
| output_path | No | ||
| include_words | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the server itself downloads the file, a 100 MB default limit tunable via SAIDWIRE_MAX_DOWNLOAD_MB, and that content is sent to an external service (Saidwire). It omits failure modes (timeouts, unsupported formats, non-audio content) which would matter for a network-dependent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, followed by operational constraints, then an Args block. The only waste is slight overlap between the opening sentence and the `url` arg line, which restates the same idea in shorter form.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. For a 4-param network tool with no annotations, the description covers input rules, size limits, external transmission, and output formats; only error/edge-case behavior is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it documents all four parameters with meaning beyond the schema: format values are explained (json carries word timestamps), include_words is scoped to text/json, and output_path is described as an optional absolute path for additionally saving. Minor gap: no guidance on required vs optional beyond what is obvious.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opening sentence gives a specific verb pair and resource: download a public audio file from an http(s) URL and transcribe it. The URL-versus-file distinction from the sibling transcribe_file is implied rather than stated, so an agent must infer the split from the parameter names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use a direct link to the audio, not a web page" is an explicit, actionable constraint that steers input selection. It does not, however, state when to prefer this over transcribe_file or what happens with non-public/authenticated URLs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.0- First observed
transcribe_file - First observed
transcribe_url
TDQS
Scored across 2 tools
The two tools are cleanly separated by input source: transcribe_file takes a local absolute path, transcribe_url takes a public http(s) link. An agent can pick unambiguously based on whether it has a file or a URL, and the descriptions reinforce this with explicit download/size notes.
Both tools follow the same verb_noun pattern (transcribe_file, transcribe_url) with identical argument sets. The naming is fully predictable and the shared prefix makes the pairing obvious.
Only two tools is thin for a server surface, though the domain (speech-to-text) is narrow enough that it doesn't feel bloated or arbitrary. It sits at the borderline where a single additional capability would round it out.
The core lifecycle—local file and remote URL ingestion, plus text/json/srt/vtt output and optional file saving—is well covered, with no dead ends for the primary use case. Minor gaps exist around async job status for long files, batch processing, and explicit language/model selection.
Maintenance
Related MCP Connectors
Transcribe public audio/video URLs and retrieve transcripts, SRT, and VTT subtitles.
Transcribe audio and video with Speechmatics speech-to-text from Claude and any MCP client.
Transcribe audio & video: diarization, timed SRT/VTT, podcasts, paste-a-link, whole-feed batch.
Pay-per-minute speech-to-text: audio URL to text, SRT or VTT. Paid via x402 or credits.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to transcribe audio files from URLs or local paths using AssemblyAI's services, with support for speaker diarization, language detection, and asynchronous job management through a standardized MCP interface.4110 npm2MIT
- FlicenseAqualityDmaintenanceEnables high-quality transcription and subtitle generation from local media files or URLs using Faster Whisper on local hardware. It supports automatic language detection and integration with MCP clients for seamless speech-to-text workflows.3-
- AlicenseAqualityBmaintenanceProvides local audio transcription using whisper.cpp, supporting multiple models and audio formats. Enables transcription of audio files via MCP tools with optional timestamps.374 npm3MIT
- AlicenseAqualityCmaintenanceEnables MCP clients to transcribe audio/video files locally, generate SRT subtitles, and burn captions into videos via tool calls, without a cloud API.3MIT