跳到主要内容
免费查查 ChatGPT / DeepSeek / Google AI 怎么评价你的品牌立即体验
DOC-08 · 开放平台与 MCP最近更新:2026-10-22

siseo Agent Gateway:边缘 Markdown 与 WebMCP 一键部署指南

在 Cloudflare 边缘为 AI 智能体与 AI 爬虫提供内容一致的 Markdown 版本,并通过 navigator.modelContext(预览 API)注册只读工具,让独立站与内容站以更低 Token 成本被智能体理解与调用。

1. 工作原理与部署前提

siseo Agent Gateway 由两部分组成:边缘 Markdown 层与 WebMCP 工具层。边缘 Markdown 层运行在 Cloudflare Worker 中,当请求头包含 `Accept: text/markdown` 或来自已验证的 AI 爬虫时,返回与 HTML 事实一致的精简 Markdown;WebMCP 工具层通过页面脚本向浏览器内智能体注册结构化工具。

据 Surfer 2026 趋势报告,边缘 Markdown 可将博客页从约 16,180 tokens 降至 3,150 tokens,结构化工具调用可将智能体单次交互开销从 2,000+ tokens 降至 20-100 tokens。部署前请确认站点已接入 Cloudflare,且 HTML 正文在服务端渲染输出。

  1. 1在控制台「出海独立站专席 → Agent Gateway」中绑定站点域名,系统会生成 Worker 脚本与 WebMCP 工具定义。
  2. 2在 Cloudflare 控制台创建 Worker,并为需要的路径(如 `/blog/*`、`/products/*`)配置路由。
  3. 3部署后使用 `curl -H "Accept: text/markdown"` 验证 Markdown 输出,并确认响应头包含 `Vary: Accept`。
  4. 4在页面模板中引入 WebMCP 注册脚本,在支持预览的 Chrome 版本中验证工具是否可被发现。

2. Cloudflare Worker 边缘 Markdown 示例

以下示例通过 `Accept` 请求头与 AI 爬虫 User-Agent 判断是否返回 Markdown。Markdown 由源站预生成的 `.md` 版本提供(例如 Next.js 在构建时输出),以保证与 HTML 的事实一致性。生产环境建议结合 IP 段或反向 DNS 校验 AI 爬虫身份,避免仅依赖 UA 字符串。

务必设置 `Vary: Accept` 响应头,防止 CDN 把 Markdown 版本缓存后返回给普通浏览器;同时保留 `Link: <...>; rel="canonical"` 指向 HTML 页面,避免 Markdown 版本被当作独立页面索引。

worker/agent-gateway.tstypescript
const AI_CRAWLER_UA = /(GPTBot|ChatGPT-User|OAI-SearchBot|ClaudeBot|Claude-User|PerplexityBot)/i;

export default {
  async fetch(request: Request): Promise<Response> {
    const url = new URL(request.url);
    const accept = request.headers.get("Accept") ?? "";
    const ua = request.headers.get("User-Agent") ?? "";
    const wantsMarkdown =
      accept.includes("text/markdown") || AI_CRAWLER_UA.test(ua);

    if (!wantsMarkdown || request.method !== "GET") {
      return fetch(request);
    }

    // 源站在构建时为每个页面输出同路径的 index.md(内容与 HTML 事实一致)
    const mdPath = url.pathname.replace(/\/$/, "") + "/index.md";
    const mdResponse = await fetch(new URL(mdPath, url.origin).toString(), {
      cf: { cacheTtl: 3600, cacheEverything: true },
    });

    if (!mdResponse.ok) {
      return fetch(request); // 无 Markdown 版本时回退到 HTML
    }

    const headers = new Headers(mdResponse.headers);
    headers.set("Content-Type", "text/markdown; charset=utf-8");
    headers.set("Vary", "Accept, User-Agent");
    headers.set("Link", "<" + url.toString() + '>; rel="canonical"');
    headers.set("X-Agent-Gateway", "siseo");
    return new Response(mdResponse.body, { status: 200, headers });
  },
};

3. WebMCP 工具注册示例(预览 API)

WebMCP 目前处于预览阶段(Chrome 146 起提供预览支持),`navigator.modelContext` 的接口名称、参数结构与权限模型可能随规范演进而调整,以下代码仅用于演示思路,请以 Chrome 与 W3C 社区组发布的官方规范为准,并始终先做特性检测。

建议首批只注册只读工具,例如商品规格查询与库存查询;涉及加购、下单等写操作时,必须在工具实现中要求用户显式确认,并在服务端做好鉴权与限流。

public/webmcp-tools.tstypescript
// ⚠️ 预览 API:接口可能变化,请以官方 WebMCP 规范为准
type ModelContextLike = {
  registerTool?: (tool: {
    name: string;
    description: string;
    inputSchema: Record<string, unknown>;
    execute: (input: Record<string, unknown>) => Promise<unknown>;
  }) => void;
};

const modelContext = (navigator as Navigator & { modelContext?: ModelContextLike })
  .modelContext;

if (modelContext?.registerTool) {
  modelContext.registerTool({
    name: "get_product_specs",
    description: "查询当前商品的规格参数、价格区间与认证信息(只读)",
    inputSchema: {
      type: "object",
      properties: { sku: { type: "string", description: "商品 SKU" } },
      required: ["sku"],
    },
    async execute(input) {
      const res = await fetch("/api/agent/specs?sku=" + encodeURIComponent(String(input.sku)));
      return res.json();
    },
  });

  modelContext.registerTool({
    name: "check_inventory",
    description: "查询指定 SKU 在目标国家的库存与预计发货时间(只读)",
    inputSchema: {
      type: "object",
      properties: {
        sku: { type: "string" },
        country: { type: "string", description: "ISO 3166-1 国家代码,如 US" },
      },
      required: ["sku", "country"],
    },
    async execute(input) {
      const qs = new URLSearchParams({ sku: String(input.sku), country: String(input.country) });
      const res = await fetch("/api/agent/inventory?" + qs.toString());
      return res.json();
    },
  });
}

4. 配置项与上线验证

Agent Gateway 的行为可在控制台或 Worker 环境变量中调整。上线后建议在服务器日志与 Gateway 调用日志中持续观察 AI 爬虫抓取量、Markdown 命中率与 WebMCP 工具调用次数,并与 AI 引荐流量变化对照分析。

  1. 1执行 `curl -s -H "Accept: text/markdown" https://你的域名/blog/示例文章` 确认返回 Markdown 且事实与 HTML 一致。
  2. 2执行普通浏览器请求,确认仍返回 HTML 且未命中 Markdown 缓存。
  3. 3在支持 WebMCP 预览的 Chrome 中打开商品页,确认工具可被发现且返回结构化结果。
  4. 4在控制台开启 Gateway 告警,当 Markdown 回源失败率超过 5% 时通过 Webhook 通知。
配置项默认值说明
MARKDOWN_PATHS/blog/*,/docs/*,/products/*启用边缘 Markdown 的路径模式,逗号分隔
AI_UA_ALLOWLISTGPTBot,ClaudeBot,PerplexityBot按 UA 返回 Markdown 的 AI 爬虫列表,建议配合 IP 校验
MD_CACHE_TTL3600Markdown 版本边缘缓存秒数,内容更新后可通过 Webhook 清除
WEBMCP_TOOLSget_product_specs,check_inventory注册到 navigator.modelContext 的工具列表
WEBMCP_WRITE_ENABLEDfalse是否允许写操作工具(加购 / 下单),开启后强制用户确认

相关资讯与教程