jianshuo/wjs-voicedrop
VoiceDrop 的入口。所有能力都在 MCP 里(voicedrop.cn/mcp,32 个工具:文章读写与版本、文风与蒸馏、挖矿与重写、社区与投币、算力、分享/公众号/小红书)。本 skill 只做一件事——把你接上那个 MCP:用它的 login 工具做 6+4 手机配对登录拿到令牌,然后接进客户端。触发词:"voicedrop"、"登录 voicedrop"、"voicedrop 登录"、"接 voicedrop mcp"、"voicedrop token"、"/wjs-voicedrop"。
npx skills add https://github.com/jianshuo/claude-skills --skill wjs-voicedrop
VoiceDrop 的全部能力都在 MCP 里。这个 skill 唯一的作用,是把你接上去。
会话里已经有 list_articles、read_style、community_feed、credit_balance 这些工具?
接上了。停止阅读本文件,直接用工具。
工具自带完整说明(参数、语义、花不花算力都写在描述里)。本文件有意不重复它们——重复就会漂移:改了 MCP 忘了改这里,你就会照着过期的文档干活。单一真源是 MCP 自己。
没接上的话,往下走。全程两步:登录拿令牌 → 接进客户端。
login 工具,6+4 手机配对)一个工具,调两次。 靠字段分辨阶段——第一步只传 code,第二步只传 verify_code + pairing:
login(code="a3f2b1") → 手机弹出 4 位码,返回 pairing 句柄
login(verify_code="7391", pairing="…") → 返回 anon_ 令牌
为什么两次往返省不掉:4 位码是服务端在第一步才随机生成的——第一步之前它不存在。而且它是安全性的核心:6 位码可能同时匹配多个账号(最多 10 个),服务端给每个候选推不同的 4 位码。报对了,才同时证明「手机在你手上」和「你要的是哪个账号」。省掉它,猜个 6 位码 + 手机上误点一下就能被接管。
login 是唯一免 token 的工具(要 token 才能登录、要登录才能拿 token,那是死锁)。所以不必先接 MCP,也不必装任何东西——curl 直接打端点:
VD=https://voicedrop.cn/mcp
call() { # $1=工具名 $2=参数 JSON
curl -s -X POST "$VD" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"$1\",\"arguments\":$2}}" \
| python3 -c "import json,sys;r=json.load(sys.stdin)['result'];t=r['content'][0]['text'];print('ERR: '+t if r['isError'] else t)"
}
call login '{"code":"a3f2b1"}'
# → {"pairing":"…", "next":"看手机——App 里会弹出一个 4 位数字码…"}
call login '{"verify_code":"7391","pairing":"<上一步返回的 pairing 原样粘回来>"}'
# → {"token":"anon_…", "scope":"users/anon-…/", "next":"…"}
| 报错 | 含义 / 怎么办 |
|---|---|
| 没找到这个账号 | 6 位码抄错,或手机离线/未登录该账号 |
| 验证码不对,还能再试 N 次 | 4 位码错了。配对还活着,报个对的重调一次 login 就行,别重来 |
| 验证码不对,还能再试 ? 次 | 注意那个 ? —— 它说明配对已经不存在了(多半超过 2 分钟过期),必须重新发起,不是码错 |
| 手机没有响应 | 手机没放行。让用户点「确认登录」推送,或把 App 切回前台 |
| 你在手机上点了「不是我」 | 用户拒绝了这次登录 |
login 返回的是账号的完整密钥(anon_…)——不可吊销、不会过期,谁拿到它就拥有该账号的全部权限。而且它会进入模型上下文和会话记录。别贴到任何公开的地方。
> 不想走配对?App 里 设置 → 账户 → 访问令牌 可以直接复制,效果一样。
claude mcp add voicedrop --transport http https://voicedrop.cn/mcp \
--header "Authorization: Bearer <上一步拿到的 token>"
其它客户端(Claude 桌面版自定义连接器等):URL 填 https://voicedrop.cn/mcp,自定义头填 Authorization: Bearer <token>。
接上后用 /mcp 确认工具已加载,然后正常使唤即可,不用再回到本文件。
令牌的能力边界(决定了哪些工具会报错):
| 令牌 | 限制 |
|---|---|
| anon(6+4 配对 / App 复制的) | 不能发社区、不能投币——那需要 Apple 或微信登录后的身份 |
| Apple / 微信 session | 全功能 |
碰到 需要 Apple 登录 之类的报错,就是这个原因:让用户在 App 里用 Apple/微信登录,再重新复制令牌。
上传录音/照片这类二进制文件。
这是物理限制,不是偷懒:MCP server 跑在远端,读不到你本地的文件;唯一的办法是把文件 base64 塞进模型上下文——几 MB 的二进制流进 LLM,是灾难。
正常路径是在 App 里录。真要从命令行传:
# 文件名必须纯 ASCII;leaf 是 VoiceDrop-*.m4a 会自动触发挖矿
curl -s -X PUT -H "Authorization: Bearer <token>" -H "Content-Type: audio/mp4" \
--data-binary @rec.m4a \
"https://jianshuo.dev/files/api/upload/VoiceDrop-<ts>-<dur>-<weekday>-<period>.m4a"
传完用 MCP 的 trigger_mining 催一下,list_articles 看结果。
MCP 源码:~/code/jianshuo.dev/mcp/(README.md 讲了架构和几个不显然的约束)。
Take jianshuo/wjs-voicedrop from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.