使用MCP构建多服务AI代理系统

什么是MCP?

MCP(Model Connector Protocol)是一种用于构建多服务AI代理系统的协议,它允许我们将不同的功能模块以服务的形式提供给AI模型调用。通过MCP,我们可以让大型语言模型(LLM)访问多个不同的服务,实现更加复杂的功能组合。

MCP的核心优势

  1. 服务解耦:将不同功能封装为独立服务
  2. 多传输方式支持:支持stdio、HTTP SSE等多种传输方式
  3. 易于集成:简单的API设计,便于与现有系统集成
  4. 工具注册机制:轻松将Python函数注册为AI可调用的工具

实战案例:构建数学计算与天气查询系统

在本文中,我们将构建一个简单的系统,它包含两个MCP服务:

  1. 数学计算服务:提供基本的数学运算
  2. 天气查询服务:提供城市天气信息

然后,我们将创建一个客户端,使用LangChain和LangGraph来让LLM调用这些服务。

第0步:安装依赖库

pip install langchain-mcp-adapters langchain-openai

export OPENAI_API_KEY=<your_api_key>

第1步:创建数学服务

首先,我们创建一个简单的数学服务,提供加法和乘法功能:

# math_server.py
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Math")

@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers"""
    print('--add--',a,b)    
    return a + b

@mcp.tool()
def multiply(a: int, b: int) -> int:
    """Multiply two numbers"""
    print('--multiply--',a,b)    
    return a * b

if __name__ == "__main__":
    mcp.run(transport="stdio")

这个服务提供了两个工具:addmultiply,分别用于加法和乘法操作。我们使用@mcp.tool()装饰器将这些函数注册为工具,使它们可以被AI模型调用。服务通过stdio传输方式运行。

第2步:创建天气服务

接下来,我们创建一个天气查询服务:

# weather_server.py
from typing import List
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Weather")

@mcp.tool()
async def get_weather(location: str) -> str:
    """Get weather for location."""
    print('--get_weather--',location)
    return "It's always sunny in New York"

if __name__ == "__main__":
    mcp.run(transport="sse")

这个服务提供了一个get_weather工具,用于获取特定位置的天气信息。这里使用的是模拟数据,实际应用中可以替换为真实的天气API调用。服务通过SSE(Server-Sent Events)传输方式运行,监听本地8000端口。

第3步:创建客户端

最后,我们创建一个客户端,用于连接这两个服务并使用LLM调用它们:

# mcp_client.py
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from langchain_mcp_adapters.client import MultiServerMCPClient

from langchain_mcp_adapters.tools import load_mcp_tools
from langgraph.prebuilt import create_react_agent

from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o")

async def main():
    print('开始执行...')
    
    print('初始化模型:', model)
    async with MultiServerMCPClient(
        {
            "math": {
                "command": "python",
                "args": ["math_server.py"],
                "transport": "stdio",
            },
            "weather": {
                "url": "http://localhost:8000/sse",
                "transport": "sse",
            }
        }
    ) as client:
        print('已连接服务器,获取工具...')
        tools = client.get_tools()
        print(f'获取到 {len(tools)} 个工具')
        
        agent = create_react_agent(model, tools)
        print('已创建agent,开始调用...')
        
        # 设置超时
        import asyncio
        
        math_response = await asyncio.wait_for(
            agent.ainvoke({"messages": "what's (3 + 5) x 12?"}),
            timeout=30
        )
        print('数学响应:', math_response)
        
        weather_response = await agent.ainvoke({"messages": "what is the weather in nyc?"})
        print('\n\n天气响应:', weather_response)

# 运行主函数
if __name__ == "__main__":
    import asyncio
    asyncio.run(main())

客户端使用MultiServerMCPClient连接两个服务:

  1. math服务:通过stdio启动math_server.py
  2. weather服务:连接到本地8000端口的SSE服务

然后,它创建一个ReAct代理,并用它来回答两个问题:一个数学计算问题和一个天气查询问题。

系统运行过程

运行这个系统的步骤如下:

  1. 运行客户端(它会自动启动数学服务器):
    python mcp_client.py
    

当客户端运行时,它会:

  1. 连接到math和weather服务
  2. 获取这些服务提供的工具
  3. 创建一个ReAct代理并配置它使用这些工具
  4. 向代理发送一个数学问题"what’s (3 + 5) x 12?"
  5. 向代理发送一个天气问题"what is the weather in nyc?"

代理会:

  1. 分析问题
  2. 选择合适的工具(add和multiply或get_weather)
  3. 调用相应的工具
  4. 基于工具返回的结果生成回答

MCP工作原理

MCP的工作流程如下:

  1. 服务注册:服务使用@mcp.tool()装饰器注册工具函数
  2. 传输层:服务通过不同的传输方式(stdio、SSE等)提供接口
  3. 客户端连接:客户端使用相应的传输方式连接服务
  4. 工具发现:客户端获取服务提供的工具列表
  5. 代理集成:将工具列表提供给LLM代理
  6. 工具调用:代理根据用户问题选择合适的工具并调用
  7. 结果处理:代理处理工具返回的结果并生成回答

优势与应用场景

MCP的主要优势在于:

  1. 模块化设计:不同功能可以独立开发和部署
  2. 灵活扩展:容易添加新的服务和工具
  3. 多种部署方式:支持本地进程和远程服务
  4. 透明代理:LLM可以自然地选择和使用工具

适用场景包括:

  • 复杂的AI助手系统
  • 需要访问多种外部服务的应用
  • 分布式AI系统
  • 需要隔离不同功能模块的环境

总结

MCP为构建多服务AI代理系统提供了一种简单而强大的方法。通过将不同功能封装为独立服务,并使用统一的协议进行通信,我们可以轻松构建复杂的AI应用。

在这个简单的例子中,我们展示了如何创建和连接多个服务,以及如何让LLM自然地使用这些服务提供的工具。这只是MCP能力的冰山一角,在实际应用中,你可以创建更多种类的服务,实现更复杂的功能组合。

MCP(Minecraft Coder Pack)是一个用于修改和研究 Minecraft 源代码的工具包,主要用于反编译、修改以及重新打包游戏文件。如果你想要搭建基于 MCP 的服务器或者对它的源码进行定制化操作,可以按照以下步骤: ### 步骤一:准备环境 1. **下载并安装 JDK**:确保你的系统已经安装了正确的 Java Development Kit (JDK),因为 MCP 工具依赖于它。 2. **获取 MCP 文件夹**:从官方渠道下载最新版本的 MCP 压缩包,并解压到指定目录。 ### 步骤二:设置工作区 1. 打开命令行终端进入 MCP 目录运行 `setup.bat` 或者对应的 Linux 脚本 (`./setup.sh`) ,这将完成初始配置包括下载必要的库文件等资源。 ```bash ./setup.sh # 对应Unix/Linux/macOS系统下的脚本名称 setup.bat # Windows系统的批处理文件名 ``` 2. 如果需要的话,请编辑 config 下的各种属性配置文件调整生成结果的行为模式比如 jar 输出路径等等信息。 ### 步骤三:开始逆向工程过程 1. 使用 `decompile.bat` 进行反编译动作,把原始字节码转换成易于理解的人类可读形式——即 java 源程序清单; - Unix/Mac 用户通过执行: ``` sh decompile.sh ``` - Win 平台直接双击或调用cmd下输入: ``` decompile.bat ``` 2. 修改 src 中的内容即可自定义功能模块或是修复原版漏洞等功能改进点; 3. 当所有更改都完成后再次构建项目,利用 `recompile.bat` 完整整个重编汇任务流程: - 同样地,在不同操作系统中有各自的指令集选择对应的方式去触发该阶段活动直至成功结束为止。 4. 接下来就是测试环节啦!借助刚才制作出来的server端jar档案启动专属实例供玩家联机互动体验咯~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值