Python Bytes MCP Server
Model Context Protocol access to 9 years of Python news
What this is
Python Bytes runs a public, read-only MCP server. Point Claude, Claude Code, Cursor, or any other MCP-capable assistant at it and it can search the archive, pull up a specific episode's show notes and links, read full transcripts, and check when the next live stream is.
There is no account, no API key, and no rate limit. Everything served here is the same public podcast data already on the website. The server is read-only: nothing an assistant does through it can change anything.
Add it to your assistant
Most clients read a JSON config file. Add the Python Bytes entry to yours and restart the client:
{
"mcpServers": {
"python-bytes": {
"url": "https://pythonbytes.fm/api/mcp"
}
}
}
On macOS, Claude Desktop keeps that file at
~/Library/Application Support/Claude/claude_desktop_config.json.
For Claude Code, run
claude mcp add --transport http python-bytes https://pythonbytes.fm/api/mcp
instead. Client setup moves around, so check your client's own docs if the path above
does not match what you see.
No MCP support in your tool? Every episode is also available as plain Markdown by
adding .md to its URL, and /llms.txt describes the
whole site for assistants that only fetch URLs.
Server details
| Server name | python-bytes-mcp |
|---|---|
| Version | 1.1.0 |
| Endpoint | https://pythonbytes.fm/api/mcp |
| Discovery | https://pythonbytes.fm/.well-known/mcp.json |
| Protocol | JSON-RPC 2.0 over HTTP POST |
| Authentication | None. Public, read-only data. |
Available tools
The server exposes 12 tools. Your assistant discovers them automatically, so this list is here for humans deciding whether it is worth adding.
search_episodes
Search Python Bytes podcast episodes by keyword. Returns matching episodes with title, summary, and URL. Multiple words are combined with AND, so more words narrow the results. Note that hyphenated terms like "scikit-learn" are treated as two separate words.
| Parameter | Type | Required | Description |
|---|---|---|---|
query |
string |
Yes | Search query (keywords to find in episode titles and show notes) |
limit |
integer |
No | Maximum number of results to return |
search_transcripts
Search the spoken content of Python Bytes episodes by keyword. Use this when you want what the hosts actually said rather than what the show notes list. Returns the matching episodes with links to the episode page and its WebVTT transcript.
| Parameter | Type | Required | Description |
|---|---|---|---|
query |
string |
Yes | Search query (keywords to find in episode transcripts) |
limit |
integer |
No | Maximum number of results to return |
get_episode
Get full details for a specific Python Bytes episode by its show number. Returns the title, published date, duration, audio and video links, the topics covered, and the complete show notes.
| Parameter | Type | Required | Description |
|---|---|---|---|
show_id |
integer |
Yes | The episode show number (e.g., 400 for episode #400) |
get_episodes
Get a list of every published Python Bytes episode with its show number and title. Useful for browsing the archive before looking up a specific episode. This is a large response; prefer search_episodes or get_recent_episodes when you can.
No parameters.
get_recent_episodes
Get the most recently published Python Bytes episodes, newest first. Use this to answer questions about what is new in Python.
| Parameter | Type | Required | Description |
|---|---|---|---|
limit |
integer |
No | Number of recent episodes to return |
get_episode_topics
Get the individual news items covered in a Python Bytes episode. Each episode covers several numbered topics, one per host, and each topic links out to the package, article, or project being discussed. Returns each topic with its presenter, position in the show, and outbound links.
| Parameter | Type | Required | Description |
|---|---|---|---|
show_id |
integer |
Yes | The episode show number |
get_transcript_for_episode
Get the full plain-text transcript for a Python Bytes episode. Transcripts are long, so expect a substantial number of tokens.
| Parameter | Type | Required | Description |
|---|---|---|---|
show_id |
integer |
Yes | The episode show number |
get_transcript_vtt
Get the transcript for a Python Bytes episode in WebVTT format. WebVTT includes a timestamp for each segment, useful for subtitles or for linking to a specific moment in the audio. Transcripts are long, so expect a substantial number of tokens.
| Parameter | Type | Required | Description |
|---|---|---|---|
show_id |
integer |
Yes | The episode show number |
get_next_livestream
Get the next scheduled Python Bytes live stream, or the one currently in progress. Python Bytes records live on YouTube most Mondays. Returns the title, start time, and watch URL.
No parameters.
search_courses
Search Talk Python Training courses, chapters, and lectures by keyword. Talk Python Training is the course platform run by Python Bytes co-host Michael Kennedy. Optionally search within a specific course by providing a course_id.
| Parameter | Type | Required | Description |
|---|---|---|---|
query |
string |
Yes | Search query (keywords to find in course, chapter, and lecture titles) |
course_id |
integer |
No | Optional: search within a specific course only (provide the course ID) |
get_courses
Get a list of all available Talk Python Training courses. Returns course titles, descriptions, URLs, tags, prices, and publication dates. Use this to browse the catalog before searching for specific content.
No parameters.
get_course_details
Get full details for a Talk Python Training course by ID, including its chapter and lecture structure with durations.
| Parameter | Type | Required | Description |
|---|---|---|---|
course_id |
integer |
Yes | The course ID (get one from get_courses or search_courses) |
Calling it directly
The endpoint is plain JSON-RPC 2.0 over HTTP POST, so you do not need an MCP client to use it. Start with the handshake:
curl -X POST https://pythonbytes.fm/api/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize",
"params":{"clientInfo":{"name":"my-client","version":"1.0"}}}'
List what is available:
curl -X POST https://pythonbytes.fm/api/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'
Then call a tool:
curl -X POST https://pythonbytes.fm/api/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call",
"params":{"name":"search_episodes","arguments":{"query":"uv","limit":5}}}'
Text or JSON
Tools return human-readable Markdown by default, which is what you want when a
language model is going to read the result. Add ?format=json to the
endpoint URL and every tool returns structured data instead:
curl -X POST "https://pythonbytes.fm/api/mcp?format=json" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":4,"method":"tools/call",
"params":{"name":"get_episode_topics","arguments":{"show_id":400}}}'
Either way the payload arrives in the MCP content block, so with
?format=json the text field holds a JSON-encoded string
you parse yourself. List tools return an array and single-item lookups return an object.
A note on transcripts
get_transcript_for_episode and get_transcript_vtt return the
entire transcript in one block. A single Python Bytes transcript runs to roughly
15,000 tokens, so pull one deliberately rather than in a loop. If you are looking for
a specific moment, search_transcripts will narrow it down first.
Questions
Something broken, or a tool you wish existed? Email contact@pythonbytes.fm. Talk Python runs its own MCP server too, with the podcast archive and the full course catalog.