podcasts

An MCP server that provides tools to discover and retrieve podcast episodes transcripts.

使うべきか

品質と安全性

A
説明の品質
96%
スキーマの完全性
92%
命名の品質
96%
ポイズニングのリスク
100%
権限の一致
100%
プロトコルへの準拠
100%

ツール定義とプロトコルへの準拠に関する自動分析に基づいています。

コンテキストコスト

~3,202トークン数(ツール定義)
~7.8 KB一般的なレスポンスサイズ
注意への影響は大きい(128k コンテキストの 2.50%)

これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。

インストール

ワンクリックインストール

これを `claude_desktop_config.json` ファイルに追加してください:

{
  "mcpServers": {
    "podcasts": {
      "url": "https://podcasts.petabloom.com/mcp"
    }
  }
}

リモートエンドポイント

https://podcasts.petabloom.com/mcpstreamable-http

できること

ツール一覧

ツール(5)

🟢 読み取り専用🟡 書き込み🔴 削除⚪ 不明
🟢search_episodes(query, podcast_name, published_within_hours, published_after, published_before, ...)

Search indexed podcast episodes by keyword or show name and return the show/episode GUIDs needed for transcript retrieval.

入力スキーマ

{
  "type": "object",
  "properties": {
    "query": {
      "default": "",
      "description": "Optional search keywords matched against indexed episode content. Use people, topics, companies, or phrases.",
      "type": "string"
    },
    "podcast_name": {
      "default": "",
      "description": "Optional podcast title or internal label to narrow results to a specific show.",
      "type": "string"
    },
    "published_within_hours": {
      "anyOf": [
        {
          "maximum": 168,
          "minimum": 1,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Filter episodes published in the past X hours. Maximum 168 hours (1 week)."
    },
    "published_after": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Inclusive lower publication-date bound. Accepts YYYY-MM-DD or ISO 8601 datetime."
    },
    "published_before": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Inclusive upper publication-date bound. Accepts YYYY-MM-DD or ISO 8601 datetime."
    },
    "sort": {
      "default": "relevance",
      "description": "Sort order for results. `relevance` ranks full-text searches first and falls back to newest-first when no query is provided.",
      "enum": [
        "relevance",
        "published_desc",
        "published_asc"
      ],
      "type": "string"
    },
    "limit": {
      "default": 5,
      "description": "Maximum number of episodes to return. Must be between 1 and 50.",
      "maximum": 50,
      "minimum": 1,
      "type": "integer"
    },
    "cursor": {
      "default": 0,
      "description": "Zero-based episode offset for pagination. Use the `next_cursor` returned by a prior search/listing call to fetch the next page of results.",
      "minimum": 0,
      "type": "integer"
    }
  },
  "additionalProperties": false
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "episodes": {
      "description": "Matching transcript-ready episodes.",
      "items": {
        "properties": {
          "show_guid": {
            "description": "Podcast show GUID.",
            "type": "string"
          },
          "show_title": {
            "description": "Podcast show title.",
            "type": "string"
          },
          "episode_guid": {
            "description": "Podcast episode GUID.",
            "type": "string"
          },
          "episode_title": {
            "description": "Podcast episode title.",
            "type": "string"
          },
          "published_date": {
            "description": "Episode publication timestamp in ISO 8601 format.",
            "type": "string"
          },
          "rss_feed_url": {
            "description": "RSS feed URL for the podcast show.",
            "type": "string"
          },
          "duration_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Episode duration in seconds when available from the source feed."
          },
          "description": {
            "description": "Episode description, truncated for search result display.",
            "type": "string"
          }
        },
        "required": [
          "show_guid",
          "show_title",
          "episode_guid",
          "episode_title",
          "published_date",
          "rss_feed_url",
          "description"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "count": {
      "description": "Number of episodes returned on this page.",
      "type": "integer"
    },
    "total_count": {
      "description": "Total number of matching transcript-ready episodes across all pages.",
      "type": "integer"
    },
    "total_count_is_approximate": {
      "default": false,
      "description": "When true, `total_count` is a lower bound — more matches may exist than were counted. False for exact lexical/date counts; can be true only for semantic results (e.g. the topic-search fallback).",
      "type": "boolean"
    },
    "next_cursor": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Cursor to pass to the next search call to retrieve the next page of results, or null if there are no more pages."
    }
  },
  "required": [
    "episodes",
    "count",
    "total_count"
  ]
}
🟢get_latest_episodes(limit, published_after, published_before, sort, cursor)

Return the most recent transcript-ready episodes across the full podcast catalog.

入力スキーマ

{
  "type": "object",
  "properties": {
    "limit": {
      "default": 5,
      "description": "Maximum number of episodes to return. Must be between 1 and 50.",
      "maximum": 50,
      "minimum": 1,
      "type": "integer"
    },
    "published_after": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Inclusive lower publication-date bound. Accepts YYYY-MM-DD or ISO 8601 datetime."
    },
    "published_before": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Inclusive upper publication-date bound. Accepts YYYY-MM-DD or ISO 8601 datetime."
    },
    "sort": {
      "default": "published_desc",
      "description": "Sort order for results. `relevance` ranks full-text searches first and falls back to newest-first when no query is provided.",
      "enum": [
        "relevance",
        "published_desc",
        "published_asc"
      ],
      "type": "string"
    },
    "cursor": {
      "default": 0,
      "description": "Zero-based episode offset for pagination. Use the `next_cursor` returned by a prior search/listing call to fetch the next page of results.",
      "minimum": 0,
      "type": "integer"
    }
  },
  "additionalProperties": false
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "episodes": {
      "description": "Matching transcript-ready episodes.",
      "items": {
        "properties": {
          "show_guid": {
            "description": "Podcast show GUID.",
            "type": "string"
          },
          "show_title": {
            "description": "Podcast show title.",
            "type": "string"
          },
          "episode_guid": {
            "description": "Podcast episode GUID.",
            "type": "string"
          },
          "episode_title": {
            "description": "Podcast episode title.",
            "type": "string"
          },
          "published_date": {
            "description": "Episode publication timestamp in ISO 8601 format.",
            "type": "string"
          },
          "rss_feed_url": {
            "description": "RSS feed URL for the podcast show.",
            "type": "string"
          },
          "duration_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Episode duration in seconds when available from the source feed."
          },
          "description": {
            "description": "Episode description, truncated for search result display.",
            "type": "string"
          }
        },
        "required": [
          "show_guid",
          "show_title",
          "episode_guid",
          "episode_title",
          "published_date",
          "rss_feed_url",
          "description"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "count": {
      "description": "Number of episodes returned on this page.",
      "type": "integer"
    },
    "total_count": {
      "description": "Total number of matching transcript-ready episodes across all pages.",
      "type": "integer"
    },
    "total_count_is_approximate": {
      "default": false,
      "description": "When true, `total_count` is a lower bound — more matches may exist than were counted. False for exact lexical/date counts; can be true only for semantic results (e.g. the topic-search fallback).",
      "type": "boolean"
    },
    "next_cursor": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Cursor to pass to the next search call to retrieve the next page of results, or null if there are no more pages."
    }
  },
  "required": [
    "episodes",
    "count",
    "total_count"
  ]
}
🟢search_episodes_by_topic(topic, show_guid, published_after, published_before, limit, ...)

Semantic topic search across the podcast catalog. Unlike `search_episodes` (which does lexical/keyword matching), this tool understands meaning: a query for 'AI safety' will match episodes about 'AI alignment', 'AGI risk', or 'frontier model evaluation' even if they don't contain the exact phrase. Returns ranked episodes with the matched topic phrases so you can explain *why* each result is relevant before fetching the transcript. Best for conceptual or thematic queries — use `search_episodes` instead when the user is looking for a specific person, product, or verbatim phrase.

入力スキーマ

{
  "type": "object",
  "properties": {
    "topic": {
      "description": "Semantic topic to find episodes about. Free-form phrasing welcome — the server embeds this string and finds episodes whose extracted topic phrases are closest in meaning. Good examples: 'AI safety', 'EU AI Act regulation', 'GPU supply constraints', 'Theo Epstein on roster construction'. Distinct from `search_episodes`, which performs lexical keyword matching.",
      "maxLength": 300,
      "minLength": 1,
      "type": "string"
    },
    "show_guid": {
      "default": "",
      "description": "Optional canonical show GUID (as returned by `search_episodes` or `get_latest_episodes` in the `show_guid` field) to restrict topic search to a single podcast. Leave empty to search across all shows.",
      "type": "string"
    },
    "published_after": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Inclusive lower publication-date bound. Accepts YYYY-MM-DD or ISO 8601 datetime."
    },
    "published_before": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Inclusive upper publication-date bound. Accepts YYYY-MM-DD or ISO 8601 datetime."
    },
    "limit": {
      "default": 5,
      "description": "Maximum number of episodes to return. Must be between 1 and 50.",
      "maximum": 50,
      "minimum": 1,
      "type": "integer"
    },
    "cursor": {
      "default": 0,
      "description": "Zero-based episode offset for pagination. Use the `next_cursor` returned by a prior search/listing call to fetch the next page of results.",
      "minimum": 0,
      "type": "integer"
    }
  },
  "required": [
    "topic"
  ],
  "additionalProperties": false
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "episodes": {
      "description": "Episodes ranked by best topic-phrase similarity to the query.",
      "items": {
        "properties": {
          "show_guid": {
            "description": "Podcast show GUID.",
            "type": "string"
          },
          "show_title": {
            "description": "Podcast show title.",
            "type": "string"
          },
          "episode_guid": {
            "description": "Podcast episode GUID.",
            "type": "string"
          },
          "episode_title": {
            "description": "Podcast episode title.",
            "type": "string"
          },
          "published_date": {
            "description": "Episode publication timestamp in ISO 8601 format.",
            "type": "string"
          },
          "rss_feed_url": {
            "description": "RSS feed URL for the podcast show.",
            "type": "string"
          },
          "duration_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Episode duration in seconds when available from the source feed."
          },
          "description": {
            "description": "Episode description, truncated for search result display.",
            "type": "string"
          },
          "matched_topics": {
            "description": "Topic phrases from this episode that matched the query, ordered by similarity (best first). Use these to summarize *why* the episode is relevant before fetching the full transcript.",
            "items": {
              "properties": {
                "phrase": {
                  "description": "The extracted topic phrase that matched. Useful for explaining to the user why this episode came back for their query.",
                  "type": "string"
                },
                "similarity": {
                  "description": "Cosine similarity between the query and this topic phrase, in [0.0, 1.0]. Higher is more semantically similar.",
                  "type": "number"
                }
              },
              "required": [
                "phrase",
                "similarity"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "best_similarity": {
            "description": "Similarity of the strongest topic match — the value the episodes were sorted by.",
            "type": "number"
          }
        },
        "required": [
          "show_guid",
          "show_title",
          "episode_guid",
          "episode_title",
          "published_date",
          "rss_feed_url",
          "description",
          "matched_topics",
          "best_similarity"
        ],
        "type": "object"
      },
      "type": "array"
    },
    "count": {
      "description": "Number of episodes returned on this page.",
      "type": "integer"
    },
    "query": {
      "description": "The topic query that was embedded and searched.",
      "type": "string"
    },
    "total_count": {
      "description": "Number of matching episodes, counted over the nearest-match candidate window rather than the whole catalog. When `total_count_is_approximate` is true, treat this as a lower bound — broad queries may have more matches than reported.",
      "type": "integer"
    },
    "total_count_is_approximate": {
      "default": false,
      "description": "True when the candidate window was exhausted, so `total_count` undercounts the true number of matches. When false, `total_count` is exact. Refine the query for tighter results if this is true and you need a complete set.",
      "type": "boolean"
    },
    "next_cursor": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Cursor to pass to the next search call to retrieve the next page of results, or null if there are no more pages."
    }
  },
  "required": [
    "episodes",
    "count",
    "query",
    "total_count"
  ]
}
🟢get_transcript(show_guid, episode_guid, cursor, max_chars)

Fetch a bounded transcript chunk for a specific episode using its show and episode GUIDs. Use `next_cursor` to continue reading.

入力スキーマ

{
  "type": "object",
  "properties": {
    "show_guid": {
      "description": "Podcast show GUID returned by `search_episodes` or `get_latest_episodes`.",
      "minLength": 1,
      "type": "string"
    },
    "episode_guid": {
      "description": "Episode GUID returned by `search_episodes` or `get_latest_episodes`.",
      "minLength": 1,
      "type": "string"
    },
    "cursor": {
      "default": 0,
      "description": "Zero-based character offset into the transcript. Use the `next_cursor` returned by a prior get_transcript call to fetch the next chunk.",
      "minimum": 0,
      "type": "integer"
    },
    "max_chars": {
      "default": 12000,
      "description": "Target maximum number of transcript characters to return. Chunks prefer natural boundaries and may be slightly shorter. Must be between 100 and 20000.",
      "maximum": 20000,
      "minimum": 100,
      "type": "integer"
    }
  },
  "required": [
    "show_guid",
    "episode_guid"
  ],
  "additionalProperties": false
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "show_guid": {
      "description": "Podcast show GUID requested by the client.",
      "type": "string"
    },
    "show_title": {
      "description": "Podcast show title.",
      "type": "string"
    },
    "episode_guid": {
      "description": "Podcast episode GUID requested by the client.",
      "type": "string"
    },
    "episode_title": {
      "description": "Podcast episode title.",
      "type": "string"
    },
    "published_date": {
      "description": "Episode publication timestamp in ISO 8601 format.",
      "type": "string"
    },
    "rss_feed_url": {
      "description": "RSS feed URL for the podcast show.",
      "type": "string"
    },
    "duration_seconds": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Episode duration in seconds when available from the source feed."
    },
    "text": {
      "description": "Transcript chunk text.",
      "type": "string"
    },
    "total_chars": {
      "description": "Total character count of the complete transcript text.",
      "type": "integer"
    },
    "char_start": {
      "description": "Inclusive zero-based start offset of this chunk in the complete transcript.",
      "type": "integer"
    },
    "char_end": {
      "description": "Exclusive zero-based end offset of this chunk in the complete transcript.",
      "type": "integer"
    },
    "has_more": {
      "description": "Whether another get_transcript call is needed to continue reading.",
      "type": "boolean"
    },
    "next_cursor": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Cursor to pass to the next get_transcript call, or null at the end."
    }
  },
  "required": [
    "show_guid",
    "show_title",
    "episode_guid",
    "episode_title",
    "published_date",
    "rss_feed_url",
    "text",
    "total_chars",
    "char_start",
    "char_end",
    "has_more"
  ]
}
🟡give_feedback(feedback)

Send structured feedback about bugs, missing data, unclear behavior, or feature requests.

入力スキーマ

{
  "type": "object",
  "properties": {
    "feedback": {
      "description": "Feedback for the server team. Include the problem, missing capability, or suggested improvement without sensitive user data.",
      "minLength": 1,
      "type": "string"
    }
  },
  "required": [
    "feedback"
  ],
  "additionalProperties": false
}

出力スキーマ

{
  "type": "object",
  "properties": {
    "status": {
      "description": "Feedback persistence status.",
      "enum": [
        "saved",
        "logged"
      ],
      "type": "string"
    },
    "feedback_id": {
      "description": "Stable feedback identifier.",
      "type": "string"
    },
    "message": {
      "description": "Human-readable result summary.",
      "type": "string"
    }
  },
  "required": [
    "status",
    "feedback_id",
    "message"
  ]
}

コミュニティ

このサーバーを評価する

エビデンス

最近の観測

検証済みバージョンは記録されていませんツール 5 件
検証済みバージョンは記録されていませんツール 5 件