抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

MCP Server 很容易从“先把能力接出来”变成一个通用执行面:提供 run_commandquery_sqlhttp_requestread_file(path),模型似乎什么都能做。开发效率高,安全和可验证性却都变差,因为一个字符串参数就能跨越大量对象和副作用。

我会把 MCP Server 当成业务 Facade,不是内部 API 的透明代理。Resources 用稳定 URI 暴露受控上下文,Tools 表达窄业务动作,Prompts 只是用户可选模板。通用能力留在受限开发环境,不作为企业生产 Server 的默认接口。

MCP Server 从窄能力面开始

Prompt Injection 不是在 system prompt 后面多写一句“不要听用户的”就能解决。Agent 会读取网页、文档、邮件和工具输出,这些内容都可能包含类似指令的文本。模型很难只凭自然语言可靠区分“这是数据”还是“这是更高优先级命令”。

我的防线不建立在模型永远识别攻击上,而是建立在权限与执行分层:不可信内容可以影响候选答案,不能自行提升为控制指令;任何工具动作仍需通过确定性的对象、权限、状态和确认检查。

不可信内容不能直接变成工具指令

给 Agent 配一份“可用工具列表”,只能说明模型可以看到哪些函数,不能说明用户有权对哪些对象做什么。一个用户能调用 rerun_job,不代表他能重跑所有项目、所有环境的任务;能调用 query_table,也不代表能读每张表的每个字段。

我把工具权限表达为 subject × action × resource × context。主体来自可信会话,动作来自已注册工具,对象必须解析为稳定 ID,上下文包含租户、环境、时间和资源当前状态。模型只提出参数,不参与最终授权结论。

Agent 工具权限落到动作与对象