MCP Python 实战:把工具接入 Agent
你将学会什么
Section titled “你将学会什么”- 说清 MCP 的 Host / Client / Server 三层结构
- 用
MCPServer定义工具(Tool)、资源(Resource)和提示词(Prompt) - 跑通「服务器 + 客户端」的最小示例
协议概念(JSON-RPC、能力协商)在《MCP 协议入门》里讲过,本章是 Python 侧实战。注意:本课基于 MCP Python SDK v2(2026-07-28 协议重构后),网上 2025 年的
FastMCP教程已不兼容。
MCP 不是「又一个 Agent 框架」,而是一套开放协议:让 AI 应用(宿主)以统一方式接入外部工具、数据和提示词,官方比喻是「AI 应用的 USB-C 口」。Python SDK v2 把「写工具 → 暴露给任何客户端」压缩成几个装饰器,服务器类叫 MCPServer(v1 时代叫 FastMCP)。
一个服务器可以暴露三类原语:
- 工具(Tool):AI 应用可以「调用执行」的功能,走
tools/list→tools/call - 资源(Resource):按 URI 暴露的「数据」,供读取(如文件内容、数据库记录)
- 提示词(Prompt):可复用的对话模板
最小服务器(server.py):
# 安装: pip install "mcp[cli]"from mcp.server import MCPServer # v2 命名;v1(2025 年教程)叫 FastMCP
mcp = MCPServer("Demo") # 服务器名字,客户端会看到
@mcp.tool() # ① 工具:AI 应用可「调用执行」的功能def add(a: int, b: int) -> int: """Add two numbers.""" # docstring 自动变成工具的 JSON Schema 描述 return a + b
@mcp.resource("greeting://{name}") # ② 资源:按 URI 暴露的「数据」def greeting(name: str) -> str: return f"Hello, {name}!"
@mcp.prompt() # ③ 提示词:可复用的对话模板def summarize(text: str) -> str: return f"Summarize the following text in one sentence:\n\n{text}"再用 SDK 自带的客户端连上它(内存模式,不需要端口和子进程):
import asynciofrom mcp import Clientfrom server import mcp
async def main() -> None: async with Client(mcp) as client: # 连本地服务器 print(client.server_capabilities) # 能力协商结果 result = await client.call_tool("add", {"a": 1, "b": 2}) print(result.structured_content) # {'result': 3}
asyncio.run(main())这个例子的重点是:协议是标准的,实现是自由的。你写的服务器,可以被 Smolagents、DSPy、任何支持 MCP 的宿主直接使用——工具写一次,处处可用。
先自己回答,再看答案:
- MCP 的 Host、Client、Server 三层分别是什么?
- 工具(Tool)和资源(Resource)的区别是什么?
- 为什么说「工具写一次,处处可用」?
参考答案
- Host 是宿主 AI 应用(如编辑器),Host 为每个服务器创建一个 Client,Client 维护与 Server 的连接;一个 Host 可连多个 Server。
- 工具是「做动作」(可执行函数),资源是「读数据」(按 URI 读取的内容)。
- 因为 MCP 是开放标准协议,任何支持 MCP 的客户端都能消费同一个服务器,不需要为每个框架各写一遍工具。
- MCP 是「Agent ↔ 外部系统」的开放协议,不是某个公司的框架
- SDK v2 用
MCPServer+@mcp.tool()三个装饰器定义三类原语 - 能力协商在新版协议里是无状态的
server/discover,旧教程的initialize握手已废弃