mcpField
T
tweetkit-x

tweetkit-x

ローカル
github.com/nsozturkソーシャルメディア164 週間前に更新

tweetkit-x について

tweetkit-xは、ログイン済みブラウザーのセッションCookieを使ってXを読み取り、操作するPythonライブラリ、コマンドラインツール、MCPサーバーです。投稿、削除、検索、タイムライン閲覧に対応しますが、ウェブセッションの自動化はXの利用規約に反し、アカウントにリスクがあります。

主な機能

  1. 01投稿、予約投稿、削除
  2. 02フィード、プロフィール、会話の閲覧
  3. 03Xと自分の投稿の検索
  4. 04取り消し可能な交流・アカウント操作
  5. 05セッションCookieのインポートと保存
  6. 06Python API、コマンドライン、MCPサーバー

活用シーン

  1. 01投稿やスレッドの自動公開
  2. 02古い投稿の検索と整理
  3. 03AIクライアントからタイムラインや会話を閲覧
  4. 04有料API呼び出しを使わないXの操作

MCP 対応

MCPサーバーは、Xでの投稿、削除、検索、フィードやプロフィールの閲覧、交流操作のツールを公開します。Cookie設定を案内し、貼り付けたヘッダーやファイルからセッション情報を取り込めます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"nsozturk-tweetkit-x": {
"command": "uvx",
"args": [
"tweetkit-x"
],
"env": {
"TWEETKIT_COOKIE_KEYCHAIN": "<TWEETKIT_COOKIE_KEYCHAIN>",
"TWEETKIT_COOKIE": "<TWEETKIT_COOKIE>"
}
}
}
}
起動コマンドuvx tweetkit-x
設定が必要な環境変数
TWEETKIT_COOKIE_KEYCHAINシークレットmacOS Keychain service name holding your X session cookie string (must contain auth_token + ct0). Alternatively set TWEETKIT_COOKIE (the raw cookie string) or TWEETKIT_COOKIE_FILE (a file path).
TWEETKIT_COOKIEシークレットYour X (Twitter) session cookie string — the Cookie header from a logged-in x.com request. Must contain auth_token and ct0.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypitweetkit-x0.3.0

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

tweetkit-x — Python と MCP から、独自のウェブセッションを使って X(Twitter)に投稿、削除、閲覧

tweetkit-x

ログイン済みのブラウザーセッションを使って、Python および MCP サーバーから X(Twitter)に投稿、削除、閲覧できます。
有料 API も、開発者アプリも、OAuth の面倒な手続きも不要です。必要なのはセッション Cookie だけです。

PyPI Python License MCP X API Runs with

クイックスタート · Cookie の取得 · Python · CLI · MCP サーバー · 仕組み · 免責事項


理由

2026 年 2 月 6 日以降、X の公式 API には新しい開発者向けの無料プランがありません。従量課金制で、投稿 1 件あたり約 0.015 ドル、リンク付きの投稿は 1 件あたり約 0.20 ドルに加え、読み取りごとの料金もかかります。自分のツイートを公開する用途(コンテンツを投稿するボット、予約投稿するスレッド、古い投稿を削除する整理スクリプトなど)では、ブラウザーなら無料でできることに継続的な費用が発生します。

tweetkit-x は API を完全に回避します。ブラウザーで投稿、削除をクリックしたり、プロフィールをスクロールしたりするときに使われる内部 HTTP 呼び出しを、そのまま再現します。すでにお持ちのセッション Cookie で認証します。API 費用ゼロで、投稿、削除、タイムライン全体の閲覧ができます。

⚠️ ウェブセッションの自動化は、X の利用規約に違反します。これは個人での自動化を目的としたグレーゾーンのツールです。アカウントに関するリスクはすべてご自身の責任となります。 免責事項をご覧ください。


機能

  • ✅ 投稿 — テキスト、最大 4 枚の画像、GIF と動画(代替テキスト付き)、返信、スレッド、引用ツイート、長文ノートのツイート、予約投稿
  • 🗑️ 削除 — 単一の ID、ID のリスト、または条件に一致する投稿を検索して削除する整理ループ
  • ❤️ 交流 — いいね、リツイート、ブックマーク、フォロー、ブロック、ミュート、固定。それぞれ取り消し可能
  • 🌐 X 全体を検索 — 本物の SearchTimeline(from:、min_faves:、filter:media などの演算子に対応)、さらに自分のツイートを対象にしたローカル正規表現検索
  • 📖 閲覧 — ホームフィード、任意のタイムライン、ツイートの返信・会話、フォロワー・フォロー中のアカウント、いいねした人・リツイートした人、ブックマーク、ユーザーのいいね、通知、全項目を含むプロフィール
  • 🔌 MCP サーバー — 40 個のツール。Claude Desktop/Claude Code/Cursor に追加できます。Cookie の説明と、貼り付け 1 回での設定に対応したツールを用意
  • 🔑 手間のかからない認証 — Cookie: ヘッダーを貼り付けるか、HAR ファイルまたはストレージダンプの zip を読み込んで、ファイルまたは macOS のキーチェーンに保存
  • 🐍 Python API と CLI(tweetkit …)
  • 🪶 軽量 — ヘッドレスブラウザーも Selenium も不要

クイックスタート

pip install "tweetkit-x[mcp]"      # or: pip install tweetkit-x   (library + CLI only)

# 1. Import your session cookie (three ways — see the next section)
tweetkit import --paste                       # paste the Cookie: header, Ctrl-D
#   or:  tweetkit import --file x.com.har
#   or:  tweetkit import --file storagedump_x.com.zip --keychain tweetkit

# 2. Verify (no network call)
tweetkit whoami
# {"ready": true, "user_id": "1986...", "ct0_len": 160}

# 3. Use it
tweetkit post "hello world 👋"
tweetkit search "xmr|monero" --regex          # your tweets that match
tweetkit delete 2063240404980445603

セッション Cookie の取得

tweetkit が必要とする秘密情報は、X の セッション Cookie だけです。これは、ログイン済みのブラウザーが送信する Cookie: ヘッダーと同じものです。少なくとも 2 つの値が含まれている必要があります。

Cookie内容必須HttpOnly?
auth_tokenログイン/セッション トークンはいはい(document.cookie からは見えません)
ct0CSRF トークン(x-csrf-token として返送されます)はいいいえ
twidユーザー ID(u=<id>) — 余分な照会なしで tweetkit があなたのタイムラインを読み取れるようになります推奨いいえ
guest_id、kdt、att、personalization_idその他のセッション状態任意混在

❗ auth_token は HttpOnly なので、JS コンソールで document.cookie をコピーしても、含まれません。以下の信頼できる方法のいずれかを使用してください。

方法 A — Cookie: ヘッダーをコピーする(最も確実、1 回貼り付けるだけ)
  1. ログインした状態で x.com を開きます。
  2. DevTools(F12) → Network タブを開きます。
  3. x.com へのリクエスト(例:HomeTimeline)をクリックします。
  4. Request Headers の下にある cookie: を見つけ、値全体をコピーします。
  5. それを渡します:
tweetkit import --paste
# paste the cookie header, then press Ctrl-D
方法 B — F12 の「Preserve log」で HAR ファイルを作成する
  1. ログインした状態で x.com を開き、DevTools(F12) → Network を開きます。
  2. 「Preserve log」 にチェックを入れてから、リクエストが記録されるようにページを再読み込みするか、ページ内を操作します。
  3. リクエストを右クリック → 「Save all as HAR」(または ⬇ エクスポートアイコンを使用)を選択します。
  4. インポートします:
tweetkit import --file ~/Downloads/x.com.har

最近の Chrome では、エクスポートした HAR から Cookie が削除されることがあります。tweetkit が auth_token がないと報告する場合は、Network の設定で 「Allow to generate HAR with sensitive data」 を有効にするか、方法 A または 方法 C を使用してください。

方法 C — storagedump ブラウザー拡張機能(zip)

DevTools を使わない最も簡単な方法です。storagedump(このプロジェクトの作者が作成した Chrome 拡張機能)は、タブのブラウザーストレージをエクスポートします。これには、document.cookie からアクセスできない HttpOnly の auth_token も含まれ、cookies.json を含む .zip として出力されます。ログインした状態で x.com を開き、拡張機能をクリックしてエクスポートし、次のコマンドを実行します:

tweetkit import --file storagedump_x.com_2026-07-05.zip

tweetkit は拡張機能のネイティブ形式 { "data": [ { "key": "...", "value": "..." }, ... ] } を読み取ります。また、通常のリストや {name: value} マップも受け付けます。Cookie-Editor / EditThisCookie の JSON エクスポート(--file export.json)も使用できます。

インストール:Chrome ウェブストアの storagedump。

Cookie の保存場所

既定では、tweetkit import は ~/.config/tweetkit/cookie.txt に書き込みます(chmod 600。また、Git の追跡対象外です)。macOS Keychain を使いたい場合は、--keychain <slug> を追加します:

tweetkit import --paste --keychain tweetkit
export TWEETKIT_COOKIE_KEYCHAIN=tweetkit

実行時の解決順序(最初に見つかったものを使用):明示的な引数 → TWEETKIT_COOKIE → TWEETKIT_COOKIE_FILE → ./cookie.txt → ~/.config/tweetkit/cookie.txt → Keychain(TWEETKIT_COOKIE_KEYCHAIN)。


Python の使用方法

from tweetkit_x import TweetKit

tk = TweetKit(keychain_slug="tweetkit")          # or cookie="auth_token=...; ct0=..."

tk.whoami()                                       # {'ready': True, 'user_id': '...', 'ct0_len': 160}

# post
tk.post("hello world")
tk.post("with a picture", image_path="chart.png")
tk.post("a reply", reply_to="1800000000000000000")

# thread — strings or (text, image_path) tuples; each replies to the previous
tk.post_thread(["1/ intro", ("2/ chart", "chart.png"), "3/ outro"])

# read
mine = tk.get_tweets(limit=100)                   # your tweets, newest first
theirs = tk.get_tweets(username="jack", limit=50) # anyone's

# search (local filter over the timeline — no paid search API)
hits = tk.search("monero")                        # substring
hits = tk.search(r"xmr|monero", regex=True)       # regex

# delete
tk.delete("1800000000000000000")
tk.delete_many([t["id"] for t in hits])

# quote-tweet
tk.quote("this is great", quote_tweet_id="1800000000000000000")

# engage (each has an undo)
tk.like("1800000000000000000");     tk.unlike("1800000000000000000")
tk.retweet("1800000000000000000");  tk.unretweet("1800000000000000000")
tk.bookmark("1800000000000000000"); tk.unbookmark("1800000000000000000")

# read a single tweet, and search ALL of X (real search + operators)
tk.get_tweet("1800000000000000000")
tk.search_x("mcp server", latest=True, limit=40)
tk.search_x("from:jack min_faves:1000")     # X search operators work

書き込みはすべて、成功時に {'ok': True, 'id': '...', 'url': '...'} を返し、失敗時には {'ok': False, 'status': ..., 'error': '...'} を返します。ログ記録や再試行も簡単です。

「自分の $XMR ツイートを見つけて削除する」クリーンアップループの完全な例については、examples/ を参照してください。


CLI の使用方法

tweetkit whoami
tweetkit post "just some text"
tweetkit post "text + media" --image pic.png
tweetkit post "a reply" --reply-to 1800000000000000000
tweetkit thread thread.txt                 # tweets separated by blank lines
tweetkit delete 1800000000000000000 1800000000000000001
tweetkit tweets --limit 100                # your tweets
tweetkit tweets @jack --limit 50           # someone else's
tweetkit search monero                     # your tweets containing "monero"
tweetkit search "xmr|monero" --regex
tweetkit searchx "mcp server" --latest     # search ALL of X (real search + operators)
tweetkit get 1800000000000000000           # one tweet by id
tweetkit quote "great thread" 1800000000000000000
tweetkit like 1800000000000000000          # also: unlike / retweet / unretweet / bookmark / unbookmark

thread.txt は、空行で区切られたツイートだけのファイルです。


MCP サーバー

tweetkit には、AI クライアントがユーザーに代わって投稿、削除、読み取りを行える、正式な MCP サーバー が付属しています。また、認証の手順をユーザーに案内し、Cookie とは何かを説明したうえで、1 回貼り付けるだけで設定できるようにします。

クライアントの設定

Claude Desktop / Claude Code / Cursor — MCP 設定(claude_desktop_config.json、.mcp.json など)に追加します:

{
  "mcpServers": {
    "tweetkit": {
      "command": "uvx",
      "args": ["--from", "tweetkit-x[mcp]", "tweetkit-mcp"],
      "env": { "TWEETKIT_COOKIE_KEYCHAIN": "tweetkit" }
    }
  }
}

すでに pip install 済みの場合は、コンソールスクリプトを直接使用します:

{ "mcpServers": { "tweetkit": { "command": "tweetkit-mcp",
  "env": { "TWEETKIT_COOKIE_KEYCHAIN": "tweetkit" } } } }

Cookie の環境変数を設定していなくても問題ありません。サーバーは未認証の状態で起動し、チャット内でユーザーに Cookie の設定を求めます(以下を参照)。

チャット内で完結する、手間のかからない認証

サーバーは各値について説明し、最も手間の少ない方法を提示します。一般的な初回実行の流れは次のとおりです。

  1. クライアントが auth_status を呼び出します → 未認証。
  2. サーバーの指示により、アシスタントがCookieを尋ね、auth_token と ct0 が何を示すのか、およびコピー方法を説明します。
  3. Cookie: ヘッダーを一度貼り付けます → set_session_cookie("<paste>") → 保存(Keychainまたはファイル)され、有効化されます。または、HAR/ストレージダンプのzipファイルを指定して import_cookie_from_file("~/Downloads/x.com.har") を呼び出します。

生のCookieがそのまま返されることはありません。

ツール
ツール機能
auth_status有効なセッションが読み込まれているか確認します(最初に呼び出します)
set_session_cookie(cookie_header)貼り付けた Cookie: ヘッダーから認証を設定します — コピーする内容を正確に説明します
import_cookie_from_file(path)HAR/ストレージダンプの .zip/Cookie JSONから認証を設定します
post_tweet(text, image_path?, reply_to?)ツイートを投稿します(画像/返信は任意)
post_thread(tweets[])スレッドを投稿します
quote_tweet(text, quote_tweet_id, image_path?)既存のツイートを引用します
delete_tweet(tweet_id) / delete_tweets(ids[])ツイートを削除します
like_tweet / unlike_tweet / retweet / unretweet / bookmark_tweet / unbookmark_tweetアクションを実行します(いずれも取り消し可能)
get_my_tweets(limit?) / get_user_tweets(username, limit?)タイムラインを読み込みます
get_tweet(tweet_id)IDで指定したツイートを取得します
search_my_tweets(query, regex?, limit?)自分のツイートを検索します(ローカルフィルター — 整理に便利です)
search_x(query, latest?, limit?)X全体を検索します(実際の検索で、演算子にも対応)
post_note / schedule_tweet / unschedule_tweet長文のノートツイートを投稿/予約/キャンセルします
follow_user / unfollow_user / block_user / unblock_user / mute_user / unmute_userソーシャルグラフに対するアクション
pin_tweet / unpin_tweetプロフィールに固定/固定を解除します
get_home_timeline / get_replies / get_notifications / get_bookmarksフィードと会話を取得します
get_user_profile / get_followers / get_following / get_likers / get_retweeters / get_user_likesユーザーとプロフィールに関する情報を取得します

未対応の機能: DM、投票(作成/投票)、リスト、プロフィール編集、スペース、返信を非表示にする機能。エンドポイントを特定するには、その操作を記録したHARが必要です。ご要望があれば簡単に追加できます。


仕組み

ブラウザーで操作すると、x.comはいくつかの内部エンドポイントを呼び出します。tweetkitはそれらを1対1で再現します。

  1. x-client-transaction-id — Xでは、ページのondemand.s JSとホームのフェッチから導出されるボット対策ヘッダーが必要です。スタンドアロンのx-client-transaction-idパッケージを使って生成します。
  2. メディアのアップロード(画像)— POST upload.x.com/i/media/upload.json を INIT → APPEND → FINALIZE の順に呼び出し、media_id を取得します。
  3. 書き込み/削除 — POST /i/api/graphql/<queryId>/CreateTweet および .../DeleteTweet。
  4. 読み込み — GET /i/api/graphql/<queryId>/UserTweets(カーソルによるページネーション)と、@handlesを解決するためのUserByScreenName。

認証に必要なのは、Cookie、公開ウェブ用のbearerトークン(x.comにすべての訪問者向けに埋め込まれている、同一の非シークレットなbearer)、およびx-csrf-tokenとして返される**ct0** CSRF値だけです。

your cookie ──► x-client-transaction-id ──► CreateTweet / DeleteTweet / UserTweets ──► result

GraphQLのクエリIDはtweetkit_x/constants.pyにあります。Xは数週間ごとにこれらをローテーションします。呼び出しが失敗し始めた場合は、新しいHARから更新してください(ファイルに手順が記載されています)。


セキュリティ

  • Cookieだけがシークレットです。~/.config/tweetkit/cookie.txtまたはmacOSのKeychainにchmod 600で保存され、.gitignoreによってcookie.txt、.env、*.har、*.zipが除外されます。
  • tweetkitがCookieの値を出力することはありません — インポーターが報告するのは、見つかったCookieの種類と長さだけです。
  • 同梱されているbearerはXの公開ウェブ用bearerで、すべての訪問者で同一です — シークレットではありません。

免責事項

このプロジェクトは、個人利用を目的として、ご自身の X のウェブセッションを自動化します。ウェブセッションの自動化はX の利用規約に違反しており、使用すると、アカウントがレート制限、一時停止、または永久停止の対象となるおそれがあります。使用方法については、すべてご自身の責任となります。本ソフトウェアは無保証の「現状有姿」で提供されます。X Corp. とは提携していません。

ライセンス

MIT © 2026 ns0bj

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。