验证 MCP 客户端连接请求的身份认证令牌,建议在传输层(如 HTTP 头部)进行拦截校验,适用于基于 HTTP 或 SSE 传输的 MCP 服务器场景。风险边界在于本地 STDIO 传输通常默认信任,不应直接暴露给网络。
先说结论:MCP 协议本身不强制规定认证方案,身份验证需在传输层中间件实现,优先使用标准 HTTP Bearer Token 机制。
- 先判断:确认 MCP 服务器使用的传输协议是 HTTP/SSE 还是本地 STDIO。
- 优先做:在 Web 服务器或网关层配置认证中间件,拦截未带 Token 的请求。
- 再验证:使用无令牌请求测试接口,确认返回 401 状态码即表示验证生效。
快速处理思路
MCP 服务器认证通常依赖宿主语言的 Web 框架中间件,以下是 Node.js 和 Python 的通用校验逻辑片段。
// Node.js Express 示例逻辑
app.use((req, res, next) => {
const authHeader = req.headers['authorization'];
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return res.sendStatus(401);
}
// 在此处验证 token 有效性
next();
});# Python FastAPI 示例逻辑
@app.middleware("http")
async def validate_auth(request: Request, call_next):
auth = request.headers.get("Authorization")
if not auth or not auth.startswith("Bearer "):
return JSONResponse(status_code=401, content={"error": "Unauthorized"})
response = await call_next(request)
return response为什么会这样
MCP 规范主要定义消息结构和传输协议,将安全认证留给具体实现层处理。公开资料中没有看到 MCP 协议层内置强制认证机制的量化数据,因此依赖传输层安全是行业标准做法。HTTP 传输场景下,MCP 消息封装在 HTTP 请求中,网关或框架中间件可以在解析 MCP 消息前先校验 HTTP 头部令牌,避免非法请求进入业务逻辑。
分步处理
第一步:确认传输类型。检查 MCP 服务器配置,若是 STDIO 模式,仅需限制操作系统文件权限;若是 HTTP 模式,必须启用认证。
第二步:配置认证中间件。在 MCP 服务器代码入口前加载认证逻辑,或在前置网关(如 Nginx、API Gateway)配置 Token 校验规则。
第三步:定义令牌格式。建议使用标准的 Bearer Token 格式,避免自定义头部导致客户端兼容性问题。
第四步:设置拒绝策略。校验失败时直接返回 HTTP 401 状态码,不返回任何 MCP 错误消息,防止信息泄露。
怎么验证是否生效
使用 curl 命令发送不带 Authorization 头部的请求,观察响应状态码。
curl -X POST http://your-mcp-server/sse -v检查返回结果中是否包含 HTTP/1.1 401 Unauthorized。接着发送带正确令牌的请求,确认能正常建立 SSE 连接或收到 MCP 初始化响应。查看服务器日志,确认非法请求被拦截记录,且日志中未明文打印敏感令牌。
常见坑
本地 STDIO 传输被误认为安全而直接暴露给网络接口,导致未授权访问。认证令牌在服务器日志中明文记录,造成二次泄露风险。客户端缓存了旧令牌,轮换密钥后连接失败但未及时更新配置。
常见问题
STDIO 传输需要验证令牌吗?
不需要,STDIO 仅限本地进程间通信,应通过操作系统权限控制访问。
令牌失效后如何平滑轮换?
支持多令牌并存验证,旧令牌设置过期时间,客户端逐步更新配置。
MCP 客户端在哪里配置令牌?
通常在客户端连接配置文件的 headers 字段或环境变量中设置 Authorization 信息。
参考来源
Model Context Protocol Specification, GitHub Repository, https://github.com/modelcontextprotocol/specification