Skip to main content
Glama

media-mcp

CI npm License: MIT

ソーシャルメディアを指先で。Twitter/X、YouTube、Instagram、動画処理にわたる31のツールを、Claude Desktop、Claude Code、または任意のMCPクライアントから利用できます。100%オープンソース。

ツイートを指定すれば、全文、メトリクス、動画の文字起こしを取得できます。YouTubeのURLを渡せば文字起こしを取得。Instagramのリールをドロップすれば、メディアのダウンロードと音声の文字起こしを実行。すべての文字起こしはWhisperでローカル実行されるため、音声がマシンの外に出ることはありません。

基本方針: 耳は常に、目は耳が役に立たないときだけ

小型のWhisperモデルは「聞く」のは得意ですが「読む」のは苦手です。珍しい名前を聞き間違えます。画面上のテキストを文字起こしできません。焼き込み字幕をスキップします。動画に関する質問の90%ではこれは問題になりません——概要がわかれば十分だからです。

しかし、ユーザーが*「このリールのインストールコマンドは?」「彼が見せたハンドル名は?」*と尋ねた場合、文字起こしだけでは自信満々に間違った答えを返します。URLは画面に表示されていました。固有名詞は字幕に綴られていました。Whisperはそのどれも見ていません。

media-mcpはwhisper-cli -ojfでトークンごとの信頼度付きで文字起こしを行い、不確実ゾーン(Whisperが推測していたことを認める箇所)と指示表現("visit our""this command""in the bio"——画面上のコンテンツが参照されている強いシグナル)にフラグを立てます。LLMはそれらのマーカーを読み、視覚的な検証が必要な特定のタイムスタンプに対してget_video_frames_atを呼び出すかどうかを判断します。フレームは必要なときだけ取り出されます。読み取りはLLM自身の視覚が行います——OCRも追加モデルも不要です。

結果: エージェントはすべての動画に耳を持ち、耳が役に立たない場所にだけ目を持ちます。最小限のフレーム、最大限の精度。

Related MCP server: youtube-mcp

機能

  • 取得: Twitter/Xからツイート、スレッド、プロフィール、フォロワー、トレンド、検索結果を取得(26ツール、TwitterAPI.io REST API経由。重複する読み取りツールにはオプションでXquik対応)

  • 文字起こし: whisper-cliで動画音声をローカル文字起こし——メディアをダウンロードし、ffmpegで音声を抽出し、お使いのハードウェアでWhisperを実行し、トークンごとの信頼度指示表現のヒットを出力して、LLMが音声チャネルが信頼できない箇所を把握できるようにします

  • ダウンロード: セルフホストのCobaltインスタンス経由でInstagramの投稿、リール、カルーセルをローカルフォルダにダウンロード

  • フレーム抽出: 任意の動画URLから設定可能なFPSでフレームを抽出——またはget_video_frames_atでタイムスタンプの配列を指定して正確に抽出(キャッシュ対応、フォローアップ時の再ダウンロードなし)

  • 監視: Twitterユーザーをリアルタイムで監視し、キーワードルールでツイートをフィルタリング

  • キャッシュ: ダウンロードした動画を~/.media-mcp/cache/videos/にキャッシュ(URLのsha256をキーに、24時間TTL)し、同じ動画の文字起こし+フレーム検索を1回のダウンロードで完了

仕組み

LLMはHTMLをスクレイピングしたりDOMを解析したりしません。すべてのツールが専用のAPIを呼び出し、構造化されたLLM対応テキストを返します。

テキストデータ(ツイート、プロフィール、トレンド): デフォルトではTwitterAPI.ioへのREST呼び出し1回で、整形された出力にパースされます。TWITTER_BACKEND=xquikXQUIK_API_KEYを設定すると、重複する読み取りツールにXquikを使用します。

文字起こし(ツイート動画、YouTube、Instagramリール): パイプラインはメディアを共有キャッシュにダウンロードし、ffmpegで音声を抽出し(16kHzモノラルWAV)、トークンごとの確率を保持するために-ojf(output-json-full)を指定してwhisper-cliで文字起こしし、インラインの⟨token p=0.XX⟩マーカーと不確実ゾーン・指示表現のサマリーブロックを含むLLM可読な文字起こしを返します。YouTubeではまず字幕を試します(即時)——Whisperはフォールバックのみです。

視覚データ(Instagram画像、動画フレーム): メディアはローカルフォルダにダウンロードされ、絶対ファイルパスが返されるため、LLMは視覚で直接読み取れます。フレーム抽出には2つのモードがあります: 一括(extract_video_frames、設定可能なFPS)と精密(get_video_frames_at——タイムスタンプごとに1枚の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)

文字起こしには常にトークンごとの信頼度と指示表現スキャンが含まれます。LLMはそれらのシグナルが必要と示すときにフレーム抽出にルーティングします。

すべての文字起こしはローカルで実行されます。すべての一時ファイルはクリーンアップされます。ダウンロードした動画は共有キャッシュ(~/.media-mcp/cache/videos/)に24時間保存されるため、同じURLへのフォローアップ呼び出しで再ダウンロードが発生しません。LLMが受け取るのは構造化テキストまたはファイルパス——生のAPI JSONではありません。

設計原則

  1. スクレイピングではなく構造化データ。 すべてのツールが専用のAPIを呼び出します。HTML解析も、壊れやすいセレクタも、ブラウザ自動化もありません。

  2. ローカル文字起こしのみ。 音声がマシンの外に出ることはありません。Whisperはローカルハードウェアで実行されます。

  3. 字幕優先、Whisperは次。 プラットフォームがすでに作業を済ませている場合に計算リソースを消費しません。

  4. 1ツール1ジョブ。 モードフラグ付きの多目的ツールはありません。各ツールは正確に1つのことだけを行います。

  5. 視覚コンテンツにはファイルパス。 絶対パスを返し、LLMが画像を直接見られるようにします。

  6. 耳は常に、目は耳が役に立たないときだけ。 文字起こしは安価で、視覚トークンは高価です。LLMがフレームを見るのは、Whisperが不確かだと認めたタイムスタンプ、または話者が画面上の何かを明示的に参照している箇所だけです。毎秒1フレームでも、キーフレームでもありません。精度が実際に必要とする場所にだけです。

  7. OCRレイヤーなし。 Claudeの視覚がフレームを直接読み取ります。1つのモデルがすべてのマルチモーダル推論を行う方が、OCRと視覚が競合する2モデルの継ぎ目より優れています。

完全なパイプラインの詳細、ツールリファレンス、アンチパターンについてはSKILL.mdを参照してください。

はじめに

npx(最速)

TWITTER_API_KEY=your_key npx media-mcp

または、1コマンドで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=xquikXQUIK_API_KEYを設定すると、重複する読み取りツールがXquikに送信されます。両バックエンドとも同じツール出力を返すため、他に変更はありません。

バックエンドの対応範囲

ツール

どちらのバックエンドでも利用可能

get_tweet, get_user_profile, get_user_about, get_user_tweets, get_user_followers, get_user_following, get_verified_followers, get_user_mentions, get_tweet_replies, get_tweet_quotes, get_tweet_retweeters, search_tweets, search_users, check_follow_relationship, get_trends

TwitterAPI.io のみ

get_tweet_replies_v2, get_list_timeline, get_community_tweets, get_space_detail, get_bookmarks, 3つのモニターツール、3つのフィルタールールツール

TwitterAPI.io 専用ツールは、TWITTER_API_KEY を設定せずに TWITTER_BACKEND=xquik を実行すると明確なエラーを返します。両方のキーを設定すれば、すべてのツールを使いつつ 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 を抽出。JavaScript 多用のページ、SPA、単純な fetch が失敗するサイトでも動作します。

動画 — 2ツール

ツール

アクション

説明

extract_video_frames

ダウンロード + 抽出

任意のURLから動画をダウンロードし、ffmpeg 経由で設定可能な FPS でフレームを抽出。時間範囲に対応。ローカルのフレームパスを返します。キャッシュ対応。

get_video_frames_at

精密抽出

指定された各タイムスタンプで JPG を1枚取得。文字起こしツールと組み合わせて使用 — 文字起こしが不確実ゾーンや指示語を検出した場合、その 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 にはトークンごとの p 値が含まれる

  4. p=0.5 未満のトークンは連続するスパン(≤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

クッキーの追加(非公開コンテンツ用)

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 の自動接続が行われます。

文字起こしの言語とモデル

3つの文字起こしツールはすべて、2つのオプションパラメータを受け付けます:

  • language — ISO 639-1 コード(enestrde など)、または自動検出の場合は auto。デフォルトは英語。YouTube では、Whisper を実行する前にこの言語でキャプションがリクエストされます。

  • modeltinytiny.enbasebase.ensmallsmall.enmediummedium.enlarge-v3、または large-v3-turbo。既知の名前は HuggingFace から一度だけ ~/.media-mcp/models/ にダウンロードされ、再利用されます。任意の ggml .bin ファイルへの絶対パスも使用可能です。大きなモデルは遅いですが精度が高くなります — large-v3-turbo は base で聞き取りミスが多い場合の最適解です。

開発

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*をプッシュすると、provenance付きで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