先给出一个明确的判断:MCP 的瓶颈从来不是“连不上”,而是“连上之后,模型能不能一口气把活干完”。Grok Build v1.0.17 这次更新之所以值得关注,不是因为又多接了几个 MCP server,而是它开始认真解决“多步输入”这件事。如果你之前试过在编程工具里接 MCP,大概率遇到过这种场景:工具被发现、模型也调用了,但只调一次,然后就急着给结论;你想让它连续完成“读取配置—查依赖—改代码—保存文件”这一串操作,中途必然会断。
这说明一个问题:MCP 生态已经过了“能连”的阶段,正在进入“能把任务执行完”的阶段。单纯把 API 暴露给模型,不等于模型能基于工具结果继续工作。真正的 Agent 工作流,需要工具调用结果能够作为下一步输入,多步衔接、状态保持、上下文不断档。
这篇文章会围绕 Grok Build v1.0.17 的更新展开,重点讲清楚三件事:MCP 多步输入在技术上为什么重要;一个普通开发者如何自建 MCP server,并把多步任务真正跑通;以及“grok build error sending request for url”这类高频报错背后的排查路径。文章不追求覆盖所有 MCP 细节,而是围绕“从能连到能干活”这条主线,提供可以落地的操作和判断。
1. 这次更新真正要解决的问题是什么
如果只看版本号 v1.0.17,很容易把它当成一次例行小更新。但从用户反馈和技术演进方向看,它的核心变化集中在 MCP 工具的“可连续性”上。
1.1 过去 MCP 工具接入的典型尴尬
目前的 AI 编程助手接入 MCP 后,最常出现的抱怨不是“工具识别不到”,而是“识别到了,但不顶用”。
举个例子。你给模型布置一个任务:
- 读取当前目录下的
package.json。 - 查找项目里用了哪些第三方依赖。
- 对照最新版本,判断哪些依赖已经过时。
- 生成一份升级建议并保存为
upgrade-report.md。
如果模型只会调用一次工具,那么它读完package.json后就直接开始“编”答案。结果可能是:依赖版本已经过时了,它却告诉你没问题;它甚至不会调用搜索工具去确认最新版本。
这就是单步工具调用和 Agent 式多步工具调用之间的差距:
| 能力维度 | 单步工具调用 | 多步工具调用工作流 |
|---|---|---|
| 工具数量 | 一次只会调用 1 个 | 可以连续调用多个工具 |
| 结果利用 | 拿到结果后不再深入 | 结果会作为下一步决策的输入 |
| 任务复杂度 | 适合简单查询 | 适合分析、修改、生成类任务 |
| 用户介入 | 每一步基本都要人催 | 一次表达完整意图即可 |
1.2 Grok Build v1.0.17 优化的是什么
从这次更新重点强调“多步输入”来看,xAI 显然意识到了 MCP 工具接入不能只停留在“能力发现”层面。多步输入支持,本质上是在解决 Agent 编排工具时的上下文衔接问题。
简单说:过去模型调完第一个工具,工具返回结果后,模型没有很好地利用这份结果继续规划下一步。更新之后,Grok Build 中的 MCP 工具调用可以形成一条“工具 A → 处理输出 → 工具 B → 处理输出 → 工具 C”的链路,上一轮的输出可以直接成为下一轮调用的参考依据。
这意味着,使用 Grok Build 时,用户可以发出更复杂的工作流指令,而不必在每个工具执行完毕后再追加一次 prompt。
1.3 什么样的开发者最应该关注这次更新
不是所有用户都会对这次更新有感。如果你只是在对话框里做普通问答,不涉及任何外部工具,那么多步输入优化对你的感知可能很小。真正会受益的是下面几类人:
- 把 Grok Build 当编程助手,希望它帮你跨文件查看代码、修改后执行验证。
- 正在尝试用 MCP 把内部系统、数据库、监控平台接入 AI 工作流的开发者。
- 做 Agent 原型验证,想让模型自主完成数据获取、分析和报告生成本地任务的个人开发者。
- 维护开源 MCP server,希望接入不同宿主工具时调用链条更稳定的人。
需要说明的是,本文的代码演示以自建 MCP server 为主。如果你只想接现成的 MCP server,思路完全一致,只是不需要自己写 server 代码。
2. MCP 核心概念与多步输入的技术含义
2.1 MCP 到底是什么,为什么需要它
MCP 的全称是 Model Context Protocol,模型上下文协议。它要解决的是“AI 应用如何接入外部系统和数据”的重复造轮子问题。
在 MCP 出现之前,每个 AI 应用接入工具的模式几乎是各自为政。工具提供方要给 Claude 写一套工具描述,给 OpenAI 写一套 Function Calling 对接逻辑,给其他平台再写一套 SDK。一旦你有三个 AI 客户端,就要做三次适配。
MCP 的思路类似给外部工具规定一个“标准接口”。工具方只需实现一次 MCP server,就能被所有支持 MCP 协议的客户端识别和调用。这也解释了为什么你会看到 Claude Desktop、Cursor、Cherry Studio、Codex,以及今天的 Grok Build 都在向 MCP 靠拢——这一协议正逐渐成为 Agent 连接外部工具的事实标准。
2.2 MCP 中的几个关键角色
理解 MCP 的架构,不需要死记协议细节,只需要搞清楚四个角色:
- Host:运行 AI 模型并组织对话的宿主程序,比如 Grok Build。
- Client:Host 内部的 MCP 客户端,负责与远程或本地 MCP server 建立连接。
- Server:提供工具能力的独立进程,可以读取文件、查询数据库、调用外部 API。
- Tool:Server 暴露出的一个可被模型调用的具体能力。
一次典型的调用过程是:
Grok Build(Host) ↓ MCP Client(协议客户端) ↓ MCP Server(提供能力的外部进程) ↓ Tool(具体函数,如查询 MySQL、读取文件)在这个链路里,模型并不是直接执行工具代码,而是先生成一个“调用意图”,MCP Client 负责把意图翻译成符合 MCP 协议的 JSON-RPC 请求,发给 MCP Server。Server 处理完,再把结果返回给模型。
2.3 MCP server 与普通 HTTP API 的区别
很多人会有疑问:MCP server 不也是提供 API 吗?为什么不能直接用 HTTP 接口?
关键区别在于“可发现性”和“可编排性”。
- 普通 HTTP API:需要提前写清楚接口文档,模型无法自动发现有哪些能力。
- MCP server:通过
tools/list暴露能力清单,工具名称、参数结构、描述都能被模型动态读取。 - 普通 HTTP API:调用逻辑由代码写死,模型只能在预设的代码分支里做选择。
- MCP server:返回的是结构化上下文,模型可以根据返回内容自行决定下一步调用哪个工具。
换句话说,MCP 不仅让工具被“找到”,还让工具能够参与 AI 的推理循环。这也是多步输入能成立的前提。
2.4 多步输入为什么是 MCP 从原型走向工程化的关键
在 MCP 早期,很多接入 Demo 只演示了“模型能不能识别工具”。但真实 Agent 任务往往是多跳的,模型需要先执行查询,再根据查询结果判断下一步。
多步输入支持,可以通俗理解为:模型在连续调用多个 MCP 工具时,不再需要每次都回到“重新理解用户问题”的初始状态,而是能从当前任务进度继续向下推。
举一个现实中的例子。假设你有两个 MCP 工具:
search_docs(query):搜索本地文档库。generate_report(title, content):根据内容生成报告。
普通模式下,模型可能会这样工作:
- 调用
search_docs找到相关资料。 - 显示一段结果。
- 停住等人确认:要不要我生成报告?
而多步模式下,理想表现是:
- 调用
search_docs搜索关键资料。 - 自动基于搜索结果调用第二个工具
generate_report。 - 完成报告生成,直接返回结果路径。
看似只是少了用户一次确认,实际上代表了模型对“工具输出 → 决策 → 工具输入”这条链路的掌握程度。Grok Build v1.0.17 更新后,这类工作流的稳定性是否真正达到可用水平,还需要结合具体任务验证,但至少方向已经明确。
3. MCP 工具接入的常见架构与 error sending request for url 报错根源
在实战之前,有必要先分析一个高频报错。根据网络上的开发者检索趋势,“grok build error sending request for url”是很多人遇到过的问题。
3.1 这个报错发生在哪一层
当 Grok Build 作为 MCP Host 时,如果让它调用一个已经配置好的 MCP server,底层会发起一个 HTTP 或本地进程的请求。当请求无法到达 MCP server 时,就会看到类似 “error sending request for url” 的错误提示。
这个问题通常发生在三种场景中:
- MCP server 配置了一个 HTTP URL,但这个 URL 当前无法访问。
- MCP server 在本地启动,但使用的端口被占用,或者服务进程根本没有被拉起。
- MCP server 地址写的是远程地址,但当前网络环境无法连接该地址,或服务端做了访问限制。
3.2 排查路径
遇到 “error sending request for url”,不要急着怀疑模型能力,先从链路排查:
- 确认 MCP server 进程是否还活着。本地 server 经常因为端口占用或异常退出导致连接失败。
- 确认 URL 是否可以从本机访问。可以在命令行中直接发起请求测试。
# 如果 MCP server 是 HTTP/SSE 模式 curl http://127.0.0.1:8080/mcp # 如果返回内容包含 MCP 相关字段,说明服务基本可用 # 如果连接超时或者拒绝连接,说明 server 没有正常监听- 确认 URL 是否正确。很多 MCP server 的路径不是根路径,而是
/mcp或者/sse。 - 确认是否使用了代理或端口映射。对于本地调试,最稳妥的是使用
127.0.0.1而不是localhost,避免 IPv6/IPv4 解析造成的差异。
3.3 本地开发时推荐的方式:stdio
对于本地开发的 MCP server,推荐使用 stdio 模式而不是 HTTP URL 模式。
stdio 模式下,MCP client 会直接拉起一个本地命令行进程,通过标准输入输出来通信。这种方式的优点是:
- 不占用网络端口。
- 不需要考虑 URL 地址可访问性。
- 与本地文件系统的配合更自然;
- 调试时可以直接在终端观察日志。
当然,如果你的 MCP server 部署在远端,希望客户端通过 HTTP 访问,那么 URL 模式仍然有价值。这时候需要确保服务是真正监听在可路由的地址上,且没有防火墙拦截。
4. 环境准备与最小工程结构
接下来进入实操环节。我们用一个最小示例,把 MCP 多步输入从概念变成可运行的代码。
4.1 环境准备
本文的示例将使用 Node.js 编写 MCP server,因此需要提前安装:
- Node.js 版本推荐 18 及以上。
- npm 或 yarn。
- 一个支持 MCP Client 的宿主工具,例如 Grok Build,或任何支持远程 MCP 配置的客户端。
如果你从没安装过 Node.js,可以到官网下载 LTS 版本。安装完成后,执行node -v验证。
4.2 创建项目目录
建议新建一个单独的工程目录:
mkdir grok-mcp-demo cd grok-mcp-demo npm init -y npm install @modelcontextprotocol/sdk安装完成后,目录结构如下:
grok-mcp-demo ├── node_modules ├── package.json └── server └── index.js在项目根目录下继续创建server目录:
mkdir server4.3 引入官方 MCP SDK
官方@modelcontextprotocol/sdk提供了快速开发 MCP server 的工具类,不需要自己实现 JSON-RPC 底层协议。
如果你不想自己写 server,也可以直接使用社区现成的 MCP server。例如:
- 文件系统操作 server:
@modelcontextprotocol/server-filesystem - 数据库查询 server
- 蓝湖设计稿相关 MCP server
- Figma MCP server
网络搜索显示,这些 MCP server 是开发者目前关注度较高的方向。实际接入时,只需要把你选择的 server 地址或命令填写到宿主工具里即可。下面先演示如何编写一个最简单的 server。
5. 构建一个支持多步串起来的本地 MCP Server
很多 MCP 接入教程只讲配置,不讲 server 实现,导致读者遇到问题时无从下手。这里我们写一个轻量级 Todo 管理 server,它有明确的工具输入和输出,很适合验证“多步输入”的工作流。
5.1 完整代码实现
文件路径:server/index.js
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; let todos = []; let nextId = 1; // 创建 MCP Server 实例 const server = new McpServer({ name: "todo-demo", version: "1.0.0", }); // 注册第一个工具:新增待办 server.tool( "add_todo", { content: { type: "string", description: "待办内容" } }, async ({ content }) => { const id = nextId++; todos.push({ id, content, done: false }); return { content: [ { type: "text", text: `已新增待办,ID=${id},内容:${content}`, }, ], }; } ); // 注册第二个工具:查看待办列表 server.tool("list_todos", {}, async () => { const text = todos .map((item) => `${item.id}. [${item.done ? "已完成" : "未完成"}] ${item.content}`) .join("\n"); return { content: [ { type: "text", text: text || "当前没有待办事项", }, ], }; }); // 注册第三个工具:标记某个待办为完成 server.tool( "complete_todo", { id: { type: "number", description: "要标记完成的待办 ID" } }, async ({ id }) => { const todo = todos.find((item) => item.id === id); if (!todo) { return { content: [{ type: "text", text: `未找到 ID=${id} 的待办事项` }], }; } todo.done = true; return { content: [{ type: "text", text: `已标记 ID=${id} 为完成` }], }; } ); // 通过标准输入输出启动 const transport = new StdioServerTransport(); await server.connect(transport);5.2 代码逻辑解析
这段代码里,最关键的设计是每个工具都返回结构化的纯文本。
add_todo接收一个content参数,创建一个待办事项。list_todos读取当前列表。complete_todo接收一个id参数,把对应待办标记成完成。
为什么要用type: "text"返回纯文本?因为模型无法直接理解原始 JavaScript 对象,它需要的是能被放进上下文继续推理的文本。所以 MCP server 的工具返回值应该尽量结构化、清晰、易读。
这也正是多步输入成功的关键。第一个工具返回了“什么内容、什么 ID”,第二个工具能否自动读取这些信息并继续调用,就取决于模型在上下文中能否理解这些返回值。
5.3 安装依赖
如果你的项目还没有安装依赖,执行:
npm install5.4 启动并测试 server
用下面的命令启动:
node server/index.js如果启动成功,不会立即输出太多日志,因为 server 正在等待 client 通过标准输入连接。不要认为“没有输出”就是没启动成功。
如果希望可视化调试,可以使用 MCP Inspector:
npx @modelcontextprotocol/inspector node server/index.jsInspector 会启动一个本地调试页面,可以手动查看 tool 列表、调用工具并观察返回结果。我第一次写 MCP server 时,就是通过 Inspector 确认工具参数格式和返回结构的。
6. 将 MCP Server 接入 Grok Build 并跑通多步任务
server 写完只是第一步,真正有价值的部分是让它能被 Grok Build 或者其他 MCP Host 识别和调用。
6.1 配置 MCP server
不同客户端配置 MCP server 的文件路径和格式不完全相同,但核心配置结构是通用的。你需要告诉客户端两件事:
- 用哪个命令启动 MCP server。
- 这个 server 的名称是什么。
配置示例:
{ "mcpServers": { "todo-demo": { "command": "node", "args": ["/绝对路径/server/index.js"] } } }如果你的客户端支持项目级配置,就在项目根目录下新建一个.mcp.json或类似配置文件。如果不支持,可以在全局 MCP 配置文件中添加。
需要注意,不同 Host 使用的是不同配置目录。像 Claude Desktop、Cursor、Cherry Studio、Codex、Grok Build 各自的配置方式可能略有差异,但 MCP server 本身的代码可以复用。换句话说,你在本书示例中创建的 Node server,改成通过命令行注册后,几乎可以被所有支持 MCP 的客户端重复使用,这也是 MCP 协议最大的优势。
6.2 配置时的注意点
配置中最常见的坑是相对路径问题。MCP client 发起子进程时,使用的当前工作目录可能不是你期望的目录。建议:
- 在
args中写绝对路径。 - 在启动命令前先
cd到 server 所在目录。
如果你使用的 server 是基于远程 URL 的,则配置结构不一样,例如:
{ "mcpServers": { "remote-demo": { "url": "http://127.0.0.1:8080/mcp" } } }远程 URL 模式更容易遇到前文提到的 “error sending request for url” 问题,建议优先使用本地 stdio 模式验证基础能力。
6.3 如何判断多步任务真的跑通了
接入成功后,给模型发一个需要连续两步才能完成的任务,例如:
请先调用 list_todos 查看当前待办事项,然后把第一条待办标记为完成,最后再次查看列表。这个任务本身带着明确的执行步骤,但我们要观察的不是模型“照着做”,而是它是否能:
- 调用
list_todos。 - 从返回结果中提取第一条待办的 ID。
- 把 ID 作为参数调用
complete_todo。 - 再次调用
list_todos验证结果。
如果 Grok Build 只调用了第一次list_todos就停住,说明多步输入在当前任务中并没有生效。如果它能连续完成三步,说明多步工作流已经跑通。
为了更接近真实场景,可以将任务描述改成没有明确步骤的目标式指令:
请把当前列表里未完成的第一件事处理好,并告诉我最新状态。这种表达不给模型具体步骤,模型必须自己决定先调用哪个工具、再调用哪个工具。只有在这种目标式指令下仍能完成多步调用,才说明 Agent 的编排能力是合格的。
6.4 没有编写能力时,如何快速验证
如果你暂时不想写 Node 代码,可以直接使用 filesystem 服务器测试。
npx @modelcontextprotocol/server-filesystem /tmp然后在客户端中配置:
{ "mcpServers": { "fs-demo": { "command": "npx", "args": ["@modelcontextprotocol/server-filesystem", "/tmp"] } } }给模型一个任务,比如:
在 /tmp 下新建一个文件 mcp-test.txt,写入 hello,然后读取文件内容,最后告诉我文件是否存在。这个任务涉及新建文件、写内容、读内容三个操作,也能验证多步调度。
7. Grok Build MCP 常见问题与排查方法
下面是实际摸索过程中比较容易遇到的几类问题。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| error sending request for url | server 未启动、URL 不可达、端口错误 | 用 curl 直接请求 URL 验证 | 改为 stdio 模式,或检查 URL 与端口 |
| MCP server 已配置,但工具列表为空 | server 启动失败或 tool 定义有问题 | 查看 client 日志,使用 Inspector 测试 | 修正 server 代码,确认 server 已连接 |
| 工具调用后报参数不合法 | 工具 inputSchema 没有定义清楚 | 查看服务端日志和模型传参 | 为每个参数补充类型与描述 |
| 连续调用工具时,第二步没有执行 | 模型不理解第一步返回的内容 | 拆小任务逐步验证;调整工具返回文本 | 让工具返回更结构化、易理解的文本 |
| 启动 server 后 client 提示连接关闭 | node 进程崩溃或 SDK 版本不兼容 | 手动执行启动命令,查看报错 | 检查依赖版本,确认 package.json 配置 |
| 配置后工具没有生效 | 配置文件路径错误 | 检查客户端加载配置的目录 | 用绝对路径重新注册配置 |
| 调用远程 MCP 时超时 | 网络问题或服务端处理慢 | 直接测试接口响应时间 | 使用本地 server;增加超时时间 |
| 模型总是调用错误的工具 | 工具描述不清晰 | 在 prompt 中指明工具名 | 优化工具 name 和 description 文案 |
7.1 error sending request for url 深入排查
这个报错值得单独说明。它已经很明确地告诉我们:请求发出了,但没有到达目标地址。
优先按下面顺序排查:
- 看 MCP server 进程是否还在运行。
- 看 URL 是否写错,包括协议、域名、端口、路径。
- 看是不是端口冲突。
- 看是否被本机防火墙或安全软件拦截。
- 如果 server 在远程,还要看服务端是否允许该来源访问。
提醒一点,本地开调试时,不要开启不必要的代理,也不要让客户端通过外网地址回环访问本地服务。使用127.0.0.1最稳妥。
7.2 多步调用中断的排查思路
多步中断通常不是网络问题,而是上下文理解问题。
模型执行完第一步后,需要拿到结构化的输出才能决定下一步。如果第一个工具返回的是长段无格式文本,或者参数含义不明确,第二步就容易断。
这种情况下,最有效的做法是:
- 把任务描述得更完整,减少模型猜测。
- 让工具返回值更结构化。
- 在 prompt 中提示模型“先查看结果,再决定下一步”。
部分情况下,也可以尝试在调用失败后直接追问:“刚才的结果是否已经获取?请继续完成剩余步骤。” 这种兜底手段在 Agent 类工具里很常见。
8. 多步输入场景的最佳实践与安全边界
多步输入能力的出现,意味着模型可以连续执行多个有依赖关系的工具,这在带来效率的同时,也带来了更大的风险面。
8.1 工具设计层面的最佳实践
MCP server 的工具设计,直接决定了模型面对复杂任务时能否正确编排。
首先,工具返回信息要尽量具体。不要只返回“操作成功”,应该返回关键上下文。比如新增待办完成后,不仅返回成功提示,还要返回新记录的 ID、状态和内容摘要。后续步骤需要这些信息时,模型就不用重新猜测。
其次,工具描述要避免模糊。如果工具叫query,模型需要看 description 才能知道它能干什么。更好的命名是query_order_detail。
最后,不要把多个独立操作硬塞进一个工具。这看起来减少了调用次数,却削弱了模型在中间步骤上做判断的能力。多步输入的价值恰恰在于让模型有机会在每一步之间决策。
8.2 接入范围与最小权限原则
把 MCP server 接入 Grok Build 后,模型在逻辑上拥有了执行工具的能力。这里的风险是:工具能做什么,模型就可能做什么。
尤其是文件系统、数据库删除、外部接口调用这类工具,建议遵循最小权限原则:
- 给 MCP server 使用专门的临时目录,不要直接暴露整个磁盘。
- 数据库 MCP 用户使用只读账号,除非业务必须写操作。
- 不要把生产环境的密钥直接放进 MCP server 的启动命令或配置文件中。
- 远程 URL 模式的 MCP server 要增加访问鉴权,避免局域网内任意设备都能调用。
在生产环境变更前,先在测试环境用最小数据集验证工具行为,并做好备份和回滚方案。
8.3 从多步输入到多 Agent 协作
“MCP 多智能体”是目前开发者关注的方向。多步输入是通向多 Agent 协作的必经之路。一个 Agent 把一个复杂任务拆成多个子任务,再把不同子任务调度给不同工具甚至不同 Agent 执行,本质上依赖的就是每一步输出能否准确传递给下一步。
Grok Build v1.0.17 的多步输入支持,虽然不等于多 Agent 系统,但它为更复杂的编排打下了基础。如果你正在做 Agent 类产品,可以思考:你的模型在连续调用工具时,中间结果是否经历了格式丢失或上下文截断?这个问题解决后,多 Agent 的协作会顺畅很多。
8.4 如何评估一次 MCP 接入是否成功
评估不能只看“工具能不能被识别”,应该设计几个难度递增的任务:
- 单步查询任务:确认 MCP server 能响应。
- 两步依赖任务:确认第一个工具的输出被用于第二个工具。
- 条件分支任务:比如“如果列表为空则新建,否则更新第一条”,确认模型能根据工具结果做决策。
- 长链路任务:连续五六个工具调用,确认上下文没有明显丢失。
只有第 3、4 类任务能稳定通过,才能说明多步输入在真实场景中具备可用性。
9. 总结:从“能连”到“能干完事”
MCP 协议的普及速度比很多人预想的要快。从网络上大量关于蓝湖 MCP、Figma MCP、Matlab MCP、Unity MCP 的讨论就能看出,各行业工具都在争相把自己变成标准 MCP server,以便被 AI Client 调用。
但工具接入只是第一步。模型能否围绕多个工具完成一个完整任务,决定了这些 server 能否真正产生生产力。Grok Build v1.0.17 把 MCP 多步输入作为重点,本质上是在回答一个问题:当模型手边有十个工具时,它不是只会选一个,而是能像工程师一样,用第一把螺丝刀拧完螺丝后,自然拿起第二把扳手继续操作。
如果你的工作是开发 MCP server,建议从两个方向优化:一是让每个工具的输出更适合作为下一步判断依据;二是设计工具时多考虑“组合使用”场景,而不是只考虑单次调用。
如果你的工作是使用 Grok Build 这类工具,建议先从一个本地 MCP server 开始,把多步调用跑通,再逐步增加任务复杂度。遇到 error sending request for url 先查网络链路,遇到多步中断先查工具的返回文本。记住一条核心原则:多步输入不是让模型一次性执行多个工具,而是让模型在每一步执行后都能继续思考,并且基于新的上下文采取下一步行动。
建议收藏备用,后续我会持续跟进 MCP 工具链与 Agent 编程助手的更新,尤其是多步调度、多 Agent 协作和 MCP server 工程化方向。如果你在自己接入的过程中发现了更稳定的模式,也欢迎交流分享。