Let your AI assistant run your podcasts
Podcasto speaks Model Context Protocol (MCP), so Claude, ChatGPT, Cursor, Codex or any MCP-capable client can browse, create and manage your podcasts — acting as you, inside your own plan limits and credit balance.

Two doors in
Podcasto runs two MCP servers. One needs nothing at all; the other acts as you.
Discover public podcasts
Search the public directory, list published episodes and play them — exactly what an anonymous visitor sees on the website. Read-only and free.
https://app.podcasto.app/api/mcp/publicPublic endpoint, Claude Code
claude mcp add --transport http podcasto-public https://app.podcasto.app/api/mcp/publicWork on your own podcasts
List, create and manage your podcasts, push content into an inbox and generate episodes — within your plan and your credit balance. Needs a personal access token or an OAuth connection.
https://app.podcasto.app/api/mcpHow it works
Your assistant
Claude, ChatGPT, Cursor, Codex…
Podcasto MCP server
checks the token, then the scope
Your podcasts
episodes, inbox, credits
A bearer token identifies your agent
A personal access token or an OAuth-issued one, sent as an Authorization: Bearer header on every call.
Every call is scope-checked
The token's scopes decide which tools it can call. A call outside them is refused, naming the missing scope.
It runs as you — nothing more
Same entitlement, ownership and Telegram validation as the web app. An agent can't reach another user's data.
Your plan and credits still apply
An agent can't unlock a feature your plan disallows, and generating an episode still spends your credits.
Connecting from each client
ChatGPT and Claude connect with your Podcasto login. For token-based clients, copy the command and replace the placeholder with your personal token.
Connect with screenshots
Use your Podcasto login. No personal access token is needed for these connections.
Personal access token, sent as a bearer header.
Claude Code connection command
claude mcp add --transport http podcasto https://app.podcasto.app/api/mcp --header "Authorization: Bearer pk_..."Security model, in plain words
Tokens are hashed at rest
Podcasto never stores your personal access token in a readable form — only a one-way hash and a short prefix to recognize it in your token list.
Revocation is immediate
Revoking a token on your Agent Access page takes effect on the next call — there's no caching window where a revoked token still works.
Admin access is PAT-only, re-checked every call
The admin scope requires being an admin both when a token is minted and when each admin tool is called. OAuth connections never carry it, regardless of role.
No destructive or payment actions
Nothing over MCP can delete an account, podcast or episode, or charge a card or move money. Generation spends the same credit balance you already manage.
FAQ
Full reference: scopes and tools
Everything an agent can ask for, and which scope unlocks it.
Scopes
A token can only call the tools its scopes cover. Grant the fewest scopes that get the job done.
| Scope | Grants |
|---|---|
podcasts:readRead podcasts | List your podcasts and read their settings. |
podcasts:writeManage podcasts | Create, update, pause and resume your podcasts. |
sources:pushAdd content to an inbox | Push text, notes and links into the manual inbox of your own podcasts, for a later episode to be written from. |
episodes:readRead episodes | List episodes and read their status, audio URL and timeline. |
episodes:generateGenerate episodes | Start episode generation. This spends your credits. |
episodes:writeEdit episode scripts | Edit an episode's script and discard a script draft you no longer want (refunds credits, minus the draft fee). |
credits:readRead credits | Read your credit balance and plan entitlements. |
adminAdminister the platform | Operate admin tooling (health, users, failed episodes, runtime settings). Only available to admins, and re-checked on every call. |
The admin scope is available only to personal access tokens, only while the holder is actually an admin — losing admin access invalidates any old admin token immediately. OAuth-issued access (Claude.ai, ChatGPT, Cursor connectors) never carries it, regardless of the account's role.
Tools
Every tool answers with a single JSON result. `tools/list` names only the tools the token's scopes allow; `get_me` lists the hidden ones the account could be granted, with the scope each needs. Every tool still checks its scope when called.
Public tools — no account needed
No tokenServed from a separate endpoint, https://app.podcasto.app/api/mcp/public, with no sign-in at all. It sees only what the website already shows: public podcasts and published episodes, plus a playable audio link served by Podcasto itself — the same one the episode page uses. The app re-checks the episode on each request, though a copy already cached at the CDN can keep playing for a while after it stops being public.
| Tool | Purpose |
|---|---|
search_podcastsno token | Search the public podcast directory by text and language. |
list_public_episodesno token | List published episodes of public podcasts, newest first, with a paging cursor. |
get_public_episodeno token | Read one published episode and get a playable audio URL — no account needed. |
play_episodeno token | Same as get_public_episode, plus an inline player in clients that render MCP Apps. |
User tools
| Tool | Purpose |
|---|---|
get_meany valid token | Identity, plan, entitlements and (with credits:read) credit balance. |
list_my_podcastspodcasts:read | List your podcasts and their basic status. |
get_podcastpodcasts:read | Read one podcast, its sources, its public-feed status (URL, ready, missing[]) and every setting update_podcast can change. |
preview_telegram_channelpodcasts:write | Check a Telegram channel is reachable before creating a podcast from it. |
create_podcastpodcasts:write | Create a podcast from Telegram, RSS and/or inbox sources (counts against the plan's podcast limit; no credit charge). |
update_podcastpodcasts:write | Change a podcast you own: title, description, language, schedule, duration, format, style, intro/outro, voices and the public-feed metadata incl. the feed switch (the plan may clamp or drop a field). |
set_podcast_artworkpodcasts:write | Fetch an HTTPS image as the artwork: feed JPEG (≥1400 px) plus web cover. |
generate_podcast_artworkpodcasts:write | Generate artwork from the title and description (daily cap per podcast, no credit charge). |
add_podcast_sourcepodcasts:write | Add a Telegram channel, RSS feed or inbox to a podcast you own. |
update_podcast_sourcepodcasts:write | Edit one existing source in place: its name, whether it collects, or its channel/feed. |
remove_podcast_sourcepodcasts:write | Remove one content source from a podcast you own (never its last one). |
pause_podcastpodcasts:write | Stop scheduled generation for a podcast. |
resume_podcastpodcasts:write | Resume scheduled generation and clear the auto-pause failure streak. |
delete_podcastpodcasts:write | Permanently delete a podcast you own with all its episodes (irreversible, no refund; needs confirm:true). |
list_episodesepisodes:read | List a podcast’s episodes, newest first. |
get_episodeepisodes:read | Read one episode’s status, audio URL (once published) and failure details. |
generate_episodeepisodes:generate | Start generation for a podcast. Charges credits; requires confirm: true. Optional draft mode stops before audio for review. |
get_episode_scriptepisodes:read | Read an episode's script text and the etag needed to edit or approve it. |
update_episode_scriptepisodes:write | Replace an episode's script text, CASed on a required etag. |
approve_episode_draftepisodes:generate | Accept a script draft and start synthesizing its audio. No extra charge. |
discard_episode_draftepisodes:write | Close a script draft and refund its charge minus the draft fee. Irreversible. |
update_episodeepisodes:write | Edit an episode's title and/or description. No charge. |
regenerate_episode_audioepisodes:generate | Re-synthesize an episode’s audio from its saved script. Charges credits; requires confirm: true. |
add_content_itemssources:push | Push text, notes or links into a podcast's manual inbox for its next episode. |
list_inbox_itemssources:push | Read a podcast inbox — waiting, used or withdrawn items, and who submitted each. |
update_inbox_itemsources:push | Correct the text, title or link of an inbox item that is still waiting. |
discard_inbox_itemsources:push | Withdraw a waiting inbox item so the next episode skips it. Undone by restore. |
restore_inbox_itemsources:push | Put a withdrawn or already-used inbox item back in the waiting queue. |
get_credit_balancecredits:read | Read available, used and total credits. |
get_credit_historycredits:read | List the credit ledger, newest first: charges, refunds, purchases, grants. |
Admin tools
Admin-onlyRequire the admin scope and an admin account at call time. Only reachable via a personal access token — never via OAuth.
| Tool | Purpose |
|---|---|
admin_system_healthadmin | Fast health subset: cron freshness, episode-outcome SLI, refund-queue depth. |
admin_list_usersadmin | Newest-first user list with effective plan, role, credits and activity; truncated at a safety cap. |
admin_list_podcastsadmin | List every podcast on the platform (basic fields, paginated). |
admin_list_failed_episodesadmin | List failed episodes with failure class and timing. |
admin_get_episode_logsadmin | Read processing log lines for one episode. |
admin_generate_episodeadmin | Generate an episode without charging the owner’s credits. Requires confirm: true. |
admin_regenerate_audioadmin | Re-run synthesis for an existing episode. Requires confirm: true. |
admin_get_runtime_settingsadmin | Read managed runtime settings (value, source, bounds); secrets omitted. |
admin_set_runtime_settingadmin | Update one managed runtime setting. Requires confirm: true; audit-logged. |
admin_cost_summaryadmin | Per-episode production cost vs credits charged for a given month. |
Ready to connect an agent?
Create a personal access token, or read the full reference above for the whole tool surface.