MCP学习笔记

基本概念

MCP,Model Context Protocol,模型上下文协议。一种开放标准,让开发者能够以一致的方式将各种数据源、工具和功能连接到AI模型中。类似usb-c接口,连接不同外设。 Hugging Face 等平台推动了模型共享,而 LangChain 等框架尝试通过工具调用(Tool Calling)增强模型能力。然而,这些方案仍未解决根本问题:缺乏一个通用的、标准化的上下文传递机制。

MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而无法充分发挥潜力的难题。我们在构造prompt的时候,希望能提供更具体的信息,比如本地文件、数据库等给模型。在过去,AI要使用我们的数据,要么复制粘贴,要么上传下载;如今,MCP直接在AI与数据之间架起桥梁,实现互联。

数据孤岛是指在企业内部不同部门或系统之间,因为缺乏有效的数据共享机制而造成的信息相互隔离的现象。每个部门或系统都保存着自己的数据,这些数据独立存在,彼此之间缺乏有效的数据交换和共享,导致组织内部的数据资源未能得到充分利用。

MCP主要功能:

  • 上下文共享:应用程序通过MCP向模型提供上下文所需要的上下文信息,比如文件内容、数据库记录等,增强模型的理解能力
  • 调用工具:比如用 Slack 发消息、用 GitHub 管代码、用 Blender 建 3D 模型
  • 组合工作流:利用 MCP 集成多个服务和组件,构建灵活、可扩展的 AI 工作流
  • 安全性:本地服务器运行,避免将敏感数据上传至第三方平台,确保数据隐私

MCP架构设计

  • 客户端:发起请求,为llm与MCP服务器之间的桥梁
  • 服务器:转发请求,为客户端提供上下文、工具和prompt,返回处理结果
  • 资源:远程,本地

工作流程:

  • MCP client 首先从 MCP server 获取可用的工具列表
  • 将用户的查询连同工具描述通过 function calling 一起发送给 LLM
  • LLM 决定是否需要使用工具以及使用哪些工具
  • 如果需要使用工具,MCP client 会通过 MCP server 执行相应的工具调用
  • 工具调用的结果会被发送回 LLM
  • LLM 基于所有信息生成自然语言响应
  • 最后将响应展示给用户

MCP 客户端:通常是 AI 应用程序,比如Claude Desktop、cherry studio、cursor、DeepChat、chatwise等等

MCP 服务端:轻量级程序,负责暴露特定的数据源或工具功能,并通过标准化协议与客户端交互。

通信格式:基于 JSON-RPC 2.0,支持请求、响应和通知三种消息类型,确保通信的标准化和一致性。

MCP Server

轻量级的本地服务,旨在为客户端提供数据访问和功能执行的接口。

  1. 提供资源:比如文件、数据库记录等等
  2. 提供工具:客户端可以通过调用这些工具完成特定任务

网上许多现成的Server可供使用 GitHub:在 GitHub 上查找 MCP servers:

网站:通过下面的网站查找 MCP servers:

UI自动化相关的 MCP servers:

A2A

在2025年4月9日,谷歌云正式发布了Agent2Agent(A2A)协议,这是首个专为AI代理互操作性设计的开放标准。按Google的说法,A2A协议与MCP是互补而不替代关系,A2A负责解决Agent间的通信问题,MCP解决的是Agent与工具间的通信问题。

安全设计:

  1. 企业级认证和授权,确保只有授权代理可以访问和交互
  2. 与OpenAPI方案保持一致兼容在header中使用Bearer Token认证
  3. 确保代理只能执行其授权的操作,细化对Agent能力访问权限管理。
  4. 支持加密数据交换
  5. AgentCard:这是一个公开的元数据文件,描述了AI代理的功能、技能、端点URL和身份验证要求,可以通过URL路径 http://{remote_agent_address}/.well-known/agent.json访问。AgentCard允许代理在不了解彼此的情况下,通过读取对方的AgentCard来识别对方的能力和访问权限,从而实现安全的协作。

MCP风险提示

  1. 信息不对称。AI模型能看到工具描述的全部内容,包括隐藏在注释或特定标签中的细节,而在用户看到的AI Agent的前端界面出于简洁考虑往往只显示工具的基本功能描述,忽略了那些可能包含恶意指令的内容。此处可以进行工具投毒(Tool Poisoning Attack,简称TPA)。攻击者在MCP代码注释中的工具描述里嵌入恶意指令,这些指令对用户不直接可见但对AI模型可见。这些隐藏指令可以操纵AI Agent执行未经授权的操作,例如读取敏感文件、泄露私密数据等。 case:当用户的Cursor安装有恶意MCP,再调用WhatsApp-mcp给查看消息并给好友发送Hi消息时,用户的WhatsApp的历史聊天记录会被发送给攻击者号码。这里利用用户安装的whatsapp-mcp已有的权限实现数据窃取,不需要利用whatsapp漏洞。

  2. 缺乏上下文隔离。当AI Agent连接多个MCP服务器时,所有可用工具的描述信息都会被加载到当前的会话上下文中。这意味着来自恶意MCP服务器的工具描述可以影响来自可信MCP服务的工具行为。

  3. 大模型安全防护不足。模型往往缺乏针对恶意指令的批判性思维能力,特别是当这些指令被巧妙地伪装成工具的"必要前置条件"或"实现细节"时,同时即使开发者在prompt中加入了安全防护相关指令,攻击者也可以通过各类层不出穷的越狱攻击手法绕过。

  4. MCP协议缺乏严格的版本控制和更新机制,使得所谓的"地毯式骗局"(Rug Pulls)成为可能。恶意的MCP服务可以在用户初次安装并启用后,在远程服务器上静默修改工具描述加入恶意指令,且MCP客户端无法及时感知并要求用户二次确认。 Rug Pulls 是一种加密货币和区块链生态中常见的欺诈行为,其核心特征是前期承诺高额收益吸引大量投资者,然后项目方在合约代码中植入后门,半路突然撤资或终止运营(卷铺盖跑路),导致投资者资金被卷走或代币价值归零。

  5. 安全隔离与检测机制不足。MCP官方文档没有明确建议用户在Docker或沙箱环境中安装MCP服务,同时第三方MCP市场也没有对MCP代码安全性进行检查,用户非常容易安装带有后门或漏洞的MCP服务。

  6. 授权认证机制不完善。对于一些有敏感数据读取(如查DB、读文件)、敏感功能操作(如执行系统命令)功能的接口,MCP并没有在官方文档中明确强制要求开发者进行授权认证,这样可能导致部分暴露在公网上的MCP服务被入侵或未授权使用。

MCP 安全防护建议

  1. 作为普通用户,谨慎安装使用第三方MCP服务,尽量选择知名、开源且持续维护的MCP服务,尽量使用Docker部署MCP服务,限制其文件与网络权限,并在使用MCP工具时仔细检查其完整的输入参数,留意其是否有预期外的可疑操作。
  2. MCP协议安全改进:
    1. 标准化与显式化指令:建议MCP官方严格规范工具描述的格式,明确区分"功能描述"(给AI理解功能)和"执行指令"(给AI下达命令)。后者应该有特殊的语法标记,并且客户端必须能够识别和处理。
    2. 权限模型完善:建议MCP官方引入更细粒度的权限控制。例如,一个工具描述不应被允许直接指令AI读取任意本地文件,除非用户明确授权。工具描述中对其他工具行为的修改指令应被禁止或需要特殊声明和用户批准。
    3. 来源验证与签名:建议MCP官方要求MCP服务器提供的工具描述应进行数字签名,客户端验证来源可信度,防止描述被篡改。
  3. AI Agent开发安全防护:
    1. 安全沙箱机制:将来自不同MCP服务器的工具及其描述隔离在不同的安全上下文中运行,限制MCP服务A对MCP服务B的状态或指令空间的直接影响。同时对于具备命令与代码执行等敏感权限的MCP服务应该默认部署于Docker等沙箱环境。
    2. 输入输出检测:通过对LLM输入输出内容进行实时的检测与拦截,包含潜在的恶意Prompt指令(如文件路径访问、敏感数据模式、修改其他工具行为的指令)。同时Agent需要也对MCP工具的输入输出进行检查,防止敏感数据在用户不知情的情况下被编码或隐藏在看似无害的参数中。
    3. 增强UI透明度与确认:AI Agent前端应该展示完整工具描述,并在执行敏感操作前,明确告知用户AI的完整意图和依据,并进行精细化确认。
    4. 版本固定与哈希校验:对安装MCP工具版本进行验证,确保加载的工具描述与用户批准时的MCP服务版本一致,发生变更时提醒用户二次确认。

参考:

https://docs.anthropic.com/zh-CN/docs/agents-and-tools/mcp

https://zhuanlan.zhihu.com/p/29001189476

https://mp.weixin.qq.com/s/x3N7uPV1sTRyGWPH0jnz7w

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计
本博客已稳定运行