
随着MCP的日益普及,许多AI能力都需要封装为一个个MCP。之前我在文章MCP:AI原生应用开发的Building Blocks中介绍过MCP Server Hub,它的目的是方便大家发现好的MCP Server & Tool资源。
今天介绍一款开源的框架mcp-use,它可以降低我们创建MCP的难度,例如让开发者轻松地将任何 LLM 连接到诸如网络浏览、文件操作等工具,构建具有工具访问权限的自定义 MCP Agent。
MCP-Use 是连接任何 LLM 到任何 MCP 服务器的开源方式,并构建具有工具访问权限的自定义 MCP 代理,无需使用闭源或应用程序客户端。让开发者轻松地将任何 LLM 连接到诸如网络浏览、文件操作等工具。
我正在考虑为我们团队的工具平台集成MCP,通过mcp-use,开发工作量会得到极大降低。例如说,我希望自己的工具能够成为MCP Host,则可以在工具层面同样定义类似Cursor那样的mcp.json文件,如:
{
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"],
"env": {
"DISPLAY": ":1"
}
}
}
}这个文件可以作为config,传给mcp-use,用于创建MCP Client:client = MCPClient.from_config_file(
os.path.join("mcp.json")
)也可以把配置放到代码中,然后根据该配置创建MCP Client: config = {
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"],
"env": {
"DISPLAY": ":1"
}
}
}
}
client = MCPClient.from_dict(config)接下来,通过智能体把LLM与MCP Client连接起来:# Create LLM
llm = ChatOpenAI(model="gpt-4o")
# Create agent with the client
agent = MCPAgent(llm=llm, client=client, max_steps=30)然后就可以通过智能体接受用户请求:# Run the query
result = await agent.run(
"Find the best restaurant in San Francisco",
)通过mcp-use创建的智能体除了可以通过run运行以执行查询外,还支持流式输出,即通过调用astream(query):
async for chunk in agent.astream("Find the best restaurant in San Francisco"):
print(chunk["messages"], end="", flush=True)mcp-use不仅支持连接本地部署(通过前面所示的Config文件)的MCP Server之外,还支持Http连接,特别适用于与基于 Web 的 MCP 服务器集成。连接的方法完全一样,只需要将config的内容设置为你要连接的http通信协议的MCP Server即可。例如我之前一直是在Cursor下连接墨问MCP Server,它在Cursor的mcp.json中的配置为:{
"mcpServers": {
"墨问创作助手": {
"url": "https://open.mowen.cn/api/open/mcp/v1/note?key=[我的API Key]"
}
}
}现在,也可以将其配置为mcp-use要求的格式: config = {
"mcpServers": {
"http": {
"url": "https://open.mowen.cn/api/open/mcp/v1/note?key=[我的API Key]"
}
}
}有了这一特性,我们就可以在工具平台的集成中心接入越来越多的MCP Server,最后,也可以打造为我们自己的MCP Server HUB。
或许会有疑问:随着接入的MCP Server越来越多,超过单个节点的负载,又该怎么办?没关系,mcp-use还支持多服务器的配置,而在默认情况下,MCPAgent能够访问所有配置服务器中的工具。如果需要为特定任务指定一个特定的服务器,可以在调用 agent.run() 方法时指定 server_name。
框架还提供了服务器管理器,使得智能体能够动态选择服务器,只需要在初始化 MCPAgent时通过设置use_server_manager=True就可以启用服务器管理器。
除此之外,mcp-use还支持对工具访问的控制,以提供更好的安全性和对智能体能力的控制;它甚至支持将自己创建的智能体交给LangChain来调用,这一特性的实现也很简单,无非就是引入一个适配器模式,通过定义LangChainAdapter适配器类,就可以以如下方式把mcp-use创建的client传递给适配器的create_tools()函数,然后就变成了LangChain的实现方式:
# Initialize MCP client
client = MCPClient.from_config_file("examples/browser_mcp.json")
llm = ChatOpenAI(model="gpt-4o")
# Create adapter instance
adapter = LangChainAdapter()
# Get LangChain tools with a single line
tools = await adapter.create_tools(client)
# Create a custom LangChain agent
llm_with_tools = llm.bind_tools(tools)
result = await llm_with_tools.ainvoke("What tools do you have available ? ")这个框架目前在github上已有4.6k的star,目前版本为1.6.7。