使用说明
使用MCP Python SDK在Python中构建简单的MCP服务器
模型上下文协议(MCP)是一种为大型语言模型(LLM)提供上下文的标准化方法。使用MCP Python SDK,您可以构建服务器,以安全和模块化的方式向LLM应用程序公开数据(资源)、功能(工具)和交互模板(提示)。在本教程中,我们将逐步用Python构建一个简单的MCP服务器。
引言
模型上下文协议(MCP)标准化了应用程序和LLM之间的接口。使用MCP,您可以将提供上下文、执行代码和管理用户交互的关注点分开。MCP Python SDK实现了完整的MCP规范,允许您:
- 公开资源: 将数据传递给LLM(类似于GET端点)。
- 定义工具: 提供执行操作或计算的功能(如POST端点)。
- 创建提示: 提供可重用、模板化的交互。
MCP图元
每个MCP服务器都可以实现三个核心原语。这些定义 谁控制 调用和 作用 每个原始元素都扮演:
| 图元 | 控件 | 描述 | 示例用法 |
|---|---|---|---|
| 鼓励 | 用户控制 | 用户选择调用的交互式模板 | Slash命令、菜单选项 |
| 资源 | 应用程序控制 | 客户端应用程序管理的上下文数据 | 文件内容、API响应 |
| 工具 | 模型控制 | 向LLM公开以执行操作的函数 | API调用、数据更新 |
- 鼓励 让你定义 结构化的 对话的发起者。
- 资源 类似于LLM上下文的只读数据端点。
- 工具 使LLM能够执行计算、获取、更新等操作。
服务器功能
在初始化过程中,MCP服务器会通告它支持哪些功能。客户端(和前端)可以根据这些标志动态调整:
| 功能 | 功能标志 | 描述 |
|---|---|---|
| 鼓励 | listChanged |
快速模板管理 |
| 资源 | subscribelistChanged |
资源曝光和实时更新 |
| 工具 | listChanged |
工具发现和执行 |
| 日志记录 | – | 服务器日志记录配置 |
| 完成 | – | 论点完成建议 |
listChanged表示可用提示/资源/工具集可以在运行时更改的信号。subscribe允许客户端在资源数据更改时注册更新。logging和completion是调试输出和自动完成帮助的简单切换。
本教程将指导您使用MCP Python SDK创建一个简单的MCP服务器。
先决条件
在开始之前,请确保已安装以下内容:
- Python 3.7+ (优选3.11或更高)
- 点 Python包安装程序
- Node.js 18.x
您还需要安装MCP Python SDK。您有两个选择:
-
直接使用pip:
pip install "mcp[cli]" -
使用
uv:
如果你正在管理你的项目 紫外线,初始化项目并将MCP添加为依赖项。uv init mcp-server cd mcp-server uv add "mcp[cli]"
有关更详细的安装说明,请查看 MCP Python SDK文档.
设置您的环境
本节详细介绍如何使用Python 3.11在Ubuntu 22.04上设置开发环境,确保您安装了正确的Python版本和MCP Python SDK。
选项1:手动安装
如果您更喜欢循序渐进的方法,请按照以下说明进行操作:
-
添加
deadsnakesPPA: 此存储库提供Ubuntu的最新Python版本。sudo add-apt-repository ppa:deadsnakes/ppa -y -
更新软件包列表:
sudo apt update -
安装Python 3.11和基本工具:
sudo apt install -y python3.11 python3.11-venv python3.11-distutils python3-aptpython3.11Python 3.11解释器。python3.11-venvPython 3.11的虚拟环境模块。python3.11-distutils:构建和安装Python包的基本工具。python3-apt:APT包管理系统的Python接口(有助于解决潜在的依赖性问题)。
-
将Python 3.11设置为默认值
python3(可选但推荐): 这简化了Python 3.11的使用,无需指定python3.11每一次。sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 2 sudo update-alternatives --config python3系统将提示您选择默认的Python 3版本。选择Python 3.11。
-
安装
pip对于Python 3.11:pip是Python的包安装程序。curl -sS https://bootstrap.pypa.io/get-pip.py | sudo python3.11 -
验证Python和pip版本:
python3 --version python3 -m pip --version确认输出显示Python 3.11和pip的最新版本。
-
正在为Node.js 18.x设置NodeSource…
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
正在安装Node.js(使用npm和npx)…”
sudo apt-get update
sudo apt-get install -y nodejs
-
创建并激活虚拟环境: 使用虚拟环境可以隔离项目的依赖关系。
python3 -m venv .venv source .venv/bin/activateA.
.venv目录将在您的项目中创建,您的终端提示将更改为(.venv),表示环境处于活动状态。 -
升级
pip在虚拟环境中:pip install --upgrade pip -
安装MCP Python SDK: 创建一个名为的文件
requirements.txt在项目目录中包含以下内容:mcp[cli]然后,使用pip安装SDK:
pip install -r requirements.txt
选项2:使用 install.sh 脚本
为了实现更自动化的设置,您可以使用提供的 install.sh 脚本。
-
保存脚本: 确保您之前提供的脚本已另存为
install.sh在您的项目目录中。 -
使脚本可执行: 打开终端,导航到项目目录,然后运行:
chmod +x install.sh -
运行脚本: 执行脚本:
bash install.sh这
install.sh脚本自动执行手动安装步骤:- 添加
deadsnakesPPA和更新包列表。 - 安装Python 3.11和必要的工具。
- 将Python 3.11设置为默认值
python3. - 安装
pipPython 3.11。 - 创建并激活名为的虚拟环境
.venv. - 升级
pip在虚拟环境中。 - 安装Node.js:节点v18.20.8
- 从安装MCP Python SDK
requirements.txt(如果文件存在)。
- 添加
重要提示:
- 无论您选择哪种方法,请确保激活虚拟环境(
source .venv/bin/activate)每次在新的终端会话中处理项目时。这确保您使用的是正确的Python版本,并且可以访问已安装的MCP SDK。 - 这
install.sh该脚本是为Ubuntu 22.04设计的。如果您使用的是不同的操作系统或发行版,则可能需要相应地调整脚本。 - 这
requirements.txt文件对于管理项目的依赖关系至关重要。始终使用必要的软件包进行更新。
设置好环境后,您就可以创建MCP服务器了!
设置您的项目
为您的项目创建一个新目录并导航到其中。然后,创建一个名为 server.py 在你项目的根。
你的项目结构应该是这样的:
mcp-server/
├── server.py
└── (other files such as .env, README.md, etc. as needed)
创建MCP服务器
在本节中,我们将创建一个简单的MCP服务器,它公开了一个计算器工具和一个动态问候资源。稍后,您可以使用提示或其他工具扩展此功能以添加更多功能。
定义工具
工具是执行计算或副作用的函数。在这个例子中,我们将定义一个简单的加法工具。
打开 server.py 并添加以下代码:
# server.py
from mcp.server.fastmcp import FastMCP
# Create an MCP server instance with a custom name.
mcp = FastMCP("Demo Server")
# Add a calculator tool: a simple function to add two numbers.
@mcp.tool()
def add(a: int, b: int) -> int:
"""
Add two numbers together.
:param a: First number.
:param b: Second number.
:return: Sum of the numbers.
"""
return a + b
暴露资源
资源提供可以加载到LLM上下文中的数据。在这里,我们定义了一个返回个性化问候的资源。
将以下代码添加到 server.py:
# Expose a greeting resource that dynamically constructs a personalized greeting.
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""
Return a greeting for the given name.
:param name: The name to greet.
:return: A personalized greeting.
"""
return f"Hello, {name}!"
添加提示(可选)
提示允许您为交互提供可重用的模板。例如,您可以添加一个提示来查看代码。
如果需要,添加以下代码:
from mcp.server.fastmcp.prompts import base
@mcp.prompt()
def review_code(code: str) -> str:
"""
Provide a template for reviewing code.
:param code: The code to review.
:return: A prompt that asks the LLM to review the code.
"""
return f"Please review this code:\n\n{code}"
运行MCP服务器
首先,确保您的Python虚拟环境已通过运行以下命令激活:
source .venv/bin/activate
这应该在项目的根目录中完成。然后,切换到MCP服务器文件夹:
cd mcp-server
在中定义了您的服务器 server.py,您现在可以运行它。根据您的目标,有几种方法可以运行MCP服务器——开发、调试、集成或部署。
运行和测试服务器的最佳方式:使用 mcp dev
与MCP服务器交互的最简单方法是使用内置 MCP检查员,在浏览器中为您提供可视化UI。
对于开发和测试,MCP development Inspector提供了一个直观的web界面来与您的服务器进行交互。
1.以开发模式启动服务器
在您的终端中,运行:
mcp dev server.py
此命令启动MCP服务器,通常在web浏览器中打开检查器。您将看到您的“演示服务器”和公开的工具(add),资源(greeting),并提示(review_code).
-
使用Inspector启动服务器:
mcp dev server.py -
它执行几个重要任务:
- 启动MCP服务器 使用默认的STDIO传输。
- 启用实时重新加载, 因此,您的代码更新会立即应用,而无需重新启动服务器。
- 启动MCP检查器界面, 基于web的用户界面可在
http://localhost:6274/,您可以在其中探索和测试服务器的所有功能。
运行命令后,您的终端输出应类似于:
此输出确认检查器已激活并准备好进行交互。
- 在UI中,您可以:
- 测试
add(a, b)工具 - 使用
greeting://John测试资源 - 使用以下工具查看代码
review_code提示
- 测试
💡 如果任何包裹丢失,
mcp dev将帮助您自动安装它们。
导航MCP检查器界面
2.通过检查员进行互动
当您在浏览器中打开检查器时,您会注意到几个旨在促进服务器测试的关键部分。
转到MCP检查器界面的顶部,显示:
Transport Type: STDIO
Command: python
Arguments: run --with mcp mcp run server.py
由于我们 server.py 是一个使用普通脚本的独立脚本 pip-基于虚拟环境,我们需要在MCP检查器中更正配置,以:
Transport Type: STDIO
Command: python
Arguments: server.py
然后单击 连接 我们的服务器将使用Python解释器正确启动。
示例用法:测试“添加”工具
- 调用工具(
add): 导航到add工具在检查员。
在使用我们的示例时考虑以下场景(其中注册了一个添加工具、一个问候资源和一个代码审查提示):
-
访问“工具”选项卡:
加载MCP检查器后,导航到 工具 选项卡。单击List Tools。在这里,您将看到服务器上所有已注册工具的列表。在我们的例子中,其中一个条目是add工具。 -
测试“添加”功能:
点击add从列表中选择工具。检查器显示工具的输入模式,提示您输入两个数字(例如,参数a和b).- 输入参数: 进入
a = 10和b = 15. - 执行: 单击检查器执行面板中的执行按钮。
- 输入参数: 进入
-
查看输出:
执行后,检查器立即显示操作结果。你应该看到,这笔钱是按以下方式退还的25.
这个即时反馈循环显示了如何在不离开开发界面的情况下快速验证工具的逻辑是否按预期工作。
使用 review_code 通过MCP检查员提示
- 在检查器的侧栏中,展开 鼓励 → 列表提示.
- 你应该看看
review_code上市的:review_code
在提示窗格中,您将找到一个准备接受参数的表单或JSON编辑器。
- 供应
code参数。 例如:
print(1+1)
击打 运行工具 .
查看生成的提示
检查器将显示输出:
{
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "Please review this code:\n\nprint(1+1)"
}
}
]
}
访问资源(greeting://Alice)
一旦你的服务器在Inspector中启动并运行(使用上面的设置),你就可以通过URI调用任何注册的资源:
1.打开资源交互窗格
- 在MCP检查器侧栏中,单击 资源 → 资源模板.
点击
List templates并选择get_greeting
2.输入资源URI
- 在输入字段名称中,键入:
Alice
3.调用资源
- 点击 读取资源.
- 检查器会将该URI发送到您的
@mcp.resource("greeting://{name}")处理程序。
4.查看回复
- 您应该看到:
{
"contents": [
{
"uri": "greeting://Alice",
"mimeType": "text/plain",
"text": "Hello, Alice!"
}
]
}
- 这确认了您的动态问候资源已正确连接,并按需返回个性化输出。
MCP检查器充当用户友好的客户端,为您处理底层协议通信。
怎么回事 python server.py
你的代码是正确的,但当你运行时:
python server.py
…看起来什么都没发生。这是因为您的服务器正在使用 stdio (标准输入/输出) 作为默认设置 运输,它只是静静地坐着 等待客户 连接并向其发送请求。
这很正常!但你需要 正确的界面 与它互动。
🐍 使用Python MCP客户端(client.py)
对于程序化交互,您可以使用 mcp Python SDK创建客户端。您提供的 client.py 这是一个正确的例子:
# client.py
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
result = await session.call_tool("add", arguments={"a": 3, "b": 4})
print(f"Result of add tool: {result}")
if __name__ == "__main__":
asyncio.run(main())
要运行此客户端,请执行以下操作:
- 启动服务器:
python server.py - 在单独的终端中运行客户端:
python client.py
输出将是:
[your log output indicating the tool call]
Result of add tool: meta=None content=[TextContent(type='text', text='7', annotations=None)] isError=False
这演示了Python客户端如何连接到您的服务器并以编程方式调用工具。
结论
在本教程中,我们使用MCP Python SDK在Python中构建了一个简单的MCP服务器。我们:
- 设置我们的项目并安装MCP SDK。
- 创建了一个MCP服务器,该服务器公开了一个计算器工具和一个动态问候资源。
MCP Python SDK使您能够构建健壮的模块化服务器,为LLM应用程序提供数据、功能和可重用的交互模板。在扩展服务器时,考虑添加更复杂的工具、资源和提示,以充分利用模型上下文协议的强大功能。
