编者按:应用越智能,背后的设计会越复杂。软件的本质是解决复杂性问题,MCP 虽打开了智能的创意上限,但也给后端的设计带来了无限的复杂度。本文旨在从 MCP 的技术原理、降低 MCP Server 构建复杂度、提升 Server 运行稳定性等方面出发,分享我们的一些实践心得。文章内容较长,以下是导读大纲。(点击获取 78 页完整版 PPT)
1、介绍 MCP 的概念及其运作机制。
2、解释 MCP 和 Function Calling 之间的区别。
3、讲述 MCP 的本质和挑战,包括描述 MCP 信息的系统提示词的挑战,MCP Client 与 MCP Server 之间协同关系的挑战,快速构建 MCP Server,自建 Dify 的痛点等。
4、分析如何解决 MCP 的各个挑战,包括 MCP Register、MCP Server 和 Promt 的统一管理、MCP 效果验证体系和安全性保障、MCP 网关、MCP Server 的动态服务发现、Streamable HTTP、弹性效率、可观测等。
5、最后探讨 MCP 对 AI 应用架构新范式的影响,并介绍 MCP Server First 的理念。
作者:计缘
人工智能(AI)在商业领域的应用正日益成为推动创新和效率提升的核心力量。其核心在于多个AI Agent的协作,这些AI Agent通过分工与合作,共同承载AI应用所支持的业务需求。这种协作模式不仅优化了企业运营,还展现了AI在解决高影响力挑战中的潜力。
当前的AI Agent,无论是和各种Tools(各类业务服务接口)交互,还是和各类Memory(各类存储服务接口)交互,亦或是和各类LLMs(各类大语言模型)交互,都是通过HTTP协议的,除了LLM因为基本都遵循OpenAI范式以外,和其他的Tools和Memory交互都需要逐一了解它们的返回格式进行解析和适配。当一个AI应用包含多个AI Agent时,或者一个AI应用需要和多个业务服务接口和存储服务接口交互时,整体的开发工作量是很大的,主要体现在3个方面:
所以目前很多AI应用就只有少数几个AI Agent,甚至很多AI应用背后就只有一个AI Agent。这也是目前AI应用背后的AI Agent依然还处在第一个阶段(Siloed, Single-Purpose Agents)的原因。
为了能使AI Agent进入到第二阶段(Platform-Level Agents),我们使用云原生API网关做了统一的接入层,通过一个网关三种不同角色的方式,解决了一部分复杂度:
但如我所说,这只解决了一部分复杂度问题,更核心的找接口和解析接口这两个问题依然没有解决。直到MCP(Model Context Protocol)的出现,让我们看到了真正通往第二阶段(Platform-Level Agents)的路,甚至可以尝试触摸第三阶段(Universal Agents, Multi-Agents)。
MCP是模型上下文协议(Model Context Protocol)的简称,是一个开源协议,由Anthropic(Claude开发公司)开发,旨在让大型语言模型(LLM)能够以标准化的方式连接到外部数据源和工具。它就像AI应用的通用接口,帮助开发者构建更灵活、更具上下文感知能力的AI应用,而无需为每个AI模型和外部系统组合进行定制集成。MCP被设计为一个通用接口,类似于USB-C端口,允许LLM应用以一致的方式连接到各种数据源和工具,如文件、数据库、API等。
MCP目前一共有3个核心概念:
要真正理解MCP是什么,我们需要了解它的运作机制,然后你就能知道MCP的调用方式和传统的HTTP调用方式有什么不同,可能也能隐约体会到为什么我说MCP可以让AI Agent进入第二阶段。
如上图所示,一次基于MCP的调用,一共有6个核心的步骤。我们先拟定一个前提:
调用步骤解析:
在MCP的整个调用过程中有一个非常核心的点就是**MCP Server 以及 MCP Tool 的信息。**从第一步,第二步可以看出,这个信息非常关键,是它让LLM知道了该如何解决用户的问题,这个信息就是MCP中最重要的System Prompt,本质上就是PE工程。
MCP不像传统的协议定义,它没有一个确定的数据结构。它的核心是通过自然语言描述清楚有哪些MCP Server,承担什么作用,有哪些MCP Tool,承担什么作用,然后让大语言模型通过推理去选择最合适的MCP Server以及MCP Tool。所以它的核心本质上还是提示词工程。
上面两张图是Cline(一个MCP Client)中的System Prompt,可以清晰的看到它对MCP Server和MCP Tool都有明确的描述。
上图是流程中的第一步,将用户的问题和System Prompt一起发送给LLM的内容。
上图是流程中的第二步,LLM返回了解决用户问题明确的MCP Server和MCP Tool信息。
看到这,我想大家应该对MCP是什么有一定感觉了。MCP是不是解决了找接口和解析接口的问题?因为这两个工作都交给了LLM。
那么可能有小伙伴会问,MCP和LLM的Function Calling又有什么区别呢?核心区别是是否绑定模型或模型厂商:
如上图所示,LLM Function Calling 需要LLM为每个外部函数编写一个 JSON Schema 格式的功能说明,精心设计一个提示词模版,才能提高 Function Calling 响应的准确率,如果一个需求涉及到几十个外部系统,那设计成本是巨大,产品化成本极高。而 MCP 统一了客户端和服务器的运行规范,并且要求 MCP 客户端和服务器之间,也统一按照某个既定的提示词模板进行通信,这样就能通过 MCP 加强全球开发者的协作,复用全球的开发成果。
根据上文的一些列解释,我们可以总结一下MCP的本质:模型上下文协议(Model Context Protocol)并不是一个确定的数据格式或数据结构,它是**描述MCP Server/MCP Tool信息的系统提示词和MCP Server与LLM之间的协同关系的结合,解决的是找接口和解析接口**的问题。
明确了MCP本质之后,将其带入到企业级生产应用中,你就会发现,这两个核心点上会有很多挑战,或者说不足。
我们结合MCP范式,以解决上述挑战点为目的,将AI Agent的架构进行了重构。在**云原生API网关,微服务引擎Nacos两个产品中做了MCP增强能力,解决了上述大部分的挑战点。在函数计算 FC,Serverless应用引擎 SAE 两个产品中做了MCP增强能力,前者解决快速开发MCP Server的问题,后者解决开源Dify性能的问题。共同构建了基于MCP的AI应用开发新范式**。
首先我对图中的8步核心调用链路做以解析:
我们依然基于MCP的两个本质来刨析这个新的架构。
我们团队是中间件开源最多的团队,比如Nacos,Higress,Sentinel,RocketMQ,Seata等,并且还维护着Spring Cloud Alibaba,Spring AI Alibaba,Dubbo这些开源开发框架,在微服务架构领域有着丰富的经验。所以在MCP Server和MCP提示词统一管理这个点上,天然的就想到了微服务领域里基于Nacos做服务注册发现和配置统一管理的模式,我们将其转嫁到了MCP范式,大家可以想一下以下这些对应关系:
所以在MSE Nacos这个产品中,我们做了一系列增强MCP的能力,使MSE Nacos成为统一管理MCP Server的MCP Register(MCP Server注册/配置中心)。是AI应用开发新范式的核心组件。
另外,MCP官方的Roadmap中,也在规划MCP Register的能力,我们会基于Nacos作为MCP Register的方案和MCP在开源侧进行共建。
MCP Server注册到MSE Nacos有两种方式:
在MSE Nacos中对MCP Server进行统一管理,可以实现对MCP Server的健康检查,负载均衡,描述信息Json向XML转换,MCP Server上下线管控等功能。
在MSE Nacos中维护MCP Server的Prompt有两种方式:
[MCP Server name]-mcp-tools.json
。
在MSE Nacos中对MCP Server提示词进行统一管理,可以实现MCP提示词版本管理(回滚),MCP提示词灰度管理,MCP提示词安全管理,MCP提示词动态调优实时生效等功能。
上文中提到当MCP Server很多时,MCP Server的各描述信息会很多,也就是Prompt会很长,Token消耗很大,所以需要有机制基于用户的输入缩小MCP Server范围,减少Token消耗,增加LLM推理效率。除此以外,大家知道,只要是和LLM交互的场景,提示词的好坏是需要多次调试的,MCP的整个流程强依赖提示词工程,如果提示词调整不好,LLM无法返回准确的MCP Server和MCP Tool,那么整个流程就是不可用的状态了。所以在Nacos中我们正在做一个MCP效果验证的体系。
核心的原理是我们会提供一个基于Spring AI Alibaba开发的AI Agent,通过用户配置的业务输入、LLM、圈定的MCP Server和MCP Tool的集合不断的做验证,将结果以视图的方式展现出来(比如成功率等)。用户可以在Nacos中动态的对成功率低的MCP Server的提示词做调整优化。
无论哪种架构,哪种模式,安全性在企业生产中必然都是第一位的,MCP 领域也不例外,并且需要考虑的环节更多。
在MCP范式中,其实是三个角色在互相协同:
这两类协同关系本质上还是服务提供方和服务消费方之间的关系,涉及到代理协作和流量管控两个核心点。在传统开发范式下,通常是由网关来负责的。所以我们在云原生API网关中增强了LLM代理和MCP Server代理的能力,使其同时具备流量网关,AI网关(LLM代理)和MCP网关的能力。是AI应用开发新范式的核心组件。
所以在企业的整体系统架构中,只需要一个云原生API网关,即可作为流量网关、API网关、微服务网关、AI网关、MCP网关,在代理和流量管控层面实现传统业务和AI业务的大统一,并且再结合AI应用开发的新范式,平滑的将AI业务和传统业务相结合。
秉承着自己吃自己狗粮的原则,云原生API网关在阿里集团内部已经有很多业务在深度使用,在企业级产品能力,稳定性,性能方面已经有多个大体量业务的背书。
MCP Client与LLM之间的交互和传统业务与LLM之间的交互本质是一样的,只要应用上生产,都会有一些列的问题需要去解决:
以上问题都是实实在在的客户在使用过程中遇到的问题,有些是模型自身问题,有些是部署架构问题,如果要客户一个一个去解决,复杂度和时间成本都是比较高的。所以就需要AI网关的介入来快速的,统一的收敛掉这些核心问题。
云原生API网关的AI网关增强能力主要有四部分:
AI网关代理LLM更详细的方案可以参见我之前的文章:https://mp.weixin.qq.com/s/tZ0wsTlZK67r9IxNZ57TDQ
MCP Client和MCP Server之间的交互和传统的服务提供者和服务消费者之间的交互就有所区别了,所以我们在云原生API网关中增加了MCP相关的能力,但从产品版本划分层面,MCP相关的能力依然包含在AI网关的能力范畴内。
上文中介绍了MSE Nacos作为MCP Server注册/配置中心,那么MCP Client如何来发现呢?如果是MCP Client直接和MSE Nacos交互,那么又会在MCP Client中引入Nacos SDK,增加了编码的复杂度。
鉴于云原生API网关和MSE Nacos在传统服务领域早已做了深度集成,打通了云原生API网关自动发现注册在MSE Nacos中的服务,所以在MCP范式下,我们同样实现了云原生API网关自动发现注册在MSE Nacos中的MCP Server的能力。
通过这种方式,MCP Client只需要使用云原生API网关的接入点,即可自动的、动态的获取到所有注册在MSE Nacos中的MCP Server。云原生API网关(MCP网关)就变成了一个MCP Hub,无论如何更新、变更MCP Server,都只需要在MSE Nacos操作即可,MCP Client无需做任何修改。
在AI的时代下,我认为最有价值的是使用AI增强、提升客户的现存业务,使其变成一个AI应用或AI加持的业务,而不是完全新开发一套AI应用。
所以开发一个AI应用或者做现存业务的AI增强,AI Agent是需要和大量现存业务做交互的,MCP虽然统一的协议,但将现存业务重构为MCP Server的成本是非常高的,并且目前支持的开发语言有限,像Go,PHP都没有对应的MCP SDK,所以会让很多企业想拥抱MCP,但又无从下手。
网关最擅长做的事情就是协议转换,Nacos在传统微服务场景下已经注册了很多现存的传统服务,那么两者一拍即合,通过网关将注册在Nacos中的传统服务0代码改造的转换为MCP Server。
[Server Name]-mcp-tools.json
命名规范的配置文件,在配置文件中使用MCP规范对现存业务的接口进行描述。MCP范式默认的传输协议是SSE(Server Sent Event),本质上是一种长连接,有状态的传输协议。这种协议在企业级应用中有很多弊端:
好在MCP官方也意识到了该问题,所以在3月下旬,发布了新的Streamable HTTP协议。Streamable HTTP改变了MCP的数据传输方式,让协议变得更灵活、更易用、更兼容:
简单来说,原来的MCP传输方式就像是你和客服通话时必须一直保持在线(SSE 需要长连接),而新的方式更像是你随时可以发消息,然后等回复(普通 HTTP 请求,但可以流式传输)。
这里大家可以思考一下:
虽然Streamable HTTP还在草案阶段,但云原生API网关作为MCP网关已经支持了将SSE传输协议自动转换为Streamable HTTP传输协议。或者说,通过云原生API网关(MCP网关)代理的MCP Server同时支持SSE和Streamable HTTP两种传输协议供Client使用。
身份认证和权限管控在任何架构,任何业务场景下都是刚需,在MCP范式下也不例外,这里有两个层面的权限管控:
大家设想一下,当传统业务可以0代码转换为MCP Server后,注册在Nacos中的MCP Server和MCP Tool肯定会有很多,从业务领域来说,可能有和财务相关的MCP Server,有和销售相关的MCP Server,有和售后服务相关的MCP Server。在返回MCP Server和MCP Tool信息时不可能将所有信息都返回,肯定只能返回Client身份有权使用的MCP Server信息。
云原生API网关作为MCP网关,通过成熟的插件机制提供了HTTP Basic Auth,OAuth2.0,JWT,API Key,外部认证等多种认证方式,以及基于消费者认证功能,可以让用户灵活的管理和控制Client的身份认证和MCP Server/MCP Tool使用权限。
当MCP Server是数据类服务时会比较常见,比如Mysql MCP Server,Redis MCP Server等。权限会下探到库级别,表级别。在这种场景下,云原生API网关作为MCP网关,可以通过插件机制,改写或增加Request Header的值,结合MSE治理将Header的值透传下去,然后在服务内部进一步做数据权限管控。
我举例一个通过这种方式实现的数据库读写分离的场景:
众所周知,AI应用里涉及到LLM推理的场景,大都用在调用相对稀疏的场景,MCP范式强依赖LLM推理,所以无论是基于HTTP API模式的AI应用开发架构还是基于MCP的AI应用开发架构,目前也都是应用在相对稀疏调用的场景。所以这里可以延伸出两个问题:
在所有的计算产品中,函数计算(FC)这种Serverless FaaS类型的计算产品,在资源粒度、弹性策略、弹性效率方面都是最适合稀疏调用场景的。
函数计算(FC)目前支持了Python和NodeJS两种语言的MCP运行环境(其他语言的MCP运行环境也马上会支持)。用户选择MCP运行环境创建函数后,只需要编写MCP Tool的业务逻辑即可,不需要考虑如何使用MCP SDK。并且云原生API网关和函数计算(FC)有深度集成,可以天然适配AI应用开发的新范式。
基于函数计算(FC)构建的MCP Server在弹性效率方面可以从两个维度来看:
函数计算(FC)的实例规格从 0.05C 128MB 到 16C 32GB 不等,有几十种规格的组合方式,可以灵活的根据不同MCP Server承载的业务选择合适的资源规格。另外,在AI应用中,尤其是流程式构建的模式中,大多数AI Agent的职责都是单一的,计算逻辑不复杂的任务,所以都可以用较小资源规格的函数承载。资源规格小,在资源调度,弹性效率方面自然就会有优势。
再看函数计算(FC)的弹性机制,它是完全按照请求弹性的,有多少QPS,就拉起对应数量的实例,并且实例可以复用,当QPS降下来后,空闲的实例会自动释放,整个过程完全不需要用户介入参与。在默认按请求弹性的的基础上,用户还可以自行设置按照时间定时弹,或按照指标阈值弹的策略,进一步满足复杂多变的业务场景,做到资源成本最优。
函数计算(FC)有完善的可观测体系,也就意味着,基于函数计算(FC)构建的MCP Server同样具备指标、链路、日志三个维度的可观测能力。
通过这套可观测体系,用户可以清晰的了解每个MCP Server的各类运行状态。
目前,Dify基本已是可视化流程编排AI Agent使用最广泛的工具,但是目前还没有任何一家云厂商有Dify托管产品,所以很多基于开源自建Dify平台的客户会遇到很多共性的问题,尤其是从个人开发者、开发Demo转向企业级生产应用构建时,这些问题往往都是致命的。
企业基于开源自建Dify遇到的问题:
为了解决这些问题,阿里云上的Serverless PaaS类型的计算产品 Serverless应用引擎(SAE)做了企业生产级别的Dify托管部署方案,旨在解决上述问题,让企业在使用Dify的时候不用再关心稳定性、健壮性、性能这些问题。
SAE提供了Dify应用模板,可以一键拉起Dify应用,并且提供可视化构建的能力,可以对Dify里的每一个环节进行单独调整。
SAE部署Dify支持配置化,三AZ部署,实例粒度的自动化迁移,结合云原生API网关和SAE内置的服务治理能力,保障负载均衡稳定性,同时还支持Dify 6个核心服务的健康检查,以及无损上下线。
同样依托于底层Serverless架构,部署在SAE中的应用同样具备优秀的横向扩展效率,并且支持多种方式的弹性规则配置,使整套Dify服务可以根据不同的业务场景进行弹缩,在保证高可用的同时,又兼具成本优势。
除此以外,SAE还支持小流量预热,CPU Burst等能力,进一步保证Dify应用在极端情况下的稳定性。
定时执行工作流做AI数据处理是通用的业务场景,Dify官网已经把通过定时任务做Dify工作流的定时执行和状态监控作了最佳实践,可以参考https://docs.dify.ai/zh-hans/learn-more/use-cases/dify-schedule。但是该实践中的Dify Schedule比较简陋,通过Github Actions做定时调度,只能调度公网的dify工作流,且不是一个企业级解决方案。
开源Dify在调度方面的痛点主要有3点:
我们的方案是通过MSE任务调度(SchedulerX)来解决上述问题。
MSE任务调度集成Dify方案对比开源方案有以下7点优势:
功能 | MSE任务调度 + Dify | 开源Dify |
---|---|---|
定时调度 | 有 | 无 |
监控告警 | 有 | 无 |
执行记录保留时长 | 保留最近2个月 | 无限制,但数据量太大会导致查询性能太差 |
执行记录查询 | 支持时间区间、状态等多种查询条件 | 过滤条件有限 |
权限管理 | 操作级别精细化权限管理 | 用户级别 |
限流 | 应用限流、Token限流 | 无 |
失败自动重试 | 有 | 无 |
结合阿里云可观测产品ARMS,链路追踪OpenTelemetry,我们构建了AI应用全环节的可观测体系。
AI应用整体的可观测体系构建主要有两部分核心:
数据采集的核心是要覆盖足够的广,这里又分两个层面:
在这两个层面,我们通过阿里云应用监控产品ARMS和链路追踪OpenTelemetry实现了全覆盖:
应用监控ARMS中,专门构建了LLM应用监控模块,针对AI应用场景提供了完善的可观测体系。
纵向的指标有:
横向链路方面提供了专业的调用链分析功能:
虽然Dify在做AI Agent开发时已足够便利,但是受限于Dify的开发语言(Python)和流程引擎的实现逻辑。在运行复杂AI应用时,性能方面是有缺陷的。所以我们在探索将Dify流程的DSL自动转换为基于Spring AI Alibaba开发框架的代码。
相当于只使用Dify低代码可视化构建AI应用的皮,运行的内核基于Spring AI Alibaba开发框架的代码,这样既具备了便捷的AI Agent编排能力,又具备了更好的运行性能。
目前的MCP模式,LLM针对用户的输入,只返回一个确定的MCP Server和MCP Tool,这是其实是由系统提示词控制的。理论上LLM可以针对用户的输入返回多个MCP Server和多个MCP Tool,并且基于MCP Server和MCP Tool的描述告诉Client它们之间的调用顺序,相当于由LLM做好了MCP Server的编排。这个模式我们还在探索中,很类似现在的Multi-Agent的模式。
因为MCP模式中,会频繁和LLM交互,显而易见,相比传统API调用,MCP这种模式的性能是不好的,所以在一些时延敏感的业务场景中,目前大概率还不适合MCP模式。
目前我们也在探讨和探索如何提高MCP模式下的请求性能问题,比如:
至此,企业级AI应用架构新范式的介绍就结束了,整个架构里有很多环节,每个环节里又有许多细节,在文章中无法一一展开说明。有兴趣的同学可以联系我共同探讨。
我们可以设想一下在这个AI应用架构新范式下,企业的运营、产品、研发、运维团队之间的组织结构和协作关系可能会发生哪些变化?应用或系统的开发模式会发生哪些变化?
这里我来分享一下我的畅想。
API First,前后端分离这两个概念已经存在很久了,海外企业遵循和实践的会比较好。因为我深耕在Serverless计算领域也有5年时间,对AWS的Lambda架构方案,Azure Functions架构方案,Azure App Service架构方案,GCP CloudFunction架构方案,GCP CloudRun架构方案有比较多的研究。接触了很多Serverless FaaS和Serverless PaaS架构的客户案例,包括负责落地了不少从双A迁移到阿里云的客户。基本上都是标准的基于APIG+FaaS模式的API First形态。但是在国内,这个模式实践的并不好,除了高德下决定使用函数计算重构了系统,实现了真正的API First,前后端分离模式以外,鲜有客户有这种模式的实践,也许是有太重的历史包袱。
上图是高德前后的架构对比。
在AI应用的时代,本质上依然是对各种API的调用,但是将HTTP API改成REST API,改造成本是巨大的。但当MCP出现后,当我们的方案可以帮助客户0代码的转型AI应用架构新范式的时候,MCP Server First是有可能。
所以未来很有可能每个企业都有自己的MCP Server市场,在MCP Server市场里分门别类,每类MCP Server有专门的研发团队负责,不用太需要考虑统一返回格式,不用考虑开发语言统一。运营、市场、产品等业务方有业务需求或者有新的产品功能需求时,可以通过统一界面用大白话快速构建AI应用,MCP+LLM来实现业务编排,实现PRD既产品(PRD as a Product)的新的开发模式。