在大模型 Agent 技术爆发的当下,开发者们常常面临一个痛点:如何让大模型更便捷地调用外部工具?传统的 Function calling 技术需要编写大量代码、定义 JSON Schema,还得设计提示词模板,门槛颇高。而 MCP(Model Context Protocol,模型上下文协议)的出现,为这一问题提供了优雅的解决方案。
MCP 由 Claude 母公司 Anthropic 于 2024 年 11 月提出,是一种智能体(Agent)开发的技术协议。它通过 “车同轨、书同文” 的思路,统一了大模型调用外部工具的运行规范,避免了外部函数的重复开发,大幅降低了 Agent 开发门槛。

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

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

而 MCP 通过统一规范,让开发者只需关注业务逻辑,无需重复处理通信细节。截至目前,GitHub 上已有数千个开源 MCP 服务器,涵盖数据库操作、网页爬取、命令行控制等多种功能。
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
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
,即可启动一个简单的交互式客户端。
-
创建.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密钥"
-
修改客户端代码:
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
-
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 服务器可提供三种能力:
- Resources:资源访问(如文件、API 响应)
- Tools:工具函数(如天气查询、数据库操作)
- Prompts:提示词模板(用于 Agent 开发各环节)
通信方式支持两种:
- stdio:本地进程间通信,适用于同一环境
- HTTP+SSE:远程通信,支持服务器向客户端实时推送数据
-
安装依赖:
-
服务器代码:
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方式运行
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
,即可实现天气查询功能。
- SSE 通信:适用于远程服务器,需修改客户端和服务器代码以支持 HTTP 接口
- Resources 服务器:提供本地文件、数据库等资源访问接口
- Prompt 服务器:统一管理 Agent 开发中的提示词模板,提高复用率
- 智能客服:集成知识库查询、订单系统访问
- 数据分析:连接数据仓库,自动生成分析报告
- 自动化运维:通过命令行工具远程控制服务器
MCP 通过统一大模型与外部工具的交互规范,大幅降低了 Agent 开发门槛。无论是接入在线模型还是本地模型,开发简单工具还是复杂服务器,MCP 都提供了简洁高效的解决方案。随着生态的不断完善,MCP 有望成为 Agent 开发的通用标准,推动智能体技术向更广阔的领域发展。
想要深入学习 MCP?可参考 Anthropic 官方文档及 GitHub 社区,那里有丰富的教程和开源项目等你来探索。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)