爆火的MCP!手把手教你用langchain打造自己的AI服务

最近MCP(Model Context Protocol)太火了,大家纷纷使用MCP来实现各种神奇功能,比如添加文件的MCP、语音合成的MCP等等。MCP的出现极大地简化了开发过程。在过去,我们通常使用Function Call来封装外部方法,而现在,MCP则提供了一种更灵活、更直观的方案。

今天,我们就借助langchain-mcp快速实现自己的MCP服务!

环境准备

我的Python开发环境是3.12版本,只要Python版本大于3.10即可。

先安装必要的依赖:

pip install langchain-mcp-adapters
pip install langchain_openai
pip install langchain langgraph

注:这里我用的是OpenAI的代理,如果你使用DeepSeek,也可以安装langchain-deepseek。

创建Math MCP Server

新建文件 math_server.py,内容如下:

from mcp.server.fastmcp import FastMCP
import logging

logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)

mcp = FastMCP("Math")

@mcp.tool()
def add(a: int, b: int) -> int:
    logger.info("The add method is called: a=%d, b=%d", a, b)
    return a + b

@mcp.tool()
def multiply(a: int, b: int) -> int:
    logger.info("The multiply method is called: a=%d, b=%d", a, b)
    return a * b

if __name__ == "__main__":
    logger.info("Start math server through MCP")
    mcp.run(transport="stdio")

创建Weather MCP Server

同理,创建天气服务文件 weather_server.py

from mcp.server.fastmcp import FastMCP
import logging

logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)

mcp = FastMCP("Weather")

@mcp.tool()
def get_weather(city: str) -> str:
    logger.info("Getting weather for city=%s", city)
    # 模拟返回天气信息
    return f"{city}天气晴朗,25℃"

if __name__ == "__main__":
    logger.info("Start weather server through MCP")
    mcp.run(transport="stdio")

创建动态调用的MCP Client

新建文件 remote_client.py

import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent

llm = ChatOpenAI(model="gpt-4o-mini", api_key="sk-xxx", base_url="https://api.gptsapi.net/v1")

def print_optimized_result(agent_response):
    messages = agent_response.get("messages", [])
    for message in messages:
        if message.type == "ai":
            print("最终答案:", message.content)

async def main():
    client = MultiServerMCPClient({
        "math": {"command": "python", "args": ["./math_server.py"], "transport": "stdio"},
        "weather": {"command": "python", "args": ["./weather_server.py"], "transport": "stdio"}
    })

    tools = await client.get_tools()
    agent = create_react_agent(llm, tools)

    while True:
        user_input = input("\n请输入您的问题(或输入'exit'退出):").strip()
        if user_input.lower() == "exit":
            print("感谢使用!再见!")
            break

        agent_response = await agent.ainvoke({"messages": user_input})
        print_optimized_result(agent_response)

    await client.aclose()

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

关键代码解读

  • langgraph.prebuilt 是 LangGraph 提供的预构建模块,可快速创建ReAct风格的Agent。

  • create_react_agent(llm, tools) 将工具集合到一个Agent中,实现任务的自动调度。

运行测试

分别运行 math_server.pyweather_server.py,再启动 remote_client.py 即可通过AI对话动态调用服务,观察日志输出效果。

至此,已经完成了AI与MCP的完美结合,你可以通过编写自己的MCP服务,集成到大模型中,构建自己的Agent了。

欢迎大家关注我,后续会分享更多有意思的文章。

### 关于LangChain中的MCP概念 目前,在已知的公开资料中并未提及LangChain框架中有具体名为"MCP"的概念或实现[^4]。然而,可以推测这里的"MCP"可能指代的是某种模型控制点(Model Control Point),或者是与链式调用、模块化设计相关的特定功能。 #### 可能的意义解释 1. **Model Control Points (模型控制点)** 如果假设MCP代表模型控制点,则其作用可能是为了定义和管理大型语言模型在执行过程中的关键节点。这些节点可用于监控模型状态、调整参数或者触发某些事件。这种机制类似于深度学习训练中的回调函数(callbacks)[^5],用于动态干预模型的行为。 2. **Module Connection Protocol (模块连接协议)** 基于LangChain的设计理念——即通过链条(chain)将不同组件组合起来形成复杂的工作流,MCP也可能是一种抽象层,用来描述如何高效地链接不同的模块并传递数据。这与SocketCAN框架中的低级API接口类似[^2],旨在提供一种标准化的方式以促进各部分之间的通信。 3. **Custom Implementation within Chains** 用户可以在自定义chain内部创建所谓的“control points”,从而更好地掌控整个流程逻辑。虽然这不是官方预设的功能名称,但从实际应用角度来看确实存在这样的需求场景[^6]。 以下是基于上述理解构建的一个简单示例代码片段展示如何模拟设置此类控制点: ```python from langchain import PromptTemplate, LLMChain from langchain.llms import OpenAI def create_mcp_chain(): template = """You are an AI assistant that helps people find information. Your task now includes a Model Control Point where you must verify the input before processing it. Input: {input} Verification Step: If the input contains any illegal characters like '@', '#', reject it immediately with error message 'Invalid Character Detected'. Processed Output:""" prompt = PromptTemplate(template=template, input_variables=["input"]) llm = OpenAI() verification_chain = LLMChain(prompt=prompt, llm=llm) return verification_chain if __name__ == "__main__": chain = create_mcp_chain() result = chain.run(input="Test string without special symbols.") print(result) ``` 此脚本展示了怎样向标准LLM Chain加入额外验证步骤作为假想中的'MCP'实例之一。 ### 结论 综上所述,“MCP”并非当前版本langchain文档里明确指出的一部分;但是依据项目特性以及其它技术领域常见模式推断得出几种合理诠释方向。如果确切含义超出常规猜测范围之外的话,则建议查阅最新版源码注释或是联系开发者团队获取权威解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值