付费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认证、成本控制和工具设计上的关键决策。

薄代理架构:一个刻意的设计选择
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连接,客户用正常账户登录,永远不需要复制密钥。流程如下:
- 无token访问
/mcp会收到401响应,附带指向授权服务器的resource_metadata指针 - 客户端通过动态客户端注册或客户端ID元数据文档进行注册
- 强制使用PKCE,仅支持S256
- 客户进入仪表盘的同意页面,选择完全访问或只读
- 背后对应四个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助手获得执行能力时,安全边界的设计比功能本身更重要。 薄代理架、成本预览、乐观锁和工具取舍,都是为了让模型的能力在可控范围内发挥。
相关推荐

一句提示词引发的全球PHP安全风暴:AI是救星还是隐患?
一句AI提示词竟引发全球PHP安全危机,维基百科、互联网档案馆受波及。本文梳理事件脉络,解析OpenAI与亚马逊的争议,探讨AI时代漏洞发现门槛降低带来的安全悖论与开发者应对策略。

当AI被拿走:依赖捷径如何削弱你的解题韧性
一项涉及1,222人的研究发现:使用AI答题后,一旦AI被移除,人们放弃解题的比例高于从未使用AI的对照组。文章分析AI依赖对学习韧性和元认知的影响,并探讨AI学习工具的设计启示。

Carta联手NewView:让创业公司员工提前套现股权
Carta 与 NewView Capital 合作推出新计划,简化创业公司 tender offer 流程,帮助员工提前出售股权套现。本文分析该合作的核心机制、员工股权流动性痛点及对创业公司股权激励的影响。