Free podcast clip maker: share the exact moment of an episode from YouTube, Spotify or Apple.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Marks a span of an episode and hands back the links that play it. Nothing is downloaded, transcoded or re-hosted: a clip is a pointer — the publisher's own URL plus an in and an out point — so the whole clip fits in its link and this call cannot fail for reasons of storage. The episode's name and cover are resolved and returned, so you can check you clipped what you meant to before sharing the link. Times are seconds from the start of the episode, decimals allowed. Returns `{ clip, links: { page, short, sourceAtMoment, mp3 }, shareText }`. Usually followed by: share links.short (or links.page); links.mp3 downloads the audio.
Where it ends, in seconds. Must be at least half a second after `start`.
The episode to clip. Use the `clipUrl` from list_episodes or resolve_url when you have one.
Where the clip starts, in seconds from the start of the episode.
A title of your own for this clip, shown in place of the episode's on the clip's card, its page and the link's unfurl. The episode's name says which episode; this says what the clip is, which is what somebody scrolling past the link is deciding on. Trimmed to one line and cut at 50 characters, which is what the card holds without clamping on a phone. Leave it out and the episode's own name is used.
Also register the `/x/<id>` short link, which is the one thing this service stores. Set false to get only the self-contained long link and write nothing.
The show this episode came out of (its feed). Pass the `showUrl` a resolve or an episode list gave you: it is what lets the clip page name the episode when its own page won't say, and what keeps a clip playable when the page moves.
The episode's audio file, when `url` is a page rather than the file. Pass the `audioUrl` from a resolve or an episode list: the clip then plays without waiting on the page to be read again.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http bitepods https://bitepods.com/mcp
Marks a span of an episode and hands back the links that play it. Nothing is downloaded, transcoded or re-hosted: a clip is a pointer — the publisher's own URL plus an in and an out point — so the whole clip fits in its link and this call cannot fail for reasons of storage. The episode's name and cover are resolved and returned, so you can check you clipped what you meant to before sharing the link. Times are seconds from the start of the episode, decimals allowed. Returns `{ clip, links: { page, short, sourceAtMoment, mp3 }, shareText }`. Usually followed by: share links.short (or links.page); links.mp3 downloads the audio.
| Argument | Type | Description |
|---|---|---|
| end* | number | Where it ends, in seconds. Must be at least half a second after `start`. |
| url* | string | The episode to clip. Use the `clipUrl` from list_episodes or resolve_url when you have one. |
| start* | number | Where the clip starts, in seconds from the start of the episode. |
| title | string | A title of your own for this clip, shown in place of the episode's on the clip's card, its page and the link's unfurl. The episode's name says which episode; this says what the clip is, which is what somebody scrolling past the link is deciding on. Trimmed to one line and cut at 50 characters, which is what the card holds without clamping on a phone. Leave it out and the episode's own name is used. |
| shorten | boolean | Also register the `/x/<id>` short link, which is the one thing this service stores. Set false to get only the self-contained long link and write nothing. |
| showUrl | string | The show this episode came out of (its feed). Pass the `showUrl` a resolve or an episode list gave you: it is what lets the clip page name the episode when its own page won't say, and what keeps a clip playable when the page moves. |
| audioUrl | string | The episode's audio file, when `url` is a page rather than the file. Pass the `audioUrl` from a resolve or an episode list: the clip then plays without waiting on the page to be read again. |
{
"type": "object",
"required": [
"url",
"start",
"end"
],
"properties": {
"end": {
"type": "number",
"minimum": 0,
"examples": [
784.5
],
"description": "Where it ends, in seconds. Must be at least half a second after `start`."
},
"url": {
"type": "string",
"examples": [
"https://lexfridman.com/anthony-kaldellis/"
],
"description": "The episode to clip. Use the `clipUrl` from list_episodes or resolve_url when you have one."
},
"start": {
"type": "number",
"minimum": 0,
"examples": [
754.3
],
"description": "Where the clip starts, in seconds from the start of the episode."
},
"title": {
"type": "string",
"examples": [
"The bit where he admits the model was guessing"
],
"description": "A title of your own for this clip, shown in place of the episode's on the clip's card, its page and the link's unfurl. The episode's name says which episode; this says what the clip is, which is what somebody scrolling past the link is deciding on. Trimmed to one line and cut at 50 characters, which is what the card holds without clamping on a phone. Leave it out and the episode's own name is used."
},
"shorten": {
"type": "boolean",
"default": true,
"description": "Also register the `/x/<id>` short link, which is the one thing this service stores. Set false to get only the self-contained long link and write nothing."
},
"showUrl": {
"type": "string",
"description": "The show this episode came out of (its feed). Pass the `showUrl` a resolve or an episode list gave you: it is what lets the clip page name the episode when its own page won't say, and what keeps a clip playable when the page moves."
},
"audioUrl": {
"type": "string",
"description": "The episode's audio file, when `url` is a page rather than the file. Pass the `audioUrl` from a resolve or an episode list: the clip then plays without waiting on the page to be read again."
}
},
"additionalProperties": false
}What a short id stands for: the episode, the two times, the links, and how many times the clip has been played. The id is the `/x/<id>` part of a short link. Play counts are approximate by design — a per-clip counter with no atomic increment behind it, not an audit trail. Returns `{ clip, links, plays, shareText }`.
| Argument | Type | Description |
|---|---|---|
| id* | string | The short id, 8-32 characters, as it appears in `/x/<id>`. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"examples": [
"k4m7pq2r"
],
"description": "The short id, 8-32 characters, as it appears in `/x/<id>`."
}
},
"additionalProperties": false
}The episode's own transcript with absolute timestamps in seconds, so a line's `start` is a number you can pass straight to create_clip. This is how you find the moment worth clipping: read the transcript, choose the span, clip it. These are the publisher's transcripts (Podcasting 2.0 `<podcast:transcript>`), and only about one show in six ships one. There is no speech-to-text here — deliberately, and it is not coming — so an episode without one answers `available: false` with a reason rather than an approximation. Cue-timed, not word-timed: a long cue is split into readable lines and `estimated: true` says the split points are interpolated between two known times. Returns `{ available, lines, lineCount, truncated, estimated, episode, … }`; `available: false` carries `reason`. Usually followed by: create_clip with a line's start and end.
| Argument | Type | Description |
|---|---|---|
| end | number | Only lines that overlap up to this many seconds. 0 means to the end of the episode. |
| url* | string | The episode. An episode page, a direct audio file, or a `clipUrl` from list_episodes. |
| limit | integer | How many lines to return, at most. Clamped to 2000. |
| start | number | Only lines that overlap from this many seconds into the episode. |
| showUrl | string | The show the episode came out of (its feed). Pass the episode's `showUrl` from list_episodes: an episode whose `clipUrl` is its audio file finds its transcript through the feed. |
Episodes of a show, newest first, from its RSS feed or its Apple Podcasts page. Feeds are read up to 60 items — that is the cap, not a page you can walk past. Each episode carries a `clipUrl`: pass it back as `url` to `create_clip` or `get_transcript` and the right episode is clipped, whatever the show's pages look like. Errors with `not_a_show` if the URL is one episode rather than a show. An episode from a feed may also carry `chapters` — the publisher's own timestamp index, read out of the show notes, as `{ startSeconds, title }` in the order they happen. That is a human being naming the parts of their own episode, so it is the cheapest way to find a moment worth clipping: pick a chapter, pass its `startSeconds` to `create_clip` as `start`, and the next chapter's `startSeconds` as `end`. Roughly two shows in five publish one, and a show that doesn't simply has no `chapters` field. Returns `{ show, episodes, total, offset, limit, hasMore }`. An episode may carry `chapters`. Usually followed by: An episode's own `chapters` are the quickest way to a moment; get_transcript reads the words where a show publishes one. Then create_clip.
| Argument | Type | Description |
|---|---|---|
| url* | string | A show: its RSS feed or Apple Podcasts page. |
| limit | integer | How many episodes to return, at most. Clamped to 60. |
| offset | integer | Skip this many episodes first, to page through a long feed. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"examples": [
"https://feeds.simplecast.com/l2i9YnTd"
],
"description": "A show: its RSS feed or Apple Podcasts page."
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 60,
"minimum": 1,
"description": "How many episodes to return, at most. Clamped to 60."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Skip this many episodes first, to page through a long feed."
}
},
"additionalProperties": false
}Turns any pasted link into something clippable, and says which of three things it is: `episode` (one playable thing, ready for create_clip), `show` (a feed or channel — a preview of its episodes, with list_episodes for the rest), or `unresolved` (nothing playable was found, and why). Answering `unresolved` is a real answer, not a failure: clipping the wrong audio confidently is worse. Spotify links resolve to the same episode in the show's own feed, because nothing else can play Spotify. Returns `{ type: 'episode' | 'show' | 'unresolved', … }` — always 200; read `type`. Usually followed by: create_clip for an episode, list_episodes for a show.
| Argument | Type | Description |
|---|---|---|
| url* | string | Anything that points at an episode: an Apple Podcasts or Spotify episode link, an episode's own web page, an RSS feed, or a direct .mp3/.m4a file. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"examples": [
"https://lexfridman.com/anthony-kaldellis/"
],
"description": "Anything that points at an episode: an Apple Podcasts or Spotify episode link, an episode's own web page, an RSS feed, or a direct .mp3/.m4a file."
}
},
"additionalProperties": false
}Searches the public podcast directory by show name. Use it when you have a name rather than a link. Each hit carries the show's RSS feed as `sourceUrl` — hand that to `list_episodes`. It searches shows, never episodes: there is no index of episode titles to search, so finding one episode means listing a show's episodes and matching the title yourself. Shows Apple rates explicit are left out. Returns `{ shows }` — id, name, author, artwork, feed, and the `sourceUrl` to list episodes from. Usually followed by: list_episodes with a show's sourceUrl.
| Argument | Type | Description |
|---|---|---|
| q* | string | The show's name, or enough of it to be distinctive. Two characters minimum. |
| limit | integer | How many shows to return, at most. Clamped to 25. |
{
"type": "object",
"required": [
"q"
],
"properties": {
"q": {
"type": "string",
"examples": [
"hard fork"
],
"description": "The show's name, or enough of it to be distinctive. Two characters minimum."
},
"limit": {
"type": "integer",
"default": 12,
"maximum": 25,
"minimum": 1,
"description": "How many shows to return, at most. Clamped to 25."
}
},
"additionalProperties": false
}The most-subscribed shows in a country, ranked. Useful as a starting point when nothing specific was named, and as a way to check that a show is the well-known one rather than a similarly named feed. Country defaults to the one the request came from. Returns `{ country, shows }`, each show carrying its 1-based `rank`. Usually followed by: list_episodes with a show's sourceUrl.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many shows to return, at most. Clamped to 100. |
| country | string | Two-letter ISO country code (`us`, `gb`, `de`). Defaults to the country the request arrives from, and to `us` when that is unknown. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "How many shows to return, at most. Clamped to 100."
},
"country": {
"type": "string",
"examples": [
"us"
],
"description": "Two-letter ISO country code (`us`, `gb`, `de`). Defaults to the country the request arrives from, and to `us` when that is unknown."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 7, 2026.
{
"type": "object",
"required": [
"url"
],
"properties": {
"end": {
"type": "number",
"default": 0,
"minimum": 0,
"description": "Only lines that overlap up to this many seconds. 0 means to the end of the episode."
},
"url": {
"type": "string",
"examples": [
"https://lexfridman.com/anthony-kaldellis/"
],
"description": "The episode. An episode page, a direct audio file, or a `clipUrl` from list_episodes."
},
"limit": {
"type": "integer",
"default": 400,
"maximum": 2000,
"minimum": 1,
"description": "How many lines to return, at most. Clamped to 2000."
},
"start": {
"type": "number",
"default": 0,
"minimum": 0,
"description": "Only lines that overlap from this many seconds into the episode."
},
"showUrl": {
"type": "string",
"description": "The show the episode came out of (its feed). Pass the episode's `showUrl` from list_episodes: an episode whose `clipUrl` is its audio file finds its transcript through the feed."
}
},
"additionalProperties": false
}