[控场AI]
· 7 分钟阅读· 3,780 字

付费SaaS如何构建MCP服务器:OAuth、成本预览与工具取舍

付费SaaS如何构建MCP服务器:OAuth、成本预览与工具取舍

Traffic Creator 分享为付费 SaaS 构建 MCP 服务器的架构、工具设计、认证与安全决策。

Traffic Creator 团队为其付费 SaaS 产品搭建 MCP 服务器,让 Claude 和 ChatGPT 用户能用自然语言管理广告活动。文章分享了四个关键决策:采用薄代理架构,所有权限、速率限制和日志集中在底层 API;34 个工具按用户提问方式而非数据库结构组织;用 READ/SPEND/CHANGE/STOP/MESSAGE 注解标记风险等级,让 AI 客户端决定何时请求用户确认;通过 settings_version 乐观锁避免助手覆盖仪表盘上的修改。认证方面对 Claude、ChatGPT 使用 OAuth(PKCE、令牌轮换),对终端工具保留 API 密钥,并提供只读模式。团队还刻意省略删除、克隆、购买积分等高危工具,并给出四条面向付费产品构建 MCP 服务器的经验。

当AI助手能帮用户创建活动时,它也能花掉用户的钱。Traffic Creator团队最近为其付费SaaS产品搭建了MCP服务器,让Claude和ChatGPT用户可以通过自然语言查询和管理广告活动。这篇文章分享了他们在OAuth认证、成本控制和工具设计上的关键决策。

付费SaaS构建MCP服务器

薄代理架构:一个刻意的设计选择

Traffic Creator的MCP服务器没有数据库访问权限,除了一个短暂的密钥缓存外不保存任何状态。每个工具都只是一个调用/api/v1/account路由的小函数,使用调用者自己的凭证并返回JSON。

这个看似无聊的决定其实是整个项目最重要的架构选择。 所有权检查、余额检查、速率限制(每分钟60次读取和10次变更)、只读范围和活动日志全部集中在API层。这意味着一个工具无法执行客户API密钥权限之外的任何操作。当API中的规则被修复时,所有AI助手会同时获得修复,不需要单独部署。

API和MCP服务器独立部署的另一个好处是:服务器可以隐藏路由尚未上线的工具,而不是提供一个会报错的接口。

MCP(Model Context Protocol) 是 Anthropic 于 2024 年底推出的开放协议,用于让 AI 助手(如 Claude、ChatGPT)以标准化方式连接外部工具与数据源。可以将它理解成"AI 世界的 USB-C 接口":客户端负责发起对话与展示,服务器负责暴露一组命名工具(tools),模型通过 JSON-RPC 风格的调用请求执行这些工具。MCP 服务器本身不承担业务逻辑,业务规则应留在底层 API 中——这正是薄代理架构的由来。Token 则代表用户授予客户端的访问凭证,常见形式有不透明的随机字符串和 JWT,前者便于即时撤销。

工具设计跟随用户问题,而非数据库表结构

最初的想法是让MCP工具与API路由一一对应,但这样做出来的体验像是在读数据库schema。客户不会问"给我带日期范围的项目分析",他们会问"哪个活动落后了"或"上周和上上周对比如何"。

团队最终将34个工具按用户提问方式分组:读取数据、排名、单活动分析、价格与成本预览、创建、修改/暂停/恢复、积分与账单、支持工单、账户管理。

每个工具的描述都专门为模型编写:返回什么内容、使用什么单位、时区(UTC)、以及何时应该使用其他工具。由于AI助手会在工作时展示工具名称,这些名称对客户而言也必须直观,比如get_campaign_stats、preview_campaign、pause_campaign。

注解机制决定应用何时请求确认

MCP允许服务器为每个工具添加提示注解:只读、破坏性、幂等和开放世界。团队使用了五种组合:

  • READ:只读,非破坏性,幂等
  • SPEND:变更操作,破坏性,非幂等(如创建活动)
  • CHANGE:变更操作,破坏性,幂等(如恢复和更新活动)
  • STOP:变更操作,非破坏性,幂等(如暂停活动)
  • MESSAGE:用于创建或回复支持工单

创建活动被标记为SPEND,因为它是真正花钱的操作。恢复和更新被归为CHANGE——运行两次不会造成额外损害,但它们可能让活动再次消耗积分,因此也标记为破坏性。Claude、ChatGPT、Claude Code和Codex利用这些提示决定是否在调用前询问用户。

暂停操作被标记为STOP:它确实改变了状态,但只会让账户更省钱,所以不希望应用让用户觉得这个操作很危险。

注解只是对客户端的请求,而非保证。 因此服务器指令也用平实的语言明确说明:在创建活动之前,向用户展示preview_campaign的结果并获得同意。预览会返回哪个钱包付款、活动需要多少积分以及余额是否足够。创建活动本身不花钱,积分按实际交付的访问或验证点击计费,且从不超过余额。

幂等性(idempotency) 指的是同一操作执行一次与执行多次对系统最终状态的影响相同。例如"将活动暂停"重复调用两次结果一样,属于幂等;而"创建活动"每调用一次都会新建一个活动并消耗积分,属于非幂等。MCP 注解中的"破坏性"与"幂等"是两个独立维度:破坏性描述操作是否可能造成难以撤销的后果(如花掉余额),幂等描述重复执行是否安全。理解这两个维度的组合,才能判断某个工具在模型误调用时会产生什么后果,也决定了客户端是否需要在调用前弹窗让用户确认。

乐观锁:防止助手覆盖仪表盘上的修改

用户会同时在仪表盘和AI助手上操作同一个活动。如果助手十分钟前读取了活动信息,而客户之后在仪表盘上做了修改,盲目更新会悄悄撤销客户的更改。

每个活动都带有settings_version。update_campaign必须回传它读取到的版本号,如果活动已被修改,API会拒绝这次变更。助手必须重新读取活动信息后才能再次尝试。

这是标准的乐观锁机制,但在有模型参与的场景中更为重要,因为模型对它们一段时间前读取的状态非常自信。

被刻意省略的工具

团队有意识地排除了一些功能:

  • 删除和克隆活动——一句被误解的话不应该让活动消失,打开仪表盘再操作一次只需要几秒钟
  • 购买积分——没有任何卡片或银行信息经过MCP服务器
  • 账单、支付详情、个人资料或密码相关操作——账单工具只能读取购买记录、退款和订阅信息

只读访问是同意屏幕上的一个选项。选择后,助手可以报告但不能更改或花费任何东西。

双轨认证:OAuth面向Claude和ChatGPT,密钥面向终端

Claude和ChatGPT通过OAuth连接,客户用正常账户登录,永远不需要复制密钥。流程如下:

  1. 无token访问/mcp会收到401响应,附带指向授权服务器的resource_metadata指针
  2. 客户端通过动态客户端注册或客户端ID元数据文档进行注册
  3. 强制使用PKCE,仅支持S256
  4. 客户进入仪表盘的同意页面,选择完全访问或只读
  5. 背后对应四个scope:campaigns:read、campaigns:create、campaigns:update、campaigns:control

Token是不透明的,仅以SHA-256摘要形式存储。访问令牌有效期一小时,刷新令牌三十天且每次使用后轮换。已轮换的刷新令牌再次出现时,整个令牌家族会被撤销(RFC 9700第4.14.2节)。

本机工具如Claude Code、Codex和Cursor可以用同样的方式登录,或使用账户API密钥作为bearer token。更改密码或在API & MCP页面撤销应用,会立即终止该访问权限。

PKCE(Proof Key for Code Exchange,RFC 7636) 是 OAuth 2.0 授权码流程的扩展,用于防止授权码被拦截后遭到滥用。客户端在发起授权时生成一个随机的 code_verifier,并发送它的哈希值 code_challenge;换取令牌时再回传原始 verifier,授权服务器比对哈希是否一致。由于 verifier 从不经过浏览器重定向,即使授权码泄露,攻击者也无法兑换令牌。S256 指使用 SHA-256 做哈希。对 MCP 这类无法安全保存客户端密钥的 AI 应用而言,PKCE 几乎是必需品,因为动态客户端注册场景下很难预先共享密钥。

令牌轮换与家族撤销 是 OAuth 2.0 安全最佳实践(RFC 9700)中的机制:刷新令牌每次使用后立即失效并下发新的刷新令牌。若旧刷新令牌再次出现,说明它可能被窃取并被第三方重放,授权服务器会认为整个"令牌家族"已泄露,将其全部撤销并要求用户重新登录。配合 SHA-256 摘要存储(服务器不保存原始令牌),即便数据库泄露,攻击者也无法直接使用这些令牌。访问令牌一小时、刷新令牌三十天的有效期,是在安全性与用户体验之间做出的常见折衷。

生产环境监控

每次工具调用都会记录工具名、结果和凭证类型,但不记录参数或账户数据。一个小型监控程序每五分钟像客户端一样连接一次,检查tools/list返回的工具数量是否与预期一致,并调用一个读取工具。如果某次部署导致工具丢失或认证失效,团队会在客户之前发现问题。

核心经验总结

Traffic Creator团队给出了四条建议:

  • 在公开API之上构建,而不是在旁边另建一套
  • 为从未见过你产品的读者编写工具描述
  • 把每个花钱的工具都当作用户必须在运行前看到的东西
  • 把不可逆的操作留在UI中

这些经验对任何想为付费产品构建MCP服务器的团队都有参考价值。最核心的洞察是:当AI助手获得执行能力时,安全边界的设计比功能本身更重要。 薄代理架、成本预览、乐观锁和工具取舍,都是为了让模型的能力在可控范围内发挥。

#MCP服务器#付费SaaS#OAuth认证#AI助手集成#成本控制#Claude MCP#ChatGPT MCP#API安全
分享:

相关推荐