Tool Reference
Every tool available through the ShowHub MCP server. Tools are grouped by category. Unless noted, any argument marked podcastId is optional. Omit it to use the active podcast.
Status & Info
get_status
Get the current user’s account info, active podcast, setup progress, and a list of all their podcasts. Call this first to understand what the user has set up so far.
| Argument | Type | Required | Description |
|---|---|---|---|
| (none) |
Returns: User email, display name, active podcast, setup step, and a list of all podcasts with their IDs and titles.
get_podcast_details
Get full details about a podcast including branding, connected platforms, custom domain, and stats.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
Returns: Podcast title, slug, subdomain, branding config, connected platforms, episode count, custom domain info, and setup status.
Podcast Management
list_podcasts
List all podcasts owned by the current user.
| Argument | Type | Required | Description |
|---|---|---|---|
| (none) |
Returns: Array of podcasts with IDs, titles, slugs, and subdomains.
select_podcast
Set which podcast the agent should work on. All subsequent operations that don’t pass a podcastId will use this.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | Yes | The ID of the podcast to select as active. |
Returns: Confirmation with the selected podcast’s details.
create_podcast
Create a new podcast. Also sets it as the active podcast and advances setup to “podcast created”. The slug becomes the hosted subdomain: {slug}.showhubco.com.
| Argument | Type | Required | Description |
|---|---|---|---|
title | string | Yes | The podcast title. |
slug | string | Yes | URL-safe slug (lowercase, hyphens OK). Becomes the subdomain. |
description | string | No | Optional podcast description. |
rssUrl | string | No | RSS feed URL. If omitted, a placeholder is created. |
Returns: The new podcast’s ID, title, slug, and subdomain.
claim_subdomain
Claim or change the hosted subdomain for a podcast. The new slug must be unique.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
subdomain | string | Yes | The desired subdomain (lowercase, hyphens OK, min 3 chars). |
Returns: Confirmation with the new subdomain URL.
complete_setup
Mark the setup wizard as completed. Call after all setup steps are done.
| Argument | Type | Required | Description |
|---|---|---|---|
| (none) |
Returns: Confirmation that setup is complete.
Connectors
list_connectors
List all connected platforms (YouTube, RSS, Spotify, etc.) for a podcast.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
Returns: Array of connectors with platform, status, and last sync time.
connect_rss
Connect an RSS feed as a source. If the ownerEmail matches the user’s email, it auto-verifies.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
feedUrl | string | Yes | The RSS feed URL. |
ownerEmail | string | No | Email of the feed owner. Auto-verifies if it matches. |
Returns: The new connector’s ID and status.
connect_spotify
Connect a Spotify show. Provide the Spotify show URL and optionally the RSS feed URL for auto-verification.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
showUrl | string | Yes | Spotify show URL (e.g. https://open.spotify.com/show/...). |
feedUrl | string | No | Optional RSS feed URL for the show. |
ownerEmail | string | No | Email of the show owner for verification. |
Returns: The new connector’s ID and status.
connect_youtube
Connect a YouTube channel. Provide the channel ID (starts with UC).
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
channelId | string | Yes | YouTube channel ID (starts with UC). |
channelTitle | string | No | Channel display name. |
Returns: The new connector’s ID and status.
disconnect_connector
Disconnect a platform connector by its ID.
| Argument | Type | Required | Description |
|---|---|---|---|
connectorId | string | Yes | The connector ID to disconnect. |
Returns: Confirmation that the connector was removed.
trigger_sync
Trigger a source sync for a podcast. Fetches the latest episodes from the connected source.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
Returns: Confirmation that sync was triggered.
Branding
get_branding
Get the current branding configuration (colors, logo, banner, fonts) for a podcast.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
Returns: Full branding config including colors, fonts, dark mode, logo URLs, and custom CSS.
update_branding
Update branding settings. Only pass the fields you want to change.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
primaryColor | string | No | Primary brand color (hex, e.g. #6366f1). |
accentColor | string | No | Accent color (hex). |
backgroundColor | string | No | Background color (hex). |
darkMode | boolean | No | Enable dark mode. |
displayName | string | No | Display name shown on the site. |
fontFamily | string | No | Font family name. |
customCss | string | No | Custom CSS to inject. |
footerText | string | No | Footer text. |
Returns: The updated branding config.
set_website_url
Set the podcast’s external website URL (used for branding extraction and links).
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
websiteUrl | string | Yes | The podcast’s website URL. |
Returns: Confirmation with the updated URL.
set_template
Set the default page template for episodes.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
template | string | Yes | One of minimal, magazine, or podcast_native. |
Returns: Confirmation with the selected template.
Episodes
list_episodes
List episodes for a podcast, sorted by most recent first.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
limit | number | No | Max episodes to return (default 50, max 100). |
visibleOnly | boolean | No | Only return visible episodes. |
Returns: Array of episodes with title, description snippet, duration, visibility status, and transcript status.
update_episode_visibility
Show or hide an episode on the public site.
| Argument | Type | Required | Description |
|---|---|---|---|
episodeId | string | Yes | The episode ID. |
isVisible | boolean | Yes | Whether the episode should be visible. |
Returns: Confirmation with the updated visibility status.
Embed Player
get_embed_theme
Get the current embed player theme settings (colors, layout, density).
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
Returns: Theme ID, colors, page title/subtitle, and custom CSS.
update_embed_theme
Update embed player theme settings. Only pass the fields you want to change.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
themeId | string | No | Theme ID (see list below). |
pageTitle | string | No | Title shown on the embed player. |
pageSubtitle | string | No | Subtitle shown on the embed player. |
primaryColor | string | No | Primary color (hex). |
accentColor | string | No | Accent color (hex). |
backgroundColor | string | No | Background color (hex). |
customCss | string | No | Custom CSS to inject into the embed. |
Available themes: classic-list, card-grid, minimal-rows, magazine, dark-studio, waveform, neon-pulse, mono-column, cinema-stack, editorial-cards, playlist-stripes, soft-glow, vinyl-spin, tape-deck, broadcast-tower, spotlight, ticker-tape, glass-panel, paper-clip, spectrum-bars.
Returns: The updated embed theme config.
get_embed_code
Get the embed code snippets for a podcast.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
Returns: A script tag embed, an iframe embed, and the hosted site URL.
Episodes (Extended)
get_episode
Get full details about a specific episode.
| Argument | Type | Required | Description |
|---|---|---|---|
episodeId | string | Yes | The episode ID. |
Returns: Episode title, description, audio URL, duration, publish date, season, visibility, blog post status, and transcript availability.
search_episodes
Search episodes by keyword within a podcast.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. Omit to use the active podcast. |
query | string | Yes | Search query. |
limit | number | No | Max results (default 20). |
Returns: Array of matching episodes with title, snippet, and relevance score.
batch_update_episodes
Update multiple episodes at once (visibility, season assignment, etc.). Requires Business plan.
| Argument | Type | Required | Description |
|---|---|---|---|
updates | array | Yes | Array of { episodeId, visibility?, seasonId? } objects. |
Returns: Count of updated episodes and any errors.
Seasons
list_seasons
List all seasons for a podcast. Requires Business plan.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
Returns: Array of seasons with IDs, titles, and episode counts.
create_season
Create a new season. Requires Business plan.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
title | string | Yes | Season title. |
number | number | No | Season number. |
Returns: The created season.
update_season
Update season title or number. Requires Business plan.
| Argument | Type | Required | Description |
|---|---|---|---|
seasonId | string | Yes | Season ID. |
title | string | No | New title. |
number | number | No | New number. |
Returns: The updated season.
add_episode_to_season
Assign an episode to a season. Requires Business plan.
| Argument | Type | Required | Description |
|---|---|---|---|
seasonId | string | Yes | Season ID. |
episodeId | string | Yes | Episode ID. |
Returns: Confirmation.
remove_episode_from_season
Remove an episode from its season. Requires Business plan.
| Argument | Type | Required | Description |
|---|---|---|---|
seasonId | string | Yes | Season ID. |
episodeId | string | Yes | Episode ID. |
Returns: Confirmation.
Blog
list_blog_posts
List blog posts for a podcast. Requires Business plan.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
status | string | No | Filter: draft, published, or all. Default: all. |
limit | number | No | Max results. |
Returns: Array of blog posts with titles, status, and dates.
get_blog_post
Get a single blog post by ID. Requires Business plan.
| Argument | Type | Required | Description |
|---|---|---|---|
postId | string | Yes | Blog post ID. |
Returns: Full blog post with title, body, status, and linked episode.
create_blog_post
Create a new blog post. Requires Business plan.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
title | string | Yes | Post title. |
body | string | Yes | Post body (Markdown). |
status | string | No | draft or published. Default: draft. |
episodeId | string | No | Link to an episode. |
Returns: The created blog post.
update_blog_post
Update an existing blog post. Requires Business plan.
| Argument | Type | Required | Description |
|---|---|---|---|
postId | string | Yes | Blog post ID. |
title | string | No | New title. |
body | string | No | New body. |
status | string | No | draft or published. |
Returns: The updated blog post.
delete_blog_post
Delete a blog post. Requires Business plan.
| Argument | Type | Required | Description |
|---|---|---|---|
postId | string | Yes | Blog post ID. |
Returns: Confirmation.
Pages
list_pages
List the pages on a podcast’s site (homepage, about, etc.).
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
Returns: Array of pages with IDs, slugs, and titles.
get_page
Get a page’s configuration and sections.
| Argument | Type | Required | Description |
|---|---|---|---|
pageId | string | Yes | Page ID. |
Returns: Page config, sections, and template.
update_page
Update a page’s sections or settings.
| Argument | Type | Required | Description |
|---|---|---|---|
pageId | string | Yes | Page ID. |
sections | array | No | Updated sections array. |
title | string | No | Page title. |
Returns: The updated page.
Analytics
get_analytics_overview
Get a summary of podcast analytics (plays, listeners, sources). Requires Pro plan.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
period | string | No | 7d, 30d, 90d, or all. Default: 30d. |
Returns: Total plays, unique listeners, top episodes, source breakdown, and trends.
get_top_episodes
Get the top episodes by plays for a podcast. Requires Pro plan.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
period | string | No | 7d, 30d, 90d, or all. Default: 30d. |
limit | number | No | Max results. Default: 10. |
Returns: Ranked list of episodes with play counts and listener counts.
get_audience_geo
Get listener geography breakdown. Requires Pro plan.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
period | string | No | Time period. Default: 30d. |
Returns: Country-level listener breakdown.
get_listener_trend
Get daily listener trend for a period. Requires Pro plan.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
period | string | No | 7d, 30d, 90d. Default: 30d. |
episodeId | string | No | Scope to a single episode. |
Returns: Daily data points with date, plays, and unique listeners.
Insight Data Tools
These tools provide deterministic data analysis — no AI/LLM calls. They analyze your podcast’s actual listener data and return structured findings.
episode_autopsy
Analyze an episode’s listener retention curve. Shows where people dropped off, what they skipped, and what held their attention. Includes confidence labels based on listener count.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
episodeId | string | Yes | Episode to analyze. |
Returns:
- confidence:
high(30+ starts),medium(15–29),low(5–14), orinsufficient(< 5) - summary: Intro hold %, average % listened, reached-end %, start count
- findings: Each drop-off or spike with timestamp, transcript excerpt, signals (e.g.
sponsor_read_keywords,topic_shift,long_monologue), and whether the moment aligns with chapter boundaries - retention.curve: Sampled retention curve (every 5th of 100 buckets)
find_clips
Find the best 20–90 second moments in an episode for social clips. Uses retention data to find high-engagement sections with timestamps snapped to sentence boundaries in the transcript.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
episodeId | string | Yes | Episode to analyze. |
minDurationSeconds | number | No | Minimum clip length (default: 20s). |
maxClips | number | No | Max clips to return (default: 5). |
Returns: Array of clip candidates, each with:
- startSec / endSec: Sentence-boundary-snapped timestamps
- durationSec: Clip duration
- retentionScore: Local average retention share
- scoreBreakdown: Individual signal contributions (spike, chapter, keyword, relistened)
- transcript: Excerpt text
- deepLink: Direct URL to the clip moment on the show’s site
- basis:
retentionorretention+transcript— what signals contributed
topic_gaps
Find topics your audience searches for that the show hasn’t covered. Uses zero-result searches from your site search and Search Console data. A privacy floor of ≥ 3 distinct searches is enforced before any topic can appear.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
sampleSize | number | No | Max gaps to return. |
Returns:
- privacyFloor: Always 3 (minimum distinct searches)
- totalGaps: Number of gaps found
- gaps: Array of
{ topic, distinctSearches, source, coverage }wheresourceissite_searchorsearch_consoleandcoverageisuncoveredorpartial
Sync & Status
get_sync_status
Check the sync status for a podcast — last sync time, pending items, errors.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
Returns: Last sync timestamp, connector statuses, and any errors.
get_domain_status
Check the hosted address and the custom domain’s state.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
Returns: Hosted URL, plus (if set) the custom domain, status, what it’s waiting on (statusDetail), the exact DNS records with absolute names, Search Console / email extras, and a nextStep hint.
Custom Domains
Connect a domain the user already owns. Show Hub does not sell domains. Requires Pro plan. The agent never handles DNS passwords or API tokens: DNS changes happen on the private setupUrl, which offers one-click setup, paste-a-token setup or guided steps.
start_custom_domain
Detect the domain’s DNS provider, save it, and return the records plus a setup link.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
domain | string | Yes | yourshow.com or listen.yourshow.com. |
includeEmail | boolean | No | Also add SPF/DKIM records so the domain is ready to send email. |
allowReplaceExistingSite | boolean | No | Only after the user confirms replacing a website already on the bare domain. |
Returns: records, dnsProvider, connectMethod (domain_connect, api_token or manual), setupUrl (private, 7 days) and nextSteps. If the bare domain already serves a website, returns needsDecision: true with subdomain suggestions instead of saving.
verify_custom_domain
Re-check DNS, hosting and SSL now and return the updated status (Show Hub also checks automatically).
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
check_domain_propagation
Ask DNS probes in about 12 cities what they currently resolve for the domain.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
Returns: summary (e.g. “9 of 12 locations see …”), and per-location state: match, missing, mismatch or error.
create_domain_handoff
Create a private setup page for whoever manages the user’s DNS. No Show Hub account needed. Creating a new link revokes the old one.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
recipientEmail | string | No | Email the link to this person. |
note | string | No | Short note included in the email. |
Returns: setupUrl, expiresAt, emailedTo.
remove_custom_domain
Disconnect the custom domain. The site stays at the Show Hub address and DNS records at the provider are left alone. Requires confirmation (two-phase confirmToken).
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
get_site_health
Check the health of a podcast’s hosted site.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
Returns: Site reachability, page count, episode count, last build time, and any issues.
Site Branches
Stage changes to your site before going live. Requires Business plan.
list_branches
List all site branches.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
Returns: Array of branches with IDs, names, and change counts.
create_branch
Create a new site branch for staging changes.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
name | string | Yes | Branch name. |
description | string | No | Description. |
Returns: The created branch.
apply_branch_change
Add or update a change on a branch.
| Argument | Type | Required | Description |
|---|---|---|---|
branchId | string | Yes | Branch ID. |
change | object | Yes | The change to apply. |
Returns: The updated branch with its changes.
merge_branch
Merge a branch’s changes into the live site.
| Argument | Type | Required | Description |
|---|---|---|---|
branchId | string | Yes | Branch ID. |
Returns: Confirmation with the list of applied changes.
discard_branch
Discard a branch and all its staged changes.
| Argument | Type | Required | Description |
|---|---|---|---|
branchId | string | Yes | Branch ID. |
Returns: Confirmation.
Team
Manage team members and roles. Requires Business plan.
list_members
List all team members for a podcast.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
Returns: Array of members with IDs, emails, roles, and join dates.
invite_member
Invite a new team member by email.
| Argument | Type | Required | Description |
|---|---|---|---|
podcastId | string | No | Podcast ID. |
email | string | Yes | Email to invite. |
role | string | Yes | editor or viewer. |
Returns: The pending invitation.
update_member_role
Change a team member’s role.
| Argument | Type | Required | Description |
|---|---|---|---|
memberId | string | Yes | Member ID. |
role | string | Yes | New role. |
Returns: The updated member.
remove_member
Remove a team member.
| Argument | Type | Required | Description |
|---|---|---|---|
memberId | string | Yes | Member ID. |
Returns: Confirmation.