Langchain智能体使用MCP工具

1.MCP工具

MCP工具当前那里只是用两个,一个 高德地图开发者平台中的注册,一个是modelscope(魔塔)网站中的12306工具。

2.创建Python项目的目录结构

需要安装的依赖

bash 复制代码
pip install python-dotenv
pip install langchain-openai  (时间比较长)
pip install langchain-mcp-adapters
pip install langgraph
pip install langchain

2.1 .env 的内容

主要设置:调用千问大模型的内容,例如:

python 复制代码
QWEN_API_KEY=自己的API
QWEN_MODEL_NAME=qwen3.7-max
QWEN_BASE_URL=https://ws-se8vlyczx5091m2j.cn-beijing.maas.aliyuncs.com/compatible-mode/v1

2.2 env_utils.py

python 复制代码
import os
from dotenv import load_dotenv
# override=True 表示覆盖已存在的环境变量
load_dotenv(override=True)

QWEN_API_KEY = os.getenv('QWEN_API_KEY')
QWEN_MODEL_NAME = os.getenv('QWEN_MODEL_NAME')
QWEN_BASE_URL = os.getenv('QWEN_BASE_URL')

2.3 my_llm.py

python 复制代码
from llm_agent.env_utils import QWEN_API_KEY,QWEN_MODEL_NAME,QWEN_BASE_URL
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model = QWEN_MODEL_NAME,
    api_key = QWEN_API_KEY,
    base_url = QWEN_BASE_URL
)

2.4 my_agent.py

python 复制代码
import asyncio
import uuid

from langchain_core.messages import HumanMessage
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.checkpoint.memory import InMemorySaver
from langchain.agents import create_agent

from llm_agent.my_llm import llm

gaode_mcp_server_config = {
    "url": "https://mcp.amap.com/mcp?key=73c657a1573b27d2dac3ff3a3e570083",
    "transport": "streamable_http"
}
m12306_mcp_server_config = {
    "url": "https://mcp.api-inference.modelscope.net/fb102a0f900b41/mcp",
    "transport": "streamable_http"
}

#创建MCP客户端
mcp_client = MultiServerMCPClient({
    "gaode_mcp_server_config": gaode_mcp_server_config,
    "m12306_mcp_server_config": m12306_mcp_server_config
})

# 开发智能体
async def my_create_agent():
    mcp_tools = await mcp_client.get_tools()
  #  print(len(mcp_tools))
  #  print(mcp_tools[-2:])
    return create_agent(
        llm,
        tools=mcp_tools,
        system_prompt="你是一个智能助手,尽可能调用工具回答问题",
        checkpointer=InMemorySaver())

agent = asyncio.run(my_create_agent())

config = {
    "configurable": {
        "thread_id": str(uuid.uuid4()),
    }
}
async def main():
    #res = await agent.ainvoke(input={"messages":[HumanMessage(content="石家庄到天津高铁")]},config = config)
    res = await agent.ainvoke(input={"messages": [HumanMessage(content="石家庄今天天气")]}, config=config)
    #print(res)
    # 拿到所有消息
    msg_list = res["messages"]
    # 过滤出AI输出,取最后一条
    final_answer = None
    for msg in msg_list:
        if hasattr(msg, "content") and type(msg).__name__ == "AIMessage" and msg.content.strip():
            final_answer = msg.content
    print(final_answer)

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

测试: