ai-agent框架spring ai alibaba (三)外部调用II-1 MCP
简介
spring ai alibaba是java的ai agent框架,本系列将深入剖析 Spring AI Alibaba 的源码实现与核心原理,不仅指导agent的开发,更可以改造框架,增加新特性
系列内容:
系列(一) 架构 完成
系列(二) 调用
I 工具
II-1 MCP MCP能力,工具,资源,Prompts,sampling,。。。;springboot自动配置;
-2 分布式 MCP
-3 MCP security
III skills 完成
系列(六) RAG
I 知识库,文档读取,分块;嵌入,向量store
检索,增强生成,模块化
II 混合检索,融合重排
系列(三) 模型
I 模型模型,chat模型; chat client,提示词,消息,结构化输出
II advisor组件;chat记忆,会话管理
系列(四) graph 图结构,节点和边;StateGraph,CompiledGraph;图执行
系列(五) I agent,ReactAgent;另外FlowAgain,A2A agent放在MAS
II 钩子和拦截器;上下文工程
系列(七) MAS
I FlowAgent,sub agent,agent tool;handoffs模式,toolcalling模式;
II A2A,分布式agent;agent集群,AP2AP
III 集成agentscope-java,agentic模式,消息hub
系列(八) 模型评估和观测
系列(九) agent管理平台(admin) agent发布,列表,提示词管理,会话管理,skill管理,MCP服务管理;评估;观测
其他 多模态
本文分析外部调用II-1 MCP,另外,II-2 分布式MCP,II-3 MCP security
based spring ai aliba ba v1.1.2.2,spring ai v1.1.2,MCP sdk 0.17.0
关键词
缩写
spring ai缩写sa
spring ai alibaba本文缩写saa
参考资料
https://java2ai.com/docs/overview spring ai alibaba官网文档
https://docs.spring.io/spring-ai/reference/index.html spring ai官方文档
组件视图
上图是saa原理源码分析场景视图,每个包对应着saa/sa组件或特性,是本文分析的目录
model大模型调用装,模型包括Chat,嵌入,audio,image等类型,其中chat模型包括,chat client,advisor组件,提示词,记忆等;
agent/graphagent和图紧密相关,可以认为agent是一种既定的”图”形,开发人员可以使用graph低层api直接构建graph,也可以使用agent获得既定的图形,简化和加快agent的开发
外部调用(calling)调用可能是agent发展演变最快的部分,最初的工具,到mcp,最近的CLI,skills
RAG检索增强生成
MAS多个agent协同工作,每个agent有独立职能
studio简易的agent管理工具,嵌入到agent,带有agent面板,列表agent;提供chat界面,用于调试agent
admin管理台, agent的发布,列表,管理,执行;提示词工程,评估和数据集,观测
外部调用
如果说agent是一个人,大模型是大脑,调用是手脚,执行动作干实事。调用在不断发展演变中,目前已有工具,MCP,skills,CLI等多种方式
MCP-sdk MCP的实现,包括连接管理,会话和传输协议,能力(资源,工具等),本文不分析MCP原理源码,重点放在sa/saa集成MCP,saa分布式MCP
MCP介绍
本节介绍MCP
上图sa文档MCP的描述,3个关键词,MCP是ai model调用工具和资源的标准协议,MCP是ai model与外部交互的桥梁
MCP能力(Capabilities)
MCP规范定义MCP的能力,Tools是主要能力,其他能力有client侧,有server侧的
server侧:
Tools,定义可执行的函数,是目标本身,让 AI 做事情(如,查天气、发邮件、写文件)。
Resources,提供可读取的数据 ,Tool的“原材料”或“背景知识”。 执行Tool前,通过Resource了解当前状态、配置、文档或待处理的数据。
Prompts, 提供预定义的提示词模板,教AI正确使用Tool。避免 AI 自己乱编调用方式,提供最佳实践和上下文示例。
Completion,自动补全能力,允许服务器为 Prompts 和 Resources 的参数提供实时的、上下文感知的输入建议
client侧:
Elicitation,大模型反向询问client,获取用户信息
Roots,client告诉server “用户的工作目录在哪”,方面后续server获取client的文件数据
Sampling, 允许Tool在执行过程中请求AI生成内容,让Tool 拥有“内省”或“补全”能力。一个复杂的Tool执行中,需要 AI 进行推理、总结或决策时,可以通过Sampling临时“借用”客户端的 LLM 来完成。
Notifications,变更通知能力,client和server变更互相实时通知
总结:
MCP以Tools为中心,其他的能力为完成工具调用设置,要么是给大模型工具使用的资料(Resources,Prompts),告诉大模型工具怎样使用,要么server工具调用中向client询问信息(Sampling,Elicitation)
与skills对比,skills让大模型做好任务,MCP让大模型用好工具,两者可以互替
MCP工具
MCP工具,sa使用ToolCallback/ToolCallbackProvider组件封装,后续以工具管理和调用,共享工具调用的运行环境
上图MCP工具类图
SyncMcpToolCallbackProvider接收McpSyncClient集为参数,遍历McpSyncClient集,每个McpSyncClient可带多个MCP工具(MCP.Tool类),每个MCP.Tool封装为SyncMcpToolCallback
SyncMcpToolCallbackToolCallback实例,工具调用类,引用McpSyncClient调用MCP .Tool
McpClient.SyncSpecSyncSpec是McpClient的builder,可设置多种事件消费者,监听能力的变更其中有Tool变更
ApplicationListener/McpToolsChangedEvent SyncMcpToolCallbackProvider实现Tool变更监听,使用spring的事件机制,监听MCP工具的变更,即上节的Notifications能力,重刷一遍McpSyncClient集合,构建新的SyncMcpToolCallback
下面分析MCP集成,springboot自动配置,
构建SyncMcpToolCallbackProvider/SyncMcpToolCallback
MCP集成
本节分析sa的MCP集成,spring boot自动配置,分java配置和注解配置两部分,其中,java配置构建ToolCallback,注解配置负责MCP能力构建,client侧的McpSampling, McpElicitation, McpProgress等,server侧的McpTool, McpResource, McpPrompt, McpComplete等
MCP client
本节分析MCP client,MCP client运行在AI应用,与MCP sesrver,调用MCP server工具和能力
java配置
上图自动配置Java配置类图,为了展示清晰,Transport有只展示Streamable,只展示同步
McpToolCallbackAutoConfiguration自动配置的C位,自动配置最终目标是构建SyncMcpToolCallbackProvider,
SyncMcpToolCallbackProvider给ai应用提供McpToolCallback,依赖
McpClientAutoConfiguration 构建的McpSyncClient
McpClientAutoConfiguration负责构建McpSyncClient,依赖McpTransport,通讯传输实现;McpSyncClientConfigurer给用户定制McpSyncClient的组件
McpAsyncClientConfigure/McpSyncClientCustomizer使用SyncSpec定制McpSyncClient,上一节介绍的设置MCP工具变更事件消费者就是这个组件完成
StreamableHttpHttpClientTransportAutoConfiguration负责构建McpTransport,使用配置属性(Properties)
注解配置
McpSyncClient的能力是由注解配置负责
上图MCP client注解配置类图
McpClientAnnotationScannerAutoConfiguration注解自动配置类,职责实例化
ClientMcpSyncHandlersRegistry
ClientMcpSyncHandlersRegistry扫描spring管理的类型,找出带MCP标注的bean,使用了spring两个机制:
--BeanFactoryPostProcessor扫描受spring管理的类(带Service注解),构建两个属性对象,allAnnotatedBeans,所有带有MCP注解的bean的名称;capabilitiesPerClient,保存每个client拥有的能力,MCP client用它列举能力
--SmartInitializingSingleton分析allAnnotatedBeans的MCP注解,使用反射技术封装MCP能力处理器
McpClientAutoConfiguration/McpSyncClient上节java配置分析过,其中McpSyncClient能力设置是注解配置负责,从ClientMcpSyncHandlersRegistry获取
总结:client侧的自动配置目标是构建SyncMcpToolCallbackProvider,java配置负责,该类提供调用MCP工具的组件McpToolCallback,McpToolCallback依赖McpSyncClient,也是java配置负责,注解配置负责McpSyncClient能力handler
MCP server
上节分析MCP client侧自动配置,server侧“套路”类似,server侧的配置最终目的是构建Mcp Server,java配置负责,而注解配置负责初始化Mcp Server的能力
上图 MCP server的自动配置图1,负责构建McpSyncServer
McpServerAutoConfiguration负责构建McpSyncServer,依赖各种能力Specification
McpSyncServer负责通讯,处理能力请求
能力Specification可以理解为药方,构建能力需要的属性都在里面,McpSyncServer用来构建能力对象
ServerMcpAnnotatedBeans这对象在这里只是new了,里面装着以注解类型分组的bean,用来构建能力Specification,下面分析
能力Specification怎么来的,下面继续分析
上图 MCP server的自动配置图2,负责构建各种能力Specification
McpServerSpecificationFactoryAutoConfiguration 能力Specification构建在这个自动配置
SyncMcpAnnotationProviders 该对象的定义了各种能力Specification的实例方法(@Bean),以tool能力规格实例方法toolSpecs为例
SpringAiSyncToolProvider 构建tool能力规格的对象,从ServerMcpAnnotatedBeans的beansByAnnotation获取带标注@MCPTool的bean,通过反射获取数据,构建tool能力规格对象 SyncToolSpecification
最后,看看ServerMcpAnnotatedBeans的beansByAnnotation是怎么获得的
上图 MCP server的自动配置图3,负责beansByAnnotation的获取
McpServerAnnotationScannerAutoConfiguration 负责注解扫描,设定了扫描的注解
ServerAnnotatedMethodBeanPostProcessor利用spring的机制BeanPostProcessor,该机制开发者在 Spring 容器实例化Bean之后、初始化方法(如@PostConstruct、afterPropertiesSet、自定义 init-method)调用之前和之后,对 Bean 进行自定义的增强处理,ServerAnnotatedMethodBeanPostProcessor使用了调用后的机制点
AnnotatedMethodDiscovery 扫描BeanPostProcessor送过来的bean,获取bean所有目标注解
ServerMcpAnnotatedBeans AnnotatedMethodDiscovery扫描回来的注解(集),送个ServerMcpAnnotatedBeans,按注解类型分组bean,得到:
Map<Class<?extendsAnnotation>, List<Object>> beansByAnnotation,这个也是第二步用来构建能力规格的
web server
MCP server不是web服务,如 tomcat,web服务负责接收和处理web请求,因此,MCP 服务需要引用web服务,本节以webmvc为例分析一下MCP server与web服务的关联
上图是MCP server和web服务集成
MCP server应用引入spring-ai-starter-mcp-server-webmvc,引入tomcat
RouterFunctionMapping/AbstractHandlerMapping spring-mvc负责路由请求的组件,get/post请求交割WebMvcStreamableServerTransportProvider构建的RouterFunction,最终调用McpSyncServer的能力
