mcpField
T
Transistor MCP Server

Transistor MCP Server

本地服务
github.com/conorbronsdon媒体与设计110 周前更新

关于 Transistor MCP Server

Transistor MCP Server 为播客创作者和账户运营者提供连接 Transistor.fm API 的工具,可管理节目与单集、分析数据、文字稿、上传、Webhook 和订阅者。这个社区服务器已不再积极维护。

主要功能

  1. 01列出并搜索节目和单集
  2. 02创建、更新和发布单集
  3. 03上传音频并管理文字稿
  4. 04获取节目和单集分析数据
  5. 05管理节目 Webhook
  6. 06管理私人播客订阅者

适用场景

  1. 01准备并发布播客单集
  2. 02查看节目或单集表现
  3. 03上传文字稿和音频文件
  4. 04管理私人播客订阅者列表

MCP 相关

向 MCP 客户端提供 Transistor.fm 节目、单集、分析、文字稿、Webhook、上传及订阅者操作工具。这个社区服务器使用 API 密钥,README 说明其已不再积极维护。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"conorbronsdon-transistor": {
"command": "npx",
"args": [
"-y",
"transistor-mcp"
],
"env": {
"TRANSISTOR_API_KEY": "<TRANSISTOR_API_KEY>"
}
}
}
}
启动命令npx -y transistor-mcp
需要配置的环境变量
TRANSISTOR_API_KEY密钥Transistor.fm API key from https://dashboard.transistor.fm/account

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmtransistor-mcp0.4.0

工具

23

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

Transistor MCP 服务

用于 Transistor.fm API 的 MCP 服务。通过 AI Agent 管理播客、单集、分析数据、文字稿和 Webhook。

License: MIT Language: TypeScript MCP Podcast X


重要

Transistor 现已推出官方 MCP 服务:mcp.transistor.fm。 这是远程服务(无需安装),使用 OAuth 而非 API 密钥进行身份验证,并由 Transistor 团队维护,作为其即将推出的 API v2 的基础。对大多数人来说,它是更好的选择——建议从这里开始。

官方服务推出后,这个社区服务不再积极维护。它仍可正常使用;如果你特别需要本地、基于 API 密钥的服务(例如在使用 OAuth 浏览器流程不方便的无头或自动化环境中),它依然实用。欢迎提交修复 Bug 的 PR;功能请求则更适合提交给官方服务。

演示:get_episode 工具调用及响应

此 MCP 服务提供了与 Transistor.fm API 交互的工具,可用于管理播客和单集,以及查看分析数据。上方演示中显示的数据为示例数据,并非真实账户数据。

Fork 说明: 原始服务由 Guido X Jansen 开发(gxjansen/Transistor-MCP)。完整 API 对齐工作(涵盖所有文档所列参数、响应精简和搜索)、get_download_summary 和 compare_episodes 分析工具、ISO 日期处理以及文字稿支持均在此贡献,现已合并至上游。本仓库是打包并发布到 npm 的版本(transistor-mcp)。MIT 许可证和原始版权信息均保留在 LICENSE 中。

Transistor-MCP MCP server

关于

由 Conor Bronsdon 为 Chain of Thought 播客制作工作流开发。在官方服务推出之前,它用于创建单集、上传文字稿和获取分析数据。Conor 主持 Chain of Thought,这是一档探讨 AI 基础设施以及从业者如何实际构建相关系统的节目。更多面向创作者的工具请见 ai-tools-for-creators。可在 X 上通过 @ConorBronsdon 找到 Conor。

配套工具:

  • substack-mcp:阅读文章并管理 Substack 草稿
  • podcastindex-mcp:搜索 Podcast Index 并追踪嘉宾亮相情况
  • op3-mcp:查看 OP3 的下载量、听众地域分布和使用的应用
  • apple-podcasts-mcp:获取 Apple Podcasts Connect 中的播放量、关注者和单集收听数据
  • gsc-mcp:在 Google Search Console 中查询搜索表现、关键词和站点地图
  • podcast-benchmark:仅使用公开数据,将节目与同类节目进行对比

配置

更倾向于使用官方服务? 无需安装。通过以下方式将其添加到 Claude Code:

claude mcp add --transport http transistor https://mcp.transistor.fm

然后运行 /mcp 登录 Transistor。其他支持通过 OAuth 连接远程服务的 MCP 客户端,可以直接指向 https://mcp.transistor.fm。

若要改为运行此社区服务,请使用 Transistor API 密钥将其添加到 MCP 设置配置文件中:

{
  "mcpServers": {
    "transistor": {
      "command": "npx",
      "args": ["-y", "transistor-mcp"],
      "env": {
        "TRANSISTOR_API_KEY": "your-api-key-here"
      }
    }
  }
}

或者从本地克隆版本运行(先执行 npm install && npm run build):

{
  "mcpServers": {
    "transistor": {
      "command": "node",
      "args": ["path/to/Transistor-MCP/build/index.js"],
      "env": {
        "TRANSISTOR_API_KEY": "your-api-key-here"
      }
    }
  }
}

可用工具

get_authenticated_user

获取已验证用户账户的详细信息。

{
  // No parameters needed
}
authorize_upload

获取用于上传音频文件的预签名 URL。使用本工具后,再通过本地音频文件创建单集。

{
  "filename": string  // Required: Name of the audio file to upload
}

响应包括:

  • upload_url:用于上传文件的预签名 S3 URL
  • content_type:上传时使用的内容类型(例如,“audio/mpeg”)
  • expires_in:上传 URL 过期前的秒数
  • audio_url:创建单集时使用的最终 URL
list_shows

列出 Transistor.fm 账户中的所有节目,按更新时间排序(最新的排在前面)。返回分页列表,每页 10 项。

{
  "page": number,     // Optional, defaults to 0 (first page)
  "per": number,      // Optional, defaults to 10 items per page
  "private": boolean, // Optional: filter for private shows
  "query": string     // Optional: search query
}

注意:所有参数均为可选项。不带参数调用此端点将返回第一页节目。

list_episodes

列出指定节目的单集。

{
  "show_id": string,  // Required
  "page": number,     // Optional, defaults to 0
  "per": number,      // Optional, defaults to 10
  "query": string,    // Optional: search query
  "status": string,   // Optional: "published", "draft", or "scheduled"
  "order": string     // Optional: "desc" (newest first) or "asc" (oldest first), defaults to "desc"
}
get_episode

获取指定单集的详细信息。

{
  "episode_id": string,           // Required
  "include": string[],           // Optional: array of related resources to include
  "fields": {                    // Optional: sparse fieldsets
    "episode": string[],         // Fields to include for episode
    "show": string[]            // Fields to include for show
  }
}
get_analytics

获取某个节目或指定单集的分析数据。如果未提供日期,默认查询最近 14 天的数据。

{
  "show_id": string,            // Required
  "episode_id": string,         // Optional: include for episode-specific analytics
  "start_date": string,         // Optional: format "dd-mm-yyyy", required if end_date is provided
  "end_date": string           // Optional: format "dd-mm-yyyy", required if start_date is provided
}
create_episode

创建新单集。

{
  "show_id": string,               // Required
  "title": string,                 // Required
  "audio_url": string,             // Required
  "summary": string,               // Optional
  "description": string,           // Optional: may contain HTML
  "transcript_text": string,       // Optional: full episode transcript
  "author": string,               // Optional
  "explicit": boolean,            // Optional
  "image_url": string,            // Optional: episode artwork
  "keywords": string,             // Optional: comma-separated list
  "number": number,               // Optional: episode number
  "season_number": number,        // Optional
  "type": string,                // Optional: "full", "trailer", or "bonus"
  "alternate_url": string,       // Optional: override share_url
  "video_url": string,           // Optional: YouTube URL
  "email_notifications": boolean, // Optional: override show setting
  "increment_number": boolean     // Optional: auto-set next episode number
}
update_episode

更新已有单集。

{
  "episode_id": string,           // Required
  "title": string,               // Optional
  "summary": string,             // Optional
  "description": string,         // Optional: may contain HTML
  "transcript_text": string,     // Optional: full episode transcript
  "author": string,             // Optional
  "explicit": boolean,          // Optional
  "image_url": string,          // Optional: episode artwork
  "keywords": string,           // Optional: comma-separated list
  "number": number,             // Optional: episode number
  "season_number": number,      // Optional
  "type": string,              // Optional: "full", "trailer", or "bonus"
  "alternate_url": string,     // Optional: override share_url
  "video_url": string,         // Optional: YouTube URL
  "email_notifications": boolean // Optional: override show setting
}
get_all_episode_analytics

获取某个节目所有单集的分析数据。如果未提供日期,默认查询最近 7 天的数据。

{
  "show_id": string,            // Required
  "start_date": string,         // Optional: format "dd-mm-yyyy", required if end_date is provided
  "end_date": string           // Optional: format "dd-mm-yyyy", required if start_date is provided
}
list_webhooks

列出某个节目的所有 Webhook。

{
  "show_id": string            // Required
}
subscribe_webhook

订阅某个节目的 Webhook。

{
  "event_name": string,        // Required: e.g., "episode_created"
  "show_id": string,          // Required
  "url": string              // Required: URL to receive webhook events
}
unsubscribe_webhook

取消订阅 Webhook。

{
  "webhook_id": string        // Required
}
Typed errors

针对 Transistor.fm API 的工具调用失败时,会通过 isError: true 返回针对具体状态、便于理解的消息,而非通用的 Axios 错误。在内部,TransistorApiClient 会在单个响应拦截器中,将所有 HTTP 失败情况——身份验证(401/403)、速率限制(429)、验证错误(400)、未找到(404)和服务器错误(5xx)——映射为特定类型的错误类(参见 src/errors.ts)。因此,你看到的消息始终会说明失败类型;对于身份验证错误,还会指出 TRANSISTOR_API_KEY 环境变量。

重要说明

  • API 请求的速率限制为每 10 秒 10 次(如 (https://developers.transistor.fm/#:~:text=API%20requests%20are%20rate%2Dlimited,to%20use%20the%20API%20again.)[Transistor API reference] 中所述)
  • 日期必须采用“dd-mm-yyyy”格式
  • 页码从 0 开始
  • 所有端点均支持:
    • 稀疏字段集:使用 fields[resource_type][] 指定要返回的字段
    • 包含关联资源:使用 include[] 在单个请求中获取关联资源
  • include 数组采用 ["resource_name"] 格式
  • fields 对象用于指定每种资源类型要返回的字段
  • 所有工具均以 JSONAPI 格式返回数据,并包含正确的关联关系和元数据

使用示例

列出节目:

// List first page of shows (default behavior)
const result = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "list_shows",
  arguments: {}
});

// List shows with pagination and filtering
const resultWithParams = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "list_shows",
  arguments: {
    page: 1,
    per: 20,
    private: true,
    query: "podcast"
  }
});

获取单集详情:

const result = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "get_episode",
  arguments: {
    episode_id: "123456",
    include: ["show"],
    fields: {
      episode: ["title", "summary", "description"],
      show: ["title"]
    }
  }
});

获取节目分析数据:

// Get analytics for the last 14 days (default behavior)
const result = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "get_analytics",
  arguments: {
    show_id: "123456"
  }
});

// Get analytics for a specific date range
const resultWithDates = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "get_analytics",
  arguments: {
    show_id: "123456",
    start_date: "01-01-2024",
    end_date: "31-01-2024"
  }
});

// Get analytics for a specific episode
const episodeAnalytics = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "get_analytics",
  arguments: {
    show_id: "123456",
    episode_id: "789012",
    start_date: "01-01-2024",
    end_date: "31-01-2024"
  }
});

更新单集:

const result = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "update_episode",
  arguments: {
    episode_id: "123456",
    title: "Updated Episode Title",
    summary: "New episode summary",
    description: "New detailed description",
    season_number: 2,
    episode_number: 5
  }
});

获取所有单集的分析数据:

// Get analytics for all episodes for the last 7 days (default behavior)
const result = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "get_all_episode_analytics",
  arguments: {
    show_id: "123456"
  }
});

// Get analytics for all episodes for a specific date range
const resultWithDates = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "get_all_episode_analytics",
  arguments: {
    show_id: "123456",
    start_date: "01-01-2024",
    end_date: "31-01-2024"
  }
});

管理 Webhook:

// List webhooks
const webhooks = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "list_webhooks",
  arguments: {
    show_id: "123456"
  }
});

// Subscribe to webhook
const subscription = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "subscribe_webhook",
  arguments: {
    event_name: "episode_created",
    show_id: "123456",
    url: "https://your-webhook-endpoint.com/hook"
  }
});

// Unsubscribe from webhook
const unsubscribe = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "unsubscribe_webhook",
  arguments: {
    webhook_id: "webhook123"
  }
});

获取已验证用户:

const result = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "get_authenticated_user",
  arguments: {}
});

授权上传音频文件:

// First, get a pre-signed upload URL
const auth = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "authorize_upload",
  arguments: {
    filename: "my-episode.mp3"
  }
});

// Then use the returned upload_url to upload your file via PUT request
// Finally, use the returned audio_url when creating your episode:
const episode = await use_mcp_tool({
  server_name: "transistor",
  tool_name: "create_episode",
  arguments: {
    show_id: "123456",
    title: "My New Episode",
    audio_url: auth.data.attributes.audio_url
  }
});
publish_episode

发布、安排发布或取消发布单集。

{
  "episode_id": string,          // Required
  "status": string,              // Required: "published", "scheduled", or "draft"
  "published_at": string         // Optional: date/time in the podcast's time zone (required for "scheduled")
}
get_show

获取单个节目的详细信息。

{
  "show_id": string              // Required
}
update_show

更新节目的元数据。

{
  "show_id": string,             // Required
  "author": string,              // Optional
  "category": string,            // Optional: primary podcast category
  "copyright": string,           // Optional
  "description": string,         // Optional
  "explicit": boolean,           // Optional
  "image_url": string,           // Optional: show artwork URL
  "keywords": string,            // Optional: comma-separated
  "language": string,            // Optional: e.g. "en"
  "owner_email": string,         // Optional
  "secondary_category": string,  // Optional
  "show_type": string,           // Optional: "episodic" or "serial"
  "title": string,               // Optional
  "time_zone": string,           // Optional
  "website": string              // Optional
}
list_subscribers

列出私人播客的订阅者。

{
  "show_id": string,             // Required
  "page": number,                // Optional
  "per": number,                 // Optional
  "query": string                // Optional: search filter
}
get_subscriber

获取单个订阅者的详细信息。

{
  "subscriber_id": string        // Required
}
create_subscriber

向私人播客添加订阅者。

{
  "show_id": string,             // Required
  "email": string,               // Required
  "skip_welcome_email": boolean  // Optional (default false)
}
create_subscribers_batch

一次添加多个订阅者。

{
  "show_id": string,             // Required
  "emails": string[],            // Required: array of email addresses
  "skip_welcome_email": boolean  // Optional (default false)
}
update_subscriber

更新订阅者的电子邮件地址。

{
  "subscriber_id": string,       // Required
  "email": string                // Required: new email address
}
delete_subscriber

按 ID 或节目 + 电子邮件删除订阅者。

{
  "subscriber_id": string,       // Optional: delete by subscriber ID
  "show_id": string,             // Optional: use with email instead of subscriber_id
  "email": string                // Optional: use with show_id instead of subscriber_id
}

参与贡献

由于官方 Transistor MCP现已推出,此服务目前处于维护模式。仍欢迎提交错误报告和修复错误的 PR:请创建 issue,并注明工具名称以及你尝试发出的请求;或者 fork 此仓库,运行 npm install && npm run build,然后提交 PR,说明变更内容及原因。新功能请求最好提交给官方服务,Transistor 正在积极开发该服务。


免责声明

本账号表达的所有观点、意见和声明仅代表我个人,并以个人身份发布。这些内容不代表 Modular 的观点、立场或政策,也不应被解读为代表 Modular。本账号与 Modular 没有任何关联,也未获得 Modular 的授权或认可。

许可证

MIT。本项目 fork 自 gxjansen/Transistor-MCP;LICENSE 中保留了 Guido X Jansen 的原始版权声明。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。