MCP为何重要?又该如何保障其安全?

作为一种通用协议,MCP能够将智能体应用与现实世界的数据和工具连通,成功解决上述局限。但既然我们已经拥有一众安全且高性能的API,那为什么还要引入新的协议?

译者 | 核子可乐

审校 | 重楼

每种新协议都会带来相应的复杂性,因此若无必要、勿增新协议。但模型上下文协议(MCP)无疑很有必要。

ChatGPT等AI工具已然掀起一波智能体应用浪潮,这些由大模型驱动的智能体擅长摘要、内容创作与图像处理,但也存在一些根本性的局限:

  • 无法访问实时数据;
  • 无法访问私有数据;
  • 无法使用工具。

作为一种通用协议,MCP能够将智能体应用与现实世界的数据和工具连通,成功解决上述局限。但既然我们已经拥有一众安全且高性能的API,那为什么还要引入新的协议?

答案并不复杂,虽然各类强大的API能够接入智能体应用,但由于自身种类繁多、身份验证机制又各不相同,意味着每次集成都存在大量定制化成分。开发者必须逐一阅读文档、构建流程才能接入API。

WSO2

这种静态集成模型虽然成熟,但与智能体应用的动态特性并不匹配。MCP定义了清晰的客户端-服务器角色、标准协议格式和生命周期,本质上成为大模型与外部系统间的通用连接器,因此不少从业者将MCP视为API领域的USB端口。

MCP工作原理

MCP定义了三大核心角色——主机、客户端与服务器:

  • 主机:管理客户端生命周期,并具备强制安全保障的智能体应用。
  • 客户端:主机内的轻量级连接器,用于同MCP服务器建立一对一会话。
  • 服务器:将MCP客户端连接至本地或远程数据源及工具的程序。

WSO2

各角色提供相应的功能。MCP服务器负责公开资源(如日历事件等上下文数据)、提示词(用于引导用户输入以改进大模型输出的结构化模板)及工具(可执行函数)。MCP客户端则接入MCP服务器以请求数据、操作工具并编排智能体。

MCP使用JSON-RPG(一种轻量级结构化协议)以处理请求及响应,并定义了两种用于客户端-服务器通信的标准传输机制:标准输入输出(STDIO)及可流式传输的HTTP。

保护本地MCP服务器

当MCP服务器运行在本地时,应使用STDIO传输。实际上,这意味着智能体应用将MCP服务器作为子进程启动,并通过其标准输入输出流进行通信。由于此通信完全在本地系统内进行,因此本质上符合安全原理且MCP身份验证规范无需借助额外安全措施。

WSO2

然而,当MCP服务器与后端API通信(大多通过互联网)时,安全性要求成为首要任务、并超出了MCP身份验证机制的范畴。尽管如此,这里仍不需要引入新机制:现有API安全实践已经足以提供保障,常见方法包括:

  • 长效令牌:有效期为数天或数月的API密钥及令牌,通过带外通道获取并在MCP服务器中配置。
  • 短效令牌:短效信息的有效期在一小时以内,无法手动设置。相反,MCP服务器必须在运行时动态请求并获得用户批准。典型例子包括OAuth2访问令牌及JWT。

保护远程MCP服务器

MCP客户端通过向其端点URL发起请求,通过HTTP接入远程MCP服务器。根据MCP身份验证规范的规定,此端点必须受到OAuth 2.1保护,并要求客户端提供有效访问令牌。

WSO2

MCP身份验证规范概述了令牌的获取流程,旨在支持动态智能体集成。具体交互包括以下步骤:

WSO2

服务器元数据发现

在为MCP服务器提供URL配置参数之后,客户端会移除所有路径组件并附加/well-known/oauth-authorization-server路径以构建服务器元数据端点。之后,客户端从此端点处检索JSON格式的服务器元数据文档。端点及文档都必须符合OAuth 2.0授权服务器元数据规范,且此元数据可帮助客户端在后续步骤中发现以下所需信息:

  • 注册端点;
  • 授权与令牌端点;
  • 支持的授权类型与范围。

从MCP服务器URL获取服务器元数据端点的初衷,是让客户端使用单一配置参数进行操作。但这样的设计会令授权与资源服务器角色紧密耦合,限制了现有OAuth 2.0基础设施与专用身份解决方案的使用。为了解决这个问题,即将发布的MCP身份验证规范将转而采用OAuth 2.0受保护资源元数据规范。

客户端注册

根据从服务器元数据文档中检索到的信息,客户端应用向客户端注册端点发送注册请求。MCP身份验证规范采用OAuth 2.0动态客户端注册(DCR)协议将客户端注册为OAuth 2.1客户端。在DCR响应中,客户端应用会收到一个client_id;对于机密客户端,还会收到一个client_secret。这两项参数将在下一步操作中用到。

尽管DCR得到广泛采用,但人们对于开放注册的评判并不一致,而且该规范本身允许使用OAuth 2.0保护注册端点。同样,为了支持单参数配置,MCP身份验证规范建议采用开放注册,未来如何发展仍有待观察。

访问令牌检索

在此阶段,客户端已经做好了请求访问令牌的所有准备。根据用例,客户端将使用以下OAuth 2.1授权类型之一:

  • 客户端凭证:若客户端应用直接访问MCP服务器,则使用客户端凭证授权,其中包含注册期间获得的client_id与client_secret,以及从服务器元数据中发现的令牌端点及范围。
  • 授权码:若客户端代表最终用户访问MCP服务器,则使用授权码授权。此流程需要注册时获取的client_id与client_secret,以及从服务器元数据中获取的授权端点、令牌端点及范围。此外,根据OAuth 2.1的要求,客户端必须使用码交换证明密钥(PKCE)以进一步增强安全性。

WSO2

若一切顺利,客户端应用将获得有效访问令牌,并可向MCP服务器URL发起连接请求,并通过Authorizatio nHTTP标头传递令牌。之后,MCP服务器将验证令牌,在确认有效后建立连接。

总体而言,整个安全流程与基于OAuth的典型API安全流程保持一致,唯一区别只有从MCP服务器URL获取服务器元数据URL的初始步骤。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。


因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量

MCP协议是AI领域的一项重要创新,它标准化了应用程序为大语言模型(LLM)提供上下文的方式,为AI模型与外部工具和数据源的交互提供了统一、高效、安全的解决方案[^2]。 MCP大概的工作方式为:MCP Host(如Claude Desktop、Cursor等工具)内部实现了MCP Client,MCP Client通过标准的MCP协议和MCP Server进行交互。由三方开发者提供的MCP Server负责实现各种和三方资源交互的逻辑,例如访问数据库、浏览器、本地文件等,最终再通过标准的MCP协议将结果返回给MCP Client,最终在MCP Host上展示[^1]。 MCP协议具有诸多优势和实现的功能: - **优势**:提出标准化Function Calling运行规范,显著简化开发流程;客户端和服务器统一规范,避免重复开发;支持复用通用外部函数(如天气查询、网页爬虫、数据库访问等);Cursor等工具已集成MCP,支持快速接入上千个开源MCP Server,加速Agent开发[^3]。 - **实现的功能**:通过提供标准化协议,实现多个数据源和工具的单一接口以达成统一访问;可轻松添加新功能,实现即插即用扩展;支持AI与资源之间的实时双向通信,即有状态通信;AI能够即时发现和使用新工具,实现动态发现[^4]。 ```python # 此处为模拟MCP协议中Client与Server交互的简单示例代码(仅为示意,非真实完整代码) class MCPClient: def __init__(self): pass def send_request(self, request): # 模拟发送请求到MCP Server print(f"Sending request: {request} to MCP Server") def receive_response(self): # 模拟接收来自MCP Server的响应 response = "Simulated response from MCP Server" return response class MCPServer: def __init__(self): pass def handle_request(self, request): # 模拟处理来自MCP Client的请求 print(f"Received request: {request} at MCP Server") response = "Processed response" return response client = MCPClient() server = MCPServer() request = "Query database for user information" client.send_request(request) server_response = server.handle_request(request) client_response = client.receive_response() print(f"Client received response: {client_response}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值