第 5 章:客户端与传输层
前几章都在讲服务器。这一章讲对称的另一半:
Client。它最漂亮的设计是——你几乎不用关心传输方式,一个入参它自己猜。
5.1 Client 是什么
Client(client/client.py:130)是 FastMCP 的客户端门面:连上任意 MCP 服务器,然后 call_tool / list_tools / read_resource / get_prompt。它也负责客户端侧的回调能力:sampling(服务器反过来请求你这边的大模型)、elicitation(向用户要输入)、roots、进度、日志。
最小用法(概念示意):
# 示意,非源码。连上一个 HTTP 服务器并调工具
from fastmcp import Client
async with Client("http://localhost:8000/mcp") as client:
tools = await client.list_tools()
result = await client.call_tool("add", {"a": 1, "b": 2})
注意
Client是惰性导入的:fastmcp/__init__.py的__getattr__只有你真访问fastmcp.Client时才导入客户端那一串依赖(源码注释说这是为了让「只做服务器」的用户不用为客户端导入链买单,见 #3292)。
5.2 核心设计:一个入参,推断传输
Client(transport) 的 transport 参数类型极宽——URL、文件路径、FastMCP 对象、配置字典……都行。构造时调 infer_transport(client/transports/inference.py:65)把它归一化成具体传输类。规则:
| 你传入 | 推断出的传输 | 场景 |
|---|---|---|
已是 ClientTransport | 原样用 | 你自己精确指定 |
FastMCP / FastMCP1Server 对象 | FastMCPTransport(内存) | 进程内,零网络(测试用) |
.py 文件路径 | PythonStdioTransport | 起个 Python 子进程,stdio 通信 |
.js 文件路径 | NodeStdioTransport | 起个 Node 子进程 |
http:// / https:// URL | StreamableHttpTransport(默认) | 远端 HTTP 服务器 |
以 /sse 结尾的 URL | SSETransport | 老式 SSE 端点 |
dict / MCPConfig | MCPConfigTransport | 一次连多台 |