为导游做远程 MCP 服务器:百个工具加 OAuth,六个必踩的坑
AdPitiful4816 · reddit · 2026-10-03
Your Next Tours(导游用手机向旅行团直播讲解音频的应用)团队发布了远程 MCP 服务器,让导游把行程 PDF 丢进 Claude、ChatGPT 或 Cursor,通过工具调用自动生成行程、出发计划和客人名单。端点走 Streamable HTTP 无状态模式,认证用 OAuth 2.1 + PKCE(自托管 Ory Hydra),支持每用户 API key。
他们总结的踩坑经验,对任何自建 MCP 服务器的人都有直接参考价值:
- 无状态服务器对 GET 返回 405 而非 404:404 会让 Cursor 和 Gemini CLI 误报「无法打开 SSE 流」而放弃;405 加 Allow: POST 客户端才能正常继续
- 未授权必须返回真正的 401:要触发 Claude 的 OAuth 流程,需要 401 状态码带 WWW-Authenticate: Bearer resourcemetadata=...;同样的 header 放在 200 上会被忽略。非法 UUID 的 sub 必须在进数据库前拒绝,否则返回 400 会导致客户端不再重新授权
- 部分客户端从 AS 而非资源服务器读取 scopes:Gemini CLI 会忽略 RFC 9728 资源元数据里的 scope 声明,改用 AS 的 openid-configuration 中的 scopessupported;Hydra 默认只有 openid offline,导致同意页为空。修复:两处 scope 列表保持一致,且不要在 AS 放全量目录,否则 consent 会预检包括暴露客人 PII 的 scope
- 写工具必须显式声明 annotations:按规范缺失 destructiveHint 即为 true,他们希望漏写时启动即报错而非静默变成「安全」工具;Claude 和 ChatGPT 的目录审核会逐工具检查
- 在 initialize.instructions 里告诉模型它在与谁对话:工具按 scope/角色/套餐过滤后,缺工具时模型会编造理由;现在写入账号、组织、角色、套餐和已授 scope,模型能给出真实原因
- 模型会用虚构内容填空表单:要求「搭公司官网」时模型不问一个问题就填满虚构内容;现在 getwebsiteoverview 返回待确认问题清单,并禁止编造价格、牌照号、评价和地址
Scope 设计上,每个工具(含只读)都需要 scope,写行程永远不能通知客人,群发邮件类操作是独立 scope,客人名单默认脱敏、取全量需显式参数并记录日志。
「编程与Agent」频道最新
- GPT 写的是「屎山代码」?RL 奖励错配或毁掉工程质量 — xiaohu · 2026-10-03
- Reddit 开发者用 Hermes 定时任务自动处理 Sentry 生产报错,痛点不少 — pauljasperdev · 2026-10-03
- Runway MCP 15 分钟一条企业培训视频,传统制作费约 1 万美元 — tlakomy · 2026-10-03
- 一人研究公司怎么搭 AI 系统:渐进式确定性架构 — otionflow · 2026-10-03
- 写完才想起查上游:v3.9.0 已有 CLI+MCP,SmartSub 作者删光重造轮子 — lxfater · 2026-10-03
- 爆料:Meta 内部代号 Forge 的 Agent Engine 正在开发中 — testingcatalog · 2026-10-03