MCP对智能体调用工具进行了标准化,langgraph集成了MCP能力。本文讲解智能体如何集成MCP Tool,首先介绍如何创建自己的MCP服务,然后讲解智能体如何与MCP集成。
1.创建MCP服务
智能体可以直接与第三方支持MCP的工具集成,也可以自己开发自己的支持MCP的工具。开发自己的MCP工具有两种方法,一种是在集成在智能体内的本地服务,一种是远程服务。
1.1安装MCP库
#pip install mcp
1.2创建本地MCP Server
创建本地MCP Server非常简单,就是创建一个本地python文件,在其中实现工具的逻辑。如下是一个实现加减乘除的简单计算器工具:
#math_server.py
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Math")
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b@mcp.tool()
def multiply(a: int, b: int) -> int:
"""Multiply two numbers"""
return a * b@mcp.tool()
def sub(a: int, b: int) -> int:
"""substract number b from number a"""
return a - b@mcp.tool()
def divide(a: int, b: int) -> int:
"""divide number b from number a"""
return a / bif __name__ == "__main__":
mcp.run(transport="stdio")
1.3创建远程MCP Server
创建远程MCP Server也非常简单。下面创建一个MCP Server,该工具使用搜索引擎搜索问题,具体代码如下:
#search_server.py
from mcp.server.fastmcp import FastMCP
from langchain_tavily import TavilySearch
import os, jsonos.environ["TAVILY_API_KEY"] = "tvly-*"
search_client = TavilySearch(max_results=2)
mcp = FastMCP("Search")
@mcp.tool()
async def search_internet(query: str):
"""Search information about query from Internet."""
return search_client.invoke(query)if __name__ == "__main__":
mcp.run(transport="streamable-http")
然后直接运行代码启动MCP Sever:
#python search_server.py
2.集成MCP服务
在智能体中使用MCP服务是,需要连接到MCP服务并获取服务支持的工具列表,然后把这些工具放入到工具节点中。
以下代码以一个简单的chatbot集成MCP服务:
from langchain_openai import ChatOpenAI
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import ToolNode, tools_conditionclient = MultiServerMCPClient(#实例化MCP client
{
"math": {
"command": "python",
"args": ["./math_server.py"],
"transport": "stdio",
},
"search": {
"url": "http://localhost:8000/mcp/",
"transport": "streamable_http",
}
}
)
tools = await client.get_tools() #调用MCP client获取工具列表
#以下代码是基于MCP服务提供的工具构建一个chatbot,已经见过多次,无需赘述llm = ChatOpenAI(
model = 'qwen-plus',
api_key = "sk-*",
base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1")
llm_with_tools = llm.bind_tools(tools)class State(TypedDict):
messages: Annotated[list, add_messages]graph_builder = StateGraph(State)
def chatbot(state: State):
return {"messages": [llm_with_tools.invoke(state["messages"])]}graph_builder.add_node("chatbot", chatbot)
tool_node = ToolNode(tools=tools)
graph_builder.add_node("tools", tool_node)
graph_builder.add_conditional_edges(
"chatbot",
tools_condition,
)
graph_builder.add_edge("tools", "chatbot")
graph_builder.add_edge(START, "chatbot")
graph = graph_builder.compile()
415

被折叠的 条评论
为什么被折叠?



