Skip to main content
Glama
Saidwire

saidwire-mcp

Official
by Saidwire

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-mcp

Cursor

~/.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

transcribe_file(path, format="text", include_words=false, output_path=null)

Transcribes an audio file on this computer. Use an absolute path.

transcribe_url(url, format="text", include_words=false, output_path=null)

Downloads a public audio file (direct http/https link) and transcribes it.

  • format: text (plain transcript), json (transcript, utterances and per-word timestamps), srt or vtt (subtitles).

  • include_words: add per-word start and end times to text or json output.

  • output_path: also save the result to this absolute path (for example ~/talk.srt).

Settings

environment variable

default

SAIDWIRE_API_KEY

(required)

Your key from saidwire.com/dev.

SAIDWIRE_MAX_DOWNLOAD_MB

100

Size limit for transcribe_url downloads (max 100).

SAIDWIRE_ALLOW_PRIVATE_URLS

off

Set to 1 to let transcribe_url fetch from local or private network addresses.

SAIDWIRE_API_URL

https://api.saidwire.com

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 env block 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_url needs a direct link to the audio file, not a page that plays it.

  • Anything else: support@saidwire.com (include the request_id from 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 -v

License

MIT

Available Tools

2 tools
transcribe_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.

NameRequiredDescriptionDefault
pathYes
formatNotext
output_pathNo
include_wordsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

NameRequiredDescriptionDefault
urlYes
formatNotext
output_pathNo
include_wordsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 2 tool updatesv0.1.0
    • First observedtranscribe_file
    • First observedtranscribe_url

TDQS

A4.2/5.0

Scored across 2 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers