{
  "schemaVersion": "1.0",
  "serverInfo": {
    "name": "PodcastsToText",
    "version": "2.2.0",
    "description": "Transcribe podcasts and audio to text, then generate show notes, chapters, translations, and published episode pages from the result.",
    "homepage": "https://podcaststotext.com/mcp",
    "documentation": "https://podcaststotext.com/api/v1/openapi.json",
    "contact": "support@podcaststotext.com"
  },
  "transport": {
    "type": "http",
    "endpoint": "https://podcaststotext.com/api/mcp"
  },
  "authentication": {
    "type": "oauth2",
    "description": "OAuth 2.1 with PKCE and dynamic client registration; connectors sign the user in on https://podcaststotext.com. Clients that cannot do OAuth send a PodcastsToText API key (ptt_…) as `Authorization: Bearer <key>`, created at https://podcaststotext.com/dashboard/api-keys.",
    "authorizationServer": "https://podcaststotext.com/.well-known/oauth-authorization-server",
    "protectedResourceMetadata": "https://podcaststotext.com/.well-known/oauth-protected-resource/api/mcp",
    "alternatives": [
      {
        "type": "bearer",
        "tokenUrl": "https://podcaststotext.com/dashboard/api-keys"
      }
    ]
  },
  "capabilities": {
    "tools": [
      {
        "name": "get_rss_feed",
        "description": "Resolve a show name, Apple Podcasts link or Spotify link to its RSS feed. A Spotify link is resolved through the Apple directory, since Spotify publishes no feed of its own. Returns several candidates when the name is ambiguous rather than guessing. YouTube and TikTok have no feed, send those straight to transcribe_podcast.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "podcast": {
              "type": "string",
              "description": "The show's name, e.g. \"Hard Fork\""
            },
            "url": {
              "type": "string",
              "description": "An Apple Podcasts or Spotify link, or an RSS feed URL to validate"
            }
          }
        },
        "annotations": {
          "title": "Find a podcast RSS feed",
          "readOnlyHint": true,
          "openWorldHint": true
        }
      },
      {
        "name": "lookup_podcast",
        "description": "Read a feed into show metadata and recent episodes, each with the direct audio URL that transcribe_podcast needs. A Spotify link resolves to the show's public feed first, and to the episode it named. A YouTube or TikTok link resolves to its single video instead.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "url": {
              "type": "string",
              "description": "A podcast RSS feed URL, an Apple Podcasts or Spotify link, or a YouTube/TikTok video link"
            },
            "episode": {
              "type": "string",
              "description": "Part of an episode title, to pick a specific episode"
            }
          },
          "required": [
            "url"
          ]
        },
        "annotations": {
          "title": "Look up a podcast",
          "readOnlyHint": true,
          "openWorldHint": true
        }
      },
      {
        "name": "transcribe_podcast",
        "description": "Start transcribing a direct audio URL, or a YouTube, TikTok, Spotify or Apple Podcasts link. Returns an id straight away: it never waits for the audio. YouTube comes back already completed, read from the video's caption track, and costs nothing; everything else spends the account's credits.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "audio_url": {
              "type": "string",
              "description": "Direct audio URL (.mp3/.m4a/.wav), or a YouTube/TikTok/Spotify/Apple Podcasts link"
            },
            "title": {
              "type": "string",
              "description": "Title for the transcript"
            },
            "language": {
              "type": "string",
              "description": "Language hint, e.g. \"english\". Auto-detected if omitted."
            }
          },
          "required": [
            "audio_url"
          ]
        },
        "annotations": {
          "title": "Transcribe audio",
          "readOnlyHint": false,
          "destructiveHint": false,
          "idempotentHint": false,
          "openWorldHint": true
        }
      },
      {
        "name": "get_transcript",
        "description": "Fetch one transcription and its status. Returns a 1,500-character preview unless you ask for the full body, so a long episode cannot flood the context window by accident.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "description": "Transcription id from transcribe_podcast or list_transcripts"
            },
            "full": {
              "type": "boolean",
              "description": "Return the entire transcript instead of a preview"
            }
          },
          "required": [
            "id"
          ]
        },
        "annotations": {
          "title": "Get a transcript",
          "readOnlyHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "list_transcripts",
        "description": "Browse the account's transcriptions, newest first. Metadata only, never transcript bodies.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "limit": {
              "type": "number",
              "description": "How many to return, max 50 (default 20)"
            },
            "status": {
              "type": "string",
              "enum": [
                "processing",
                "completed",
                "failed"
              ],
              "description": "Filter by status"
            }
          }
        },
        "annotations": {
          "title": "List transcripts",
          "readOnlyHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "search_my_transcripts",
        "description": "Find an episode by keyword across titles and generated show notes: the \"which episode was about X\" question. Does not search the full transcript text.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "query": {
              "type": "string",
              "description": "What to look for, e.g. \"interest rates\""
            },
            "limit": {
              "type": "number",
              "description": "Max results, 1-50 (default 10)"
            },
            "include_unfinished": {
              "type": "boolean",
              "description": "Also search transcripts still processing, or failed"
            }
          },
          "required": [
            "query"
          ]
        },
        "annotations": {
          "title": "Search my transcripts",
          "readOnlyHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "delete_transcript",
        "description": "Permanently delete one transcript and its stored file. Not undoable and does not refund credits. Confirm with the user first.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "description": "Transcription id to delete"
            }
          },
          "required": [
            "id"
          ]
        },
        "annotations": {
          "title": "Delete a transcript",
          "readOnlyHint": false,
          "destructiveHint": true,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "get_usage",
        "description": "Report the plan and remaining transcription credits, in minutes.",
        "inputSchema": {
          "type": "object",
          "properties": {}
        },
        "annotations": {
          "title": "Get credit balance",
          "readOnlyHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "generate_show_notes",
        "description": "A summary plus bullet points for a completed transcription. Cached, so a second call is cheap.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "description": "Transcription id (must already be completed)"
            }
          },
          "required": [
            "id"
          ]
        },
        "annotations": {
          "title": "Generate show notes",
          "readOnlyHint": false,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "generate_chapters",
        "description": "Timestamped chapter markers: a title and a start time per section.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "description": "Transcription id (must already be completed)"
            },
            "force": {
              "type": "boolean",
              "description": "Regenerate even if chapters already exist"
            }
          },
          "required": [
            "id"
          ]
        },
        "annotations": {
          "title": "Generate chapters",
          "readOnlyHint": false,
          "destructiveHint": true,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "translate_transcript",
        "description": "Translate a completed transcript into another language, returned directly. Cached per language, so a repeat request is free. Each transcript may hold a limited number of distinct languages; the response reports the limit.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "description": "Transcription id (must already be completed)"
            },
            "language": {
              "type": "string",
              "description": "Target language, e.g. \"Spanish\""
            },
            "force": {
              "type": "boolean",
              "description": "Re-translate a language already stored, replacing it. Bills again."
            }
          },
          "required": [
            "id",
            "language"
          ]
        },
        "annotations": {
          "title": "Translate a transcript",
          "readOnlyHint": false,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false
        }
      },
      {
        "name": "publish_episode",
        "description": "Put an episode's transcript on a public page at /p/{show}/{episode}. Refused for shows whose ownership has not been verified, because it publishes under the user's name.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "episode_id": {
              "type": "string",
              "description": "Episode id from a connected show (not a transcription id)"
            }
          },
          "required": [
            "episode_id"
          ]
        },
        "annotations": {
          "title": "Publish an episode",
          "readOnlyHint": false,
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": true
        }
      },
      {
        "name": "manage_webhook",
        "description": "List, create or delete webhook endpoints, so an agent is told when work finishes instead of polling for it. The signing secret is shown once, on create.",
        "inputSchema": {
          "type": "object",
          "properties": {
            "action": {
              "type": "string",
              "enum": [
                "list",
                "create",
                "delete"
              ],
              "description": "What to do"
            },
            "url": {
              "type": "string",
              "description": "For create: the HTTPS URL to deliver events to"
            },
            "events": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "For create: which events. Omit for all of them"
            },
            "id": {
              "type": "string",
              "description": "For delete: the endpoint id from list"
            }
          },
          "required": [
            "action"
          ]
        },
        "annotations": {
          "title": "Manage webhooks",
          "readOnlyHint": false,
          "destructiveHint": true,
          "idempotentHint": false,
          "openWorldHint": true
        }
      }
    ]
  }
}