MCP入门笔记1: MCP客户端开发流程,并接入ollama


MCP(Model Context Protocol)是什么?

官网的定义是:MCP 是一种开放协议,它标准化了应用程序如何为 LLM 提供上下文。将 MCP 想象成 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 也提供了一种将 AI 模型连接到不同数据源和工具的标准化方式。
为了进一步普及MCP协议,Anthropic 提供 Python、Java、C# 等多语言 SDK,社区也有 PydanticAI、Cursor 等接入示例,帮助快速构建 MCP Server 和 Client​。

MCP 的核心遵循客户端-服务器架构,其中主机应用程序可以连接到多个服务器:
在这里插入图片描述
图片来源https://modelcontextprotocol.io/introduction

  • MCP 主机:希望通过 MCP 访问数据的 Claude Desktop、IDE 或 AI 工具等程序
  • MCP 客户端:与服务器保持 1:1 连接的协议客户端
  • MCP 服务器:轻量级程序,每个程序都通过标准化的 Model Context Protocol 公开特定功能
  • 本地数据源:MCP 服务器可以安全访问的计算机文件、数据库和服务
  • 远程服务:MCP 服务器可以连接到的 Internet 上可用的外部系统(例如,通过 API)

一、MCP技术体系介绍

第一章的笔记只是做浅层的了解。其中有ai帮我总结的内容,有的知识点我也不太理解…

1. MCP入门介绍

在 MCP 之前,开发者常常针对每个数据源或工具编写“​N×M​”次适配器,集成成本高且维护困难​。MCP 将外部功能抽象为三类接口——资源(Resources)、工具(Tools)、提示模板(Prompts),模型只需通过统一的 JSON-RPC 调用即可访问,多模型可重用同一套工具服务器​。

a. MCP Client&Server架构解析

术语统一:

MCP Client:运行在 Host(如 Claude Desktop、ChatGPT Desktop 或自定义代理)中的轻量级组件,负责构造 JSON-RPC 请求并与 Server 通信。

MCP Server:独立进程或服务,暴露 Resource/Tool/Prompt 接口,执行实际业务逻辑并返回结果。

典型流程:

1.Host 启动 MCP Client 并与指定 MCP Server 建立连接(stdio 或 HTTP/SSE)。

2.Client 发起 tools/list、resources/list 等能力查询,Server 返回可用接口清单。

3.当 LLM 生成包含工具调用意图的指令时,Client 将对应 JSON-RPC 请求转发给 Server。

4.Server 调用底层 API(如文件系统、数据库、第三方服务)并将结果封装为 JSON-RPC 响应返回。

5.Client 将结果注入模型上下文,LLM 继续生成最终回答或后续操作

b. MCP stdio 和 SSE通信协议介绍

在这里插入图片描述

2. Function calling技术回顾

Function call的详细内容可参考文献:https://zhuanlan.zhihu.com/p/663770472
MCP技术开发入门实战!DeepSeek、ollama、vLLM接入MCP,从零手撕代码搭建MCP Client与Server!MCP完整技术实战!

图片来源:https://www.bilibili.com/video/BV1NLXCYTEbj/?p=2&share_source=copy_web&vd_source=659441755107f4432b57296f459746bb

3. 大模型Agent开发技术体系回顾

Ai Agent(本文指的是LLM agent)由规划(Planning)、工具(Tools)、代理核心(Action)、存储(Memory)四个部分构成。Memory模块负责管理大模型对话时的记忆;Action模块负责管理大模型行动的基本流程;Planning模块负责规划大模型的行动;Tools模块让大模型可以连接外部工具,在此模块,可以通过MCP协议实现能力泛化。

在这里插入图片描述

来源:https://blog.csdn.net/m0_59163425/article/details/144676538?fromshare=blogdetail&sharetype=blogdetail&sharerId=144676538&sharerefer=PC&sharesource=weixin_43807749&sharefrom=from_link

二、MCP客户端Client开发流程

参考文献:https://modelcontextprotocol.io/quickstart/client
开始构建可与所有 MCP 服务器集成的、自己的客户端。

1. uv工具入门使用指南

MCP开发要求借助 uv 进行虚拟环境创建和依赖管理。uv 是一个 Python 依赖管理工具,类似于 pipcondauv的安装流程如下:
方法1:使用pip安装

pip install uv

方法2(用于Linux系统下):使用curl安装

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

笔者计划在windows上安装uv,因此使用anaconda新建了一个虚拟环境mcp(python版本3.11),并pip安装uv。然后根据官网教程,创建一个项目文件夹mcp-client,并进入。如下图所示:

# Create project directory
uv init mcp-client
cd mcp-client

在这里插入图片描述

在刚刚创建的mcp-client文件夹下创建、激活虚拟环境venv。在venv中,安装相应的包,比如SDK等(一个虚拟环境套另一个虚拟环境,哈哈)

# Create virtual environment
uv venv

# Activate virtual environment
# On Windows:
.venv\Scripts\activate
# On Unix or MacOS:
source .venv/bin/activate

# Install required packages
uv add mcp

在这里插入图片描述

2. MCP客户端搭建流程

  • a. 创建MCP客户端项目与虚拟环境
    a小节的内容,前面已经实现了。

  • b. MCP客户端基本代码结构与编写流程

官方的client.py连接如下:https://github.com/modelcontextprotocol/quickstart-resources/tree/main/mcp-client-python。下面的代码,在此基础上改了一些。

import asyncio
from contextlib import AsyncExitStack
# from mcp import ClientSession

class MCPClient:
    def __init__(self):
        # Initialize session and client objects
        self.session = None
        self.exit_stack = AsyncExitStack()

    async def connect_to_server(self):
        """Connect to an MCP server,
        暂时不连接真实服务器,只是打印输出
        """
        print("\nMCP客户端已初始化,但未连接到服务器。本程序用于测试")

    async def chat_loop(self):
        """Run an interactive chat loop"""
        print("\nMCP Client Started!")
        print("Type your queries or 'quit' to exit.")

        while True:
            try:
                query = input("\nQuery: ").strip()
                if query.lower() == 'quit':
                    break
                print(f"\n [Response] 你说的是: {query}.")

            except Exception as e:
                print(f"\nError: {str(e)}")

    async def cleanup(self):
        """Clean up resources"""
        await self.exit_stack.aclose()

async def main():
    client = MCPClient()
    try:
        await client.connect_to_server()
        await client.chat_loop()
    finally:
        await client.cleanup()
        
if __name__ == "__main__":
    asyncio.run(main())
  • c. MCP客户端运行
uv run client.py

在这里插入图片描述

3. MCP客户端接入OpenAI、DeepSeek等在线模型的流程

本节尝试在客户端中接入OpenAI和DeepSeek(DeepSeek已经本地部署好了,详见部署教程)。OpenAI和DeepSeek调用方法类似。

3.1安装依赖包

OpenAI为例子,为了支持调用OpenAI模型,以及在环境变量中读取API-KEY等信息,需要先安装如下依赖:

uv add mcp openai python-dotenv

在这里插入图片描述

3.2创建.env文件,来存储API-KEY等信息

通过创建.env文件,并写入OpenAI的API-KEY,模型名称,以及反向代理地址。这些都是固定格式。
在这里插入图片描述
接入LLM模型后的client.py完整代码,此处偷懒不写了,可以百度…。接好后的效果,类似下图:
在这里插入图片描述
图片来源:https://www.bilibili.com/video/BV1NLXCYTEbj/?p=5&share_source=copy_web&vd_source=659441755107f4432b57296f459746bb

4. MCP客户端接入ollama框架

本节尝试将ollama模型调度框架接入MCP的client。由于ollama支持OpenAI API风格调用方法,因此上述client.py文件并不需要修改,只需要启动ollama服务,然后修改.env文件即可。

4.1 MCP客户端接入ollama

  • 首先启动ollama,安装好本地模型,这里我们安装deepseek-r1:14b。
    在这里插入图片描述
  • 修改.env配置文件
BASE_URL=http://127.0.0.1:11434/v1/ #注意,是http,而不是https
MODEL=deepseek-r1:14b
OPENAI_API_KEY=ollama
  • 运行client3.py文件,结果如图。client3.py代码如下。
    在这里插入图片描述
import asyncio
import os
from openai import OpenAI
from dotenv import load_dotenv
from contextlib import AsyncExitStack

load_dotenv()  # load environment variables from .env

class MCPClient:
    def __init__(self):
        # Initialize session and client objects
        self.exit_stack = AsyncExitStack()
        self.openai_api_key = os.getenv("OPENAI_API_KEY")
        self.base_url = os.getenv("BASE_URL")
        self.model = os.getenv("MODEL")


        if not self.openai_api_key:
            raise ValueError("openai_api_key is null, 请在.env文件中设置")

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

    async def process_query(self, query: str) -> str:
        """使用LLM(如qwq:32b)处理用户query并调用可用的工具"""
        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"⚠️ 调用 OpenAI API 时出错: {str(e)}"


    async def chat_loop(self):
        """交互式聊天循环"""
        print("\nMCP Client Started!")
        print("Type your queries or 'quit' to exit.")

        while True:
            try:
                query = input("\nQuery: ").strip()

                if query.lower() == 'quit':
                    break

                response = await self.process_query(query)
                print("\n" + response)

            except Exception as e:
                print(f"\nError: {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基础知识,包括定义和用处;然后cv了MCP客户端Client代码,并接入本地ollama。亲测在4060-8G的台式机上,响应速度还是很慢的…另外,本博客中的代码参考网上的教程,调用的是OpenAI的client.py模板,也可以采用官网上提供的其他开源工具(如下图所示),其中superinterface要付费,oterm是开源的,挂在https://github.com/ggozad/oterm/上
在这里插入图片描述
在这里插入图片描述
在下一篇博客中,将介绍MCP服务器开发流程,请持续关注—。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值