情景重现(科技版)

👋重复劳动,事无巨细从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…海量而强大的功能统统都可以通过这一个协议轻松接入

image.png
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使用:
a.Tools(工具):允许大模型调用的功能函数。例如代码执行、网页浏览、发送邮件等,这些能力都可以作为可调用的工具由Server打包并提供给AI。
b.Resources(资源):给大模型提供的数据或内容。例如数据库记录、文件内容、浏览网页截图等,Server可以将这些外部数据通过协议发送给AI应用,以充当LLM的上下文。
c.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应用原型,即使没有大模型应用开发背景也能轻松上手。

image.png

核心特性

📌便捷的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 stdio
Allowed 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_file
Tool 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_file
Tool 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_directories
Tool 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 stdio
Allowed 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 stdio
Allowed 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 lazyllm
from lazyllm.tools.agent import ReactAgent
from 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等你来!


商汤万象开发者
1 声望0 粉丝