Podcast Index MCP
This server gives AI agents read access to the Podcast Index plus the ability to fetch and read episode transcripts, chapters, and soundbites, along with a few guarded write tools.
Search podcasts by keyword, title, or person credits, and search music feeds separately
Look up a show or episode from any identifier (feed id, RSS URL, GUID, Apple/iTunes id), including up to 500 shows in one batch call, or browse by medium (music, video, audiobook, course, etc.)
Read transcripts: fetch an episode's actual transcript parsed from SRT, WebVTT, JSON or HTML with timestamps and speakers, and search inside it for the moment a phrase was said
List chapters and publisher-picked soundbites, and find which of a show's episodes publish transcripts or chapters
Get rich profiles: a full show profile (cadence, guests, health, Podcasting 2.0 coverage, payments), guest appearance history, and a curated list of bookable shows on a topic
Explore what's new: trending shows, recently updated feeds, feeds new to the index, newest episodes, live episodes, random episodes, recent soundbites, and the category list
Inspect value-for-value data: a show's or episode's payment split, all value-enabled podcasts, and feeds that just added splits
Check health and scale: feed crawl health, dead feeds, index size/activity stats, and a status check on credentials and clock drift
Write (guarded): ping the index to recrawl a feed, and submit a new feed by URL or iTunes id (requires
confirm: trueand a write-permission key)
Provides tools for searching and retrieving podcast data from Podcast Index, including episode transcripts, chapters, soundbites, feed health, and the ability to submit feeds to the directory.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Podcast Index MCP When did they talk about VR latency on that Lex Fridman episode with Carmack?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Podcast Index MCP Server & CLI
Podcast Index MCP server and CLI for Claude Code, Codex and AI agents. 36 tools for podcast search, episode transcripts you can actually read and search, Podcasting 2.0 tags, value-for-value data, feed health and index stats.
One install gives you both surfaces, the same 36 tools under the same names, reading one array of tool definitions so they cannot drift apart.
It searches four million podcasts, and then it does the thing the API stops short of: it opens the transcript. Podcast Index hands out a link to an episode's transcript file and goes no further, which is useless to an assistant that cannot click. This fetches the file, works out whether it is SRT, WebVTT, JSON or HTML, and gives you the actual words with timestamps and speakers.
So you can ask when something was said, and get an answer.
There are 36 tools. One free key covers all but two of them.
Built by Navid Moazzez. Built on Slipway, which turns one definition of each tool into the MCP server and the CLI.
Two ways to use it
Command line
podcastindex-cli runs every tool as a command. Agents that run commands, like
Claude Code, Codex and OpenCode, use it on their own, and you can type the same
commands in a terminal, a script or a cron job:
podcastindex-cli # every command, one line each
podcastindex-cli status # what this server can reach
podcastindex-cli search-podcasts --q "ai agents" --max 5
podcastindex-cli get-trending --max 10
podcastindex-cli search-transcript --episode-id <id> --query "compound interest"
podcastindex-cli find-guest-appearances --name "Tim Ferriss"
podcastindex-cli check-feed-health --show https://example.com/feed.xml
podcastindex-cli submit-feed --feed-url https://example.com/feed.xml --confirm
podcastindex-cli <command> --help # what any command takes--confirm is the shell spelling of the confirmation that adding a feed to the
index needs. --json gives JSON, --compact puts it on one line, --select
keeps only the fields you name, and --agent is compact JSON with no prompts,
and never confirms a write. Exit codes are 0 ok, 1 an unexpected error, 2 usage
or a hidden or refused write, 3 not found, 4 auth, 5 API, 7 rate limited and 10
nothing configured, so a script branches on the number.
podcastindex-cli schema <command> prints the exact JSON Schema an MCP client
receives for that tool.
MCP server, for your AI app
podcastindex-mcp is what Claude Code, Claude Desktop, Cursor and the rest
launch. You never run it by hand:
claude mcp add podcastindex \
-e PODCASTINDEX_API_KEY=your_key \
-e PODCASTINDEX_API_SECRET=your_secret \
-- npx -y @thenavidm/podcastindex-mcp-cli@latestIn Claude Desktop, the .mcpb extension
installs on a double click. Section 4 has every other client.
A feed submission waits for your approval in the client, as section 9 explains.
Which one
Where you are | What you can reach |
An agent that can run shell commands, like Claude Code or Cursor | Both. The CLI is the cheaper one: it costs nothing until you type it |
claude.ai, the Claude Desktop chat tab, or a phone | The server only. There is no shell to run a command in |
A terminal, a script, cron or CI | The CLI only. There is no MCP client in a shell |
They are the same program reading the same tool definitions, so anything one can do, the other can.
What each costs
Both surfaces are the same program with the same 36 tools. The difference is when the model pays for them. Measured in Claude Code:
Cost | MCP server | CLI |
Every message, with every tool loaded | 11,800 tokens | nothing |
Every message, Claude Code's default | 1,300 tokens | nothing |
When Podcast Index comes up | nothing more, or the tools it picks | 3,400 tokens for |
20 messages with Podcast Index in 1, every tool loaded | 236,000 tokens | 3,400 tokens |
Claude Code's tool search is on by default: it sends only the tool names and the server instructions, and loads a tool's full definition when the model reaches for it. An app that loads every tool up front pays the first line on every message, whether Podcast Index comes up or not. With the skill added, Claude Code also lists its one-line description, about 160 tokens.
To spend less, turn the server off when you are not using it, which in Claude
Code is the /mcp panel. PODCASTINDEX_READ_ONLY=1 takes the 3 write tools off the list, leaving 33.
Or install the CLI and add the server on the days it earns its place.
Measured on 2026-10-05 with Claude Code 2.1.286 on Claude Opus 5.5: one
short prompt with and without the server connected, once with
ENABLE_TOOL_SEARCH=false and once with the default, the difference read
from the API's own usage figures. SKILL.md was measured the same way. Other
apps and models count tokens a little differently.
Against 1.1.2, measured the same day: every tool loaded costs 11,843 tokens
instead of 13,095, tool search the same (1,253 against 1,253), and SKILL.md
60 more, because it now says how approval works over MCP and lists every exit
code. In Codex 0.159.3 on gpt-6.1-sol, the same task, "find the command that
finds the moment a phrase was said in an episode's transcript, and the flags it
requires", read a median of 83,167 input tokens on 2.0.0 against 83,990 on
1.1.2 over the CLI, five runs each: Codex now asks which instead of reading
the full command list. Over MCP, Codex prints the tool list with a script and
cuts the printout to about 10,000 tokens, so it read about 9,020 on both
versions, out of a full listing of 28,195 tokens on 2.0.0 against 28,239, and
a median of 48,367 input tokens against 48,444.
Related MCP server: PodcastIndex MCP Server
Features
Every tool is both a command and an MCP tool, with the same name. The command is the tool name with dashes.
Capability | CLI command | MCP tool |
Read what was said in an episode |
|
|
Questions, not endpoints |
|
|
Search the index |
|
|
Shows and episodes |
|
|
What is new and trending |
|
|
Value for value |
|
|
Feed health |
|
|
Add or refresh a feed |
|
|
Check your setup |
|
|
All 36 are in section 6.
Contents
# | Section | What is in it |
1 | Real prompts, not features | |
2 | One line | |
3 | Getting a key, about two minutes | |
4 | Every client, copy and paste | |
5 |
| |
6 | All 36, grouped by what they reach | |
7 | The traps, learned the hard way | |
8 | What is sent, and what never is | |
9 | Short, because almost nothing writes | |
10 | Symptom to cause | |
11 | Including what an MCP server is |
1. What you can ask it 💬
When did they talk about pricing on that episode, and what did they say?
Read me this episode and pull out the three claims worth remembering.
Where has this person been a guest, and what do they always get asked?
Find me fifteen podcasts about indie games that are still publishing, and skip the dead ones.
Is my feed broken? Downloads dropped last week and I do not know why.
What is trending in true crime this week, in Swedish?
Which of this show's episodes actually have transcripts?
Who does this podcast split its listener payments with?
Give me the chapter list so I can see if this episode is worth two hours.
Tell me everything about this show in one go: cadence, guests, health, the lot.
The first one is the point. Podcast Index will tell you a transcript exists and give you a URL. No podcast tool reads it back to you. This one does, which is why "when did they say that" is a question you can now ask.
2. Quick install ⚡
Node 22 or newer. Nothing else.
npx -y @thenavidm/podcastindex-mcp-cli@latest --versionThat is the whole install. npx fetches it on demand, so there is nothing to
update later.
For the CLI as a command you or your agent can run anywhere, install it once:
npm install -g @thenavidm/podcastindex-mcp-cli
podcastindex-cli3. Setup 🔑
You need a key and a secret. Both. The key says who you are and the secret signs each request, so one without the other cannot authenticate. They are free, there is no approval step, and it takes about two minutes.
Have an agent do it
The agent cannot sign up for you. What it can do is wire up the config once you have the credentials and verify the connection.
Paste this into Claude Code, Cursor, or any agent with terminal access:
Set up the Podcast Index MCP server for me.
1. Open https://api.podcastindex.org/signup and tell me to fill it in. Wait for me.
2. When I paste the key and secret back, add the server to my client config
with PODCASTINDEX_API_KEY and PODCASTINDEX_API_SECRET set.
3. Run the doctor command and tell me what it says.
4. If the clock check fails, tell me how to fix the clock. Do not tell me to
regenerate the key.Or do it yourself
Step 1. Go to api.podcastindex.org/signup.
Step 2. Fill in the form. You need an email address and a line about what you are building. There is no review and no waiting: the credentials appear immediately.
Step 3. Copy both values. The key is short and looks like UXKCGDSYGUUEVQJSYDZH.
The secret is longer. Keep the secret private: anything holding it can spend
your rate limit.
That is it. Everything except adding a podcast to the directory works now.
You do not need write permission. Write access is a separate grant, and 34 of the 36 tools do not use it. Only
submit_feedandsubmit_feed_by_itunes_idneed it, and they say so if you call them without it. Skip this unless you actually want to add feeds to the public directory.
To revoke a key, contact Podcast Index through the support links on podcastindex.org.
4. Connect your client 🔌
The long version, every step with what to do when one fails, is in INSTALL.md.
Claude Code
claude mcp add podcastindex \
-e PODCASTINDEX_API_KEY=your_key \
-e PODCASTINDEX_API_SECRET=your_secret \
-- npx -y @thenavidm/podcastindex-mcp-cli@latestAdd --scope user to make it available in every project rather than the
current one.
Claude Desktop
The short way: download the .mcpb extension
from the latest release and double-click it. It carries its own dependencies,
so there is no config file to edit and nothing to install first. Claude Desktop
asks for your API key and secret, and whether to run it read only.
The long way, if you would rather edit the config yourself:
Platform | Config path |
macOS |
|
Windows |
|
{
"mcpServers": {
"podcastindex": {
"command": "npx",
"args": ["-y", "@thenavidm/podcastindex-mcp-cli@latest"],
"env": {
"PODCASTINDEX_API_KEY": "your_key",
"PODCASTINDEX_API_SECRET": "your_secret"
}
}
}
}Tip Claude Desktop does not inherit your shell PATH, so a bare
npxcan fail with "command not found". Use the absolute path fromwhich npxif it does.
Quit Claude Desktop completely and reopen it.
claude.ai on the web
claude.ai runs connectors from Anthropic's cloud, not from your machine, so it needs a public HTTPS URL rather than a local command.
npx -y @thenavidm/podcastindex-mcp-cli@latest --http --port 8000Host that somewhere with a public HTTPS URL and set PODCASTINDEX_HTTP_TOKEN,
which the server requires before it will bind anything but loopback. A page from
another site is refused unless PODCASTINDEX_HTTP_ALLOWED_ORIGINS lists it. Then in
claude.ai: Customize, Connectors, +, Add custom connector, paste
the URL, Add.
On Team and Enterprise an owner adds it first under Organization settings, Connectors, then each member enables it.
Cursor
.cursor/mcp.json, same JSON shape as Claude Desktop, key mcpServers.
Windsurf
~/.codeium/windsurf/mcp_config.json, key mcpServers.
VS Code
.vscode/mcp.json. The key is servers, not mcpServers, and each entry
needs "type": "stdio".
{
"servers": {
"podcastindex": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@thenavidm/podcastindex-mcp-cli@latest"],
"env": {
"PODCASTINDEX_API_KEY": "your_key",
"PODCASTINDEX_API_SECRET": "your_secret"
}
}
}
}Codex CLI
~/.codex/config.toml:
[mcp_servers.podcastindex]
command = "npx"
args = ["-y", "@thenavidm/podcastindex-mcp-cli@latest"]
[mcp_servers.podcastindex.env]
PODCASTINDEX_API_KEY = "your_key"
PODCASTINDEX_API_SECRET = "your_secret"Gemini CLI
~/.gemini/settings.json, key mcpServers, same shape as Claude Desktop.
Everything else
Any stdio MCP client takes the same three things: the command npx, the args,
and the env block.
Or let the CLI write the entry, in each client's own format:
npx -y -p @thenavidm/podcastindex-mcp-cli podcastindex-cli install claude-codeIt takes claude-code, codex, claude-desktop, cursor, vscode or gemini, and --dry-run shows the change first.
Every setting
Two are required. The rest have defaults that suit almost everyone, and are listed here so nobody has to read the source to find out what is tunable.
Variable | Default | What it does |
| none | Your API key. Required |
| none | Your API secret. Required, and never transmitted |
|
| Identify your product to Podcast Index |
|
|
|
|
|
|
| none | Path to an append-only log of every attempted write, and who approved it |
|
|
|
|
| How much transcript one call returns |
|
| How long a response stays reusable |
|
| Per-request deadline against the index |
|
| Deadline for a transcript file on a publisher's host |
|
| Spacing between requests, to stay under the rate limit |
|
| Retries on rate limits and 5xx |
| api.podcastindex.org | Point at another host. A test seam, not a setting |
|
| For |
|
| For |
| none | Bearer token. Required to bind anything but loopback |
| none | Comma-separated browser origins allowed to connect; a page from any other site is refused |
|
|
|
| none | Give up on any tool after this long |
|
|
|
To disconnect, remove the entry from your client's config and restart the
client. There is nothing installed globally to uninstall, since npx fetches it
per run, and nothing on disk to clean up unless you configured an audit log.
5. Check it worked 🩺
npx -y @thenavidm/podcastindex-mcp-cli@latest doctorPodcast Index doctor
✓ Node.js v22.14.0
✓ Version podcastindex 2.0.1
✓ Writes on
✓ Tools 36 of 36 on
✓ Credentials configured
✓ API key set, 20 characters
✓ API secret set, 40 characters
✓ Podcast Index API reachable and authenticated, 4,312,880 feeds indexed
✓ Clock sync 2 seconds ahead, well inside the 180 second signing window
Ready.The clock line is the one to read. See below for why.
6. Tools 🛠️
Reading what is actually in an episode
The group worth installing this for. These leave Podcast Index and fetch files from the publisher's own host.
Tool | What it does |
| Fetches and parses the transcript into timestamped text with speakers |
| Finds the moment a phrase was said, with a timestamp |
| The publisher's own table of contents, sponsor breaks included and labeled |
| The clips the publisher marked as the best moments |
| Which of a show's episodes have transcripts, in one request |
Questions instead of endpoints
Tool | What it does |
| One call for cadence, guests, health, Podcasting 2.0 coverage and payments |
| Every episode a person is credited on, grouped by show |
| Shows on a topic that are alive, publishing, and worth approaching |
Search
Tool | What it does |
| Keyword search across title, author and owner |
| Title only, for when you know the name |
| Episodes crediting a named person |
| Music feeds, which are a separate medium here |
Shows and episodes
Tool | What it does |
| One show, from any identifier you happen to have |
| Up to 500 shows in a single request |
| Browse audiobooks, film, video, courses, newsletters |
| Every category and its id |
| A show's episodes, newest first |
| One episode in full |
| Podcasts broadcasting right now |
| Random sampling, filterable by category |
| The firehose of everything just published |
What is new and what is moving
Tool | What it does |
| Trending shows, filterable by category and language |
| Feeds that just published |
| Shows new to the index |
| The newest publisher-picked highlights |
Value for value
Tool | What it does |
| A show's payment split, with computed shares |
| One episode's split, which can differ from the show's |
| Every feed that takes listener payments |
| Shows that just added a payment split |
Health and size
Tool | What it does |
| Crawl errors, parse errors, last good fetch, and a verdict |
| Feeds the index gave up on |
| How big the index is and how much of it is alive |
| What this server can currently reach |
Writes
Tool | Needs |
| nothing, not even a key |
| your approval, and a key with write permission |
| your approval, and a key with write permission |
7. What Podcast Index actually does 🧭
The things that will surprise you, and the reasons this server is shaped the way it is.
A wrong clock looks exactly like a wrong key
This is the one that costs people an hour.
Every request is signed with a SHA-1 of your key, your secret and the current unix timestamp, and Podcast Index accepts a three minute window either side of its own clock. A laptop that slept through a timezone change, a container with no time sync, or a VM restored from a snapshot will fail every single call with a 401.
A 401 reads as "bad credentials" to everybody, so the natural response is to regenerate a key that was never the problem.
doctor measures the drift against the server's own clock and says so. If it
reports skew, fix the clock, not the credentials. On macOS:
sudo sntp -sS time.apple.comPodcasting 2.0 tags are optional, and mostly absent
Tag | What it gives you | How common |
| a URL to SRT, VTT, JSON or HTML | uncommon |
| a URL to a chapters JSON file | uncommon |
| credited hosts, guests, producers | uncommon |
| publisher-chosen highlight clips | rare |
| a payment split for listener payments | a small minority |
An empty result is a fact about that show, not a broken call. Nothing here can transcribe audio that was never transcribed, and retrying will not help.
This matters most for guest research. find_guest_appearances only sees shows
that publish person tags, so a thin result is a floor on somebody's appearances
and never a complete list.
Transcript files lie about their format
The feed declares a mime type and publishers get it wrong constantly: SRT served
as text/plain, VTT declared application/json, JSON with an .srt extension.
So this server detects the format from the file body and treats the declaration as a hint. Trusting it would fail on a large minority of real shows.
Where a publisher offers several formats, JSON is preferred, because only the
Podcasting 2.0 JSON format carries real speaker names. The same episode as SRT
is usually an undifferentiated wall of text. Some SRT and VTT does carry
speakers, as a NAME: prefix or a <v Name> span, and those are parsed out.
The transcript is not on Podcast Index
transcriptUrl and chaptersUrl point at files on the publisher's own
server. So those tools fail for reasons that have nothing to do with the
index: dead links, moved files, HTML error pages, hosts that time out.
When a transcript fetch fails, the podcaster's hosting is down. The index is fine and the call was correct.
A value block is not revenue
It says a show is configured to receive listener payments and names the wallets and their weights. It says nothing about whether anyone has ever paid.
Splits are relative weights, not percentages. A block of 90 and 10 is the same split as one of 9 and 1, so this server shows the computed share alongside the raw number.
Descriptions get silently truncated
Without the fulltext flag the API cuts every text field to 100 characters, and
a description cut at 100 characters still looks like a description. A model
reading one would summarize a show from its first sentence and never know the
rest existed.
This server sets fulltext on every call that accepts it. You will not hit this,
but it is why responses are larger than the raw API's.
An episode GUID is not unique
It is unique only inside its own feed. Look one up without saying which show,
and the API answers with whichever it finds first, which is a coin flip. Pass
show alongside guid on get_episode.
Feed ids and episode ids are different numbers. A feed id will not work where an episode id is wanted.
Adding a feed cannot be undone
submit_feed writes to a public global directory that hundreds of apps read,
and this API has no delete. Removing something means asking the people who
run Podcast Index.
That is why those two tools wait for your approval and notify_feed_update does
not.
8. Your data 📦
There is no backend. Nothing is collected, and nothing is sent anywhere except the two places below.
Goes to | What |
| your key, a timestamp, a signature, and your query |
the publisher's host | a plain GET for a transcript or chapter file, no credentials |
Your secret is never transmitted. It is hashed into a signature locally and the hash is what travels.
Credentials live wherever your MCP client keeps its config, which is a plain
JSON or TOML file on your own machine. This server writes nothing to disk unless
you set PODCASTINDEX_AUDIT_LOG, and then only a line or two per attempted write.
Everything Podcast Index holds is public. There is no personal listening data here to leak, because the index does not have any.
9. Writing safely 🔒
Of 36 tools, 33 only read.
notify_feed_update asks the index to recrawl a feed sooner. It is idempotent,
needs no credential, and is not guarded, because guarding harmless things trains
the habit that makes real guards useless.
submit_feed and submit_feed_by_itunes_id add a podcast to a public directory
and cannot be undone through this API. Both wait for your approval.
Over MCP a person approves each submit where the client can ask: Claude Code
(2.1.246 and later) shows its own prompt, and a client that can show forms asks
with an approval form whose one box starts unticked. Each approval is signed,
bound to that exact call and works once. Where a client can do neither, the
model's confirm: true counts, and it should pass it only when you asked to add
that feed. PODCASTINDEX_CONFIRM=model makes confirm: true enough everywhere,
for an agent with no person to ask. In a terminal it is --confirm, which
--agent never adds.
Variable | Effect |
| the three write tools are not registered at all |
| keeps the recrawl ping, blocks the two submits |
| one JSON line per attempted write, allowed and blocked, and who approved it |
Read-only removes the tools rather than erroring on them, because a model cannot call a tool it cannot see, and an error is an invitation to retry differently.
On prompt injection. Transcripts, show notes and chapter titles are text strangers wrote, fetched from hosts nobody vetted, and anybody who can publish a podcast can put "ignore your instructions" into their own transcript. This server fences that text as data before a model reads it, and says so in its instructions.
That helps. It is not a guarantee. For an agent working unattended,
PODCASTINDEX_READ_ONLY=1 is the real defense.
10. Troubleshooting 🔧
Run doctor first. It tests every credential and measures the clock.
Symptom | Cause |
Every call fails with an auth error | Check the clock before the key. Three minute signing window, and drift is the most common cause |
| Both halves are needed. The key alone cannot sign a request |
A submit fails with a permission error | Write access is granted separately from a normal key |
| Most shows do not. This is a fact about the show, not a failure |
A transcript times out | The publisher's host, not the index. Raise |
Transcript comes back with no speakers | The publisher supplied SRT without labels. Only the JSON format guarantees speakers |
| Only shows publishing person tags are visible, which is a minority |
Rate limited | Use |
Claude Desktop cannot find | It does not inherit your shell PATH. Use the absolute path from |
"will not run without --confirm" | Working as intended: adding a feed cannot be undone. See section 9 |
| Headless Claude Code refuses tools that need a person. Give that agent |
A piped request gets no answer | Stdin closed before the answer. The MCP stdio binding stops a server when its input ends; keep stdin open until you read the answer, or use the CLI |
11. FAQ ❓
An MCP server is a standard way to give an AI assistant real access to a tool, so it can act rather than guess. You install it once, your assistant gains the tools, and it works in Claude, Cursor, and anything else that speaks MCP.
Without one, an assistant asked about a podcast answers from whatever it absorbed in training. With one, it goes and looks.
podcastindex-cli is the same program as the MCP server, run as commands. AI agents that run commands, like Claude Code, Codex and OpenCode, use it on their own, and you can type the same commands in a terminal, a script or a cron job. Every tool is a command with dashes, so get_trending runs as podcastindex-cli get-trending.
Use the MCP server in an app with no terminal, like Claude Desktop's chat. Use the CLI anywhere commands run: an agent like Claude Code, Codex or OpenCode, a script or a cron job. The MCP server's tools take up context on every message, and the CLI costs nothing until it runs.
Podcast Index is an open, free directory of podcasts. Around four million feeds, run independently of Apple and Spotify, with an API anybody can use.
It is also where Podcasting 2.0 lives: an open extension to RSS that lets publishers attach transcripts, chapters, guest credits, highlight clips and payment details to their episodes. That extra data is most of why this server is interesting.
Not in Claude Desktop: the .mcpb extension installs on a double click and asks
for your free key. Elsewhere you paste a block of JSON into a config file, and
step 3 walks through it. You can also hand the prompt in that section to an
agent and let it do the wiring.
There is no backend and no telemetry. Your queries go to Podcast Index, and transcript fetches go to the publisher's own server. That is all.
Your API secret never leaves your machine. It is used to compute a signature locally, and only the signature is sent.
Read transcripts. The Podcast Index website will show you that an episode has a transcript and link to the file. It will not search inside it, and it will not search across episodes.
The other one is scale. "Find every episode this person has been on, grouped by show" is one call here and an afternoon by hand.
It cannot. Nothing here deletes anything, because the API has no delete.
The action worth knowing about is the opposite: submit_feed adds a podcast to
a public directory permanently, and there is no way to remove it through this
API. It waits for your approval for exactly that reason, and it needs a key
with write permission that you will not have unless you asked for one.
It costs nothing. The server is MIT licensed and a Podcast Index API key is free with no approval step and no paid tier.
It works with any client that speaks MCP. Section 4 covers Claude Code, Claude Desktop, claude.ai, Cursor, Windsurf, VS Code, Codex CLI and Gemini CLI.
claude.ai is the one that works differently, because it runs connectors from Anthropic's cloud and needs the HTTP transport rather than a local command.
Podcast Index signs every request rather than using a bearer token. The key identifies you and travels with the request; the secret is hashed together with a timestamp to prove the request is yours and is recent.
The upside is the secret is never transmitted. The downside is the timestamp
has a three minute window, so a drifting clock breaks everything. doctor
checks for it.
Because the publisher did not attach one. Transcripts in podcasting are an optional RSS tag, and most shows do not use it.
Nothing here transcribes audio. If a show publishes no transcript,
get_transcript cannot produce one, and it will say so rather than guessing at
the content from the show notes.
Because a feed added to Podcast Index stays there: this API has no delete, and
hundreds of podcast apps read the index. So submit_feed waits for you. Claude
Code shows its own prompt, a client that can show forms asks with one, and in a
terminal it is --confirm. An agent with no person to ask can be given
PODCASTINDEX_CONFIRM=model, which lets its own confirm: true count.
Asking the index to recrawl a feed with notify_feed_update needs nothing,
since doing it twice changes nothing.
With @latest in your client's config, npx fetches the newest version when
the client starts the server, so there is nothing to update by hand. A global
install updates with npm i -g @thenavidm/podcastindex-mcp-cli.
To remove it, delete its entry from your client's config and restart the
client, or run npm uninstall -g @thenavidm/podcastindex-mcp-cli for a global
install. It leaves nothing on disk unless you set an audit log.
Questions
Run into a problem or have a question? Open an issue and I will help.
About the author
Navid Moazzez is a leading AI business strategist, and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. He creates useful free tools, MCP servers and CLIs that creators and founders can use in their own workflows.
Links
Personal website: navid.me
YouTube: @thenavidm and @thenavidai
X: @thenavidm
Instagram: @thenavidm
LinkedIn: thenavidm
If this is useful, star the repo and come say hi on X.
Dependencies
Library | License | What it does |
Apache-2.0 | The MCP server and the CLI from one definition of each tool, with the write guard | |
Apache-2.0 | The MCP protocol, stdio and streamable HTTP transports, through Slipway | |
MIT | Tool argument schemas and validation |
Data comes from Podcast Index, which is free and open. The Podcasting 2.0 namespace defines the transcript, chapter, person, soundbite and value tags this server reads.
Security
Found a vulnerability? Report it privately, not as a public issue. SECURITY.md covers what this server can reach, the write-safety model, and running it over HTTP.
License
MIT. Free to use, modify, and share.
Not affiliated with, endorsed by, or connected to Podcast Index LLC.
© 2026 Navid Media. Made with ❤️ by Navid Moazzez.
Available Tools
36 toolscheck_feed_healthCheck whether a feed is healthyARead-onlyIdempotent
Diagnose a podcast feed using the crawl history Podcast Index keeps on it: failed fetches, parse errors, the last HTTP status, when it was last successfully read, and whether the index has marked it dead or as a duplicate of another feed. This answers 'is my feed broken' with evidence rather than a guess, and it works on any feed in the index, not only your own. Worth running before blaming a host for a drop in downloads.
Inputs: show (required).
find_guest_appearancesTrace where a person has appearedARead-onlyIdempotent
Every episode a named person is credited on, grouped by show and ordered newest first, with their role on each. This is guest research: it answers 'who has had this person on', 'what do they usually talk about' and 'which shows book people like this'. Shows where the person appears on many episodes are flagged as likely their own, so a host's back catalogue does not drown out the guest spots you were looking for. Only finds shows that publish Podcasting 2.0 person tags, which is a minority of the index, so an empty result is not evidence the person has never been on a podcast.
Inputs: name (required), max.
find_shows_to_pitchFind bookable shows on a topicARead-onlyIdempotent
Search for shows on a topic and keep only the ones worth approaching: alive, publishing recently, with a real episode count and a way to contact them. A plain search returns the whole index including feeds that died in 2019, and sorting that by hand is the tedious part of guest outreach. Each result says when it last published, how often, and what contact route exists. Ranked by recent activity rather than by search relevance, because a perfectly matching show that stopped publishing two years ago is not a lead.
Inputs: topic (required), max, min_episodes, active_within_days.
find_transcriptsFind which episodes have transcriptsARead-onlyIdempotent
Scan a show's recent episodes and report which of them publish a transcript or chapters, without fetching any of the files. Call this before get_transcript or search_transcript on an unfamiliar show: it is one request, and it tells you whether the show transcribes at all rather than discovering it through a failed lookup per episode. A show that transcribes usually transcribes everything, and a show that does not never will.
Inputs: show (required), max.
get_chaptersRead an episode's chaptersARead-onlyIdempotent
Fetch and read the chapter list a publisher attached to an episode: titles, start times, images and links. Chapters are the publisher's own table of contents, so this answers 'what is in this episode and when' far more cheaply than reading the transcript. Chapters the publisher marked as excluded from the table of contents are kept and labelled rather than dropped, because in practice that flag marks sponsor reads and hiding them would make the timeline misrepresent the episode. Like transcripts, chapters are optional and most episodes have none.
Inputs: episode_id (required).
get_episodeGet one episodeARead-onlyIdempotent
One episode in full: description, credited people, soundbites, value block, and the transcript and chapter pointers. Takes a Podcast Index episode id, which is the fastest path, or an episode GUID. A GUID is only unique within a show, so pass the show as well when using one, or the answer is whichever episode the index finds first.
Inputs: guid, show, episode_id.
get_episodesGet a show's episodesARead-onlyIdempotent
Episodes for one show, newest first. Takes any show identifier: feed id, RSS URL, podcast GUID, Apple link or iTunes id. Each episode says which Podcasting 2.0 extras it carries in its 'has' attribute, so you can see at a glance which ones have a transcript or chapters worth fetching. Use 'since' rather than a large 'max' when you only want recent episodes.
Inputs: show (required), max, since.
get_episode_valueGet one episode's payment splitARead-onlyIdempotent
The value block for a single episode, which can differ from the show's. Publishers override the split per episode to pay a guest a share, so this is how you see who was cut in on a particular conversation. Needs both the podcast GUID and the episode GUID, because that is the only pair this endpoint accepts.
Inputs: episode_guid (required), podcast_guid (required).
get_index_statsPodcast Index size and activityARead-onlyIdempotent
How big the index is and how much of it is alive: total feeds, total episodes, how many feeds published in the last 3, 10, 30 and 90 days, and how many carry a value block. The activity numbers are the interesting part, because the gap between total feeds and feeds active in 30 days is the honest measure of how much of podcasting is still running.
Inputs: no named parameters.
get_live_episodesPodcasts broadcasting live nowARead-only
Episodes currently marked live across the whole index, from the Podcasting 2.0 liveItem tag. This is a small and fast-moving list: live podcasting is a niche within the index, so a handful of results is normal and an empty one is possible. Each entry carries a start time, an end time and a status.
Inputs: max.
get_new_feedsFeeds new to the indexARead-only
Shows added to Podcast Index for the first time, newest first. This is genuinely new podcasts rather than new episodes, which makes it the tool for spotting a launch. Expect a lot of noise: anyone can submit a feed, so a large share of these are empty, abandoned or automated.
Inputs: max, since, oldest_first.
get_new_value_feedsFeeds that just added a payment splitARead-only
Feeds that added a value block recently. This is the growth edge of value-for-value podcasting: shows adopting listener payments for the first time, newest first.
Inputs: max, since.
get_podcastGet one podcastARead-onlyIdempotent
Everything Podcast Index knows about one show: metadata, category, episode count, when it last published, and which Podcasting 2.0 features it carries. Takes any identifier you have, a feed id, an RSS URL, a podcast GUID, an Apple Podcasts link or an iTunes id, and works out which it is. Start here when you already know the show; use search_podcasts when you are still looking for it.
Inputs: show (required).
get_podcasts_batchGet many podcasts at onceARead-onlyIdempotent
Look up many shows in one request, by podcast GUID. Use this instead of calling get_podcast in a loop whenever you have more than three or four: it is one request rather than one each, which matters against a rate limit and is far faster. Only accepts podcast GUIDs, not feed ids, because that is the only identifier this endpoint takes.
Inputs: guids (required).
get_podcasts_by_mediumBrowse feeds by mediumARead-onlyIdempotent
List feeds of one Podcasting 2.0 medium. The medium says what a feed actually contains, and the index carries far more than talk shows: music, video, film, audiobook, newsletter, blog, course and publisher feeds all live here. Use this to find content types that a normal podcast search buries, such as audiobooks or serialised film.
Inputs: medium (required), max.
get_random_episodesRandom episodesARead-only
Random episodes from across the index, optionally filtered by language and category. Genuinely random rather than ranked, which makes it useful for sampling what a category actually contains rather than what its top shows look like. Never cached, so calling it again gives different episodes.
Inputs: cat, max, lang, notcat.
get_recent_episodesNewest episodes across the indexARead-only
The most recently published episodes across every show in the index, newest first. This is the firehose: it is what podcasting published in the last few minutes, not what is popular. Use get_trending for popularity. The exclude filter is worth using, because a handful of high-frequency automated feeds otherwise dominate every result.
Inputs: max, before, exclude.
get_recent_feedsRecently updated feedsARead-only
Feeds that published something recently, newest activity first. This tracks updates rather than new shows, so an established podcast releasing an episode appears here. Use get_new_feeds for shows that are new to the index.
Inputs: cat, max, lang, since, +1 more.
get_recent_soundbitesRecently published soundbitesARead-only
The newest soundbites across the whole index: clips publishers themselves marked as the best moment of an episode. A ready-made feed of what podcasters think is worth quoting this week, and a fast way to find shows that use Podcasting 2.0 tags properly.
Inputs: max.
get_show_profileFull profile of one showARead-onlyIdempotent
Everything about one show in a single call: metadata, publishing cadence measured from real episode dates, recent episodes, who is credited on them, whether it publishes transcripts or chapters, its payment split, and whether the index is crawling it successfully. Use this instead of calling get_podcast, get_episodes, get_value_block and check_feed_health separately, which is four round trips for the same answer. This is the right first call when the question is about one show.
Inputs: show (required), episodes.
get_soundbitesGet an episode's soundbitesARead-onlyIdempotent
The clips a publisher marked as the best moments of an episode, with start time and duration. Soundbites are the show's own pick of what is worth quoting, which makes them the cheapest possible answer to 'what is the highlight of this episode' and a ready-made list for promotional clips. Comes straight from the episode record with no extra fetch. Optional and uncommon, like the rest of the Podcasting 2.0 tags.
Inputs: episode_id (required).
get_transcriptRead an episode transcriptARead-onlyIdempotent
Fetch and read the actual transcript of an episode, as timestamped text with speaker labels where the file has them. This is the tool that turns a podcast into something readable: Podcast Index only publishes a link to the transcript file, and this goes and gets it, works out whether it is SRT, WebVTT, JSON or HTML, and parses it. Long transcripts are returned in windows rather than whole, because a two hour episode is far more text than any single question needs; the response says how much remains and the offset to continue from. If you are looking for one specific moment, use search_transcript instead, which is one call rather than paging. Not every episode has a transcript, and most do not.
Inputs: episode_id (required), format, offset.
get_trendingTrending podcastsARead-only
Shows trending in the index right now, which is Podcast Index's own popularity signal rather than a chronological list. This is the tool for 'what is hot in this category'. Filter by category and language to make it useful: unfiltered, it returns whatever is big across all of podcasting, which is rarely the question. The window defaults to the last few days; widen it with 'since' for a slower, more stable read.
Inputs: cat, max, lang, since, +1 more.
get_value_blockGet a show's payment splitARead-onlyIdempotent
The value-for-value block for a show: the wallets that receive listener payments and the weight each one takes. Splits are relative weights rather than percentages, so a computed share is shown alongside the raw number. Most podcasts publish no value block at all, and an absent one is reported plainly rather than as an error. A value block means a show can receive payments; it is not evidence that it has received any.
Inputs: show (required).
list_categoriesList every categoryARead-onlyIdempotent
Every category Podcast Index uses, with its numeric id. Worth calling once before filtering anything by category, because several tools accept either the name or the id and the names are not the same as Apple's genre list.
Inputs: no named parameters.
list_dead_feedsList feeds the index has given up onARead-onlyIdempotent
Feeds Podcast Index has marked dead, meaning they stopped responding long enough that crawling was abandoned. Each entry can name the feed it duplicates, where the index concluded one feed superseded another. Useful for auditing a list of shows for ones that have quietly stopped, and for understanding churn in the directory. This is a large list.
Inputs: max.
list_value_podcastsList shows that take listener paymentsARead-onlyIdempotent
Every feed in the index carrying a value block, paged. This is the whole value-for-value corner of podcasting as a list, which is useful for sizing it or for finding shows that have opted into direct listener payment. Use start_at to page: the list is large.
Inputs: max, start_at, time_splits_only.
notify_feed_updateTell the index a feed has new contentAIdempotent
Ping Podcast Index to say a feed has changed, so it recrawls sooner than its normal schedule. Use this straight after publishing an episode: the index will find it on its own eventually, and this shortens eventually. Safe to call more than once, and it needs no API key, so it works even on an unconfigured install. It does not add a feed that is not already in the index; use submit_feed for that.
Inputs: show (required).
search_episodes_by_personFind episodes crediting a personARead-onlyIdempotent
Find episodes where a named person is credited as host, guest, producer or any other role. This reads the Podcasting 2.0 person tag, so it finds real credits rather than passing mentions, which makes it the tool for guest research and for tracing where somebody has appeared. Two honest limits: it only finds shows that publish person tags, which is a minority of the index, and it matches the name as written, so a person credited inconsistently appears under more than one spelling. Returns episodes, not shows.
Inputs: q (required), max.
search_musicSearch music feedsARead-onlyIdempotent
Search feeds whose medium is music rather than talk. Podcast Index carries music as a separate medium under the Podcasting 2.0 spec, and those feeds are albums and tracks rather than episodes. Use this for music discovery; a normal podcast search will not surface them well.
Inputs: q (required), max, clean, only_with_value.
search_podcastsSearch podcastsARead-onlyIdempotent
Search the Podcast Index for shows by keyword, across title, author and owner. This is the general starting point when you have a topic or a name and need to find the show. Returns feeds with their Podcast Index feed id, which every other tool accepts. Matching is keyword-based rather than semantic, so two or three plain words work better than a sentence.
Inputs: q (required), max, clean, similar, +1 more.
search_podcasts_by_titleSearch podcasts by title onlyARead-onlyIdempotent
Search shows by title alone, ignoring author and owner. Use this when you know roughly what a show is called and a general search returned a wall of shows that merely mention the words. Much more precise than search_podcasts for a known name, and much worse for a topic.
Inputs: q (required), max, clean, similar.
search_transcriptFind where something was saidARead-onlyIdempotent
Search inside an episode's transcript and return the moments a phrase was said, each with a timestamp, the speaker where known, and the surrounding conversation. This is the fast path for 'when did they talk about X': one call, no paging, and the timestamp tells you where to skip to in the audio. Matching is literal and case-insensitive rather than semantic, so search for the words that would actually have been spoken and try a couple of phrasings before concluding a topic never came up. An empty result means those words are absent, not that the subject was not discussed.
Inputs: query (required), episode_id (required), max.
statusWhat this server can currently reachARead-onlyIdempotent
Report whether the Podcast Index credentials are configured and working, how far this machine's clock is from the server's, and which tool groups are available. Call this first when anything is failing in a way that looks like a permissions or connectivity problem, rather than inferring the cause from an empty result.
Inputs: no named parameters.
submit_feedAdd a podcast to the indexADestructiveIdempotent
Add a podcast to Podcast Index by its RSS feed URL. This writes to a public global directory that hundreds of podcast apps read, and there is no way to remove a feed through this API afterwards, so it requires confirm: true. If the feed is already indexed you get its existing id back and nothing changes. Needs an API key with write permission, which Podcast Index grants separately from a normal key; without it the call fails with a message saying so and nothing is submitted.
Inputs: feed_url (required), confirm, itunes_id.
submit_feed_by_itunes_idAdd a podcast by its iTunes idADestructiveIdempotent
Add a podcast to Podcast Index using its iTunes id, for when you have an Apple Podcasts link but not the RSS URL. Same effect and same caveats as submit_feed: it writes to a public directory, it cannot be undone through this API, it requires confirm: true, and it needs a key with write permission.
Inputs: itunes_id (required), confirm.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 36 tools
Most tools map to a distinct resource and action, and the descriptions carefully separate similar-looking options like search_podcasts vs search_podcasts_by_title and get_recent_episodes vs get_trending. The main ambiguity is search_episodes_by_person vs find_guest_appearances, which both handle credited-person lookups and could lead to misselection if an agent does not read closely.
The set mostly follows a clear verb_noun pattern: search_, get_, list_, find_, submit_. There are minor deviations such as bare status, notify_feed_update instead of update_feed, and the mix of list_value_podcasts vs get_new_value_feeds, but the overall style is predictable and readable.
At 36 tools, this is a large surface for an agent to choose from, and many tools cover very narrow niche features or redundant listing variants that could be consolidated. The broad scope of Podcast Index justifies some size, but this is beyond the range where each tool is easy to keep in mind.
The domain is well covered: search, metadata, episodes, transcripts, chapters, soundbites, value blocks, trends, feed health, submission, and stats all have dedicated tools. The main gaps are a general episode keyword search and any update/remove workflow, but those are largely API or directory limitations rather than obvious agent-dead-end omissions.
Maintenance
Related MCP Connectors
Podcast knowledge for AI agents: search episodes, pull transcripts and ask questions.
Podcast search, metadata, chapters, and transcripts for AI agents — from $15/mo
Podcast intelligence for agents: transcripts, clips, speaker diarization, mention tracking.
YouTube transcripts, IMDb search and podcast search as agent tools.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceWraps the Podcast Index API (podcastindex.org) to enable AI agents to search and retrieve podcast episodes and metadata.297 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables users to search for podcasts, discover trending shows, find episodes, and explore Value4Value monetization using the PodcastIndex API.3MIT

Rephonicofficial
AlicenseAqualityCmaintenanceGive AI agents and LLMs access to podcast data from Rephonic — covering 3+ million podcasts with listener estimates, demographics, contact details, chart rankings, episodes, and more.262MIT- AlicenseAqualityBmaintenanceEnables AI agents to discover long-tail podcasts through randomized probe queries, trend lookups, and RSS feed peeks, providing cadence, episode length, and feed details without requiring API keys.6MIT