feat(sms): 新增无状态短信 MCP API 服务 - #434
Conversation
cuericlee
left a comment
There was a problem hiding this comment.
- safe_result 会破坏 GetUploadTosURL 返回的签名上传 URL
client.py 的 safe_result 会把结果中所有字符串里出现的 credentials.access_key / secret_key / session_token 子串替换为 [REDACTED]。而短信服务 GetUploadTosURL 返回的 TOS 预签名 URL(如 ...?X-Tos-Credential=/...&X-Tos-Signature=...)明文包含 AccessKeyId,经过 safe_result 后 URL 会被替换成 [REDACTED],客户端拿到的地址是坏的 —— 这直接断掉 README 主推的"群发 CSV 上传"流程。
测试里 mock 的 url 是 https://upload.example/fixture.csv?signature=opaque,不含 AK,所以没暴露。建议:
对签名 URL 类字段(url/fileUrl)跳过子串替换,或只对查询参数里的凭证字段做解析脱敏;
补一条"上传 URL 含 AK 时不被破坏"的单测。
🟠 中优先级建议
2. 4xx 写操作被误标为 outcome_unknown
decode() 中非 JSON body 的 401/403/400(网关直接返回纯文本错误)会落入 not response.is_success 分支 → 写操作返回 outcome_unknown=True。鉴权失败/参数错误是确定性失败,标成"结果未知"会误导客户端(例如重复提交、错误排查)。建议:4xx 一律 outcome_unknown=False(明确失败),只有 5xx/超时/连接断开才标未知。
- 每次 API 调用新建 httpx.AsyncClient,无连接复用
SmsClient.call() 每次请求都 async with httpx.AsyncClient(...),等于每次重新建连接/TLS 握手。短信是高吞吐场景,建议把 AsyncClient 提升为实例/模块级共享(用 transport 注入测试不受影响)。
- 资质扩展 Action 属于"按契约假设"接入,需真实账号联调确认
GetOCRLicenseForAgent、ThreeElement*CheckForAgent、ApplySignatureIdentificationForAgent 等不在官方 volcengine-python-sdk 的 volcsms 覆盖内(README 也承认)。建议合并前至少用真实账号跑一遍只读接口(list_message_groups / list_qualifications / get_qualification_requirements),或在 README 里明确标注这些工具为 experimental。
新增
mcp-server-sms独立包,将现有短信 OpenAPI 暴露为 26 个 MCP 工具,覆盖消息组、资质、签名、模板、发送、普通群发和结果查询。每个业务工具接收完整参数,直接调用对应接口;客户端负责交互和用户确认,短信服务负责业务校验及业务数据。实现
0.1.0,接入仓库现有构建与 PyPI 发布流程。outcome_unknown。Result.url保持完整,包括签名中的 AK/STS 参数;其他结果字段继续脱敏。验证
git diff --check、wheel/sdist 构建及 Twine 检查通过。152ded3已完成真实账号只读验收,消息组、资质要求、资质、签名、模板、二级模板、发送日志共 7 项成功。本次修复完成了模拟 API 和本地协议测试,尚未重复真实账号验收。待验收
仓库中不含验收账号、手机号、凭据或材料。