文章目录
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
图片来源: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 依赖管理工具,类似于 pip
和 conda
。uv
的安装流程如下:
方法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服务器开发流程,请持续关注—。