这是一个将 Model Context Protocol (MCP) 服务器与客户端实现相结合,并利用 Azure OpenAI 的应用示例。它是一个最小化的服务器/客户端应用,展示了如何整合 MCP 和 Azure OpenAI 服务。
核心组件与集成:
- MCP 服务器: 使用 FastMCP 构建。FastMCP 提供了一种快速、Pythonic 的方式来创建 MCP 服务器。
- 网页交互能力: 集成了微软开源的端到端测试框架 Playwright,用于测试现代 Web 应用。这使得 MCP 服务器能够执行网页导航等操作。
- 与 Azure OpenAI 的桥接: 该实现的关键在于将 MCP 服务器返回的关于工具(tools)的信息转换为 OpenAI 的函数调用格式。
- 自定义 MCP-LLM Bridge: 转换 MCP 服务器响应到 OpenAI 函数调用格式的功能是基于 MCP-LLM Bridge 的定制实现。这个 bridge 专门用于连接 MCP 服务器和与 OpenAI 兼容的 LLM(大型语言模型)。
- 为了确保连接的稳定性,服务器对象被直接传递给了 bridge。
Model Context Protocol (MCP) 介绍:
MCP (Model Context Protocol) 是一个开放协议,旨在实现 AI 应用与本地或远程资源之间安全、受控的交互。它允许 AI 应用发现和调用外部资源提供的功能。
相关资源:
- 官方仓库: MCP Python SDK, 创建 Python Server
- MCP 服务器列表: MCP Servers, Awesome MCP Servers
- 社区: MCP on Reddit
- 相关项目:
- FastMCP: 构建 MCP 服务器的快速、Pythonic 工具。
- Chat MCP: 一个 MCP 客户端。
- MCP-LLM Bridge: 实现 MCP 服务器与 OpenAI 兼容 LLMs 之间通信的桥接。
- MCP Playwright: 基于 Playwright 的 MCP 服务器实现。
- Microsoft Playwright for Python
配置说明:
- 依赖管理: 在开发阶段(特别是 2024 年 12 月),推荐使用 uv 进行 Python 库依赖管理。其他依赖管理工具如 pip 和 poetry 在 MCP CLI 中的支持尚不完全。
- Azure OpenAI 设置: 复制
.env.template文件并重命名为.env,然后填写以下 Azure OpenAI 的连接信息:AZURE_OPEN_AI_ENDPOINT=(Azure OpenAI 服务的端点 URL)AZURE_OPEN_AI_API_KEY=(Azure OpenAI 服务的 API 密钥)AZURE_OPEN_AI_DEPLOYMENT_MODEL=(使用的 Azure OpenAI 模型部署名称)AZURE_OPEN_AI_API_VERSION=(Azure OpenAI API 版本)
安装与执行:
- 安装 uv: 使用 pip 安装 uv:
pip install uv - 同步依赖: 使用 uv 同步项目依赖:
uv sync - 执行应用: 运行
chatgui.py脚本:python chatgui.py- 运行后,示例客户端会启动一个浏览器窗口,并导航到指定的 URL。
通信层补充:
stdio是一个传输层(用于原始数据流),而JSON-RPC是一个应用层协议(用于结构化通信)。它们是不同的概念,但常被结合使用,例如在协议中常见的“JSON-RPC over stdio”。
工具描述示例:
在代码中,可以使用
@self.mcp.tool()装饰器定义 MCP 工具。例如:python
@self.mcp.tool()
async def playwright_navigate(url: str, timeout=30000, wait_until="load"):
"""
Navigate to a URL.
"""
# ... 工具实现代码 ...
* 这个函数的文档字符串 ("""Navigate to a URL.""") 提供了工具的描述,这将被用于类似 LLM 的函数调用机制中。
* MCP-LLM Bridge 会将这个工具信息转换为如下所示的 OpenAI 函数调用格式的Tool对象:json
{
"name": "playwright_navigate",
"description": "Navigate to a URL.",
"inputSchema": {
"properties": {
"url": {"title": "Url", "type": "string"},
"timeout": {"default": 30000, "title": "timeout", "type": "string"}
// 注意:wait_until 可能因自动推断或定义方式不同而略有差异
}
// "required": ["url"] // 示例中未显示,但通常会包含必需参数
}
}
实用小贴士:
- uv 命令:
uv run: 运行脚本。uv venv: 创建新的虚拟环境(默认.venv)。uv add: 为脚本添加依赖。uv remove: 从脚本移除依赖。uv sync: 同步(安装)项目依赖到当前环境。
- 终止 Python 进程: 在命令行中使用
taskkill /IM python.exe /F命令可以强制结束所有名为python.exe的进程。 - Visual Studio Code 调试: 使用
launch.json配置文件可以在 VS Code 中启动 Python 调试器。
