The Audioscrape MCP connector routes your AI agent's tool calls to Audioscrape's own MCP server through Scalekit. Each user signs in to Audioscrape once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 20 tools.
- Tools
- 20
- What they doRead · write · destructive
- 17 · 3 · 017 read3 write0 destructive
- Users sign in with
- OAuth
- OAuth app
- Your own Audioscrape MCP server app
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Audioscrape MCP connection
In AgentKit > Connections, create an Audioscrape MCP connection and copy its redirect URI. The name you give it is the
connection_nameyour code passes. See Configure connections.Register an OAuth app
Audioscrape MCP server connections use your own OAuth app. Register one with Audioscrape MCP server and add the redirect URI you copied.
Then enter the app's Client ID and Client Secret on the Audioscrape MCP connection.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'audioscrapemcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Audioscrape MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'audioscrapemcp_get_charts',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "audioscrapemcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Audioscrape MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="audioscrapemcp_get_charts",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolaudioscrapemcp_fetchCompatibility fetch: the full transcript of a search result as one plain-text document.Read-onlyFetch Result Document
Compatibility fetch: the full transcript of a search result as one plain-text document. Clients with structured-output support should prefer get_transcript, which returns typed segments.
Inputs
idstringrequired- A result id from the search tool (e.g. ep_12345)
audioscrapemcp_get_chartsGet current podcast chart rankings (Apple Podcasts, Spotify) by country.Read-onlyPodcast Charts
Get current podcast chart rankings (Apple Podcasts, Spotify) by country. Shows the top podcasts for a given market.
Inputs
countrystring- Country code (e.g. 'us', 'gb', 'de')default
us limitinteger- Maximum number of rankings to returndefault
50 platformstring- Chart platform: 'apple' or 'spotify'. Omit to get both platforms (each item includes a 'platform' field).one of
applespotify
audioscrapemcp_get_entity_graphExplore the knowledge graph extracted from transcribed audio.Read-onlyExplore Entity Relationships
Explore the knowledge graph extracted from transcribed audio. Given an entity (person, company, topic...), returns its typed relationships (employed_by, founded, supports, opposes, competes_with, invested_in, ...) with quote evidence from the source audio (episode + timestamp). With second_entity, returns how two entities are connected — including co-occurrence evidence when no typed relationship exists. Relationships are machine-extracted claims with evidence, not verified facts.
Inputs
entitystringrequired- Entity name or slug to explore (e.g. 'Elon Musk' or 'elon-musk')
limitinteger- Maximum number of relationships to returndefault
20 relationship_typestring- Optional filter to one relationship type, e.g. 'employed_by', 'founded', 'opposes', 'supports', 'competes_with', 'invested_in'.
second_entitystring- Optional second entity name or slug. When given, returns how the two entities are connected instead of the full neighborhood.
audioscrapemcp_get_episode_overviewSTART HERE for summaries and key takeaways: one small response with the episode's chapters (titled, timestamped), speakers, most-mentioned entities, and metadata.Read-onlyGet Episode Overview
START HERE for summaries and key takeaways: one small response with the episode's chapters (titled, timestamped), speakers, most-mentioned entities, and metadata. Orders of magnitude cheaper than reading the transcript. Drill into any chapter with get_transcript(episode_id, start_time=chapter.start_time); use search_audio to find specific quotes.
Inputs
episode_idstringrequired- Episode ID (from search_audio, list_podcast_episodes, or get_transcript)
audioscrapemcp_get_speakerGet a speaker's bio and audio appearances (across podcasts and uploads).Read-onlyGet Speaker Profile
Get a speaker's bio and audio appearances (across podcasts and uploads). Use search_speakers first to find the person_slug.
Inputs
person_slugstringrequired- URL slug of the person (e.g. 'elon-musk')
audioscrapemcp_get_transcriptGet the transcript and metadata for one audio item — works for both podcast episodes and uploaded audio.Read-onlyGet Full Transcript
Get the transcript and metadata for one audio item — works for both podcast episodes and uploaded audio. For summaries/takeaways call get_episode_overview FIRST (chapters are far cheaper than reading everything). Returns speaker-identified segments with timestamps. Long episodes are paged to stay under client response limits: check the coverage object (first key in the response) — if truncated=true, call again with start_time=next_start_time until truncated=false; a truncated page means pagination, NOT missing transcription. A 3-hour episode is typically 3-5 calls.
Inputs
episode_idstringrequired- Episode ID to retrieve
include_metadataboolean- Include metadata (speakers, entities)default
true include_segmentsboolean- Include full transcript segmentsdefault
true max_charsinteger- Approximate response-size budget in bytes for the segment list (default 250000, max 400000). Lower it for tighter context budgets.
start_timenumber- Resume point in seconds — use coverage.next_start_time from the previous response to page through a long episodedefault
0
audioscrapemcp_get_transcription_statusCheck the status of a transcription job submitted via transcribe_audio.Read-onlyTranscription Job Status
Check the status of a transcription job submitted via transcribe_audio. Returns status ('pending', 'running', 'waiting', 'completed', 'failed'), current pipeline stage, and when complete an episode_id you can use with search_audio or get_transcript. 'waiting' means the recording is stored and starts by itself when the workspace's allowance allows — relay the message, do not retry. When the file turned out to be a recording already in the workspace, the reply says so, reports that recording's status and episode_id, and no minutes were used — use that episode_id with get_transcript. A long recording is transcribed in parts: while 'running', a `progress` object says how many parts are done and whether get_transcript can already return them as a PARTIAL transcript (its coverage note says so; speaker labels are provisional until the last part lands) — never present a partial as the final transcript.
Inputs
job_idintegerrequired- The job_id returned by transcribe_audio
audioscrapemcp_get_trendingCurrently trending people, topics, and organizations across recently transcribed audio.Read-onlyTrending Topics & People
Currently trending people, topics, and organizations across recently transcribed audio.
Inputs
limitinteger- Maximum number of trending items per categorydefault
10
audioscrapemcp_list_my_datasetsList the libraries (curated workspaces) the user is subscribed to, and the datasets inside each.Read-onlyList My Libraries & Datasets
List the libraries (curated workspaces) the user is subscribed to, and the datasets inside each. Use this FIRST when the user asks what audio is available, what they have access to, or before scoping a search. Returns each library's curator, role, and dataset counts (podcasts, episodes, duration).
Inputs
This tool takes no inputs.
audioscrapemcp_list_my_uploadsList the user's own recordings and transcripts, newest first (audio they uploaded or had transcribed; private to them — does not include the public podcast corpus).Read-onlyList My Uploads
List the user's own recordings and transcripts, newest first (audio they uploaded or had transcribed; private to them — does not include the public podcast corpus). Each row carries the file's original filename. Use this for "my latest transcript", "my last recording", "my uploads", and BEFORE transcribe_audio when the user may have sent the file before (a new chat has no memory of earlier uploads; the recording is still here). Natural follow-up after transcribe_audio. To find specific recordings by name ("my call with Acme", "the Meridian and Helios calls"), pass query (matched against titles and filenames; separate several names with commas) instead of paging; created_after/created_before narrow by date. When has_more is true the list is cut off: narrow with query or page with next_offset before concluding a recording is missing.
Inputs
created_afterstring- Only uploads created on or after this date (YYYY-MM-DD or RFC 3339)
created_beforestring- Only uploads created before this date; a bare YYYY-MM-DD includes that day
limitinteger- Maximum number of items to returndefault
20 offsetinteger- Offset for paginationdefault
0 querystring- Find recordings by name: words matched against the title and original filename (all words of a name must appear). Separate several names with commas, e.g. "Meridian Logistics, Helios Energy". Omit to list everything.
audioscrapemcp_list_podcast_episodesList transcribed episodes within one podcast show, newest first, under a `coverage` header.Read-onlyList Podcast Episodes
List transcribed episodes within one podcast show, newest first, under a `coverage` header. Use search_podcasts first to find the podcast_id. READ `coverage` BEFORE the list: if `current` is false, our transcripts for this show stop at `last_transcribed` — tell the user that date plainly and offer transcribe_audio for newer episodes rather than searching again. An empty `episodes` page with transcribed_episodes=0 means the show is catalog-only (no transcripts yet).
Inputs
podcast_idstringrequired- Podcast ID to browse
limitinteger- Maximum number of episodesdefault
50 offsetinteger- Offset for paginationdefault
0 sort_bystring- Sort by: 'date' or 'title'one of
datetitledefaultdate
audioscrapemcp_list_recent_transcriptsList the newest episodes in the public library (podcasts and other public sources), ordered by publish date, newest first.Read-onlyList New Library Episodes
List the newest episodes in the public library (podcasts and other public sources), ordered by publish date, newest first. Use podcast_ids to scope to specific shows. This is NOT the user's own recordings: for "my latest transcript", "my last recording" or "what did I upload", call list_my_uploads instead.
Inputs
days_backinteger- Number of days to look backdefault
7 limitinteger- Maximum number of episodesdefault
20 podcast_idsarray- Filter by specific podcast IDs
audioscrapemcp_searchCompatibility search returning episode-level citable documents (id/title/url only).Read-onlySearch
Compatibility search returning episode-level citable documents (id/title/url only). Clients with rich-result support should prefer search_audio, which returns the matching segments with timestamps, speakers, and snippets.
Inputs
querystringrequired- Search query — a topic, phrase, person, or company
audioscrapemcp_search_audioSearch across all transcribed audio — public podcast episodes plus your own uploaded recordings — for any topic, phrase, or speaker.Read-onlySearch Transcribed Audio
Search across all transcribed audio — public podcast episodes plus your own uploaded recordings — for any topic, phrase, or speaker. The wider 360,000-podcast catalog is discoverable via search_podcasts but is not all transcribed, and per-show coverage varies by date: check `searchable` AND `coverage` there before scoping by podcast_ids or promising recent episodes. Returns matching segments with timestamps you can cite; matches and `total` count SPOKEN transcript text only (episode/show metadata affects ranking, never whether something is a hit). Text mode needs the words spoken close together in one short segment — use 1-2 distinctive words, or search_type='semantic' for conceptual questions. To read a whole episode, use get_transcript (paged), not repeated searches. Scope with filters.podcast_ids (ids from search_podcasts) and date filters. When the query names a known person/company/topic, entity_matches identifies it — follow up with get_entity_graph or search_entities for relationships and evidence.
Inputs
querystringrequired- Search query text
filtersobject- Optional filters
include_contextboolean- Include surrounding segments for contextdefault
false limitinteger- Maximum number of resultsdefault
50 offsetinteger- Offset for paginationdefault
0 search_typestring- Type of search: 'text' or 'semantic'one of
textsemanticdefaulttext sort_bystring- Sort results by: 'relevance', 'date', 'episode_title'one of
relevancedateepisode_titledefaultrelevance sort_orderstring- Sort order: 'asc' or 'desc'one of
ascdescdefaultdesc
audioscrapemcp_search_entitiesSearch the knowledge graph for people, companies, locations, topics, and other entities mentioned in any transcribed audio.Read-onlySearch Knowledge Graph
Search the knowledge graph for people, companies, locations, topics, and other entities mentioned in any transcribed audio.
Inputs
querystringrequired- Entity name to search for
dataset_idinteger- Only entities mentioned in this dataset (must be a dataset you can read)
limitinteger- Maximum number of resultsdefault
20 typestring- Filter by entity typeone of
personorganizationlocationtopicproduct
audioscrapemcp_search_podcastsFind a podcast show by name.Read-onlySearch Podcasts
Find a podcast show by name. Matches the title, the publisher ("The Daily New York Times" finds The Daily), initials ("LPOTL"), punctuation-free forms, typos, or a numeric podcast id. Each hit carries `searchable` (has ANY transcript) and `coverage` (how much and how recent: transcribed_episodes, last_transcribed, newest_feed_episode, current). Results with searchable=true are listed first — only those can return hits when used with search_audio filters.podcast_ids. When `coverage.current` is false, tell the user the show is covered through `last_transcribed` and offer transcribe_audio for newer episodes. When `podcasts` is EMPTY: do NOT retry with title variants — the reply already tried them. Read `suggestions` (near-matches to confirm with the user) and `hint`; the two real exits are search_audio for the topic (spoken words across every show) or transcribe_audio if the user has an episode link.
Inputs
querystringrequired- Podcast title to search for
languagestring- Filter by language code (e.g. 'en', 'de')
limitinteger- Maximum number of resultsdefault
20
audioscrapemcp_search_speakersSearch speakers and hosts by name across all transcribed audio.Read-onlySearch Speakers
Search speakers and hosts by name across all transcribed audio. Returns matching people with their slug — use get_speaker for their full appearance history.
Inputs
querystringrequired- Person name to search for (e.g. 'Joe Rogan', 'Lex')
limitinteger- Maximum number of resultsdefault
20
audioscrapemcp_request_upload_urlGet a one-time URL to upload an audio/video file the user attached in this chat when it cannot be passed as a link: PUT the raw file bytes to upload_url (e.g.WriteRequest Upload URL
Get a one-time URL to upload an audio/video file the user attached in this chat when it cannot be passed as a link: PUT the raw file bytes to upload_url (e.g. run `curl -T <file> "<upload_url>"` from where the file is), within 15 minutes. The response of that PUT contains job_id — then poll get_transcription_status. Use transcribe_audio instead when you have a direct link, a Drive/Dropbox/OneDrive share link, or the client supports file inputs (audio_file). On Claude.ai and the Claude desktop app the upload only works after the user adds mcp.audioscrape.com under Settings → Create and edit files → Allowed domains; the response says so in client_setup — relay it, or prefer asking the user for a share link, which needs no setting.
Inputs
descriptionstring- Optional description or notes about the recording.
file_namestring- The file's name with extension (e.g. interview.m4a) so the format is known. Strongly recommended.
titlestring- Optional title for the recording.
audioscrapemcp_transcribe_audioTranscribe an audio or video FILE with speaker diarization; the result is indexed into the user's private workspace for search_audio and get_transcript.WriteTranscribe Audio
Transcribe an audio or video FILE with speaker diarization; the result is indexed into the user's private workspace for search_audio and get_transcript. Give the file ONE of two ways. (1) audio_url: a direct link to the media file, or a Google Drive / Dropbox / OneDrive share link (share links are converted to direct downloads automatically — the file must be shared 'anyone with the link'). (2) audio_file: a file the user attached in this chat, when the client supports file inputs. NEVER pass a chat-sandbox path (sandbox:/…, /mnt/data/…) or a chatgpt.com URL as audio_url — those cannot be fetched and are rejected with a hint. If the client cannot pass attachments (Claude.ai and the Claude desktop app cannot), the path that needs no permission is a share link: ask the user to share the recording from Google Drive, Dropbox or OneDrive with 'anyone with the link' and pass that link as audio_url. Only fall back to request_upload_url when a share link is not possible; on Claude that upload needs mcp.audioscrape.com under Settings → Create and edit files → Allowed domains first. Web PAGE links (TikTok/Instagram/YouTube pages) are not files and are rejected. Returns a job_id — poll get_transcription_status. Transcription typically takes a few minutes. If the user refers to a recording they already sent — in this chat or an earlier one — call list_my_uploads first (it lists filenames) and read it with get_transcript instead of sending the file again. A file whose bytes are already in the workspace is matched, not transcribed twice, and uses no minutes; the status reply says so and points at the existing recording.
Inputs
audio_fileobject- A file the user attached in the chat (client file input). Preferred over audio_url when the user attached the audio directly.
audio_urlstring- Direct http(s) URL to the media FILE (mp3, wav, m4a, ogg, flac, aac, opus, mp4, mov, webm, mkv), or a Google Drive / Dropbox / OneDrive share link shared with 'anyone with the link'. Not a web page. Not a sandbox:/ or /mnt/data path. Omit when passing audio_file.
descriptionstring- Optional description or notes about the recording.
titlestring- Optional title for the recording. Defaults to the filename.
No tools match.