这是一个用于 Model Context Protocol (MCP) 服务器的安全中间件,它增强了安全性和监控能力,而无需修改官方SDK。此包提供了工具以保护和监控 MCP 工具调用,并遵循 MCP 文档中概述的最佳实践。在 MCP 开发过程中抽象自己。
from shieldmcp import secure_tool
from shieldmcp.sanitizers import ToolSanitizer
from shieldmcp.rate_limit import RateLimitConfig
# 定义允许的工具
ALLOWED_TOOLS = {"search", "read_file", "write_file"}
# 创建文本净化器
text_sanitizer = ToolSanitizer.createTextSanitizer(
max_length=1000,
sensitive_patterns=[
r"\b\d{16}\b", # 信用卡号码
r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" # 电子邮件地址
]
)
# 配置速率限制
rate_limit = RateLimitConfig(
requests_per_minute=60, # 每分钟请求次数
burst_size=110 # 允许突发的最大请求数量
)
# 将装饰器应用于您的 MCP 工具
@secure_tool(
allowed_tools=ALLOWED_TOOLS,
sanitize_fn=text_sanitizer,
user_id="user123",
session_id="session456",
rate_limit=rate_limit
)
def search(query: str):
# 您的工具实现
return results
decorators.py)主要的 @secure_tool 装饰器,协调所有安全特性:
@secure_tool(
allowed_tools={"tool1", "tool2"}, # 允许的工具名称集合
sanitize_fn=your_sanitizer, # 可选的结果净化函数
user_id="user123", # 可选的用户标识符
session_id="session456", # 可选的会话标识符
rate_limit=RateLimitConfig( # 可选的速率限制配置
requests_per_minute=60,
burst_size=10
)
)
def your_tool():
pass
audit.py)使用 structlog 的结构化日志记录:
from shieldmcp import ToolAudit
audit = ToolAudit()
audit.logToolCallStart(
tool_name="search",
args={"query": "test"},
user_id="user123"
)
access.py)工具访问验证:
from shieldmcp import ToolAccess
access = ToolAccess(allowed_tools={"tool1", "tool2"})
access.validateToolAccess("tool1") # 如果不允许,则引发 ValueError
sanitizers.py)结果净化实用工具:
from shieldmcp import ToolSanitizer
# 创建自定义净化器
sanitizer = ToolSanitizer.createTextSanitizer(
max_length=1000,
sensitive_patterns=[r"\b\d{16}\b"]
)
# 直接使用
clean_text = sanitizer("Your text with sensitive data")
rate_limit.py)令牌桶速率限制:
from shieldmcp import RateLimitConfig
# 配置速率限制
config = RateLimitConfig(
requests_per_minute=60,
burst_size=10
)
# 克隆仓库
git clone https://github.com/shieldmcp/shieldmcp.git
cd shieldmcp
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # 或者在 Windows 上使用 `venv\Scripts\activate`
# 安装开发依赖
pip install -r requirements.txt
pytest tests/
如有任何疑问,请随时提问。