{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "dede82b5", "metadata": {}, "outputs": [], "source": [ "# 安装依赖:uv pip install langchain_mcp_adapters langchain-deepseek -i https://pypi.tuna.tsinghua.edu.cn/simple\n", "\n", "from langchain_mcp_adapters.client import MultiServerMCPClient\n", "\n", "# MultiServerMCPClient 可以同时挂多个 MCP Server,给每个 Server 起个名字即可\n", "mcp_client = MultiServerMCPClient({\n", " \"amap\": {\n", " \"transport\": \"sse\",\n", " \"url\": \"https://mcp.api-inference.modelscope.net/6ae8935632f641/sse\"\n", " },\n", " \"mcp_tools\": {\n", " \"url\": \"http://localhost:8000/sse\", # 指向上面启动的 FastMCP 服务\n", " \"transport\": \"sse\",\n", " },\n", " })" ] }, { "cell_type": "code", "execution_count": 13, "id": "e1f6c411", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "当前可用工具:['maps_regeocode', 'maps_geo', 'maps_ip_location', 'maps_weather', 'maps_search_detail', 'maps_bicycling', 'maps_direction_walking', 'maps_direction_driving', 'maps_direction_transit_integrated', 'maps_distance', 'maps_text_search', 'maps_around_search']\n" ] } ], "source": [ "#获取工具\n", "tools = await mcp_client.get_tools()\n", "print(f\"当前可用工具:{[t.name for t in tools]}\")" ] }, { "cell_type": "code", "execution_count": 2, "id": "a6f98a4f", "metadata": {}, "outputs": [], "source": [ "from langchain_deepseek import ChatDeepSeek\n", "from langchain.agents import create_agent\n", "from langchain_core.prompts import ChatPromptTemplate\n", "import os\n", "from dotenv import load_dotenv\n", "\n", "load_dotenv()\n", "\n", "api_key = os.getenv('OPENAI_API_KEY')\n", "\n", "# 使用 DeepSeek 作为底座模型(国内访问快、性价比高)\n", "llm = ChatDeepSeek(\n", " model=\"deepseek-chat\",\n", " api_key=api_key, # 替换为你自己的 API Key\n", ")\n", "\n", "async def ask_agent(question: str) -> str:\n", " \"\"\"\n", " 核心调用函数:从 MCP Server 拉取工具 → 注入 Agent → 执行对话。\n", "\n", " 每次调用都会重新拉取工具列表,保证服务端的工具变更能实时生效。\n", " \"\"\"\n", " # 第一步:向所有已配置的 MCP Server 拉取可用工具\n", " tools = await mcp_client.get_tools()\n", "\n", " # 第二步:用工具 + 模型 + 提示词组装 Agent\n", " agent = create_agent(\n", " model=llm,\n", " tools=tools,\n", " system_prompt=\"你是一个出行助手,可以使用地图工具帮用户查天气、规划路线。回答要简洁,不要编造数据。\",\n", " )\n", "\n", " # 第三步:执行对话,让 LLM 自行判断是否需要调用工具\n", " result = await agent.ainvoke({\n", " \"messages\": [{\"role\": \"user\", \"content\": question}]\n", " })\n", "\n", " # 第四步:返回最后一条消息(即 LLM 的最终回复)\n", " return result[\"messages\"][-1].content" ] }, { "cell_type": "code", "execution_count": 3, "id": "8e81fc28", "metadata": {}, "outputs": [], "source": [ "import asyncio\n", "\n", "async def main():\n", " # 查天气——LLM 会自动调用 amap 的天气工具\n", " # weather = await ask_agent(\"成都今天天气怎么样?\")\n", " # print(f\"天气查询结果:{weather}\\n\")\n", "\n", " # # 规划路线——不同的问题,LLM 会选择不同的工具\n", " # route = await ask_agent(\"帮我规划一条从春熙路到双流机场的地铁换乘路线\")\n", " # print(f\"路线规划结果:{route}\")\n", "\n", " route = await ask_agent(\"帮助我计算 bmi,我的体重是 100kg,身高 192cm\")\n", " print(f\"路线规划结果:{route}\")\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "38a6ab86", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "路线规划结果:你的 BMI 计算结果如下:\n", "\n", "- **BMI 指数**:27.1\n", "- **健康评级**:**偏胖**\n", "- **建议**:注意饮食,可以适当增加运动哦 🏃\n", "\n", "BMI 在 18.5~24 之间属于正常范围,你目前略高一些,保持健康生活习惯就好!还有其他需要帮忙的吗?\n" ] } ], "source": [ "await main()" ] } ], "metadata": { "kernelspec": { "display_name": "06_mcp (3.11.x)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.15" } }, "nbformat": 4, "nbformat_minor": 5 }