大厂 MCP 面试实录:Tool 调用身份认证与最小权限设计

发布时间:2026/9/6 3:47:45
大厂 MCP 面试实录:Tool 调用身份认证与最小权限设计 大厂 MCP 面试实录Tool 调用身份认证与最小权限设计本文为 MCP 后端开发岗位模拟面试复盘围绕「为内部 RAG 知识库封装的远程 MCP Tool 增加身份认证、授权与最小权限控制」这一核心场景展开覆盖基础概念、技术选型、方案设计与边界取舍。面试官同学你好今天我们聊的场景是公司要把内部研发/财务/人力三域的 RAG 知识库封装成 MCP Tool部署为远程 Streamable HTTP 服务供内部 AI 助手调用。第一个问题为什么不能只靠 Tool 的参数 schema 做权限控制防止用户越权访问其他域的知识库候选人首先给出结论Tool 参数 schema 仅能做结构层面的约束完全不能替代服务端的权限校验。原因有两个层面第一MCP 协议规定模型传入的参数都是不可信输入恶意用户可以直接绕过客户端构造任意参数的请求直接调用 Server 的接口第二我们的场景是远程部署的 HTTP 服务请求可以不经过我们封装的客户端直接发到 Server 端口参数 schema 根本没有执行环境做拦截。比如财务域的 Tool 如果只在 schema 里限制domainfinance恶意用户可以直接把参数改成domainhr直接调用所以权限校验必须放在 Server 端全链路执行。[资料1]面试官你说得对那如果我用 TypeScript MCP SDK 开发这个远程 ServerSDK 本身有没有内置的认证授权能力我需要从零实现整套安全逻辑吗候选人结论是TypeScript MCP SDK 和其他语言的 SDK 设计思路一致不会内置具体的认证授权实现只提供可插拔的钩子避免和特定安全生态绑定。参考 Java SDK 的设计它会把授权能力集成到传输层提供钩子函数让开发者接入自己公司的现有认证体系比如我们已经落地的 OAuth2、JWT 或者内部 SSO 体系不需要重复造轮子。[资料2] 具体到我们的场景我会在 Streamable HTTP 的传输层前面加一个认证中间件先校验请求携带的 JWT 令牌解析出用户的角色、所属域等权限信息再传递给后续的 Tool 调用流程。面试官我们的 RAG 知识库是分域隔离的财务域文档只有财务岗员工能访问研发域只有研发岗能访问部分管理层有跨域权限。你设计的授权方案怎么和 RAG 的向量检索、重排能力结合实现最小权限不能出现用户检索到无权限文档的情况。候选人我会设计「身份层-资源层-操作层」三层授权模型和 RAG 链路深度绑定 1. 身份层就是刚才说的传输层 JWT 校验每次请求都校验令牌有效性解析出用户的权限域列表不缓存长期权限最多缓存 5 分钟具体时长根据业务对权限时效性的要求调整避免转岗后权限未及时生效的问题。 2. 资源层把 RAG 知识库的域和用户权限域做绑定在向量检索的召回阶段就直接加权限过滤条件把不属于用户权限域的文档直接从召回结果里过滤掉不进入后续的重排和生成环节。参考 Azure AI Search 的 Filter-based security 设计在查询向量数据库的时候就把权限标签作为过滤条件从根源上避免无权限文档被召回。[资料4] 3. 操作层限制 Tool 的调用范围比如只有财务岗的用户才能调用财务域的检索 Tool普通员工调用跨域 Tool 会直接返回权限不足。 整个 RAG 链路是用户发起检索请求 → 身份层校验权限 → 向量检索带权限过滤召回 → 权限二次校验 → 重排 → 脱敏后返回结果全程无权限文档不会流出。面试官如果出现两个异常情况第一用户刚转岗权限还没同步到权限系统调用 Tool 的时候被拦截了怎么处理第二某个域的文档很少权限过滤后召回的数量不足达不到模型生成的要求怎么处理候选人第一个异常情况首先我们的授权是每次请求都实时校验权限或者最多缓存 5 分钟如果权限系统同步延迟会出现短暂的拦截这是可以接受的因为安全优先级高于可用性。如果业务要求转岗后立即生效可以把权限系统的同步延迟控制在 1 分钟以内或者提供权限预加载的接口转岗成功后主动刷新用户的权限缓存。第二个异常情况权限过滤后如果召回文档数量不足绝对不能降级返回无权限的文档而是直接返回提示「当前权限范围内未找到匹配的文档请联系管理员申请权限」同时把这次调用的指标用户、Tool、召回数量、过滤数量上报到监控系统方便运维排查知识库的覆盖问题。面试官你提到用 TypeScript MCP SDK具体怎么把授权逻辑插进去还有 RAG 的检索结果返回给模型的时候既要保证有用性又不能泄露敏感内容怎么处理候选人首先是 SDK 的集成TypeScript MCP SDK 支持自定义中间件我们可以在 Server 启动的时候挂载认证中间件以下是版本无关的通用设计不依赖具体 SDK 版本// 伪代码TypeScript MCP Server 授权中间件挂载 const server new McpServer({ name: internal-rag-tool, version: 1.0.0 }); // 挂载认证中间件在 Tool 调用前执行 server.use(async (ctx, next) { const token ctx.request.headers.get(Authorization)?.replace(Bearer , ); if (!token) { throw new Error(未提供认证令牌); } // 校验 JWT解析用户权限信息挂载到上下文 ctx.user await verifyJwt(token); await next(); }); // 注册 RAG 检索 Tool server.tool(search_rag_docs, { /* 参数 schema */ }, async (params, ctx) { // 从上下文中获取用户权限域 const userDomains ctx.user.permissionDomains; // 调用 RAG 服务传入权限过滤条件 const results await ragService.search(params.query, { domainFilter: userDomains, topK: 5 }); // 二次校验返回结果的权限避免向量数据库过滤逻辑漏洞 const filteredResults results.filter(r userDomains.includes(r.domain)); // 敏感字段脱敏比如文档里的身份证号、手机号 const sanitizedResults filteredResults.map(r ({ ...r, content: desensitize(r.content) })); // 记录审计日志 auditLog.info({ userId: ctx.user.id, tool: search_rag_docs, domains: userDomains, resultCount: sanitizedResults.length, status: success }); return { content: sanitizedResults }; });然后是 RAG 结果的处理我们会保留文档的来源元数据比如所属域、文档ID、上传时间方便模型引用和用户溯源同时所有敏感字段在返回前统一脱敏不会把原始敏感内容传给模型。面试官你这个方案有什么取舍比如如果知识库有上百万份文档每次检索都做权限过滤会不会影响性能还有如果需要支持用户跨域检索比如财务岗的员工需要同时查财务和人力域的文档怎么处理候选人首先是性能取舍在向量检索阶段加权限过滤确实会比全量召回稍微增加查询耗时具体延迟需要根据向量数据库的规模和索引情况压测确定但这是安全必须付出的代价。我们可以通过两种方式优化第一在向量数据库的元数据里提前建权限域的索引用预过滤的方式提升查询速度第二缓存用户的权限列表避免每次请求都查权限系统。第二个跨域需求的问题我们会在用户权限表里支持多域配置比如财务岗的管理层可以配置permissionDomains: [finance, hr]检索的时候自动把多个域作为OR条件传给向量数据库不需要用户额外操作。面试官这个方案最容易踩的坑是什么比如我见过有团队把用户的 JWT 令牌写到 Tool 返回值里或者调试日志里泄露了文档的敏感内容你怎么避免候选人最容易踩的坑就是敏感信息泄露具体有三个层面要避免第一全链路日志脱敏调试日志只打印用户ID、Tool名称、请求耗时、结果状态绝对不打印 JWT 令牌、请求参数、返回的文档内容生产环境的日志级别设置为 INFO 以上关闭 DEBUG 日志第二Tool 返回值里绝对不能包含任何凭据信息包括 JWT、API 密钥等第三RAG 的检索结果在返回前必须做敏感字段脱敏比如身份证号、手机号、薪资等敏感内容用掩码替换避免模型把这些内容输出给用户。另外还要注意不能因为请求来自内部 AI 应用就默认可信所有的请求都要做权限校验避免内部服务被冒用。[资料1]面试官点评考察点对 MCP 安全边界的理解、分层授权方案的设计能力、RAG 与 MCP 的融合能力、异常处理与可观测性设计。合格回答能明确区分参数 schema 和 服务端校验的边界知道远程 MCP Server 必须做全链路授权能在 RAG 召回阶段加入权限过滤避免无权限文档泄露。加分项能结合 SDK 设计思路说明授权钩子的作用能考虑到权限变更的时效性、召回不足的降级策略、跨域权限的支持、全链路脱敏和审计日志的设计还能说出安全与性能的取舍。方案适用边界与关键细节适用边界本方案适用于内部部署、有明确权限域划分的 MCP 远程服务场景如果是公开的、无权限区分的 MCP Tool不需要这么复杂的授权逻辑。关键取舍安全性与性能的平衡召回阶段加权限过滤会略微增加查询延迟但能从根本上避免无权限文档泄露属于必须接受的取舍缓存用户权限能提升性能但会引入短暂的权限延迟需要根据业务对安全时效性的要求调整缓存时长。易踩坑细节很多团队会在重排阶段才做权限校验导致无权限文档已经被模型看到正确的做法是在召回阶段就过滤掉无权限文档从根源上避免泄露另外不要把敏感信息写入日志或 Tool 返回值这是最常见的泄露点。参考资料MCP 基础知识 https://modelcontextprotocol.io/MCP Java SDK https://github.com/modelcontextprotocol/java-sdkMCP Python SDK https://github.com/modelcontextprotocol/python-sdkRetrieval-augmented generation (RAG) in Azure AI Search https://learn.microsoft.com/en-us/azure/search/retrieval-augmented-generation-overview