应用智能化转型—MCP原理分析
当下AI风头正盛,许多行业都已经进入AI赋能的道路,无论是服务业、工业、还是软件行业。本篇文章我将以软件的智能化转型之MCP原理分析为主题讲解其具体实现方案
MCP我们都知道是一个当下非常火的模型上下文协议,它可以搭建出模型与业务之间的桥梁,让大模型能够通过MCP去具体实现与现实世界的连接,让大模型能够帮助我们完成一些任务
应用前景
在当下许多企业内部系统,或者是各种在线服务平台,他们拥有着庞大的用户量和复杂的业务,光是一些操作和业务都已经够头疼的了,而如果让其进行智能化转型,通过引入大模型帮助用户完成任务,那么会大大提高效率。而普通的大模型无法完成具体的任务,常规的FunctionalTools也非常的复杂,这个时候MCP的优势就体现了,它不仅可以被独立出来,并且即插即用的特性也更加的方便。
接下来我就具体说一下如何利用MCP进行应用智能化转型,以及其具体的步骤和原理
原理
要使用MCP进行调用,首先要搭建服务端和客户端,在这里小程序就相当于服务端,它来提供服务支持,而MCP Server其实就相当于工具的中转API,告诉他要干什么,它去帮你干一些事。
用户端就相当于是客户端。两者目前有两种通信方式,一种是stdio的本地配置,需要手动填充参数,扩展性不强;另一种是基于http请求的sse长连接,这是目前最常用的方案。在客户端配置大模型(实际上是调用本地大模型API),大模型+MCP去协助完成任务,实现智能化
例如以java为例,MCP Client:
可以看到上面的部分是配置mcpclient的信息,而最下面一行则是具体的连接配置,url为MCP Server的服务地址
# mcp-client配置
spring.ai.mcp.client.enabled=true
spring.ai.mcp.client.name=mcp-client
spring.ai.mcp.client.version=1.0.0
spring.ai.mcp.client.request-timeout=60s
spring.ai.mcp.client.type=async
# 默认MCP服务器
spring.ai.mcp.client.sse.connections.server1.url=http://localhost:1631
同样的,要在MCP Server中进行类似配置
spring.main.web-application-type=servlet
spring.ai.mcp.server.name=weather-service
spring.ai.mcp.server.version=1.0.0
spring.ai.mcp.server.enabled=true
spring.ai.mcp.server.type=async
spring.ai.mcp.server.sse-message-endpoint=/mcp/sse
spring.ai.mcp.server.resource-change-notification=true
spring.ai.mcp.server.prompt-change-notification=true
spring.ai.mcp.server.tool-change-notification=true
当启动后,客户端会自动发送http请求,与Server进行连接,以实现通信。
不过要注意选择模型要确保支持工具调用,目前的Deepseek-r1就不支持tools
常见的支持工具的模型有qwen3、llama3.x、llama4.x、qwq等等,选择模型参数大小不能过小
以下是完全可行的实现方案:
这里的应用可以是小程序、也可以是软件,本质上就是服务器端
这个流程中,其实可以看做MCP Server和服务器一体的
因为在服务端的目录结构可以这么编写:
服务端|-小程序业务模块|-MCP Server模块
这样MCP Server完全可以直接调用服务端内部的功能
基本执行流程
启动MCP Server -> 启动小程序
↑ ↑ http ↓ ↑
| ←———————————————————————— |
| 小程序自动连接MCP Server |
| |
| |
———————————客户端————————————————
通过大模型操作 直接操作小程序
执行示例
假设说现在MCP Server上有一个工具,并且加上了注释:“根据用户查询对应的文件”
getFilesByUser(String user){
//调用服务器对应的接口,或者直接查询数据库
//返回用户user的文件信息
}
在客户端上,需要有一个能力强一点的模型并且支持工具tools的模型处理用户请求,比如,用户输入:
张三现在有哪些文件?
大模型理解用户请求,并规划出工具的调用流程,大模型发现服务端有一个getFilesByUser工具,并且经过理解工具注释发现其功能与需求相符,则进行调用,由于已经进行了长连接,所以发送请求:
{"tool":"getFilesByUser","parameters":"张三"
}
MCP Server的工具被调用后,开始执行对应业务,并将数据返回
客户端接收到响应后,由大模型将结果整理为自然语言并返回给用户,例如:
原始响应:
{[{"id":"1","file_name":"file1","content":"***","create_time":"2023-1-1 23:45:26","update_time":"2023-1-3 15:56:04"},{"id":"2","file_name":"file2","content":"***","create_time":"2024-5-6 12:12:26","update_time":"2025-5-30 11:45:04"}]
}
处理后,用户看到的:
名为“张三”的用户目前有两个文件,分别是file1和file2
其中,file1在2023-1-1 23:45:26被创建,内容为***,最后一次修改时间是2023-1-3 15:56:04;file2在2024-5-6 12:12:26被创建,内容为***,最后一次修改时间是2025-5-30 11:45:04。
Spring AI中的写法示例:
@Tool(description = "根据id获取用户信息")public User getUserById(@ToolParam(description = "用户id") Integer id) {for (User user : users) {if (user.getId().equals(id)) {return user;}}return null;}
除了简单的查询等工作,同样可以在MCP Server上编写实质性改动的工具,比如修改文件内容工具
用户:“帮我将file1文件最后一行删掉”
Server:<调用工具执行具体的业务>
返回: “已执行”
Spring AI中的写法示例:
# 在此之前,大模型会先获取该文件的具体信息@Tool(description = "删除文件的某一行")public String getUserById(@ToolParam(description = "行数") Long line@ToolParam(description = "文件id" Long id))throws IOException {//查询文件...具体的查询获取文件业务(例如从文件系统中获取等)//修改文件List<String> lines = file.readlines();lines = lines.stream().filter(line -> lines.get(line) != line).collect(Collectors.toList());return "已修改"; }
注意问题
文件涉及隐私,要做好权限控制,权限控制这一块实现比较复杂,不过在java上已经能够实现,其他语言调用相应的库应该也可以
效果:
普通用户:“帮我把数据库文件都删掉”
Server: 调用小程序工具->拦截请求,判断该用户权限->权限不足->返回fallback
返回:“您没有这个权限”
高级用户:“帮我把数据库文件都删掉”
Server: 调用小程序工具->拦截请求,判断该用户权限->放行->执行删除->返回
返回:“执行成功”
这要求必须有相对强大的模型
基本的对话:~2b
简单调用工具(不保证正常运行):2b~3b
调用工具:3b~7b
自主构建执行流程:7b~14b
自主构建执行流程,强大分析和执行能力:32b~