从代码到智能体:MCP 协议如何重塑 AI Agent 的边界

作者:互联网

2026-04-13

其他

一、引言:为什么我们需要 MCP?

在 LangChain、LlamaIndex 等框架的推动下,AI Agent 已经从概念走向落地。但一个核心问题始终存在:如何让大模型安全、高效、标准化地调用外部工具?

传统的做法是为每个工具编写自定义的 Function Calling 逻辑,导致代码耦合度高、复用性差、维护成本巨大。而 MCP(Model Context Protocol) 的出现,正是为了解决这一痛点。

MCP 是一个开放协议,旨在统一大模型与外部工具之间的通信标准。它允许开发者以声明式的方式注册工具,大模型则通过标准接口发现并调用这些工具,无需关心底层实现细节。

今天,我们就通过一个真实项目——mcp_in_action,来深入理解 MCP 如何在实际场景中发挥作用。


二、项目结构解析:模块化设计的艺术

首先,让我们看看项目的目录结构:

mcp_in_action/
└── mcp-test/
    ├── node_modules/
    ├── .env
    ├── beijing_south_station_hotels.md
    ├── main.mjs          ← 核心入口文件
    ├── package.json
    └── pnpm-lock.yaml

这是一个典型的 Node.js 项目,使用 pnpm 作为包管理器。核心逻辑集中在 main.mjs 文件中,采用 ES Module 语法(.mjs 后缀),体现了现代 JavaScript 开发的最佳实践。

2.1 环境配置:.env 文件的作用

.env文件中包含以下关键变量:

MODEL_NAME=gpt-4o
OPENAI_API_KEY=sk-xxx
OPENAI_BASE_URL=
AMAP_MAPS_API_KEY=your_amap_key

这种将敏感信息与环境变量分离的做法,是云原生开发的基本准则,既保证了安全性,又提升了部署灵活性。


三、核心代码拆解:构建多服务器 MCP 客户端

3.1 初始化大模型

const model = new ChatOpenAI({
    modelName: process.env.MODEL_NAME,
    apiKey: process.env.OPENAI_API_KEY,
    configuration: {
        baseURL: process.env.OPENAI_BASE_URL
    }
});

这里使用了 LangChain 的 ChatOpenAI 类,支持自定义模型名称、API Key 和基础 URL。这种设计使得我们可以轻松切换不同的 LLM 提供商(如 Azure OpenAI、本地部署的 vLLM 等)。

3.2 创建 MultiServerMCPClient

这是整个项目的灵魂所在:

const mcpClient = new MultiServerMCPClient({
    mcpServers: {
        "amap-maps-streamableHTTP": {
            url: `${process.env.AMAP_MAPS_API_KEY}`
        },
        "filesystem": {
            "command": "npx",
            "args": [
                "-y",
                "@modelcontextprotocol/server-filesystem",
                "D:/Workspace/lesson_zp/ai/agent/mcp_in_action/mcp-test"
            ]
        },
        "chrome-devtools": {
            "command": "npx",
            "args": [
                "-y",
                "chrome-devtools-mcp@latest"
            ]
        }
    }
})

三种不同类型的 MCP 服务器:

  1. 远程 HTTP 服务(高德地图)
    通过 URL 直接连接官方提供的 MCP 服务,适用于标准化、高可用的公共 API。
  2. 本地命令行服务(文件系统)
    使用 npx 动态安装并运行 @modelcontextprotocol/server-filesystem,指定工作目录为当前项目路径。这种方式非常适合需要访问本地资源的场景。
  3. 浏览器自动化服务(Chrome DevTools)
    同样通过 npx 启动 chrome-devtools-mcp,实现对浏览器的程序化控制。这是实现“视觉型 Agent”的关键。

3.3 获取工具并绑定到模型

const tools = await mcpClient.getTools();
const modelWithTools = model.bindTools(tools);

这两行代码完成了从“纯语言模型”到“增强型 Agent”的转变。getTools() 会向所有注册的 MCP 服务器发起 discovery 请求,收集可用工具列表;bindTools() 则将这些工具注入到模型的推理过程中,使其具备调用能力。


四、Agent 执行引擎:循环推理与工具调用

4.1 主循环逻辑

async function runAgentWithTools(query, maxIterations = 30) {
    const messages = [new HumanMessage(query)];
    for (let i = 0; i < maxIterations; i++) {
        console.log(chalk.bgGreen('⏳正在等待AI思考...'));
        const response = await modelWithTools.invoke(messages);
        messages.push(response);

        if (!response.tool_calls || response.tool_calls.length === 0) {
            console.log(`n AI 最终回复:n ${response.content}n`);
            return response.content;
        }

        // 处理工具调用...
    }
}

这个函数实现了经典的 ReAct(Reason + Act) 模式:

  1. Reason:模型根据当前对话历史生成下一步动作(可能是直接回答,也可能是调用工具)。
  2. Act:如果检测到 tool_calls,则逐个执行对应工具,并将结果以 ToolMessage 形式反馈给模型。
  3. Loop:重复上述过程,直到模型不再调用工具或达到最大迭代次数。

4.2 工具调用处理细节

for (const toolCall of response.tool_calls) {
    const foundTool = tools.find(t => t.name === toolCall.name);
    if (foundTool) {
        const toolResult = await foundTool.invoke(toolCall.args);
        let contentStr;
        if (typeof toolResult === 'string') {
            contentStr = toolResult;
        } else if (toolResult && toolResult.text) {
            contentStr = toolResult.text;
        }
        messages.push(new ToolMessage({
            content: contentStr,
            tool_call_id: toolCall.id
        }));
    }
}

这里有几个值得注意的设计:

  • 容错机制:通过 find 查找工具,避免不存在的工具调用导致崩溃。
  • 结果标准化:无论工具返回的是字符串还是对象(含 text 字段),都统一转换为字符串内容,确保消息格式一致。
  • Traceability:保留 tool_call_id,便于后续调试和审计。

五、实战案例:从需求到执行的完整链路

最后,我们来看一个具体的任务:

await runAgentWithTools(`
北京南站附近的3个酒店,拿到酒店图片,展开浏览器,展示每个酒店的图片,
每个tab一个url展示,并且把那个页面标题改为酒店名
`)

这个看似简单的自然语言指令,背后涉及多个复杂步骤:

  1. 地理搜索:调用高德地图 MCP 服务,查询“北京南站附近酒店”。
  2. 数据提取:从返回结果中提取酒店名称、地址、图片 URL 等信息。
  3. 浏览器控制:启动 Chrome DevTools MCP,打开新标签页加载图片。
  4. DOM 操作:修改每个标签页的 </code> 元素为对应酒店名。</li> <li><strong>状态同步</strong>:将所有操作结果反馈给模型,形成闭环。</li> </ol> <hr> <h2>六、深度思考:MCP 的未来与挑战</h2> <h3>6.1 优势总结</h3> <ul> <li><strong>解耦性强</strong>:工具开发与 Agent 逻辑分离,团队协作更高效。</li> <li><strong>可扩展性好</strong>:新增工具只需注册 MCP Server,无需修改核心代码。</li> <li><strong>生态丰富</strong>:已有文件系统、数据库、浏览器、地图等多种官方/社区服务器。</li> <li><strong>安全性提升</strong>:工具权限可控,避免大模型随意执行危险操作。</li> </ul> <h3>6.2 现存挑战</h3> <ul> <li><strong>性能开销</strong>:每次工具调用都需要网络/进程间通信,延迟较高。</li> <li><strong>错误处理复杂</strong>:工具失败时如何优雅降级?是否需要重试机制?</li> <li><strong>上下文爆炸</strong>:多次工具调用会导致 message 数组急剧膨胀,超出模型 context window。</li> <li><strong>调试困难</strong>:分布式架构下,定位问题需要跨多个服务日志追踪。</li> </ul> <h3>6.3 未来展望</h3> <p>我认为,MCP 将成为 AI Agent 领域的“USB 接口”——一种即插即用的标准协议。未来的趋势可能包括:</p> <ul> <li><strong>可视化编排</strong>:通过低代码平台拖拽组合不同 MCP 服务,快速构建垂直领域 Agent。</li> <li><strong>边缘计算集成</strong>:在 IoT 设备上运行轻量级 MCP Server,实现端侧智能。</li> <li><strong>多模态融合</strong>:结合语音、图像、视频等输入输出,打造真正的“全能助手”。</li> <li><strong>自治进化</strong>:Agent 能够自我发现新工具、优化调用策略,甚至参与 MCP 协议演进。</li> </ul> <hr> <h2>七、结语:站在巨人的肩膀上</h2> <p>回顾整个项目,最令我感触的不是代码本身,而是它所代表的<strong>工程哲学</strong>:</p> <p>MCP 协议让我们站在了一个更高的起点上。我们不再需要从零开始实现每一个工具调用逻辑,而是可以专注于更高阶的问题:<strong>如何让 AI 更好地理解人类意图?如何设计更自然的交互界面?如何构建可信、可靠、可持续的智能系统?</strong></p> <p>这才是 AI Agent 真正的价值所在。</p> <hr> <h2>附录:延伸学习资源</h2> <ul> <li>MCP 官方文档</li> <li>LangChain MCP Adapters GitHub</li> <li>Chrome DevTools MCP 项目</li> <li>ReAct 论文</li> </ul> <hr> <p><strong>作者寄语</strong>:如果你也被这个项目启发,不妨动手尝试搭建自己的 MCP Agent。记住,最好的学习方式就是亲手敲下一行行代码,在调试中成长,在失败中进步。AI 的未来,属于每一个敢于探索的实践者。</p> </div> <div class="lastanext flexRow"> <a class="lastart flexRow" href="/wz/323028.html" ><span>上一篇:</span><span>GLM,Kimi,MiniMax怎么选?Win+C#开发横向对比!</span></a> <a class="nextart flexRow" href="/wz/323030.html" ><span>下一篇:</span><span>AI 时代的高效开发流程:语音驱动,前端先行</span></a> </div> </div> <div class="dtl-xgtj"> <div class="jb-titles flexRow"> <div class="jbtle-left flexRow"><b></b><p>相关推荐</p></div> </div> <div class="tjlist flexRow"> <div class="tj-item "> <div class="tjitemd"> <div class="tjimd-top flexRow"> <a class="imdta flexRow" href="/wz/343693.html" > <img src="https://images.jiaoben.net/uploads/20260402/logo_69ce27dc076311.jpeg" > </a> <div class="imdt-right flexColumn"> <a class="imdtra flexRow overflowclass" href="/wz/343693.html" >2MB 的 PostgreSQL work_mem,如何吃掉 2TB 内存?</a> <a class="imdtrap flexRow overflowclass" href="/wz/343693.html" > 一次真实的 PostgreSQL OOM 事故 某生产集群在占用 2TB 内存后,被 OOM killer 终止,而此时 work_mem 参数仅设置为 2MB。这一现象看似矛盾,却暴露了 Postg </a> </div> </div> <div class="tjimd-down flexRow"> <div class="imdd-tab flexRow"> <p class="imddt-time flexRow"><b></b><span>2026-04-07</span></p> </div> <a href="/wz/343693.html" class="imdd-more flexRow flexcenter" >立即查看</a> </div> </div> </div> <div class="tj-item "> <div class="tjitemd"> <div class="tjimd-top flexRow"> <a class="imdta flexRow" href="/wz/343304.html" > <img src="https://images.jiaoben.net/uploads/20260402/logo_69ce107c0a6fd1.jpg" > </a> <div class="imdt-right flexColumn"> <a class="imdtra flexRow overflowclass" href="/wz/343304.html" >腾讯文档网页版登录提示服务器</a> <a class="imdtrap flexRow overflowclass" href="/wz/343304.html" > 腾讯文档因为拥有着在线多人编辑功能,逐渐成为人们日常生活广泛使用的工具。但是在2020年7月份,腾讯文档服务器出现了故障,下面就教大家一下腾讯文档网页版登录提示服务器解决办法。【】腾讯文档网页版登录提示服务器解决办法1、网页版登录提示服务器,有可能是网络连接不正常,可以确认网络连接之后再次尝试。 </a> </div> </div> <div class="tjimd-down flexRow"> <div class="imdd-tab flexRow"> <p class="imddt-time flexRow"><b></b><span>2026-04-03</span></p> </div> <a href="/wz/343304.html" class="imdd-more flexRow flexcenter" >立即查看</a> </div> </div> </div> <div class="tj-item "> <div class="tjitemd"> <div class="tjimd-top flexRow"> <a class="imdta flexRow" href="/wz/343303.html" > <img src="https://images.jiaoben.net/uploads/20260402/logo_69ce106b5c8161.jpg" > </a> <div class="imdt-right flexColumn"> <a class="imdtra flexRow overflowclass" href="/wz/343303.html" >fanbook如何退出服务器</a> <a class="imdtrap flexRow overflowclass" href="/wz/343303.html" > 在使用fanbook的过程中,有时我们可能会因为各种原因需要退出服务器。这一操作虽然并不复杂,但对于新手来说可能仍有一些疑问。接下来,我们将从多个维度为你详细介绍fanbook退出服务器的方法。 </a> </div> </div> <div class="tjimd-down flexRow"> <div class="imdd-tab flexRow"> <p class="imddt-time flexRow"><b></b><span>2026-04-03</span></p> </div> <a href="/wz/343303.html" class="imdd-more flexRow flexcenter" >立即查看</a> </div> </div> </div> <div class="tj-item "> <div class="tjitemd"> <div class="tjimd-top flexRow"> <a class="imdta flexRow" href="/wz/343286.html" > <img src="https://images.jiaoben.net/uploads/20260402/logo_69ce0f677adfa1.jpg" > </a> <div class="imdt-right flexColumn"> <a class="imdtra flexRow overflowclass" href="/wz/343286.html" >如何设置IDM下载器代理服务器</a> <a class="imdtrap flexRow overflowclass" href="/wz/343286.html" > 在网络下载过程中,有时我们可能需要通过代理服务器来优化下载体验或突破某些网络限制。对于使用idm下载器的用户来说,设置代理服务器并不复杂。下面就为大家详细介绍一下idm下载器设置代理服务器的具体步骤。 </a> </div> </div> <div class="tjimd-down flexRow"> <div class="imdd-tab flexRow"> <p class="imddt-time flexRow"><b></b><span>2026-04-03</span></p> </div> <a href="/wz/343286.html" class="imdd-more flexRow flexcenter" >立即查看</a> </div> </div> </div> </div> </div> </div> <div class="cd-right dtlcd-right"> <div class="dtl-ht"> <div class="jb-titles flexRow"> <div class="jbtle-left flexRow"><b></b><p>专题</p></div> </div> <div class="dtlht-list "> <div class="htl-item flexRow"> <div class="htmitem-left"> <div class="htiteml-top flexRow"> <a href="/wz/zt-69351.html" >#数据可视化</a> <span></span> </div> <a class="htiteml-down flexRow" href="/wz/zt-69351.html" >数据可视化(Data Visu</a> </div> <p class="htmitem-right flexRow flexcenter gz" data-id="69351" >+ 收藏</p> </div> <div class="htl-item flexRow"> <div class="htmitem-left"> <div class="htiteml-top flexRow"> <a href="/wz/zt-69342.html" >#自然语言处理</a> <span></span> </div> <a class="htiteml-down flexRow" href="/wz/zt-69342.html" >自然语言处理(Natural</a> </div> <p class="htmitem-right flexRow flexcenter gz" data-id="69342" >+ 收藏</p> </div> <div class="htl-item flexRow"> <div class="htmitem-left"> <div class="htiteml-top flexRow"> <a href="/wz/zt-68363.html" >#Excel公式</a> <span></span> </div> <a class="htiteml-down flexRow" href="/wz/zt-68363.html" >Excel公式就是:用函数 +</a> </div> <p class="htmitem-right flexRow flexcenter gz" data-id="68363" >+ 收藏</p> </div> <div class="htl-item flexRow"> <div class="htmitem-left"> <div class="htiteml-top flexRow"> <a href="/wz/zt-68355.html" >#Excel技巧</a> <span></span> </div> <a class="htiteml-down flexRow" href="/wz/zt-68355.html" >Excel是日常生活中必不可</a> </div> <p class="htmitem-right flexRow flexcenter gz" data-id="68355" >+ 收藏</p> </div> <div class="htl-item flexRow"> <div class="htmitem-left"> <div class="htiteml-top flexRow"> <a href="/wz/zt-68081.html" >#蛋仔派对</a> <span></span> </div> <a class="htiteml-down flexRow" href="/wz/zt-68081.html" >蛋仔派对最新官方活动、关卡速</a> </div> <p class="htmitem-right flexRow flexcenter gz" data-id="68081" >+ 收藏</p> </div> <div class="htl-item flexRow"> <div class="htmitem-left"> <div class="htiteml-top flexRow"> <a href="/wz/zt-68000.html" >#人工智能</a> <span></span> </div> <a class="htiteml-down flexRow" href="/wz/zt-68000.html" >人工智能(AI),简单说,就</a> </div> <p class="htmitem-right flexRow flexcenter gz" data-id="68000" >+ 收藏</p> </div> </div> </div> <div class=" dtl-zt"> <div class="jb-titles flexRow"> <div class="jbtle-left flexRow"><b></b><p>最新数据</p></div> </div> <div class="wkch-downs"> <div class="weekch-top flexRow"> <a class="wktpa flexRow" href="/wz/323035.html" > <img src="https://images.jiaoben.net/uploads/20260320/logo_69bd0fc0af1df1.jpeg" > </a> <div class="wktpa-right flexColumn"> <a class="wktpara flexRow overflowclass" href="/wz/323035.html" ># MCP(Model Context Protocol)学习笔记</a> <a class="wktparp flexRow overflowclass" href="/wz/323035.html" > 学习日期:2026年3月1日 学习目 </a> </div> </div> <div class="weekch-list"> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/323034.html" class="weekcha flexRow flexcenter overflowclass" >预算有限怎么选 Codex 套餐?我的 AxisCode 使用复盘</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/323033.html" class="weekcha flexRow flexcenter overflowclass" >AI 可以让 WIFI 实现监控室内人体位置和姿态,无需摄像头?</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/323032.html" class="weekcha flexRow flexcenter overflowclass" >OpenSpec 技术指南:让AI编程助手更可靠</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/323031.html" class="weekcha flexRow flexcenter overflowclass" >AI 自动编程:一句话设计高颜值博客</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/323027.html" class="weekcha flexRow flexcenter overflowclass" >Chat Copilot:AI 对话增强助手(浏览器插件)</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/323026.html" class="weekcha flexRow flexcenter overflowclass" >赛博神启:当 AI 开始在“虾聊”建群,人类离彻底“出局”还有多远?</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/323025.html" class="weekcha flexRow flexcenter overflowclass" >Claude Code 踩坑实录:我流的泪,你别再流</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/323024.html" class="weekcha flexRow flexcenter overflowclass" >Cursor vs GitHub Copilot:2026 终极对比</a> </div> <div class="weekch-con flexRow"> <div class="weekch-icon flexRow"><b></b></div> <a href="/wz/323023.html" class="weekcha flexRow flexcenter overflowclass" >AI 百科001: ACP(Agent Client Protocol)</a> </div> </div> </div> </div> <div class=" dtl-wz"> <div class="jb-titles flexRow"> <div class="jbtle-left flexRow"><b></b><p>相关文章</p></div> </div> <div class="blog-list"> <a href="/wz/292879.html" class="bloga flexRow over"><p class="overflowclass">sfsDb 时序数据处理指南</p><div class="blogtime"><span>04/</span>13</div></a> <a href="/wz/292886.html" class="bloga flexRow over"><p class="overflowclass">NineData 成功通过国家高新技术企业认定!</p><div class="blogtime"><span>04/</span>13</div></a> <a href="/wz/321565.html" class="bloga flexRow over"><p class="overflowclass">腾讯云轻量应用服务器管理:自动化轻量服务器 - Openclaw Skills</p><div class="blogtime"><span>04/</span>13</div></a> <a href="/wz/321635.html" class="bloga flexRow over"><p class="overflowclass">系统资源监控器:实时服务器健康追踪 - Openclaw Skills</p><div class="blogtime"><span>04/</span>13</div></a> <a href="/wz/323009.html" class="bloga flexRow over"><p class="overflowclass">前端老兵AI学习过程</p><div class="blogtime"><span>04/</span>13</div></a> <a href="/wz/323010.html" class="bloga flexRow over"><p class="overflowclass">工作笔记-CodeBuddy应用探索</p><div class="blogtime"><span>04/</span>13</div></a> <a href="/wz/323011.html" class="bloga flexRow over"><p class="overflowclass">OpenCode 完全指南:从 0 到 100K Star 的开源 AI 编码 Agent</p><div class="blogtime"><span>04/</span>13</div></a> <a href="/wz/323013.html" class="bloga flexRow over"><p class="overflowclass">Day11-龙虾哥打工日记:OpenClaw救援机器人 - 主系统挂了谁来救场?</p><div class="blogtime"><span>04/</span>13</div></a> <a href="/wz/323014.html" class="bloga flexRow over"><p class="overflowclass">Claude Code 创始人 Boris 揭秘:团队 10 倍效率技巧</p><div class="blogtime"><span>04/</span>13</div></a> <a href="/wz/323015.html" class="bloga flexRow over"><p class="overflowclass">拒绝“手搓”工具!带你硬核手写 MCP Server,解锁 Agent 的无限潜能</p><div class="blogtime"><span>04/</span>13</div></a> </div> </div> <div class="cdr-ai"> <div class="jb-titles flexRow"> <div class="jbtle-left flexRow"><b></b><p>AI精选 </p></div> <a class="jbtitle-more flexRow" href="/category/list_344_1.html" title=""><span>更多</span><b></b></a> </div> <div class="ai-list"> <div class="ail-top flexRow"> <a href="/wz/365279.html" title="" class="ailta "> <img src="https://images.jiaoben.net/uploads/20260417/logo_69e16da8c8f8e1.jpg" > <p ><span>高速摩托车追逐视频提示词</span></p></a> <a href="/wz/365266.html" title="" class="ailta "> <img src="https://images.jiaoben.net/uploads/20260417/logo_69e1354ed31511.jpg" > <p ><span>高分辨率 2.5D 插画提示:带翼</span></p></a> </div> <div class="ail-down"> <a class="ali-con flexRow" href="/wz/365265.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">高速电影级奢华甜点摄影提示(熔岩巧克力蛋糕)</p> </a> <a class="ali-con flexRow" href="/wz/365264.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">复古相机女孩美学与运动后光彩瑜伽氛围提示</p> </a> <a class="ali-con flexRow" href="/wz/365263.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">用于 AI 图像文本渲染的 JSON 提示模板</p> </a> <a class="ali-con flexRow" href="/wz/365002.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">Strict Identity 运动服网格生成</p> </a> <a class="ali-con flexRow" href="/wz/365001.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">逼真的斜倚人像,带 ControlNet 细节</p> </a> <a class="ali-con flexRow" href="/wz/365000.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">Sabrina Carpenter 舞台表演魅力提示</p> </a> <a class="ali-con flexRow" href="/wz/364999.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">电影级人像修复提示词</p> </a> <a class="ali-con flexRow" href="/wz/364998.html" title=""> <div class="alicon-left flexRow"><span>精选</span></div> <p class="aliconp overflowclass">金发女郎的镜面自拍</p> </a> </div> </div> </div> <div class="cdr-blog"> <div class="jb-titles flexRow"> <div class="jbtle-left flexRow"><b></b><p>脚本推荐</p></div> </div> <div class="blog-list"> <a href="/wz/zt-49225.html" title="" class="bloga flexRow over"><p class="overflowclass">SeeDance 2.0 Video Creator专区</p></a> <a href="/wz/zt-49224.html" title="" class="bloga flexRow over"><p class="overflowclass">OpenClaw AI专区</p></a> <a href="/wz/zt-49223.html" title="" class="bloga flexRow over"><p class="overflowclass">cowork专区</p></a> <a href="/wz/zt-49222.html" title="" class="bloga flexRow over"><p class="overflowclass">claude code skills专区</p></a> </div> </div> </div> </div> </div> </div> </main> <script> $(function() { // “+ 收藏”按钮点击事件 $(document).on('click', '.htmitem-right, .ztop-right', function(e) { // 仅针对包含 “+ 收藏” 文字的按钮 if ($(this).text().indexOf('+ 收藏') === -1) return; e.preventDefault(); const id = $(this).data('id'); if (!id) { layer.msg('该项暂无有效ID,无法收藏'); return; } // 构造收藏 URL: 当前域名 + /wz/zt- + id + / const bookmarkUrl = window.location.origin + '/wz/zt-' + id + '.html'; // 获取收藏标题 (优先从同级元素获取话题名称,否则使用页面标题) let bookmarkTitle = $(this).closest('.htl-item, .zttopd').find('a:first, span.overflowclass').text().trim() || document.title; if (bookmarkTitle.startsWith('#')) bookmarkTitle = bookmarkTitle.substring(1); // 浏览器收藏逻辑 (带 Fallback) try { if (window.sidebar && window.sidebar.addPanel) { // Firefox < 23 window.sidebar.addPanel(bookmarkTitle, bookmarkUrl, ""); } else if (window.external && ('AddFavorite' in window.external)) { // IE window.external.AddFavorite(bookmarkUrl, bookmarkTitle); } else { // Chrome, Safari, Firefox 23+, etc. const isMac = /Mac/i.test(navigator.userAgent); const keyStr = isMac ? 'Command + D' : 'Ctrl + D'; layer.confirm('由于浏览器安全限制,请使用 <b>' + keyStr + '</b> 手动添加收藏。<br><br>收藏地址:<br><small>' + bookmarkUrl + '</small>', { title: '收藏提示', btn: ['复制链接', '知道了'], yes: function(index) { copyToClipboard(bookmarkUrl).then(() => { layer.msg('链接已复制,请手动添加到收藏夹'); }).catch(() => { layer.msg('复制失败,请手动选择复制'); }); layer.close(index); } }); } } catch (err) { layer.msg('收藏失败,请手动添加'); } }); // 兼容非 HTTPS 的复制函数 function copyToClipboard(text) { if (navigator.clipboard && window.isSecureContext) { return navigator.clipboard.writeText(text); } else { let textArea = document.createElement("textarea"); textArea.value = text; textArea.style.position = "fixed"; textArea.style.left = "-999999px"; textArea.style.top = "-999999px"; document.body.appendChild(textArea); textArea.focus(); textArea.select(); return new Promise((res, rej) => { document.execCommand('copy') ? res() : rej(); textArea.remove(); }); } } }); </script> <footer> <div class="foot "> <div class="foot-top flexRow"> <div class="foot-left"> <div class="ftl-top flexRow"><span class="flexRow flexcenter">脚本</span>在线</div> <p class="ftl-down"> 智能赋能梦想,脚本构筑现实。我们致力于链接AI智能指令 与传统自动化,为您提供一站式、高效率的脚 本资产与生成 服务。 </p> </div> <div class="foot-right flexRow"> <div class="ftr-list flexColumn"> <p>核心板块</p> <span>AI脚本库</span> <span>自动化仓库</span> <span>脚本实验室</span> </div> <div class="ftr-list flexColumn"> <p>关于我们</p> <a href="/category/list_229_1.html" >最新游戏</a> <span>商务合作</span> <span>隐私政策</span> </div> <div class="ftr-list flexColumn"> <p>社区支持</p> <span >API文档</span> <a href="/category/list_334_1.html" >攻略资讯</a> <span>违规举报</span> </div> </div> </div> <div class="foot-down flexColumn"> <p>© 2026 jiaoben.net | 脚本在线 | 联系:jiaobennet2026@163.com</p> <p>备案:<a style="color: #7F7F7F;" href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">湘ICP备18025217号-11</a> </p> </div> </div> </footer> <div style="display:none;"> <script type="text/javascript"> var _paq = window._paq = window._paq || []; _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//tongji.zhangwan.net/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '29']); // Add this code below within the Matomo JavaScript tracker code // Important: the tracker url includes the /matomo.php var secondaryTrackerUrl = u+'matomo.php'; var secondaryWebsiteId = 27; // Also send all of the tracking data to this other Matomo server, in website ID 77 _paq.push(['addTracker', secondaryTrackerUrl, secondaryWebsiteId]); // That's it! var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.type='text/javascript'; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?5d3cfe1f36b1988029fe82a0d475b20d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </div> </body> </html>