douyin-dm-mcp
douyin-dm-mcp
Douyin(抖音)のWebダイレクトメッセージ向けのModel Context ProtocolサーバーおよびローカルHTTP APIです。Playwrightで構築されています。両インターフェースは同じ永続的なローカルブラウザプロファイルを再利用し、現在レンダリングされている会話とメッセージを読み取り、明示的に有効化された場合にのみ個別メッセージを送信します。
このプロジェクトはDouyinの現在のスタンドアロンチャットページを使用します:
https://www.douyin.com/chat?isPopup=1ログインとアカウント状態の確認は引き続きDouyinのホームページを使用します。/messages は現在404ページを返すため、自動化には使用されません。
安全上の境界
DOUYIN_ALLOW_SENDはデフォルトでfalseのため、実際の送信はデフォルトで無効です。send_messageはデフォルトでdryRun: trueです。ドライランは会話を開いたりページ状態を変更したりせずに、現在のスナップショットを検証します。実際の送信には、ドライランの無効化と
DOUYIN_ALLOW_SEND=trueの両方が必要です。読み取りまたは実際の送信の前に、サーバーはニックネームが一意であること、会話の位置と正確なニックネームがまだ一致していること、開いているチャットのタイトルが一致していることを検証します。
重複するニックネームは
targetable: falseとマークされ、MCPツールとニックネームベースのCLIの両方で拒否されます。送信クリック後に結果を確認できない場合、サーバーは
SEND_STATUS_UNKNOWNを返し、自動的に再試行しません。各ブラウザプロファイルには排他的なファイルシステムロックがあり、同時に実行されるChromiumインスタンスによる破損を防ぎます。MCP、HTTP API、オペレーターCLIは、同じ
DOUYIN_PROFILEに対して同時に実行できません。すべてのページ操作は直列化され、会話をまたいだ読み取りや送信を防ぎます。
このプロジェクトはブラウザのフィンガープリントを変更したり、認証チャレンジを回避したり、DouyinのプライベートなWebSocket/Protobufインターフェースを呼び出したりしません。
ログはstderrに書き込まれ、メッセージ本文、Cookie、パスワードフィールドを編集します。
Related MCP server: dy-mcp
現在の制限
Douyinのレンダリングされた会話DOMは、サポートされている安定した会話ID、ユーザーID、sec_uid、または安定したプロフィールリンクを公開しません。したがって:
conversationKeyは不透明であり、最新のlist_conversationsスナップショットに対してのみ有効です。list_conversationsを呼び出すと新しいキーが作成され、前のスナップショットのすべてのキーが直ちに失効します。すべての会話は
stableKey: falseを返します。重複するニックネームはさらにtargetable: falseを返します。read_messagesまたはsend_messageを呼び出す前にlist_conversationsを呼び出し、その正確な結果のキーを使用してください。会話リストには、ブラウザに現在レンダリングされている項目のみが含まれます。
completeは常にfalseです。あいまいなニックネームマッチング、一括送信、見知らぬ人検索、検索から送信へのフォールバックは意図的にサポートされていません。
詳細なライブページの証拠は RESEARCH.md に記録されています。
要件
Node.js 20以降
npm
初期QRコードログイン用にChromiumを表示できるデスクトップ環境
インストール
npm install
npx playwright install chromium
npm run build設定
環境変数 | デフォルト | 説明 |
|
| プロファイル名。英数字、アンダースコア、ハイフンのみ |
|
| Chromiumをヘッドレスで実行。初期ログインでは |
|
| 実際のメッセージ送信を許可 |
|
| デバッグログを有効化 |
|
| ナビゲーションタイムアウト(ミリ秒) |
|
| ページ操作タイムアウト(ミリ秒) |
|
| 送信試行間の最小間隔 |
|
| HTTP APIバインドアドレス |
|
| HTTP APIポート |
| 未設定 | Bearerキー、最小16文字。ループバック以外のバインドに必須 |
これらの変数はプロセス環境から読み取られます。このプロジェクトは .env を読み込みません。.env.example を参照として使用し、シェルで値をエクスポートするか、MCPクライアントの env ブロックで設定してください。
ブラウザデータは次の場所に保存されます:
.data/profiles/<DOUYIN_PROFILE>このディレクトリには認証データが含まれています。コミットしたり共有したりしないでください。
ログイン
初回使用またはセッションの期限切れの場合、次を実行します:
npm run login表示されたQRコードをDouyinでスキャンします。ログイン後、スクリプトは構造化されたステータスを出力し、Chromiumを安全に閉じ、認証済みセッションを永続プロファイルに保持します。
現在のセッションを確認:
npm run status成功した結果の例:
{
"ok": true,
"browserRunning": true,
"loggedIn": true,
"currentUrl": "https://www.douyin.com/jingxuan"
}MCPサーバーの起動
コンパイル済みエントリポイントは:
node dist/index.jsCodex CLIの例:
codex mcp add douyin-dm -- node /absolute/path/to/douyin-dm-mcp/dist/index.js一般的なMCPクライアント設定:
{
"mcpServers": {
"douyin-dm": {
"command": "node",
"args": ["/absolute/path/to/douyin-dm-mcp/dist/index.js"],
"env": {
"DOUYIN_PROFILE": "default",
"DOUYIN_ALLOW_SEND": "false"
}
}
}
}実際の送信を許可するには、そのMCPプロセスに対して DOUYIN_ALLOW_SEND を true に設定し、再起動します。送信をグローバルに有効にしたままにしないでください。
HTTP APIまたはCLIが同じプロファイルロックをすでに保持している間は、このプロセスを起動しないでください。
HTTP APIの起動
ソースから実行:
npm run apiまたはコンパイル済みエントリポイントを実行:
node dist/api.jsMCPまたはCLIが同じプロファイルロックをすでに保持している間は、このプロセスを起動しないでください。
デフォルトのベースURLは http://127.0.0.1:3000 です。認証なしのヘルスチェック:
curl http://127.0.0.1:3000/healthAPIルート:
メソッド | パス | 入力 | 目的 |
|
| なし | プロセスの生存確認。認証なし、ブラウザなし |
|
| なし | ログイン / ブラウザセッション |
|
| クエリパラメータ | 現在のレンダリングスナップショット + 新しいキー |
|
| JSON | スナップショットキーの表示可能なメッセージ |
|
| JSON | デフォルトでドライラン。実際の送信には両方のゲートが必要 |
POSTリクエストには Content-Type: application/json が必要です。送信はデフォルトでドライランのままです。実際の送信には、"dryRun": false と DOUYIN_ALLOW_SEND=true の両方が引き続き必要です。
例:
curl "http://127.0.0.1:3000/api/v1/conversations?limit=20"
curl -X POST http://127.0.0.1:3000/api/v1/messages/read \
-H "Content-Type: application/json" \
-d '{"conversationKey":"fallback:...:0","limit":20}'ループバックアクセスにはAPIキーは不要です。他のホストへのバインドは、DOUYIN_API_KEY が少なくとも16文字に設定されていない限り拒否されます。設定されている場合、すべての /api/v1/* リクエストで送信します:
curl http://127.0.0.1:3000/api/v1/status \
-H "Authorization: Bearer YOUR_API_KEY"APIはMCPと同じ構造化された成功およびDouyinエラーオブジェクトを返します。リクエスト解析エラーは INVALID_REQUEST、INVALID_JSON、UNSUPPORTED_MEDIA_TYPE、または PAYLOAD_TOO_LARGE を使用します。認証失敗は UNAUTHORIZED を使用します。
MCPツール
browser_status
永続的なDouyinブラウザプロファイルが認証されているかどうかを確認します。
入力:なし。
list_conversations
スタンドアロンチャットページを開き、現在レンダリングされている会話を、新しいスナップショットの不透明な conversationKey 値とともに返します。
{
"limit": 20
}会話フィールド:
conversationKeystableKey、現在は常にfalsepositionnicknamepreviewtimestamptargetable、重複するニックネームにより安全な選択が不可能な場合はfalse
read_messages
list_conversations によって返された会話から、現在表示されているメッセージを読み取ります。
{
"conversationKey": "fallback:550e8400-e29b-41d4-a716-446655440000:0",
"limit": 20
}メッセージフィールド:
direction:incomingまたはoutgoing。検証済みの送信者側DOM証拠に基づくtype:text、または認識されないメッセージタイプの場合はunsupportedcontent: 表示されるテキスト、空の場合はnull
targetable: false の会話は拒否されます。
send_message
検証済みの会話に1つのメッセージを送信します。
{
"conversationKey": "fallback:550e8400-e29b-41d4-a716-446655440000:0",
"text": "Test message",
"dryRun": true
}実際の送信には、次のすべてが必要です:
DOUYIN_ALLOW_SEND=true。dryRun=false。ターゲットのニックネームが現在のスナップショットで一意であること。
会話の位置と正確なニックネームがスナップショットと一致していること。
開いているチャットのタイトルがターゲットのニックネームと完全に一致していること。
メッセージに先頭または末尾の空白がないこと。
論理的なSlateエディタのテキストが要求されたテキストと完全に一致していること。
送信クリック後、サーバーは正確な正規テキストを持つ新しい送信メッセージを待ちます。確認が失敗した場合、SEND_STATUS_UNKNOWN を返します。呼び出し元は自動的に再試行する代わりに、手動で会話を検査する必要があります。最小送信間隔は、会話リストの更新をまたいで保持されます。
オペレーターCLI
現在レンダリングされている会話を一覧表示:
npm run chat -- list正確で一意なニックネームでメッセージを読み取る:
npm run chat -- read "Exact nickname"実際の送信には DOUYIN_ALLOW_SEND も必要です。PowerShellの例:
$env:DOUYIN_ALLOW_SEND="true"
npm run chat -- send "Exact nickname" "Test message"
Remove-Item Env:DOUYIN_ALLOW_SENDCLIは正確なニックネームのみを受け入れ、一致しない場合や複数の一致がある場合は続行を拒否します。
MCPまたはHTTP APIが同じプロファイルロックをすでに保持している間は、CLIを実行しないでください。
開発
npm run lint
npm test
npm run build
npm run smoke:mcpテストは、設定解析、構造化エラー、プロファイルロック、ページ操作の直列化、スナップショットの失効、重複拒否、ターゲット検証、メッセージの方向、ドライランの分離、コンポーザーのロールバック、送信確認の成功、不明な送信ステータス、永続的なレート制限、パッケージ安全なデフォルトをカバーしています。
プロジェクト構造
src/
browser/ Browser lifecycle, profile locking, and operation serialization
douyin/ DouyinService, centralized selectors, and page objects
index.ts MCP stdio server
api.ts HTTP API process entry point
api/ Versioned HTTP routes, validation, and authentication
scripts/
login.ts QR-code login
status.ts Authentication status check
chat.ts Operator CLI
mcp-smoke.ts MCP transport smoke check
tests/unit/ Repeatable behavioral tests
RESEARCH.md Live-page evidence and engineering researchライセンス
寛容な MIT License の下でライセンスされています。
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
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 Connectors
Let AI tools securely access your LinkedIn network and DMs
Browser MCP for logged-in tasks. Uses your Chrome — credentials stay local. Zero-token replay.
Messaging tools for AI agents: send messages, manage chats, groups and channels.
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables automated interaction with Xiaohongshu (Little Red Book) social media platform through browser automation. Supports login management, status checking, and publishing text content with images to Xiaohongshu accounts.33-
- FlicenseNot gradedqualityDmaintenanceEnables automation of Douyin (TikTok China) tasks including parsing share links to get watermark-free download URLs and uploading videos from specified local paths.14-
- AlicenseNot gradedqualityDmaintenanceEnables automated Douyin video uploads and account management using Playwright for browser simulation. It supports QR code login, cookie persistence, and automated metadata handling for publishing videos through natural language or API commands.916MIT
- FlicenseNot gradedqualityDmaintenanceAutomates the Douyin Creator Platform to manage login states and publish image-text content via the MCP protocol. It enables users to check authentication status, manage cookies, and automate article publishing with titles, text, and images.-
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/3xian/douyin-dm-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server