写点什么

一文讲透“MCP 协议 +LazyLLM”实战:零基础秒建 Agent 分身!

  • 2025-04-22
    北京
  • 本文字数:6875 字

    阅读完需:约 23 分钟

情景重现(科技版)


👋重复劳动,事无巨细从 0 开始


每次针对一个全新的场景开发 AI Agent 应用时,都需要针对不同的功能需求实现许多“工具”,就像每个开发者都在自己锻造一套轮子,从提示词格式到函数调用,一个都不能少,工作量大且枯燥。明明想专注在 AI 的独特功能上,写着写着却发现怎么又是在折腾同样的上下文管理和工具对接的代码!


👋开源社区好轮子难整合


开源社区其实不缺“好轮子”——各种记忆库、中间件、工具插件层出不穷,但缺乏统一标准来整合。例如,有人实现了很棒的浏览器插件或数据库查询工具,但你接入自己项目时却发现,接口格式对不上、调用方法各异......东拼西凑像玩积木还找不到说明书。每接入一个新工具都要适配磨合,好比智能手机普及之前,不同设备各自用不同充电器接口,开发者疲于寻找对应的“转接头”。


👋对话上下文管理棘手


让 AI 持续“记住”上下文并保持状态一致,是一件头疼的事。对话一长,如何不混淆角色、不遗漏关键信息?如果多个 Agent 需要共享知识,又怎么方便地复用上下文?缺乏规范的情况下,很容易出现对话状态混乱,不是这边忘记了就是那边重复了,调试起来像“大海捞针”。


难怪很多程序员戏称自己每天忙得像个铁匠

辛辛苦苦打磨轮子

却没有功夫造车

(一把辛酸泪,全是加班累...)

说到这,你可能会问

“难道就没办法彻底摆脱这些基础且重复的工作吗? ”

有办法!

好消息 好消息

MCP 就是为了解决这一痛点而来!


1.什么是 MCP?

MCP 的定义


MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 公司于 2024 年 11 月推出的一种开放标准协议,旨在让大语言模型能够“无缝连接”外部工具和数据源。


简单来说,MCP 就是为了解决开头那些痛点而生的“标准化利器”。小编提供一个更形象的比喻:MCP 相当于 AI 应用的“USB-C 接口”


正如 USB-C 统一了不同品牌电子设备的充电和数据接口一样,MCP 则标准化了 AI 与外部世界交互的方式,使得模型能够以标准化的形式高效调用数据库、工具和网络搜索等多种资源,从而实现模型与外部系统的高效联动


换句话说,过去每接入一个新工具就头大的“接口不统一”问题,有了 MCP 后就像使用统一接口的外设一样,插上就能用。这样一来,无需二次开发,多种数据库、Web API、文件系统、GitHub…海量而强大的功能统统都可以通过这一个协议轻松接入


MCP,Agent 应用的扩展坞


举个🌰


以前,你想让 AI Agent 查天气、读 PDF、执行 Python 代码,可能需要针对每个功能写一堆集成代码,其中包含工具的描述、入参等等,并封装成“工具(Tool)”给到模型;而有了 MCP,你只需要把符合需求的 MCP 服务器接上,模型就会自动知道有什么工具可用、该如何调用,并且输入输出格式也是统一好的。


使用 MCP,强大工具轻松接入


整个过程就像给笔记本电脑插上扩展坞~瞬间,额外冒出 HDMI、SD 卡、网线等接口等繁琐的对接细节由协议帮你搞定,从此开发者无需关心那些杂七杂八的转换过程。你说,MCP 的出现是不是大幅提升了 AI Agent 应用开发的效率


MCP 的技术架构


从技术架构上看,MCP 遵循的是典型的客户端-服务器模型,它把 AI 应用的内部逻辑和外部扩展功能解耦为三个核心模块:


MCP 架构图


-Host(主机)

指运行 AI 应用(类似支持 AI 对话的 IDE 插件如 Cursor、桌面应用如 Claude Desktop 以及我们所创建的智能体应用)本身的宿主环境。Host 负责提供 AI 交互环境,并在内部启动 MCP Client

-Client(客户端)

运行在 Host 内部的客户端,它与 MCP Server 建立连接,充当 AI 应用和外部世界沟通的桥梁。MCP 客户端维持与服务器的 1:1 连接,当 AI 模型需要调用工具或获取数据时,都是由 Client 按照协议与 Server 通信来完成。

-Server(服务器)

MCP 服务器提供具体的功能和数据,相当于 AI 大脑可以远程调用的外设。一个服务器上通常会暴露几类内容供 AI 使用:

  • Tools(工具):允许大模型调用的功能函数。例如代码执行、网页浏览、发送邮件等,这些能力都可以作为可调用的工具由 Server 打包并提供给 AI。

  • Resources(资源):给大模型提供的数据或内容。例如数据库记录、文件内容、浏览网页截图等,Server 可以将这些外部数据通过协议发送给 AI 应用,以充当 LLM 的上下文。

  • Prompts(提示模板):预设的可复用提示词模板或交互工作流。Server 可以储存一些常用提示词,按需提供给 AI,避免每次都从零编写复杂提示。


更多 MCP 技术架构的细节可见https://modelcontextprotocol.io/docs/concepts/architecture


MCP 与 Agent、Tool Call 的关系


通过上述架构,过去东拼西凑解决的难题,现在有了明确的协议规范可循(程序员狂喜😏)。MCP、Agent、LLM、Tool Call...这些名词之间到底有什么关系?小编解释给你听~👇


MCP,LLM,Agent,Tool Call 的关系(来自 GPT-4o)


📌LLM 是 Agent 的“大脑”,能够根据输入信息(如系统提示词、用户指令、历史对话信息、可用工具集信息等),输出对应的文字内容,其中可能是阶段性的工具调用信息,也有可能是任务完成后的最终输出内容。


📌Tool Call 是 LLM 经过大量训练后具备的一种“工具调用能力”,这种能力允许 LLM 能够综合历史信息和可用工具信息,动态决策并输出格式化的工具调用指令(决定使用哪个工具、工具调用时具体传入什么参数),通过这种指令指导 Agent 正确的完成工具调用,从而实现特定动作(如操作文件、执行代码)、获取必要信息(如返回网页爬虫结果)。


📌MCP Server 则是遵循 MCP 协议的“工具供应商”,其提供给 Agent 强大的工具集,以供 LLM 辨识并执行 Tool Call,同时接收 Agent 给到的 Tool Call 指令安全的与外部资源进行交互,以实现特定动作或返回特定信息。


📌Agent 作为智能体应用与用户交互的唯一入口,在接收到任务指令后,会有序地调用 LLM、各种工具,以完成任务。


2.使用 LazyLLM 玩转 MCP

LazyLLM 框架


LazyLLM 是一款构建多 Agent 大模型应用的开发框架(已在 GitHub 上开源,https://github.com/LazyAGI/LazyLLM ),能让开发者像搭积木一样,快速构建出具有生产力的 AI 大模型应用。LazyLLM 旨在帮助开发者以最简单的方法和最少的代码,快速构建复杂、强大的多 Agent AI 应用原型,即使没有大模型应用开发背景也能轻松上手。



【核心特性】


📌便捷的 AI 应用组装流程

即使不了解大模型,开发者仍然可以像搭积木一样,借助内置的数据流和功能模块,轻松组建包含多个 Agent 的 AI 应用。


📌复杂应用一键部署

LazyLLM 提供一键部署所有模块的能力。具体来说,LazyLLM 通过一套轻量的网关机制,简化了多 Agent 应用的部署流程,解决了依次启动各个子模块(如 LLM、Embedding 等)服务并配置 URL 的问题,使整个过程更加顺畅高效。同时,LazyLLM 则提供了一键封装镜像的能力,使得应用可以方便地利用 k8s 的网关、负载均衡、容错等能力。由此,无论是 POC 还是项目落地,有了 LazyLLM,这些都不是问题~


📌跨平台兼容

无需修改代码,即可一键切换 IaaS 平台,目前 LazyLLM 兼容裸金属服务器、开发机、Slurm 集群、公有云等。这使得开发中的应用可以无缝迁移到其他 IaaS 平台,大大减少了代码修改的工作量。


📌高效的模型微调

LazyLLM 支持对应用中的模型进行微调,持续提升应用效果。根据微调场景,自动选择最佳的微调框架和模型切分策略。这不仅简化了模型迭代的维护工作,还让开发者们能够将更多精力集中在算法和数据迭代上,而无需处理繁琐的工程化任务


无论是搭建标准大模型应用

还是实现复杂的业务逻辑

LazyLLM 尽自己所能的帮助开发者“lazy”

让每个人都能成为大模型应用的创造者!


实践:在 LazyLLM 中使用 MCP


如何在 LazyLLM 中使用 MCP 呢?针对 MCP,LazyLLM 提供了两种接入方式:直接接入部署并远程接入


📌直接接入

将指定 MCP Server 的启动配置直接给到 lazyllm.tools.MCPClient,以 Stdio 模式启动 Server,并获取 Agent 可调用的工具集。


📌部署并远程接入

针对一些资源占用高,或者期望启动的 MCP Server 可复用的场景,LazyLLM 支持 MCP Server 的一键部署,只需一行命令,便可以将 MCP Server 单独启动,随后便可以 SSE 模式远程接入 MCP Server。


1.配置 LazyLLM 所需要的所有依赖


首先参考https://docs.lazyllm.ai/zh-cn/latest/ 的 Getting started 部分,安装 LazyLLM 并完成环境配置。


同时,由于 MCP Server 的使用依赖 Node.js 和 npm,可参考https://nodejs.org/en/download 完成最新版本的安装和配置。


2.使用直接接入的方式调用 MCP


⚒️配置获取


我们选择一个文件管理 MCP Server(https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem)并获取启动配置:


{  "mcpServers": {    "filesystem": {      "command": "npx",      "args": [        "-y",        "@modelcontextprotocol/server-filesystem",        "/Users/username/Desktop"      ]    }  }}
复制代码

注意,如果你是 Windows 系统,command 需要使用"cmd",同时启动参数开头需要加上"/c"。启动配置会有些变化:


{  "mcpServers": {    "filesystem": {      "command": "cmd",      "args": [        "/c",        "npx",        "-y",        "@modelcontextprotocol/server-filesystem",        "/Users/username/Desktop"      ]    }  }}
复制代码


⚒️MCP 接入


随后便可使用 LazyLLM 的 MCPClient 工具实现 MCP Server 的接入(这里的路径示例/xxx/xxx/xxx):


>>> import lazyllm>>> from lazyllm.tools import MCPClient>>> config = {"command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "/xxx/xxx/xxx"]}>>> client = MCPClient(command_or_url=config["command"], args=config["args"], env=config.get("env"))
复制代码


⚒️工具集获取


>>> tools = client.get_tools()Secure MCP Filesystem Server running on stdioAllowed directories: [ '/Users/username/Desktop' ]>>> tools[<function generate_lazyllm_tool.<locals>.dynamic_lazyllm_func at 0x7f269cad11c0>, <function generate_lazyllm_tool.<locals>.dynamic_lazyllm_func at 0x7f269c91e520>, <function generate_lazyllm_tool.<locals>.dynamic_lazyllm_func at 0x7f269c91d800>, <function generate_lazyllm_tool.<locals>.dynamic_lazyllm_func at 0x7f269c91d8a0>, <function generate_lazyllm_tool.<locals>.dynamic_lazyllm_func at 0x7f269c91e5c0>, <function generate_lazyllm_tool.<locals>.dynamic_lazyllm_func at 0x7f269c91e0c0>, <function generate_lazyllm_tool.<locals>.dynamic_lazyllm_func at 0x7f269c91d940>, <function generate_lazyllm_tool.<locals>.dynamic_lazyllm_func at 0x7f269c91e480>, <function generate_lazyllm_tool.<locals>.dynamic_lazyllm_func at 0x7f269c91db20>, <function generate_lazyllm_tool.<locals>.dynamic_lazyllm_func at 0x7f269c91da80>, <function generate_lazyllm_tool.<locals>.dynamic_lazyllm_func at 0x7f269c91dda0>]
复制代码


代码讲解:调用 client.get_tools()可以获取当前连接的 MCP Server 中所有的工具(在异步环境中,以下代码改为 tools = await client.aget_tools()即可)。同时,LazyLLM 支持开发者通过传入工具名称列表至方法的方式获取特定的工具集,例如 client.get_tools(["tool_name1", "tool_name2"])。


⚒️工具调用


>>> for t in tools:...     print(f"\nTool name:\n{t.__name__}\nTool desc:\n{t.__doc__}\nTool params:\n{t.__annotations__}\n")... 
Tool name:read_fileTool desc:Read the complete contents of a file from the file system. Handles various text encodings and provides detailed error messages if the file cannot be read. Use this tool when you need to examine the contents of a single file. Only works within allowed directories.
Args: path (str): type: string.Tool params:{'path': <class 'str'>}

Tool name:write_fileTool desc:Create a new file or completely overwrite an existing file with new content. Use with caution as it will overwrite existing files without warning. Handles text content with proper encoding. Only works within allowed directories.
Args: path (str): type: string. content (str): type: string.Tool params:{'path': <class 'str'>, 'content': <class 'str'>}
......
Tool name:list_allowed_directoriesTool desc:Returns the list of directories that this server is allowed to access. Use this to understand which directories are available before trying to access files.
Args: No parameters.Tool params:{}
复制代码


代码讲解:遍历从 MCP Server 获取的 tools,其中每个成员都是一个函数。每个功能函数都有函数名(__name__)、函数描述(__doc__,包含了功能描与参数描述)以及入参声明(__annotations__),调用对应函数时,只需要传入正确的参数即可。下面给出两个函数调用的例子:

a. 调用文件读取工具 read_file,传入所需入参 path,即可获取读取文件后的返回信息;

b. 调用获取有权限路径工具 list_allowed_directories,该工具无需任何入参,传入空即可获得工具返回。


>>> t1 = tools[0]>>> t1.__name__'read_file'>>> t1(path="xxx/xxx/xxx/test.md")Secure MCP Filesystem Server running on stdioAllowed directories: [ 'xxx/xxx/xxx' ]'Tool call result:\nReceived text message:\nThis is a test file for LazyLLM and MCP.\n\nEnd\n'>>> t2 = tools[-1]>>> t2.__name__'list_allowed_directories'>>> t2()Secure MCP Filesystem Server running on stdioAllowed directories: [ 'xxx/xxx/xxx' ]'Tool call result:\nReceived text message:\nAllowed directories:\n/xxx/xxx/xxx'
复制代码


3.使用 LazyLLM 部署 MCP Server 并接入


LazyLLM 支持 MCP Server 的一键部署,只需一行命令,便可以将 MCP Server 单独启动,主程序可使用 SSE 模式接入 MCP Server。


⚒️一键部署 MCP Server


选择浏览器工具 platwright(https://github.com/microsoft/playwright-mcp ),获取配置信息:


{  "mcpServers": {    "playwright": {      "command": "npx",      "args": [        "@playwright/mcp@latest"      ]    }  }}
复制代码

在命令行中只需要使用“lazyllm deploy mcp_server xxxxxx”命令,并配置 host、port,即可完成 MCP Server 的部署。由于 linux 环境没有 GUI,这里演示 Windows 环境下的启动命令:


lazyllm deploy mcp_server --sse-port 11238 cmd -- /c npx @playwright/mcp@latest
复制代码


启动后如下所示:


⚒️接入部署完成的 MCP Server


我们可以在其他程序中传入 url,以 SSE 的方式接入 MCP Server,注意,这里的 url 需要加上'/sse',否则无法正常运行:


>>> config = {"url": "http://127.0.0.1:11238/sse"}>>> client = MCPClient(command_or_url=config["url"])
复制代码


用以上方式接入 MCP Server 后,具体的工具获取、工具调用方式与直接接入保持一致。


4.LazyLLM+MCP 智能体


接下来我们使用 filesystem+playwright,结合 LazyLLM 的 Agent 模块,创建一个智能体:


import lazyllmfrom lazyllm.tools.agent import ReactAgentfrom lazyllm.tools import MCPClient

if __name__ == "__main__": mcp_configs = { "file_system": { "command": "cmd", "args": [ "/c", "npx", "-y", "@modelcontextprotocol/server-filesystem", "./" ] }, "play_wright": { "url": "http://127.0.0.1:11244/sse" } }
client1 = MCPClient(command_or_url=mcp_configs["file_system"]["command"], args=mcp_configs["file_system"]["args"]) client2 = MCPClient(command_or_url=mcp_configs["play_wright"]["url"])
llm = lazyllm.OnlineChatModule(source="deepseek") agent = ReactAgent(llm=llm.share(), tools=client1.get_tools()+client2.get_tools(), max_retries=15) print(agent("浏览谷歌新闻,并写一个今日新闻简报,以markdown格式保存至本地。"))
复制代码


通过本次实践,我们可以了解到,MCP Server 的出现直接省去了 Agent 开发环节中工具研发和调试的成本,大大提升了研发效率。LazyLLM 对于 MCP 提供了灵活的接入方式,让开发者使用 MCP 的成本大大降低


3.总结


在大模型时代,开发效率就是核心竞争力。从头造轮子或许可以练手,但在真正落地 AI 应用的过程中,我们更应该把宝贵的时间和脑力,留给真正创造价值的部分——如业务逻辑设计、用户体验优化、创新交互方式等,而不是重复造工具、上下文拼接等基础组件。


MCP 提供了一套高效、统一的标准协议LazyLLM 则提供了一套灵活的 MCP 接入方案,让每一个开发者都能轻松上手,快速构建属于自己的智能 Agent 应用,从而站在社区和开源生态的“肩膀”上看得更远、做得更多。


我们呼吁更多开发者

加入这场“告别重复造轮子”的变革

拥抱开源,拥抱标准化协议

与社区共同打造

更加开放、协同、高效的 AI 生态


相关链接,请移步“LazyLLM”gzh~更多精彩,gzh 等你来!

发布于: 刚刚阅读数: 4
用户头像

用AI大模型,找商汤大装置。 2023-04-04 加入

还未添加个人简介

评论

发布
暂无评论
一文讲透“MCP协议+LazyLLM”实战:零基础秒建Agent分身!_AI_商汤万象开发者_InfoQ写作社区