MCP(模型上下文协议)
之前SpringAI中每一个tool都需要自己编写,MCP提供了一个统一的协议,这样所有人都可以按照这个协议来编写工具,模型也可以按照这个协议来调用工具,形成一个生态系统。
我们想用的时候直接去调用他们写好的工具就行了,不需要自己再写一遍了。一般把工具用server来提供出来,所以我们只要搭建一个client去链接他们的server就行了。如图:

MCP工具查询网站可以查询有什么工具,工具的调用方式等信息。
入门
可以把之前的时间工具改成MCP Server的形式,提供一个接口让别人调用,作为入门案例。
MCP Server
新建项目,依赖
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
java
@Configuration
public class McpConfig {
@Bean
public ToolCallbackProvider weatherTools(TimeTools tools) {
return MethodToolCallbackProvider.builder().toolObjects(tools).build();
}
}
MCP Client
依赖:
xml
dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置文件
yaml
spring:
ai:
zhipuai:
api-key: 你的apikey
mcp:
client:
sse:
connections:
server1:
url: http://localhost:8080 # mcp服务url
http:
client:
read-timeout: 100000
server:
port: 8081
Controller
java
public CoffeeController(VectorStore vectorStore, ChatClient.Builder chatClientBuilder, ToolCallbackProvider toolCallbackProvider) {
this.vectorStore = vectorStore;
VectorStoreDocumentRetriever vectorStoreDocumentRetriever = VectorStoreDocumentRetriever.builder()
.vectorStore(vectorStore)
.topK(3)
.similarityThreshold(0.5)
.build();
RetrievalAugmentationAdvisor retrievalAugmentationAdvisor = RetrievalAugmentationAdvisor.builder()
.documentRetriever(vectorStoreDocumentRetriever)
.build();
this.chatClient = chatClientBuilder.defaultAdvisors(retrievalAugmentationAdvisor)
.defaultToolCallbacks(toolCallbackProvider.getToolCallbacks())
.build();
}
网页抓取MCP server
MCP server部署
在服务器上
yaml
version: "3.8"
services:
fetcher-mcp:
image: ghcr.io/jae-jae/fetcher-mcp:latest
container_name: fetcher-mcp
restart: unless-stopped
ports:
- "3000:3000"
environment:
- NODE_ENV=production
# Using host network mode on Linux hosts can improve browser access efficiency
# network_mode: "host"
volumes:
# For Playwright, may need to share certain system paths
- /tmp:/tmp
# Health check
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000"]
interval: 30s
timeout: 10s
retries: 3
在这个文件所在目录下运行docker-compose up -d命令启动服务。
MCP client调用
配置文件
yaml
spring:
ai:
zhipuai:
api-key: 你的API
mcp:
client:
sse:
connections:
server1:
url: http://localhost:8080 # mcp服务url
fetcher-mcp:
url: http://自己的ip地址:3000
java
@GetMapping("/fetcher")
public String fetcher(String question) {
return chatClient.prompt()
.system("你是一个网页爬取专家,你可以运用工具爬取指定网页的内容并且进行总结")
.user(question)
.call().content();
}