wjs-voicedrop — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited wjs-voicedrop (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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 讲了架构和几个不显然的约束)。
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.