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", # Executable
    args=[
        "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 arguments
    env=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 connection
            await session.initialize()

            # List available tools
            tools = await session.list_tools()
            print("Tools:", tools)

            # call a tool
            score = 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端都重启一次。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐