MCP 协议
字数: 0 字 时长: 0 分钟
什么是 MCP ?
MCP (Model Context Protocol,模型上下文协议)是一种开放协议,它标准化了应用程序如何向大模型提供上下文的方式。
我想要“AI 根据另一半的位置找到合适的约会地点”,可以使用工具调用功能,在程序中就像查询天气预报工具一样,调用第三方地图 API ;也可以直接调用第三方地图提供的 MCP 服务。那么这两者有什么区别呢?本质区别是:MCP 是对话的记忆中枢;工具调用是动作的执行手臂。
能力 | MCP协议 | 工具调用 |
---|---|---|
状态管理 | ✅ 主动维护结构化状态 | ❌ 仅通过自然语言隐式携带状态 |
长期记忆 | ✅ 支持会话持久化存储 | ❌ 依赖外部数据库或LLM自身token限制记忆 |
对话逻辑控制 | ✅ 显式控制(状态机/槽位填充) | ❌ 由LLM黑盒决策 |
执行外部操作 | ❌ 不直接执行 | ✅ 核心能力 |
开放域适应性 | ❌ 预定义Schema限制泛化能力 | ✅ 动态匹配任意声明过的工具 |
Spring AI MCP 实践
以调用高德地图提供的 MCP 服务为例子进行实践,实现让 AI 根据另一半位置为我们推荐合适的约会地点。
- 进入高德地图官网开放平台,按照官网指引,创建账号并申请 API Key
- 引入依赖
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
<version>1.0.0-M6</version>
</dependency>
- 在 resources 目录下新建
mcp-servers.json
配置文件,定义需要用到的 MCP 服务
json
{
"mcpServers": {
"amap-maps": {
"command": "npx", // 如果是 windows 环境需要改为 "npx.cmd"
"args": [
"-y",
"@amap/amap-maps-mcp-server"
],
"env": {
"AMAP_MAPS_API_KEY": "改成你的 API Key"
}
}
}
}
- 修改
application.yml
指定 mcp 服务配置文件
yaml
spring:
ai:
mcp:
client:
stdio:
servers-configuration: classpath:mcp-servers.json
- 利用自动注入的
ToolCallbackProvider
获取配置中定义的 MCP 服务提供的所有工具
java
@Resource
private ToolCallbackProvider toolCallbackProvider;
public String doChatWithMcp(String message,String chatId) {
ChatResponse response = chatClient
.prompt()
.user(message)
.advisors(advisorSpec -> advisorSpec
.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)
.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY,10)
)
.advisors(new MyLoggerAdvisor())
.tools(toolCallbackProvider)
.call()
.chatResponse();
String content = response.getResult().getOutput().getText();
return content;
}
- 编写单元测试类进行测试,AI 通过高德地图 MCP 服务为我推荐了几个真实的约会地点,甚至还包括每个地点的照片