MCP协议Python SDK 开发入门
大语言模型上下文协议(Model Context Protocol )允许应用程序以标准化的方式为大语言模型提供上下文,将提供上下文的职责与实际的大语言模型交互分离。这个 Python SDK 实现了完整的 MCP 规范,方便开发人员:
- 构建可以连接到任何 MCP 服务器的 MCP 客户端
- 创建暴露资源、提示和工具的 MCP 服务器
- 使用标准传输方式,如标准输入输出(stdio)和SSE
- 处理所有 MCP 协议消息和生命周期事件
一、将 MCP 添加到 Python 项目中
我们推荐使用 uv 来管理你的 Python 项目。
如果你还没有创建一个由 uv 管理的项目,请先创建一个:
uv init mcp-server-demo
cd mcp-server-demo
示例项目如下所示:
然后将 MCP 添加到你的项目依赖中:
uv add "mcp[cli]"
这个命令用于使用 uv 包管理工具安装 mcp 包及其 cli 可选依赖项。
uv 是一个快速的 Python 包管理工具,类似于 pip 但性能更好。命令 uv add "mcp[cli]" 的含义是:
- uv add - 安装指定的 Python 包
- "mcp[cli]" - 要安装的包名是 mcp,方括号中的 cli 表示安装这个包的 CLI(命令行界面)可选依赖
安装过程如下图所示:
安装完成后,你将能够使用 mcp 的命令行功能。这种语法类似于 pip 的 pip install mcp[cli],但使用 uv 工具来执行安装过程,通常会比 pip 更快。
或者,对于使用 pip 管理依赖的项目:
pip install "mcp[cli]"
运行独立的 MCP 开发工具
使用 uv 运行 mcp 命令:
uv run mcp
二、快速入门
让我们创建一个简单的 MCP 服务器,它暴露一个计算器工具和一些数据:
如下是创建的 server.py 代码:
# 导入FastMCP类,它是MCP服务器框架的一部分
from mcp.server.fastmcp import FastMCP
# 创建一个名为"Demo"的FastMCP实例
mcp = FastMCP("Demo")
# 使用@mcp.tool()装饰器注册一个工具函数
@mcp.tool()
def add(a: int, b: int) -> int:
"""加法函数:将两个数字相加。"""
return a + b
# 使用@mcp.resource装饰器注册一个资源,通过URL模式匹配访问
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""获取个性化问候语,接收name参数。"""
return f"Hello, {name}"
你可以通过运行以下命令立即将这个服务器安装到 Claude Desktop 并与之交互:
mcp install server.py
不过,需要先安装并启用 Claude Desktop,目前国内使用有点困难。
或者,你可以使用 MCP 检查器(inspector)进行测试。
https://www.npmjs.com/package/@modelcontextprotocol/inspector
@
modelcontextprotocol/inspector 是 MCP (Model Context Protocol) 的一个检查工具,它可以帮助开发者调试和检查 MCP 服务。
@
modelcontextprotocol/inspector 的功能
- 这是一个 Node.js 工具,主要用于:
- 检查和测试 MCP 服务器
- 调试 tool 和 resource 的调用过程
- 验证 MCP 接口实现是否符合规范
- 提供可视化界面查看 MCP 服务的工具和资源
安装命令:npm i @
modelcontextprotocol/inspector
用于安装 MCP (Model Context Protocol) 的检查器工具。
- npm i 是 npm install 的简写,用于安装 Node.js 包
- @ 符号表示这是一个 作用域包,用于明确包的归属组织或用途
- @modelcontextprotocol 是组织名,inspector 是包名
可以使用 MCP 检查器进行测试:
source .venv/bin/activate # 激活虚拟环境
mcp dev server.py # 启动 MCP 服务器
Starting MCP inspector...
Proxy server listening on port 6277
MCP Inspector is up and running at http://127.0.0.1:6274
Inspector 运行起来后,会启动两个服务:
- 带UI的客户端,默认端口 6274
- MCP proxy server,默认端口 6277
在浏览器中打开 http://localhost:6274 即可访问使用。
三、什么是 MCP?
模型上下文协议(MCP)允许你以安全、标准化的方式构建服务器,这些服务器可以向大语言模型(LLM)应用程序暴露数据和功能。你可以将其视为一个专门为大语言模型交互设计的 Web API。
MCP 服务器可以:
- 通过资源(类似于 REST API 中的 GET 端点;它们用于将信息加载到大语言模型的上下文中)暴露数据。
- 通过工具(类似于 POST 端点;它们用于执行代码或产生副作用)提供功能。
- 通过提示(可重复使用的模板,用于大语言模型交互)定义交互模式。
四、MCP核心概念
服务器(server)是与 MCP 协议交互的核心接口。它负责连接管理、协议合规和消息路由。
资源(resources)是向大语言模型暴露数据的方式。它们类似于 REST API 中的 GET 端点——提供数据,但不应执行大量计算或产生副作用。
工具(tools)允许大语言模型通过你的服务器执行操作。与资源不同,工具预计会执行计算并产生副作用。
提示(prompts)是可重复使用的模板,帮助大语言模型有效地与你的服务器交互。
可以在现有的 server.py 代码中添加如下提示(prompts)示例代码:
@mcp.prompt()
def review_code(code: str) -> str:
"""
代码审查提示模板
此函数创建一个代码审查的提示模板,将用户提供的代码作为输入,
并生成一个要求审查该代码的格式化提示。
参数:
code (str): 需要审查的代码
返回:
str: 包含待审查代码的格式化提示字符串
"""
return f"Please review this code:\n\n{code}"
@mcp.prompt()
def debug_error(error: str) -> list[base.Message]:
"""
调试错误提示模板
此函数创建一个用于调试错误的提示模板,将用户提供的错误信息作为输入,
并生成一个预设对话格式的提示序列,模拟用户和助手之间的初始交互。
参数:
error (str): 用户遇到的错误信息
返回:
list[base.Message]: 包含预设对话的消息列表,模拟用户提问和助手初始回应
"""
return [
base.UserMessage("I'm seeing this error:"), # 用户消息:介绍错误
base.UserMessage(error), # 用户消息:包含具体错误内容
base.AssistantMessage("I'll help debug that. What have you tried so far?"), # 助手回应:提出后续问题
]
通过 MCP Inspector 工具,可以查看到新增的 prompts,如图所示:
测试和调试服务器的最快方式是使用 MCP 检查器(Inspector)。