🛡️ MCP安全迎宾器——演示项目
一个简单的、以安全为重点的演示,展示如何构建和运行 模型上下文协议(MCP) 服务器,并使用内置的MCP客户端与之交互。 此演示专为研讨会、培训课程和开发人员入职培训而设计。
______________________________________________________________________
📌 这个演示教了什么
该项目展示了 安全工具调用 使用MCP:
✔️ 参与者学到了什么
- MCP服务器的工作原理
- 如何安全地验证用户输入
- 如何使用STDIO传输运行服务器
- 如何使用内置的MCP客户端调用工具
- “默认安全”验证如何防止滥用
✔️ 为什么MCP安全很重要
MCP允许开发人员安全地向LLM公开工具。 但是 人工智能模型可能会被欺骗发送恶意输入,因此工具必须:
- 验证每个输入
- 拒绝可疑模式
- 只返回安全内容
此演示显示 安全输入和不安全输入之间的区别.
______________________________________________________________________
⚙️ 项目结构
mcpdemo/
│
├── server.py # MCP server with input validation
├── client.py # Python MCP client calling the server
├── requirements.txt
└── README.md______________________________________________________________________
🚀 分步设置指南
1.️⃣ 创建项目文件夹
mkdir mcpdemo
cd mcpdemo______________________________________________________________________
2.️⃣ 创建Python虚拟环境(Mac)
为什么? venv保持依赖关系隔离,因此全局系统不受影响。
python3 -m venv venv
source venv/bin/activate______________________________________________________________________
3.️⃣ 创建 requirements.txt
为什么? 因此,环境可以安装服务器和客户端所需的确切软件包。
touch requirements.txt在里面加上这个:
fastmcp==2.13.1安装所有内容:
pip install -r requirements.txt______________________________________________________________________
4.️⃣ 创建MCP安全迎宾服务器(server.py)
为什么? 此文件公开了一个名为 问候,验证名称,并演示安全的错误处理。
from fastmcp import FastMCP, tool
app = FastMCP("safe-greeter")
def is_valid_name(name: str) -> bool:
return name.replace(" ", "").isalpha()
@tool
def greet(name: str):
if not is_valid_name(name):
return {"error": "Invalid name — only letters and spaces allowed."}
return {"message": f"Hello, {name}!"}
if __name__ == "__main__":
app.run()🔐 为什么这很重要
这 is_valid_name() 过滤器防止:
- 代码注入
- 提示注入
- Script标签
- 类似SQL的有效载荷
- Shell 命令
这展示了MCP的 输入级安全.
______________________________________________________________________
5.️⃣ 创建MCP客户端(client.py)
为什么? 模拟人工智能模型或外部程序如何调用您的MCP服务器。
import asyncio
from fastmcp.client import Client
async def main():
async with Client(
transport="python3 server.py"
) as client:
resp = await client.call_tool("greet", {"name": "Raphael"})
print("Valid input:", resp)
resp = await client.call_tool("greet", {"name": "Raphael123!!"})
print("Bad input:", resp)
asyncio.run(main())______________________________________________________________________
6.️⃣ 运行演示
启动客户端(自动启动服务器)
python3 client.py预期输出
Valid input: {"message": "Hello, Raphael!"}
Bad input: {"error": "Invalid name — only letters and spaces allowed."}您还将看到FastMCP启动:
FastMCP 2.13.1
Server: safe-greeter
Transport: STDIO______________________________________________________________________
🧠 是什么让这成为一个好的MCP安全演示?
🔒 1.输入验证清晰
演示直观地显示了:
- 良好的输入→ 接受
- 输入错误→ 拒绝
非常适合现场解释。
🧪 2.易于修改
参与者可以尝试用以下方式打破它:
"Robert'); DROP TABLE Students;--""alert(1)""$(rm -rf ~)"
所有这些都将被安全地拒绝。
🚀 3.演示现实世界中MCP的使用
MCP工具正是这样集成到:
- AI代理
- ChatGPT自定义工具
- 自动化系统
- 保护管道
______________________________________________________________________
📚 其他学习想法
您可以通过以下方式扩展此演示:
- 日志中间件
- 速率限制
- 基于角色的访问
- 基于令牌的授权
- 更多经过验证的工具(例如,电子邮件验证器、文件安全分析器)
______________________________________________________________________
🙌 鸣谢
为MCP安全研讨会创建 拉斐尔·加布·莫莫.
______________________________________________________________________
