springAI实现一个MCP-Server
<h1 id="mcp">mcp</h1><p>Model Context Protocol(MCP)模型上下文协议(如下图所示)是 Anthropic 发布的一种标准化协议,使得 Agent 智能体应用可以更快捷地与下游异构的数据或者工具进行交互</p>
<div class="mermaid">sequenceDiagram
participant Client as MCP Client (HTTP)
participant WebServer as Web服务层 (Express)
participant MCPCore as MCP 核心逻辑
participant web应用
Client->>WebServer: HTTP 请求 (POST /mcp)
WebServer->>MCPCore: 转换协议格式
MCPCore->>web应用: 执行 MCP 操作
web应用-->>MCPCore: 返回结果
MCPCore-->>WebServer: 格式处理
WebServer-->>Client: HTTP 响应 (JSON)
</div><ul>
<li>https://docs.spring.io/spring-ai/reference/api/mcp/mcp-server-boot-starter-docs.html</li>
<li>https://blog.csdn.net/sufu1065/article/details/146554118</li>
<li>https://medium.com/@nivedita.sood/how-to-build-a-redis-mcp-server-in-cursor-ebb88fbb75e7</li>
<li>https://www.51cto.com/aigc/4906.html</li>
</ul>
<h1 id="添加引用">添加引用</h1>
<pre><code> <properties>
<java.version>17</java.version>
<spring-ai.version>1.0.0-M6</spring-ai.version>
<spring-boot.version>3.4.3</spring-boot.version>
</properties>
<dependencies>
<!-- <dependency>-->
<!-- <groupId>org.springframework.ai</groupId>-->
<!-- <artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.36</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</code></pre>
<h1 id="applicationyml配置">application.yml配置</h1>
<ul>
<li>stdio 标准输入,mcp client进程到mcp server进程之间进行通讯</li>
<li>sse 通过Server-Sent Events(SSE) 技术向客户端进行消息推送,标准请求方式是GET</li>
</ul>
<pre><code>spring:
application:
name: mcp-server-weather
server:
port: 8080
# MCP Server 配置(STDIO 传输)
ai:
mcp:
server:
enabled: true
type: ASYNC
sse-message-endpoint: mcp/messages
stdio:
enabled: false
sse:
enabled: true
</code></pre>
<h1 id="添加测试代码">添加测试代码</h1>
<pre><code>@Component
public class WeatherService {
@Tool(description = "根据城市名称获取天气预报")
public String getWeatherByCity(String city) {
Map<String, String> mockData = Map.of(
"西安", "晴天",
"北京", "小雨",
"上海", "大雨"
);
return mockData.getOrDefault(city, "抱歉:未查询到对应城市!");
}
}
@Component
public class HelloWorldTool {
@Bean
public ToolCallbackProvider weatherTools(WeatherService weatherService) {
return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
}
}
</code></pre>
<h1 id="添加dockerfile">添加Dockerfile</h1>
<p>使用性能更好的graalvm这个jdk工具</p>
<pre><code>FROM findepi/graalvm:java17
MAINTAINER lind
RUN mkdir -p /mcp-weather-server
WORKDIR /mcp-weather-server
ENV SERVER_PORT=8080 LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS=""TZ=Asia/Shanghai WEATHER_API_KEY=""
EXPOSE 8080
ADD ./target/mcp-server-weather-0.0.1-SNAPSHOT.jar ./app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
</code></pre>
<h1 id="部署到k8s">部署到k8s</h1>
<pre><code>apiVersion: apps/v1
kind: Deployment
metadata:
name: mcp-weather
namespace: default
labels:
app: mcp-weather
spec:
replicas: 1
selector:
matchLabels:
app: mcp-weather
template:
metadata:
labels:
app: mcp-weather
spec:
containers:
- name: mcp-weather
image: harbor.xxx.xx:8443/library/mcp-weather:1.0
ports:
- name: http
containerPort: 8080
protocol: TCP
resources:
requests:
cpu: 250m
memory: 512Mi
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
---
apiVersion: v1
kind: Service
metadata:
name: mcp-weather
namespace: default
status:
loadBalancer: {}
spec:
ports:
- name: http
protocol: TCP
port: 8080
targetPort: 8080
selector:
app: mcp-weather
type: ClusterIP
sessionAffinity: None
</code></pre>
<h1 id="cursor中配置mcp-server信息测试mcp-server">cursor中配置mcp-server信息,测试mcp-server</h1>
<pre><code>{
"mcpServers": {
"weather": {
"url": "https://test-xxx.com/weather/v1/sse",
"headers": {
"Authorization": "Bearer WSO2_DEV_PORTAL_APP_OAUTH_TOKEN"
}
},
// 其他服务配置...
}
}
</code></pre>
<p><img src="https://images.cnblogs.com/cnblogs_com/lori/2430318/o_250513070304_%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20250513150222.png" alt="" loading="lazy"></p>
</div>
<div id="MySignature" role="contentinfo">
<p></p>
<div class="navgood">
<p>作者:仓储大叔,张占岭,<br>
荣誉:微软MVP<br>QQ:853066980</p>
<p><strong>支付宝扫一扫,为大叔打赏!</strong>
<br><img src="https://images.cnblogs.com/cnblogs_com/lori/237884/o_IMG_7144.JPG"></p>
</div><br><br>
来源:https://www.cnblogs.com/lori/p/18874293
頁:
[1]