在 MCP Server 开发实战:无缝对接 LLM 和 Elasticsearch 一文中,我们详细介绍了如何利用 MCP Python SDK 编写一个 Elasticsearch MCP 服务器,并通过 Claude Desktop 作为 MCP 客户端进行交互。本文将进一步介绍如何使用 MCP Python SDK 编写一个 MCP 客户端,以便更加灵活地与 MCP 服务器进行通信和集成。本文的完整代码可以在 Github 上找到:https://github.com/cr7258/hands-on-lab/tree/main/ai/claude/mcp/client/elasticsearch-mcp-client-example
MCP 系列文章:
- 一文带你入门 MCP(模型上下文协议)
- MCP Server 开发实战:无缝对接 LLM 和 Elasticsearch
- 快速上手:实现你的第一个 MCP Client(本文)
MCP 客户端的作用
MCP 客户端充当 LLM 和 MCP 服务器之间的桥梁,MCP 客户端的工作流程如下:
- MCP 客户端首先从 MCP 服务器获取可用的工具列表。
- 将用户的查询连同工具描述通过 function calling 一起发送给 LLM。
- LLM 决定是否需要使用工具以及使用哪些工具。
- 如果需要使用工具,MCP 客户端会通过 MCP 服务器执行相应的工具调用。
- 工具调用的结果会被发送回 LLM。
- LLM 基于所有信息生成自然语言响应。
- 最后将响应展示给用户。
MCP 通信方式
MCP 支持两种通信方式:
-
标准输入输出(Standard Input/Output, stdio):客户端通过启动服务器子进程并使用标准输入(stdin)和标准输出(stdout)建立双向通信,一个服务器进程只能与启动它的客户端通信(1:1 关系)。stdio 适用于本地快速集成的场景,在本文中,我们将使用这种方式来编写 MCP 客户端。
-
服务器发送事件(Server-Sent Events, SSE):服务器作为独立进程运行,客户端和服务器代码完全解耦,支持多个客户端随时连接和断开。这种方式将在后续的系列文章中单独进行介绍。
简单的示例
在开始构建复杂的应用之前,让我们先创建一个最简单的 MCP 客户端。这个基础示例将展示如何连接到 MCP 服务器并使用其提供的工具。
MCP 服务器的代码以及 Elasticsearch 集群的配置文件请参考 MCP Server 开发实战:无缝对接 LLM 和 Elasticsearch 一文。
添加依赖
在本教程中,我们将使用 MCP Python SDK 来编写项目,使用 uv 来管理 Python 项目依赖。需要添加如下依赖:
uv add mcp elasticsearch openai
设置服务器连接参数
在使用 stdio 方式进行通信时,MCP 服务器的进程由 MCP 客户端程序负责启动。因此,我们通过 StdioServerParameters 来配置服务器进程的启动参数,包括运行 MCP 服务器的命令及其对应的参数。其中,sys.argv[1] 代表客户端程序运行时传入的第一个参数,用于指定服务器脚本的路径,从而确保 MCP 客户端能够正确启动并连接到 MCP 服务器。
server_params = StdioServerParameters(
command="python", # 运行命令
args=[sys.argv[1]], # 服务器脚本路径
env=None # 可选的环境变量
)
建立服务器连接
stdio_client 负责启动服务器进程并建立双向通信通道,它返回用于读写数据的流对象。ClientSession 则在这些流的基础上提供高层的会话管理,包括初始化连接、维护会话状态等。
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
调用工具
在 MCP 客户端中,我们使用了以下两个函数来与 MCP 服务器进行交互。
list_tools():获取 MCP 服务器提供的所有可用工具。call_tool(name, args):调用指定的工具并获取结果,这里调用list_indices来获取 Elasticsearch 集群中的索引信息。
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def run():
# 建立连接
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# 初始化连接
await session.initialize()
# 列出可用工具
tools = await session.list_tools()
print("Tools:", tools)
# 调用工具
indices = await session.call_tool("list_indices")
print("Indices:", indices)
if __name__ == "__main__":
import asyncio
asyncio.run(run())
运行程序
使用以下命令运行 MCP 客户端:
uv run simple.py <MCP 服务器的代码路径>
程序首先会列出所有可用的工具,可以看到总共有 3 个工具:list_indices、get_index 和 write_documents。
Tools:
meta=None
nextCursor=None
tools=[
Tool(


1601

被折叠的 条评论
为什么被折叠?



