当前位置: 首页 > news >正文

自己写一个智能体-使用MCP服务

我们提到,智能体之所以比单纯的语言模型强大,是因为它拥有了“手”和“脚”——也就是使用工具的能力

智能体 = 大语言模型(大脑) + 规划(前额叶) + 工具(手脚)

理论说得再多,终究要落地。今天我们就来聊聊如何通过MCP (Model Context Protocol)协议,真正的让你的智能体“动”起来。我们将以一个实际场景为例:写一段代码,让AI自动把一篇文章发布到微信公众号。

什么是 MCP?

在开始写代码之前,得先解决一个痛点。

以前我们要让 GPT 连接外部工具(比如读取文件、搜索网页、操作数据库),通常需要针对不同的 API 写一大堆胶水代码。如果你用LangChain,你得遵循它的接口规范;如果你换个框架,可能全得重写。

MCP (Model Context Protocol)就是 AI 时代的USB-C 接口。它是由 Anthropic 等公司推动的一个开放标准。

  • MCP Server:提供工具(比如:文件读取服务、微信发布服务)。
  • MCP Client:也就是我们的智能体(负责连接模型和服务端)。
  • LLM:负责决策调用哪个工具。

只要大家遵循这个协议,你的智能体就可以无缝连接任何支持 MCP 的工具,而不需要关心底层的具体实现。

实战:构建公众号发布智能体

接下来,我们通过一段Node.js代码,演示如何把一个本地 Markdown 文件,通过 MCP 服务发布到微信公众号。

1. 准备工作

在这个例子中,我们需要三个角色的配合:

  1. 大脑:一个支持 Function Calling 的大模型(如 GPT-4o 或 DeepSeek 等兼容 OpenAI 格式的模型)。
  2. 工具箱 (MCP Server):这里我们使用 文颜 MCP,这是一个封装了微信公众号发布功能的 MCP 服务,我们通过 Docker 运行它。
  3. 智能体 (MCP Client):我们自己写的这段 JS 代码。

2. 连接 MCP 服务

首先,我们需要建立与 MCP Server 的连接。在代码中,我们通过StdioClientTransport来启动一个 Docker 容器作为我们的工具服务。

import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"; // ... 环境变量检查代码 ... const pwd = process.cwd(); // 建立传输通道:通过 Docker 运行 wenyan-mcp 服务 const transport = new StdioClientTransport({ command: "docker", args: [ "run", "--rm", "-i", // 必须开启交互模式,以便通过 stdio 通信 "--env-file", ".env.test", // 传入公众号的 AppID 等凭证 "-e", `HOST_FILE_PATH=${pwd}`, "-v", `${pwd}:/mnt/host-downloads`, // 挂载目录,让容器能读取到文章 "caol64/wenyan-mcp", ], }); const client = new Client( { name: "wenyan-client", version: "1.0.0" }, { capabilities: {} } ); await client.connect(transport);

这段代码对应了上一篇提到的**“工具使用”**的前提——智能体得先能拿得起工具。

3. 获取工具列表

连接成功后,智能体需要知道自己有哪些工具可用。这对应了理论篇中的**“问题分类”**准备阶段,只有知道有哪些工具,模型才能决定用哪个。

// 获取 MCP 服务端提供的所有工具 const mcpResponse = await client.listTools(); // 将 MCP 的工具定义转换为 OpenAI 兼容的 Function Calling 格式 const openaiTools = mcpResponse.tools.map((tool) => ({ type: "function", function: { name: tool.name, description: tool.description, parameters: tool.inputSchema, // MCP 的 schema 通常直接兼容 }, }));

此时,openaiTools里就装满了诸如publish_article之类的方法描述。

4. 思考与决策

现在进入核心环节。我们将文章内容和需求告诉 LLM,让它自己判断该做什么。

const llmClient = new OpenAI({ apiKey: LLM_API_KEY, baseURL: LLM_BASE_URL }); const content = "./test/publish.md"; // 待发布的文章路径 // 用户的指令:既包含了目标(发布),也包含了参数(使用 phycat 主题) const userPrompt = { role: "user", content: `使用phycat主题将这篇文章发布到微信公众号:\n\n${content}` }; // 第一轮对话:询问 LLM const response = await llmClient.chat.completions.create({ model: LLM_MODEL, messages: [userPrompt], tools: openaiTools, // 把工具箱展示给它 tool_choice: "auto", // 让模型自己决定是否用工具 });

在这里,模型会分析userPrompt。它发现你的意图是“发布”,并且它看到了openaiTools里有一个能发布的工具,于是它不会直接回答“好的”,而是会返回一个tool_calls请求。

5. 执行工具与反馈

智能体捕获到模型的调用请求,真正的去执行操作,并将结果反馈给模型。这就是**“优化答案”**的前奏。

const assistantMessage = response.choices[0].message; if (assistantMessage.tool_calls) { for (const toolCall of assistantMessage.tool_calls) { const name = toolCall.function.name; const args = JSON.parse(toolCall.function.arguments); // 关键步骤:通过 MCP Client 真正的调用 Docker 里的服务 const result = await client.callTool({ name: name, arguments: args, }); // 获取工具执行结果(比如:发布成功的链接) const toolContent = result.content.map((item) => item.text).join("\n"); // 将结果拼接回对话历史 const finalMessages = [ userPrompt, assistantMessage, { role: "tool", tool_call_id: toolCall.id, content: toolContent, }, ]; // 第二轮对话:让 LLM 根据工具执行结果给用户一个最终回复 const finalResponse = await llmClient.chat.completions.create({ model: LLM_MODEL, messages: finalMessages, }); console.log(finalResponse.choices[0].message.content); } }

发生了什么?

让我们回顾一下整个流程:

  1. User: "帮我把publish.md发到公众号。"
  2. LLM: (思考:我不能直接操作微信,但我有一个叫publish_article的工具。我需要提取参数:文件路径和主题。) ->发出指令
  3. Agent (JS代码): 收到指令,通过 MCP 协议告诉 Docker 容器里的服务:“嘿,运行一下这个函数”。
  4. MCP Server: 执行实际的 API 调用,转换 Markdown,上传素材,保存到草稿箱,返回结果:“发布成功,文章链接是 xxx”。
  5. LLM: 收到结果,组织语言。 ->最终回复: "您的文章已成功发布,使用了 phycat 主题,链接如下:xxx。"

总结

通过引入 MCP,我们把“智能体”的代码写得非常通用。

注意到了吗?上面这段代码里,没有任何一行是关于微信 API 的具体实现的。如果不加载wenyan-mcp,而是换成一个filesystem-mcp,这段代码逻辑几乎不用变,智能体就能拥有操作文件的能力。

这就是现代智能体架构的魅力:大模型负责逻辑,MCP 负责能力,智能体程序负责连接。

学习资源推荐

如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!​

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示

​因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

四、AI大模型商业化落地方案

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

http://www.cnnetsun.cn/news/651571.html

相关文章:

  • AI Agent 深度解析:原理、架构与未来应用浪潮
  • AI驱动的测试用例自愈系统:当页面元素变更,AI自动修复定位器
  • PHP开源智能化管理系统 广告投放系统网站源码 投放网络广告平台
  • 别白忙活!EAAI投稿避坑指南:5条红线碰就拒,工程应用重点划重点
  • 统治生成式 AI 落地!Arize AX:破解 LLM 黑箱的终极全生命周期治理神器
  • YOLOv11+BiFPN双向特征金字塔:全方位解析多尺度检测性能优化指南
  • 从ACPI!ACPITableLoadnt!KeInsertQueueDpc到nt!KiRetireDpcList中的ACPI!ACPIBuildDeviceDpc--非常重要
  • 博士学位答辩PPT分享 | 跨声速抖振流声机理分析及其气动噪声建模研究
  • 工程设计类学习(DAY7):回流焊变形全解析:PCB翘曲终极解决方案
  • 资产管理系统建设方案和实现源码(Java源码)
  • 福昕 PDF 隐藏技巧:擦除敏感信息超实用
  • 云服务器的按量付费 vs 包年包月:什么场景下哪种更划算?新手如何选?
  • Proteno模型:仅需3%训练数据的高效文本归一化技术
  • 好写作AI|别在导师办公室哭!让AI先给你的毕业论文选题“渡劫”
  • 智能AI创作短剧系统源码,多模态素材智能集成与编辑
  • 面向工业场景的高效目标检测系统:基于BiFPN与注意力机制的YOLOv11架构优化研究
  • 博弈论 AI:驱动网络安全从人力密集到智能自主的 245 倍跨越
  • 通用的物联网平台
  • HoRain云--jQuery选择器全解析:高效定位DOM元素
  • HoRain云--jQuery 语法
  • HoRain云--JavaScript循环控制:break与continue详解
  • 《创业之路》-865-如何利用下述分析方法找到并提前布局未来有爆发性潜力的公司:四阶价值流 × 商业模式画布 × 产品生命周期 × 创新 × 技术曲线 × 第二增长曲线 × 上中下游生态?
  • 基于可变形自注意力的YOLOv11:目标检测性能优化实践
  • mTOR(Ser2448)磷酸化如何揭示其信号网络的调控核心?
  • SpringBoot 在一次 http 请求中耗费了多少内存?
  • 商品评论分析|基于Python 商品评论分析系统(源码+数据库+文档)
  • AI健康管理|基于springboot AI健康管理系统(源码+数据库+文档)
  • 电子政务服务管理|基于springboot 电子政务服务管理系统(源码+数据库+文档)
  • 百考通AI开题报告功能:让开题写作从“压力源”变为“加速器”
  • 百考通AI开题报告功能:智能构建学术起点,让高质量开题触手可及