media-mcp
media-mcp
社交媒体尽在指尖。覆盖 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。
设计原则
结构化数据,而非抓取。 每个工具都调用专用 API。没有 HTML 解析,没有脆弱的选择器,没有浏览器自动化。
仅本地转录。 音频永远不会离开机器。Whisper 在本地硬件上运行。
字幕优先,Whisper 其次。 平台已经完成的工作,不要浪费算力。
一个工具,一个职责。 没有带模式标志的多用途工具。每个工具只做一件事。
视觉内容用文件路径。 返回绝对路径,让 LLM 能直接看到图片。
耳朵始终在线,眼睛只在耳朵失效时启用。 转录便宜;视觉 token 昂贵。LLM 只在 Whisper 承认不确定的时间戳,或说话者明确引用屏幕内容时,才看到帧。不是每秒 1 帧。不是关键帧。只在准确度真正需要的地方。
无 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-mcpWhisper 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 服务器 |
|
是 | 音频提取 + 帧提取 |
| |
是 | 本地音频转录 |
| |
是 | 从 YouTube 及其他平台下载视频 |
| |
是,除非对只读工具使用 Xquik | 为所有 Twitter/X 工具提供支持 | ||
Xquik 密钥 | 可选 | 为重叠的只读 Twitter/X 工具提供支持 | |
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)——结构与上面相同。
环境变量
变量 | 是否必需 | 描述 |
| 是,除非 | 来自 twitterapi.io 的 API 密钥 |
| 否 | 默认为 |
| 当 | 来自 Xquik 的 API 密钥 |
| 否 | Xquik API 基础 URL,默认为 |
| 否 | Whisper 模型的路径。未设置且本地无模型时,base 模型会在首次使用时自动下载 |
| 否 | 自动下载的 Whisper 模型存放位置(默认为 |
| 否 | 24 小时视频缓存的存放位置(默认为 |
| 否 | 你的 Cobalt 实例的 URL(Instagram 必需) |
| 否 | 如果启用了认证,则为 Cobalt API 密钥 |
| 否 | Cloudflare 账户 ID( |
| 否 | 具有 Browser Rendering 权限的 Cloudflare API 令牌( |
工具
Twitter/X — 26 个工具
TwitterAPI.io 是所有 Twitter/X 工具的默认后端。设置 TWITTER_BACKEND=xquik 并配合 XQUIK_API_KEY,可将重叠的读取工具改用 Xquik。两个后端返回相同的工具输出,因此其他一切都不变。
后端覆盖范围 | 工具 |
任一后端 |
|
仅 TwitterAPI.io |
|
仅 TwitterAPI.io 的工具在运行 TWITTER_BACKEND=xquik 且未设置 TWITTER_API_KEY 时会抛出明确错误。设置两个密钥即可使用所有工具,同时仍可通过 Xquik 读取。
获取推文
工具 | 操作 | 功能 |
| 获取 + 转写 | 通过 URL 获取推文,包含文本、作者、指标、媒体、线程、文章。通过 Whisper 转写视频音频(可选 |
| 获取 | 用户的近期推文(分页,每页 20 条) |
| 搜索 | 支持操作符的高级搜索( |
| 获取 | 推文的回复(分页,每页 20 条) |
| 获取 + 排序 | 带排序的回复:相关性、最新或点赞数 |
| 获取 | 推文的引用推文(分页,每页 20 条) |
| 获取 | 转发了推文的用户(分页,每页 100 条) |
| 获取 | 来自 Twitter 列表的推文 |
| 获取 | 来自 Twitter 社区的推文 |
| 获取 | 热门话题(全球或按 WOEID 位置) |
获取个人资料
工具 | 操作 | 功能 |
| 获取 | 用户简介、粉丝数、认证状态、位置、网站 |
| 获取 | 超出基本资料范围的扩展个人资料信息 |
| 获取 | 用户的粉丝(分页,每页 200 条) |
| 获取 | 用户关注的账号(分页,每页 200 条) |
| 获取 | 提及用户的推文(分页,每页 20 条) |
| 获取 | 已认证(蓝勾)粉丝(分页,每页 20 条) |
| 搜索 | 按关键词搜索用户 |
| 检查 | 用户 A 是否关注用户 B,反之亦然 |
| 获取 | Twitter Space 元数据(标题、主持人、发言者、状态) |
实时监控
工具 | 操作 | 功能 |
| 开始 | 开始实时监控某用户的推文 |
| 列表 | 所有当前被监控的用户 |
| 停止 | 停止监控某用户 |
| 创建 | 为监控添加关键词过滤规则 |
| 列表 | 所有活跃的过滤规则 |
| 删除 | 移除一条过滤规则 |
YouTube — 1 个工具
工具 | 操作 | 功能 |
| 获取 + 转写 | 获取视频字幕。首先尝试字幕(即时,使用所请求的 |
Instagram — 1 个工具
工具 | 操作 | 功能 |
| 下载 + 转写 | 通过 Cobalt 将所有媒体(图片、视频、轮播)下载到本地文件夹。使用 Whisper 转写视频音频(可选 |
Cloudflare — 1 个工具
工具 | 操作 | 功能 |
| 提取 | 使用 Cloudflare Browser Run 从任何网页提取干净的 Markdown。适用于 JS 重页面、SPA 以及简单 fetch 无法获取的网站。 |
视频 — 2 个工具
工具 | 操作 | 功能 |
| 下载 + 提取 | 从任何 URL 下载视频,通过 ffmpeg 以可配置的 FPS 提取帧。支持时间范围。返回本地帧路径。支持缓存。 |
| 精确提取 | 在每个指定时间戳抓取一张 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)视频下载到
~/.media-mcp/cache/videos/<sha256>.mp4(若存在且 <24 小时则复用)ffmpeg 将音频提取为 16kHz 单声道 WAV
whisper-cli 使用
-ojf(output-json-full)在本地转写——JSON 包含每个 token 的p值低于 p=0.5 的 token 被合并为连续片段(间隔 ≤150ms),并报告为不确定区域
片段文本被扫描以查找通常引用屏幕内容的指示性短语
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.sockdocker 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 sessionid 的 cookies.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 代码(en、es、tr、de、...)或用于自动检测的auto。默认为英语。在 YouTube 上,会在 Whisper 运行前以该语言请求字幕。model—tiny、tiny.en、base、base.en、small、small.en、medium、medium.en、large-v3或large-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 serverCI 在每次推送和 PR 时于 Node 20 和 22 上运行构建 + 测试。发布由标签触发:推送 v* 会发布到 npm(带来源证明),创建 GitHub Release,并将 Docker 镜像推送到 GHCR。
许可证
MIT
This server cannot be installed
Maintenance
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
- AlicenseCqualityDmaintenanceA 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.6318MIT
- AlicenseNot gradedqualityDmaintenanceA 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.27MIT
- AlicenseAqualityDmaintenance45-tool MCP server for video analysis, deep research, content extraction, web search, and Weaviate knowledge storage. Powered by Gemini 3.1 Pro.345322MIT
- FlicenseNot gradedqualityDmaintenanceMCP server providing tools to fetch YouTube video transcripts with metadata, supporting direct YouTube transcripts and audio transcription via multiple backends (whisper, AssemblyAI, OpenAI, Gemini).
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.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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