工具权限与评分实战:scope拦截+健康度指标(MCP实战手记·篇12 延伸) MCP工具权限 / 工具评分 / 可观测性本篇是《MCP实战手记》篇12企业级Toolbox治理的延伸篇只拆「权限拦截 健康度评分」两个点把篇12 §3 两层 scope 拦截和 §7 看板指标拆开——scope 聚合防爆炸踩坑5、成功率/P99/报错率告警阈值给落地值并接篇9 身份、篇13 多租户。仓库tagv12Gitee0. 为什么权限和评分要一起讲篇12 开篇六类事故里「权限泛滥」和「质量失控」是慢性毒前者越权调工具后者不知道哪个工具稳、哪个天天 500。权限解决谁能调评分解决调得稳不稳——治理层两端发现/调用之前先过权限调用之后用指标反向淘汰劣质工具。本文只做 callerscope 两层拦截 健康度指标采集代码量中只给变化部分真实 IdP、治理 UI 标待生产见篇13。1. 两层拦截发现层 调用层篇12 §3 已定①发现层list()按 caller 过滤可见 Toolbox看不到无权工具②调用层实际调前校验requiredScope调了不该调的被拦。管理器只给元数据查询 API拦截发生在分发层/网关层。// 发现层caller 看不到它无 scope 的工具ListToolboxDefinitionlist(StringcallerId,ListStringscopes,Filtersf){returnregistry.list(f).stream().filter(def-scopes.containsAll(def.getRequiredScope()))// 可见需持有全部 requiredScope.toList();}// 调用层resolve 时再拦一次ToolboxDefinitionresolve(StringcallerId,ListStringscopes,ToolboxIdid,Stringv){ToolboxDefinitiondefregistry.resolve(id,v);if(!scopes.containsAll(def.getRequiredScope()))// ② 调用层 scope 拦截thrownewAccessDeniedException(缺 scope: def.getRequiredScope());returndef;}两层都要有发现层防看见不该看的调用层防绕过列表直接调。默认最小权限工具若未配requiredScope视为公开可见可调。生产建议反设为无 scope 不可见公开工具显式打标避免漏配变成越权。2. scope 聚合别让每工具一个 scope踩坑5踩坑5原文每工具一个 scope配置膨胀难维护。例子get_report配scope:report:gen、query_store配scope:store:query…… 工具 50 个就 50 个 scope运维者记不住、配错就大面积 403。修法——角色级 scope 聚合把业务相近的工具归到一个角色 scope。治理前每工具一 scope爆炸: get_report - scope:report:gen query_store - scope:store:query export_csv - scope:report:export ...50 个工具 50 个 scope 治理后角色级 scope收敛: get_report / query_store / export_csv - scope:toolbox:retail # 零售工具一组 audit_log - scope:toolbox:admin # 管理面单独一组// 注册时把工具归到角色 scope而非逐个细粒度voidregister(ToolboxDefinitiondef,StringroleScope){def.setRequiredScope(List.of(roleScope));// 角色级而非 scope:report:genregistry.register(def);}caller 拿到scope:toolbox:retail就能调零售组全部工具新增同组工具无需改 caller 授权——权限随工具规模线性收敛。3. 健康度指标成功率/P99/报错率篇12 §7 看板给过阈值参考值按业务调成功率99%告警、P993s告警、报错率1%告警。采集点在调用拦截处埋点// 埋点挂在【实际工具执行】处MCP 分发层拦截器 / AOP 包裹 Tool 方法// 不要只挂在 resolve——resolve 只选定义不执行否则成功率/P99 统计失真voidafterCall(ToolboxIdid,longcostMs,booleanok){metrics.timer(toolbox.call,id).record(costMs);if(!ok)metrics.counter(toolbox.error,id).increment();// 成功率 1 - 报错数 / 调用数Prometheus 滑动窗口如 5m算}告警阈值与篇14 全链路监控打通指标 阈值 含义 成功率 99% 接口不稳定需排查 P99 耗时 3s 慢调用拖累调用方 报错率 1% 异常偏多可能要 deprecate 阈值需配「持续 5min 超阈 告警静默」再触发避免瞬时抖动误报窗口按业务调。低于阈值的工具在 §7 看板标红配合 §6 弃用流程——质量差的先标期下线形成指标驱动治理闭环。4. 与篇9身份 / 篇13多租户衔接caller 身份来自篇9 身份透传open_id/user_idscopes由 IdP 下发本期用内存 caller→scope 映射模拟真实集成待生产。tenantId字段篇12 已落库并list()/resolve()过滤就位多租户隔离标待篇13 消费——权限与隔离在同一分发层叠加互不打架。5. 岗位对照本篇能力 - 对应岗位 / 方向 scope 两层拦截 - IAM / 权限管理 / 零信任 角色级 scope 聚合 - 平台权限治理 健康度评分 告警阈值 - SRE / 可观测性 指标驱动弃用闭环 - 平台稳定性6. 边界声明本机已验证两层拦截list 过滤 resolve 拦 scope、角色级 scope 聚合、指标采集埋点逻辑。待生产验证真实 IdP caller/scope 下发篇9、治理 UI、与篇14 监控告警链路。本文只拆权限 评分两点治理层总览见篇12 深度文。同专题推荐篇12 深度文企业级Toolbox治理篇12·版本灰度实战caller 路由到指定版本篇12·弃用迁移实战deprecate→removed 全链路篇12·多实例一致性深潜Redis 与本地缓存降级代码仓库tagv12Gitee