利用Langchain轻松接入MCP服务
2025-05-29 10:34:11

MCP(Model Context Protocol)正成为AI领域的热门协议。

MCP的核心价值在于构建了AI模型与外部工具、数据源之间的标准化桥梁。这一协议正推动着行业革新,众多平台如高德地图支付宝GitHub等纷纷推出各自的MCP服务接口。

许多用户通过客户端工具(如CursorCherryCline)来体验MCP能力。然而,作为一名开发者,我更倾向于通过编程直接掌控MCP服务的接入与调用,实现更深度的集成和定制化。本文将分享如何利用Langchain框架,以编程方式高效接入MCP服务,并构建一个实用的智能应用。


案例目标:构建智能房屋选址助手

我们将开发一个应用,帮助用户根据通勤地点预算家庭情况(如是否有小孩、学校需求)等因素,智能推荐最适合的居住区域。

技术栈:

  • Python
  • Langchain (核心框架)
  • langchain_mcp_adapters (Langchain的MCP适配包)
  • langgraph (用于构建多步推理的Agent)

Langchain提供的langchain_mcp_adapters包是关键,它能将MCP服务无缝封装成Langchain可用的工具(Tool),极大地简化了集成过程。


一、理解MCP:AI的“万能接口”

MCP(Model Context Protocol) 是一个开源协议,旨在标准化AI模型与外部工具、数据源和服务之间的连接方式。你可以将其理解为AI领域的 “USB-C端口” —— 它提供了一个统一、通用的接口,使得各种AI模型能够轻松地“即插即用”不同的外部能力。

MCP解决了什么痛点?

  1. 突破信息茧房: 让模型不再局限于训练数据或简单对话,能够访问实时信息(如地图、天气)、查询数据库、调用API。
  2. 执行复杂任务: 模型可以组合调用工具完成如订票、导航、点外卖等涉及多步骤操作的实际任务。
  3. 标准化接入: 统一了不同工具和服务对模型的暴露方式,开发者无需为每个服务编写特定的适配代码。

MCP的工作原理

MCP遵循客户端-服务器(Client-Server) 架构:

  1. MCP服务器 (Provider): 如高德地图、支付宝等,它们将自己的功能(如路线规划、支付)通过MCP协议暴露出来。
  2. MCP客户端 (Consumer): 集成在AI应用(或框架如Langchain)中,负责发现可用的MCP服务器,理解其提供的工具,并按照协议调用这些工具。
  3. 模型 (Brain): 接收用户请求,理解意图,决定需要调用哪个MCP工具(通过客户端),处理工具返回的结果,并生成最终回复给用户。

例如,高德地图的MCP服务开放了强大的地理空间能力,AI模型可以直接调用它来查询地点、计算通勤时间、规划路线,为我们的房屋选址助手提供关键数据支撑。

想深入了解MCP协议细节?请参考其官方介绍


二、为什么选择Langchain?

Langchain 是一个专为构建由语言模型驱动的应用程序而设计的强大框架。它在接入和管理外部工具方面具有显著优势:

  1. 强大的工具抽象: Langchain将外部功能(API、数据库、计算器,当然也包括MCP服务)统一抽象为工具(Tool)。模型可以通过简单的接口描述来理解和调用它们。
  2. Agent智能体机制: Langchain的核心概念之一是Agent。Agent封装了语言模型和一系列工具。它能够根据用户输入,自动推理需要调用哪些工具、以什么参数调用、如何组合工具结果并生成最终回答。这大大简化了复杂任务流的构建。
  3. 生态丰富: Langchain拥有庞大的社区和丰富的集成库。langchain_mcp_adapters正是官方提供的、专门用于简化MCP服务接入的适配器包。
  4. 灵活性与可扩展性: Langchain支持多种模型提供商(OpenAI, Anthropic, DeepSeek等)和任务编排方式(如使用langgraph构建复杂工作流)。

简而言之: langchain_mcp_adapters + Langchain Agent = 快速、优雅地将任意MCP服务集成到你的AI应用中。 我们无需从零实现MCP客户端逻辑和复杂的调用决策,Langchain框架已经为我们铺好了路。


三、实战:用Langchain + MCP构建房屋选址助手

让我们一步步实现这个助手。核心思路是利用Langchain Agent协调语言模型(DeepSeek)和MCP工具(高德地图)来完成选址任务。

1. 安装依赖

1
pip install langchain langchain_mcp_adapters langchain_openai langgraph
  • langchain: 核心框架
  • langchain_mcp_adapters: MCP服务接入适配器 (关键!)
  • langchain_openai: 提供与OpenAI API兼容的模型接口(用于调用DeepSeek)
  • langgraph: 用于构建更强大、支持多步骤推理和状态管理的Agent(比基础Agent更灵活)

2. 初始化语言模型(DeepSeek)

1
2
3
4
5
6
7
8
9
from langchain_openai import ChatOpenAI

# 初始化模型,使用DeepSeek提供的兼容OpenAI API的服务
model = ChatOpenAI(
model="deepseek-chat", # 指定模型
openai_api_key="你的DeepSeek API Key", # 替换为你的实际Key
openai_api_base="https://api.deepseek.com/v1" # DeepSeek API地址
)
# 注意:也可以轻松替换为其他兼容OpenAI API的模型,如OpenAI的gpt-4, Moonshot等。

3. 初始化MCP客户端并获取工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from langchain_mcp_adapters.client import MultiServerMCPClient

# 创建MCP客户端,配置连接到高德地图的MCP服务器
client = MultiServerMCPClient(
config={
"mcpServers": {
"url": "https://mcp.amap.com/sse?key=你的高德地图MCP Key", # 替换为你的高德Key
"transport": "sse", # 使用Server-Sent Events (SSE) 协议传输
}
}
)

# 关键步骤:从配置的MCP服务器获取其提供的所有工具描述
tools = await client.get_tools()
# 此时 `tools` 是一个列表,包含了高德地图通过MCP暴露的功能(如地点搜索POI、路线规划RoutePlanning等)
  • transport: "sse": 指定使用Server-Sent Events协议进行通信,这是MCP常见的一种实时交互方式。

高德地图MCP参考请参考其官方介绍

4. 构建智能体(Agent)

1
2
3
4
5
6
from langgraph.prebuilt import create_react_agent  # 从langgraph导入创建Agent的函数

# 核心:创建ReAct智能体
# 将语言模型(model)和从MCP获取的工具列表(tools)结合起来
agent = create_react_agent(model, tools)
# 现在 `agent` 拥有了决策能力:理解用户问题 -> 判断是否需要调用工具(以及调用哪个) -> 组合结果生成回答
  • create_react_agent: 这个函数(来自langgraph.prebuilt)创建了一个基于ReAct推理模式的Agent。ReAct让Agent能够交替进行推理(Reasoning)行动(Action - 调用工具),非常适合需要多步工具调用的复杂任务。

5. 管理对话状态与历史 (ChatSession类)

为了让助手能进行多轮对话并记住上下文,我们需要一个会话管理类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class ChatSession:
def __init__(self):
# 初始化对话消息历史,包含系统角色设定
self.messages = [
{
"role": "system",
"content": "你是一个专业的房屋选址助手,帮助用户找到最适合的居住地点。你会根据用户的通勤需求(工作地点)、预算范围、家庭情况(如是否有小孩、需要靠近学校)等因素,利用地图工具查询信息并提供专业建议。清晰解释你的推理过程和推荐理由。"
}
]
self.agent = None # 稍后初始化的Agent会放在这里

async def initialize_agent(self):
"""初始化MCP客户端和Langchain Agent (整合模型与工具)"""
# (这里放置前面步骤2和3的代码: 初始化model, client, 获取tools)
client = MultiServerMCPClient(...)
tools = await client.get_tools()
# 创建整合了模型和工具的Agent
self.agent = create_react_agent(model, tools)

async def get_response(self, user_input: str) -> str:
"""处理用户输入,调用Agent获取回复,并维护对话历史"""
if not user_input.strip():
return "请告诉我您的需求,例如您的通勤地点、预算或家庭情况,我会尽力帮您分析。"

# 1. 将用户输入添加到对话历史
self.messages.append({"role": "user", "content": user_input})

try:
# 2. 关键:调用Agent处理当前对话历史!
# Agent会根据整个对话上下文决定是否需要调用工具、调用哪个工具、如何处理结果
response = await self.agent.ainvoke({"messages": self.messages})

# 3. 提取Agent生成的回复文本
if response and "output" in response:
ai_response = response["output"]
# 4. 将AI回复添加到对话历史,保持上下文连续
self.messages.append({"role": "assistant", "content": ai_response})
return ai_response
else:
return "抱歉,我暂时无法处理这个请求。"
except Exception as e:
print(f"调用Agent出错: {e}") # 实际应用中应使用日志库
return "哎呀,处理您的请求时遇到了一些技术问题,请稍后再试或尝试简化您的问题。"

6. 实现交互主循环 (命令行版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import asyncio

async def main():
# 创建聊天会话
chat = ChatSession()
# 初始化会话的Agent (加载模型和MCP工具)
await chat.initialize_agent()

# 打印欢迎信息和提示
print("您好!我是您的智能房屋选址助手。")
print("请告诉我您的需求,例如:")
print(" - 我在[XX地点]上班,伴侣在[YY地点]上班,希望找一个两人通勤都方便的区域。")
print(" - 我们的购房/租房预算是[金额]元,希望找到[区域]附近性价比高的地段。")
print(" - 我们有[年龄]岁的小孩,需要考虑附近的学校资源。")
print(" - 同时满足以上几点需求。")
print("输入 '退出'、'exit'、'quit' 或 'q' 结束对话。\n")

# 主交互循环
while True:
user_input = input("您: ").strip()
# 检查退出命令
if user_input.lower() in ['退出', 'exit', 'quit', 'q']:
print("\n感谢使用房屋选址助手!祝您早日找到理想的家园。")
break

# 获取并打印助手回复
response = await chat.get_response(user_input)
print("助手:", response)

# 程序入口
if __name__ == '__main__':
asyncio.run(main()) # 运行异步主函数

成果:一个功能完整的智能助手

通过以上步骤,你已经成功构建了一个基于Langchain框架集成高德地图MCP服务的智能房屋选址助手!这个助手能够:

  1. 理解复杂需求: 通过DeepSeek模型解析用户关于通勤、预算、家庭的描述。
  2. 调用外部能力: 利用langchain_mcp_adapters自动将高德地图的MCP服务(如地点搜索、路线规划)转化为Langchain工具。
  3. 智能决策与执行: Langchain ReAct Agent 负责核心推理,自动判断何时、如何调用地图工具获取关键信息(如距离、时间、周边设施)。
  4. 多轮对话交互: ChatSession 类维护对话历史,确保上下文连贯,提供自然的交互体验。
  5. 生成专业建议: 模型综合用户需求和工具返回的数据,生成个性化的居住地点分析和推荐理由。

这只是一个起点! 你可以轻松扩展此应用:

  • 接入更多MCP服务:如接入查询周边生活服务价格的MCP服务,接入查询工作机会分布的MCP服务等。
  • 增强Agent能力:使用langgraph构建更复杂的、带分支和循环的工作流。
  • 添加可视化:在地图上展示推荐区域或路线。
  • 开发Web界面:将命令行应用升级为Web应用或聊天机器人。

总结:Langchain + MCP 的强大组合

本文演示了如何利用 langchain_mcp_adapters 包,将新兴的 MCP 协议服务 无缝集成到 Langchain 框架 中。这种组合极大地简化了为AI模型赋予“行动力”的过程:

  1. MCP 提供标准化接口: 让各种外部服务(地图、支付、数据等)能够被AI模型统一、规范地调用。
  2. langchain_mcp_adapters 负责桥接: 将MCP服务快速转化为Langchain Agent可以直接使用的工具(Tool),省去繁琐的协议解析和封装工作。
  3. Langchain Agent 是智能中枢: 它协调语言模型的推理能力和MCP工具的执行能力,根据用户目标自动规划、执行工具调用,并生成最终结果。

通过构建“房屋选址助手”这个实例,我们看到了这种组合在解决实际问题上的高效与便捷。MCP协议正在连接起更丰富的AI能力生态,而Langchain结合langchain_mcp_adapters无疑是开发者接入这个生态、快速构建强大AI应用的利器。希望这篇指南能助你开启MCP开发之旅!

如有任何疑问或想法,欢迎邮件交流:[email protected]