如何使用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服务器这个方法也进入了

相关推荐
Violet_YSWY2 小时前
domain文件夹
java
最贪吃的虎2 小时前
JVM扫盲:内存模型
java·运维·jvm·后端
AAA简单玩转程序设计2 小时前
Java 进阶基础:这 3 个知识点,新手到高手的必经之路!
java
执笔论英雄2 小时前
[RL]协程asyncio.CancelledError
开发语言·python·microsoft
ONExiaobaijs2 小时前
基于Spring Boot的校园闲置物品交易系统
java·spring boot·后端
A24207349302 小时前
深入理解JS DOM:从基础操作到性能优化的全面指南
开发语言·javascript·ecmascript
a_zzzzzzzz2 小时前
Python 解释器 + Shell 脚本实现桌面打开软件
开发语言·python
爬山算法2 小时前
Hibernate(2)Hibernate的核心组件有哪些?
java·后端·hibernate
AAA简单玩转程序设计2 小时前
Java 进阶基础: “低调但致命” 的基础坑!
java