Skip to main content
Glama

media-mcp

CI npm License: MIT

社交媒体尽在指尖。覆盖 Twitter/X、YouTube、Instagram 和视频处理的 31 个工具——从 Claude Desktop、Claude Code 或任何 MCP 客户端使用。100% 开源。

给它一条推文,就能得到完整文本、指标和视频转录。给它一个 YouTube 链接,就能得到转录文本。丢给它一个 Instagram 短视频,就能下载媒体并转录音频。所有转录都在本地通过 Whisper 运行——音频不会离开你的机器。

核心理念:耳朵始终在线,眼睛只在耳朵失效时启用

小型 Whisper 模型擅长听,却不擅长读。它们会听错不常见的名字。它们无法转录屏幕上的文字。它们会跳过烧录的字幕。对于视频相关问题的 90%,这无关紧要——大意就够了。

但当用户问 "这个短视频里的安装命令是什么?""他展示的账号是什么?" 时,仅靠转录会自信地给出错误答案。链接在屏幕上。专有名词在字幕中拼写出来。Whisper 从未看到这些。

media-mcp 通过 whisper-cli -ojf 以逐 token 置信度进行转录,并标记不确定区域(Whisper 承认自己在猜测的地方)和指示性短语"visit our""this command""in the bio"——强烈暗示正在引用屏幕内容的信号)。LLM 读取这些标记,并决定是否在需要视觉验证的特定时间戳上调用 get_video_frames_at。帧只在需要时才输出。LLM 自己的视觉负责阅读——无需 OCR,无需第二个模型。

结果:智能体对每个视频都有耳朵,眼睛只在耳朵失效时启用。最少帧数,最大准确度。

Related MCP server: youtube-mcp

功能

  • 获取 Twitter/X 的推文、线程、个人资料、关注者、趋势和搜索结果(通过 TwitterAPI.io REST API 提供 26 个工具,可选 Xquik 支持重叠的读取工具)

  • 转录 使用 whisper-cli 在本地转录视频音频——下载媒体、用 ffmpeg 提取音频、在你的硬件上运行 Whisper,输出逐 token 置信度指示性短语命中,让 LLM 知道音频通道在哪些地方不可靠

  • 下载 Instagram 帖子、短视频和轮播图到本地文件夹,通过自托管的 Cobalt 实例

  • 提取 任何视频 URL 的帧,可配置 FPS——或通过 get_video_frames_at 精确提取到一组时间戳(缓存感知,后续调用不重新下载)

  • 监控 实时监控 Twitter 用户,并按关键词规则过滤推文

  • 缓存 将下载的视频缓存在 ~/.media-mcp/cache/videos/(以 URL 的 sha256 为键,24 小时 TTL),因此同一视频的转录 + 帧查找只需一次下载

工作原理

LLM 从不抓取 HTML 或解析 DOM。每个工具都调用一个专用 API,并返回结构化、LLM 就绪的文本。

对于文本数据(推文、个人资料、趋势):默认通过一次对 TwitterAPI.io 的 REST 调用,解析为格式化输出。设置 TWITTER_BACKEND=xquik 并配合 XQUIK_API_KEY,可将重叠的读取工具改用 Xquik。

对于转录(推文视频、YouTube、Instagram 短视频):流水线将媒体下载到共享缓存,用 ffmpeg 提取音频(16kHz 单声道 WAV),用 whisper-cli 配合 -ojf(output-json-full)转录以保留逐 token 概率,然后返回 LLM 可读的转录文本,其中包含内联的 ⟨token p=0.XX⟩ 标记,以及不确定区域和指示性短语的摘要块。对于 YouTube,优先尝试字幕(即时)——Whisper 只是后备方案。

对于视觉数据(Instagram 图片、视频帧):媒体被下载到本地文件夹,并返回绝对文件路径,以便 LLM 直接用视觉读取。帧提取有两种模式:批量(extract_video_frames,可配置 FPS)和精确(get_video_frames_at——每个时间戳一张 JPG,用于对转录不确定的时刻进行定向验证)。

流水线

URL ──► Detect platform
             │
             ├── Twitter ──► TwitterAPI.io or Xquik REST ──► structured text
             │                     │
             │               has video? ──► cache ──► ffmpeg ──► whisper-cli -ojf
             │                                                         │
             │                                       transcript + confidence markers
             │
             ├── YouTube ──► try captions (instant)
             │                     │
             │               no captions? ──► yt-dlp ──► ffmpeg ──► whisper-cli -ojf
             │
             ├── Instagram ──► Cobalt API ──► download to cache
             │                     │
             │               has video? ──► ffmpeg ──► whisper-cli -ojf
             │
             ├── Video URL ──► cache ──► ffmpeg -vf fps=N ──► frame JPGs
             │
             └── Video URL + timestamps[] ──► cache ──► ffmpeg -ss each ──► one JPG per timestamp
                 (for targeted verification when transcription uncertainty demands it)

转录始终包含逐 token 置信度和指示性短语扫描。当这些信号表明需要时,LLM 会路由到帧提取。

所有转录都在本地进行。所有临时文件都会被清理。下载的视频存放在共享缓存(~/.media-mcp/cache/videos/)中 24 小时,因此对同一 URL 的后续调用不会重新下载。LLM 获得的是结构化文本或文件路径——绝不是原始 API JSON。

设计原则

  1. 结构化数据,而非抓取。 每个工具都调用专用 API。没有 HTML 解析,没有脆弱的选择器,没有浏览器自动化。

  2. 仅本地转录。 音频永远不会离开机器。Whisper 在本地硬件上运行。

  3. 字幕优先,Whisper 其次。 平台已经完成的工作,不要浪费算力。

  4. 一个工具,一个职责。 没有带模式标志的多用途工具。每个工具只做一件事。

  5. 视觉内容用文件路径。 返回绝对路径,让 LLM 能直接看到图片。

  6. 耳朵始终在线,眼睛只在耳朵失效时启用。 转录便宜;视觉 token 昂贵。LLM 只在 Whisper 承认不确定的时间戳,或说话者明确引用屏幕内容时,才看到帧。不是每秒 1 帧。不是关键帧。只在准确度真正需要的地方。

  7. 无 OCR 层。 Claude 的视觉直接读取帧。一个模型完成所有多模态推理,胜过 OCR 与视觉相互竞争的"两模型接缝"。

完整的流水线细节、工具参考和反模式,请参阅 SKILL.md

快速开始

npx(最快)

TWITTER_API_KEY=your_key npx media-mcp

或者用一条命令将其注册到 Claude Code:

claude mcp add media-mcp -e TWITTER_API_KEY=your_key -- npx media-mcp

Whisper base 模型会在首次转录时自动下载到 ~/.media-mcp/models/。ffmpeg、whisper-cli 和 yt-dlp 仍需安装(见前置要求)。

Docker

docker run -i --rm \
  -e TWITTER_API_KEY=your_key \
  -v media-mcp-data:/data \
  ghcr.io/woosal1337/media-mcp

该镜像捆绑了 ffmpeg、yt-dlp 和 whisper-cli。模型和视频缓存持久化在 /data 卷中。

从源码

git clone https://github.com/woosal1337/media-mcp.git
cd media-mcp
npm install && npm run build

下载 Whisper 模型(可选——跳过的模型会按需获取):

mkdir -p models
curl -L -o models/ggml-base.bin \
  https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.bin

创建 .env

cp .env.example .env
# Edit with your keys:
# TWITTER_API_KEY=your_twitterapi_io_key
# Optional Xquik backend for overlapping read tools:
# TWITTER_BACKEND=xquik
# XQUIK_API_KEY=your_xquik_key
# XQUIK_BASE_URL=https://xquik.com/api/v1
# WHISPER_MODEL_PATH=/absolute/path/to/models/ggml-base.bin
# COBALT_API_URL=http://localhost:9000       (optional, for Instagram)
# COBALT_API_KEY=your_cobalt_key             (optional)
# CLOUDFLARE_ACCOUNT_ID=your_account_id     (optional, for fetch_markdown)
# CLOUDFLARE_API_TOKEN=your_api_token       (optional, for fetch_markdown)

前置要求

依赖项

是否必需

用途

安装方式

Node.js 20+

运行 MCP 服务器

brew install node

ffmpeg

音频提取 + 帧提取

brew install ffmpeg

whisper-cli

本地音频转录

brew install whisper-cpp

yt-dlp

从 YouTube 及其他平台下载视频

brew install yt-dlp

TwitterAPI.io 密钥

是,除非对只读工具使用 Xquik

为所有 Twitter/X 工具提供支持

twitterapi.io

Xquik 密钥

可选

为重叠的只读 Twitter/X 工具提供支持

xquik.com

Cobalt 实例

可选

Instagram 下载

参见 Cobalt 设置

配置

Claude Code

添加到 ~/.claude/settings.json

{
  "mcpServers": {
    "media-mcp": {
      "command": "node",
      "args": ["/absolute/path/to/media-mcp/dist/index.js"],
      "env": {
        "TWITTER_API_KEY": "your_key",
        "TWITTER_BACKEND": "twitterapi",
        "WHISPER_MODEL_PATH": "/absolute/path/to/media-mcp/models/ggml-base.bin",
        "COBALT_API_URL": "http://localhost:9000",
        "COBALT_API_KEY": "your_cobalt_key",
        "CLOUDFLARE_ACCOUNT_ID": "your_account_id",
        "CLOUDFLARE_API_TOKEN": "your_api_token"
      }
    }
  }
}

Claude Desktop

添加到 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows)——结构与上面相同。

环境变量

变量

是否必需

描述

TWITTER_API_KEY

是,除非 TWITTER_BACKEND=xquik

来自 twitterapi.io 的 API 密钥

TWITTER_BACKEND

默认为 twitterapi。对重叠的读取工具使用 xquik。当只设置了 XQUIK_API_KEY 时,服务器会自动选择 xquik

XQUIK_API_KEY

TWITTER_BACKEND=xquik 时必需

来自 Xquik 的 API 密钥

XQUIK_BASE_URL

Xquik API 基础 URL,默认为 https://xquik.com/api/v1

WHISPER_MODEL_PATH

Whisper 模型的路径。未设置且本地无模型时,base 模型会在首次使用时自动下载

MEDIA_MCP_MODEL_DIR

自动下载的 Whisper 模型存放位置(默认为 ~/.media-mcp/models

MEDIA_MCP_CACHE_DIR

24 小时视频缓存的存放位置(默认为 ~/.media-mcp/cache

COBALT_API_URL

你的 Cobalt 实例的 URL(Instagram 必需)

COBALT_API_KEY

如果启用了认证,则为 Cobalt API 密钥

CLOUDFLARE_ACCOUNT_ID

Cloudflare 账户 ID(fetch_markdown 必需)

CLOUDFLARE_API_TOKEN

具有 Browser Rendering 权限的 Cloudflare API 令牌(fetch_markdown 必需)

工具

Twitter/X — 26 个工具

TwitterAPI.io 是所有 Twitter/X 工具的默认后端。设置 TWITTER_BACKEND=xquik 并配合 XQUIK_API_KEY,可将重叠的读取工具改用 Xquik。两个后端返回相同的工具输出,因此其他一切都不变。

后端覆盖范围

工具

任一后端

get_tweetget_user_profileget_user_aboutget_user_tweetsget_user_followersget_user_followingget_verified_followersget_user_mentionsget_tweet_repliesget_tweet_quotesget_tweet_retweeterssearch_tweetssearch_userscheck_follow_relationshipget_trends

仅 TwitterAPI.io

get_tweet_replies_v2get_list_timelineget_community_tweetsget_space_detailget_bookmarks、3 个监控工具、3 个过滤规则工具

仅 TwitterAPI.io 的工具在运行 TWITTER_BACKEND=xquik 且未设置 TWITTER_API_KEY 时会抛出明确错误。设置两个密钥即可使用所有工具,同时仍可通过 Xquik 读取。

获取推文

工具

操作

功能

get_tweet

获取 + 转写

通过 URL 获取推文,包含文本、作者、指标、媒体、线程、文章。通过 Whisper 转写视频音频(可选 languagemodel 参数)。

get_user_tweets

获取

用户的近期推文(分页,每页 20 条)

search_tweets

搜索

支持操作符的高级搜索(from:to:#hashtagmin_faves:、日期范围)

get_tweet_replies

获取

推文的回复(分页,每页 20 条)

get_tweet_replies_v2

获取 + 排序

带排序的回复:相关性、最新或点赞数

get_tweet_quotes

获取

推文的引用推文(分页,每页 20 条)

get_tweet_retweeters

获取

转发了推文的用户(分页,每页 100 条)

get_list_timeline

获取

来自 Twitter 列表的推文

get_community_tweets

获取

来自 Twitter 社区的推文

get_trends

获取

热门话题(全球或按 WOEID 位置)

获取个人资料

工具

操作

功能

get_user_profile

获取

用户简介、粉丝数、认证状态、位置、网站

get_user_about

获取

超出基本资料范围的扩展个人资料信息

get_user_followers

获取

用户的粉丝(分页,每页 200 条)

get_user_following

获取

用户关注的账号(分页,每页 200 条)

get_user_mentions

获取

提及用户的推文(分页,每页 20 条)

get_verified_followers

获取

已认证(蓝勾)粉丝(分页,每页 20 条)

search_users

搜索

按关键词搜索用户

check_follow_relationship

检查

用户 A 是否关注用户 B,反之亦然

get_space_detail

获取

Twitter Space 元数据(标题、主持人、发言者、状态)

实时监控

工具

操作

功能

monitor_user_add

开始

开始实时监控某用户的推文

monitor_user_list

列表

所有当前被监控的用户

monitor_user_remove

停止

停止监控某用户

filter_rule_add

创建

为监控添加关键词过滤规则

filter_rule_list

列表

所有活跃的过滤规则

filter_rule_delete

删除

移除一条过滤规则

YouTube — 1 个工具

工具

操作

功能

get_youtube_transcript

获取 + 转写

获取视频字幕。首先尝试字幕(即时,使用所请求的 language(若设置))。若无字幕,则回退到 yt-dlp + ffmpeg + Whisper。可选 languagemodel 参数。

Instagram — 1 个工具

工具

操作

功能

get_instagram_post

下载 + 转写

通过 Cobalt 将所有媒体(图片、视频、轮播)下载到本地文件夹。使用 Whisper 转写视频音频(可选 languagemodel 参数)。返回本地文件路径。

Cloudflare — 1 个工具

工具

操作

功能

fetch_markdown

提取

使用 Cloudflare Browser Run 从任何网页提取干净的 Markdown。适用于 JS 重页面、SPA 以及简单 fetch 无法获取的网站。

视频 — 2 个工具

工具

操作

功能

extract_video_frames

下载 + 提取

从任何 URL 下载视频,通过 ffmpeg 以可配置的 FPS 提取帧。支持时间范围。返回本地帧路径。支持缓存。

get_video_frames_at

精确提取

在每个指定时间戳抓取一张 JPG。与转写工具配合使用——当转写标记出不确定区域或指示性短语时,将其 midpoint_s 值传入此处,LLM 用自己的视觉读取 JPG。支持缓存(后续操作不会重新下载)。

转写的工作原理

video → cache → ffmpeg -ar 16000 -ac 1 → audio.wav → whisper-cli -ojf → audio.wav.json
                                                                            │
                                                                            ▼
                                                         parse per-token probabilities
                                                                            │
                                                                            ▼
                                        transcript with ⟨token p=0.XX⟩ markers
                                        + Uncertainty zones summary (midpoint_s each)
                                        + Demonstrative phrases block (midpoint_s each)
  1. 视频下载到 ~/.media-mcp/cache/videos/<sha256>.mp4(若存在且 <24 小时则复用)

  2. ffmpeg 将音频提取为 16kHz 单声道 WAV

  3. whisper-cli 使用 -ojf(output-json-full)在本地转写——JSON 包含每个 token 的 p

  4. 低于 p=0.5 的 token 被合并为连续片段(间隔 ≤150ms),并报告为不确定区域

  5. 片段文本被扫描以查找通常引用屏幕内容的指示性短语

  6. LLM 接收片段级转写 + 不确定区域 + 指示性命中,并决定是否使用相关时间戳调用 get_video_frames_at

对于 YouTube,首先尝试字幕(即时,已带时间戳)。Whisper 是回退方案。所有转写均在本地进行——不会将音频发送到外部服务。

Cobalt 设置

Cobalt 是一个支持 21 个平台的开源媒体下载器。media-mcp 将其用于 Instagram。你需要自己的实例——公共 API 需要 JWT 认证,无法在服务器间工作。

Docker(推荐)

# docker-compose.yml
services:
  cobalt:
    image: ghcr.io/imputnet/cobalt:11
    init: true
    read_only: true
    restart: unless-stopped
    ports:
      - 9000:9000/tcp
    environment:
      API_URL: "http://localhost:9000/"
    labels:
      - com.centurylinklabs.watchtower.scope=cobalt

  watchtower:
    image: ghcr.io/containrrr/watchtower
    restart: unless-stopped
    command: --cleanup --scope cobalt --interval 900 --include-restarting
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
docker compose up -d
curl http://localhost:9000/   # verify

添加 API 密钥认证

node -e "console.log(crypto.randomUUID())"   # generate key

创建 keys.json

{
  "your-uuid": {
    "name": "media-mcp",
    "limit": "unlimited",
    "allowedServices": "all"
  }
}

添加到 cobalt 环境:

environment:
  API_KEY_URL: "file:///keys.json"
  API_AUTH_REQUIRED: 1
volumes:
  - ./keys.json:/keys.json:ro

添加 cookies(用于私密内容)

创建包含你的 Instagram sessionidcookies.json,挂载为 /cookies.json,并在环境中设置 COOKIE_PATH: "/cookies.json"

生产环境加固

environment:
  CORS_WILDCARD: 0
  CORS_URL: "http://localhost"
  RATELIMIT_WINDOW: 60
  RATELIMIT_MAX: 100
  DURATION_LIMIT: 10800

支持的平台

Cobalt 支持 21 个平台。目前 media-mcp 将其用于 Instagram。未来版本将添加更多:YouTube、TikTok、Twitter/X、Reddit、Facebook、Pinterest、Snapchat、Bluesky、Twitch、Vimeo、SoundCloud、Dailymotion、Tumblr、Bilibili、Loom、Streamable、Rutube、Newgrounds、OK.ru、VK。

一键设置

复制 PROMPT.md 的内容并粘贴到 Claude Code 中。它将安装所有前置依赖、克隆仓库、配置一切,并自动连接 media-mcp。

转写语言和模型

所有三个转写工具都接受两个可选参数:

  • language — ISO 639-1 代码(enestrde、...)或用于自动检测的 auto。默认为英语。在 YouTube 上,会在 Whisper 运行前以该语言请求字幕。

  • modeltinytiny.enbasebase.ensmallsmall.enmediummedium.enlarge-v3large-v3-turbo。已知名称会从 HuggingFace 一次性下载到 ~/.media-mcp/models/ 并复用。任何 ggml .bin 文件的绝对路径也可用。更大的模型更慢但更准确——当 base 误听过多时,large-v3-turbo 是最佳选择。

开发

npm run dev        # watch mode (recompiles on change)
npm run build      # one-time build
npm test           # run the unit test suite
npm run test:watch # tests in watch mode
npm start          # run the server

CI 在每次推送和 PR 时于 Node 20 和 22 上运行构建 + 测试。发布由标签触发:推送 v* 会发布到 npm(带来源证明),创建 GitHub Release,并将 Docker 镜像推送到 GHCR。

许可证

MIT

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    A comprehensive MCP server for X/Twitter featuring over 70 tools for research, engagement, and publishing with granular permission-based access control. It includes specialized Playwright-powered tools for fetching X articles and supports extensive account management and thread operations.
    63
    18
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A local MCP server for extracting YouTube video transcripts, metadata, and performing visual analysis using Gemini Vision or local Whisper models. It enables users to process video content through various tools for subtitle retrieval and frame analysis.
    27
    MIT

View all related MCP servers

Related MCP Connectors

  • MCP server for QPost — lets AI agents publish video and image posts to YouTube, TikTok, Instagram.

  • Any social-video URL → transcript, metadata, frames, OCR, summary, search, Q&A. MCP server + x402.

  • MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/woosal1337/media-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server