MCP客户端Client开发流程

1. uv工具入门使用指南

1.1 uv入门介绍

MCP开发要求借助uv进行虚拟环境创建和依赖管理。 uv 是一个Python 依赖管理工具,类似于pip 和 conda ,但它更快、更高效,并且可以更好地管理 Python 虚拟环境和依赖项。它的核心目标是 替代 pip venv pip-tools ,提供更好的性能和更低的管理开销。

uv 的特点

  1. 速度更快:相比 pip uv 采用 Rust 编写,性能更优。
  2. 支持 PEP 582:无需 virtualenv ,可以直接使用 __pypackages__ 进行管理。
  3. 兼容 pip :支持 requirements.txt pyproject.toml 依赖管理。
  4. 替代 venv :提供 uv venv 进行虚拟环境管理,比 venv 更轻量。
  5. 跨平台:支持 WindowsmacOS Linux

1.2 uv安装流程

方法 1:使用 pip 安装(适用于已安装 pip 的系统)

pip install uv

方法 2:使用 curl 直接安装

如果你的系统没有 pip ,可以直接运行:

curl -LsSf https://astral.sh/uv/install.sh | sh

这会自动下载 uv 并安装到 /usr/local/bin

1.3 uv的基本用法介绍

安装 uv 后,你可以像 pip 一样使用它,但它的语法更简洁,速度也更快。注意,以下为使用语法

示例,不用实际运行。

  • 安装 Python 依赖
uv pip install requests

pip install requests 类似,但更快。

  • 创建虚拟环境
uv venv myenv

等效于 python -m venv myenv ,但更高效。

  • 激活虚拟环境
source myenv/bin/activate     # Linux/macOS
myenv\Scripts\activate          # Windows
  • 安装 requirements.txt
uv pip install -r requirements.txt
  • 直接运行 Python 项目
如果项目中包含 pyproject.toml ,你可以直接运行:

uv run python script.py

这等效于:

pip install -r requirements.txt
python script.py

uv 速度更快,管理更高效。

为什么MCP更推荐使用uv进行环境管理?
MCP 依赖的 Python 环境可能包含多个模块, uv 通过 pyproject.toml 提供更高效的管理方 式,并且可以避免 pip 的一些依赖冲突问题。此外, uv 的包管理速度远超 pip ,这对于 MCP 这样频繁管理依赖的项目来说是一个很大的优势。

2.MCP极简客户端搭建流程

2.1 创建 MCP 客户端项目

# 创建项目目录
uv init mcp-client
cd mcp-client

2.2 创建MCP客户端虚拟环境

# 创建虚拟环境
uv venv
# 激活虚拟环境
source .venv/bin/activate
这里需要注意的是,相比pipuv会自动识别当前项目主目录并创建虚拟环境。
然后即可通过add方法在虚拟环境中安装相关的库。
# 安装 MCP SDK
uv add mcp

2.3 编写基础 MCP 客户端

然后在当前项目主目录中创建 client.py

并写入以下代码
import asyncio # 让代码支持异步操作
from mcp import ClientSession # MCP 客户端会话管理
from contextlib import AsyncExitStack # 资源管理(确保客户端关闭时释放资源)

class MCPClient:
    def __init__(self):
        """初始化 MCP 客户端"""
        self.session = None # 先不连接 MCP 服务器
        self.exit_stack = AsyncExitStack() # 创建资源管理器

    async def connect_to_mock_server(self):
        """模拟 MCP 服务器的连接(暂不连接真实服务器)"""
        print("✅ MCP 客户端已初始化,但未连接到服务器")

    async def chat_loop(self):
        """运行交互式聊天循环"""
        print("\nMCP 客户端已启动!输入 'quit' 退出")

        while True:  # 无限循环,直到用户输入 'quit'
            try: 
                query = input("\nQuery: ").strip() # 让用户输入问题
                if query.lower() == 'quit': # 如果用户输入 quit,退出循环
                    break
                print(f"\n🤖 [Mock Response] 你说的是:{query}") # 返回模拟回复
            except Exception as e: # 发生错误时捕获异常
                print(f"\n⚠️ 发生错误: {str(e)}")

    async def cleanup(self):
        """清理资源"""
        await self.exit_stack.aclose() # 关闭资源管理器

async def main():
    client = MCPClient() # 创建 MCP 客户端
    try: 
        await client.connect_to_mock_server() # 连接(模拟)服务器
        await client.chat_loop() # 进入聊天循环
    finally:
        await client.cleanup() # 确保退出时清理资源

if __name__ == "__main__": #确保代码只能在 Python 直接运行时执行(而不是作为库导入时)
    asyncio.run(main())
这段代码能够初始化 MCP 客户端(但不连接服务器),并提供一个 交互式 CLI,可以输入查询(但只返回模拟回复),通过输入 quit 退出程序。需要注意的是,此时客户端没有关联任何大模型,因此只会 重复用户的输入。
MCP中一个基础的客户端代码结构总结如下
代码部分
作用
MCPClient.__init__()
初始化 MCP 客户端
connect_to_mock_server()
模拟 MCP 服务器连接
chat_loop()
提供交互式聊天界面
cleanup()
释放资源
main()
启动客户端
asyncio.run(main())
运行程序

2.4 运行 MCP 客户端

然后尝试运行这个极简的MCP客户端:
uv run client.py

3. MCP客户端接入DeepSeek在线模型流程

3.1 新增依赖

为了支持调用DeepSeek模型,以及在环境变量中读取API-KEY等信息,需要先安装如下依赖:
uv add mcp openai python-dotenv

3.2 创建.env文件

写入如下内容
BASE_URL=https://api.deepseek.com
MODEL=deepseek-chat
OPENAI_API_KEY="DeepSeek API-Key"

3.3 修改client.py代码

import asyncio
import os
from openai import OpenAI
from dotenv import load_dotenv
from contextlib import AsyncExitStack


# 加载 .env 文件,确保 API Key 受到保护
load_dotenv()


class MCPClient:
    def  __init__(self):
        """初始化 MCP 客户端"""
        self.exit_stack = AsyncExitStack()
        self.openai_api_key = os.getenv("OPENAI_API_KEY")  # 读取 OpenAI API Key
        self.base_url = os.getenv("BASE_URL")  # 读取 BASE YRL
        self.model = os.getenv("MODEL")  # 读取 model
        if not self.openai_api_key:
            raise ValueError("❌ 未找到 OpenAI API Key,请在 .env 文件中设置OPENAI_API_KEY")

        self.client = OpenAI(api_key=self.openai_api_key, base_url=self.base_url)

    async def process_query(self, query: str) -> str:
        """调用 DeepSeek API 处理用户查询"""

        messages = [{"role": "system", "content": "你是一个智能助手,帮助用户回答问题。"},
                    {"role": "user", "content": query}]
        try:
            # 调用 OpenAI API
            response = await asyncio.get_event_loop().run_in_executor(
                None,
                lambda: self.client.chat.completions.create(
                    model=self.model,
                    messages=messages
                )
            )
            return response.choices[0].message.content
        except Exception as e:
            return f"⚠️ 调用 DeepSeek API 时出错: {str(e)}"

    async def chat_loop(self):
        """运行交互式聊天循环"""
        print("\nMCP 客户端已启动!输入 'quit' 退出")

        while True:
            try:
                query = input("\nQuery: ").strip()
                if query.lower() == 'quit':
                    break

                response = await self.process_query(query)  # 发送用户输入到 OpenAIAPI
                print(f"\n🤖 DeepSeek: {response}")
            except Exception as e:
                print(f"\n⚠️ 发生错误: {str(e)}")

    async def cleanup(self):
        """清理资源"""
        await self.exit_stack.aclose()

async def main():
    client = MCPClient()
    try:
        await client.chat_loop()
    finally:
        await client.cleanup()
if __name__ == "__main__":
    asyncio.run(main())
### 关于MCP客户端的信息 MCP(Machine Communication Protocol)是一种基于客户端-服务器架构的通信协议。其核心功能在于通过标准化的数据交互方式,在客户端与服务端之间建立高效、灵活的连接[^1]。 #### MCP客户端的功能描述 MCP客户端作为嵌入式组件,通常被集成至人工智能应用程序中。它的主要职责是向MCP服务器发送请求并接收响应数据。这些请求可以涉及多种操作,例如获取特定数据源的内容、调用API接口或执行预定义的任务。例如,某些实现可能依赖JavaScript编译后的脚本文件来处理参数传递和逻辑控制[^2]。 #### 如何下载或使用MCP客户端? 目前并没有公开的标准分发渠道用于直接下载通用版本的MCP客户端;然而,开发者可以根据需求自行开发定制化解决方案。以下是几种常见的实践方法: 1. **自建客户端** 开发者可以选择合适的编程语言和技术栈来自行设计MCP客户端。例如,有案例展示了如何运用C#结合Avalonia框架构建跨平台图形界面的应用程序[^3]。这种方法允许高度个性化配置以满足具体的业务场景要求。 2. **参考现有项目** 如果存在开源社区贡献的相关资源,则可以从GitHub等平台上查找类似的实现方案作为起点。注意审查目标项目的许可证条款确保兼容性后再加以利用。 3. **安装依赖项** 对于部分已经打包好的软件包而言(如果有的话),遵循官方文档指引完成必要的环境准备步骤之后即可运行实例。比如上述提到的一个例子需要用到Node.js runtime支持下的`.js`文件[`D:/Learning/AI-related/fetch-mcp/dist/index.js`]来进行初始化设置。 #### 技术选型建议 对于希望快速上手又兼顾多操作系统适配性的团队来说,采用.NET生态内的技术如C#/Avalonia组合不失为明智之举因为它们提供了丰富的UI控件库以及良好的性能表现同时还能简化部署流程减少维护成本。 ```csharp // 示例代码片段展示了一个简单的MCP客户端启动过程 using System; namespace McpClientApp { class Program{ static void Main(string[] args){ Console.WriteLine("Starting MCP Client..."); string mcpServerAddress = "http://localhost:8080"; // 假设的服务地址 try{ var clientInstance = new MpcClient(mcpServerAddress); bool isConnected = await clientInstance.ConnectAsync(); if(isConnected){ Console.WriteLine($"Successfully connected to {mcpServerAddress}"); // 发送测试消息给服务器 var responseMessage = await clientInstance.SendMessageAsync("Ping"); Console.WriteLine($"Received from server:{responseMessage}"); } }catch(Exception ex){ Console.Error.WriteLine($"Error occurred while connecting:{ex.Message}"); } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值