Unified MCP Client Library: 连接LLM与工具的开源利器

在人工智能快速发展的今天,大型语言模型(LLM),如OpenAI的GPT系列或Anthropic的Claude,已经成为开发者构建智能应用的核心工具。然而,要让这些模型真正发挥作用,开发者往往需要将它们与各种外部工具和服务连接起来,比如网页浏览、文件操作甚至3D建模等。传统的实现方式通常需要编写大量复杂的代码,既耗时又容易出错。为了解决这一问题,Unified MCP Client Library(以下简称MCP-Use)应运而生。

MCP-Use 是一个开源的 Python 库,旨在帮助开发者以简单、高效的方式将任何支持工具调用的 LLM 连接到任何 MCP(Multi-Capability Protocol)服务器,并构建具有工具访问能力的自定义代理。本文将详细介绍 MCP-Use 的功能、特点和使用方法,帮助你快速掌握这一工具,并在自己的项目中加以应用。无论你是人工智能领域的初学者还是经验丰富的开发者,这篇文章都将为你提供实用的指导。

什么是 MCP-Use?

MCP-Use 是一个专为开发者设计的工具库,它的核心目标是简化 LLM 与外部工具的集成过程。通过 MCP-Use,你可以轻松实现以下功能:

  • 连接任意 LLM 到 MCP 服务器:支持多种主流 LLM,如 OpenAI、Anthropic、Groq 等,只要这些模型支持工具调用功能。
  • 构建自定义代理:利用 MCP 服务器提供的工具,创建能够完成特定任务的智能代理。
  • 动态选择服务器:根据任务需求,从可用的 MCP 服务器中自动选择最适合的服务器。
  • 支持多服务器:在一个代理中同时使用多个 MCP 服务器,处理更复杂的任务。
  • 工具访问控制:限制代理对某些工具的使用,确保安全性。

MCP-Use 的设计注重易用性灵活性。开发者只需几行代码,就能搭建一个功能强大的代理,完成从网页搜索到文件操作等各种任务。接下来,我们将深入探讨 MCP-Use 的主要特点和优势。

MCP-Use 的核心特点

MCP-Use 提供了多项实用功能,让它在众多工具库中脱颖而出。以下是它的核心特点:

1. 简单易用

MCP-Use 的最大亮点是它的简洁性。只需要 6 行代码,你就可以创建一个能够访问工具的智能代理。这种低门槛的设计,让开发者无需深入研究复杂的底层技术,就能快速上手。

2. 支持多种 LLM

MCP-Use 通过 LangChain 框架支持多种 LLM,包括 OpenAI 的 GPT-4o、Anthropic 的 Claude 等。只要你选择的模型支持工具调用功能,MCP-Use 就能无缝集成。这种灵活性让你可以根据项目需求自由选择合适的模型。

3. HTTP 连接支持

MCP-Use 支持直接连接到运行在特定 HTTP 端口的 MCP 服务器。这对于需要与基于 Web 的服务集成的场景尤为方便。

4. 动态服务器选择

在运行时,MCP-Use 的代理可以根据任务需求,从配置的服务器池中动态选择最合适的 MCP 服务器。这种智能选择机制提高了任务处理的效率。

5. 多服务器协作

MCP-Use 允许在一个代理中同时使用多个 MCP 服务器。比如,你可以组合网页浏览和文件操作的工具,完成更复杂的任务流程。

6. 工具访问限制

为了保证安全性,MCP-Use 提供了工具限制功能。开发者可以禁止代理使用某些潜在危险的工具,例如文件系统操作或网络访问。

7. 自定义代理支持

通过 LangChain 适配器,开发者可以根据自己的需求构建完全自定义的代理。如果你有特定的任务场景,MCP-Use 也能满足你的要求。

这些特点使得 MCP-Use 成为一个强大且实用的工具库。接下来,我们将通过具体的代码示例,展示如何快速上手 MCP-Use。

如何开始使用 MCP-Use?

要使用 MCP-Use,你需要准备以下环境:

  • Python 3.11 或更高版本
  • MCP 服务器实现,如 Playwright MCP。
  • LangChain 及相关 LLM 库,如 langchain-openai 或 langchain-anthropic。

安装 MCP-Use

你可以通过以下命令使用 pip 安装 MCP-Use:

pip install mcp-use

或者从源代码安装:

git clone https://github.com/pietrozullo/mcp-use.git
cd mcp-use
pip install -e .

安装 LangChain 提供者

MCP-Use 通过 LangChain 与不同的 LLM 提供者集成。你需要根据使用的 LLM 安装对应的包,例如:

# 用于 OpenAI
pip install langchain-openai

# 用于 Anthropic
pip install langchain-anthropic

然后,在 .env 文件中添加你的 API 密钥:

OPENAI_API_KEY=your_openai_api_key
ANTHROPIC_API_KEY=your_anthropic_api_key

注意:只有支持工具调用功能的 LLM 才能与 MCP-Use 配合使用。在选择模型时,请确认其支持函数调用或工具使用。

创建第一个代理

下面是一个简单的示例,展示如何使用 MCP-Use 创建一个代理,并完成一个任务:

import asyncio
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from mcp_use import MCPAgent, MCPClient

async def main():
    # 加载环境变量
    load_dotenv()

    # 创建配置字典
    config = {
        "mcpServers": {
            "playwright": {
                "command""npx",
                "args": ["@playwright/mcp@latest"],
                "env": {
                    "DISPLAY"":1"
                }
            }
        }
    }

    # 从配置字典创建 MCPClient
    client = MCPClient.from_dict(config)

    # 创建 LLM
    llm = ChatOpenAI(model="gpt-4o")

    # 使用 client 创建代理
    agent = MCPAgent(llm=llm, client=client, max_steps=30)

    # 运行查询
    result = await agent.run(
        "Find the best restaurant in San Francisco",
    )
    print(f"\nResult: {result}")

if __name__ == "__main__":
    asyncio.run(main())

这段代码首先加载环境变量,然后定义了一个 MCP 服务器配置(这里使用 Playwright MCP)。接着,它创建了一个 MCPClient 实例和一个 LLM 实例(使用 GPT-4o 模型),并基于这两者构建了一个代理。最后,代理执行任务“寻找旧金山最好的餐厅”,并输出结果。

你也可以通过配置文件加载服务器设置。例如:

client = MCPClient.from_config_file(
    os.path.join("browser_mcp.json")
)

配置文件 browser_mcp.json 的内容如下:

{
    "mcpServers": {
        "playwright": {
            "command""npx",
            "args": ["@playwright/mcp@latest"],
            "env": {
                "DISPLAY"":1"
            }
        }
    }
}

这种方式更便于管理和复用配置。

MCP-Use 的实际应用场景

MCP-Use 的强大之处在于它的多功能性。以下是几个实际应用的例子,展示它在不同场景下的用法。

1. 使用 Playwright 进行网页浏览

import asyncio
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from mcp_use import MCPAgent, MCPClient

async def main():
    # 加载环境变量
    load_dotenv()

    # 从配置文件创建 MCPClient
    client = MCPClient.from_config_file(
        os.path.join(os.path.dirname(__file__), "browser_mcp.json")
    )

    # 创建 LLM
    llm = ChatOpenAI(model="gpt-4o")

    # 使用 client 创建代理
    agent = MCPAgent(llm=llm, client=client, max_steps=30)

    # 运行查询
    result = await agent.run(
        "Find the best restaurant in San Francisco USING GOOGLE SEARCH",
        max_steps=30,
    )
    print(f"\nResult: {result}")

if __name__ == "__main__":
    asyncio.run(main())

这个例子展示了如何使用 Playwright MCP 服务器进行网页浏览。代理通过 Google 搜索找到旧金山的最佳餐厅,并返回结果。

2. Airbnb 住宿搜索

import asyncio
import os
from dotenv import load_dotenv
from langchain_anthropic import ChatAnthropic
from mcp_use import MCPAgent, MCPClient

async def run_airbnb_example():
    # 加载环境变量
    load_dotenv()

    # 从配置文件创建 MCPClient
    client = MCPClient.from_config_file(
        os.path.join(os.path.dirname(__file__), "airbnb_mcp.json")
    )

    # 创建 LLM
    llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")

    # 使用 client 创建代理
    agent = MCPAgent(llm=llm, client=client, max_steps=30)

    try:
        # 运行查询
        result = await agent.run(
            "Find me a nice place to stay in Barcelona for 2 adults "
            "for a week in August. I prefer places with a pool and "
            "good reviews. Show me the top 3 options.",
            max_steps=30,
        )
        print(f"\nResult: {result}")
    finally:
        # 清理资源
        if client.sessions:
            await client.close_all_sessions()

if __name__ == "__main__":
    asyncio.run(run_airbnb_example())

配置文件 airbnb_mcp.json

{
    "mcpServers": {
        "airbnb": {
            "command""npx",
            "args": ["-y""@openbnb/mcp-server-airbnb"]
        }
    }
}

这个例子展示了如何使用 MCP-Use 连接 Airbnb MCP 服务器,搜索巴塞罗那的住宿,并筛选出带泳池且评价良好的前三个选项。

3. 使用 Blender 创建 3D 模型

import asyncio
from dotenv import load_dotenv
from langchain_anthropic import ChatAnthropic
from mcp_use import MCPAgent, MCPClient

async def run_blender_example():
    # 加载环境变量
    load_dotenv()

    # 创建配置字典
    config = {"mcpServers": {"blender": {"command""uvx""args": ["blender-mcp"]}}}
    client = MCPClient.from_dict(config)

    # 创建 LLM
    llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")

    # 使用 client 创建代理
    agent = MCPAgent(llm=llm, client=client, max_steps=30)

    try:
        # 运行查询
        result = await agent.run(
            "Create an inflatable cube with soft material and a plane as ground.",
            max_steps=30,
        )
        print(f"\nResult: {result}")
    finally:
        # 清理资源
        if client.sessions:
            await client.close_all_sessions()

if __name__ == "__main__":
    asyncio.run(run_blender_example())

这个例子展示了如何使用 Blender MCP 服务器创建一个 3D 模型,包括一个充气立方体和地面平面。

高级功能

MCP-Use 还提供了一些高级功能,帮助开发者应对更复杂的场景。

1. 配置文件支持

你可以通过配置文件初始化 MCP-Use,方便管理和切换服务器设置:

import asyncio
from mcp_use import create_session_from_config

async def main():
    # 从配置文件创建 MCP 会话
    session = create_session_from_config("mcp-config.json")

    # 初始化会话
    await session.initialize()

    # 使用会话...

    # 断开连接
    await session.disconnect()

if __name__ == "__main__":
    asyncio.run(main())

2. HTTP 连接

MCP-Use 支持通过 HTTP 连接到 MCP 服务器:

import asyncio
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from mcp_use import MCPAgent, MCPClient

async def main():
    # 加载环境变量
    load_dotenv()

    config = {
        "mcpServers": {
            "http": {
                "url""http://localhost:8931/sse"
            }
        }
    }

    # 从配置创建 MCPClient
    client = MCPClient.from_dict(config)

    # 创建 LLM
    llm = ChatOpenAI(model="gpt-4o")

    # 使用 client 创建代理
    agent = MCPAgent(llm=llm, client=client, max_steps=30)

    # 运行查询
    result = await agent.run(
        "Find the best restaurant in San Francisco USING GOOGLE SEARCH",
        max_steps=30,
    )
    print(f"\nResult: {result}")

if __name__ == "__main__":
    asyncio.run(main())

3. 多服务器支持

MCP-Use 可以在一个代理中同时使用多个服务器。例如:

import asyncio
from mcp_use import MCPClient, MCPAgent
from langchain_anthropic import ChatAnthropic

async def main():
    # 从配置文件创建 client
    client = MCPClient.from_config_file("multi_server_config.json")

    # 创建代理
    agent = MCPAgent(
        llm=ChatAnthropic(model="claude-3-5-sonnet-20240620"),
        client=client,
        use_server_manager=True  # 启用服务器管理器
    )

    try:
        # 运行查询
        result = await agent.run(
            "Search for a nice place to stay in Barcelona on Airbnb, "
            "then use Google to find nearby restaurants and attractions."
        )
        print(result)
    finally:
        # 清理会话
        await client.close_all_sessions()

if __name__ == "__main__":
    asyncio.run(main())

配置文件 multi_server_config.json

{
    "mcpServers": {
        "airbnb": {
            "command""npx",
            "args": ["-y""@openbnb/mcp-server-airbnb"]
        },
        "playwright": {
            "command""npx",
            "args": ["@playwright/mcp@latest"],
            "env": {
                "DISPLAY"":1"
            }
        }
    }
}

启用 use_server_manager=True 后,代理会根据任务需求智能选择服务器。

4. 工具访问控制

你可以限制代理的工具访问权限:

import asyncio
from mcp_use import MCPAgent, MCPClient
from langchain_openai import ChatOpenAI

async def main():
    # 创建 client
    client = MCPClient.from_config_file("config.json")

    # 创建代理并限制工具
    agent = MCPAgent(
        llm=ChatOpenAI(model="gpt-4"),
        client=client,
        disallowed_tools=["file_system""network"]  # 限制潜在危险工具
    )

    # 运行查询
    result = await agent.run(
        "Find the best restaurant in San Francisco"
    )
    print(result)

    # 清理
    await client.close_all_sessions()

if __name__ == "__main__":
    asyncio.run(main())

构建自定义代理

MCP-Use 支持使用 LangChain 适配器构建自定义代理:

import asyncio
from langchain_openai import ChatOpenAI
from mcp_use.client import MCPClient
from mcp_use.adapters.langchain_adapter import LangChainAdapter
from dotenv import load_dotenv

load_dotenv()

async def main():
    # 初始化 MCP client
    client = MCPClient.from_config_file("examples/browser_mcp.json")
    llm = ChatOpenAI(model="gpt-4o")

    # 创建适配器实例
    adapter = LangChainAdapter()
    # 获取 LangChain 工具
    tools = await adapter.create_tools(client)

    # 创建自定义 LangChain 代理
    llm_with_tools = llm.bind_tools(tools)
    result = await llm_with_tools.ainvoke("What tools do you have available? ")
    print(result)

if __name__ == "__main__":
    asyncio.run(main())

调试方法

MCP-Use 提供内置的调试模式,帮助开发者诊断问题:

1. 使用环境变量启用调试

# 显示 INFO 级别消息
DEBUG=1 python your_script.py

# 显示 DEBUG 级别消息(详细输出)
DEBUG=2 python your_script.py

2. 在代码中设置调试

import mcp_use

mcp_use.set_debug(1)  # INFO 级别
# 或
mcp_use.set_debug(2)  # DEBUG 级别

3. 代理特定调试

agent = MCPAgent(
    llm=your_llm,
    client=your_client,
    verbose=True  # 显示代理的调试信息
)

总结

MCP-Use 是一个功能丰富且易于使用的开源库,为开发者提供了一种高效的方式,将 LLM 与外部工具集成。它的简单性、灵活性和安全性使其成为构建智能代理的理想选择。无论是网页浏览、住宿搜索还是 3D 建模,MCP-Use 都能帮助你快速实现目标。

如果你对 MCP-Use 感兴趣,可以访问 GitHub 仓库 获取更多信息,或直接开始尝试。希望这篇文章能为你提供足够的指导,让你在自己的项目中充分发挥 MCP-Use 的潜力!


引用

如果你在项目中使用 MCP-Use,请引用:

@software{mcp_use2025,
  author = {Zullo, Pietro},
  title = {MCP-Use: MCP Library for Python},
  year = {2025},
  publisher = {GitHub},
  url = {https://github.com/pietrozullo/mcp-use}
}

许可证

MIT