如果连人间真爱都不知,千万年的修行还有什么用?
《青蛇》
01 MCP回顾
MCP全称Model Context Protocol,模型上下文协议。
上一篇文章【MCP】从0到1实现一个MCP Server 我们介绍了如何从0~1实现一个自定义的 MCP Server,感兴趣的朋友可以点击文章链接回顾下或者查看下。
02 MCP Client本质
为什么我们需要 MCP Client
因为我们在拿到一个 MCP Server 的时候没办法直接使用,必须结合 LLM 才能发挥这个 Server 的能力,所以我们需要一个基于 LLM 的 Client 去承接这个 Server。此时,MCP Client就出现了。
MCP Client 的本质
纵观市面上所有的,基于 LLM 的应用或者说客户端,无不是聊天对话机器人形式。再到具体的应用,比如说Cline,比如说Cursor等等,也是对话形式,coze、dify、n8n工具的本质也是对话。再往底层说,LLM 的本质就是输入输出。所以,如果我们要自定义一个 MCP Client,那必然也是对话形式。
03 快速实现简单的MCP Client
开始构建可与所有 MCP 服务器集成的,专属我们自己的客户端。在本教程中,我们将学习如何构建连接到 MCP 服务器的 LLM 支持的聊天机器人客户端。
这里我们使用 Python 实现MCP Client的编码与调用,Python版本为3.10或更高,MCP SDK 版本为 1.2.0 或更高。
官方文档建议使用 uv 作为包管理工作,那这次我就用一下吧。
这里默认各位朋友是掌握了 Python 语言的,所以我省略了环境的配置,也省略了项目的创建。我的项目长这样:

跟 MCP Server 的开发一样,就一个 main.py 文件,所有逻辑都在这一个文件里面。
我的代码基本逻辑来源于官方Demo:https://gist.github.com/zckly/f3f28ea731e096e53b39b47bf0a2d4b1 ,官方使用的 LLM 是Anthropic,我的代码里用的是OpenAI的SDK,做了一些微小的改动。完整代码如下:
import json
import os
import asyncio
from typing import Optional
from contextlib import AsyncExitStack
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from openai import OpenAI
from dotenv import load_dotenv
# 加载.env文件中的环境变量
load_dotenv()
class MCPClient:
def __init__(self):
# 初始化会话和客户端对象
self.session: Optional[ClientSession] = None # 用于保存 MCP 客户端会话
self.exit_stack = AsyncExitStack() # 用于管理异步资源的生命周期
# 初始化 OpenAI 客户端
self.client = OpenAI(
base_url=os.getenv("BASE_URL"),
api_key=os.getenv("API_KEY"), # 从环境变量中获取 API 密钥
)
async def connect_to_server(self, server_script_path: str):
"""
连接到 MCP 服务器
参数:
server_script_path: 服务器脚本路径 (.py 或 .js)
"""
is_python = server_script_path.endswith('.py') # 判断是否为 Python 脚本
is_js = server_script_path.endswith('.js') # 判断是否为 JavaScript 脚本
if not (is_python or is_js):

1万+

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



