跳转到内容

MCP Python 实战:把工具接入 Agent

  • 说清 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/listtools/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 自带的客户端连上它(内存模式,不需要端口和子进程):

client.py
import asyncio
from mcp import Client
from 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 的宿主直接使用——工具写一次,处处可用。

先自己回答,再看答案:

  1. MCP 的 Host、Client、Server 三层分别是什么?
  2. 工具(Tool)和资源(Resource)的区别是什么?
  3. 为什么说「工具写一次,处处可用」?
参考答案
  1. Host 是宿主 AI 应用(如编辑器),Host 为每个服务器创建一个 Client,Client 维护与 Server 的连接;一个 Host 可连多个 Server。
  2. 工具是「做动作」(可执行函数),资源是「读数据」(按 URI 读取的内容)。
  3. 因为 MCP 是开放标准协议,任何支持 MCP 的客户端都能消费同一个服务器,不需要为每个框架各写一遍工具。
  • MCP 是「Agent ↔ 外部系统」的开放协议,不是某个公司的框架
  • SDK v2 用 MCPServer + @mcp.tool() 三个装饰器定义三类原语
  • 能力协商在新版协议里是无状态的 server/discover,旧教程的 initialize 握手已废弃
MCP Python 小测
x
1 / 3

MCP Python SDK v2 中,服务器类叫什么?