Transcribe Audio URL
transcribe_audio_urlSubmit a public audio or video URL for transcription with speaker diarization, returning a job ID to track progress.
Instructions
Submit a publicly-accessible audio or video URL for transcription with speaker diarization. Returns a job_id you can poll with get_transcription_status, or use transcribe_audio_url_sync to wait synchronously.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public URL of audio/video file (mp3, m4a, wav, mp4, webm, etc.) Max 200 MB. | |
| language | No | ISO 639-1 code, e.g. "en", "es". Auto-detected if omitted. |
Implementation Reference
- src/tools/transcribe-url.ts:31-37 (handler)The handler function that executes the transcribe_audio_url tool logic. Calls client.submitTranscription(url, language) and returns the job_id.
async ({ url, language }) => { const r = await client.submitTranscription(url, language); return { content: [{ type: 'text', text: `Job submitted. job_id: ${r.id}` }], structuredContent: jsonStructured(r), }; }, - src/tools/transcribe-url.ts:10-29 (schema)Input schema for transcribe_audio_url: requires a public audio/video URL (max 200 MB) and optional 2-letter ISO language code.
{ title: 'Transcribe Audio URL', description: 'Submit a publicly-accessible audio or video URL for transcription with speaker diarization. Returns a job_id you can poll with get_transcription_status, or use transcribe_audio_url_sync to wait synchronously.', inputSchema: z.object({ url: z .string() .url() .describe( 'Public URL of audio/video file (mp3, m4a, wav, mp4, webm, etc.) Max 200 MB.', ), language: z .string() .length(2) .optional() .describe( 'ISO 639-1 code, e.g. "en", "es". Auto-detected if omitted.', ), }), annotations: { readOnlyHint: false, openWorldHint: true }, - src/tools/transcribe-url.ts:7-39 (registration)Registration function that calls server.registerTool with name 'transcribe_audio_url', schema, annotations, and handler.
export function register(server: McpServer, client: GhostMinutesClient): void { server.registerTool( 'transcribe_audio_url', { title: 'Transcribe Audio URL', description: 'Submit a publicly-accessible audio or video URL for transcription with speaker diarization. Returns a job_id you can poll with get_transcription_status, or use transcribe_audio_url_sync to wait synchronously.', inputSchema: z.object({ url: z .string() .url() .describe( 'Public URL of audio/video file (mp3, m4a, wav, mp4, webm, etc.) Max 200 MB.', ), language: z .string() .length(2) .optional() .describe( 'ISO 639-1 code, e.g. "en", "es". Auto-detected if omitted.', ), }), annotations: { readOnlyHint: false, openWorldHint: true }, }, async ({ url, language }) => { const r = await client.submitTranscription(url, language); return { content: [{ type: 'text', text: `Job submitted. job_id: ${r.id}` }], structuredContent: jsonStructured(r), }; }, ); } - src/server.ts:32-42 (registration)Top-level registration: calls registerTranscribeUrl(server, client) to wire up the tool on the server.
registerTranscribeUrl(server, client); registerTranscribeSync(server, client); registerGetStatus(server, client); registerListTranscripts(server, client); registerGetTranscript(server, client); registerDeleteTranscript(server, client); registerSummarize(server, client); registerGetCredits(server, client); return server; } - src/client.ts:68-92 (helper)The GhostMinutesClient.submitTranscription method which POSTs to /mcp/transcribe with audio_file_url and optional language.
async submitTranscription( audioUrl: string, language?: string, ): Promise<{ id: string; [key: string]: unknown }> { try { const res = await this.http.post< unknown, AxiosResponse<{ id: string; [key: string]: unknown }> >( '/mcp/transcribe', { audio_file_url: audioUrl, ...(language ? { language } : {}), }, { headers: this.hasApiKey() ? { Authorization: `Bearer ${this.apiKey}` } : {}, }, ); return this.ensureOk(res); } catch (e) { this.handleThrown(e); } }