1. 从零理解MCP协议:大模型Agent开发的"万能插座"
去年11月,当Anthropic低调发布MCP协议时,可能连他们自己都没想到,这个协议会在短短几个月后成为大模型Agent开发领域的热门话题。作为一名长期关注AI工程化的开发者,我亲历了从早期Function Calling的混乱到MCP带来标准化的全过程。今天,就让我带你深入这个可能改变Agent开发游戏规则的协议。
MCP全称Model Context Protocol(模型上下文协议),你可以把它想象成大模型与外部世界交互的"万能插座"。在传统开发中,我们要让大模型调用一个天气查询API,需要:
- 编写数十行函数代码
- 精心设计JSON Schema描述接口
- 调整提示词确保模型理解调用逻辑
- 处理各种边界情况和错误
而MCP通过三大核心设计解决了这些痛点:
- 标准化接口:统一了Client-Server通信格式
- 工具描述规范:自动生成工具使用说明
- 上下文管理:维护对话历史和环境状态
举个例子,当你想开发一个能查询股票价格的Agent时,传统方式可能需要200+行代码,而用MCP只需要:
python复制@mcp.tool()
async def get_stock_price(symbol: str):
data = await fetch_from_api(symbol)
return format_response(data)
这个简单的装饰器就能自动生成工具描述,处理类型校验,并集成到MCP生态中。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境准备:现代Python工具链的最佳实践
2.1 UV:新一代Python依赖管理利器
在开始MCP开发前,我强烈推荐使用uv替代传统的pip。这个用Rust编写的工具速度极快,实测在安装大型依赖时比pip快5-8倍。安装方法如下:
bash复制# Linux/macOS一键安装
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows用户可通过pip安装
python -m pip install uv
uv的几个实用功能:
- 并行安装:自动利用多核CPU
- 虚拟环境集成:无需额外安装virtualenv
- 依赖缓存:避免重复下载
- 跨平台锁定文件:生成可靠的requirements.txt
2.2 项目初始化与依赖安装
创建一个标准的MCP开发项目:
bash复制mkdir mcp-agent && cd mcp-agent
uv venv .venv # 创建虚拟环境
# 激活环境(Linux/macOS)
source .venv/bin/activate
# 安装核心依赖
uv pip install mcp openai python-dotenv
建议使用pyproject.toml管理依赖,示例配置:
toml复制[project]
name = "mcp-agent"
version = "0.1.0"
dependencies = [
"mcp>=0.8.0",
"openai>=1.0.0",
"python-dotenv>=1.0.0"
]
[build-system]
requires = ["uv"]
build-backend = "uv"
3. 构建你的第一个MCP客户端
3.1 基础客户端架构
让我们从最简单的控制台客户端开始。创建client.py:
python复制import asyncio
from mcp import ClientSession
from openai import AsyncOpenAI
class MCPClient:
def __init__(self):
self.client = AsyncOpenAI()
self.session = None
async def connect(self):
self.session = ClientSession()
await self.session.connect()
async def chat_loop(self):
while True:
query = input("You: ")
if query.lower() in ['exit', 'quit']:
break
response = await self.session.query(
messages=[{"role": "user", "content": query}],
model="gpt-3.5-turbo"
)
print(f"AI: {response}")
async def close(self):
if self.session:
await self.session.close()
async def main():
client = MCPClient()
try:
await client.connect()
await client.chat_loop()
finally:
await client.close()
if __name__ == "__main__":
asyncio.run(main())
这个基础版本已经实现了:
- 异步会话管理
- 简单的对话循环
- 资源清理
3.2 接入真实大模型
要接入OpenAI API,先在项目根目录创建.env文件:
env复制OPENAI_API_KEY=sk-your-key-here
OPENAI_BASE_URL=https://api.openai.com/v1
然后修改客户端代码:
python复制from openai import AsyncOpenAI
from dotenv import load_dotenv
load_dotenv()
class MCPClient:
def __init__(self):
self.client = AsyncOpenAI()
# 其余代码保持不变...
对于国内开发者,可以使用兼容OpenAI API的本地模型:
env复制# 使用DeepSeek
OPENAI_BASE_URL=https://api.deepseek.com/v1
MODEL=deepseek-chat
# 或使用本地ollama
OPENAI_BASE_URL=http://localhost:11434/v1
MODEL=llama3
4. 开发MCP服务器:天气查询工具实战
4.1 服务器基础架构
创建server.py:
python复制from fastapi import FastAPI
from mcp.server import FastMCP
import httpx
app = FastAPI()
mcp = FastMCP("WeatherServer")
@app.get("/health")
async def health_check():
return {"status": "healthy"}
async def fetch_weather(city: str) -> dict:
async with httpx.AsyncClient() as client:
url = f"https://api.openweathermap.org/data/2.5/weather?q={city}&appid=YOUR_KEY"
resp = await client.get(url)
return resp.json()
@mcp.tool()
async def query_weather(city: str) -> str:
"""
查询指定城市的天气情况
Args:
city: 城市英文名,如"Beijing"
Returns:
格式化后的天气信息字符串
"""
data = await fetch_weather(city)
return (
f"{city}天气:{data['weather'][0]['description']}\n"
f"温度:{data['main']['temp']-273.15:.1f}°C\n"
f"湿度:{data['main']['humidity']}%"
)
app.mount("/mcp", mcp.app)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
4.2 工具注册与描述
MCP会自动从函数签名和docstring生成工具描述。上述代码会生成如下工具定义:
json复制{
"name": "query_weather",
"description": "查询指定城市的天气情况",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市英文名,如\"Beijing\""
}
},
"required": ["city"]
}
}
4.3 运行与测试
启动服务器:
bash复制uvicorn server:app --reload
用curl测试:
bash复制curl -X POST http://localhost:8000/mcp/tools/query_weather \
-H "Content-Type: application/json" \
-d '{"city":"L
