MCP(Model Context Protocol):大模型 Agent 开发的统一规范与实战指南

举报
码上开花_Lancer 发表于 2025/07/21 15:13:26 2025/07/21
【摘要】 在大模型 Agent 技术爆发的当下,开发者们常常面临一个痛点:如何让大模型更便捷地调用外部工具?传统的 Function calling 技术需要编写大量代码、定义 JSON Schema,还得设计提示词模板,门槛颇高。而 MCP(Model Context Protocol,模型上下文协议)的出现,为这一问题提供了优雅的解决方案。一、MCP 技术体系核心解析1. MCP 的本质与价值MC...
在大模型 Agent 技术爆发的当下,开发者们常常面临一个痛点:如何让大模型更便捷地调用外部工具?传统的 Function calling 技术需要编写大量代码、定义 JSON Schema,还得设计提示词模板,门槛颇高。而 MCP(Model Context Protocol,模型上下文协议)的出现,为这一问题提供了优雅的解决方案。

一、MCP 技术体系核心解析

1. MCP 的本质与价值

MCP 由 Claude 母公司 Anthropic 于 2024 年 11 月提出,是一种智能体(Agent)开发的技术协议。它通过 “车同轨、书同文” 的思路,统一了大模型调用外部工具的运行规范,避免了外部函数的重复开发,大幅降低了 Agent 开发门槛。

形象地说,MCP 将大模型运行环境称为MCP Client(客户端),将外部函数运行环境称为MCP Server(服务器),并规定了两者的通信标准。这一统一使得开发者可以共享已有的 MCP 服务器,无需重复编写查询天气、数据库交互等通用功能的代码。

2. 与 Function calling 的对比

Function calling 作为大模型调用外部工具的经典方案,存在明显局限:

  • 编写外部函数需大量代码(常达上百行)
  • 需为每个函数编写 JSON Schema 说明
  • 需设计提示词模板以提高调用准确率

而 MCP 通过统一规范,让开发者只需关注业务逻辑,无需重复处理通信细节。截至目前,GitHub 上已有数千个开源 MCP 服务器,涵盖数据库操作、网页爬取、命令行控制等多种功能。

二、MCP 客户端开发实战

1. 开发环境准备:uv 工具

MCP 开发推荐使用 uv 进行依赖管理和虚拟环境创建,它比 pip 和 conda 更快、更高效:

  • 安装
    # 方法1:通过pip
    pip install uv
    # 方法2:通过curl
    curl -LsSf https://astral.sh/uv/install.sh | sh
    
  • 基本用法
    # 创建虚拟环境
    uv venv myenv
    # 激活虚拟环境(Linux/macOS)
    source myenv/bin/activate
    # 安装依赖
    uv add mcp openai python-dotenv
    

2. 极简客户端搭建

python环境运行
import asyncio
from mcp import ClientSession
from contextlib import AsyncExitStack

class MCPClient:
    def __init__(self):
        self.session = None
        self.exit_stack = AsyncExitStack()

    async def connect_to_mock_server(self):
        print("✅ MCP客户端已初始化,未连接到服务器")

    async def chat_loop(self):
        print("\nMCP客户端已启动!输入'quit'退出")
        while True:
            query = input("\nQuery: ").strip()
            if query.lower() == 'quit':
                break
            print(f"\n🤖 [Mock Response] 你说的是:{query}")

    async def cleanup(self):
        await self.exit_stack.aclose()

async def main():
    client = MCPClient()
    try:
        await client.connect_to_mock_server()
        await client.chat_loop()
    finally:
        await client.cleanup()

if __name__ == "__main__":
    asyncio.run(main())
运行命令:uv run client.py,即可启动一个简单的交互式客户端。

3. 接入在线模型(OpenAI/DeepSeek)

  1. 创建.env 文件
    # OpenAI配置
    BASE_URL="反向代理地址"
    MODEL=gpt-4o
    OPENAI_API_KEY="你的API密钥"
    
    # 或DeepSeek配置
    BASE_URL=https://api.deepseek.com
    MODEL=deepseek-chat
    OPENAI_API_KEY="你的DeepSeek密钥"
    
  2. 修改客户端代码
    python环境下运行
    import os
    from openai import OpenAI
    from dotenv import load_dotenv
    
    class MCPClient:
        def __init__(self):
            load_dotenv()
            self.openai_api_key = os.getenv("OPENAI_API_KEY")
            self.base_url = os.getenv("BASE_URL")
            self.model = os.getenv("MODEL")
            self.client = OpenAI(api_key=self.openai_api_key, base_url=self.base_url)
    
        async def process_query(self, query: str) -> str:
            messages = [{"role": "user", "content": query}]
            response = self.client.chat.completions.create(
                model=self.model,
                messages=messages
            )
            return response.choices[0].message.content
    

4. 接入本地模型(ollama/vLLM)

  • ollama 配置(以 QwQ-32B 为例):
    BASE_URL=http://localhost:11434/v1/
    MODEL=qwq
    OPENAI_API_KEY=ollama
    
  • vLLM 配置
    BASE_URL=http://localhost:8000/v1
    MODEL=./QwQ-32B
    OPENAI_API_KEY=EMPTY
    
启动客户端后,即可通过本地模型进行对话,无需联网。

三、MCP 服务器开发与通信

1. 服务器核心概念

MCP 服务器可提供三种能力:
  • Resources:资源访问(如文件、API 响应)
  • Tools:工具函数(如天气查询、数据库操作)
  • Prompts:提示词模板(用于 Agent 开发各环节)
通信方式支持两种:
  • stdio:本地进程间通信,适用于同一环境
  • HTTP+SSE:远程通信,支持服务器向客户端实时推送数据

2. 天气查询服务器示例

  1. 安装依赖
    uv add mcp httpx
    
  2. 服务器代码
    python运行
    from mcp.server.fastmcp import FastMCP
    import httpx
    
    mcp = FastMCP("WeatherServer")
    OPENWEATHER_API_BASE = "https://api.openweathermap.org/data/2.5/weather"
    API_KEY = "你的OpenWeather密钥"
    
    @mcp.tool()
    async def query_weather(city: str) -> str:
        """查询指定城市的天气(城市名需为英文)"""
        params = {
            "q": city,
            "appid": API_KEY,
            "units": "metric",
            "lang": "zh_cn"
        }
        async with httpx.AsyncClient() as client:
            response = await client.get(OPENWEATHER_API_BASE, params=params)
            return format_weather(response.json())
    
    def format_weather(data):
        # 格式化天气数据为易读文本
        return f"{data['name']}:温度{data['main']['temp']}°C,{data['weather'][0]['description']}"
    
    if __name__ == "__main__":
        mcp.run(transport='stdio')  # 以stdio方式运行
    

3. 客户端调用服务器

python运行
async def connect_to_server(self, server_script_path: str):
    # 启动服务器进程
    server_params = StdioServerParameters(
        command="python",
        args=[server_script_path]
    )
    stdio_transport = await stdio_client(server_params)
    self.session = ClientSession(*stdio_transport)
    await self.session.initialize()

    # 调用工具
    result = await self.session.call_tool("query_weather", {"city": "Beijing"})
    print(result.content[0].text)  # 输出北京天气
运行客户端时指定服务器脚本:uv run client.py server.py,即可实现天气查询功能。

四、MCP 进阶应用与生态

1. 进阶功能探索

  • SSE 通信:适用于远程服务器,需修改客户端和服务器代码以支持 HTTP 接口
  • Resources 服务器:提供本地文件、数据库等资源访问接口
  • Prompt 服务器:统一管理 Agent 开发中的提示词模板,提高复用率

2. 开源 MCP 服务器资源

3. 企业级应用场景

  • 智能客服:集成知识库查询、订单系统访问
  • 数据分析:连接数据仓库,自动生成分析报告
  • 自动化运维:通过命令行工具远程控制服务器

五、总结

MCP 通过统一大模型与外部工具的交互规范,大幅降低了 Agent 开发门槛。无论是接入在线模型还是本地模型,开发简单工具还是复杂服务器,MCP 都提供了简洁高效的解决方案。随着生态的不断完善,MCP 有望成为 Agent 开发的通用标准,推动智能体技术向更广阔的领域发展。
想要深入学习 MCP?可参考 Anthropic 官方文档及 GitHub 社区,那里有丰富的教程和开源项目等你来探索。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。