> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to the Audioscrape MCP server

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.

**Authentication:** OAuth 2.1/DCR
**Categories:** Search, Media, Transcription
**Tools:** 20: 17 read, 3 write, 0 destructive
**Users sign in with:** OAuth
**OAuth app:** Your own Audioscrape MCP server app
**Built by:** Vendor MCP
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=AUDIOSCRAPEMCP)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### 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_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### 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.

5. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   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.actions

   const connector = 'audioscrapemcp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { 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 call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'audioscrapemcp_get_charts',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_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.actions

   connection_name = "audioscrapemcp"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_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 call
   result = actions.execute_tool(
       tool_input={},
       tool_name="audioscrapemcp_get_charts",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'audioscrapemcp_fetch',
  toolInput: {
    id: '<id>',
  },
  connector: 'audioscrapemcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="audioscrapemcp_fetch",
    tool_input={
        "id": "<id>",
    },
    connection_name="audioscrapemcp",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `audioscrapemcp_fetch`

Fetch Result Document · Read-only

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.

Read only: yes. Destructive: no.

Inputs:

- `id` (`string`, required): A result id from the search tool (e.g. ep_12345)

Example input: `{"id":"<id>"}`

### `audioscrapemcp_get_charts`

Podcast Charts · Read-only

Get current podcast chart rankings (Apple Podcasts, Spotify) by country. Shows the top podcasts for a given market.

Read only: yes. Destructive: no.

Inputs:

- `country` (`string`, optional): Country code (e.g. 'us', 'gb', 'de'). Default: `us`.
- `limit` (`integer`, optional): Maximum number of rankings to return. Default: `50`.
- `platform` (`string`, optional): Chart platform: 'apple' or 'spotify'. Omit to get both platforms (each item includes a 'platform' field). One of: `apple`, `spotify`.

Example input: `{}`

### `audioscrapemcp_get_entity_graph`

Explore Entity Relationships · Read-only

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.

Read only: yes. Destructive: no.

Inputs:

- `entity` (`string`, required): Entity name or slug to explore (e.g. 'Elon Musk' or 'elon-musk')
- `limit` (`integer`, optional): Maximum number of relationships to return. Default: `20`.
- `relationship_type` (`string`, optional): Optional filter to one relationship type, e.g. 'employed_by', 'founded', 'opposes', 'supports', 'competes_with', 'invested_in'.
- `second_entity` (`string`, optional): Optional second entity name or slug. When given, returns how the two entities are connected instead of the full neighborhood.

Example input: `{"entity":"Elon Musk"}`

### `audioscrapemcp_get_episode_overview`

Get Episode Overview · Read-only

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.

Read only: yes. Destructive: no.

Inputs:

- `episode_id` (`string`, required): Episode ID (from search_audio, list_podcast_episodes, or get_transcript)

Example input: `{"episode_id":"<episode_id>"}`

### `audioscrapemcp_get_speaker`

Get Speaker Profile · Read-only

Get a speaker's bio and audio appearances (across podcasts and uploads). Use search_speakers first to find the person_slug.

Read only: yes. Destructive: no.

Inputs:

- `person_slug` (`string`, required): URL slug of the person (e.g. 'elon-musk')

Example input: `{"person_slug":"elon-musk"}`

### `audioscrapemcp_get_transcript`

Get Full Transcript · Read-only

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.

Read only: yes. Destructive: no.

Inputs:

- `episode_id` (`string`, required): Episode ID to retrieve
- `include_metadata` (`boolean`, optional): Include metadata (speakers, entities). Default: `true`.
- `include_segments` (`boolean`, optional): Include full transcript segments. Default: `true`.
- `max_chars` (`integer`, optional): Approximate response-size budget in bytes for the segment list (default 250000, max 400000). Lower it for tighter context budgets.
- `start_time` (`number`, optional): Resume point in seconds — use coverage.next_start_time from the previous response to page through a long episode. Default: `0`.

Example input: `{"episode_id":"<episode_id>"}`

### `audioscrapemcp_get_transcription_status`

Transcription Job Status · Read-only

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.

Read only: yes. Destructive: no.

Inputs:

- `job_id` (`integer`, required): The job_id returned by transcribe_audio

Example input: `{"job_id":1}`

### `audioscrapemcp_get_trending`

Trending Topics & People · Read-only

Currently trending people, topics, and organizations across recently transcribed audio.

Read only: yes. Destructive: no.

Inputs:

- `limit` (`integer`, optional): Maximum number of trending items per category. Default: `10`.

Example input: `{}`

### `audioscrapemcp_list_my_datasets`

List My Libraries & Datasets · Read-only

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).

Read only: yes. Destructive: no.

Inputs: none.

Example input: `{}`

### `audioscrapemcp_list_my_uploads`

List My Uploads · Read-only

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.

Read only: yes. Destructive: no.

Inputs:

- `created_after` (`string`, optional): Only uploads created on or after this date (YYYY-MM-DD or RFC 3339)
- `created_before` (`string`, optional): Only uploads created before this date; a bare YYYY-MM-DD includes that day
- `limit` (`integer`, optional): Maximum number of items to return. Default: `20`.
- `offset` (`integer`, optional): Offset for pagination. Default: `0`.
- `query` (`string`, optional): 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.

Example input: `{}`

### `audioscrapemcp_list_podcast_episodes`

List Podcast Episodes · Read-only

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).

Read only: yes. Destructive: no.

Inputs:

- `podcast_id` (`string`, required): Podcast ID to browse
- `limit` (`integer`, optional): Maximum number of episodes. Default: `50`.
- `offset` (`integer`, optional): Offset for pagination. Default: `0`.
- `sort_by` (`string`, optional): Sort by: 'date' or 'title'. One of: `date`, `title`. Default: `date`.

Example input: `{"podcast_id":"<podcast_id>"}`

### `audioscrapemcp_list_recent_transcripts`

List New Library Episodes · Read-only

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.

Read only: yes. Destructive: no.

Inputs:

- `days_back` (`integer`, optional): Number of days to look back. Default: `7`.
- `limit` (`integer`, optional): Maximum number of episodes. Default: `20`.
- `podcast_ids` (`array`, optional): Filter by specific podcast IDs

Example input: `{}`

### `audioscrapemcp_search`

Search · Read-only

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.

Read only: yes. Destructive: no.

Inputs:

- `query` (`string`, required): Search query — a topic, phrase, person, or company

Example input: `{"query":"Meridian Logistics, Helios Energy"}`

### `audioscrapemcp_search_audio`

Search Transcribed Audio · Read-only

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.

Read only: yes. Destructive: no.

Inputs:

- `query` (`string`, required): Search query text
- `filters` (`object`, optional): Optional filters
- `include_context` (`boolean`, optional): Include surrounding segments for context. Default: `false`.
- `limit` (`integer`, optional): Maximum number of results. Default: `50`.
- `offset` (`integer`, optional): Offset for pagination. Default: `0`.
- `search_type` (`string`, optional): Type of search: 'text' or 'semantic'. One of: `text`, `semantic`. Default: `text`.
- `sort_by` (`string`, optional): Sort results by: 'relevance', 'date', 'episode_title'. One of: `relevance`, `date`, `episode_title`. Default: `relevance`.
- `sort_order` (`string`, optional): Sort order: 'asc' or 'desc'. One of: `asc`, `desc`. Default: `desc`.

Example input: `{"query":"Meridian Logistics, Helios Energy"}`

### `audioscrapemcp_search_entities`

Search Knowledge Graph · Read-only

Search the knowledge graph for people, companies, locations, topics, and other entities mentioned in any transcribed audio.

Read only: yes. Destructive: no.

Inputs:

- `query` (`string`, required): Entity name to search for
- `dataset_id` (`integer`, optional): Only entities mentioned in this dataset (must be a dataset you can read)
- `limit` (`integer`, optional): Maximum number of results. Default: `20`.
- `type` (`string`, optional): Filter by entity type. One of: `person`, `organization`, `location`, `topic`, `product`.

Example input: `{"query":"Meridian Logistics, Helios Energy"}`

### `audioscrapemcp_search_podcasts`

Search Podcasts · Read-only

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.

Read only: yes. Destructive: no.

Inputs:

- `query` (`string`, required): Podcast title to search for
- `language` (`string`, optional): Filter by language code (e.g. 'en', 'de')
- `limit` (`integer`, optional): Maximum number of results. Default: `20`.

Example input: `{"query":"Meridian Logistics, Helios Energy"}`

### `audioscrapemcp_search_speakers`

Search Speakers · Read-only

Search speakers and hosts by name across all transcribed audio. Returns matching people with their slug — use get_speaker for their full appearance history.

Read only: yes. Destructive: no.

Inputs:

- `query` (`string`, required): Person name to search for (e.g. 'Joe Rogan', 'Lex')
- `limit` (`integer`, optional): Maximum number of results. Default: `20`.

Example input: `{"query":"Joe Rogan"}`

### `audioscrapemcp_create_share_link`

Create Share Link · Write

Create a shareable URL for a specific audio moment that unfurls with a social-media preview card on Twitter, Slack, LinkedIn, etc. Useful when the user wants to share a moment they found via search.

Read only: no. Destructive: no.

Inputs:

- `episode_id` (`integer`, required): The audio item id (from search_audio results, get_transcript, or list_my_uploads)
- `segment_text` (`string`, optional): Optional quote text to embed in the share preview's social card
- `timestamp` (`number`, optional): Optional moment within the audio (in seconds). If omitted, shares the whole item.

Example input: `{"episode_id":1}`

### `audioscrapemcp_request_upload_url`

Request Upload URL · Write

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.

Read only: no. Destructive: no.

Inputs:

- `description` (`string`, optional): Optional description or notes about the recording.
- `file_name` (`string`, optional): The file's name with extension (e.g. interview.m4a) so the format is known. Strongly recommended.
- `title` (`string`, optional): Optional title for the recording.

Example input: `{}`

### `audioscrapemcp_transcribe_audio`

Transcribe Audio · Write

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.

Read only: no. Destructive: no.

Inputs:

- `audio_file` (`object`, optional): A file the user attached in the chat (client file input). Preferred over audio_url when the user attached the audio directly.
- `audio_url` (`string`, optional): 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.
- `description` (`string`, optional): Optional description or notes about the recording.
- `title` (`string`, optional): Optional title for the recording. Defaults to the filename.

Example input: `{}`

## Related

Other Search connectors ([all 58](/agentkit/connectors/?category=search)):

- [Supadata](/agentkit/connectors/supadata/): Scalekit connector, API key, 21 tools
- [Exa](/agentkit/connectors/exa/): Scalekit connector, API key, 21 tools
- [Brave Search](/agentkit/connectors/brave/): Scalekit connector, API key, 18 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
