如何使用JAVA进行MCP服务创建以及通过大模型进行调用

1.MCP 可以干啥?

MCP,是Model Context Protocol的缩写,即模型上下文协议,它是一个开源标准,用于将 AI 应用程序连接到外部系统。各大 AI 应用程序可以连接到数据源(例如本地文件、数据库),工具(例如搜索引擎、计算器)和工作流(例如专门的提示),使它们能够访问关键信息并执行任务。也就是说它就像一个拓展插件一样,让大模型有能力操纵大模型外部系统的能力。

2.MCP Server的创建(Spring Boot)

2.1 pom 文件。

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.xinju</groupId>
    <artifactId>mcp-java</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mcp java</name>
    <description>mcp java</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
        <spring-ai.version>1.0.1</spring-ai.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.2 配置文件

bash 复制代码
spring.application.name=mcp java
spring.ai.mcp.server.name=mcp java
spring.ai.mcp.server.sse-message-endpoint=/sse

2.3 MCP服务

bash 复制代码
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;

@Service
public class McpJavaService {
    @Tool(description = "张三的个性化区域查询")
    public String queryArea(@ToolParam(description = "张三的个性化区域查询")  String query) {
        System.out.println("queryArea 此方法被调用了!");
        return "您查询的区域是:" + query +"(个性化)";
    }
    @Tool(description = "加法:a + b")
    public double add(
            @ToolParam(description = "被加数") double a,
            @ToolParam(description = "加数") double b) {
        System.out.println("queryArea 此方法被调用了!");
        return a + b;
    }

    @Tool(description = "减法:a - b")
    public double sub(
            @ToolParam(description = "被减数") double a,
            @ToolParam(description = "减数") double b) {
        System.out.println("queryArea 此方法被调用了!");
        return a - b;
    }

    @Tool(description = "乘法:a * b")
    public double mul(
            @ToolParam(description = "被乘数") double a,
            @ToolParam(description = "乘数") double b) {
        System.out.println("queryArea 此方法被调用了!");
        return a * b;
    }

    @Tool(description = "除法:a / b")
    public double div(
            @ToolParam(description = "被除数") double a,
            @ToolParam(description = "除数") double b) {
        System.out.println("queryArea 此方法被调用了!");
        if (b == 0) throw new IllegalArgumentException("除数不能为 0");
        return a / b;
    }
}

3. 通过Chat Box方式测试。

1.在设置中添加刚刚编写的MCP服务。

2.添加自定义服务。

3.填写你的MCP信息以及服务地址,然后保存。

4.然后聊天时选中这个MCP,对大模型进行与你MCP服务相关的提问,就可以调用你的MCP服务了。

4.通过代码方式测试

  1. 另起一个项目,通过java代码调用大模型时,同时使用你的MCP服务,直接运行这个main方法。
bash 复制代码
public class McpToolsCall {

    public static void main(String[] args) throws Exception {

        ChatModel model = OpenAiChatModel.builder()
                .baseUrl("这里填你的模型地址")
                .apiKey("这里填你的Api Key")
                .modelName("这里填你的模型名称")
                .logRequests(true)
                .logResponses(true)
                .build();

        McpTransport transport = new HttpMcpTransport.Builder()
                .sseUrl("http://127.0.0.1:8080/sse") //这里是你的MCP服务地址
                .timeout(Duration.ofSeconds(60))
                .logRequests(true)
                .logResponses(true)
                .build();

        McpClient mcpClient = new DefaultMcpClient.Builder()
                .transport(transport)
                .build();

        ToolProvider toolProvider = McpToolProvider.builder()
                .mcpClients(List.of(mcpClient))
                .build();

        Bot bot = AiServices.builder(Bot.class)
                .chatModel(model)
                .toolProvider(toolProvider)
                .build();
        try {
            String response = bot.chat("我是张三,我想查一下哪个区域比较个性化");
            System.out.println("----------------------");
            System.out.println(response);
        } finally {
            mcpClient.close();
        }
    }
}

2.调用后发现访问了你的MCP服务(虽然大模型对这个返回结果很不解,但确实它硬着头皮调用了)。

3.MCP服务器这个方法也进入了

相关推荐
YDS8292 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅2 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆2 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
未若君雅裁3 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
cen__y3 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
社交怪人4 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
阿维的博客日记4 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI4 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
郭涤生4 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588