第 75 页 / 共 100 页 / 飞书修订版 6

6.Implementing a client

此文档由 学习AI的1000天 翻译制作(抖音,B站,YouTube)

邮箱: szqshan@gmail.com | 微信: szqshan
网址: www.xueai.org

==================================================

现在我们的 MCP 服务器已经正常工作,是时候构建客户端了。客户端是让我们的应用程序与 MCP 服务器通信并访问其功能的组件。

理解客户端架构

在大多数实际项目中,你要么实现 MCP 客户端,要么实现 MCP 服务器——而不是两者都实现。我们在这个项目中构建两者,只是为了让你看到它们是如何协同工作的。

image1.jpeg

MCP 客户端由两个主要组件组成:

  • MCP Client - 我们创建的自定义类,用于简化会话的使用
  • Client Session - 与服务器的实际连接(MCP Python SDK 的一部分)
image2.jpeg

客户端会话在使用完毕后需要进行适当的资源清理。这就是为什么我们将其包装在自定义的 MCP Client 类中——以便自动处理所有清理工作。

客户端在我们应用程序中的作用

还记得我们的应用程序流程吗?我们的 CLI 代码需要通过 MCP 服务器完成两个主要任务:

image3.jpeg
  1. 获取可用工具列表以发送给 Claude
  2. 当Claude请求时执行工具

MCP客户端通过简单的方法调用为我们的应用程序代码提供这些功能。

实现核心方法

我们需要在客户端中实现两个关键方法:list_tools() 和 call_tool()。

List Tools Method

此方法从服务器获取所有可用工具:

async def list_tools(self) -> list[types.Tool]:

result = await self.session().list_tools()

return result.tools

这很简单 - 我们访问会话(与服务器的连接),调用内置的 list_tools() 函数,并从结果中返回工具。

Call Tool Method

此方法在服务器上执行特定工具:

async def call_tool(

self, tool_name: str, tool_input: dict

) -> types.CallToolResult | None:

return await self.session().call_tool(tool_name, tool_input)

我们将工具名称和输入参数(由Claude提供)传递给服务器并返回结果。

Testing the Client

为了测试我们的实现,我们可以直接运行客户端。该文件包含一个测试框架,用于连接到我们的MCP服务器并调用我们的方法:

async with MCPClient(

command="uv", args=["run", "mcp_server.py"]

) as client:

result = await client.list_tools()

print(result)

当我们运行这个测试时,应该能看到我们的工具定义被打印出来,包括我们之前创建的 read_doc_contents 和 edit_document 工具。

整合所有功能

现在我们的客户端可以列出工具并调用它们,我们可以测试完整的流程。当我们运行主应用程序并向 Claude 询问文档相关问题时:

  1. 我们的代码使用客户端获取可用工具
  2. 这些工具连同用户的问题一起发送给 Claude
  3. Claude 决定使用 read_doc_contents 工具
  4. 我们的代码使用客户端执行该工具
  5. 结果被发送回 Claude,然后 Claude 向用户做出回应

例如,询问"report.pdf 文档的内容是什么?"将触发 Claude 使用我们的文档读取工具,我们将获得关于在服务器中设置的 20m 冷凝塔文档的信息。

客户端充当我们应用程序逻辑和 MCP 服务器之间的桥梁,使我们能够轻松访问服务器功能,而无需担心底层连接细节。

==================================================



此文档由 学习AI的1000天 翻译制作(抖音,B站,YouTube)
邮箱: szqshan@gmail.com | 微信: szqshan
网址: www.xueai.org