twikit-mcp¶
Twitter/X MCP サーバー + CLI — API キー不要。
MCP サーバー — Claude(や MCP 対応の AI エージェント)がブラウザ cookies で Twitter/X を操作できます。同じ twikit-mcp バイナリは CLI としてもシェルスクリプトやデバッグに使えます。
0.1.45 の新機能¶
- CI:レビュー API に到達できなくても PR を落とさない —
pr-review.ymlには「警告してスキップ」のハンドラがありましたが、GitHub はrun:をbash -eで実行するため、curl の非ゼロ終了(タイムアウト / DNS / 接続拒否)がハンドラに到達する前にステップを殺していました。Run #141 がまさにそれで、承認済みの PR が赤くなりました。3 箇所すべてで curl のステータスを捕捉し、意図通り降格します。テストはワークフローから実際の shell を抽出してスタブcurlで実行するため CI の実行内容と乖離しません —— 初回実行でissue-triage.ymlの同じ潜在バグも検出しました。(closes #124) - draft→ready で重複レビューが走らない — レビューが対象コミットを記録し、同一 SHA の 2 回目はスキップします。
ready_for_reviewはトリガーとして維持:草稿を ready にする貢献者は本当にレビューを求めています。
CI のみの変更 —— パッケージ自体は変わりません。アップグレードは任意です。
0.1.44 の新機能¶
- 公式 MCP レジストリへの登録 —
server.jsonを追加し、本 server をio.github.tangivis/twitter-mcpとしてregistry.modelcontextprotocol.ioに宣言します:PyPI パッケージ、stdio トランスポート、そして各環境変数の実用的な説明付き。センチネルテストがpyproject.tomlとのバージョン同期を保証し、宣言された変数とコードが実際に読む変数を双方向で突き合わせます —— 存在しない設定を宣伝することも、必要な設定を落とすこともできません。(closes #122) - DeepSeek Harness カードの補完 —
reconnect系のキーと、稼働中インスタンス間でserverNameが重複すると後続プラグインが load 時に失敗する点を追記。
0.1.43 の新機能¶
- README のクライアント一覧の陳腐化を解消 — Pi(0.1.34 で文書化)と DeepSeek Harness(0.1.40)が 3 言語すべての "Works with" 一行要約から漏れていました。その行とインストールページを結ぶ仕組みが無かったためです。両方を追記し、インストールページの各クライアントカードがすべての README 要約に現れることを検証するセンチネルテストを追加しました。次のクライアントが静かに漏れることはありません。ドキュメント + テストのみ。
0.1.42 の新機能¶
- 凍結アカウント 1 つで
get_retweeters全体が落ちる問題を修正 — リツイート者の誰かが凍結・削除されていると、X はそのエントリを__typename: UserUnavailableとして返し、そこにはrest_idがありません。twikit のUser.__init__はこのキーを無条件に読むため、死んだアカウント 1 つで呼び出し全体がKeyError: 'rest_id'で落ちていました。解析できないエントリはスキップし、残りを返すようになりました。get_favoritersも同じコードパスなので同時に修正されます。2026-08-17 の live-smoke(実 X)で検出。(issue #37) - 同じ関数の 1 行隣も併せて堅牢化:カーソル抽出が「末尾 2 件は必ずカーソル」を前提にしており、カーソルを含まない応答で
KeyErrorになっていました。取得できない場合はNoneを返します。
アップグレード:uv tool upgrade twikit-mcp(または pip install --upgrade twikit-mcp)。
0.1.41 の新機能¶
- XChat(暗号化 DM)をローカルで読む — 新ツール 3 つでレジストリは 62 に:
xchat_status、xchat_list_conversations、xchat_get_history。X の web クライアントは会話を復号して平文をローカルの SQLite に保存しており、これらはそれを読みます。新規依存なし、ネットワークなし、認証情報なし、書き込み経路なし — DB はmode=ro&immutable=1で開き、全ステートメントが SELECT、暗号鍵は決して読まず、ここで読んでも X 上で既読になりません。XCHAT_BROWSER(chrome/chromium/edge/brave/aside)、XCHAT_BROWSER_PROFILE、XCHAT_DATABASE_PATHで設定します。未設定ならツールは休止し、server の他の部分に影響しません。XChat ページを参照。(closes #118) - @DJNgoma に感謝 — SQLite 読み取りとブラウザプロファイル探索は PR #107 の彼の実装に基づいています。
アップグレード:uv tool upgrade twikit-mcp(または pip install --upgrade twikit-mcp)。
0.1.40 の新機能¶
- DeepSeek Harness(dsh)のセットアップ手順 — インストールページに DeepSeek Harness を追加。Pi と違い dsh は公式の MCP クライアント(
@deepseek-ai/dsh-mcp-client)を同梱しているためコミュニティ拡張は不要ですが、設定は通常のmcpServersマップではなくcordis.ymlのプラグインエントリで、ツールの許可リストがないため 59 ツールすべてが登録されます。カードではその両方に加え、知っておく価値のあるfailOnStartupErrorとtoolCallTimeoutMsにも触れています。ドキュメントのみの変更 — コードは変更なし、twikit-mcpは標準的な stdio MCP server なので特別な対応は不要です。
0.1.39 の新機能¶
- MCP Python SDK v2 へ移行 — server は削除された
FastMCPではなくMCPServer(mcp.server.mcpserver)ベースになり、依存はmcp[cli]>=1.27,<2から>=2,<3へ移りました。プロトコルレベルでの変更はありません:tools/listの完全なペイロード —— ネゴシエートされたプロトコルバージョン、capabilities、59 ツールすべての入出力スキーマ —— は 0.1.38 とバイト単位で同一です(58,843 バイト、実際の stdio ハンドシェイクで両 SDK を比較検証)。アップグレードすると SDK 2.x が入ります。自分でmcp<2を固定している場合は 0.1.38 に留まってください。(closes #109) serverInfo.versionが実際のパッケージバージョンを返すように — SDK v1 はこのフィールドを自身のバージョンで埋めており、v2 は未設定だと空になります。クライアントは initialize 応答でtwikit-mcpの実バージョンを見られるようになりました。
アップグレード:uv tool upgrade twikit-mcp(または pip install --upgrade twikit-mcp)。
0.1.38 の新機能¶
- MCP 2026-07-28 仕様への地ならし — MCP Python SDK 2.0.0 が正式リリースされ、本 server が依存するクラスがリネームされました(
FastMCP→MCPServer)。既存のインストールに影響はありません:0.1.35 以降、依存は SDK 1.x に固定されています。今回のリリースでは SDK のプライベートなツールレジストリへのアクセスをすべて単一の内部アクセサに集約し、今後の v2 移行を約 70 箇所の書き換えから 1 行の変更に変えました。純粋な内部リファクタリング —— 動作の変更はなく、生成されるドキュメントと CLI 出力はバイト単位で同一です。(issue #109 phase 2)
アップグレード:uv tool upgrade twikit-mcp(または pip install --upgrade twikit-mcp)。
0.1.37 の新機能¶
get_dm_historyが message request でクラッシュしなくなりました — 知らない人の message request を承認すると、X は会話タイムラインにtrust_conversationシステムエントリを挿入し、旧版はKeyError: 'message'で落ちていました。非メッセージエントリはスキップして新フィールドtimeline_eventsで返し、warningsフィールドでエンドツーエンド暗号化(X Chat)会話の履歴が不完全な可能性を警告します — legacy DM API は暗号化本文を取得できないため、agent は「返信が無かった」と断定すべきではありません。通常の会話の JSON 形状は従来と完全に同一です。(closes #104)- 初回 DM 直後の履歴取得で "User not found" と誤報しません — 最初の DM を送った直後の読み取りは X 側で一時的に 404 になることがあります。最大 3 回の短いバックオフ付きリトライを行い、それでも失敗する場合はユーザーではなく会話が利用不可であると正しく報告します。(closes #102)
- 実機での診断と両パッチ(PR #103、#105)を提供してくれた @DJNgoma に感謝します。
アップグレード:uv tool upgrade twikit-mcp(または pip install --upgrade twikit-mcp)。
0.1.36 の新機能¶
- 整数 ID を全ツールで受け付け — X はツイート/ユーザー/リスト ID を JSON の数値として返します(
"id": 2087887408440164663、その隣に"id_str")。数値のidをそのまま渡すクライアント(str()なしの{"tweet_id": id})は、これまでツールコードが動く前にバリデーションで拒否されていました(Input should be a valid string)。今回、snowflake 形の全パラメータ(59 ツール中 37 箇所:tweet_id、user_id、list_id、media_idsなど)が int / string の両方を受け付け、無損失で文字列に変換します。float は引き続き拒否:これらの ID は 2^53 を超えるため float は既に精度が壊れており、黙って受け付けると別のツイートを操作してしまいます。(closes #111)
アップグレード:uv tool upgrade twikit-mcp(または pip install --upgrade twikit-mcp)。
0.1.35 の新機能¶
- MCP SDK を v2 未満に固定 —
mcp[cli]に上限がなく、2.0.0 がプレリリースを抜けた時点で新規のuv tool install twikit-mcpが SDK v2 を取得してしまう状態でした。v2(2026-07-28 仕様実装)はFastMCPをMCPServerにリネームしmcp.server.fastmcp.*をmcp.server.mcpserver.*へ移動するため、本 server は import 時点で落ちます。>=1.27,<2に固定し、センチネルテストで保護しました。既存インストールの挙動は変わりません。移行は issue #109 で追跡。
0.1.34 の新機能¶
- Pi のセットアップ手順 — インストールページに Pi を追加。Pi には MCP が組み込まれていないため、コミュニティ製 MCP 拡張(
pi-mcp-adapter)の導入と、そのdirectTools許可リストで本 server の 59 ツールがコーディングセッションのコンテキストを圧迫しないようにする手順を記載しました。ドキュメントのみの変更 — コードは変更なし、twikit-mcpは標準的な stdio MCP server なので特別な対応は不要です。
0.1.33 の新機能¶
- 200 文字の切り捨てを廃止 —
get_timeline/search_tweets/get_user_tweets/get_bookmarks/get_list_tweets/get_scheduled_tweets/get_community_tweets/get_communities_timeline/search_community_tweetがツイート本文を 200 文字でカットしなくなりました。get_tweetとget_tweet_repliesもTweet.full_textを使用し、X のノートツイート(長文投稿、最大 4000 文字)も完全に取得できます。レスポンスサイズはcount引数で制御。(closes #97) get_article_previewの引用ツイート対応 — 入力が引用リツイートの場合、エラーが「これは引用ツイートで、記事ではありません。引用内容は get_tweet で読んでください」に変わり、汎用の "does not embed an article" は出なくなりました。
0.1.32 の新機能¶
- ツイート返信の取得 — 新規
get_tweet_replies(tweet_id, cursor=None)ツールでツイートへのコメント / リプライを取得。vendored twikit 経由で X の TweetDetail GraphQL を使用、1 ページごとにnext_cursorで次ページ。リプライアイテムはget_user_tweets/get_timelineと同じコンパクト形式。(closes #94)
0.1.31 の新機能¶
- クライアント別インストール手順を文書化 — 新規インストールページで Claude Code / Claude Desktop / Cursor / Windsurf / Cline / opencode 6 クライアントへの登録手順を整理(クライアントあたり ≤ 12 行、設定ファイルパス + JSON スニペットのみ)。インストールコマンドは
uv tool install twikit-mcp統一、JSON の形はどのクライアントでも共通。(closes #92)
0.1.30 の新機能¶
- API ドキュメントページのローカライズ —
/zh/api/と/ja/api/で中国語 / 日本語の chrome(タイトル、イントロ、テーブルヘッダ、セクション名)を表示するようになりました。英語へフォールバックしません。ツールの docstring は Python ソースのまま(mkdocstringsと同じトレードオフ)。(closes #90)
0.1.29 の新機能¶
- Community と article-preview の信頼性向上 —
get_community/get_community_tweets/get_community_members/get_community_moderators/search_community_tweetがKeyError: 'rest_id'/IndexErrorでクラッシュしなくなりました。get_article_previewは syndication エンドポイントが 404(X が古い記事を削除)を返した場合、HTTPStatusErrorのスタックトレースを漏らさずクリーンなToolErrorを返します。_vendor/twikit/community.py+client.pyの全面.get()防御化。Issue #76 完了 —T_DRIFTは空集合になりました。(issue #76 parts 2 + 3)
0.1.28 の新機能¶
- List ツールの信頼性向上 —
get_list/get_list_tweets/get_list_members/get_list_subscribersがバーナー識別子で X にゲートされたレスポンス上でKeyError: 'created_at'/IndexError/Invalid list idでクラッシュしなくなりました。_vendor/twikit/list.py+client.pyの全面.get()防御化:欠損フィールドはNone/""/0、空 entries は空のResultを返します。live-smoke のT_LISTからT_DRIFTフォールバックも除去 — このクラスの再発を即座に検知できます。(issue #76 part 1)
0.1.27 の新機能¶
- ツイート動画のダウンロード(yt-dlp) — 新規 MCP ツール
download_tweet_videoと人間向け CLItwikit-mcp video <id>を追加。デフォルトでは~/Downloads/twikit-mcp/に保存し、既存のcookies.jsonで認証します。PATH にyt-dlpが必要(uv tool install yt-dlp)。ffmpegはbestvideo+bestaudioのような複数ストリームのマージが必要な format を渡したときだけ必要です。(closes #84)
0.1.26 の新機能¶
get_tweetで引用ツイートを公開 — レスポンスにis_quote_status/quoted_id/quoted_author/quoted_textが含まれるようになりました。引用リツイートの場合、引用元の作者と本文を即座に確認でき、エージェントが追加でget_tweetを呼ぶ必要がありません。これらは元から同じ GraphQL レスポンスに含まれていたものを取り出して公開しただけ。(closes #82)
0.1.25 の新機能¶
get_tweetに会話コンテキストを追加 — レスポンスにin_reply_to(リプライ元ツイートID)とconversation_id(スレッドのルートツイートID)が含まれるようになりました。エージェントは1つのリプライから親リンクをユーザーに尋ねることなくスレッド全体を遡れます。(closes #77)
0.1.24 の新機能¶
- Rich レンダリングのカード — 0.1.23 のターミナルカードを Rich が描画するようになりました。emoji と CJK の列幅計測が正確(
❤ 🔁行で右ボーダーがずれない)、ツイート / プロフィール / bio URL は OSC 8 でクリッカブル(iTerm2 / kitty / WezTerm / Windows Terminal / gnome-terminal ≥ 3.36 で cmd-クリックで開きます)。トレンドは真の Table レイアウトに。 - プレーンテキスト出力(非 TTY)は無変更:
| jq/> file/NO_COLOR=1の消費者にとってバイト安定が保たれます。
0.1.23 の新機能¶
- ASCII Twitter カード UI —
twikit-mcp tweet/user/tl/search/trendsがターミナルで box-drawing のカード表示になりました(太字の作者名、薄い表示の作成日時、本文 / カウント / URL の区切り線)。ファイルやパイプへリダイレクト、またはNO_COLOR=1を設定すると、従来通りのバイト安定なプレーンテキストへ自動フォールバック。出力例は CLI モード。
0.1.22 の新機能¶
- ヒューマン CLI サブコマンド — シェルから直接ツイート / プロフィール / タイムライン / 検索 / トレンドを読めます:
プレーンテキスト出力、ネイティブ Unicode、ちょうどいいデフォルト値。詳細は CLI モード。
- エンドツーエンド UTF-8 出力 — \uXXXX エスケープはもうありません。中文 / 日本語 / Ελληνικά / emoji はすべて読める形でツール出力されます。
- 三言語ドキュメントサイト — 今ご覧のこのページ。上部で言語を切り替えてください。
得られるもの¶
- 57 ツール — ツイート、ユーザー、リスト、コミュニティ、予約投稿+投票、DM、記事、検索、トレンド、通知。
- ブラウザ cookie 認証 — X セッションから
ct0とauth_tokenをコピーするだけ。 - 2 つのトランスポート、1 つのバイナリ — デフォルトは MCP サーバー(AI エージェント向け)、
twikit-mcp call <tool>は CLI(シェル向け)。 - vendored 版 twikit — プロジェクト固有の防御パッチ付き。
ドキュメント¶
- CLI モード — サブコマンド、型変換、終了コード、例。
- MCP ツール API — 自動生成のリファレンス:各ツールのシグネチャ、docstring、CLI 例(コードと同期)。
- 技術設計 — 内部実装(現在は中国語のみ — 翻訳歓迎)。
- twikit のベンダリング — すべてのパッチと対応する issue(現在は中国語のみ)。
- GitHub リポジトリ — README に三言語のフルインストール手順。
クイックインストール¶
# 1. X cookies を ~/.config/twitter-mcp/cookies.json に保存
mkdir -p ~/.config/twitter-mcp
cat > ~/.config/twitter-mcp/cookies.json <<'EOF'
{"ct0": "...", "auth_token": "..."}
EOF
chmod 600 ~/.config/twitter-mcp/cookies.json
# 2. インストール(日常利用に推奨)
uv tool install twikit-mcp
# 3. Claude Code に登録
claude mcp add twitter -s user \
-e "TWITTER_COOKIES=$HOME/.config/twitter-mcp/cookies.json" \
-- twikit-mcp
アップグレードは uv tool upgrade twikit-mcp;その他のオプション(uvx / pip / pipx)は GitHub README を参照。