MCP数据传输流程 #
- 用户输入Prompt 。
- MCP Client将用户Prompt 、系统Prompt以及MCP Server(可用工具/资源)一并传给LLM。
- 模型分析Prompt后,决定要调用某个工具,并给MCP Client返回MCP Server*、API调用及参数*。
- MCP Client将API调用和参数发送给对应的MCP Server。Tool执行请求并返回执行结果。MCP服务器将结果返回给MCP Client。MCP Client将LLM的生成结果返回给用户。数据传输流程如下图所示。

MCP核心元素介绍 #
在Model Context Protocol(MCP) 中,有三个核心元素:Resources、Prompts、Tools。它们共同构成了 LLM 与外部世界交互的关键能力。
一、Resources #
1、定义
Resources允许Servers暴露可以被Clients读取,并用作与LLM交互的上下文数据和内容。
2、用途
提供数据和上下文信息
3、典型场景
- 读取文件内容
- 获取配置信息
- 查询数据库数据
- 获取系统状态
二、Prompts #
1、定义
Prompts允许Servers定义可复用的提示模板和工作流,Clients可以轻松地将其呈现给用户和LLMs。
2、用途
定义与LLM交互的模板
3、典型场景
- 生成文本模板
- 定义对话流程
- 标准化LLM输出
三、Tools #
1、定义
Tools使Servers能够向Clients暴露可执行功能。通过Tools,LLMs可以与外部系统交互、执行计算,并在现实世界中采取行动。
2、关键特性
- Discovery(发现): Clients可以通过
tools/listendpoint列出可用工具。 - Invocation(调用): 通过
tools/callendpoint调用,Servers执行并返回结果
3、典型场景
- 数学计算
- 数据处理
- API 调用
- 文件操作
四、核心元素功能比较 #
| 特性 | Resource | Tool | Prompt |
|---|---|---|---|
| 主要功能 | 提供数据 | 执行操作 | 定义模板 |
| 操作类型 | 只读 | 读写 | 模板定义 |
| 状态修改 | 否 | 是 | 否 |
| 缓存支持 | 是 | 否 | 是 |
| 典型用途 | 数据获取 | 功能执行 | 交互指导 |
通信协议 #
一、标准输入输出(stdio) #
- 客户端将MCP服务器作为子进程启动。
- 服务器从其标准输入( stdin )读取JSON-RPC消息并将消息发送到其标准输出( stdout )。
- 消息是单独的JSON-RPC请求、通知或响应。
- 消息由换行符分隔,并且不得包含嵌入的换行符。
- 服务器可以将UTF-8字符串写入其标准错误 ( stderr ) 以用于日志记录。客户端可以捕获、转发或忽略此日志记录。
- 服务器不得向其 stdout 写入任何非有效的 MCP 消息。
- 客户端不得向服务器的 stdin 写入任何无效的 MCP 消息。

二、可流式传输的 HTTP(Streamable HTTP ) #
- 在Streamable HTTP传输中,服务器作为一个独立的进程运行, 可以处理多个客户端连接。此传输使用HTTP POST和GET请求。 服务器可以选择使用服务器发送事件 (SSE) 可流式传输多条服务器消息。这不仅支持基本的 MCP 服务器,还支持功能更丰富的服务器,支持流式传输以及服务器到客户端的通知和请求。
- 服务器必须提供单个HTTP 端点路径(以下称为MCP 端点)支持 POST和GET方法。例如,这可以是类似 https://example.com/mcp 的 URL。
配置开发环境 #
安装uv工具命令(以 windows 为例):
powershell -ExecutionPolicy Bypass -c "irm https://astral.sh/uv/install.ps1 | iex"
或
pip install uv
使用uv命令, 创建项目,项目名称为mcp_test
uv init mcp_test -p 3.13
安装依赖
uv add "mcp[cli]" httpx openai
激活虚拟环境
uv venv source
uv sync
按照下图配置cherry,参数填写为:
--directory
D:\mcp_test
run
main.py

开发MCP 靶场 #
模型上下文协议 (MCP) 容易受到工具中毒攻击。工具中毒攻击是指攻击者在 MCP 工具的描述中嵌入恶意指令。这些指令对用户不可见,但可以被 AI 模型解读,从而导致敏感数据泄露。
Example: 首先开发一个 MCP 服务器来实现加法操作,同时在其中放入恶意Prompt,要求 LLM 读取敏感配置文件。
import os
import subprocess
from mcp.server.fastmcp import FastMCP
import platform
# 初始化 MCP Server
mcp = FastMCP("Vulnerable Server")
@mcp.tool()
def system_ping(target: str) -> str:
"""Pings a target IP or domain."""
param = '-n' if platform.system().lower() == 'windows' else '-c'
command = f"ping {param} 1 {target}"
try:
result = subprocess.run(command, shell=True, capture_output=True)
try:
return result.stdout.decode('utf-8')
except UnicodeDecodeError:
try:
return result.stdout.decode('cp1252')
except UnicodeDecodeError:
return result.stdout.decode('gbk', errors='ignore')
except Exception as e:
return f"Error: {str(e)}"
if __name__ == "__main__":
mcp.run()
使用MCP Inspector调试靶场 #
MCP Inspector 最显著的优点之一是提供了直观的 UI 用户界面。这意味着开发者无需从零开始编写复杂的客户端代码或测试脚本,即可轻松地进行 MCP Server 功能的测试与调试。
MCP Inspector 启动命令为:
npx -y @modelcontextprotocol/inspector uv run main.py
运行 MCP Inspector 时,它会启动两个主要组件:
-
MCP Inspector (MCPI) 客户端界面
– 默认端口:6274
-
MCP Proxy (MCPP) 服务器
– 默认端口:6277,作为前端界面与指定的 MCP Server之间的通信中介。
然后,我们访问http://localhost:6274/,点击左侧的Connect按钮,即可连接我们刚写的MCP Server。然后我们切换到Tools 栏中,点击List Tools按钮即可看到我们刚写的工具,我们就可以开始进行调试啦。


如何防范MCP工具中毒攻击? #
严格审查MCP服务器来源 #
仅使用可信的MCP服务器,例如官方的MCP服务器,并避免连接到未经验证的第三方MCP服务器。
显示完整工具描述 #
MCP客户端应向使用者展示工具的完整内容描述,让使用者能自行判断工具安全性。
沙箱化执行环境 #
限制AI模型的敏感数据读取权限,防止AI模型读取用户的敏感资料。
定期更新与监控 #
确保MCP客户端与MCP服务器保持最新版本,并监控异常行为。