mcp

Model Context Protocol(MCP)模型上下文协议(如下图所示)是 Anthropic 发布的一种标准化协议,使得 Agent 智能体应用可以更快捷地与下游异构的数据或者工具进行交互

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)

添加引用

    <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>

application.yml配置

  • stdio 标准输入,mcp client进程到mcp server进程之间进行通讯
  • sse 通过Server-Sent Events(SSE) 技术向客户端进行消息推送,标准请求方式是GET
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

添加测试代码

@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();
} }

添加Dockerfile

使用性能更好的graalvm这个jdk工具

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"]

部署到k8s

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

cursor中配置mcp-server信息,测试mcp-server

{
"mcpServers": {
"weather": {
"url": "https://test-xxx.com/weather/v1/sse",
"headers": {
"Authorization": "Bearer WSO2_DEV_PORTAL_APP_OAUTH_TOKEN"
}
},
// 其他服务配置...
}
}

springAI实现一个MCP-Server的更多相关文章

  1. C#中自己动手创建一个Web Server(非Socket实现)

    目录 介绍 Web Server在Web架构系统中的作用 Web Server与Web网站程序的交互 HTTPListener与Socket两种方式的差异 附带Demo源码概述 Demo效果截图 总结 ...

  2. weblogic管理2 - 创建并启动一个managed server

    创建一个managed server. 1.  进入网页console管理页面,如:http://10.100.25.14:7001/console     , 先点击->服务器 (红色标记框) ...

  3. 如何使用OPENQUERY访问另一个SQL Server

    原文:如何使用OPENQUERY访问另一个SQL Server 在项目中,经常会遇到一个数据库访问另一个数据库,[CNVFERPDB]为服务器名,[CE3]为库名 SELECT Dtl.* FROM ...

  4. 搭建一个Web Server站点

    题:搭建一个Web Server站点.安装web服务,并在本地创建index.html测试 1.安装http服务 yum -y install httpd 2.进入网站目录 cd /var/www/h ...

  5. 用select (多路复用)模拟一个 socket server

    需求:用select (多路复用)模拟一个 socket server.可以接收多并发. 1. 一开始是检测自己,如果我有活动了,就说明有客户端要连我了. #用select去模拟socket,实现单线 ...

  6. Eucalyptus-利用镜像启动一个Windows Server 2008r2实例

    1.前言 使用kvm制作Eucalyptus镜像(Windows Server 2008r2为例)——http://www.cnblogs.com/gis-luq/p/3990792.html 上一篇 ...

  7. 手写一个类SpringBoot的HTTP框架:几十行代码基于Netty搭建一个 HTTP Server

    本文已经收录进 : https://github.com/Snailclimb/netty-practical-tutorial (Netty 从入门到实战:手写 HTTP Server+RPC 框架 ...

  8. SpringCloud升级之路2020.0.x版-20. 启动一个 Eureka Server 集群

    本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们的业务集群结构 ...

  9. 微软MVP攻略 (如何成为MVP?一个SQL Server MVP的经验之谈)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 初衷 什么是微软MVP? 成为微软MVP的条件? 如何成为微软MVP? (一) 申请时间划分 (二) 前期准备 (三) ...

  10. [转]如何拷贝一个 SQL Server 的表

    这篇短文将介绍几种拷贝 SQL Server 表的方法.第一种方式是最简单的在同一个数据库里将表拷贝到另外一个表.你需要记住的是,拷贝表的时候并不会拷贝表的约束和索引.下面是代码模板和简单的使用方法: ...

随机推荐

  1. mybatis - [09] 动态SQL

    题记部分 一.if & test 如果id,name,age不为空,则按照指定的值进行查询.如果这三者都是空(null和空字符串),则该sql执行结果为全表查询的结果集. <select ...

  2. Hbase - hbase hbck介绍

    原文地址:https://bbs.huaweicloud.com/blogs/353332 HBaseFsck(hbck)是一种命令行工具,可检查hbase集群的region一致性和表完整性的问题,同 ...

  3. 【渗透测试】Vulnhub Hackable II

    渗透环境 攻击机:   IP: 192.168.216.129(Kali) 靶机:     IP:192.168.216.131 靶机下载地址:https://www.vulnhub.com/entr ...

  4. Coordinate Spaces

    Coordinate Spaces 本主题包含以下部分: 根空间 用户空间 像素空间 任何VisionPro图像支持一系列坐标空间,以提供一个数值框架来表达特定特征的位置.最有用的空间是根空间,它将点 ...

  5. 【Ryan】: linux下安装ftp

    在 Linux 系统下安装 FTP 服务器可以使用多种软件,其中最常见的是 vsftpd(Very Secure FTP Daemon)和 ProFTPD(Professional FTP Daemo ...

  6. 带大家做了个 AI 项目,没想到这么简单!

    大家好,我是程序员鱼皮,现在已经是全民 AI 时代了,咱们程序员更要想办法榨干 AI,把 AI 利用起来.前几天我一时兴起,直播用 2 多个小时的时间,从需求分析开始,带大家做了一个 AI 海龟汤游戏 ...

  7. 『Plotly实战指南』--柱状图绘制高级篇

    在数据可视化的世界里,柱状图是一种直观且强大的工具,用于展示数据的分布.比较和趋势. 从基础的柱状图出发,我们可以进一步探索更复杂的图表类型,如分组柱状图和堆积柱状图,它们在处理多维数据和复杂关系时具 ...

  8. ELF-Virus简易病毒程序分析

    系统功能概述 ELF-Virus实现了一个简单的病毒程序,能够感染当前目录下的ELF格式的可执行文件.病毒程序通过将自身代码附加到目标文件中,并在文件末尾添加一个特定的签名来标记文件已被感染.感染后的 ...

  9. javascript 判断浏览器

    navigator.userAgent 通常我们可以通过navigator.userAgent只读属性来获取浏览器的一些信息,算是原生方法吧. jquery -jquery1.9 版本可以通过$.br ...

  10. PDA自带有红外扫描头,不用点击焦点就能超高速超精准的扫条码、扫二维码

    参考牛人DelphiTeacher的<PDA扫码?不要慌,只要20行代码!> 摘要: 实现监听器接口 然后在系统中注册该监听器,注册时指定只接收名称为com.kte.scan.result ...