Douyin Publish MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Douyin Publish MCPpublish media/sunset.mp4 with the title "Sunset timelapse""
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
douyin-publish-mcp
把 social-auto-upload(MIT)的抖音发布能力 包成薄 MCP 服务,供本平台的「MCP 商店」安装、启停用。发布之外还带一套读取工具 (搜索 / 作品详情 / 用户主页 / 我的主页 / 分享链接解析),登录态与发布共用同一份, 见「读取能力怎么来」。
10 个工具:账号状态、扫码登录(会话式)、重置登录态、发布视频、发布图文; 搜索视频、作品详情、用户主页、我的主页、分享链接解析。
零三方依赖:只用 Python 标准库(协议层与读取通道都自己写,见下)。
发布是两步:预检(不碰账号)→ 用户确认 → 执行(见「发布门禁」); 读取不吃 confirm —— 它只看、不动账号,所以不值得多一次往返。
两种形态:
stdio(默认,宿主起子进程)与streamable_http(本机常驻 + 状态页)。
它不重写任何平台逻辑:发布动作仍由 sau CLI 做,这一层只做四件事 ——
参数构造、素材白名单、协议适配、确认门禁;读取则由本服务直连抖音 web 接口
(带上用户登录 cookie),把上游几十 KB 的响应裁成几句人真正会看的字段。
两种形态:选哪个
|
| |
启动方式 | 宿主当子进程拉起( | 商店配置给 |
端点 | stdin/stdout,一行一个 JSON-RPC |
|
需要打包 exe | 不需要( | 需要( |
扫码登录 | 会话式工具:弹真窗口扫码,成功后窗口自动关闭 | 同上,外加本机状态页 |
宿主重启 | 子进程跟着死 | 服务不重启(登录态、运行记录都在) |
停用 | 宿主 kill 子进程 | 客户端按进程台账 / 端口归属收进程( |
鉴权 | 无需(父子进程) | 可选 |
适合 | 只想用工具、不想装东西 | 要登录页、要长任务不被宿主重启打断 |
同一份工具实现,两种形态共用;商店里只发布其中一条(两条都发会让同一批工具在注册表里重名)。
Related MCP server: Douyin API New MCP Server
为什么值得包一层
直连 sau CLI 有三个坑,这一层把它们挡在模型之外:
CLI 的参数细节(
--images是 nargs、--tags要逗号分隔、--schedule是YYYY-MM-DD HH:MM本地时间)不该让模型记;记错的表现是"命令跑了一半失败"。素材路径由模型给,属于不可信输入。不加闸 = 能把本机任意文件传到抖音。
发布必须有人点过头。CLI 一旦被调用就是真发布,工具层必须自己带确认门禁 (见下),不能指望模型自觉。
前置:把 social-auto-upload 跑起来
git clone https://github.com/dreammis/social-auto-upload.git
cd social-auto-upload
uv sync
uv pip install -e . # 生成 sau 命令入口
patchright install chromium # 浏览器运行时
uv run sau douyin login --account main # 先手动登录一次,确认整条链路通Windows 上装 Chromium 建议先设镜像:
$env:PLAYWRIGHT_DOWNLOAD_HOST="https://npmmirror.com/mirrors/playwright"
配置(环境变量)
由商店安装时填的 envVars 提供;也可以在 MCP 配置页补填/修改。
变量 | 必填 | 说明 |
| 二选一 |
|
| 二选一 | social-auto-upload 项目根目录 → 用 |
| 发布必填 | 允许发布的素材根目录(默认取 |
| 否 | 单次调用超时秒数,默认 900(上传慢,别调太小) |
| 否 |
|
| 否 | uv 可执行文件路径(默认 |
| 否 |
|
| 否 | 短信验证码文件,默认 |
| 否 | 读取工具的默认账号名(默认 |
| 否 | 读取用的凭据文件(storage_state 或裸 Cookie 串)。不填就用 sau 的凭据文件 |
| 否 | 直接给整串 cookie(容器 / 临时调试用)。与上一行二选一,显式配置优先 |
| HTTP 形态可选 | 填了就要求 |
SAU_MEDIA_DIR 没配时所有发布工具都会拒绝执行并说明怎么配 ——
这是刻意的:宁可报"没配置",也不能退化成"整个磁盘可读"。
十个工具(5 个发布/账号 + 5 个读取)
工具 | 作用 | 模型该怎么用 |
| 查登录态 | 判据是 |
| 扫码登录(会话式) | 弹真窗口(抖音会挑无头浏览器,且可能要输短信验证码),二维码同时以图片返回;扫完窗口自动关闭(没人扫也最多 2 分钟);调用等一段就返回状态,还在等就再调一次继续查(不会另开会话);扫完自动检查一次 |
| 重置登录态 | ★ 两步:先回报"将要删除的凭据文件",用户同意后才 |
| 发布视频 | 先不传 confirm 拿计划 → 念给用户 → 带 |
| 发布图文(≤35 张,不支持 GIF) | 同上;长正文用 |
| 关键词搜视频 | 返回 aweme_id、作者(昵称 + sec_user_id)、互动数据、无水印直链。 |
| 单条作品详情 | 也能吃整条链接(内部抽 id);报"没取到"表示 id 不对,或作品已删/私密 |
| 用户主页 + 最近作品 | sec_user_id 从搜索/详情的作者字段里拿( |
| 当前登录账号自己的主页 | 回答「我这个号发了多少、粉丝多少」用它,不用传 id |
| 分享文本 → 作品详情 | 用户贴「…复制打开抖音… https://v.douyin.com/xxxx/」时用它;链接过期或给的是主页/合集链接,会说明原因而不是静默失败 |
读取工具的 account 都可以省略(默认 SAU_ACCOUNT,兜底 main)。
download_url 是有时效的直链(通常几小时),要保存就当场下载;本服务只返回地址,不落盘。
schedule 传本地时间 '2026-03-24 21:30' 即走定时发布;不传 = 立即发布。
与 sau CLI 的开关对齐(这些不是"锦上添花")
工具参数覆盖 CLI 真实支持的开关(见 sau_cli.py 的 douyin 子命令定义):
场景 | 参数 | 少了的后果 |
自定义封面 |
| 用平台自动截的帧当封面 |
带货 |
| 商品没挂上,白发了 |
自主声明 |
| 该声明的没声明,合规风险 |
合集 |
| 作品没进合集,播放路径少一条 |
长正文/背景音乐 |
| 正文只能塞在参数里,容易截断 |
封面与
note_file同样是把本机文件交给平台,所以都走素材目录白名单。
登录为什么是"会话"而不是一次调用
sau douyin login 会一直等到用户扫完码(几十秒到几分钟)。若当成同步调用,会把客户端卡住,
而且中断后没有任何地方能回答"刚才那次登录怎么了"。所以:
同一时刻只保留一个待扫码会话(开新的会关掉旧的,否则每点一次多一个浏览器);
会话状态(等待中/结束/输出/二维码)留在进程里,工具与状态页读的是同一份;
登录流程结束后自动跑一次
check:login退出码 0 ≠ 扫上了,用户关心的是后者;等待扫码期间不做
check(那时已有一个浏览器,再起一个既慢又容易让用户误以为"检查结果是没登录")。
重置登录态(唯一的删除操作)
sau 没有
logout子命令(抖音只有 login / check / upload-video / upload-note), 所以"退出登录"在这条链路上就是删掉凭据文件:<项目>/cookies/douyin_<账号>.json。只删这一个文件:不递归、不删目录、不碰其它账号;路径再做一次"父目录必须是 cookies/、 文件名必须严格匹配"的校验;
confirm=false时只看不删。
发布门禁(本服务最要紧的一条)
第一次:不带 confirm → 只做本地预检(路径/长度/时间格式),返回计划 + plan_id,**绝不碰账号**
第二次:plan_id + confirm=true → 校验 plan_id 与本次参数算出的指纹一致,才真正执行plan_id是计划内容的哈希(账号+类型+素材+标题+正文+标签+时间)。因此"模型忘了确认直接发"和"用户确认的是 A、发出去的是 B"都发不出去。
但这只约束程序流程,不是独立的人工审批:真正的把关是工具描述里"必须先给用户看" 这条要求,以及平台侧的工具审批(若该平台配置了)。
读取能力怎么来(与小红书 MCP 的差别)
读取(搜索 / 详情 / 主页 / 分享解析)不走浏览器,本服务直接用标准库请求抖音 web 接口:
小红书 MCP | 本服务的读取 | |
数据来源 | 真实浏览器渲染(go-rod + 内置 Chromium) | 抖音 web 接口直连(标准库 |
取舍 | 稳,但每次读取要起浏览器、要背一份 Chromium | 快、零依赖;依赖"登录 cookie + 请求指纹",平台改版可能失效 |
登录态 | 自己的 | 复用 sau 的 |
不用二次登录:扫码一次,发布与读取共用同一份凭据(少一个会过期、要单独清理的东西)。
不回显凭据:工具输出与状态页只出现 cookie 的名字(
sessionid、ttwid…),值不出现。失效时是什么样:
{"status_code":0,"status_msg":"blocked"}。读取工具把它与"真没搜到"分开报, 并按顺序提示排查:① cookie 里有没有ttwid②sessionid是否过期(重新扫码) ③ 是否为无签名直连被拦(见下)。签名:
a_bogus当前不携带(douyin_sign.A_BOGUS_IMPLEMENTED = False)。 带登录 cookie 时多数接口不校验它;真被拦了,在douyin_sign.sign_a_bogus里补实现即可, 调用方一行都不用改。
端到端验收:scripts/verify_flow.py
验收分本地段与真机段 —— 两者的成本差一个数量级,能分开跑就不该捆在一起:
段 | 环节 | 需要什么 |
本地 | 单测 → 协议层 → 发布门禁 → HTTP 形态 | 只要 Python。不联网、不跑 sau、不碰账号 |
真机 | 环境前置 → 登录态 → 读取五连 → 发布预检 | sau + 登录态 + 外网 |
cd E:\项目\AI\douyin-publish-mcp
$env:PYTHONPATH="src"
& ..\.venv\Scripts\python.exe scripts\verify_flow.py --local-only # 只有 Python 就够
& ..\.venv\Scripts\python.exe scripts\verify_flow.py # 本地段 + 真机段
& ..\.venv\Scripts\python.exe scripts\verify_flow.py --keyword 猫 --publish-file D:\media\a.mp4脚本走的是和客户端完全相同的 Server.handle 路径(不是另写一套调用),每步给
PASS / FAIL / SKIP:
本地段:全部单测;协议握手与 10 个工具的 schema;发布门禁(预检只出计划,
plan_id不符与内容改过都必须被拒,并断言全程 0 次 CLI 调用);HTTP 形态 (真起服务、真发请求:/health免鉴权、无 token 401、状态页有「读取通道」行、 无凭据时读取工具给的是可读提示而不是空结果)。真机段:登录态(真跑
sau douyin check);读取五连(搜索 → 详情 → 用户主页 → 我的主页 → 分享解析,后三步用前一步真拿到的aweme_id/sec_user_id串起来); 发布预检(用你自己的素材)。默认不发布任何东西:发布只跑到"预检 + 门禁必须拦住"。要真发得显式加
--confirm-publish。SKIP 不等于通过:脚本最后会单独列出"还没验过的"。本地段全绿只说明服务的壳是对的, 不说明抖音认它 —— 判决点是真机段的「搜索」那一步。
退出码:
0= 没有 FAIL(可以带 SKIP);1= 有 FAIL。
没有脚本时的手动版(等价,按顺序来)
douyin_account_status(account="main")—— 期望「已登录」(读取的前置)douyin_search_videos(keyword="美食", count=5)—— 期望有作品;若报 blocked,按上面的排查顺序走douyin_video_detail(aweme_id="<第 2 步拿到的 id>")—— 期望有无水印直链douyin_user_profile(sec_user_id="<作者字段里的 sec_user_id>", limit=5)douyin_my_profile(limit=5)
还没做的(第二批)
互动与通知:发评论 / 回复 / 点赞 / 收藏、通知未读数与通知列表。 它们的接口路径需要在真机上验过再合并 —— 没验过的路径写进来只会变成"永远空结果", 而那是这个项目最不能接受的失败形态:看起来能用,实际读不到。
streamable_http 形态
# 启动(默认只绑 127.0.0.1,port 18080)
douyin-publish-mcp --http --port 18080
# 需要局域网访问时必须给 token(不给会直接拒绝启动)
douyin-publish-mcp --http --host 0.0.0.0 --token <secret>
# 探活(永远免鉴权,供启动器使用)
curl http://127.0.0.1:18080/health
# 走一遍协议
curl -X POST http://127.0.0.1:18080/mcp -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'端点一览:
路由 | 说明 |
| MCP JSON-RPC(tool 调用都走这里) |
| 本机状态页:配置摘要、发起/取消扫码登录、重置登录态、最近输出 |
| 发起扫码登录(会话式,页面立刻返回) |
| 检查登录态(后台跑,结果落在 |
| 重置登录态: |
| 取消等待扫码的会话 |
| 当前登录二维码(CLI 落盘了才有;抖音这条链路通常没有,返回 404) |
| 运行状态 JSON(页面轮询用;与工具看到的是同一份会话状态) |
| 探活 |
| 405(本实现不提供 server→client 的 SSE 流,明说比挂着空流诚实) |
打包成独立可执行文件
command 必须是可执行文件(不能是 uvx ... 这种父进程起子进程的包装:
停用时父进程被杀、真正监听端口的子进程会留下):
# 第一次:装 PyInstaller(内网可加 -PipIndexUrl <内网源>)
.\packaging\build_exe.ps1 -InstallPyInstaller
# onedir(推荐:单进程,停用时按台账就能收干净)
.\packaging\build_exe.ps1
# 或 onefile(单文件更省事,但会多一层自解压子进程 —— 靠客户端的端口归属兜底仍能收掉)
.\packaging\build_exe.ps1 -OneFile产物默认拷到 %LOCALAPPDATA%\douyin-publish-mcp\,正好对上商店配置里的 command。
★ 脚本必须带 UTF-8 BOM:Windows 自带的 PowerShell 5.1 对没有 BOM 的
.ps1按 ANSI(GBK) 读,中文注释会变成乱码并以语法错中断(报错里能看到锛堝唴缃?这种乱码)。 脚本内部调 python / PyInstaller 也统一走Invoke-Native—— PS 5.1 会把原生命令写往 stderr 的日志当成致命错误并中断脚本,而 PyInstaller 顺利运行时也会往 stderr 写 INFO (不包的话表现成"打包到一半停了,只看到一行 INFO",很容易被误读成打包失败)。
打包后自检(本机已跑通):
& "$env:LOCALAPPDATA\douyin-publish-mcp\douyin-publish-mcp.exe" --http --port 18080
# /health → {"status":"ok","service":"douyin-publish-mcp","version":"0.2.0"}
# POST /mcp tools/list → 10 个工具onedir 还是 onefile(实测结论,不是推测):
onedir(默认) | onefile(Release 资产用这个) | |
产物 | 一个目录(含 | 单个 exe(约 9 MB) |
分发 | 整目录拷过去 | 只拷一个文件 |
启动 | 快(约 1s) | 首次多几百 ms(自解压) |
停用能否收干净 | 单进程,按台账直接收 | ★ 会留下一层同名子进程(自解压的 bootloader),父进程被杀后它可能仍在监听端口 —— 靠客户端的端口归属兜底(映像名 == 配置的 exe 名)收掉 |
所以:发布到 Release 用 onefile(对齐小红书的"裸二进制"资产形态、用户只下一个文件); 本地/内网部署用 onedir 更省心。两者工具实现完全相同。
从 GitHub Release 安装(使用者)
Releases 里只有一个资产:
平台 | 文件 |
Windows x64 |
|
它是 PyInstaller onefile 单文件(约 9 MB,自带 Python 运行时,不用先装 Python):
$dst = "$env:LOCALAPPDATA\douyin-publish-mcp"
New-Item -ItemType Directory -Force $dst | Out-Null
Move-Item .\douyin-publish-mcp-windows-amd64.exe "$dst\douyin-publish-mcp.exe" -Force
& "$dst\douyin-publish-mcp.exe" --http --port 18080 # 本机常驻,只绑 127.0.0.1目录和文件名不是随便定的:商店配置里的 command 就是
%LOCALAPPDATA%\douyin-publish-mcp\douyin-publish-mcp.exe —— 形态与商店里的小红书 MCP 一致
(%LOCALAPPDATA%\<服务名>\<服务名>.exe,客户端 expand_env 会展开这个占位)。
★ 但 exe 不是全部:它自带 Python 运行时,却不自带
sau—— 真正的发布/登录动作仍由 本机的 social-auto-upload 完成。 装完 exe 还要装sau并配SAU_CMD/SAU_DIR/SAU_MEDIA_DIR,见下面的前置条件。
本地调试
# 单元测试(零依赖,含 HTTP 形态的端到端:真起服务再打它)
cd douyin-publish-mcp
set PYTHONPATH=src
..\.venv\Scripts\python.exe -m unittest discover -s tests
# stdio 形态手动走一遍
echo {"jsonrpc":"2.0","id":1,"method":"initialize","params":{}} | python -m douyin_publish_mcp
# http 形态冒烟
python -m douyin_publish_mcp --http --port 18080接进本平台(Dr.Q 客户端)
1. 先决定「本包从哪来」
http 形态:
command= 上一步打出来的 exe 绝对路径(如%LOCALAPPDATA%\douyin-publish-mcp\douyin-publish-mcp.exe),args=--http --port 18080。 exe 需要分发到每台机器(拷目录 / 走你们的内部分发)。stdio 形态:
command=uvx,args=--from <内网包来源> douyin-publish-mcp。 包来源三种写法:
写法 |
| 适用 |
内网 GitLab 归档(与商店里 |
| 内网可达 GitLab,不需要 git CLI、不需要 PyPI |
内网 PyPI |
| 已把包发到内网源 |
本地目录 |
| 单机调试/离线演示 |
★ 三个坑(前两个踩过): ①
args在商店表单里是空格分隔字符串(后端按空白切分),路径不能有空格; ②command/args/cwd会展开%LOCALAPPDATA%这类占位(local_service::expand_env, 未定义的变量保持原样,便于排查"变量名写错")——所以command写%LOCALAPPDATA%\douyin-publish-mcp\douyin-publish-mcp.exe就能适配每台机器, 不必写死用户名; ③ 但envVars里的值不会展开(原样透传给子进程,由子进程自己解释),必须写绝对路径。
2. 发布到商店
前置(http 形态):先 .\packaging\build_exe.ps1 打出 exe —— 商店里的 command
就是这个绝对路径,exe 不在,别人装完也起不来(%LOCALAPPDATA%\douyin-publish-mcp\
只在打包的那台机器上有,要分发到每台机器)。
客户端「MCP 商店」页 → 发布服务,字段照抄:
表单字段 | http 形态( | stdio 形态( |
名称 | 抖音发布与读取(social-auto-upload) | 同(·stdio) |
传输方式 |
|
|
command |
|
|
args |
|
|
url |
| (空) |
envVars | SAU_CMD / SAU_DIR / SAU_MEDIA_DIR / SAU_TIMEOUT / SAU_ACCOUNT / AUTH_TOKEN | 同左,无 AUTH_TOKEN |
status / visibility |
| 同左 |
走
POST /api/mcp-service-config落库tb_mcp_service_config。★ 只发一条:两个形态共用同一批工具名,同时发布会让注册表里重名。
发布前先跑一遍
scripts/verify_flow.py --local-only:确认tools/list里正好 10 个工具、 描述完整、发布门禁拦得住 —— 商店里装的版本和这份配置是同一个东西,别把没验过的发出去。读取工具用到的
DOUYIN_COOKIE_FILE/DOUYIN_COOKIE(见环境变量表)不放进商店默认: 正常路径下凭据来自SAU_DIR,这两个只在"读取和发布不是一个账号/项目"时才需要,属高级用法。
3. 安装后的行为差异(这段决定运维怎么做)
http 形态:客户端安装时先确保本机进程起来(
local_service::ensure),再连url;进程是 detached 的,宿主重启不影响它。停用时客户端按 进程台账 + 端口归属(映像名必须等于配置的 exe 名) 收掉进程,所以command里的 exe 名要和真正监听端口的进程名一致(这也是不用uvx包装的原因)。stdio 形态:宿主 kill 子进程即可,没有端口、没有遗留;代价是宿主重启后要重新拉起。
4. 换机器/换目录
改 MCP 配置页里的 env(SAU_CMD/SAU_DIR/SAU_MEDIA_DIR)再重启该服务即可,不用重装。
风险与边界(请连同代码一起看)
底层是浏览器自动化 + 用户自己的登录态:违反抖音平台协议,随时可能被改版/风控打断。 真要长期稳定,走开放平台
video.create(合规但需资质与用户授权)。本服务不存储账号密码,但它依赖的
sau会在项目目录里保存 cookie/浏览器资料 —— 那是凭据,不要提交进任何仓库。★ 读取通道必须读到 cookie 的值(否则发不出请求), 但对外只回显来源与 cookie 名:工具输出、状态页、日志里都不会出现值。 「重置登录态」是唯一的删除动作,且只删<项目>/cookies/douyin_<账号>.json一个文件。读取工具会把公开内容与你自己的账号资料带进对话上下文(含无水印直链,几小时后失效)。 只用它读公开内容与自己有权看的账号;把
limit调大、连续多次搜索会显著提高被风控的概率。http 形态默认只绑
127.0.0.1;改绑别处必须配 token —— 这个服务能直接发布内容。每次发布都会真实落到用户账号上;"命令成功"不等于"已公开可见"(平台还有审核)。
短视频平台的标题/正文/图片数量限制会变,本服务里的长度预检(标题 30 字、正文 1000 字) 只用于尽早报错,不代表平台真实限额。
许可
Apache License 2.0 —— 与商店里的小红书 MCP(xpzouying/xiaohongshu-mcp)
采用同一许可,便于两边一起用、一起改。
Available Tools
10 toolsdouyin_account_loginA
让用户扫码登录抖音。★ 会弹出一个真浏览器窗口:登录这一步必须用真窗口 —— 抖音的反自动化会挑无头浏览器,而且可能要求短信二次验证,那只能在窗口里手动输。二维码同时也会作为图片返回(和窗口里是同一个码),展示给用户扫也行。扫码成功后窗口会自动关闭(sau 存完 cookie 就关掉浏览器并退出,约 2 秒后消失);若一直没人扫,窗口最多活 2 分钟也会自己关,不会一直挂在用户屏幕上。调用会等一段(wait_seconds):扫得快就一次拿到结论;还在等就返回「会话仍在等待扫码」,此时再调一次本工具即可继续查,不要重复发起新登录。若发布时触发短信二次验证,把验证码写进项目根目录的 verify_code.txt 再重试发布。
| Name | Required | Description | Default |
|---|---|---|---|
| headed | No | 是否弹出浏览器窗口。默认 true:登录必须用真窗口(抖音的反自动化会挑无头浏览器,且可能要输短信验证码);扫码成功后窗口自动关闭。只在没有桌面会话(CI/服务器)时才传 false。 | |
| account | Yes | 账号名(自定义,用于区分多个抖音号) | |
| wait_seconds | No | 本次调用最多等多少秒(默认 90,上限 600)。超时不中断登录:会话仍在后台等扫码。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so: a real browser window pops up, auto-closes about 2s after a successful scan, self-closes after at most 2 minutes if unscanned, and wait_seconds timeouts do not abort the background session. It also discloses the anti-automation and SMS-verification constraints and the verify_code.txt workaround.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the window behavior and timeout semantics that govern how to call it, and nearly every sentence adds operational value. Minor redundancy with the schema's headed description and slightly dense bolding keep it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by describing the return states ('scan succeeded' vs 'session still waiting for scan'), window lifetime, and the SMS-verification recovery path. An agent has everything needed to invoke, poll, and recover.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description nevertheless adds meaning by explaining that wait_seconds' timeout does not interrupt login and that the session keeps waiting in the background, plus the polling consequence. headed is only restated, so it is not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: logging a user into Douyin via QR scan. The scope (per-account login, distinct from status/logout siblings) is unambiguous, and an agent can tell it is the credential-establishing tool rather than a read or query tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to re-call this same tool when the session is still waiting rather than starting a new login, and gives the condition for setting headed=false (only on CI/servers with no desktop session). It also routes SMS-verification retries through verify_code.txt, which is real alternative-path guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
douyin_account_logoutA
重置某个账号的登录态(相当于小红书 MCP 的 delete_cookies)。本服务只删一个文件:<项目>/cookies/douyin_<账号>.json —— 那是 sau 的登录凭据。★ 两步:不传 confirm 时只回报「将要删除的路径」,什么都不删;用户明确同意后才传 confirm=true。删完该账号变回未登录,发布前要重新扫码。注意这是「退出登录」不是「卸载」:项目目录、素材、已发布的作品都不受影响。
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | 账号名 | |
| confirm | No | 用户已明确同意删除凭据时传 true |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: it names the exact file affected, its role as the login credential, the irreversible effect (account returns to logged-out), and explicitly scopes out collateral damage (project dir, materials, published works unaffected). This is exactly the behavioral context an agent needs before triggering a destructive confirmation flow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and outcome, then the workflow, then the scope caveat. Dense but every clause carries operational weight; the ★ markers aid scanning. Slightly long, but justified by the destructive nature of the operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema, no-annotation tool, the description covers effect, confirmation discipline, post-condition, and non-effects — everything needed to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both params are already documented, giving a baseline of 3. The description adds real semantics beyond the schema by defining confirm's role as a two-phase safety gate rather than a plain boolean.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (重置某账号登录态) and immediately clarifies the exact mechanism: deleting a single cookies file, not uninstalling. It also distinguishes itself from account_login/account_status by describing the resulting state and the 'logout not uninstall' boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes the two-step workflow: with no confirm it only reports the intended path (dry run), and confirm=true may only be passed after the user explicitly agrees. It further gives the follow-up condition (must re-scan QR before publishing), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
douyin_account_statusA
查询某个抖音账号在 social-auto-upload 里的登录态(本地 cookie 是否还有效)。发布/登录前先查一次,避免发到一半才发现没登录。account 是登录时用的账号名(不是抖音昵称)。
| Name | Required | Description | Default |
|---|---|---|---|
| account | Yes | 账号名(social-auto-upload 里登录时用的名字) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose that this reads local cookie validity state in social-auto-upload, implying a non-mutating local check. It stops short of stating side effects, failure behavior, or what an invalid result looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose before the usage hint and the parameter caveat. No redundant restatement of the tool name; tight and appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no annotations, the description covers purpose, timing, and parameter identity well, but there is no output schema and the description never says what the check returns (boolean, expiry, error shape). That leaves a small but real gap for an agent deciding how to consume the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a genuine disambiguation the schema lacks: account is the login name used in social-auto-upload, NOT the Douyin nickname. That extra meaning reduces a real selection error.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (查询/query) and resource (抖音账号登录态), and clarifies the mechanism (本地 cookie 是否还有效 in social-auto-upload). An agent can distinguish it from douyin_account_login/logout/publish without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger: check before publishing or logging in to avoid discovering mid-way that you're not logged in. There is no explicit exclusion list or naming of a sibling alternative, but the when-to-use context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
douyin_my_profileA
看当前登录账号自己的主页信息与作品列表(不需要传 sec_user_id)。适合回答「我发了多少条、最近的播放/点赞如何」「这个号登录的是谁」。
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 作品条数上限(默认 20,最多 100) | |
| account | No | 账号名(social-auto-upload 里登录时用的名字)。不传则用默认账号(SAU_ACCOUNT,兜底 main)。 | |
| include_videos | No | 是否返回自己的作品列表(默认 true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. The verb '看' and 'info + work list' make clear this is a non-mutating read scoped to the current login, which is useful, but it says nothing about pagination behavior, output volume limits, or what happens if no account is logged in. Adequate but incomplete for a zero-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: the first front-loads what is returned and the key constraint, the second supplies concrete answerable questions. No filler or redundancy; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, zero-parameter-required tool with no output schema, the description communicates both scope (self profile + works) and the kinds of questions it answers, which effectively conveys the return shape. Missing only edge-case behavior (logged-out state, large result sets), so slightly under complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents limit (default 20, max 100), account (default SAU_ACCOUNT/main), and include_videos (default true). The description adds only the no-sec_user_id point and does not elaborate on any parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (the current account's profile and work list) and a specific actor (the logged-in account itself), and explicitly distinguishes it from the sibling douyin_user_profile by stating sec_user_id is not needed. An agent can immediately tell this is the 'self' read path versus the arbitrary-user path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies concrete use cases ('how many posts have I made, recent plays/likes', 'which account is logged in'), which gives clear selection context, and the 'no sec_user_id' note implicitly routes non-self queries to douyin_user_profile. It stops short of an explicit when-not/exclusion statement, so a 4 is right.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
douyin_publish_noteA
发布一条抖音图文(多图 + 标题 + 正文)。【必须先确认】不传 confirm 调用时,本工具不会发布任何东西,只返回一份待发布计划;请把这份计划(账号、素材、标题、正文、标签、发布时间)原样念给用户,得到用户明确同意后,再用同一个 plan_id 加上 confirm=true 调用一次。不要自己替用户决定发布,也不要跳过确认直接传 confirm。
| Name | Required | Description | Default |
|---|---|---|---|
| bgm | No | 背景音乐**搜索词**(可选),如「轻快 纯音乐」;不是文件路径。 | |
| note | No | 图文正文(可选)。与 note_file 只能给一个。 | |
| tags | No | 话题标签(可选) | |
| title | Yes | 图文标题(≤30 字,单行) | |
| images | Yes | 图片路径列表(必须在素材目录内),抖音最多 35 张、不支持 GIF | |
| account | Yes | 账号名 | |
| confirm | No | 用户已明确同意发布时传 true | |
| plan_id | No | 上一步预检返回的 plan_id(确认发布时必填) | |
| schedule | No | 定时发布时间(可选),格式 'YYYY-MM-DD HH:MM' | |
| note_file | No | 把正文放在文件里(可选,素材目录内的 .txt/.md 路径)。长正文建议用这个。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the critical behavior: a confirm-less call is a dry run that publishes nothing and returns a plan. However it omits auth/account prerequisites, failure behavior, and what happens to a scheduled post after acceptance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the confirmation constraint are front-loaded, and every sentence carries an instruction. It is slightly verbose and repetitive with the bolded warning markers, which costs a point but not comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description explains what the first call returns and how to proceed, which is the key gap to fill for a two-phase publisher. Missing pieces such as account/login prerequisites and error handling keep it short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The description goes beyond the field-level text by explaining the call-to-call relationship between plan_id and confirm, which the schema states only in isolation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 发布一条抖音图文(多图 + 标题 + 正文). The 图文 qualifier cleanly separates it from the sibling douyin_publish_video, so an agent can pick the right publisher without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the workflow: first call without confirm publishes nothing and returns a plan; read the plan to the user, obtain explicit consent, then call again with the same plan_id plus confirm=true. It also states an exclusion — do not pass confirm=true directly or decide on the user's behalf.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
douyin_publish_videoA
发布一条抖音视频。【必须先确认】不传 confirm 调用时,本工具不会发布任何东西,只返回一份待发布计划;请把这份计划(账号、素材、标题、正文、标签、发布时间)原样念给用户,得到用户明确同意后,再用同一个 plan_id 加上 confirm=true 调用一次。不要自己替用户决定发布,也不要跳过确认直接传 confirm。
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | 视频文件路径(必须在素材目录内,可用相对路径) | |
| tags | No | 话题标签(可选),如 运动、训练 | |
| title | Yes | 作品标题(≤30 字,单行) | |
| account | Yes | 账号名 | |
| confirm | No | 用户已明确同意发布时传 true | |
| plan_id | No | 上一步预检返回的 plan_id(确认发布时必填) | |
| schedule | No | 定时发布时间(可选),格式 'YYYY-MM-DD HH:MM'(本地时间);不传=立即发布 | |
| collection | No | 加入已存在的合集名(可选)。合集必须已存在,否则脚本找不到就跳过。 | |
| declaration | No | 作品自主声明(可选),要填平台给出的**原样文案**(如「虚构演绎,仅供娱乐」);不确定就别传。 | |
| description | No | 正文/描述(可选) | |
| product_link | No | 带货商品链接(可选)。★ 必须与 product_title 一起给,只给一个平台不认。 | |
| product_title | No | 带货商品标题(可选,与 product_link 成对) | |
| thumbnail_portrait | No | 竖版封面 3:4(可选,素材目录内的路径)。与 landscape 可同时给。 | |
| thumbnail_landscape | No | 横版封面 4:3(可选,素材目录内的路径)。 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it discloses the single most important trait: without confirm the tool publishes nothing and only returns a plan. It also scopes what the returned plan contains (account, assets, title, body, tags, publish time). It does not cover auth requirements, failure modes, or what happens if plan_id is stale, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical constraint (does not publish without confirm) is front-loaded in bold, and every sentence serves the confirmation protocol. Slightly long, and the closing '不要自己替用户决定发布' partially restates the earlier consent requirement, but overall tight for a high-risk write tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter write tool with no annotations and no output schema, the description supplies the necessary behavioral contract and explicitly enumerates the plan fields the agent will receive, compensating for the missing output schema. Remaining gaps (auth, error handling) are moderate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema for the confirm/plan_id pair: it explains the idempotent two-step reuse of plan_id and that the plan must be echoed to the user first. Other parameters are left to the schema, which is acceptable at full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('发布一条抖音视频') that an agent can immediately distinguish from the sibling douyin_publish_note (note vs. video). No ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit two-phase protocol: call without confirm to get a plan, read the plan back to the user verbatim, obtain explicit consent, then re-call with the same plan_id and confirm=true. It also states what NOT to do (don't decide for the user, don't skip confirmation). This is textbook when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
douyin_search_videosA
按关键词搜索抖音视频(需要已登录)。返回每条作品的 aweme_id、文案、作者(昵称 + sec_user_id)、互动数据和无水印直链。★ 直链有时效(几小时),要保存就当场下载;本工具只返回地址,不落盘。搜到的 aweme_id 可以喂给 douyin_video_detail 看详情,sec_user_id 可以喂给 douyin_user_profile。
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | 排序:general=综合(默认)、like=最多点赞、latest=最新 | |
| count | No | 返回条数(默认 10,最多 20) | |
| account | No | 账号名(social-auto-upload 里登录时用的名字)。不传则用默认账号(SAU_ACCOUNT,兜底 main)。 | |
| keyword | Yes | 搜索关键词 | |
| publish_time | No | 发布时间范围:all=不限(默认)、day=一天内、week=一周内、half_year=半年内 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses the login prerequisite, that links are watermark-free and time-limited (几小时), and that the tool only returns URLs without persisting files. This is meaningful operational context an agent needs to act correctly, though it says nothing about rate limits or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single dense paragraph with the core search purpose front-loaded, followed by return fields and the expiry caveat. Every clause earns its place, though the return-field enumeration is slightly list-like and could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description correctly enumerates the return fields (aweme_id, 文案, author, interaction data, watermark-free link) and adds the critical link-expiry caveat. Combined with the login requirement and follow-up routing, an agent has everything needed to call and use the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (sort, count, account, keyword, publish_time) are already documented with defaults and enum meanings. The description adds no parameter-level detail beyond the schema, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (搜索/search) and resource (抖音视频/Douyin videos) scoped by keyword, and explicitly differentiates from downstream siblings like douyin_video_detail and douyin_user_profile by naming what each returned id feeds into. An agent can identify this as the discovery entry point without opening any other tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: it requires an active login, returns only addresses (不落盘), and routes follow-up work to douyin_video_detail and douyin_user_profile. It does not explicitly state when NOT to use it, but since no sibling competes as a search tool, the guidance is effectively complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
douyin_user_profileA
看某个抖音用户的主页信息:昵称、抖音号、简介、IP 属地、性别、粉丝/关注/获赞/作品数,并按需返回他最近的作品列表(需要已登录)。sec_user_id 从 douyin_search_videos / douyin_video_detail 的作者字段里拿(形如 MS4wLjABAAAA…)。
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 作品条数上限(默认 20,最多 100) | |
| account | No | 账号名(social-auto-upload 里登录时用的名字)。不传则用默认账号(SAU_ACCOUNT,兜底 main)。 | |
| sec_user_id | Yes | 用户安全 id(MS4wLjABAAAA… 开头) | |
| include_videos | No | 是否同时返回他的作品列表(默认 true;只看资料传 false 更快) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the login requirement ('需要已登录'), which is the key operational trait, but omits whether the call is read-only, pagination/rate-limit behavior, or what happens on a stale/invalid sec_user_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence, front-loaded with the purpose followed by the return fields and the login caveat. Nothing is wasted, though the chained parentheticals make it slightly less scannable than a two-sentence layout.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned profile fields and noting the optional works list plus the login prerequisite. An agent has enough to call it correctly, though read-only status and error/failure behavior remain unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value beyond the schema by specifying the sec_user_id format (MS4wLjABAAAA…) and its source in sibling tools, which helps the agent obtain a valid value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('看某个抖音用户的主页信息') and enumerates the exact fields returned (昵称、抖音号、简介、IP 属地、粉丝/关注/获赞/作品数). It also flags the optional works list. It does not explicitly contrast with the sibling douyin_my_profile, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete context: this needs a login to return the works list, and explains where to obtain sec_user_id (from the author field of douyin_search_videos / douyin_video_detail). It does not state when NOT to use it or name an alternative tool, so no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
douyin_video_detailA
取单条抖音作品的详情:文案、作者、发布时间、互动数据、封面、无水印播放直链、以及分享页地址(需要已登录)。aweme_id 从 douyin_search_videos / douyin_user_profile / 分享链接里拿。
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | 账号名(social-auto-upload 里登录时用的名字)。不传则用默认账号(SAU_ACCOUNT,兜底 main)。 | |
| aweme_id | Yes | 作品 id(15~25 位数字) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does disclose the key trait that login is required before this call succeeds. It also implies a read-only retrieval and highlights a watermark-free direct link as a distinguishing output. It omits failure modes when unauthenticated, rate limits, and pagination/return shape details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the returned fields and followed by the prerequisite and ID source. No filler, no restatement of the tool name, and the bolded key output is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no output schema, the field enumeration substitutes well for a documented return contract, and the login prerequisite is captured. Missing only error/edge behavior (unauthenticated failures, expired login) that an agent would need before invoking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by specifying the provenance of aweme_id (from search results, user profile, or a share link), which helps the agent source the required value correctly. The account parameter's default behavior is already documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (retrieve a single Douyin work's details) and enumerates the exact payload: caption, author, publish time, engagement data, cover, watermark-free play link, share page URL. This distinguishes it from siblings like douyin_search_videos and douyin_user_profile, which return lists rather than one work's detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent the precondition ('需要已登录') and where aweme_id comes from (douyin_search_videos / douyin_user_profile / share link), which is real routing guidance to sibling tools. It stops short of an explicit when-not-to-use or a note on choosing douyin_parse_share_link for URLs, so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.2.0- First observed
douyin_account_login - First observed
douyin_account_logout - First observed
douyin_account_status - First observed
douyin_my_profile - First observed
douyin_parse_share_link - First observed
douyin_publish_note - First observed
douyin_publish_video - First observed
douyin_search_videos - First observed
douyin_user_profile - First observed
douyin_video_detail
TDQS
Scored across 10 tools
Each tool has a distinct purpose (account ops, publishing, browsing), and descriptions clarify tricky pairs like my_profile vs user_profile (self vs other) and publish_video vs publish_note (video vs image post). Minor overlap remains: douyin_parse_share_link internally duplicates douyin_video_detail's behavior, and the two profile tools could be momentarily confused, but the text disambiguates well.
All names share the douyin_ prefix and snake_case, grouped logically into account_*, publish_*, and entity lookups. The pattern is not uniform though: verb_noun (publish_video, search_videos, parse_share_link), noun_noun (account_status, video_detail, user_profile), and noun_verb (account_login, account_logout) all mix, which is readable but not a single predictable convention.
10 tools is well-scoped for a publish-and-browse server, with each tool earning its place: account lifecycle (3), publishing (2), and content/user browsing (5). No redundancy and no thinness.
Covers the full core lifecycle: login status/login/logout, publish video and image-note (with a safe plan/confirm flow), and rich browsing (search, detail, user/self profiles, share-link parsing). Gaps are minor—no management of already-published works (delete/edit), comments, or interactions—but core agent workflows are covered.
Maintenance
Related MCP Connectors
Agent social posting via your logged-in Chrome. Remote MCP + OAuth. Not clawpost.dev.
MCP server for QPost — lets AI agents publish video and image posts to YouTube, TikTok, Instagram.
AI social media team for founders: make and publish posts, carousels and short video to LinkedIn, X, Instagram, TikTok, YouTube, Facebook, Threads, Reddit and Bluesky, from any agent. OAuth sign-in, no API key; every draft waits for approval.
Remote MCP server for China brand visibility, destination demand, and KOL discovery workflows.
Related MCP Servers
- 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-
- AlicenseDqualityCmaintenanceProvides access to Douyin (TikTok China) API for searching videos, retrieving user profiles, posts, comments, music, challenges, live streams, and hot trends through the Douyin platform.279MIT
- 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.102 npm6MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to automatically upload videos to Douyin (TikTok China) creator platform, supporting login, video upload with title/description/tags, and session management.19 npm35MIT