DeepSeek实战--MCP Client Stdio模式
1. 背景
前面我们介绍了 MCP 架构是server + client 模式,今天来研究一下Client实现方案,本文会依赖MCP Python SDK,如果Python环境还未搭建好,可以爬楼看一下,我前序文章。
Client 有两种模式,今天研究stdio(Standard Input/Output, stdio 标准输入输出) 模式,客户端通过启动服务器子进程并使用标准输入(stdin)和标准输出(stdout)建立双向通信,一个服务器进程只能与启动它的客户端通信(1:1 关系)。stdio 适用于本地快速集成的场景。
两种模式,对比一下,方便大家选型:
特征 | stdio模式 | sse模式 |
---|---|---|
通信协议 | 标准输入输出 | 服务器发送事件 |
实时性 | 不支持实时更新 | 支持实时更新 |
架构灵活性 | 耦合,由客户端启动服务器 | 解耦,客户端可随时连接 |
适用场景 | 简单本地应用 | 交互式应用 |
配置复杂性 | 无需网络,本地命令运行 | 需要网络连接和url |
2. 环境准备
python 版本:3.12.5
LLM: deepseek-chat
SDK:openai 1.63.2
3. 步骤
1)使用 uv 工具初始化项目
uv init mcp-client-demouv
#使用 uv 初始化一个名为 mcp-client-demo 的新 Python 项目,并在其中创建一个虚拟环境。add "mcp[cli]"
# 将包添加到当前项目中,"mcp[cli]": 表示要安装的包名是 mcp,并额外包含其 [cli] 可选依赖组uv add mcp
# 安装mcp包
初始化后项目结构
2)首先引用一下 MCP Client 的包
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
3)设置服务器连接参数
然后需要编写设置服务器连接参数的代码。在使用 stdio 方式进行通信时,MCP 服务器的进程由 MCP 客户端程序负责启动。因此,我们通过 StdioServerParameters 来配置服务器进程的启动参数,包括运行 MCP 服务器的命令及其对应的参数。代码如下:
# Create server parameters for stdio connection
server_params = StdioServerParameters(command="uv", # Executableargs=["run","--with","mcp[cli]","--with-editable","/Users/zhangsir/PycharmProjects/Geek02/achievement-mcp-server/achievement",# "D:\\workspace\\python\\mcp-test\\achievement","mcp","run","/Users/zhangsir/PycharmProjects/Geek02/achievement-mcp-server/achievement/server.py"],# Optional command line argumentsenv=None # Optional environment variables
)
过配置这部分内容,可以确保 MCP 客户端能够正确启动并连接到 MCP 服务器。
配置结果
4)建立服务器连接
写一个 run 方法来建立客户端与服务器的连接
async def run():# stdio_client 负责启动服务器进程并建立双向通信通道,它返回用于读写数据的流对象。async with stdio_client(server_params) as (read, write):# ClientSession 则在这些流的基础上提供高层的会话管理,包括初始化连接、维护会话状态等async with ClientSession(read, write) as session:# Initialize the connectionawait session.initialize()# List available toolstools = await session.list_tools()print("Tools:", tools)# call a toolscore = await session.call_tool(name="get_score_by_name",arguments={"name": "张三"})print("score: ", score)
5)启动 run 函数
if __name__ == "__main__":
import asyncio
asyncio.run(run())
6)运行客户端
可以使用 uv 命令运行程序
uv run .\hello.py
4. 总结
1)stdio 模式是在client启动服务器,不适用用于生产环境,不可能,新增、变更tools后,所有client端都重启一次。